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