2
2
3
3
const {
4
4
ArrayIsArray,
5
- ObjectCreate ,
5
+ ArrayPrototypePushApply ,
6
6
} = primordials ;
7
7
8
8
const { ESMLoader } = require ( 'internal/modules/esm/loader' ) ;
9
9
const {
10
10
hasUncaughtExceptionCaptureCallback,
11
11
} = require ( 'internal/process/execution' ) ;
12
12
const { pathToFileURL } = require ( 'internal/url' ) ;
13
+ const { kEmptyObject } = require ( 'internal/util' ) ;
13
14
14
15
const esmLoader = new ESMLoader ( ) ;
15
16
exports . esmLoader = esmLoader ;
@@ -29,41 +30,61 @@ async function initializeLoader() {
29
30
const { getOptionValue } = require ( 'internal/options' ) ;
30
31
const customLoaders = getOptionValue ( '--experimental-loader' ) ;
31
32
const preloadModules = getOptionValue ( '--import' ) ;
32
- const loaders = await loadModulesInIsolation ( customLoaders ) ;
33
+
34
+ let cwd ;
35
+ try {
36
+ cwd = process . cwd ( ) + '/' ;
37
+ } catch {
38
+ cwd = '/' ;
39
+ }
40
+
41
+ const internalEsmLoader = new ESMLoader ( ) ;
42
+ const allLoaders = [ ] ;
43
+
44
+ const parentURL = pathToFileURL ( cwd ) . href ;
45
+
46
+ for ( let i = 0 ; i < customLoaders . length ; i ++ ) {
47
+ const customLoader = customLoaders [ i ] ;
48
+
49
+ // Importation must be handled by internal loader to avoid polluting user-land
50
+ const keyedExportsSublist = await internalEsmLoader . import (
51
+ [ customLoader ] ,
52
+ parentURL ,
53
+ kEmptyObject ,
54
+ ) ;
55
+
56
+ internalEsmLoader . addCustomLoaders ( keyedExportsSublist ) ;
57
+ ArrayPrototypePushApply ( allLoaders , keyedExportsSublist ) ;
58
+ }
33
59
34
60
// Hooks must then be added to external/public loader
35
61
// (so they're triggered in userland)
36
- esmLoader . addCustomLoaders ( loaders ) ;
62
+ esmLoader . addCustomLoaders ( allLoaders ) ;
63
+ esmLoader . preload ( ) ;
37
64
38
65
// Preload after loaders are added so they can be used
39
66
if ( preloadModules ?. length ) {
40
- await loadModulesInIsolation ( preloadModules , loaders ) ;
67
+ await loadModulesInIsolation ( parentURL , preloadModules , allLoaders ) ;
41
68
}
42
69
43
70
isESMInitialized = true ;
44
71
}
45
72
46
- function loadModulesInIsolation ( specifiers , loaders = [ ] ) {
73
+ function loadModulesInIsolation ( parentURL , specifiers , loaders = [ ] ) {
47
74
if ( ! ArrayIsArray ( specifiers ) || specifiers . length === 0 ) { return ; }
48
75
49
- let cwd ;
50
- try {
51
- cwd = process . cwd ( ) + '/' ;
52
- } catch {
53
- cwd = 'file:///' ;
54
- }
55
-
56
76
// A separate loader instance is necessary to avoid cross-contamination
57
77
// between internal Node.js and userland. For example, a module with internal
58
78
// state (such as a counter) should be independent.
59
79
const internalEsmLoader = new ESMLoader ( ) ;
60
80
internalEsmLoader . addCustomLoaders ( loaders ) ;
81
+ internalEsmLoader . preload ( ) ;
61
82
62
83
// Importation must be handled by internal loader to avoid poluting userland
63
84
return internalEsmLoader . import (
64
85
specifiers ,
65
- pathToFileURL ( cwd ) . href ,
66
- ObjectCreate ( null ) ,
86
+ parentURL ,
87
+ kEmptyObject ,
67
88
) ;
68
89
}
69
90
0 commit comments