@@ -24,6 +24,7 @@ const {
24
24
} = require ( 'internal/vm/module' ) ;
25
25
const assert = require ( 'internal/assert' ) ;
26
26
27
+
27
28
const callbackMap = new SafeWeakMap ( ) ;
28
29
function setCallbackForWrap ( wrap , data ) {
29
30
callbackMap . set ( wrap , data ) ;
@@ -107,26 +108,19 @@ function isLoaderWorker() {
107
108
return _isLoaderWorker ;
108
109
}
109
110
110
- async function initializeHooks ( ) {
111
- const customLoaderURLs = getOptionValue ( '--experimental-loader' ) ;
112
-
113
- let cwd ;
114
- try {
115
- // `process.cwd()` can fail if the parent directory is deleted while the process runs.
116
- cwd = process . cwd ( ) + '/' ;
117
- } catch {
118
- cwd = '/' ;
119
- }
120
-
121
-
122
- const { Hooks } = require ( 'internal/modules/esm/hooks' ) ;
123
- const hooks = new Hooks ( ) ;
124
-
111
+ const createHooksLoader = ( hooks ) => {
112
+ // TODO: HACK: `DefaultModuleLoader` depends on `getDefaultConditions` defined in
113
+ // this file so we have a circular reference going on. If that function was in
114
+ // it's on file we could just expose this class generically.
125
115
const { DefaultModuleLoader } = require ( 'internal/modules/esm/loader' ) ;
126
- class ModuleLoader extends DefaultModuleLoader {
127
- loaderType = 'internal' ;
116
+ class HooksModuleLoader extends DefaultModuleLoader {
117
+ #hooks;
118
+ constructor ( hooks ) {
119
+ super ( ) ;
120
+ this . #hooks = hooks ;
121
+ }
128
122
async #getModuleJob( specifier , parentURL , importAssertions ) {
129
- const resolveResult = await hooks . resolve ( specifier , parentURL , importAssertions ) ;
123
+ const resolveResult = await this . # hooks. resolve ( specifier , parentURL , importAssertions ) ;
130
124
return this . getJobFromResolveResult ( resolveResult , parentURL , importAssertions ) ;
131
125
}
132
126
getModuleJob ( specifier , parentURL , importAssertions ) {
@@ -143,9 +137,44 @@ async function initializeHooks() {
143
137
} ,
144
138
} ;
145
139
}
146
- load ( url , context ) { return hooks . load ( url , context ) ; }
140
+ resolve (
141
+ originalSpecifier ,
142
+ parentURL ,
143
+ importAssertions = { __proto__ : null } ,
144
+ ) {
145
+ console . log ( 'PRIVATE RESOLVE' , originalSpecifier ) ;
146
+ return this . #hooks. resolve (
147
+ originalSpecifier ,
148
+ parentURL ,
149
+ importAssertions
150
+ ) ;
151
+ }
152
+ load ( url , context = { } ) {
153
+ console . log ( 'PRIVATE LOAD' , url ) ;
154
+ return this . #hooks. load ( url , context ) ;
155
+ }
147
156
}
148
- const privateModuleLoader = new ModuleLoader ( ) ;
157
+ return new HooksModuleLoader ( hooks ) ;
158
+ }
159
+
160
+ async function initializeHooks ( ) {
161
+ const customLoaderURLs = getOptionValue ( '--experimental-loader' ) ;
162
+
163
+ let cwd ;
164
+ try {
165
+ // `process.cwd()` can fail if the parent directory is deleted while the process runs.
166
+ cwd = process . cwd ( ) + '/' ;
167
+ } catch {
168
+ cwd = '/' ;
169
+ }
170
+
171
+
172
+ const { Hooks } = require ( 'internal/modules/esm/hooks' ) ;
173
+ const hooks = new Hooks ( ) ;
174
+
175
+
176
+ const privateModuleLoader = createHooksLoader ( hooks ) ;
177
+ privateModuleLoader . loaderType = 'internal' ;
149
178
const parentURL = pathToFileURL ( cwd ) . href ;
150
179
151
180
// TODO(jlenon7): reuse the `Hooks.register()` method for registering loaders.
@@ -175,4 +204,5 @@ module.exports = {
175
204
getConditionsSet,
176
205
loaderWorkerId : 'internal/modules/esm/worker' ,
177
206
isLoaderWorker,
207
+ createHooksLoader,
178
208
} ;
0 commit comments