Skip to content

Commit 80f057d

Browse files
committed
doc: add warning for esm specifier resolution
1 parent 60d5eed commit 80f057d

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

doc/api/esm.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,10 @@ _internal_, _conditions_)
14561456

14571457
> Stability: 1 - Experimental
14581458

1459+
> **Note: Do not rely on this flag. We plan to remove it once the
1460+
> [Loaders API][] has advanced to the point that equivalent functionality can
1461+
> be achieved via custom loaders.**
1462+
14591463
The current specifier resolution does not support all default behavior of
14601464
the CommonJS loader. One of the behavior differences is automatic resolution
14611465
of file extensions and the ability to import directories that have an index
@@ -1488,6 +1492,7 @@ success!
14881492
[Import Assertions]: #import-assertions
14891493
[Import Assertions proposal]: https://github.com/tc39/proposal-import-assertions
14901494
[JSON modules]: #json-modules
1495+
[Loaders API]: #loaders
14911496
[Node.js Module Resolution Algorithm]: #resolver-algorithm-specification
14921497
[Terminology]: #terminology
14931498
[URL]: https://url.spec.whatwg.org/

lib/internal/modules/esm/formats.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,7 @@ function mimeToFormat(mime) {
4343
return null;
4444
}
4545

46-
let experimentalSpecifierResolutionWarned = false;
4746
function getLegacyExtensionFormat(ext) {
48-
if (
49-
experimentalSpecifierResolution === 'node' &&
50-
!experimentalSpecifierResolutionWarned
51-
) {
52-
process.emitWarning(
53-
'The Node.js specifier resolution in ESM is experimental.',
54-
'ExperimentalWarning');
55-
experimentalSpecifierResolutionWarned = true;
56-
}
5747
return legacyExtensionFormatMap[ext];
5848
}
5949

lib/internal/modules/esm/resolve.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ function resolveDirectoryEntry(search) {
362362
}
363363

364364
const encodedSepRegEx = /%2F|%5C/i;
365+
let experimentalSpecifierResolutionWarned = false;
365366
/**
366367
* @param {URL} resolved
367368
* @param {string | URL | undefined} base
@@ -376,6 +377,13 @@ function finalizeResolution(resolved, base, preserveSymlinks) {
376377

377378
let path = fileURLToPath(resolved);
378379
if (getOptionValue('--experimental-specifier-resolution') === 'node') {
380+
if (!experimentalSpecifierResolutionWarned) {
381+
process.emitWarning(
382+
'The Node.js specifier resolution flag is experimental. It could change or be removed at any time.',
383+
'ExperimentalWarning');
384+
experimentalSpecifierResolutionWarned = true;
385+
}
386+
379387
let file = resolveExtensionsWithTryExactName(resolved);
380388

381389
// Directory
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { mustCall } from '../common/index.mjs';
2+
import { fileURL } from '../common/fixtures.mjs';
3+
import { match, strictEqual } from 'assert';
4+
import { spawn } from 'child_process';
5+
import { execPath } from 'process';
6+
7+
// Verify experimental warning is printed
8+
const child = spawn(execPath, [
9+
'--experimental-specifier-resolution=node',
10+
'--input-type=module',
11+
'--eval',
12+
`import ${JSON.stringify(fileURL('es-module-specifiers', 'package-type-module'))}`,
13+
]);
14+
15+
let stderr = '';
16+
child.stderr.setEncoding('utf8');
17+
child.stderr.on('data', (data) => {
18+
stderr += data;
19+
});
20+
child.on('close', mustCall((code, signal) => {
21+
strictEqual(code, 0);
22+
strictEqual(signal, null);
23+
match(stderr, /ExperimentalWarning: The Node\.js specifier resolution flag is experimental/);
24+
}));

0 commit comments

Comments
 (0)