UNPKG

@eggjs/utils

Version:

Utils for all egg projects

316 lines 25.4 kB
import { debuglog } from 'node:util'; import { createRequire } from 'node:module'; import { pathToFileURL, fileURLToPath } from 'node:url'; import path from 'node:path'; import fs from 'node:fs'; import { ImportResolveError } from './error/index.js'; const debug = debuglog('@eggjs/utils/import'); export const 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 = createRequire(process.cwd()); } } return _customRequire; } export function getExtensions() { return getRequire().extensions; } let _supportTypeScript; export 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 = isESM ? 'module' : 'commonjs'; let mainIndexFile = ''; if (type === 'module') { mainIndexFile = filepath + '.mjs'; if (fs.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type); return mainIndexFile; } mainIndexFile = filepath + '.js'; if (fs.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 (fs.existsSync(mainIndexFile)) { debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type); return mainIndexFile; } mainIndexFile = filepath + '.js'; if (fs.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 (fs.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 = isESM ? pkg.module ?? pkg.main : pkg.main; if (defaultMainFile) { const mainIndexFilePath = path.join(dirname, defaultMainFile); if (fs.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s', mainIndexFilePath, defaultMainFile, isESM); return mainIndexFilePath; } } // "type": "module", try index.mjs then index.js const type = pkg?.type ?? (isESM ? 'module' : 'commonjs'); if (type === 'module') { const mainIndexFilePath = path.join(dirname, 'index.mjs'); if (fs.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type); return mainIndexFilePath; } const mainIndexMjsFilePath = path.join(dirname, 'index.js'); if (fs.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 = path.join(dirname, 'index.cjs'); if (fs.existsSync(mainIndexFilePath)) { debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type); return mainIndexFilePath; } const mainIndexCjsFilePath = path.join(dirname, 'index.js'); if (fs.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 = path.join(dirname, mainIndexFile); if (fs.existsSync(mainIndexFilePath)) { return mainIndexFilePath; } } function tryToResolveByDirname(dirname) { let pkg = {}; const pkgFile = path.join(dirname, 'package.json'); if (fs.existsSync(pkgFile)) { pkg = JSON.parse(fs.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 = fs.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; } } export 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 = path.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 = path.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 = path.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 = path.dirname(p); if (path.basename(parentPath) === 'node_modules') { resolvedPath = path.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 = path.dirname(parentPath); if (path.basename(parentPath) === 'node_modules') { resolvedPath = path.join(parentPath, filepath); moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath); if (moduleFilePath) { debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath); return moduleFilePath; } } } const extname = path.extname(filepath); if ((!isAbsolute && extname === '.json') || !isESM) { moduleFilePath = getRequire().resolve(filepath, { paths, }); } else { if (supportImportMetaResolve) { try { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore moduleFilePath = import.meta.resolve(filepath); } catch (err) { throw new ImportResolveError(filepath, paths, err); } if (moduleFilePath.startsWith('file://')) { // resolve will return file:// URL on Linux and MacOS expect on Windows moduleFilePath = fileURLToPath(moduleFilePath); } debug('[importResolve] import.meta.resolve %o => %o', filepath, moduleFilePath); const stat = fs.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, isESM); return moduleFilePath; } export async function importModule(filepath, options) { const moduleFilePath = importResolve(filepath, options); let obj; if (isESM) { // esm const fileUrl = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQVc5QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxDQUFDO0FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDOUUsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7QUFFeEQsSUFBSSxjQUEyQixDQUFDO0FBQ2hDLFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLFVBQVUs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