@eggjs/utils 5.0.0-beta.20 → 5.0.0-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Try to get framework dir path
3
+ * If can't find any framework, try to find egg dir path
4
+ *
5
+ * @param {String} cwd - current work path
6
+ * @param {Array} [eggNames] - egg names, default is ['egg']
7
+ * @return {String} framework or egg dir path
8
+ * @deprecated
9
+ */
10
+ export declare function getFrameworkOrEggPath(cwd: string, eggNames?: string[]): string;
@@ -0,0 +1,53 @@
1
+ import path from 'node:path';
2
+ import { existsSync, readdirSync } from 'node:fs';
3
+ import { readJSONSync } from "./utils.js";
4
+ /**
5
+ * Try to get framework dir path
6
+ * If can't find any framework, try to find egg dir path
7
+ *
8
+ * @param {String} cwd - current work path
9
+ * @param {Array} [eggNames] - egg names, default is ['egg']
10
+ * @return {String} framework or egg dir path
11
+ * @deprecated
12
+ */
13
+ export function getFrameworkOrEggPath(cwd, eggNames) {
14
+ eggNames = eggNames || ['egg'];
15
+ const moduleDir = path.join(cwd, 'node_modules');
16
+ if (!existsSync(moduleDir)) {
17
+ return '';
18
+ }
19
+ // try to get framework
20
+ // 1. try to read egg.framework property on package.json
21
+ const pkgFile = path.join(cwd, 'package.json');
22
+ if (existsSync(pkgFile)) {
23
+ const pkg = readJSONSync(pkgFile);
24
+ if (pkg.egg && pkg.egg.framework) {
25
+ return path.join(moduleDir, pkg.egg.framework);
26
+ }
27
+ }
28
+ // 2. try the module dependencies includes eggNames
29
+ const names = readdirSync(moduleDir);
30
+ for (const name of names) {
31
+ const pkgfile = path.join(moduleDir, name, 'package.json');
32
+ if (!existsSync(pkgfile)) {
33
+ continue;
34
+ }
35
+ const pkg = readJSONSync(pkgfile);
36
+ if (pkg.dependencies) {
37
+ for (const eggName of eggNames) {
38
+ if (pkg.dependencies[eggName]) {
39
+ return path.join(moduleDir, name);
40
+ }
41
+ }
42
+ }
43
+ }
44
+ // try to get egg
45
+ for (const eggName of eggNames) {
46
+ const pkgfile = path.join(moduleDir, eggName, 'package.json');
47
+ if (existsSync(pkgfile)) {
48
+ return path.join(moduleDir, eggName);
49
+ }
50
+ }
51
+ return '';
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXByZWNhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTFDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxRQUFtQjtJQUNwRSxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELHVCQUF1QjtJQUV2Qix3REFBd0Q7SUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0MsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDekIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7SUFDakIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUQsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIn0=
@@ -0,0 +1,5 @@
1
+ export declare class ImportResolveError extends Error {
2
+ filepath: string;
3
+ paths: string[];
4
+ constructor(filepath: string, paths: string[], error: Error);
5
+ }
@@ -0,0 +1,13 @@
1
+ export class ImportResolveError extends Error {
2
+ filepath;
3
+ paths;
4
+ constructor(filepath, paths, error) {
5
+ const message = `${error.message}, paths: ${JSON.stringify(paths)}`;
6
+ super(message, { cause: error });
7
+ this.name = this.constructor.name;
8
+ this.filepath = filepath;
9
+ this.paths = paths;
10
+ Error.captureStackTrace(this, this.constructor);
11
+ }
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0UmVzb2x2ZUVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9yL0ltcG9ydFJlc29sdmVFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUMzQyxRQUFRLENBQVM7SUFDakIsS0FBSyxDQUFXO0lBRWhCLFlBQVksUUFBZ0IsRUFBRSxLQUFlLEVBQUUsS0FBWTtRQUN6RCxNQUFNLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ export * from './ImportResolveError.ts';
@@ -0,0 +1,2 @@
1
+ export * from "./ImportResolveError.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx5QkFBeUIsQ0FBQyJ9
@@ -0,0 +1,16 @@
1
+ interface Options {
2
+ baseDir: string;
3
+ framework?: string;
4
+ }
5
+ /**
6
+ * Find the framework directory, lookup order
7
+ * - specify framework path
8
+ * - get framework name from
9
+ * - use egg by default
10
+ * @param {Object} options - options
11
+ * @param {String} options.baseDir - the current directory of application
12
+ * @param {String} [options.framework] - the directory of framework
13
+ * @return {String} frameworkPath
14
+ */
15
+ export declare function getFrameworkPath(options: Options): string;
16
+ export {};
@@ -0,0 +1,81 @@
1
+ import { debuglog } from 'node:util';
2
+ import path from 'node:path';
3
+ import assert from 'node:assert';
4
+ import { existsSync } from 'node:fs';
5
+ import { readJSONSync } from "./utils.js";
6
+ import { importResolve } from "./import.js";
7
+ const debug = debuglog('egg/utils/framework');
8
+ const initCwd = process.cwd();
9
+ /**
10
+ * Find the framework directory, lookup order
11
+ * - specify framework path
12
+ * - get framework name from
13
+ * - use egg by default
14
+ * @param {Object} options - options
15
+ * @param {String} options.baseDir - the current directory of application
16
+ * @param {String} [options.framework] - the directory of framework
17
+ * @return {String} frameworkPath
18
+ */
19
+ export function getFrameworkPath(options) {
20
+ const { framework, baseDir } = options;
21
+ const pkgPath = path.join(baseDir, 'package.json');
22
+ assert(existsSync(pkgPath), `${pkgPath} should exist`);
23
+ const moduleDir = path.join(baseDir, 'node_modules');
24
+ // 1. pass framework or customEgg
25
+ if (framework) {
26
+ // 1.1 framework is an absolute path
27
+ // framework: path.join(baseDir, 'node_modules/${frameworkName}')
28
+ if (path.isAbsolute(framework)) {
29
+ assert(existsSync(framework), `${framework} should exist`);
30
+ return framework;
31
+ }
32
+ // 1.2 framework is a npm package that required by application
33
+ // framework: 'frameworkName'
34
+ return assertAndReturn(framework, moduleDir, baseDir);
35
+ }
36
+ const pkg = readJSONSync(pkgPath);
37
+ // 2. framework is not specified
38
+ // 2.1 use framework name from pkg.egg.framework
39
+ if (pkg.egg?.framework) {
40
+ return assertAndReturn(pkg.egg.framework, moduleDir, baseDir);
41
+ }
42
+ // 2.2 use egg by default
43
+ return assertAndReturn('egg', moduleDir, baseDir);
44
+ }
45
+ function assertAndReturn(frameworkName, moduleDir, baseDir) {
46
+ const moduleDirs = new Set([
47
+ moduleDir,
48
+ // find framework from process.cwd, especially for test,
49
+ // the application is in test/fixtures/app,
50
+ // and framework is install in ${cwd}/node_modules
51
+ path.join(process.cwd(), 'node_modules'),
52
+ // prevent from mocking process.cwd
53
+ path.join(initCwd, 'node_modules'),
54
+ ]);
55
+ try {
56
+ // find framework from global, especially for monorepo
57
+ let globalModuleDir;
58
+ // if frameworkName is scoped package, like @ali/egg
59
+ if (frameworkName.startsWith('@') && frameworkName.includes('/')) {
60
+ globalModuleDir = path.join(importResolve(`${frameworkName}/package.json`, { paths: [baseDir] }), '../../..');
61
+ }
62
+ else {
63
+ globalModuleDir = path.join(importResolve(`${frameworkName}/package.json`, { paths: [baseDir] }), '../..');
64
+ }
65
+ moduleDirs.add(globalModuleDir);
66
+ }
67
+ catch {
68
+ // ignore
69
+ // debug('importResolve %s on %s error: %s', frameworkName, moduleDir, err);
70
+ }
71
+ for (const moduleDir of moduleDirs) {
72
+ const frameworkPath = path.join(moduleDir, frameworkName);
73
+ if (existsSync(frameworkPath)) {
74
+ debug('[assertAndReturn] frameworkPath: %s, moduleDirs: %o', frameworkPath, moduleDirs);
75
+ return frameworkPath;
76
+ }
77
+ }
78
+ // console.error('framework: %o is not found in: %j, cwd: %s, baseDir: %s', frameworkName, Array.from(moduleDirs), process.cwd(), baseDir);
79
+ throw new Error(`${frameworkName} is not found in ${Array.from(moduleDirs)}`);
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZyYW1ld29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFOUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBTzlCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFnQjtJQUMvQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNuRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxlQUFlLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVyRCxpQ0FBaUM7SUFDakMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLG9DQUFvQztRQUNwQyxpRUFBaUU7UUFDakUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLFNBQVMsZUFBZSxD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
@@ -0,0 +1,12 @@
1
+ export interface ImportResolveOptions {
2
+ paths?: string[];
3
+ }
4
+ export interface ImportModuleOptions extends ImportResolveOptions {
5
+ importDefaultOnly?: boolean;
6
+ }
7
+ export declare let isESM: boolean;
8
+ export declare function getRequire(): NodeRequire;
9
+ export declare function getExtensions(): NodeJS.RequireExtensions;
10
+ export declare function isSupportTypeScript(): boolean;
11
+ export declare function importResolve(filepath: string, options?: ImportResolveOptions): string;
12
+ export declare function importModule(filepath: string, options?: ImportModuleOptions): Promise<any>;
package/dist/import.js ADDED
@@ -0,0 +1,385 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { debuglog } from 'node:util';
10
+ import { createRequire } from 'node:module';
11
+ import { pathToFileURL, fileURLToPath } from 'node:url';
12
+ import path from 'node:path';
13
+ import fs from 'node:fs';
14
+ import { ImportResolveError } from "./error/index.js";
15
+ const debug = debuglog('egg/utils/import');
16
+ // detect is esm or cjs
17
+ export let isESM = true;
18
+ try {
19
+ // Accessing import.meta will throw an error in CJS
20
+ if (typeof import.meta !== 'undefined') {
21
+ isESM = true;
22
+ }
23
+ }
24
+ catch {
25
+ // If import.meta is not available, it's likely CJS
26
+ isESM = false;
27
+ }
28
+ const nodeMajorVersion = parseInt(process.versions.node.split('.', 1)[0], 10);
29
+ const supportImportMetaResolve = nodeMajorVersion >= 18;
30
+ let _customRequire;
31
+ export function getRequire() {
32
+ if (!_customRequire) {
33
+ if (typeof require !== 'undefined') {
34
+ _customRequire = require;
35
+ }
36
+ else {
37
+ _customRequire = createRequire(process.cwd());
38
+ }
39
+ }
40
+ return _customRequire;
41
+ }
42
+ export function getExtensions() {
43
+ return getRequire().extensions;
44
+ }
45
+ let _supportTypeScript;
46
+ export function isSupportTypeScript() {
47
+ if (_supportTypeScript === undefined) {
48
+ const extensions = getExtensions();
49
+ // enable ts by process.env.EGG_TS_ENABLE or process.env.VITEST
50
+ _supportTypeScript =
51
+ extensions['.ts'] !== undefined ||
52
+ process.env.VITEST === 'true' ||
53
+ process.env.EGG_TS_ENABLE === 'true' ||
54
+ parseInt(process.versions.node.split('.', 1)[0], 10) >= 22;
55
+ debug('[isSupportTypeScript] %o, extensions: %j, process.env.VITEST: %j, process.env.EGG_TS_ENABLE: %j, node version: %s', _supportTypeScript, Object.keys(extensions), process.env.VITEST, process.env.EGG_TS_ENABLE, process.versions.node);
56
+ }
57
+ return _supportTypeScript;
58
+ }
59
+ function tryToResolveFromFile(filepath) {
60
+ // "type": "module", try index.mjs then index.js
61
+ const type = isESM ? 'module' : 'commonjs';
62
+ let mainIndexFile = '';
63
+ if (type === 'module') {
64
+ mainIndexFile = filepath + '.mjs';
65
+ if (fs.existsSync(mainIndexFile)) {
66
+ debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type);
67
+ return mainIndexFile;
68
+ }
69
+ mainIndexFile = filepath + '.js';
70
+ if (fs.existsSync(mainIndexFile)) {
71
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
72
+ return mainIndexFile;
73
+ }
74
+ }
75
+ else {
76
+ // "type": "commonjs", try index.js then index.cjs
77
+ mainIndexFile = filepath + '.cjs';
78
+ if (fs.existsSync(mainIndexFile)) {
79
+ debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type);
80
+ return mainIndexFile;
81
+ }
82
+ mainIndexFile = filepath + '.js';
83
+ if (fs.existsSync(mainIndexFile)) {
84
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
85
+ return mainIndexFile;
86
+ }
87
+ }
88
+ if (!isSupportTypeScript()) {
89
+ return;
90
+ }
91
+ // for the module under development
92
+ mainIndexFile = filepath + '.ts';
93
+ if (fs.existsSync(mainIndexFile)) {
94
+ debug('[tryToResolveFromFile] %o, use index.ts, type: %o', mainIndexFile, type);
95
+ return mainIndexFile;
96
+ }
97
+ }
98
+ function tryToResolveByDirnameFromPackage(dirname, pkg) {
99
+ // try to read pkg.main or pkg.module first
100
+ // "main": "./dist/commonjs/index.js",
101
+ // "module": "./dist/esm/index.js"
102
+ const defaultMainFile = isESM ? (pkg.module ?? pkg.main) : pkg.main;
103
+ if (defaultMainFile) {
104
+ const mainIndexFilePath = path.join(dirname, defaultMainFile);
105
+ if (fs.existsSync(mainIndexFilePath)) {
106
+ debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s', mainIndexFilePath, defaultMainFile, isESM);
107
+ return mainIndexFilePath;
108
+ }
109
+ }
110
+ // detect from exports
111
+ if (pkg.exports?.['.']) {
112
+ const pkgType = pkg.type ?? 'commonjs';
113
+ const defaultExport = pkg.exports['.'];
114
+ let mainIndexFilePath = '';
115
+ if (typeof defaultExport === 'string') {
116
+ mainIndexFilePath = path.join(dirname, defaultExport);
117
+ }
118
+ else {
119
+ // "type": "module",
120
+ if (pkgType === 'module') {
121
+ if (typeof defaultExport.import === 'string') {
122
+ mainIndexFilePath = path.join(dirname, defaultExport.import);
123
+ }
124
+ else if (typeof defaultExport.import?.default === 'string') {
125
+ mainIndexFilePath = path.join(dirname, defaultExport.import.default);
126
+ }
127
+ }
128
+ else {
129
+ // "type": "commonjs",
130
+ if (typeof defaultExport.require === 'string') {
131
+ mainIndexFilePath = path.join(dirname, defaultExport.require);
132
+ }
133
+ else if (typeof defaultExport.require?.default === 'string') {
134
+ mainIndexFilePath = path.join(dirname, defaultExport.require.default);
135
+ }
136
+ }
137
+ }
138
+ if (mainIndexFilePath && fs.existsSync(mainIndexFilePath)) {
139
+ debug('[tryToResolveByDirnameFromPackage] %o, use pkg.exports[.]: %o, pkg.type: %o', mainIndexFilePath, defaultExport, pkgType);
140
+ return mainIndexFilePath;
141
+ }
142
+ }
143
+ // "type": "module", try index.mjs then index.js
144
+ const type = pkg?.type ?? (isESM ? 'module' : 'commonjs');
145
+ if (type === 'module') {
146
+ const mainIndexFilePath = path.join(dirname, 'index.mjs');
147
+ if (fs.existsSync(mainIndexFilePath)) {
148
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type);
149
+ return mainIndexFilePath;
150
+ }
151
+ const mainIndexMjsFilePath = path.join(dirname, 'index.js');
152
+ if (fs.existsSync(mainIndexMjsFilePath)) {
153
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexMjsFilePath, type);
154
+ return mainIndexMjsFilePath;
155
+ }
156
+ }
157
+ else {
158
+ // "type": "commonjs", try index.cjs then index.js
159
+ const mainIndexFilePath = path.join(dirname, 'index.cjs');
160
+ if (fs.existsSync(mainIndexFilePath)) {
161
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type);
162
+ return mainIndexFilePath;
163
+ }
164
+ const mainIndexCjsFilePath = path.join(dirname, 'index.js');
165
+ if (fs.existsSync(mainIndexCjsFilePath)) {
166
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexCjsFilePath, type);
167
+ return mainIndexCjsFilePath;
168
+ }
169
+ }
170
+ if (!isSupportTypeScript()) {
171
+ return;
172
+ }
173
+ // for the module under development
174
+ // "tshy": {
175
+ // "exports": {
176
+ // "./package.json": "./package.json",
177
+ // ".": "./src/index.ts"
178
+ // }
179
+ // }
180
+ const mainIndexFile = pkg.tshy?.exports?.['.'] ?? 'index.ts';
181
+ const mainIndexFilePath = path.join(dirname, mainIndexFile);
182
+ if (fs.existsSync(mainIndexFilePath)) {
183
+ return mainIndexFilePath;
184
+ }
185
+ }
186
+ function tryToResolveByDirname(dirname) {
187
+ let pkg = {};
188
+ const pkgFile = path.join(dirname, 'package.json');
189
+ if (fs.existsSync(pkgFile)) {
190
+ pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
191
+ }
192
+ return tryToResolveByDirnameFromPackage(dirname, pkg);
193
+ }
194
+ function isRelativePath(filepath) {
195
+ return (filepath.startsWith('./') || filepath.startsWith('../') || filepath.startsWith('.\\') || filepath.startsWith('..\\'));
196
+ }
197
+ function tryToResolveFromAbsoluteFile(filepath) {
198
+ let moduleFilePath;
199
+ const stat = fs.statSync(filepath, { throwIfNoEntry: false });
200
+ // try to resolve from directory
201
+ if (stat?.isDirectory()) {
202
+ moduleFilePath = tryToResolveByDirname(filepath);
203
+ if (moduleFilePath) {
204
+ return moduleFilePath;
205
+ }
206
+ }
207
+ else if (stat?.isFile()) {
208
+ return filepath;
209
+ }
210
+ // try to resolve from file
211
+ moduleFilePath = tryToResolveFromFile(filepath);
212
+ if (moduleFilePath) {
213
+ return moduleFilePath;
214
+ }
215
+ // try to resolve from parent directory and read package.json#exports
216
+ // e.g: /path/to/mock/app => /path/to/mock/src/app.ts
217
+ // {
218
+ // "exports": {
219
+ // "./app": "./src/app.ts"
220
+ // }
221
+ // }
222
+ const parentDir = path.dirname(filepath);
223
+ const basename = path.basename(filepath);
224
+ const pkgFile = path.join(parentDir, 'package.json');
225
+ if (fs.existsSync(pkgFile)) {
226
+ const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
227
+ const key = `./${basename}`;
228
+ if (pkg.exports?.[key]) {
229
+ return path.join(parentDir, pkg.exports[key]);
230
+ }
231
+ }
232
+ }
233
+ export function importResolve(filepath, options) {
234
+ // find *.json or CommonJS module by require.resolve
235
+ // e.g.: importResolve('egg/package.json', { paths })
236
+ const paths = options?.paths ?? [process.cwd()];
237
+ debug('[importResolve] filepath: %o, options: %j, paths: %j', filepath, options, paths);
238
+ let moduleFilePath;
239
+ const isAbsolute = path.isAbsolute(filepath);
240
+ if (isAbsolute) {
241
+ moduleFilePath = tryToResolveFromAbsoluteFile(filepath);
242
+ if (moduleFilePath) {
243
+ debug('[importResolve:isAbsolute] %o => %o', filepath, moduleFilePath);
244
+ return moduleFilePath;
245
+ }
246
+ }
247
+ else if (isRelativePath(filepath)) {
248
+ for (const p of paths) {
249
+ const resolvedPath = path.resolve(p, filepath);
250
+ moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath);
251
+ if (moduleFilePath) {
252
+ debug('[importResolve:isRelativePath] %o => %o => %o', filepath, resolvedPath, moduleFilePath);
253
+ return moduleFilePath;
254
+ }
255
+ }
256
+ }
257
+ // find from node_modules
258
+ for (const p of paths) {
259
+ let resolvedPath = path.join(p, 'node_modules', filepath);
260
+ moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath);
261
+ if (moduleFilePath) {
262
+ debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath);
263
+ return moduleFilePath;
264
+ }
265
+ // find from parent node_modules
266
+ // non-scoped package, e.g: node_modules/egg
267
+ let parentPath = path.dirname(p);
268
+ if (path.basename(parentPath) === 'node_modules') {
269
+ resolvedPath = path.join(parentPath, filepath);
270
+ moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath);
271
+ if (moduleFilePath) {
272
+ debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath);
273
+ return moduleFilePath;
274
+ }
275
+ }
276
+ // scoped package, e.g: node_modules/@eggjs/tegg
277
+ parentPath = path.dirname(parentPath);
278
+ if (path.basename(parentPath) === 'node_modules') {
279
+ resolvedPath = path.join(parentPath, filepath);
280
+ moduleFilePath = tryToResolveFromAbsoluteFile(resolvedPath);
281
+ if (moduleFilePath) {
282
+ debug('[importResolve:node_modules] %o => %o => %o', filepath, resolvedPath, moduleFilePath);
283
+ return moduleFilePath;
284
+ }
285
+ }
286
+ }
287
+ const extname = path.extname(filepath);
288
+ if ((!isAbsolute && extname === '.json') || !isESM) {
289
+ moduleFilePath = getRequire().resolve(filepath, {
290
+ paths,
291
+ });
292
+ }
293
+ else {
294
+ if (supportImportMetaResolve) {
295
+ try {
296
+ moduleFilePath = import.meta.resolve(filepath);
297
+ }
298
+ catch (err) {
299
+ debug('[importResolve:error] import.meta.resolve %o => %o, options: %o', filepath, err, options);
300
+ throw new ImportResolveError(filepath, paths, err);
301
+ }
302
+ if (moduleFilePath.startsWith('file://')) {
303
+ // resolve will return file:// URL on Linux and MacOS expect on Windows
304
+ moduleFilePath = fileURLToPath(moduleFilePath);
305
+ }
306
+ debug('[importResolve] import.meta.resolve %o => %o', filepath, moduleFilePath);
307
+ const stat = fs.statSync(moduleFilePath, { throwIfNoEntry: false });
308
+ if (!stat?.isFile()) {
309
+ throw new TypeError(`Cannot find module ${filepath}, because ${moduleFilePath} does not exists`);
310
+ }
311
+ }
312
+ else {
313
+ moduleFilePath = getRequire().resolve(filepath);
314
+ }
315
+ }
316
+ debug('[importResolve:success] %o, options: %o => %o, isESM: %s', filepath, options, moduleFilePath, isESM);
317
+ return moduleFilePath;
318
+ }
319
+ export async function importModule(filepath, options) {
320
+ const moduleFilePath = importResolve(filepath, options);
321
+ let obj;
322
+ if (isESM) {
323
+ // esm
324
+ const fileUrl = pathToFileURL(moduleFilePath).toString();
325
+ obj = await import(__rewriteRelativeImportExtension(fileUrl));
326
+ debug('[importModule:success] await import %o', fileUrl);
327
+ // {
328
+ // default: { foo: 'bar', one: 1 },
329
+ // foo: 'bar',
330
+ // one: 1,
331
+ // [Symbol(Symbol.toStringTag)]: 'Module'
332
+ // }
333
+ if (obj?.default?.__esModule === true && 'default' in obj?.default) {
334
+ // 兼容 cjs 模拟 esm 的导出格式
335
+ // {
336
+ // __esModule: true,
337
+ // default: {
338
+ // __esModule: true,
339
+ // default: {
340
+ // fn: [Function: fn] { [length]: 0, [name]: 'fn' },
341
+ // foo: 'bar',
342
+ // one: 1
343
+ // }
344
+ // },
345
+ // [Symbol(Symbol.toStringTag)]: 'Module'
346
+ // }
347
+ // 兼容 ts module
348
+ // {
349
+ // default: {
350
+ // [__esModule]: true,
351
+ // default: <ref *1> [Function: default_1] {
352
+ // [length]: 0,
353
+ // [name]: 'default_1',
354
+ // [prototype]: { [constructor]: [Circular *1] }
355
+ // }
356
+ // },
357
+ // [Symbol(Symbol.toStringTag)]: 'Module'
358
+ // }
359
+ obj = obj.default;
360
+ }
361
+ if (options?.importDefaultOnly) {
362
+ if ('default' in obj) {
363
+ obj = obj.default;
364
+ }
365
+ }
366
+ }
367
+ else {
368
+ // commonjs
369
+ obj = require(moduleFilePath);
370
+ debug('[importModule] require %o', moduleFilePath);
371
+ if (obj?.__esModule === true && 'default' in obj) {
372
+ // 兼容 cjs 模拟 esm 的导出格式
373
+ // {
374
+ // __esModule: true,
375
+ // default: { fn: [Function: fn], foo: 'bar', one: 1 }
376
+ // }
377
+ obj = obj.default;
378
+ }
379
+ }
380
+ if (debug.enabled) {
381
+ debug('[importModule] return %o => keys: %j, typeof obj: %s', filepath, obj ? Object.keys(obj) : obj, typeof obj);
382
+ }
383
+ return obj;
384
+ }
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXRELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBVzNDLHVCQUF1QjtBQUN2QixNQUFNLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLElBQUksQ0FBQztJQUNILG1EQUFtRDtJQUNuRCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFBQyxNQUFNLENBQUM7SUFDUCxtREFBbUQ7SUFDbkQsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNoQixDQUFDO0FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLHdCQUF3QixHQUFHLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztBQUV4RCxJQUFJLGNBQTJCLENBQUM7QUFDaEMsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLElBQUksT0FB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