123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /**
- * @fileoverview Universal module importer
- */
- //-----------------------------------------------------------------------------
- // Imports
- //-----------------------------------------------------------------------------
- const { createRequire } = require("module");
- const { pathToFileURL } = require("url");
- //-----------------------------------------------------------------------------
- // Helpers
- //-----------------------------------------------------------------------------
- const SLASHES = new Set(["/", "\\"]);
- /**
- * Normalizes directories to have a trailing slash.
- * Resolve is pretty finicky -- if the directory name doesn't have
- * a trailing slash then it tries to look in the parent directory.
- * i.e., if the directory is "/usr/nzakas/foo" it will start the
- * search in /usr/nzakas. However, if the directory is "/user/nzakas/foo/",
- * then it will start the search in /user/nzakas/foo.
- * @param {string} directory The directory to check.
- * @returns {string} The normalized directory.
- */
- function normalizeDirectory(directory) {
- if (!SLASHES.has(directory[directory.length-1])) {
- return directory + "/";
- }
- return directory;
- }
- //-----------------------------------------------------------------------------
- // Exports
- //-----------------------------------------------------------------------------
- /**
- * Class for importing both CommonJS and ESM modules in Node.js.
- */
- exports.ModuleImporter = class ModuleImporter {
- /**
- * Creates a new instance.
- * @param {string} [cwd] The current working directory to resolve from.
- */
- constructor(cwd = process.cwd()) {
- /**
- * The base directory from which paths should be resolved.
- * @type {string}
- */
- this.cwd = normalizeDirectory(cwd);
- }
- /**
- * Resolves a module based on its name or location.
- * @param {string} specifier Either an npm package name or
- * relative file path.
- * @returns {string|undefined} The location of the import.
- * @throws {Error} If specifier cannot be located.
- */
- resolve(specifier) {
- const require = createRequire(this.cwd);
- return require.resolve(specifier);
- }
- /**
- * Imports a module based on its name or location.
- * @param {string} specifier Either an npm package name or
- * relative file path.
- * @returns {Promise<object>} The module's object.
- */
- import(specifier) {
- const location = this.resolve(specifier);
- return import(pathToFileURL(location).href);
- }
- }
|