@@ -55,6 +55,22 @@ export interface ResolverOptions {
55
55
key ?: string ;
56
56
}
57
57
58
+ interface ResolveHookParams {
59
+ scriptId : string ;
60
+ caller ?: string ;
61
+ referenceUrl ?: string ;
62
+ resolvers : Array < [ string , string | number , ScriptLocatorResolver ] > ;
63
+ result ?: ScriptLocator ;
64
+ }
65
+
66
+ interface LoadHookParams {
67
+ scriptId : string ;
68
+ caller ?: string ;
69
+ locator : NormalizedScriptLocator ;
70
+ loadScript : ( ) => Promise < void > ;
71
+ handled ?: boolean ;
72
+ }
73
+
58
74
/**
59
75
* A manager to ease resolution, downloading and executing additional code from:
60
76
* - arbitrary JavaScript scripts
@@ -118,9 +134,7 @@ export class ScriptManager extends EventEmitter {
118
134
scriptId : string ;
119
135
caller ?: string ;
120
136
} > ( [ 'params' ] ) ,
121
- resolve : new AsyncSeriesHook < { scriptId : string ; caller ?: string } , void > ( [
122
- 'params' ,
123
- ] ) ,
137
+ resolve : new AsyncSeriesWaterfallHook < ResolveHookParams > ( [ 'params' ] ) ,
124
138
afterResolve : new AsyncSeriesHook <
125
139
{ scriptId : string ; caller ?: string } ,
126
140
void
@@ -137,9 +151,7 @@ export class ScriptManager extends EventEmitter {
137
151
{ scriptId : string ; caller ?: string } ,
138
152
void
139
153
> ( [ 'params' ] ) ,
140
- load : new AsyncSeriesHook < { scriptId : string ; caller ?: string } , void > ( [
141
- 'params' ,
142
- ] ) ,
154
+ load : new AsyncSeriesWaterfallHook < LoadHookParams > ( [ 'params' ] ) ,
143
155
afterLoad : new AsyncSeriesHook < { scriptId : string ; caller ?: string } , void > (
144
156
[ 'params' ]
145
157
) ,
@@ -326,29 +338,32 @@ export class ScriptManager extends EventEmitter {
326
338
}
327
339
328
340
this . emit ( 'resolving' , { scriptId : finalScriptId , caller : finalCaller } ) ;
329
-
330
- // Check if there are any taps in the resolve hook
331
- const _hasResolveHooks = this . hooks . resolve . taps . length > 0 ;
341
+ const hasResolveHooks =
342
+ this . hooks . resolve . taps && this . hooks . resolve . taps . length > 0 ;
332
343
333
344
let locator : ScriptLocator | undefined ;
334
345
335
- // if (hasResolveHooks) {
336
- await this . hooks . resolve . promise ( {
337
- scriptId : finalScriptId ,
338
- caller : finalCaller ,
339
- } ) ;
340
- // } else {
341
- for ( const [ , , resolve ] of this . resolvers ) {
342
- const resolvedLocator = await resolve (
343
- finalScriptId ,
344
- finalCaller ,
345
- referenceUrl
346
- ) ;
347
- if ( resolvedLocator ) {
348
- locator = resolvedLocator ;
349
- break ;
346
+ if ( hasResolveHooks ) {
347
+ const params = await this . hooks . resolve . promise ( {
348
+ scriptId : finalScriptId ,
349
+ caller : finalCaller ,
350
+ referenceUrl,
351
+ resolvers : this . resolvers ,
352
+ } ) ;
353
+
354
+ locator = params . result ;
355
+ } else {
356
+ for ( const [ , , resolve ] of this . resolvers ) {
357
+ const resolvedLocator = await resolve (
358
+ finalScriptId ,
359
+ finalCaller ,
360
+ referenceUrl
361
+ ) ;
362
+ if ( resolvedLocator ) {
363
+ locator = resolvedLocator ;
364
+ break ;
365
+ }
350
366
}
351
- // }
352
367
}
353
368
354
369
if ( ! locator ) {
@@ -476,12 +491,27 @@ export class ScriptManager extends EventEmitter {
476
491
} ) ;
477
492
this . emit ( 'loading' , script . toObject ( ) ) ;
478
493
479
- const _hasLoadHooks = this . hooks . load . taps . length > 0 ;
480
- // if (hasLoadHooks) {
481
- await this . hooks . load . promise ( { scriptId : scriptId , caller : caller } ) ;
482
- // } else {
483
- await this . loadScriptWithRetry ( scriptId , script . locator ) ;
484
- // }
494
+ const hasLoadHooks =
495
+ this . hooks . load . taps && this . hooks . load . taps . length > 0 ;
496
+
497
+ if ( hasLoadHooks ) {
498
+ await this . hooks . load . promise ( {
499
+ scriptId,
500
+ caller,
501
+ locator : script . locator ,
502
+ loadScript : async ( ) => {
503
+ await this . loadScriptWithRetry ( scriptId , script . locator ) ;
504
+ } ,
505
+ } ) ;
506
+
507
+ // If the hook didn't handle loading, use default loading
508
+ // FIXME: Not sure if that's needed.
509
+ // if (!params.handled) {
510
+ // await this.loadScriptWithRetry(scriptId, script.locator);
511
+ // }
512
+ } else {
513
+ await this . loadScriptWithRetry ( scriptId , script . locator ) ;
514
+ }
485
515
486
516
await this . hooks . afterLoad . promise ( {
487
517
scriptId : scriptId ,
0 commit comments