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 {
@@ -486,7 +493,7 @@ class CustomizedModuleLoader {
486
493
}
487
494
}
488
495
489
- let emittedExperimentalWarning = false ;
496
+ let emittedLoaderFlagWarning = false ;
490
497
/**
491
498
* A loader instance is used as the main entry point for loading ES modules. Currently, this is a singleton; there is
492
499
* only one used for loading the main module and everything in its dependency graph, though separate instances of this
@@ -502,9 +509,24 @@ function createModuleLoader(useCustomLoadersIfPresent = true) {
502
509
! require ( 'internal/modules/esm/utils' ) . isLoaderWorker ( ) ) {
503
510
const userLoaderPaths = getOptionValue ( '--experimental-loader' ) ;
504
511
if ( userLoaderPaths . length > 0 ) {
505
- if ( ! emittedExperimentalWarning ) {
506
- emitExperimentalWarning ( 'Custom ESM Loaders' ) ;
507
- emittedExperimentalWarning = true ;
512
+ if ( ! emittedLoaderFlagWarning ) {
513
+ const readableURIEncode = ( string ) => ArrayPrototypeReduce (
514
+ [
515
+ [ / ' / g, '%27' ] , // We need to URL-encode the single quote as it's the delimiter for the --import flag.
516
+ [ / % 2 2 / g, '"' ] , // We can decode the double quotes to improve readability.
517
+ [ / % 2 F / ig, '/' ] , // We can decode the slashes to improve readability.
518
+ ] ,
519
+ ( str , { 0 : regex , 1 : replacement } ) => RegExpPrototypeSymbolReplace ( hardenRegExp ( regex ) , str , replacement ) ,
520
+ encodeURIComponent ( string ) ) ;
521
+ process . emitWarning (
522
+ '`--experimental-loader` may be removed in the future; instead use `register()`:\n' +
523
+ `--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; ${ ArrayPrototypeJoin (
524
+ ArrayPrototypeMap ( userLoaderPaths , ( loader ) => `register(${ readableURIEncode ( JSONStringify ( loader ) ) } , pathToFileURL("./"))` ) ,
525
+ '; ' ,
526
+ ) } ;'`,
527
+ 'ExperimentalWarning' ,
528
+ ) ;
529
+ emittedLoaderFlagWarning = true ;
508
530
}
509
531
customizations = new CustomizedModuleLoader ( ) ;
510
532
}
0 commit comments