Skip to content

Commit 57b24a3

Browse files
guybedfordRafaelGSS
authored andcommitted
esm: import.meta.resolve exact module not found errors should return
PR-URL: #49038 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com> Reviewed-By: Jacob Smith <jacob@frende.me>
1 parent 45c8600 commit 57b24a3

File tree

5 files changed

+23
-13
lines changed

5 files changed

+23
-13
lines changed

lib/internal/errors.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -1453,8 +1453,12 @@ E('ERR_MISSING_ARGS',
14531453
return `${msg} must be specified`;
14541454
}, TypeError);
14551455
E('ERR_MISSING_OPTION', '%s is required', TypeError);
1456-
E('ERR_MODULE_NOT_FOUND', (path, base, type = 'package') => {
1457-
return `Cannot find ${type} '${path}' imported from ${base}`;
1456+
E('ERR_MODULE_NOT_FOUND', function(path, base, exactUrl) {
1457+
if (exactUrl) {
1458+
lazyInternalUtil().setOwnProperty(this, 'url', exactUrl);
1459+
}
1460+
return `Cannot find ${
1461+
exactUrl ? 'module' : 'package'} '${path}' imported from ${base}`;
14581462
}, Error);
14591463
E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error);
14601464
E('ERR_NAPI_CONS_FUNCTION', 'Constructor must be a function', TypeError);

lib/internal/modules/esm/fetch_module.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ function fetchWithRedirects(parsed) {
144144
return entry;
145145
}
146146
if (res.statusCode === 404) {
147-
const err = new ERR_MODULE_NOT_FOUND(parsed.href, null);
147+
const err = new ERR_MODULE_NOT_FOUND(parsed.href, null, parsed);
148148
err.message = `Cannot find module '${parsed.href}', HTTP 404`;
149149
throw err;
150150
}

lib/internal/modules/esm/initialize_import_meta.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,20 @@ const experimentalImportMetaResolve = getOptionValue('--experimental-import-meta
1212
function createImportMetaResolve(defaultParentURL, loader) {
1313
return function resolve(specifier, parentURL = defaultParentURL) {
1414
let url;
15-
1615
try {
1716
({ url } = loader.resolveSync(specifier, parentURL));
17+
return url;
1818
} catch (error) {
19-
if (error?.code === 'ERR_UNSUPPORTED_DIR_IMPORT') {
20-
({ url } = error);
21-
} else {
22-
throw error;
19+
switch (error?.code) {
20+
case 'ERR_UNSUPPORTED_DIR_IMPORT':
21+
case 'ERR_MODULE_NOT_FOUND':
22+
({ url } = error);
23+
if (url) {
24+
return url;
25+
}
2326
}
27+
throw error;
2428
}
25-
26-
return url;
2729
};
2830
}
2931

lib/internal/modules/esm/resolve.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ function finalizeResolution(resolved, base, preserveSymlinks) {
222222
process.send({ 'watch:require': [path || resolved.pathname] });
223223
}
224224
throw new ERR_MODULE_NOT_FOUND(
225-
path || resolved.pathname, base && fileURLToPath(base), 'module');
225+
path || resolved.pathname, base && fileURLToPath(base), resolved);
226226
}
227227

228228
if (!preserveSymlinks) {
@@ -777,7 +777,7 @@ function packageResolve(specifier, base, conditions) {
777777

778778
// eslint can't handle the above code.
779779
// eslint-disable-next-line no-unreachable
780-
throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base));
780+
throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null);
781781
}
782782

783783
/**

test/es-module/test-esm-import-meta-resolve.mjs

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ const fixtures = dirname.slice(0, dirname.lastIndexOf('/', dirname.length - 2) +
99

1010
assert.strictEqual(import.meta.resolve('./test-esm-import-meta.mjs'),
1111
dirname + 'test-esm-import-meta.mjs');
12+
const notFound = import.meta.resolve('./notfound.mjs');
13+
assert.strictEqual(new URL(notFound).href, new URL('./notfound.mjs', import.meta.url).href);
14+
const noExtension = import.meta.resolve('./asset');
15+
assert.strictEqual(new URL(noExtension).href, new URL('./asset', import.meta.url).href);
1216
try {
13-
import.meta.resolve('./notfound.mjs');
17+
import.meta.resolve('does-not-exist');
1418
assert.fail();
1519
} catch (e) {
1620
assert.strictEqual(e.code, 'ERR_MODULE_NOT_FOUND');

0 commit comments

Comments
 (0)