Skip to content

Commit cc7dce9

Browse files
committed
wip
1 parent ef6a3c4 commit cc7dce9

File tree

3 files changed

+125
-15
lines changed

3 files changed

+125
-15
lines changed

apps/tester-app/index.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,18 @@ ScriptManager.shared.hooks.beforeResolve.tapAsync(
6969

7070
ScriptManager.shared.hooks.resolve.tapAsync(
7171
'test-during',
72-
({ scriptId, caller, error }, callback) => {
73-
if (!error) {
74-
console.log('During resolving:', scriptId, caller);
72+
async ({ scriptId, caller, referenceUrl, resolvers, error }, callback) => {
73+
console.log('Resolving:', scriptId, caller);
74+
for (const [, , resolve] of resolvers) {
75+
const resolvedLocator = await resolve(scriptId, caller, referenceUrl);
76+
if (resolvedLocator) {
77+
console.log('Resolved locator:', resolvedLocator);
78+
callback({ result: resolvedLocator });
79+
return;
80+
}
7581
}
76-
console.log('ScriptManager.shared.hooks.resolve', scriptId, caller, error);
77-
callback();
82+
83+
callback(new Error('No locator found'));
7884
}
7985
);
8086

packages/repack/src/modules/ScriptManager/ScriptManager.ts

+24-10
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ export interface ResolverOptions {
5555
key?: string;
5656
}
5757

58+
interface ResolveHookParams {
59+
scriptId: string;
60+
caller?: string;
61+
referenceUrl?: string;
62+
resolvers: Array<[string, string | number, ScriptLocatorResolver]>;
63+
result?: ScriptLocator;
64+
}
65+
5866
/**
5967
* A manager to ease resolution, downloading and executing additional code from:
6068
* - arbitrary JavaScript scripts
@@ -118,9 +126,7 @@ export class ScriptManager extends EventEmitter {
118126
scriptId: string;
119127
caller?: string;
120128
}>(['params']),
121-
resolve: new AsyncSeriesHook<{ scriptId: string; caller?: string }, void>([
122-
'params',
123-
]),
129+
resolve: new AsyncSeriesWaterfallHook<ResolveHookParams>(['params']),
124130
afterResolve: new AsyncSeriesHook<
125131
{ scriptId: string; caller?: string },
126132
void
@@ -328,28 +334,36 @@ export class ScriptManager extends EventEmitter {
328334
this.emit('resolving', { scriptId: finalScriptId, caller: finalCaller });
329335

330336
// Check if there are any taps in the resolve hook
331-
const _hasResolveHooks = this.hooks.resolve.taps.length > 0;
337+
const hasResolveHooks = this.hooks.resolve.taps.length > 0;
332338

333339
let locator: ScriptLocator | undefined;
334340

335-
// if (hasResolveHooks) {
336-
await this.hooks.resolve.promise({
337-
scriptId: finalScriptId,
338-
caller: finalCaller,
339-
});
341+
// // if (hasResolveHooks) {
342+
// const { result } = await this.hooks.resolve.promise({
343+
// scriptId: finalScriptId,
344+
// caller: finalCaller,
345+
// referenceUrl,
346+
// resolvers: this.resolvers,
347+
// });
348+
349+
// // if (result) {
350+
// locator = result;
351+
// console.log('Resolved locator1:', locator);
352+
// // }
340353
// } else {
341354
for (const [, , resolve] of this.resolvers) {
342355
const resolvedLocator = await resolve(
343356
finalScriptId,
344357
finalCaller,
345358
referenceUrl
346359
);
360+
347361
if (resolvedLocator) {
348362
locator = resolvedLocator;
349363
break;
350364
}
351-
// }
352365
}
366+
// }
353367

354368
if (!locator) {
355369
const error = new Error(

packages/repack/src/modules/ScriptManager/__tests__/ScriptManager.test.ts

+90
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import NativeScriptManager, {
33
} from '../NativeScriptManager.js';
44
import { Script } from '../Script.js';
55
import { ScriptManager } from '../ScriptManager.js';
6+
import { getWebpackContext } from '../getWebpackContext.js';
67

78
jest.mock('../NativeScriptManager.js', () => ({
89
loadScript: jest.fn(),
@@ -1192,6 +1193,95 @@ describe('ScriptManagerAPI', () => {
11921193
expect.any(Error)
11931194
);
11941195
});
1196+
1197+
it('should allow resolve hook to handle resolution with custom logic', async () => {
1198+
const hookOrder: string[] = [];
1199+
const customScriptId = 'custom-script';
1200+
const customCaller = 'custom-caller';
1201+
const customReferenceUrl = 'http://reference.url';
1202+
1203+
ScriptManager.shared.hooks.beforeResolve.tap(
1204+
'test-before',
1205+
({ scriptId, caller }) => {
1206+
hookOrder.push('beforeResolve');
1207+
return { scriptId, caller };
1208+
}
1209+
);
1210+
1211+
ScriptManager.shared.hooks.resolve.tapAsync(
1212+
'test-resolve',
1213+
async (params, callback) => {
1214+
expect(params.scriptId).toBe(customScriptId);
1215+
expect(params.caller).toBe(customCaller);
1216+
expect(params.referenceUrl).toBe(customReferenceUrl);
1217+
expect(params.resolvers).toBeDefined();
1218+
expect(Array.isArray(params.resolvers)).toBe(true);
1219+
1220+
hookOrder.push('resolve');
1221+
for (const [, , resolve] of params.resolvers) {
1222+
try {
1223+
const resolvedLocator = await resolve(
1224+
params.scriptId,
1225+
params.caller,
1226+
params.referenceUrl
1227+
);
1228+
1229+
if (resolvedLocator) {
1230+
callback(null, {
1231+
...params,
1232+
result: resolvedLocator,
1233+
});
1234+
return;
1235+
}
1236+
} catch (error) {
1237+
if (error instanceof Error) {
1238+
callback(error);
1239+
} else {
1240+
callback(new Error('Unknown error occurred'));
1241+
}
1242+
return;
1243+
}
1244+
}
1245+
callback(new Error('No locator found'));
1246+
}
1247+
);
1248+
1249+
ScriptManager.shared.hooks.afterResolve.tap(
1250+
'test-after',
1251+
({ scriptId, caller }) => {
1252+
expect(scriptId).toBe(customScriptId);
1253+
expect(caller).toBe(customCaller);
1254+
hookOrder.push('afterResolve');
1255+
}
1256+
);
1257+
1258+
// Add a resolver that should be called by the hook
1259+
ScriptManager.shared.addResolver(async () => {
1260+
hookOrder.push('resolver');
1261+
return {
1262+
url: Script.getRemoteURL('http://domain.ext/script.js'),
1263+
cache: true,
1264+
};
1265+
});
1266+
1267+
const script = await ScriptManager.shared.resolveScript(
1268+
customScriptId,
1269+
customCaller,
1270+
getWebpackContext(),
1271+
customReferenceUrl
1272+
);
1273+
expect(script.locator.url).toBe(
1274+
'http://domain.ext/script.js.chunk.bundle'
1275+
);
1276+
expect(hookOrder).toEqual([
1277+
'beforeResolve',
1278+
'resolve',
1279+
'resolver',
1280+
'afterResolve',
1281+
]);
1282+
1283+
ScriptManager.shared.removeAllResolvers();
1284+
});
11951285
});
11961286

11971287
describe('loading script hooks lifecycle', () => {

0 commit comments

Comments
 (0)