@eggjs/utils 4.1.0 → 4.1.2

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.
@@ -11,6 +11,9 @@ const node_url_1 = require("node:url");
11
11
  const node_path_1 = __importDefault(require("node:path"));
12
12
  const node_fs_1 = __importDefault(require("node:fs"));
13
13
  const debug = (0, node_util_1.debuglog)('@eggjs/utils/import');
14
+ const isESM = typeof require === 'undefined';
15
+ const nodeMajorVersion = parseInt(process.versions.node.split('.', 1)[0], 10);
16
+ const supportImportMetaResolve = nodeMajorVersion >= 18;
14
17
  let _customRequire;
15
18
  function getRequire() {
16
19
  if (!_customRequire) {
@@ -23,66 +26,166 @@ function getRequire() {
23
26
  }
24
27
  return _customRequire;
25
28
  }
26
- let supportTypeScript;
29
+ let _supportTypeScript;
27
30
  function isSupportTypeScript() {
28
- if (supportTypeScript === undefined) {
31
+ if (_supportTypeScript === undefined) {
29
32
  const extensions = getRequire().extensions;
30
- supportTypeScript = extensions['.ts'] !== undefined;
31
- debug('[isSupportTypeScript] %o, extensions: %j', supportTypeScript, Object.keys(extensions));
33
+ _supportTypeScript = extensions['.ts'] !== undefined;
34
+ debug('[isSupportTypeScript] %o, extensions: %j', _supportTypeScript, Object.keys(extensions));
35
+ }
36
+ return _supportTypeScript;
37
+ }
38
+ function tryToResolveFromFile(filepath) {
39
+ // "type": "module", try index.mjs then index.js
40
+ const type = isESM ? 'module' : 'commonjs';
41
+ let mainIndexFile = '';
42
+ if (type === 'module') {
43
+ mainIndexFile = filepath + '.mjs';
44
+ if (node_fs_1.default.existsSync(mainIndexFile)) {
45
+ debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type);
46
+ return mainIndexFile;
47
+ }
48
+ mainIndexFile = filepath + '.js';
49
+ if (node_fs_1.default.existsSync(mainIndexFile)) {
50
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
51
+ return mainIndexFile;
52
+ }
53
+ }
54
+ else {
55
+ // "type": "commonjs", try index.js then index.cjs
56
+ mainIndexFile = filepath + '.cjs';
57
+ if (node_fs_1.default.existsSync(mainIndexFile)) {
58
+ debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type);
59
+ return mainIndexFile;
60
+ }
61
+ mainIndexFile = filepath + '.js';
62
+ if (node_fs_1.default.existsSync(mainIndexFile)) {
63
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
64
+ return mainIndexFile;
65
+ }
66
+ }
67
+ if (!isSupportTypeScript()) {
68
+ return;
69
+ }
70
+ // for the module under development
71
+ mainIndexFile = filepath + '.ts';
72
+ if (node_fs_1.default.existsSync(mainIndexFile)) {
73
+ debug('[tryToResolveFromFile] %o, use index.ts, type: %o', mainIndexFile, type);
74
+ return mainIndexFile;
75
+ }
76
+ }
77
+ function tryToResolveByDirnameFromPackage(dirname, pkg) {
78
+ // try to read pkg.main or pkg.module first
79
+ // "main": "./dist/commonjs/index.js",
80
+ // "module": "./dist/esm/index.js"
81
+ const defaultMainFile = isESM ? pkg.module ?? pkg.main : pkg.main;
82
+ if (defaultMainFile) {
83
+ const mainIndexFilePath = node_path_1.default.join(dirname, defaultMainFile);
84
+ if (node_fs_1.default.existsSync(mainIndexFilePath)) {
85
+ debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s', mainIndexFilePath, defaultMainFile, isESM);
86
+ return mainIndexFilePath;
87
+ }
88
+ }
89
+ // "type": "module", try index.mjs then index.js
90
+ const type = pkg?.type ?? (isESM ? 'module' : 'commonjs');
91
+ if (type === 'module') {
92
+ const mainIndexFilePath = node_path_1.default.join(dirname, 'index.mjs');
93
+ if (node_fs_1.default.existsSync(mainIndexFilePath)) {
94
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type);
95
+ return mainIndexFilePath;
96
+ }
97
+ const mainIndexMjsFilePath = node_path_1.default.join(dirname, 'index.js');
98
+ if (node_fs_1.default.existsSync(mainIndexMjsFilePath)) {
99
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexMjsFilePath, type);
100
+ return mainIndexMjsFilePath;
101
+ }
102
+ }
103
+ else {
104
+ // "type": "commonjs", try index.cjs then index.js
105
+ const mainIndexFilePath = node_path_1.default.join(dirname, 'index.cjs');
106
+ if (node_fs_1.default.existsSync(mainIndexFilePath)) {
107
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type);
108
+ return mainIndexFilePath;
109
+ }
110
+ const mainIndexCjsFilePath = node_path_1.default.join(dirname, 'index.js');
111
+ if (node_fs_1.default.existsSync(mainIndexCjsFilePath)) {
112
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexCjsFilePath, type);
113
+ return mainIndexCjsFilePath;
114
+ }
115
+ }
116
+ if (!isSupportTypeScript()) {
117
+ return;
118
+ }
119
+ // for the module under development
120
+ // "tshy": {
121
+ // "exports": {
122
+ // "./package.json": "./package.json",
123
+ // ".": "./src/index.ts"
124
+ // }
125
+ // }
126
+ const mainIndexFile = pkg.tshy?.exports?.['.'] ?? 'index.ts';
127
+ const mainIndexFilePath = node_path_1.default.join(dirname, mainIndexFile);
128
+ if (node_fs_1.default.existsSync(mainIndexFilePath)) {
129
+ return mainIndexFilePath;
130
+ }
131
+ }
132
+ function tryToResolveByDirname(dirname) {
133
+ const pkgFile = node_path_1.default.join(dirname, 'package.json');
134
+ if (node_fs_1.default.existsSync(pkgFile)) {
135
+ const pkg = JSON.parse(node_fs_1.default.readFileSync(pkgFile, 'utf-8'));
136
+ return tryToResolveByDirnameFromPackage(dirname, pkg);
32
137
  }
33
- return supportTypeScript;
34
138
  }
