Skip to content

Commit 3e23195

Browse files
committed
lib,test: print CJS suggestions when ES not found
1 parent 49dc514 commit 3e23195

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

lib/internal/modules/esm/default_resolve.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ const { NativeModule } = require('internal/bootstrap/loaders');
99
const { extname } = require('path');
1010
const { realpathSync } = require('fs');
1111
const { getOptionValue } = require('internal/options');
12+
const {
13+
Module: CJSModule
14+
} = require('internal/modules/cjs/loader');
15+
1216

1317
const preserveSymlinks = getOptionValue('--preserve-symlinks');
1418
const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
@@ -93,7 +97,32 @@ function resolve(specifier, parentURL) {
9397
throw new ERR_INPUT_TYPE_NOT_ALLOWED();
9498
}
9599

96-
let url = moduleWrapResolve(specifier, parentURL);
100+
let url;
101+
try {
102+
url = moduleWrapResolve(specifier, parentURL);
103+
} catch (error) {
104+
try {
105+
// By default ES Modules does not support extensionless files.
106+
// The idea is make suggestions when file ext is not provided
107+
// Example: import pkg from './meow'
108+
// Ref: https://github.com/nodejs/node/issues/30603
109+
110+
// Create a fake CJS Module using parentURL.
111+
const currentModule = new CJSModule(parentURL);
112+
// Resolve our especifier e.g: 'file'
113+
// using as module parent our current module.
114+
// So with our fake parent, paths to search in CJS will be provided.
115+
const cjsResolved = CJSModule._resolveFilename(specifier,
116+
currentModule,
117+
false);
118+
if (cjsResolved) {
119+
error.message += '\nCJS would resolved: ' + cjsResolved;
120+
}
121+
} catch (cjsError) { // eslint-disable-line no-unused-vars
122+
// ignore
123+
}
124+
throw error;
125+
}
97126

98127
if (isMain ? !preserveSymlinksMain : !preserveSymlinks) {
99128
const real = realpathSync(fileURLToPath(url), {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import '../common/index.mjs';
2+
3+
import('../fixtures/es-modules/cjs')
4+
.catch(err => console.error(err))

test/message/esm_loader_not_found.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
(node:*) ExperimentalWarning: The ESM module loader is experimental.
22
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
33
internal/modules/esm/default_resolve.js:*
4-
let url = moduleWrapResolve(specifier, parentURL);
5-
^
4+
url = moduleWrapResolve(specifier, parentURL);
5+
^
66

77
Error: Cannot find package 'i-dont-exist' imported from *
88
at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:*:*)

0 commit comments

Comments
 (0)