@eggjs/utils
Version:
Utils for all egg projects
316 lines • 25.4 kB
JavaScript
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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