35
139
  function importResolve(filepath, options) {
36
- // support typescript import on absolute path
37
- if (node_path_1.default.isAbsolute(filepath) && isSupportTypeScript()) {
38
- // "tshy": {
39
- // "exports": {
40
- // "./package.json": "./package.json",
41
- // ".": "./src/index.ts"
42
- // }
43
- // }
44
- const pkgFile = node_path_1.default.join(filepath, 'package.json');
45
- if (node_fs_1.default.existsSync(pkgFile)) {
46
- const pkg = JSON.parse(node_fs_1.default.readFileSync(pkgFile, 'utf-8'));
47
- const mainIndexFile = pkg.tshy?.exports?.['.'];
48
- if (mainIndexFile) {
49
- const mainIndexFilePath = node_path_1.default.join(filepath, mainIndexFile);
50
- if (node_fs_1.default.existsSync(mainIndexFilePath)) {
51
- debug('[importResolve] %o, options: %o => %o, use typescript', filepath, options, mainIndexFilePath);
52
- return mainIndexFilePath;
53
- }
54
- debug('[importResolve] typescript file %o not exists', mainIndexFilePath);
140
+ let moduleFilePath;
141
+ if (node_path_1.default.isAbsolute(filepath)) {
142
+ const stat = node_fs_1.default.statSync(filepath, { throwIfNoEntry: false });
143
+ if (stat?.isDirectory()) {
144
+ moduleFilePath = tryToResolveByDirname(filepath);
145
+ if (moduleFilePath) {
146
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
147
+ return moduleFilePath;
148
+ }
149
+ }
150
+ if (!stat) {
151
+ moduleFilePath = tryToResolveFromFile(filepath);
152
+ if (moduleFilePath) {
153
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
154
+ return moduleFilePath;
155
+ }
156
+ }
157
+ }
158
+ if (isESM) {
159
+ if (supportImportMetaResolve) {
160
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
161
+ // @ts-ignore
162
+ moduleFilePath = require.resolve(filepath);
163
+ if (moduleFilePath.startsWith('file://')) {
164
+ // resolve will return file:// URL on Linux and MacOS expect on Windows
165
+ moduleFilePath = (0, node_url_1.fileURLToPath)(moduleFilePath);
55
166
  }
56
167
  }
168
+ else {
169
+ moduleFilePath = getRequire().resolve(filepath);
170
+ }
171
+ }
172
+ else {
173
+ const cwd = process.cwd();
174
+ const paths = options?.paths ?? [cwd];
175
+ moduleFilePath = require.resolve(filepath, {
176
+ paths,
177
+ });
57
178
  }
58
- const cwd = process.cwd();
59
- const paths = options?.paths ?? [cwd];
60
- const moduleFilePath = getRequire().resolve(filepath, {
61
- paths,
62
- });
63
179
  debug('[importResolve] %o, options: %o => %o', filepath, options, moduleFilePath);
64
180
  return moduleFilePath;
65
181
  }
66
182
  async function importModule(filepath, options) {
67
183
  const moduleFilePath = importResolve(filepath, options);
68
184
  let obj;
69
- if (typeof require === 'function') {
70
- // commonjs
71
- obj = require(moduleFilePath);
72
- debug('[importModule] require %o => %o', filepath, obj);
73
- if (obj?.__esModule === true && 'default' in obj) {
74
- // 兼容 cjs 模拟 esm 的导出格式
75
- // {
76
- // __esModule: true,
77
- // default: { fn: [Function: fn], foo: 'bar', one: 1 }
78
- // }
79
- obj = obj.default;
80
- }
81
- }
82
- else {
185
+ if (isESM) {
83
186
  // esm
84
- debug('[importModule] await import start: %o', filepath);
85
187
  const fileUrl = (0, node_url_1.pathToFileURL)(moduleFilePath).toString();
188
+ debug('[importModule] await import start: %o', fileUrl);
86
189
  obj = await import(fileUrl);
87
190
  debug('[importModule] await import end: %o => %o', filepath, obj);
88
191
  // {
@@ -125,7 +228,20 @@ async function importModule(filepath, options) {
125
228
  }
126
229
  }
127
230
  }
231
+ else {
232
+ // commonjs
233
+ obj = require(moduleFilePath);
234
+ debug('[importModule] require %o => %o', filepath, obj);
235
+ if (obj?.__esModule === true && 'default' in obj) {
236
+ // 兼容 cjs 模拟 esm 的导出格式
237
+ // {
238
+ // __esModule: true,
239
+ // default: { fn: [Function: fn], foo: 'bar', one: 1 }
240
+ // }
241
+ obj = obj.default;
242
+ }
243
+ }
128
244
  debug('[importModule] return %o => %o', filepath, obj);
129
245
  return obj;
130
246
  }
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdDQSxzQ0E4QkM7QUFFRCxvQ0ErREM7QUF2SUQseUNBQXFDO0FBQ3JDLDZDQUE0QztBQUM1Qyx1Q0FBeUM7QUFDekMsMERBQTZCO0FBQzdCLHNEQUF5QjtBQUV6QixNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU5QyxJQUFJLGNBQTJCLENBQUM7QUFXaEMsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ25DLGNBQWMsR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLEdBQUcsSUFBQSwyQkFBYSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELElBQUksaUJBQXNDLENBQUM7QUFDM0MsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDM0MsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQztRQUNwRCxLQUFLLENBQUMsMENBQTBDLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQUMsUUFBZ0IsRUFBRSxPQUE4QjtJQUM1RSw2Q0FBNkM7SUFDN0MsSUFBSSxtQkFBSSxDQUFDLFVB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
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVKQSxzQ0F5Q0M7QUFFRCxvQ0ErREM7QUFqUUQseUNBQXFDO0FBQ3JDLDZDQUE0QztBQUM1Qyx1Q0FBd0Q7QUFDeEQsMERBQTZCO0FBQzdCLHNEQUF5QjtBQUV6QixNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQVc5QyxNQUFNLEtBQUssR0FBRyxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUM7QUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLHdCQUF3QixHQUFHLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztBQUV4RCxJQUFJLGNBQTJCLENBQUM7QUFDaEMsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ25DLGNBQWMsR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLEdBQUcsSUFBQSwyQkFBYSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELElBQUksa0JBQXVDLENBQUM7QUFDNUMsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDM0Msa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQztRQUNyRCxLQUFLLENBQUMsMENBQTBDLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFFBQWdCO0lBQzVDLGdEQUFnRDtJQUNoRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQzNDLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QixhQUFhLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUNsQyxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsYUFBYSxHQUFHLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2pDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sa0RBQWtEO1FBQ2xELGFBQWEsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLElBQUksaUJBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsb0RBQW9ELEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxhQUFhLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakMsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7UUFDM0IsT0FBTztJQUNULENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsYUFBYSxHQUFHLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakMsSUFBSSxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEYsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGdDQUFnQyxDQUFDLE9BQWUsRUFBRSxHQUFRO0lBQ2pFLDJDQUEyQztJQUMzQyxzQ0FBc0M7SUFDdEMsa0NBQWtDO0lBQ2xDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQ2xFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDOUQsSUFBSSxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLGtGQUFrRixFQUN0RixpQkFBaUIsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLE1BQU0saUJBQWlCLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFELElBQUksaUJBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEtBQUssQ0FBQyxvRUFBb0UsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRyxPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUM7UUFDRCxNQUFNLG9CQUFvQixHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN4QyxLQUFLLENBQUMsbUVBQW1FLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkcsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixrREFBa0Q7UUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLG9FQUFvRSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JHLE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQztRQUNELE1BQU0sb0JBQW9CLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVELElBQUksaUJBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxtRUFBbUUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RyxPQUFPLG9CQUFvQixDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUMzQixPQUFPO0lBQ1QsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLDBDQUEwQztJQUMxQyw0QkFBNEI7SUFDNUIsTUFBTTtJQUNOLElBQUk7SUFDSixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUM3RCxNQUFNLGlCQUFpQixHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM1RCxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxPQUFlO0lBQzVDLE1BQU0sT0FBTyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNuRCxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLGdDQUFnQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4RCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUFnQixFQUFFLE9BQThCO0lBQzVFLElBQUksY0FBa0MsQ0FBQztJQUN2QyxJQUFJLG1CQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsaUJBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN4QixjQUFjLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDNUQsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixjQUFjLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDNUQsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUM3Qiw2REFBNkQ7WUFDN0QsYUFBYTtZQUNiLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsdUVBQXVFO2dCQUN2RSxjQUFjLEdBQUcsSUFBQSx3QkFBYSxFQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLGNBQWMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBRSxHQUFHLENBQUUsQ0FBQztRQUN4QyxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekMsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsdUNBQXVDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRixPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRU0sS0FBSyxVQUFVLFlBQVksQ0FBQyxRQUFnQixFQUFFLE9BQTZCO0lBQ2hGLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsSUFBSSxHQUFRLENBQUM7SUFDYixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsTUFBTTtRQUNOLE1BQU0sT0FBTyxHQUFHLElBQUEsd0JBQWEsRUFBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxLQUFLLENBQUMsdUNBQXVDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSTtRQUNKLHFDQUFxQztRQUNyQyxnQkFBZ0I7UUFDaEIsWUFBWTtRQUNaLDJDQUEyQztRQUMzQyxJQUFJO1FBQ0osSUFBSSxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNuRSxzQkFBc0I7WUFDdEIsSUFBSTtZQUNKLHNCQUFzQjtZQUN0QixlQUFlO1lBQ2Ysd0JBQXdCO1lBQ3hCLGlCQUFpQjtZQUNqQiwwREFBMEQ7WUFDMUQsb0JBQW9CO1lBQ3BCLGVBQWU7WUFDZixRQUFRO1lBQ1IsT0FBTztZQUNQLDJDQUEyQztZQUMzQyxJQUFJO1lBQ0osZUFBZTtZQUNmLElBQUk7WUFDSixlQUFlO1lBQ2YsMEJBQTBCO1lBQzFCLGdEQUFnRDtZQUNoRCxxQkFBcUI7WUFDckIsNkJBQTZCO1lBQzdCLHNEQUFzRDtZQUN0RCxRQUFRO1lBQ1IsT0FBTztZQUNQLDJDQUEyQztZQUMzQyxJQUFJO1lBQ0osR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7WUFDL0IsSUFBSSxTQUFTLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixXQUFXO1FBQ1gsR0FBRyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QixLQUFLLENBQUMsaUNBQWlDLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELElBQUksR0FBRyxFQUFFLFVBQVUsS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2pELHNCQUFzQjtZQUN0QixJQUFJO1lBQ0osc0JBQXNCO1lBQ3RCLHdEQUF3RDtZQUN4RCxJQUFJO1lBQ0osR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyJ9
@@ -1,9 +1,12 @@
1
1
  import { debuglog } from 'node:util';
2
2
  import { createRequire } from 'node:module';
3
- import { pathToFileURL } from 'node:url';
3
+ import { pathToFileURL, fileURLToPath } from 'node:url';
4
4
  import path from 'node:path';
5
5
  import fs from 'node:fs';
6
6
  const debug = debuglog('@eggjs/utils/import');
7
+ const isESM = typeof require === 'undefined';
8
+ const nodeMajorVersion = parseInt(process.versions.node.split('.', 1)[0], 10);
9
+ const supportImportMetaResolve = nodeMajorVersion >= 18;
7
10
  let _customRequire;
8
11
  function getRequire() {
9
12
  if (!_customRequire) {
@@ -16,66 +19,166 @@ function getRequire() {
16
19
  }
17
20
  return _customRequire;
18
21
  }
19
- let supportTypeScript;
22
+ let _supportTypeScript;
20
23
  function isSupportTypeScript() {
21
- if (supportTypeScript === undefined) {
24
+ if (_supportTypeScript === undefined) {
22
25
  const extensions = getRequire().extensions;
23
- supportTypeScript = extensions['.ts'] !== undefined;
24
- debug('[isSupportTypeScript] %o, extensions: %j', supportTypeScript, Object.keys(extensions));
26
+ _supportTypeScript = extensions['.ts'] !== undefined;
27
+ debug('[isSupportTypeScript] %o, extensions: %j', _supportTypeScript, Object.keys(extensions));
28
+ }
29
+ return _supportTypeScript;
30
+ }
31
+ function tryToResolveFromFile(filepath) {
32
+ // "type": "module", try index.mjs then index.js
33
+ const type = isESM ? 'module' : 'commonjs';
34
+ let mainIndexFile = '';
35
+ if (type === 'module') {
36
+ mainIndexFile = filepath + '.mjs';
37
+ if (fs.existsSync(mainIndexFile)) {
38
+ debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type);
39
+ return mainIndexFile;
40
+ }
41
+ mainIndexFile = filepath + '.js';
42
+ if (fs.existsSync(mainIndexFile)) {
43
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
44
+ return mainIndexFile;
45
+ }
46
+ }
47
+ else {
48
+ // "type": "commonjs", try index.js then index.cjs
49
+ mainIndexFile = filepath + '.cjs';
50
+ if (fs.existsSync(mainIndexFile)) {
51
+ debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type);
52
+ return mainIndexFile;
53
+ }
54
+ mainIndexFile = filepath + '.js';
55
+ if (fs.existsSync(mainIndexFile)) {
56
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
57
+ return mainIndexFile;
58
+ }
59
+ }
60
+ if (!isSupportTypeScript()) {
61
+ return;
62
+ }
63
+ // for the module under development
64
+ mainIndexFile = filepath + '.ts';
65
+ if (fs.existsSync(mainIndexFile)) {
66
+ debug('[tryToResolveFromFile] %o, use index.ts, type: %o', mainIndexFile, type);
67
+ return mainIndexFile;
68
+ }
69
+ }
70
+ function tryToResolveByDirnameFromPackage(dirname, pkg) {
71
+ // try to read pkg.main or pkg.module first
72
+ // "main": "./dist/commonjs/index.js",
73
+ // "module": "./dist/esm/index.js"
74
+ const defaultMainFile = isESM ? pkg.module ?? pkg.main : pkg.main;
75
+ if (defaultMainFile) {
76
+ const mainIndexFilePath = path.join(dirname, defaultMainFile);
77
+ if (fs.existsSync(mainIndexFilePath)) {
78
+ debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s', mainIndexFilePath, defaultMainFile, isESM);
79
+ return mainIndexFilePath;
80
+ }
81
+ }
82
+ // "type": "module", try index.mjs then index.js
83
+ const type = pkg?.type ?? (isESM ? 'module' : 'commonjs');
84
+ if (type === 'module') {
85
+ const mainIndexFilePath = path.join(dirname, 'index.mjs');
86
+ if (fs.existsSync(mainIndexFilePath)) {
87
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type);
88
+ return mainIndexFilePath;
89
+ }
90
+ const mainIndexMjsFilePath = path.join(dirname, 'index.js');
91
+ if (fs.existsSync(mainIndexMjsFilePath)) {
92
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexMjsFilePath, type);
93
+ return mainIndexMjsFilePath;
94
+ }
95
+ }
96
+ else {
97
+ // "type": "commonjs", try index.cjs then index.js
98
+ const mainIndexFilePath = path.join(dirname, 'index.cjs');
99
+ if (fs.existsSync(mainIndexFilePath)) {
100
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type);
101
+ return mainIndexFilePath;
102
+ }
103
+ const mainIndexCjsFilePath = path.join(dirname, 'index.js');
104
+ if (fs.existsSync(mainIndexCjsFilePath)) {
105
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexCjsFilePath, type);
106
+ return mainIndexCjsFilePath;
107
+ }
108
+ }
109
+ if (!isSupportTypeScript()) {
110
+ return;
111
+ }
112
+ // for the module under development
113
+ // "tshy": {
114
+ // "exports": {
115
+ // "./package.json": "./package.json",
116
+ // ".": "./src/index.ts"
117
+ // }
118
+ // }
119
+ const mainIndexFile = pkg.tshy?.exports?.['.'] ?? 'index.ts';
120
+ const mainIndexFilePath = path.join(dirname, mainIndexFile);
121
+ if (fs.existsSync(mainIndexFilePath)) {
122
+ return mainIndexFilePath;
123
+ }
124
+ }
125
+ function tryToResolveByDirname(dirname) {
126
+ const pkgFile = path.join(dirname, 'package.json');
127
+ if (fs.existsSync(pkgFile)) {
128
+ const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
129
+ return tryToResolveByDirnameFromPackage(dirname, pkg);
25
130
  }
26
- return supportTypeScript;
27
131
  }
