Skip to content

Commit

Permalink
esm: improve error message of ERR_UNSUPPORTED_ESM_URL_SCHEME
Browse files Browse the repository at this point in the history
Refs: nodejs#34765

PR-URL: nodejs#34795
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Jan Krems <[email protected]>
Reviewed-By: Guy Bedford <[email protected]>
Reviewed-By: Bradley Farias <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Rich Trott <[email protected]>
  • Loading branch information
lundibundi authored and guybedford committed Sep 28, 2020
1 parent 56393c1 commit 8030eb5
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 12 deletions.
13 changes: 11 additions & 2 deletions lib/internal/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ const {
WeakMap,
} = primordials;

const isWindows = process.platform === 'win32';

const messages = new Map();
const codes = {};

Expand Down Expand Up @@ -1399,8 +1401,15 @@ E('ERR_UNKNOWN_MODULE_FORMAT', 'Unknown module format: %s', RangeError);
E('ERR_UNKNOWN_SIGNAL', 'Unknown signal: %s', TypeError);
E('ERR_UNSUPPORTED_DIR_IMPORT', "Directory import '%s' is not supported " +
'resolving ES modules imported from %s', Error);
E('ERR_UNSUPPORTED_ESM_URL_SCHEME', 'Only file and data URLs are supported ' +
'by the default ESM loader', Error);
E('ERR_UNSUPPORTED_ESM_URL_SCHEME', (url) => {
let msg = 'Only file and data URLs are supported by the default ESM loader';
if (isWindows && url.protocol.length === 2) {
msg += '. Absolute Windows paths without prefix are not valid URLs, ' +
"consider using 'file://' prefix";
}
msg += `. Received protocol '${url.protocol}'`;
return msg;
}, Error);

// This should probably be a `TypeError`.
E('ERR_VALID_PERFORMANCE_ENTRY_TYPE',
Expand Down
2 changes: 1 addition & 1 deletion lib/internal/modules/esm/resolve.js
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@ function defaultResolve(specifier, context = {}, defaultResolveUnused) {
if (parsed && parsed.protocol === 'nodejs:')
return { url: specifier };
if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:')
throw new ERR_UNSUPPORTED_ESM_URL_SCHEME();
throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed);
if (NativeModule.canBeRequiredByUsers(specifier)) {
return {
url: 'nodejs:' + specifier
Expand Down
23 changes: 14 additions & 9 deletions test/es-module/test-esm-dynamic-import.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,11 @@ const absolutePath = require.resolve('../fixtures/es-modules/test-esm-ok.mjs');
const targetURL = new URL('file:///');
targetURL.pathname = absolutePath;

function expectErrorProperty(result, propertyKey, value) {
Promise.resolve(result)
.catch(common.mustCall((error) => {
assert.strictEqual(error[propertyKey], value);
}));
}

function expectModuleError(result, err) {
expectErrorProperty(result, 'code', err);
function expectModuleError(result, code, message) {
Promise.resolve(result).catch(common.mustCall((error) => {
assert.strictEqual(error.code, code);
if (message) assert.strictEqual(error.message, message);
}));
}

function expectOkNamespace(result) {
Expand Down Expand Up @@ -63,4 +59,13 @@ function expectFsNamespace(result) {
'ERR_MODULE_NOT_FOUND');
expectModuleError(import('http://example.com/foo.js'),
'ERR_UNSUPPORTED_ESM_URL_SCHEME');
if (common.isWindows) {
const msg =
'Only file and data URLs are supported by the default ESM loader. ' +
'Absolute Windows paths without prefix are not valid URLs, ' +
"consider using 'file://' prefix. Received protocol 'c:'";
expectModuleError(import('C:\\example\\foo.mjs'),
'ERR_UNSUPPORTED_ESM_URL_SCHEME',
msg);
}
})();

0 comments on commit 8030eb5

Please sign in to comment.