GeezerVison is showing github.com — esm: update loaders warning · nodejs/node@a6140f1
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/modules/esm/loader.js +26-4Lines changed: 26 additions & 4 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 4 | 4 | require('internal/modules/cjs/loader'); | 5 | 5 |
| 6 | 6 | const { | | 7 | + ArrayPrototypeJoin, | | 8 | + ArrayPrototypeMap, | | 9 | + ArrayPrototypeReduce, | 7 | 10 | FunctionPrototypeCall, | | 11 | + JSONStringify, | 8 | 12 | ObjectSetPrototypeOf, | | 13 | + RegExpPrototypeSymbolReplace, | 9 | 14 | SafeWeakMap, | | 15 | + encodeURIComponent, | | 16 | + hardenRegExp, | 10 | 17 | } = primordials; | 11 | 18 |
| 12 | 19 | const { | @@ -498,7 +505,7 @@ class CustomizedModuleLoader { | 498 | 505 | } | 499 | 506 | } | 500 | 507 |
| 501 | | -let emittedExperimentalWarning = false; | | 508 | +let emittedLoaderFlagWarning = false; | 502 | 509 | /** | 503 | 510 | * A loader instance is used as the main entry point for loading ES modules. Currently, this is a singleton; there is | 504 | 511 | * only one used for loading the main module and everything in its dependency graph, though separate instances of this | @@ -514,9 +521,24 @@ function createModuleLoader(useCustomLoadersIfPresent = true) { | 514 | 521 | !require('internal/modules/esm/utils').isLoaderWorker()) { | 515 | 522 | const userLoaderPaths = getOptionValue('--experimental-loader'); | 516 | 523 | if (userLoaderPaths.length > 0) { | 517 | | - if (!emittedExperimentalWarning) { | 518 | | - emitExperimentalWarning('Custom ESM Loaders'); | 519 | | - emittedExperimentalWarning = true; | | 524 | + if (!emittedLoaderFlagWarning) { | | 525 | + const readableURIEncode = (string) => ArrayPrototypeReduce( | | 526 | + [ | | 527 | + [/'/g, '%27'], // We need to URL-encode the single quote as it's the delimiter for the --import flag. | | 528 | + [/%22/g, '"'], // We can decode the double quotes to improve readability. | | 529 | + [/%2F/ig, '/'], // We can decode the slashes to improve readability. | | 530 | + ], | | 531 | + (str, { 0: regex, 1: replacement }) => RegExpPrototypeSymbolReplace(hardenRegExp(regex), str, replacement), | | 532 | + encodeURIComponent(string)); | | 533 | + process.emitWarning( | | 534 | + '`--experimental-loader` may be removed in the future; instead use `register()`:\n' + | | 535 | + `--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; ${ArrayPrototypeJoin( | | 536 | + ArrayPrototypeMap(userLoaderPaths, (loader) => `register(${readableURIEncode(JSONStringify(loader))}, pathToFileURL("./"))`), | | 537 | + '; ', | | 538 | + )};'`, | | 539 | + 'ExperimentalWarning', | | 540 | + ); | | 541 | + emittedLoaderFlagWarning = true; | 520 | 542 | } | 521 | 543 | customizations = new CustomizedModuleLoader(); | 522 | 544 | } | |
Collapse file Copy file name to clipboardExpand all lines: test/es-module/test-esm-experimental-warnings.mjs +7-3Lines changed: 7 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -24,14 +24,18 @@ describe('ESM: warn for obsolete hooks provided', { concurrency: true }, () => { | 24 | 24 |
| 25 | 25 | describe('experimental warnings for enabled experimental feature', () => { | 26 | 26 | for ( | 27 | | - const [experiment, arg] of [ | 28 | | - [/Custom ESM Loaders/, `--experimental-loader=${fileURL('es-module-loaders', 'hooks-custom.mjs')}`], | | 27 | + const [experiment, ...args] of [ | | 28 | + [ | | 29 | + /`--experimental-loader` may be removed in the future/, | | 30 | + '--experimental-loader', | | 31 | + fileURL('es-module-loaders', 'hooks-custom.mjs'), | | 32 | + ], | 29 | 33 | [/Network Imports/, '--experimental-network-imports'], | 30 | 34 | ] | 31 | 35 | ) { | 32 | 36 | it(`should print for ${experiment.toString().replaceAll('/', '')}`, async () => { | 33 | 37 | const { code, signal, stderr } = await spawnPromisified(execPath, [ | 34 | | - arg, | | 38 | + ...args, | 35 | 39 | '--input-type=module', | 36 | 40 | '--eval', | 37 | 41 | `import ${JSON.stringify(fileURL('es-module-loaders', 'module-named-exports.mjs'))}`, | |
|