@@ -51,10 +51,8 @@ const {
51
51
defaultResolve,
52
52
throwIfInvalidParentURL,
53
53
} = require ( 'internal/modules/esm/resolve' ) ;
54
- const {
55
- getDefaultConditions,
56
- loaderWorkerId,
57
- } = require ( 'internal/modules/esm/utils' ) ;
54
+ const { loaderWorkerId} = require ( 'internal/modules/esm/utils' ) ;
55
+ const { getDefaultConditions} = require ( 'internal/modules/esm/conditions' ) ;
58
56
const { deserializeError } = require ( 'internal/error_serdes' ) ;
59
57
const {
60
58
SHARED_MEMORY_BYTE_LENGTH ,
@@ -81,8 +79,8 @@ let debug = require('internal/util/debuglog').debuglog('esm', (fn) => {
81
79
// [2] `validate...()`s throw the wrong error
82
80
83
81
84
- class Hooks {
85
- #chains = {
82
+ function getDefaultChains ( ) {
83
+ return {
86
84
/**
87
85
* Prior to ESM loading. These are called once before any modules are started.
88
86
* @private
@@ -115,27 +113,42 @@ class Hooks {
115
113
} ,
116
114
] ,
117
115
} ;
116
+ }
117
+
118
+ class Hooks {
119
+ #chains;
118
120
119
121
// Cache URLs we've already validated to avoid repeated validation
120
- #validatedUrls = new SafeSet ( ) ;
122
+ #validatedUrls;
123
+
124
+ constructor ( chains = getDefaultChains ( ) , validatedUrls = new SafeSet ( ) ) {
125
+ this . #chains = chains ;
126
+ this . #validatedUrls = validatedUrls ;
127
+ }
121
128
122
129
/**
123
130
* Import and register custom/user-defined module loader hook(s).
124
131
* @param {string } urlOrSpecifier
125
132
* @param {string } parentURL
126
133
*/
127
134
async register ( urlOrSpecifier , parentURL ) {
128
- const moduleLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
129
-
130
- const keyedExports = await moduleLoader . import (
135
+ const esmLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
136
+ const keyedExports = await esmLoader . import (
131
137
urlOrSpecifier ,
132
138
parentURL ,
133
139
kEmptyObject ,
134
140
) ;
135
-
136
141
this . addCustomLoader ( urlOrSpecifier , keyedExports ) ;
137
142
}
138
143
144
+ getChains ( ) {
145
+ return this . #chains;
146
+ }
147
+
148
+ getValidatedUrls ( ) {
149
+ return this . #validatedUrls;
150
+ }
151
+
139
152
/**
140
153
* Collect custom/user-defined module loader hook(s).
141
154
* After all hooks have been collected, the global preload hook(s) must be initialized.
@@ -221,15 +234,16 @@ class Hooks {
221
234
parentURL ,
222
235
importAssertions = { __proto__ : null } ,
223
236
) {
237
+ const chain = this . #chains. resolve ;
224
238
throwIfInvalidParentURL ( parentURL ) ;
225
239
226
- const chain = this . #chains. resolve ;
227
240
const context = {
228
241
conditions : getDefaultConditions ( ) ,
229
242
importAssertions,
230
243
parentURL,
231
244
} ;
232
245
const meta = {
246
+ hooks : this ,
233
247
chainFinished : null ,
234
248
context,
235
249
hookErrIdentifier : '' ,
@@ -346,6 +360,7 @@ class Hooks {
346
360
async load ( url , context = { } ) {
347
361
const chain = this . #chains. load ;
348
362
const meta = {
363
+ hooks : this ,
349
364
chainFinished : null ,
350
365
context,
351
366
hookErrIdentifier : '' ,
@@ -749,7 +764,25 @@ function nextHookFactory(chain, meta, { validateArgs, validateOutput }) {
749
764
ObjectAssign ( meta . context , context ) ;
750
765
}
751
766
752
- const output = await hook ( arg0 , meta . context , nextNextHook ) ;
767
+ const esmLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
768
+
769
+ const chains = meta . hooks . getChains ( ) ;
770
+ const load = chain === chains . load ? chains . load . slice ( 0 , generatedHookIndex ) : chains . load ;
771
+ const resolve = chain === chains . resolve ? chains . resolve . slice ( 0 , generatedHookIndex ) : chains . resolve ;
772
+ let output ;
773
+ if ( load . length > 0 && resolve . length > 0 ) {
774
+ const nextChains = {
775
+ load,
776
+ resolve,
777
+ globalPreload : chains . globalPreload ,
778
+ }
779
+ const delegate = new Hooks ( nextChains , meta . hooks . getValidatedUrls ( ) ) ;
780
+ output = await esmLoader . withDelegate ( delegate , async ( ) => {
781
+ return await hook ( arg0 , meta . context , nextNextHook ) ;
782
+ } ) ;
783
+ } else {
784
+ output = await hook ( arg0 , meta . context , nextNextHook ) ;
785
+ }
753
786
754
787
validateOutput ( outputErrIdentifier , output ) ;
755
788
0 commit comments