28
132
  export function importResolve(filepath, options) {
29
- // support typescript import on absolute path
30
- if (path.isAbsolute(filepath) && isSupportTypeScript()) {
31
- // "tshy": {
32
- // "exports": {
33
- // "./package.json": "./package.json",
34
- // ".": "./src/index.ts"
35
- // }
36
- // }
37
- const pkgFile = path.join(filepath, 'package.json');
38
- if (fs.existsSync(pkgFile)) {
39
- const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
40
- const mainIndexFile = pkg.tshy?.exports?.['.'];
41
- if (mainIndexFile) {
42
- const mainIndexFilePath = path.join(filepath, mainIndexFile);
43
- if (fs.existsSync(mainIndexFilePath)) {
44
- debug('[importResolve] %o, options: %o => %o, use typescript', filepath, options, mainIndexFilePath);
45
- return mainIndexFilePath;
46
- }
47
- debug('[importResolve] typescript file %o not exists', mainIndexFilePath);
133
+ let moduleFilePath;
134
+ if (path.isAbsolute(filepath)) {
135
+ const stat = fs.statSync(filepath, { throwIfNoEntry: false });
136
+ if (stat?.isDirectory()) {
137
+ moduleFilePath = tryToResolveByDirname(filepath);
138
+ if (moduleFilePath) {
139
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
140
+ return moduleFilePath;
141
+ }
142
+ }
143
+ if (!stat) {
144
+ moduleFilePath = tryToResolveFromFile(filepath);
145
+ if (moduleFilePath) {
146
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
147
+ return moduleFilePath;
148
+ }
149
+ }
150
+ }
151
+ if (isESM) {
152
+ if (supportImportMetaResolve) {
153
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
154
+ // @ts-ignore
155
+ moduleFilePath = import.meta.resolve(filepath);
156
+ if (moduleFilePath.startsWith('file://')) {
157
+ // resolve will return file:// URL on Linux and MacOS expect on Windows
158
+ moduleFilePath = fileURLToPath(moduleFilePath);
48
159
  }
49
160
  }
161
+ else {
162
+ moduleFilePath = getRequire().resolve(filepath);
163
+ }
164
+ }
165
+ else {
166
+ const cwd = process.cwd();
167
+ const paths = options?.paths ?? [cwd];
168
+ moduleFilePath = require.resolve(filepath, {
169
+ paths,
170
+ });
50
171
  }
51
- const cwd = process.cwd();
52
- const paths = options?.paths ?? [cwd];
53
- const moduleFilePath = getRequire().resolve(filepath, {
54
- paths,
55
- });
56
172
  debug('[importResolve] %o, options: %o => %o', filepath, options, moduleFilePath);
57
173
  return moduleFilePath;
58
174
  }
59
175
  export async function importModule(filepath, options) {
60
176
  const moduleFilePath = importResolve(filepath, options);
61
177
  let obj;
62
- if (typeof require === 'function') {
63
- // commonjs
64
- obj = require(moduleFilePath);
65
- debug('[importModule] require %o => %o', filepath, obj);
66
- if (obj?.__esModule === true && 'default' in obj) {
67
- // 兼容 cjs 模拟 esm 的导出格式
68
- // {
69
- // __esModule: true,
70
- // default: { fn: [Function: fn], foo: 'bar', one: 1 }
71
- // }
72
- obj = obj.default;
73
- }
74
- }
75
- else {
178
+ if (isESM) {
76
179
  // esm
77
- debug('[importModule] await import start: %o', filepath);
78
180
  const fileUrl = pathToFileURL(moduleFilePath).toString();
181
+ debug('[importModule] await import start: %o', fileUrl);
79
182
  obj = await import(fileUrl);
80
183
  debug('[importModule] await import end: %o => %o', filepath, obj);
81
184
  // {
@@ -118,7 +221,20 @@ export async function importModule(filepath, options) {
118
221
  }
119
222
  }
120
223
  }
224
+ else {
225
+ // commonjs
226
+ obj = require(moduleFilePath);
227
+ debug('[importModule] require %o => %o', filepath, obj);
228
+ if (obj?.__esModule === true && 'default' in obj) {
229
+ // 兼容 cjs 模拟 esm 的导出格式
230
+ // {
231
+ // __esModule: true,
232
+ // default: { fn: [Function: fn], foo: 'bar', one: 1 }
233
+ // }
234
+ obj = obj.default;
235
+ }
236
+ }
121
237
  debug('[importModule] return %o => %o', filepath, obj);
122
238
  return obj;
123
239
  }
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRTlDLElBQUksY0FBMkIsQ0FBQztBQVdoQyxTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbkMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLGNBQWMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQsSUFBSSxpQkFBc0MsQ0FBQztBQUMzQyxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDO1FBQ3BELEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FB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
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQVc5QyxNQUFNLEtBQUssR0FBRyxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUM7QUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLHdCQUF3QixHQUFHLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztBQUV4RCxJQUFJLGNBQTJCLENBQUM7QUFDaEMsU0FBUyxVQUFVO0lBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ25DLGNBQWMsR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixjQUFjLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELElBQUksa0JBQXVDLENBQUM7QUFDNUMsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVB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
package/dist/package.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "@eggjs/utils",
3
- "version": "4.1.0"
3
+ "version": "4.1.2"
4
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eggjs/utils",
3
- "version": "4.1.0",
3
+ "version": "4.1.2",
4
4
  "engine": {
5
5
  "node": ">=18.19.0"
6
6
  },
@@ -10,12 +10,13 @@
10
10
  "description": "Utils for all egg projects",
11
11
  "scripts": {
12
12
  "lint": "eslint src test --ext ts",
13
- "pretest": "npm run prepublishOnly",
14
- "test": "npm run lint -- --fix && npm run test-local",
13
+ "pretest": "npm run clean && npm run lint -- --fix && npm run prepublishOnly",
14
+ "test": "npm run test-local",
15
15
  "test-local": "egg-bin test",
16
- "preci": "npm run prepublishOnly",
17
- "ci": "npm run lint && egg-bin cov && npm run prepublishOnly",
18
- "prepublishOnly": "tshy && tshy-after"
16
+ "preci": "npm run clean && npm run lint && npm run prepublishOnly",
17
+ "ci": "egg-bin cov",
18
+ "clean": "rimraf dist",
19
+ "prepublishOnly": "tshy && tshy-after && attw --pack"
19
20
  },
20
21
  "keywords": [
21
22
  "egg",
@@ -29,6 +30,7 @@
29
30
  "license": "MIT",
30
31
  "dependencies": {},
31
32
  "devDependencies": {
33
+ "@arethetypeswrong/cli": "^0.17.2",
32
34
  "@eggjs/tsconfig": "1",
33
35
  "@types/mocha": "10",
34
36
  "@types/node": "22",
@@ -38,6 +40,7 @@
38
40
  "eslint-config-egg": "14",
39
41
  "mm": "3",
40
42
  "npminstall": "7",
43
+ "rimraf": "6",
41
44
  "runscript": "2",
42
45
  "tshy": "3",
43
46
  "tshy-after": "1",
package/src/import.ts CHANGED
@@ -1,13 +1,11 @@
1
1
  import { debuglog } from 'node:util';
2
2
  import { createRequire } from 'node:module';
3
- import { pathToFileURL } from 'node:url';
3
+ import { pathToFileURL, fileURLToPath } from 'node:url';
4
4
  import path from 'node:path';
5
5
  import fs from 'node:fs';
6
6
 
7
7
  const debug = debuglog('@eggjs/utils/import');
8
8
 
9
- let _customRequire: NodeRequire;
10
-
11
9
  export interface ImportResolveOptions {
12
10
  paths?: string[];
13
11
  }
@@ -17,6 +15,11 @@ export interface ImportModuleOptions extends ImportResolveOptions {
17
15
  importDefaultOnly?: boolean;
18
16
  }
19
17
 
18
+ const isESM = typeof require === 'undefined';
19
+ const nodeMajorVersion = parseInt(process.versions.node.split('.', 1)[0], 10);
20
+ const supportImportMetaResolve = nodeMajorVersion >= 18;
21
+
22
+ let _customRequire: NodeRequire;
20
23
  function getRequire() {
21
24
  if (!_customRequire) {
22
25
  if (typeof require !== 'undefined') {
@@ -28,44 +31,163 @@ function getRequire() {
28
31
  return _customRequire;
29
32
  }
30
33
 
31
- let supportTypeScript: boolean | undefined;
34
+ let _supportTypeScript: boolean | undefined;
32
35
  function isSupportTypeScript() {
33
- if (supportTypeScript === undefined) {
36
+ if (_supportTypeScript === undefined) {
34
37
  const extensions = getRequire().extensions;
35
- supportTypeScript = extensions['.ts'] !== undefined;
36
- debug('[isSupportTypeScript] %o, extensions: %j', supportTypeScript, Object.keys(extensions));
38
+ _supportTypeScript = extensions['.ts'] !== undefined;
39
+ debug('[isSupportTypeScript] %o, extensions: %j', _supportTypeScript, Object.keys(extensions));
40
+ }
41
+ return _supportTypeScript;
42
+ }
43
+
44
+ function tryToResolveFromFile(filepath: string): string | undefined {
45
+ // "type": "module", try index.mjs then index.js
46
+ const type = isESM ? 'module' : 'commonjs';
47
+ let mainIndexFile = '';
48
+ if (type === 'module') {
49
+ mainIndexFile = filepath + '.mjs';
50
+ if (fs.existsSync(mainIndexFile)) {
51
+ debug('[tryToResolveFromFile] %o, use index.mjs, type: %o', mainIndexFile, type);
52
+ return mainIndexFile;
53
+ }
54
+ mainIndexFile = filepath + '.js';
55
+ if (fs.existsSync(mainIndexFile)) {
56
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
57
+ return mainIndexFile;
58
+ }
59
+ } else {
60
+ // "type": "commonjs", try index.js then index.cjs
61
+ mainIndexFile = filepath + '.cjs';
62
+ if (fs.existsSync(mainIndexFile)) {
63
+ debug('[tryToResolveFromFile] %o, use index.cjs, type: %o', mainIndexFile, type);
64
+ return mainIndexFile;
65
+ }
66
+ mainIndexFile = filepath + '.js';
67
+ if (fs.existsSync(mainIndexFile)) {
68
+ debug('[tryToResolveFromFile] %o, use index.js, type: %o', mainIndexFile, type);
69
+ return mainIndexFile;
70
+ }
71
+ }
72
+
73
+ if (!isSupportTypeScript()) {
74
+ return;
75
+ }
76
+
77
+ // for the module under development
78
+ mainIndexFile = filepath + '.ts';
79
+ if (fs.existsSync(mainIndexFile)) {
80
+ debug('[tryToResolveFromFile] %o, use index.ts, type: %o', mainIndexFile, type);
81
+ return mainIndexFile;
82
+ }
83
+ }
84
+
85
+ function tryToResolveByDirnameFromPackage(dirname: string, pkg: any): string | undefined {
86
+ // try to read pkg.main or pkg.module first
87
+ // "main": "./dist/commonjs/index.js",
88
+ // "module": "./dist/esm/index.js"
89
+ const defaultMainFile = isESM ? pkg.module ?? pkg.main : pkg.main;
90
+ if (defaultMainFile) {
91
+ const mainIndexFilePath = path.join(dirname, defaultMainFile);
92
+ if (fs.existsSync(mainIndexFilePath)) {
93
+ debug('[tryToResolveByDirnameFromPackage] %o, use pkg.main or pkg.module: %o, isESM: %s',
94
+ mainIndexFilePath, defaultMainFile, isESM);
95
+ return mainIndexFilePath;
96
+ }
97
+ }
98
+
99
+ // "type": "module", try index.mjs then index.js
100
+ const type = pkg?.type ?? (isESM ? 'module' : 'commonjs');
101
+ if (type === 'module') {
102
+ const mainIndexFilePath = path.join(dirname, 'index.mjs');
103
+ if (fs.existsSync(mainIndexFilePath)) {
104
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.mjs, pkg.type: %o', mainIndexFilePath, type);
105
+ return mainIndexFilePath;
106
+ }
107
+ const mainIndexMjsFilePath = path.join(dirname, 'index.js');
108
+ if (fs.existsSync(mainIndexMjsFilePath)) {
109
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexMjsFilePath, type);
110
+ return mainIndexMjsFilePath;
111
+ }
112
+ } else {
113
+ // "type": "commonjs", try index.cjs then index.js
114
+ const mainIndexFilePath = path.join(dirname, 'index.cjs');
115
+ if (fs.existsSync(mainIndexFilePath)) {
116
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.cjs, pkg.type: %o', mainIndexFilePath, type);
117
+ return mainIndexFilePath;
118
+ }
119
+ const mainIndexCjsFilePath = path.join(dirname, 'index.js');
120
+ if (fs.existsSync(mainIndexCjsFilePath)) {
121
+ debug('[tryToResolveByDirnameFromPackage] %o, use index.js, pkg.type: %o', mainIndexCjsFilePath, type);
122
+ return mainIndexCjsFilePath;
123
+ }
124
+ }
125
+
126
+ if (!isSupportTypeScript()) {
127
+ return;
128
+ }
129
+
130
+ // for the module under development
131
+ // "tshy": {
132
+ // "exports": {
133
+ // "./package.json": "./package.json",
134
+ // ".": "./src/index.ts"
135
+ // }
136
+ // }
137
+ const mainIndexFile = pkg.tshy?.exports?.['.'] ?? 'index.ts';
138
+ const mainIndexFilePath = path.join(dirname, mainIndexFile);
139
+ if (fs.existsSync(mainIndexFilePath)) {
140
+ return mainIndexFilePath;
141
+ }
142
+ }
143
+
144
+ function tryToResolveByDirname(dirname: string): string | undefined {
145
+ const pkgFile = path.join(dirname, 'package.json');
146
+ if (fs.existsSync(pkgFile)) {
147
+ const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
148
+ return tryToResolveByDirnameFromPackage(dirname, pkg);
37
149
  }
38
- return supportTypeScript;
39
150
  }
40
151
 
41
152
  export function importResolve(filepath: string, options?: ImportResolveOptions) {
42
- // support typescript import on absolute path
43
- if (path.isAbsolute(filepath) && isSupportTypeScript()) {
44
- // "tshy": {
45
- // "exports": {
46
- // "./package.json": "./package.json",
47
- // ".": "./src/index.ts"
48
- // }
49
- // }
50
- const pkgFile = path.join(filepath, 'package.json');
51
- if (fs.existsSync(pkgFile)) {
52
- const pkg = JSON.parse(fs.readFileSync(pkgFile, 'utf-8'));
53
- const mainIndexFile = pkg.tshy?.exports?.['.'];
54
- if (mainIndexFile) {
55
- const mainIndexFilePath = path.join(filepath, mainIndexFile);
56
- if (fs.existsSync(mainIndexFilePath)) {
57
- debug('[importResolve] %o, options: %o => %o, use typescript', filepath, options, mainIndexFilePath);
58
- return mainIndexFilePath;
59
- }
60
- debug('[importResolve] typescript file %o not exists', mainIndexFilePath);
153
+ let moduleFilePath: string | undefined;
154
+ if (path.isAbsolute(filepath)) {
155
+ const stat = fs.statSync(filepath, { throwIfNoEntry: false });
156
+ if (stat?.isDirectory()) {
157
+ moduleFilePath = tryToResolveByDirname(filepath);
158
+ if (moduleFilePath) {
159
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
160
+ return moduleFilePath;
161
+ }
162
+ }
163
+ if (!stat) {
164
+ moduleFilePath = tryToResolveFromFile(filepath);
165
+ if (moduleFilePath) {
166
+ debug('[importResolve] %o => %o', filepath, moduleFilePath);
167
+ return moduleFilePath;
61
168
  }
62
169
  }
63
170
  }
64
- const cwd = process.cwd();
65
- const paths = options?.paths ?? [ cwd ];
66
- const moduleFilePath = getRequire().resolve(filepath, {
67
- paths,
68
- });
171
+
172
+ if (isESM) {
173
+ if (supportImportMetaResolve) {
174
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
175
+ // @ts-ignore
176
+ moduleFilePath = import.meta.resolve(filepath);
177
+ if (moduleFilePath.startsWith('file://')) {
178
+ // resolve will return file:// URL on Linux and MacOS expect on Windows
179
+ moduleFilePath = fileURLToPath(moduleFilePath);
180
+ }
181
+ } else {
182
+ moduleFilePath = getRequire().resolve(filepath);
183
+ }
184
+ } else {
185
+ const cwd = process.cwd();
186
+ const paths = options?.paths ?? [ cwd ];
187
+ moduleFilePath = require.resolve(filepath, {
188
+ paths,
189
+ });
190
+ }
69
191
  debug('[importResolve] %o, options: %o => %o', filepath, options, moduleFilePath);
70
192
  return moduleFilePath;
71
193
  }
@@ -73,22 +195,10 @@ export function importResolve(filepath: string, options?: ImportResolveOptions)
73
195
  export async function importModule(filepath: string, options?: ImportModuleOptions) {
74
196
  const moduleFilePath = importResolve(filepath, options);
75
197
  let obj: any;
76
- if (typeof require === 'function') {
77
- // commonjs
78
- obj = require(moduleFilePath);
79
- debug('[importModule] require %o => %o', filepath, obj);
80
- if (obj?.__esModule === true && 'default' in obj) {
81
- // 兼容 cjs 模拟 esm 的导出格式
82
- // {
83
- // __esModule: true,
84
- // default: { fn: [Function: fn], foo: 'bar', one: 1 }
85
- // }
86
- obj = obj.default;
87
- }
88
- } else {
198
+ if (isESM) {
89
199
  // esm
90
- debug('[importModule] await import start: %o', filepath);
91
200
  const fileUrl = pathToFileURL(moduleFilePath).toString();
201
+ debug('[importModule] await import start: %o', fileUrl);
92
202
  obj = await import(fileUrl);
93
203
  debug('[importModule] await import end: %o => %o', filepath, obj);
94
204
  // {
@@ -130,6 +240,18 @@ export async function importModule(filepath: string, options?: ImportModuleOptio
130
240
  obj = obj.default;
131
241
  }
132
242
  }
243
+ } else {
244
+ // commonjs
245
+ obj = require(moduleFilePath);
246
+ debug('[importModule] require %o => %o', filepath, obj);
247
+ if (obj?.__esModule === true && 'default' in obj) {
248
+ // 兼容 cjs 模拟 esm 的导出格式
249
+ // {
250
+ // __esModule: true,
251
+ // default: { fn: [Function: fn], foo: 'bar', one: 1 }
252
+ // }
253
+ obj = obj.default;
254
+ }
133
255
  }
134
256
  debug('[importModule] return %o => %o', filepath, obj);
135
257
  return obj;