UNPKG

@eggjs/utils

Version:

Utils for all egg projects

326 lines 26.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isESM = void 0; exports.getExtensions = getExtensions; exports.isSupportTypeScript = isSupportTypeScript; exports.importResolve = importResolve; exports.importModule = importModule; const node_util_1 = require("node:util"); const node_module_1 = require("node:module"); const node_url_1 = require("node:url"); const node_path_1 = __importDefault(require("node:path")); const node_fs_1 = __importDefault(require("node:fs")); const index_js_1 = require("./error/index.js"); const debug = (0, node_util_1.debuglog)('@eggjs/utils/import'); exports.isESM = typeof require === 'undefined'; const nodeMajorVersion = parseInt(process.versions.node.split('.', 1)[0], 10); const supportImportMetaResolve = nodeMajorVersion >= 18; let _customRequire; function getRequire() { if (!_customRequire) { if (typeof require !== 'undefined') { _customRequire = require; } else { _customRequire = (0, node_module_1.createRequire)(process.cwd()); } } return _customRequire; } function getExtensions() { return getRequire().extensions; } let _supportTypeScript; function isSupportTypeScript() { if (_supportTypeScript === undefined) { const extensions = getExtensions(); // enable ts by process.env.EGG_TS_ENABLE or process.env.VITEST _supportTypeScript = extensions['.ts'] !== undefined || process.env.VITEST === 'true' || process.env.EGG_TS_ENABLE === 'true'; debug('[isSupportTypeScript] %o, extensions: %j, process.env.VITEST: %j, process.env.EGG_TS_ENABLE: %j', _supportTypeScript, Object.keys(extensions), process.env.VITEST, process.env.EGG_TS_ENABLE); } return _supportTypeScript; } function tryToResolveFromFile(filepath) { // "type": "module", try index.mjs then index.js const type = exports.isESM ? 'module' : 'commonjs'; let mainIndexFile = ''; if (type === 'module') { mainIndexFile = filepath + '.mjs'; if (node_fs_1.default.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type); return mainIndexFile; } mainIndexFile = filepath + '.js'; if (node_fs_1.default.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type); return mainIndexFile; } } else { // "type": "commonjs", try index.js then index.cjs mainIndexFile = filepath + '.cjs'; if (node_fs_1.default.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type); return mainIndexFile; } mainIndexFile = filepath + '.js'; if (node_fs_1.default.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type); return mainIndexFile; } } if (!isSupportTypeScript()) { return; } // for the module under development mainIndexFile = filepath + '.ts'; if (node_fs_1.default.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.ts, type: %o', mainIndexFile, type); return mainIndexFile; } } function tryToResolveByDirnameFromPackage(dirname, pkg) { // try to read pkg.main or pkg.module first // "main": "./dist/commonjs/index.js", // "module": "./dist/esm/index.js" const defaultMainFile = exports.isESM ? pkg.module ?? pkg.main : pkg.main; if (defaultMainFile) { const mainIndexFilePath = node_path_1.default.join(dirname, defaultMainFile); if (node_fs_1.default.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s', mainIndexFilePath, defaultMainFile, exports.isESM); return mainIndexFilePath; } } // "type": "module", try index.mjs then index.js const type = pkg?.type ?? (exports.isESM ? 'module' : 'commonjs'); if (type === 'module') { const mainIndexFilePath = node_path_1.default.join(dirname, 'index.mjs'); if (node_fs_1.default.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type); return mainIndexFilePath; } const mainIndexMjsFilePath = node_path_1.default.join(dirname, 'index.js'); if (node_fs_1.default.existsSync(mainIndexMjsFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexMjsFilePath, type); return mainIndexMjsFilePath; } } else { // "type": "commonjs", try index.cjs then index.js const mainIndexFilePath = node_path_1.default.join(dirname, 'index.cjs'); if (node_fs_1.default.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type); return mainIndexFilePath; } const mainIndexCjsFilePath = node_path_1.default.join(dirname, 'index.js'); if (node_fs_1.default.existsSync(mainIndexCjsFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexCjsFilePath, type); return mainIndexCjsFilePath; } } if (!isSupportTypeScript()) { return; } // for the module under development // "tshy": { // "exports": { // "./package.json": "./package.json", // ".": "./src/index.ts" // } // } const mainIndexFile = pkg.tshy?.exports?.['.'] ?? 'index.ts'; const mainIndexFilePath = node_path_1.default.join(dirname, mainIndexFile); if (node_fs_1.default.existsSync(mainIndexFilePath)) { return mainIndexFilePath; } } function tryToResolveByDirname(dirname) { let pkg = {}; const pkgFile = node_path_1.default.join(dirname, 'package.json'); if (node_fs_1.default.existsSync(pkgFile)) { pkg = JSON.parse(node_fs_1.default.readFileSync(pkgFile, 'utf-8')); } return tryToResolveByDirnameFromPackage(dirname, pkg); } function isRelativePath(filepath) { return filepath.startsWith('./') || filepath.startsWith('../') || filepath.startsWith('.\\') || filepath.startsWith('..\\'); } function tryToResolveFromAbsoluteFile(filepath) { let moduleFilePath; const stat = node_fs_1.default.statSync(filepath, { throwIfNoEntry: false }); // try to resolve from directory if (stat?.isDirectory()) { moduleFilePath = tryToResolveByDirname(filepath); if (moduleFilePath) { return moduleFilePath; } } else if (stat?.isFile()) { return filepath; } // try to resolve from file moduleFilePath = tryToResolveFromFile(filepath); if (moduleFilePath) { return moduleFilePath; } } function importResolve(filepath, options) { // find *.json or CommonJS module by require.resolve // e.g.: importResolve('egg/package.json', { paths }) const cwd = process.cwd(); const paths = options?.paths ?? [cwd]; let moduleFilePath; const isAbsolute = node_path_1.default.isAbsolute(filepath); if (isAbsolute) { moduleFilePath = tryToResolveFromAbsoluteFile(filepath); if (moduleFilePath) { debug('[importResolve:isAbsolute] %o => %o', filepath, moduleFilePath); return moduleFilePath; } } else if (isRelativePath(filepath)) { for (const p of paths) { const resolvedPath = node_path_1.default.resolve(p, filepath); moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath); if (moduleFilePath) { debug('[importResolve:isRelativePath] %o => %o => %o', filepath, resolvedPath, moduleFilePath); return moduleFilePath; } } } // find from node_modules for (const p of paths) { let resolvedPath = node_path_1.default.join(p, 'node_modules', filepath); moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath); if (moduleFilePath) { debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath); return moduleFilePath; } // find from parent node_modules // non-scoped package, e.g: node_modules/egg let parentPath = node_path_1.default.dirname(p); if (node_path_1.default.basename(parentPath) === 'node_modules') { resolvedPath = node_path_1.default.join(parentPath, filepath); moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath); if (moduleFilePath) { debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath); return moduleFilePath; } } // scoped package, e.g: node_modules/@eggjs/tegg parentPath = node_path_1.default.dirname(parentPath); if (node_path_1.default.basename(parentPath) === 'node_modules') { resolvedPath = node_path_1.default.join(parentPath, filepath); moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath); if (moduleFilePath) { debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath); return moduleFilePath; } } } const extname = node_path_1.default.extname(filepath); if ((!isAbsolute && extname === '.json') || !exports.isESM) { moduleFilePath = getRequire().resolve(filepath, { paths, }); } else { if (supportImportMetaResolve) { try { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore moduleFilePath = require.resolve(filepath); } catch (err) { throw new index_js_1.ImportResolveError(filepath, paths, err); } if (moduleFilePath.startsWith('file://')) { // resolve will return file:// URL on Linux and MacOS expect on Windows moduleFilePath = (0, node_url_1.fileURLToPath)(moduleFilePath); } debug('[importResolve] import.meta.resolve %o => %o', filepath, moduleFilePath); const stat = node_fs_1.default.statSync(moduleFilePath, { throwIfNoEntry: false }); if (!stat?.isFile()) { throw new TypeError(`Cannot find module ${filepath}, because ${moduleFilePath} does not exists`); } } else { moduleFilePath = getRequire().resolve(filepath); } } debug('[importResolve] %o, options: %o => %o, isESM: %s', filepath, options, moduleFilePath, exports.isESM); return moduleFilePath; } async function importModule(filepath, options) { const moduleFilePath = importResolve(filepath, options); let obj; if (exports.isESM) { // esm const fileUrl = (0, node_url_1.pathToFileURL)(moduleFilePath).toString(); obj = await import(fileUrl); debug('[importModule] await import %o', fileUrl); // { // default: { foo: 'bar', one: 1 }, // foo: 'bar', // one: 1, // [Symbol(Symbol.toStringTag)]: 'Module' // } if (obj?.default?.__esModule === true && 'default' in obj?.default) { // 兼容 cjs 模拟 esm 的导出格式 // { // __esModule: true, // default: { // __esModule: true, // default: { // fn: [Function: fn] { [length]: 0, [name]: 'fn' }, // foo: 'bar', // one: 1 // } // }, // [Symbol(Symbol.toStringTag)]: 'Module' // } // 兼容 ts module // { // default: { // [__esModule]: true, // default: <ref *1> [Function: default_1] { // [length]: 0, // [name]: 'default_1', // [prototype]: { [constructor]: [Circular *1] } // } // }, // [Symbol(Symbol.toStringTag)]: 'Module' // } obj = obj.default; } if (options?.importDefaultOnly) { if ('default' in obj) { obj = obj.default; } } } else { // commonjs obj = require(moduleFilePath); debug('[importModule] require %o', moduleFilePath); if (obj?.__esModule === true && 'default' in obj) { // 兼容 cjs 模拟 esm 的导出格式 // { // __esModule: true, // default: { fn: [Function: fn], foo: 'bar', one: 1 } // } obj = obj.default; } } if (debug.enabled) { debug('[importModule] return %o => keys: %j', filepath, obj ? Object.keys(obj) : obj); } return obj; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFrQ0Esc0NBRUM7QUFHRCxrREFTQztBQXlJRCxzQ0E0RkM7QUFFRCxvQ0FnRUM7QUF2VkQseUNBQXFDO0FBQ3JDLDZDQUE0QztBQUM1Qyx1Q0FBd0Q7QUFDeEQsMERBQTZCO0FBQzdCLHNEQUF5QjtBQUN6QiwrQ0FBc0Q7QUFFdEQsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLHFCQUFxQixDQUFDLENBQUM7QUFXakMsUUFBQSxLQUFLLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxDQUFDO0FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDOUUsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7QUFFeEQsSUFBSSxjQUEyQixDQUFDO0FBQ2hDLFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxHQUFHLElBQUEsMkJBQWEsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFnQixhQUFhO0lBQzNCLE9BQU8sVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxJQUFJLGtCQUF1QyxDQUFDO0FBQzVDLFNBQWdCLG1CQUFtQjtJQUNqQyxJQUFJLGtCQUFr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