@squide/firefly 13.3.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -0
- package/dist/AppRouterReducer.d.ts +4 -2
- package/dist/AppRouterReducer.js +63 -45
- package/dist/AppRouterReducer.js.map +1 -1
- package/dist/AppRouterStore.d.ts +3 -3
- package/dist/AppRouterStore.js.map +1 -1
- package/dist/FireflyRuntime.d.ts +22 -5
- package/dist/FireflyRuntime.js +34 -11
- package/dist/FireflyRuntime.js.map +1 -1
- package/dist/honeycomb/activeSpan.d.ts +2 -2
- package/dist/honeycomb/activeSpan.js.map +1 -1
- package/dist/honeycomb/registerHoneycombInstrumentation.js +20 -5
- package/dist/honeycomb/registerHoneycombInstrumentation.js.map +1 -1
- package/package.json +17 -17
- package/src/AppRouterReducer.ts +52 -53
- package/src/AppRouterStore.ts +4 -4
- package/src/FireflyRuntime.tsx +50 -12
- package/src/honeycomb/activeSpan.ts +2 -2
- package/src/honeycomb/registerHoneycombInstrumentation.ts +22 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# @squide/firefly
|
|
2
2
|
|
|
3
|
+
## 14.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- [#311](https://github.com/workleap/wl-squide/pull/311) [`cc52e8b`](https://github.com/workleap/wl-squide/commit/cc52e8bfbe9d3d215f51d12755743f17c0c69772) Thanks [@patricklafrance](https://github.com/patricklafrance)! - Deferred registration functions now receives a runtime instance as the first argument. This new scope runtime instance should used whenever runtime access is required within a deferred registration function scope.
|
|
8
|
+
|
|
9
|
+
Before:
|
|
10
|
+
|
|
11
|
+
The `runtime` argument of the registration function is used to register the navigation item.
|
|
12
|
+
|
|
13
|
+
```ts !#1,2,4
|
|
14
|
+
export const register: ModuleRegisterFunction<
|
|
15
|
+
FireflyRuntime,
|
|
16
|
+
unknown,
|
|
17
|
+
DeferredRegistrationData
|
|
18
|
+
> = (runtime) => {
|
|
19
|
+
return ({ featureFlags }, operation) => {
|
|
20
|
+
if (featureFlags.featureA) {
|
|
21
|
+
runtime.registerNavigationItem({
|
|
22
|
+
$id: "feature-a",
|
|
23
|
+
$label: operation === "register" ? "Feature A" : "Feature A updated",
|
|
24
|
+
to: "/feature-a",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
After:
|
|
32
|
+
|
|
33
|
+
The `deferredRuntime` argument of the **deferred** registration function is used to register the navigation item.
|
|
34
|
+
|
|
35
|
+
```ts !#2,4
|
|
36
|
+
export const register: ModuleRegisterFunction<
|
|
37
|
+
FireflyRuntime,
|
|
38
|
+
unknown,
|
|
39
|
+
DeferredRegistrationData
|
|
40
|
+
> = (runtime) => {
|
|
41
|
+
return (deferredRuntime, { featureFlags }, operation) => {
|
|
42
|
+
if (featureFlags.featureA) {
|
|
43
|
+
deferredRuntime.registerNavigationItem({
|
|
44
|
+
$id: "feature-a",
|
|
45
|
+
$label: operation === "register" ? "Feature A" : "Feature A updated",
|
|
46
|
+
to: "/feature-a",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [[`cc52e8b`](https://github.com/workleap/wl-squide/commit/cc52e8bfbe9d3d215f51d12755743f17c0c69772)]:
|
|
56
|
+
- @squide/module-federation@7.0.0
|
|
57
|
+
- @squide/react-router@8.0.0
|
|
58
|
+
- @squide/core@6.0.0
|
|
59
|
+
- @squide/msw@4.0.0
|
|
60
|
+
|
|
61
|
+
## 13.3.1
|
|
62
|
+
|
|
63
|
+
### Patch Changes
|
|
64
|
+
|
|
65
|
+
- [#307](https://github.com/workleap/wl-squide/pull/307) [`4bd0a34`](https://github.com/workleap/wl-squide/commit/4bd0a34b443caeb12f6c65faa5443c4a48784562) Thanks [@patricklafrance](https://github.com/patricklafrance)! - Fix Honeycomb traces for certain usecases, including global data fetch failures.
|
|
66
|
+
|
|
3
67
|
## 13.3.0
|
|
4
68
|
|
|
5
69
|
### Minor Changes
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { type Dispatch } from "react";
|
|
2
2
|
export type ActiveRouteVisiblity = "unknown" | "public" | "protected";
|
|
3
|
-
export interface
|
|
3
|
+
export interface AppRouterWaitState {
|
|
4
4
|
waitForMsw: boolean;
|
|
5
5
|
waitForPublicData: boolean;
|
|
6
6
|
waitForProtectedData: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface AppRouterState extends AppRouterWaitState {
|
|
7
9
|
areModulesRegistered: boolean;
|
|
8
10
|
areModulesReady: boolean;
|
|
9
11
|
isMswReady: boolean;
|
|
@@ -29,13 +31,13 @@ export declare const DeferredRegistrationsUpdatedEvent = "squide-deferred-regist
|
|
|
29
31
|
export declare const ApplicationBoostrappedEvent = "squide-app-boostrapped";
|
|
30
32
|
export interface AppRouterAction {
|
|
31
33
|
type: AppRouterActionType;
|
|
34
|
+
payload?: unknown;
|
|
32
35
|
}
|
|
33
36
|
export type AppRouterDispatch = Dispatch<AppRouterAction>;
|
|
34
37
|
export declare function getAreModulesRegistered(): boolean;
|
|
35
38
|
export declare function getAreModulesReady(): boolean;
|
|
36
39
|
export declare function useModuleRegistrationStatusDispatcher(areModulesRegisteredValue: boolean, areModulesReadyValue: boolean, dispatch: AppRouterDispatch): void;
|
|
37
40
|
export declare function useMswStatusDispatcher(isMswReadyValue: boolean, dispatch: AppRouterDispatch): void;
|
|
38
|
-
export declare function useBootstrappingCompletedDispatcher(state: AppRouterState): void;
|
|
39
41
|
export declare function __setAppReducerDispatchProxyFactory(factory: (reactDispatch: AppRouterDispatch) => AppRouterDispatch): void;
|
|
40
42
|
export declare function __clearAppReducerDispatchProxy(): void;
|
|
41
43
|
export declare function useAppRouterReducer(waitForPublicData: boolean, waitForProtectedData: boolean): [AppRouterState, AppRouterDispatch];
|
package/dist/AppRouterReducer.js
CHANGED
|
@@ -160,13 +160,10 @@ function useModuleRegistrationStatusDispatcher(areModulesRegisteredValue, areMod
|
|
|
160
160
|
dispatch({
|
|
161
161
|
type: "modules-registered"
|
|
162
162
|
});
|
|
163
|
-
logger.withText("[squide]
|
|
163
|
+
logger.withText("[squide] Modules are registered.", {
|
|
164
164
|
style: {
|
|
165
|
-
color: "
|
|
166
|
-
backgroundColor: "green"
|
|
165
|
+
color: "green"
|
|
167
166
|
}
|
|
168
|
-
}).withText(".", {
|
|
169
|
-
leadingSpace: false
|
|
170
167
|
}).information();
|
|
171
168
|
return true;
|
|
172
169
|
}
|
|
@@ -180,13 +177,10 @@ function useModuleRegistrationStatusDispatcher(areModulesRegisteredValue, areMod
|
|
|
180
177
|
dispatch({
|
|
181
178
|
type: "modules-ready"
|
|
182
179
|
});
|
|
183
|
-
logger.withText("[squide]
|
|
180
|
+
logger.withText("[squide] Modules are ready.", {
|
|
184
181
|
style: {
|
|
185
|
-
color: "
|
|
186
|
-
backgroundColor: "green"
|
|
182
|
+
color: "green"
|
|
187
183
|
}
|
|
188
|
-
}).withText(".", {
|
|
189
|
-
leadingSpace: false
|
|
190
184
|
}).information();
|
|
191
185
|
return true;
|
|
192
186
|
}
|
|
@@ -224,13 +218,10 @@ function useMswStatusDispatcher(isMswReadyValue, dispatch) {
|
|
|
224
218
|
dispatch({
|
|
225
219
|
type: "msw-ready"
|
|
226
220
|
});
|
|
227
|
-
logger.withText("[squide]
|
|
221
|
+
logger.withText("[squide] MSW is ready.", {
|
|
228
222
|
style: {
|
|
229
|
-
color: "
|
|
230
|
-
backgroundColor: "green"
|
|
223
|
+
color: "green"
|
|
231
224
|
}
|
|
232
|
-
}).withText(".", {
|
|
233
|
-
leadingSpace: false
|
|
234
225
|
}).information();
|
|
235
226
|
return true;
|
|
236
227
|
}
|
|
@@ -251,19 +242,20 @@ function useMswStatusDispatcher(isMswReadyValue, dispatch) {
|
|
|
251
242
|
dispatchMswReady
|
|
252
243
|
]);
|
|
253
244
|
}
|
|
254
|
-
function useBootstrappingCompletedDispatcher(state) {
|
|
245
|
+
function useBootstrappingCompletedDispatcher(waitState, state) {
|
|
255
246
|
const eventBus = useEventBus();
|
|
256
247
|
const areModulesRegisteredValue = state.areModulesRegistered;
|
|
257
248
|
const isBoostrapping = isBootstrapping(state);
|
|
258
249
|
useExecuteOnce(useCallback(()=>{
|
|
259
250
|
if (areModulesRegisteredValue && !isBoostrapping) {
|
|
260
|
-
eventBus.dispatch(ApplicationBoostrappedEvent);
|
|
251
|
+
eventBus.dispatch(ApplicationBoostrappedEvent, waitState);
|
|
261
252
|
return true;
|
|
262
253
|
}
|
|
263
254
|
return false;
|
|
264
255
|
}, [
|
|
265
256
|
areModulesRegisteredValue,
|
|
266
257
|
isBoostrapping,
|
|
258
|
+
waitState,
|
|
267
259
|
eventBus
|
|
268
260
|
]), true);
|
|
269
261
|
}
|
|
@@ -283,16 +275,20 @@ function useReducerDispatchProxy(reactDispatch) {
|
|
|
283
275
|
reactDispatch
|
|
284
276
|
]);
|
|
285
277
|
}
|
|
286
|
-
function useEnhancedReducerDispatch(reducerDispatch) {
|
|
278
|
+
function useEnhancedReducerDispatch(waitState, reducerDispatch) {
|
|
287
279
|
const logger = useLogger();
|
|
288
280
|
const appRouterStore = useAppRouterStore();
|
|
289
281
|
const eventBus = useEventBus();
|
|
290
282
|
return useCallback((action)=>{
|
|
291
283
|
logger.withText("[squide] The following action has been dispatched to the AppRouter reducer:").withObject(action).debug();
|
|
292
|
-
appRouterStore.dispatch(
|
|
293
|
-
|
|
284
|
+
appRouterStore.dispatch({
|
|
285
|
+
...action,
|
|
286
|
+
payload: waitState
|
|
287
|
+
});
|
|
288
|
+
eventBus.dispatch(`squide-${action.type}`, waitState);
|
|
294
289
|
reducerDispatch(action);
|
|
295
290
|
}, [
|
|
291
|
+
waitState,
|
|
296
292
|
reducerDispatch,
|
|
297
293
|
logger,
|
|
298
294
|
appRouterStore,
|
|
@@ -303,81 +299,103 @@ function useAppRouterReducer(waitForPublicData, waitForProtectedData) {
|
|
|
303
299
|
const runtime = useRuntime();
|
|
304
300
|
const eventBus = useEventBus();
|
|
305
301
|
const appRouterStore = useAppRouterStore();
|
|
302
|
+
const isMswEnabled = runtime.isMswEnabled;
|
|
306
303
|
const areModulesInitiallyRegistered = getAreModulesRegistered();
|
|
307
304
|
const areModulesInitiallyReady = getAreModulesReady();
|
|
308
305
|
const isMswInitiallyReady = isMswReady();
|
|
306
|
+
const waitState = useMemo(()=>({
|
|
307
|
+
waitForMsw: isMswEnabled,
|
|
308
|
+
waitForPublicData,
|
|
309
|
+
waitForProtectedData
|
|
310
|
+
}), [
|
|
311
|
+
isMswEnabled,
|
|
312
|
+
waitForPublicData,
|
|
313
|
+
waitForProtectedData
|
|
314
|
+
]);
|
|
315
|
+
const initialState = useMemo(()=>({
|
|
316
|
+
waitForMsw: waitState.waitForMsw,
|
|
317
|
+
waitForPublicData: waitState.waitForPublicData,
|
|
318
|
+
waitForProtectedData: waitState.waitForProtectedData,
|
|
319
|
+
// When the modules registration functions are awaited, the event listeners are registered after the modules are registered.
|
|
320
|
+
areModulesRegistered: areModulesInitiallyRegistered,
|
|
321
|
+
areModulesReady: areModulesInitiallyReady,
|
|
322
|
+
isMswReady: isMswInitiallyReady,
|
|
323
|
+
isPublicDataReady: false,
|
|
324
|
+
isProtectedDataReady: false,
|
|
325
|
+
activeRouteVisibility: "unknown",
|
|
326
|
+
isUnauthorized: false
|
|
327
|
+
}), [
|
|
328
|
+
waitState,
|
|
329
|
+
areModulesInitiallyRegistered,
|
|
330
|
+
areModulesInitiallyReady,
|
|
331
|
+
isMswInitiallyReady
|
|
332
|
+
]);
|
|
309
333
|
// When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.
|
|
310
334
|
// To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.
|
|
311
335
|
useExecuteOnce(useCallback(()=>{
|
|
312
336
|
if (areModulesInitiallyRegistered) {
|
|
313
337
|
appRouterStore.dispatch({
|
|
314
|
-
type: "modules-registered"
|
|
338
|
+
type: "modules-registered",
|
|
339
|
+
payload: waitState
|
|
315
340
|
});
|
|
316
|
-
eventBus.dispatch(ModulesRegisteredEvent);
|
|
341
|
+
eventBus.dispatch(ModulesRegisteredEvent, waitState);
|
|
317
342
|
}
|
|
318
343
|
return true;
|
|
319
344
|
}, [
|
|
320
345
|
areModulesInitiallyRegistered,
|
|
321
346
|
appRouterStore,
|
|
322
|
-
eventBus
|
|
347
|
+
eventBus,
|
|
348
|
+
waitState
|
|
323
349
|
]), true);
|
|
324
350
|
// When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.
|
|
325
351
|
// To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.
|
|
326
352
|
useExecuteOnce(useCallback(()=>{
|
|
327
353
|
if (areModulesInitiallyReady) {
|
|
328
354
|
appRouterStore.dispatch({
|
|
329
|
-
type: "modules-ready"
|
|
355
|
+
type: "modules-ready",
|
|
356
|
+
payload: waitState
|
|
330
357
|
});
|
|
331
|
-
eventBus.dispatch(ModulesReadyEvent);
|
|
358
|
+
eventBus.dispatch(ModulesReadyEvent, waitState);
|
|
332
359
|
}
|
|
333
360
|
return true;
|
|
334
361
|
}, [
|
|
335
362
|
areModulesInitiallyReady,
|
|
336
363
|
appRouterStore,
|
|
337
|
-
eventBus
|
|
364
|
+
eventBus,
|
|
365
|
+
waitState
|
|
338
366
|
]), true);
|
|
339
367
|
// When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.
|
|
340
368
|
// To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.
|
|
341
369
|
useExecuteOnce(useCallback(()=>{
|
|
342
370
|
if (isMswInitiallyReady) {
|
|
343
371
|
appRouterStore.dispatch({
|
|
344
|
-
type: "msw-ready"
|
|
372
|
+
type: "msw-ready",
|
|
373
|
+
payload: waitState
|
|
345
374
|
});
|
|
346
|
-
eventBus.dispatch(MswReadyEvent);
|
|
375
|
+
eventBus.dispatch(MswReadyEvent, waitState);
|
|
347
376
|
}
|
|
348
377
|
return true;
|
|
349
378
|
}, [
|
|
350
379
|
isMswInitiallyReady,
|
|
351
380
|
appRouterStore,
|
|
352
|
-
eventBus
|
|
381
|
+
eventBus,
|
|
382
|
+
waitState
|
|
353
383
|
]), true);
|
|
354
|
-
const [state, reactDispatch] = useReducer(reducer,
|
|
355
|
-
waitForMsw: runtime.isMswEnabled,
|
|
356
|
-
waitForPublicData,
|
|
357
|
-
waitForProtectedData,
|
|
358
|
-
// When the modules registration functions are awaited, the event listeners are registered after the modules are registered.
|
|
359
|
-
areModulesRegistered: areModulesInitiallyRegistered,
|
|
360
|
-
areModulesReady: areModulesInitiallyReady,
|
|
361
|
-
isMswReady: isMswInitiallyReady,
|
|
362
|
-
isPublicDataReady: false,
|
|
363
|
-
isProtectedDataReady: false,
|
|
364
|
-
activeRouteVisibility: "unknown",
|
|
365
|
-
isUnauthorized: false
|
|
366
|
-
});
|
|
384
|
+
const [state, reactDispatch] = useReducer(reducer, initialState);
|
|
367
385
|
const { areModulesRegistered: areModulesRegisteredValue, areModulesReady: areModulesReadyValue, isMswReady: isMswReadyValue } = state;
|
|
368
386
|
// The dispatch proxy is strictly an utility allowing tests to mock the useReducer dispatch function. It's easier
|
|
369
387
|
// than mocking the import from React.
|
|
370
388
|
const dispatchProxy = useReducerDispatchProxy(reactDispatch);
|
|
371
|
-
const dispatch = useEnhancedReducerDispatch(dispatchProxy);
|
|
389
|
+
const dispatch = useEnhancedReducerDispatch(waitState, dispatchProxy);
|
|
372
390
|
useModuleRegistrationStatusDispatcher(areModulesRegisteredValue, areModulesReadyValue, dispatch);
|
|
373
391
|
useMswStatusDispatcher(isMswReadyValue, dispatch);
|
|
374
|
-
useBootstrappingCompletedDispatcher(state);
|
|
392
|
+
useBootstrappingCompletedDispatcher(waitState, state);
|
|
375
393
|
return [
|
|
376
394
|
state,
|
|
377
395
|
dispatch
|
|
378
396
|
];
|
|
379
397
|
}
|
|
380
398
|
|
|
381
|
-
export { ActiveRouteIsProtectedEvent, ActiveRouteIsPublicEvent, ApplicationBoostrappedEvent, DeferredRegistrationsUpdatedEvent, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, ProtectedDataUpdatedEvent, PublicDataReadyEvent, PublicDataUpdatedEvent, __clearAppReducerDispatchProxy, __setAppReducerDispatchProxyFactory, getAreModulesReady, getAreModulesRegistered, useAppRouterReducer,
|
|
399
|
+
export { ActiveRouteIsProtectedEvent, ActiveRouteIsPublicEvent, ApplicationBoostrappedEvent, DeferredRegistrationsUpdatedEvent, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, ProtectedDataUpdatedEvent, PublicDataReadyEvent, PublicDataUpdatedEvent, __clearAppReducerDispatchProxy, __setAppReducerDispatchProxyFactory, getAreModulesReady, getAreModulesRegistered, useAppRouterReducer, useModuleRegistrationStatusDispatcher, useMswStatusDispatcher };
|
|
382
400
|
|
|
383
401
|
//# sourceMappingURL=AppRouterReducer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRouterReducer.js","sources":["webpack://@squide/firefly/./src/AppRouterReducer.ts"],"sourcesContent":["import { addLocalModuleRegistrationStatusChangedListener, getLocalModuleRegistrationStatus, removeLocalModuleRegistrationStatusChangedListener, useEventBus, useLogger, useRuntime } from \"@squide/core\";\nimport { addRemoteModuleRegistrationStatusChangedListener, areModulesReady, areModulesRegistered, getRemoteModuleRegistrationStatus, removeRemoteModuleRegistrationStatusChangedListener } from \"@squide/module-federation\";\nimport { addMswStateChangedListener, isMswReady, removeMswStateChangedListener } from \"@squide/msw\";\nimport { useCallback, useEffect, useMemo, useReducer, type Dispatch } from \"react\";\nimport type { FireflyRuntime } from \"./FireflyRuntime.tsx\";\nimport { useAppRouterStore } from \"./useAppRouterStore.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\nimport { isBootstrapping } from \"./useIsBootstrapping.ts\";\n\nexport type ActiveRouteVisiblity = \"unknown\" | \"public\" | \"protected\";\n\nexport interface AppRouterState {\n waitForMsw: boolean;\n waitForPublicData: boolean;\n waitForProtectedData: boolean;\n areModulesRegistered: boolean;\n areModulesReady: boolean;\n isMswReady: boolean;\n isPublicDataReady: boolean;\n isProtectedDataReady: boolean;\n publicDataUpdatedAt?: number;\n protectedDataUpdatedAt?: number;\n deferredRegistrationsUpdatedAt?: number;\n activeRouteVisibility: ActiveRouteVisiblity;\n isUnauthorized: boolean;\n}\n\nexport type AppRouterActionType =\n| \"modules-registered\"\n| \"modules-ready\"\n| \"msw-ready\"\n| \"public-data-ready\"\n| \"protected-data-ready\"\n| \"public-data-updated\"\n| \"protected-data-updated\"\n| \"deferred-registrations-updated\"\n| \"active-route-is-public\"\n| \"active-route-is-protected\"\n| \"is-unauthorized\";\n\n// The followings event const are a concatenation of \"squide-\" with AppRouterActionType.\n// They are dispatched by the useEnhancedReducerDispatch hook.\nexport const ModulesRegisteredEvent = \"squide-modules-registered\";\nexport const ModulesReadyEvent = \"squide-modules-ready\";\nexport const MswReadyEvent = \"squide-msw-ready\";\nexport const ActiveRouteIsPublicEvent = \"squide-active-route-is-public\";\nexport const ActiveRouteIsProtectedEvent = \"squide-active-route-is-protected\";\nexport const PublicDataReadyEvent = \"squide-public-data-ready\";\nexport const ProtectedDataReadyEvent = \"squide-protected-data-ready\";\nexport const PublicDataUpdatedEvent = \"squide-public-data-updated\";\nexport const ProtectedDataUpdatedEvent = \"squide-protected-data-updated\";\nexport const DeferredRegistrationsUpdatedEvent = \"squide-deferred-registrations-updated\";\nexport const ApplicationBoostrappedEvent = \"squide-app-boostrapped\";\n\nexport interface AppRouterAction {\n type: AppRouterActionType;\n}\n\nexport type AppRouterDispatch = Dispatch<AppRouterAction>;\n\nfunction reducer(state: AppRouterState, action: AppRouterAction) {\n let newState = state;\n\n switch (action.type) {\n case \"modules-registered\": {\n newState = {\n ...newState,\n areModulesRegistered: true\n };\n\n break;\n }\n case \"modules-ready\": {\n newState = {\n ...newState,\n areModulesReady: true,\n // Will be set even if the app is not using deferred registrations.\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"msw-ready\": {\n newState = {\n ...newState,\n isMswReady: true\n };\n\n break;\n }\n case \"public-data-ready\": {\n newState = {\n ...newState,\n isPublicDataReady: true,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-ready\": {\n newState = {\n ...newState,\n isProtectedDataReady: true,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"public-data-updated\": {\n newState = {\n ...newState,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-updated\": {\n newState = {\n ...newState,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"deferred-registrations-updated\": {\n newState = {\n ...newState,\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"active-route-is-public\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"public\"\n };\n\n break;\n }\n case \"active-route-is-protected\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"protected\"\n };\n\n break;\n }\n case \"is-unauthorized\": {\n newState = {\n ...newState,\n isUnauthorized: true\n };\n\n break;\n }\n default: {\n throw new Error(`[squide] The AppRouter component state reducer doesn't support action type \"${action.type}\".`);\n }\n }\n\n return newState;\n}\n\nexport function getAreModulesRegistered() {\n const localModuleStatus = getLocalModuleRegistrationStatus();\n const remoteModuleStatus = getRemoteModuleRegistrationStatus();\n\n return areModulesRegistered(localModuleStatus, remoteModuleStatus);\n}\n\nexport function getAreModulesReady() {\n const localModuleStatus = getLocalModuleRegistrationStatus();\n const remoteModuleStatus = getRemoteModuleRegistrationStatus();\n\n return areModulesReady(localModuleStatus, remoteModuleStatus);\n}\n\nexport function useModuleRegistrationStatusDispatcher(areModulesRegisteredValue: boolean, areModulesReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchModulesRegistered = useExecuteOnce(useCallback(() => {\n if (getAreModulesRegistered()) {\n dispatch({ type: \"modules-registered\" });\n\n logger\n .withText(\"[squide]\")\n .withText(\"Modules are registered\", {\n style: {\n color: \"white\",\n backgroundColor: \"green\"\n }\n })\n .withText(\".\", {\n leadingSpace: false\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n const dispatchModulesReady = useExecuteOnce(useCallback(() => {\n if (getAreModulesReady()) {\n dispatch({ type: \"modules-ready\" });\n\n logger\n .withText(\"[squide]\")\n .withText(\"Modules are ready\", {\n style: {\n color: \"white\",\n backgroundColor: \"green\"\n }\n })\n .withText(\".\", {\n leadingSpace: false\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n return useEffect(() => {\n if (!areModulesRegisteredValue) {\n addLocalModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n addRemoteModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n }\n\n if (!areModulesReadyValue) {\n addLocalModuleRegistrationStatusChangedListener(dispatchModulesReady);\n addRemoteModuleRegistrationStatusChangedListener(dispatchModulesReady);\n }\n\n return () => {\n removeLocalModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n removeRemoteModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n\n removeLocalModuleRegistrationStatusChangedListener(dispatchModulesReady);\n removeRemoteModuleRegistrationStatusChangedListener(dispatchModulesReady);\n };\n }, [areModulesRegisteredValue, areModulesReadyValue, dispatchModulesRegistered, dispatchModulesReady]);\n}\n\nexport function useMswStatusDispatcher(isMswReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchMswReady = useExecuteOnce(useCallback(() => {\n if (isMswReady()) {\n dispatch({ type: \"msw-ready\" });\n\n logger\n .withText(\"[squide]\")\n .withText(\"MSW is ready\", {\n style: {\n color: \"white\",\n backgroundColor: \"green\"\n }\n })\n .withText(\".\", {\n leadingSpace: false\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n useEffect(() => {\n if (!isMswReadyValue) {\n addMswStateChangedListener(dispatchMswReady);\n }\n\n return () => {\n removeMswStateChangedListener(dispatchMswReady);\n };\n }, [isMswReadyValue, dispatchMswReady]);\n}\n\nexport function useBootstrappingCompletedDispatcher(state: AppRouterState) {\n const eventBus = useEventBus();\n\n const areModulesRegisteredValue = state.areModulesRegistered;\n const isBoostrapping = isBootstrapping(state);\n\n useExecuteOnce(useCallback(() => {\n if (areModulesRegisteredValue && !isBoostrapping) {\n eventBus.dispatch(ApplicationBoostrappedEvent);\n\n return true;\n }\n\n return false;\n }, [areModulesRegisteredValue, isBoostrapping, eventBus]), true);\n}\n\nlet dispatchProxyFactory: ((reactDispatch: AppRouterDispatch) => AppRouterDispatch) | undefined;\n\n// This function should only be used by tests.\nexport function __setAppReducerDispatchProxyFactory(factory: (reactDispatch: AppRouterDispatch) => AppRouterDispatch) {\n dispatchProxyFactory = factory;\n}\n\n// This function should only be used by tests.\nexport function __clearAppReducerDispatchProxy() {\n dispatchProxyFactory = undefined;\n}\n\nfunction useReducerDispatchProxy(reactDispatch: AppRouterDispatch) {\n return useMemo(() => {\n return dispatchProxyFactory ? dispatchProxyFactory(reactDispatch) : reactDispatch;\n }, [reactDispatch]);\n}\n\nfunction useEnhancedReducerDispatch(reducerDispatch: AppRouterDispatch) {\n const logger = useLogger();\n const appRouterStore = useAppRouterStore();\n const eventBus = useEventBus();\n\n return useCallback((action: AppRouterAction) => {\n logger\n .withText(\"[squide] The following action has been dispatched to the AppRouter reducer:\")\n .withObject(action)\n .debug();\n\n appRouterStore.dispatch(action);\n eventBus.dispatch(`squide-${action.type}`);\n\n reducerDispatch(action);\n }, [reducerDispatch, logger, appRouterStore, eventBus]);\n}\n\nexport function useAppRouterReducer(waitForPublicData: boolean, waitForProtectedData: boolean): [AppRouterState, AppRouterDispatch] {\n const runtime = useRuntime() as FireflyRuntime;\n const eventBus = useEventBus();\n const appRouterStore = useAppRouterStore();\n\n const areModulesInitiallyRegistered = getAreModulesRegistered();\n const areModulesInitiallyReady = getAreModulesReady();\n const isMswInitiallyReady = isMswReady();\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (areModulesInitiallyRegistered) {\n appRouterStore.dispatch({ type: \"modules-registered\" });\n eventBus.dispatch(ModulesRegisteredEvent);\n }\n\n return true;\n }, [areModulesInitiallyRegistered, appRouterStore, eventBus]), true);\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (areModulesInitiallyReady) {\n appRouterStore.dispatch({ type: \"modules-ready\" });\n eventBus.dispatch(ModulesReadyEvent);\n }\n\n return true;\n }, [areModulesInitiallyReady, appRouterStore, eventBus]), true);\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (isMswInitiallyReady) {\n appRouterStore.dispatch({ type: \"msw-ready\" });\n eventBus.dispatch(MswReadyEvent);\n }\n\n return true;\n }, [isMswInitiallyReady, appRouterStore, eventBus]), true);\n\n const [state, reactDispatch] = useReducer(reducer, {\n waitForMsw: runtime.isMswEnabled,\n waitForPublicData,\n waitForProtectedData,\n // When the modules registration functions are awaited, the event listeners are registered after the modules are registered.\n areModulesRegistered: areModulesInitiallyRegistered,\n areModulesReady: areModulesInitiallyReady,\n isMswReady: isMswInitiallyReady,\n isPublicDataReady: false,\n isProtectedDataReady: false,\n activeRouteVisibility: \"unknown\",\n isUnauthorized: false\n });\n\n const {\n areModulesRegistered: areModulesRegisteredValue,\n areModulesReady: areModulesReadyValue,\n isMswReady: isMswReadyValue\n } = state;\n\n // The dispatch proxy is strictly an utility allowing tests to mock the useReducer dispatch function. It's easier\n // than mocking the import from React.\n const dispatchProxy = useReducerDispatchProxy(reactDispatch);\n const dispatch = useEnhancedReducerDispatch(dispatchProxy);\n\n useModuleRegistrationStatusDispatcher(areModulesRegisteredValue, areModulesReadyValue, dispatch);\n useMswStatusDispatcher(isMswReadyValue, dispatch);\n useBootstrappingCompletedDispatcher(state);\n\n return [state, dispatch];\n}\n"],"names":["addLocalModuleRegistrationStatusChangedListener","getLocalModuleRegistrationStatus","removeLocalModuleRegistrationStatusChangedListener","useEventBus","useLogger","useRuntime","addRemoteModuleRegistrationStatusChangedListener","areModulesReady","areModulesRegistered","getRemoteModuleRegistrationStatus","removeRemoteModuleRegistrationStatusChangedListener","addMswStateChangedListener","isMswReady","removeMswStateChangedListener","useCallback","useEffect","useMemo","useReducer","useAppRouterStore","useExecuteOnce","isBootstrapping","ModulesRegisteredEvent","ModulesReadyEvent","MswReadyEvent","ActiveRouteIsPublicEvent","ActiveRouteIsProtectedEvent","PublicDataReadyEvent","ProtectedDataReadyEvent","PublicDataUpdatedEvent","ProtectedDataUpdatedEvent","DeferredRegistrationsUpdatedEvent","ApplicationBoostrappedEvent","reducer","state","action","newState","Date","Error","getAreModulesRegistered","localModuleStatus","remoteModuleStatus","getAreModulesReady","useModuleRegistrationStatusDispatcher","areModulesRegisteredValue","areModulesReadyValue","dispatch","logger","dispatchModulesRegistered","dispatchModulesReady","useMswStatusDispatcher","isMswReadyValue","dispatchMswReady","useBootstrappingCompletedDispatcher","eventBus","isBoostrapping","dispatchProxyFactory","__setAppReducerDispatchProxyFactory","factory","__clearAppReducerDispatchProxy","undefined","useReducerDispatchProxy","reactDispatch","useEnhancedReducerDispatch","reducerDispatch","appRouterStore","useAppRouterReducer","waitForPublicData","waitForProtectedData","runtime","areModulesInitiallyRegistered","areModulesInitiallyReady","isMswInitiallyReady","dispatchProxy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppRouterReducer.js","sources":["webpack://@squide/firefly/./src/AppRouterReducer.ts"],"sourcesContent":["import { addLocalModuleRegistrationStatusChangedListener, getLocalModuleRegistrationStatus, removeLocalModuleRegistrationStatusChangedListener, useEventBus, useLogger, useRuntime } from \"@squide/core\";\nimport { addRemoteModuleRegistrationStatusChangedListener, areModulesReady, areModulesRegistered, getRemoteModuleRegistrationStatus, removeRemoteModuleRegistrationStatusChangedListener } from \"@squide/module-federation\";\nimport { addMswStateChangedListener, isMswReady, removeMswStateChangedListener } from \"@squide/msw\";\nimport { useCallback, useEffect, useMemo, useReducer, type Dispatch } from \"react\";\nimport type { FireflyRuntime } from \"./FireflyRuntime.tsx\";\nimport { useAppRouterStore } from \"./useAppRouterStore.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\nimport { isBootstrapping } from \"./useIsBootstrapping.ts\";\n\nexport type ActiveRouteVisiblity = \"unknown\" | \"public\" | \"protected\";\n\nexport interface AppRouterWaitState {\n waitForMsw: boolean;\n waitForPublicData: boolean;\n waitForProtectedData: boolean;\n}\n\nexport interface AppRouterState extends AppRouterWaitState {\n areModulesRegistered: boolean;\n areModulesReady: boolean;\n isMswReady: boolean;\n isPublicDataReady: boolean;\n isProtectedDataReady: boolean;\n publicDataUpdatedAt?: number;\n protectedDataUpdatedAt?: number;\n deferredRegistrationsUpdatedAt?: number;\n activeRouteVisibility: ActiveRouteVisiblity;\n isUnauthorized: boolean;\n}\n\nexport type AppRouterActionType =\n| \"modules-registered\"\n| \"modules-ready\"\n| \"msw-ready\"\n| \"public-data-ready\"\n| \"protected-data-ready\"\n| \"public-data-updated\"\n| \"protected-data-updated\"\n| \"deferred-registrations-updated\"\n| \"active-route-is-public\"\n| \"active-route-is-protected\"\n| \"is-unauthorized\";\n\n// The followings event const are a concatenation of \"squide-\" with AppRouterActionType.\n// They are dispatched by the useEnhancedReducerDispatch hook.\nexport const ModulesRegisteredEvent = \"squide-modules-registered\";\nexport const ModulesReadyEvent = \"squide-modules-ready\";\nexport const MswReadyEvent = \"squide-msw-ready\";\nexport const ActiveRouteIsPublicEvent = \"squide-active-route-is-public\";\nexport const ActiveRouteIsProtectedEvent = \"squide-active-route-is-protected\";\nexport const PublicDataReadyEvent = \"squide-public-data-ready\";\nexport const ProtectedDataReadyEvent = \"squide-protected-data-ready\";\nexport const PublicDataUpdatedEvent = \"squide-public-data-updated\";\nexport const ProtectedDataUpdatedEvent = \"squide-protected-data-updated\";\nexport const DeferredRegistrationsUpdatedEvent = \"squide-deferred-registrations-updated\";\nexport const ApplicationBoostrappedEvent = \"squide-app-boostrapped\";\n\nexport interface AppRouterAction {\n type: AppRouterActionType;\n payload?: unknown;\n}\n\nexport type AppRouterDispatch = Dispatch<AppRouterAction>;\n\nfunction reducer(state: AppRouterState, action: AppRouterAction) {\n let newState = state;\n\n switch (action.type) {\n case \"modules-registered\": {\n newState = {\n ...newState,\n areModulesRegistered: true\n };\n\n break;\n }\n case \"modules-ready\": {\n newState = {\n ...newState,\n areModulesReady: true,\n // Will be set even if the app is not using deferred registrations.\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"msw-ready\": {\n newState = {\n ...newState,\n isMswReady: true\n };\n\n break;\n }\n case \"public-data-ready\": {\n newState = {\n ...newState,\n isPublicDataReady: true,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-ready\": {\n newState = {\n ...newState,\n isProtectedDataReady: true,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"public-data-updated\": {\n newState = {\n ...newState,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-updated\": {\n newState = {\n ...newState,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"deferred-registrations-updated\": {\n newState = {\n ...newState,\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"active-route-is-public\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"public\"\n };\n\n break;\n }\n case \"active-route-is-protected\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"protected\"\n };\n\n break;\n }\n case \"is-unauthorized\": {\n newState = {\n ...newState,\n isUnauthorized: true\n };\n\n break;\n }\n default: {\n throw new Error(`[squide] The AppRouter component state reducer doesn't support action type \"${action.type}\".`);\n }\n }\n\n return newState;\n}\n\nexport function getAreModulesRegistered() {\n const localModuleStatus = getLocalModuleRegistrationStatus();\n const remoteModuleStatus = getRemoteModuleRegistrationStatus();\n\n return areModulesRegistered(localModuleStatus, remoteModuleStatus);\n}\n\nexport function getAreModulesReady() {\n const localModuleStatus = getLocalModuleRegistrationStatus();\n const remoteModuleStatus = getRemoteModuleRegistrationStatus();\n\n return areModulesReady(localModuleStatus, remoteModuleStatus);\n}\n\nexport function useModuleRegistrationStatusDispatcher(areModulesRegisteredValue: boolean, areModulesReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchModulesRegistered = useExecuteOnce(useCallback(() => {\n if (getAreModulesRegistered()) {\n dispatch({ type: \"modules-registered\" });\n\n logger\n .withText(\"[squide] Modules are registered.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n const dispatchModulesReady = useExecuteOnce(useCallback(() => {\n if (getAreModulesReady()) {\n dispatch({ type: \"modules-ready\" });\n\n logger\n .withText(\"[squide] Modules are ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n return useEffect(() => {\n if (!areModulesRegisteredValue) {\n addLocalModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n addRemoteModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n }\n\n if (!areModulesReadyValue) {\n addLocalModuleRegistrationStatusChangedListener(dispatchModulesReady);\n addRemoteModuleRegistrationStatusChangedListener(dispatchModulesReady);\n }\n\n return () => {\n removeLocalModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n removeRemoteModuleRegistrationStatusChangedListener(dispatchModulesRegistered);\n\n removeLocalModuleRegistrationStatusChangedListener(dispatchModulesReady);\n removeRemoteModuleRegistrationStatusChangedListener(dispatchModulesReady);\n };\n }, [areModulesRegisteredValue, areModulesReadyValue, dispatchModulesRegistered, dispatchModulesReady]);\n}\n\nexport function useMswStatusDispatcher(isMswReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchMswReady = useExecuteOnce(useCallback(() => {\n if (isMswReady()) {\n dispatch({ type: \"msw-ready\" });\n\n logger\n .withText(\"[squide] MSW is ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n\n return true;\n }\n\n return false;\n }, [dispatch, logger]));\n\n useEffect(() => {\n if (!isMswReadyValue) {\n addMswStateChangedListener(dispatchMswReady);\n }\n\n return () => {\n removeMswStateChangedListener(dispatchMswReady);\n };\n }, [isMswReadyValue, dispatchMswReady]);\n}\n\nfunction useBootstrappingCompletedDispatcher(waitState: AppRouterWaitState, state: AppRouterState) {\n const eventBus = useEventBus();\n\n const areModulesRegisteredValue = state.areModulesRegistered;\n const isBoostrapping = isBootstrapping(state);\n\n useExecuteOnce(useCallback(() => {\n if (areModulesRegisteredValue && !isBoostrapping) {\n eventBus.dispatch(ApplicationBoostrappedEvent, waitState);\n\n return true;\n }\n\n return false;\n }, [areModulesRegisteredValue, isBoostrapping, waitState, eventBus]), true);\n}\n\nlet dispatchProxyFactory: ((reactDispatch: AppRouterDispatch) => AppRouterDispatch) | undefined;\n\n// This function should only be used by tests.\nexport function __setAppReducerDispatchProxyFactory(factory: (reactDispatch: AppRouterDispatch) => AppRouterDispatch) {\n dispatchProxyFactory = factory;\n}\n\n// This function should only be used by tests.\nexport function __clearAppReducerDispatchProxy() {\n dispatchProxyFactory = undefined;\n}\n\nfunction useReducerDispatchProxy(reactDispatch: AppRouterDispatch) {\n return useMemo(() => {\n return dispatchProxyFactory ? dispatchProxyFactory(reactDispatch) : reactDispatch;\n }, [reactDispatch]);\n}\n\nfunction useEnhancedReducerDispatch(waitState: AppRouterWaitState, reducerDispatch: AppRouterDispatch) {\n const logger = useLogger();\n const appRouterStore = useAppRouterStore();\n const eventBus = useEventBus();\n\n return useCallback((action: AppRouterAction) => {\n logger\n .withText(\"[squide] The following action has been dispatched to the AppRouter reducer:\")\n .withObject(action)\n .debug();\n\n appRouterStore.dispatch({ ...action, payload: waitState });\n eventBus.dispatch(`squide-${action.type}`, waitState);\n\n reducerDispatch(action);\n }, [waitState, reducerDispatch, logger, appRouterStore, eventBus]);\n}\n\nexport function useAppRouterReducer(waitForPublicData: boolean, waitForProtectedData: boolean): [AppRouterState, AppRouterDispatch] {\n const runtime = useRuntime() as FireflyRuntime;\n const eventBus = useEventBus();\n const appRouterStore = useAppRouterStore();\n\n const isMswEnabled = runtime.isMswEnabled;\n\n const areModulesInitiallyRegistered = getAreModulesRegistered();\n const areModulesInitiallyReady = getAreModulesReady();\n const isMswInitiallyReady = isMswReady();\n\n const waitState = useMemo(() => ({\n waitForMsw: isMswEnabled,\n waitForPublicData,\n waitForProtectedData\n }), [isMswEnabled, waitForPublicData, waitForProtectedData]);\n\n const initialState = useMemo(() => ({\n waitForMsw: waitState.waitForMsw,\n waitForPublicData: waitState.waitForPublicData,\n waitForProtectedData: waitState.waitForProtectedData,\n // When the modules registration functions are awaited, the event listeners are registered after the modules are registered.\n areModulesRegistered: areModulesInitiallyRegistered,\n areModulesReady: areModulesInitiallyReady,\n isMswReady: isMswInitiallyReady,\n isPublicDataReady: false,\n isProtectedDataReady: false,\n activeRouteVisibility: \"unknown\",\n isUnauthorized: false\n } satisfies AppRouterState), [waitState, areModulesInitiallyRegistered, areModulesInitiallyReady, isMswInitiallyReady]);\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (areModulesInitiallyRegistered) {\n appRouterStore.dispatch({ type: \"modules-registered\", payload: waitState });\n eventBus.dispatch(ModulesRegisteredEvent, waitState);\n }\n\n return true;\n }, [areModulesInitiallyRegistered, appRouterStore, eventBus, waitState]), true);\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (areModulesInitiallyReady) {\n appRouterStore.dispatch({ type: \"modules-ready\", payload: waitState });\n eventBus.dispatch(ModulesReadyEvent, waitState);\n }\n\n return true;\n }, [areModulesInitiallyReady, appRouterStore, eventBus, waitState]), true);\n\n // When modules are initially registered, the reducer action will never be dispatched, therefore the event would not be dispatched as well.\n // To ensure the bootstrapping events sequencing, the event is manually dispatched when the modules are initially registered.\n useExecuteOnce(useCallback(() => {\n if (isMswInitiallyReady) {\n appRouterStore.dispatch({ type: \"msw-ready\", payload: waitState });\n eventBus.dispatch(MswReadyEvent, waitState);\n }\n\n return true;\n }, [isMswInitiallyReady, appRouterStore, eventBus, waitState]), true);\n\n const [state, reactDispatch] = useReducer(reducer, initialState);\n\n const {\n areModulesRegistered: areModulesRegisteredValue,\n areModulesReady: areModulesReadyValue,\n isMswReady: isMswReadyValue\n } = state;\n\n // The dispatch proxy is strictly an utility allowing tests to mock the useReducer dispatch function. It's easier\n // than mocking the import from React.\n const dispatchProxy = useReducerDispatchProxy(reactDispatch);\n const dispatch = useEnhancedReducerDispatch(waitState, dispatchProxy);\n\n useModuleRegistrationStatusDispatcher(areModulesRegisteredValue, areModulesReadyValue, dispatch);\n useMswStatusDispatcher(isMswReadyValue, dispatch);\n useBootstrappingCompletedDispatcher(waitState, state);\n\n return [state, dispatch];\n}\n"],"names":["addLocalModuleRegistrationStatusChangedListener","getLocalModuleRegistrationStatus","removeLocalModuleRegistrationStatusChangedListener","useEventBus","useLogger","useRuntime","addRemoteModuleRegistrationStatusChangedListener","areModulesReady","areModulesRegistered","getRemoteModuleRegistrationStatus","removeRemoteModuleRegistrationStatusChangedListener","addMswStateChangedListener","isMswReady","removeMswStateChangedListener","useCallback","useEffect","useMemo","useReducer","useAppRouterStore","useExecuteOnce","isBootstrapping","ModulesRegisteredEvent","ModulesReadyEvent","MswReadyEvent","ActiveRouteIsPublicEvent","ActiveRouteIsProtectedEvent","PublicDataReadyEvent","ProtectedDataReadyEvent","PublicDataUpdatedEvent","ProtectedDataUpdatedEvent","DeferredRegistrationsUpdatedEvent","ApplicationBoostrappedEvent","reducer","state","action","newState","Date","Error","getAreModulesRegistered","localModuleStatus","remoteModuleStatus","getAreModulesReady","useModuleRegistrationStatusDispatcher","areModulesRegisteredValue","areModulesReadyValue","dispatch","logger","dispatchModulesRegistered","dispatchModulesReady","useMswStatusDispatcher","isMswReadyValue","dispatchMswReady","useBootstrappingCompletedDispatcher","waitState","eventBus","isBoostrapping","dispatchProxyFactory","__setAppReducerDispatchProxyFactory","factory","__clearAppReducerDispatchProxy","undefined","useReducerDispatchProxy","reactDispatch","useEnhancedReducerDispatch","reducerDispatch","appRouterStore","useAppRouterReducer","waitForPublicData","waitForProtectedData","runtime","isMswEnabled","areModulesInitiallyRegistered","areModulesInitiallyReady","isMswInitiallyReady","initialState","dispatchProxy"],"mappings":"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"}
|
package/dist/AppRouterStore.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Logger } from "@workleap/logging";
|
|
2
2
|
import type { AppRouterAction, AppRouterState } from "./AppRouterReducer.ts";
|
|
3
3
|
export type AppRouterStoreState = Omit<AppRouterState, "waitForMsw" | "waitForPublicData" | "waitForProtectedData">;
|
|
4
4
|
export type AppRouterStoreListenerFunction = (store: AppRouterStore, unsuscribe: () => void) => void;
|
|
5
5
|
export declare class AppRouterStore {
|
|
6
6
|
#private;
|
|
7
|
-
constructor(initialialState: AppRouterStoreState, logger:
|
|
7
|
+
constructor(initialialState: AppRouterStoreState, logger: Logger);
|
|
8
8
|
subscribe(listener: AppRouterStoreListenerFunction): () => void;
|
|
9
9
|
unsuscribe(listener: AppRouterStoreListenerFunction): void;
|
|
10
10
|
dispatch(action: AppRouterAction): void;
|
|
11
11
|
get state(): AppRouterStoreState;
|
|
12
12
|
}
|
|
13
|
-
export declare function createAppRouterStore(logger:
|
|
13
|
+
export declare function createAppRouterStore(logger: Logger): AppRouterStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRouterStore.js","sources":["webpack://@squide/firefly/./src/AppRouterStore.ts"],"sourcesContent":["// This file is a low cost port of the AppRouterReducer to a non-React store. It allows, non-React parts of the library to get\n// access to the state and ease the integration with third-party libraries such as the Platform Widgets.\n// Eventually, AppRouterReducer should be deprecated in favor of this new AppRouterStore.\n\nimport type {
|
|
1
|
+
{"version":3,"file":"AppRouterStore.js","sources":["webpack://@squide/firefly/./src/AppRouterStore.ts"],"sourcesContent":["// This file is a low cost port of the AppRouterReducer to a non-React store. It allows, non-React parts of the library to get\n// access to the state and ease the integration with third-party libraries such as the Platform Widgets.\n// Eventually, AppRouterReducer should be deprecated in favor of this new AppRouterStore.\n\nimport type { Logger } from \"@workleap/logging\";\nimport type { AppRouterAction, AppRouterState } from \"./AppRouterReducer.ts\";\n\nexport type AppRouterStoreState = Omit<AppRouterState, \"waitForMsw\" | \"waitForPublicData\" | \"waitForProtectedData\">;\n\nexport type AppRouterStoreListenerFunction = (store: AppRouterStore, unsuscribe: () => void) => void;\n\nexport class AppRouterStore {\n #state: AppRouterStoreState;\n\n readonly #listeners = new Set<AppRouterStoreListenerFunction>();\n readonly #logger: Logger;\n\n constructor(initialialState: AppRouterStoreState, logger: Logger) {\n this.#state = initialialState;\n this.#logger = logger;\n }\n\n subscribe(listener: AppRouterStoreListenerFunction) {\n this.#listeners.add(listener);\n\n return () => {\n this.unsuscribe(listener);\n };\n }\n\n unsuscribe(listener: AppRouterStoreListenerFunction) {\n this.#listeners.delete(listener);\n }\n\n dispatch(action: AppRouterAction) {\n const newState = this.#reducer({ ...this.#state }, action);\n\n this.#logger\n .withText(\"[squide] The AppRouterStore state has been updated to:\")\n .withObject(newState)\n .debug();\n\n this.#state = newState;\n\n // Creating a copy of the listeners in case some are removed during the looping.\n // To be honest, it might not be necessary, I simply don't know.\n new Set(this.#listeners).forEach(x => {\n x(this, () => {\n this.unsuscribe(x);\n });\n });\n }\n\n #reducer(state: AppRouterStoreState, action: AppRouterAction) {\n let newState = state;\n\n switch (action.type) {\n case \"modules-registered\": {\n newState = {\n ...newState,\n areModulesRegistered: true\n };\n\n break;\n }\n case \"modules-ready\": {\n newState = {\n ...newState,\n areModulesReady: true,\n // Will be set even if the app is not using deferred registrations.\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"msw-ready\": {\n newState = {\n ...newState,\n isMswReady: true\n };\n\n break;\n }\n case \"public-data-ready\": {\n newState = {\n ...newState,\n isPublicDataReady: true,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-ready\": {\n newState = {\n ...newState,\n isProtectedDataReady: true,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"public-data-updated\": {\n newState = {\n ...newState,\n publicDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"protected-data-updated\": {\n newState = {\n ...newState,\n protectedDataUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"deferred-registrations-updated\": {\n newState = {\n ...newState,\n deferredRegistrationsUpdatedAt: Date.now()\n };\n\n break;\n }\n case \"active-route-is-public\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"public\"\n };\n\n break;\n }\n case \"active-route-is-protected\": {\n newState = {\n ...newState,\n activeRouteVisibility: \"protected\"\n };\n\n break;\n }\n case \"is-unauthorized\": {\n newState = {\n ...newState,\n isUnauthorized: true\n };\n\n break;\n }\n default: {\n throw new Error(`[squide] The AppRouterStore state reducer doesn't support action type \"${action.type}\".`);\n }\n }\n\n return newState;\n }\n\n get state() {\n return this.#state;\n }\n}\n\nexport function createAppRouterStore(logger: Logger) {\n const initialState: AppRouterStoreState = {\n areModulesRegistered: false,\n areModulesReady: false,\n isMswReady: false,\n isPublicDataReady: false,\n isProtectedDataReady: false,\n activeRouteVisibility: \"unknown\",\n isUnauthorized: false\n };\n\n return new AppRouterStore(initialState, logger);\n}\n"],"names":["AppRouterStore","Set","initialialState","logger","listener","action","newState","x","state","Date","Error","createAppRouterStore","initialState"],"mappings":";;AAAA,8HAA8H;AAC9H,wGAAwG;AACxG,yFAAyF;AASlF,MAAMA;IACT,MAAM,CAAsB;IAEnB,UAAU,GAAG,IAAIC,MAAsC;IACvD,OAAO,CAAS;IAEzB,YAAYC,eAAoC,EAAEC,MAAc,CAAE;QAC9D,IAAI,CAAC,MAAM,GAAGD;QACd,IAAI,CAAC,OAAO,GAAGC;IACnB;IAEA,UAAUC,QAAwC,EAAE;QAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAACA;QAEpB,OAAO;YACH,IAAI,CAAC,UAAU,CAACA;QACpB;IACJ;IAEA,WAAWA,QAAwC,EAAE;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA;IAC3B;IAEA,SAASC,MAAuB,EAAE;QAC9B,MAAMC,WAAW,IAAI,CAAC,QAAQ,CAAC;YAAE,GAAG,IAAI,CAAC,MAAM;QAAC,GAAGD;QAEnD,IAAI,CAAC,OAAO,CACP,QAAQ,CAAC,0DACT,UAAU,CAACC,UACX,KAAK;QAEV,IAAI,CAAC,MAAM,GAAGA;QAEd,gFAAgF;QAChF,gEAAgE;QAChE,IAAIL,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,CAACM,CAAAA;YAC7BA,EAAE,IAAI,EAAE;gBACJ,IAAI,CAAC,UAAU,CAACA;YACpB;QACJ;IACJ;IAEA,QAAQ,CAACC,KAA0B,EAAEH,MAAuB;QACxD,IAAIC,WAAWE;QAEf,OAAQH,OAAO,IAAI;YACf,KAAK;gBAAsB;oBACvBC,WAAW;wBACP,GAAGA,QAAQ;wBACX,sBAAsB;oBAC1B;oBAEA;gBACJ;YACA,KAAK;gBAAiB;oBAClBA,WAAW;wBACP,GAAGA,QAAQ;wBACX,iBAAiB;wBACjB,mEAAmE;wBACnE,gCAAgCG,KAAK,GAAG;oBAC5C;oBAEA;gBACJ;YACA,KAAK;gBAAa;oBACdH,WAAW;wBACP,GAAGA,QAAQ;wBACX,YAAY;oBAChB;oBAEA;gBACJ;YACA,KAAK;gBAAqB;oBACtBA,WAAW;wBACP,GAAGA,QAAQ;wBACX,mBAAmB;wBACnB,qBAAqBG,KAAK,GAAG;oBACjC;oBAEA;gBACJ;YACA,KAAK;gBAAwB;oBACzBH,WAAW;wBACP,GAAGA,QAAQ;wBACX,sBAAsB;wBACtB,wBAAwBG,KAAK,GAAG;oBACpC;oBAEA;gBACJ;YACA,KAAK;gBAAuB;oBACxBH,WAAW;wBACP,GAAGA,QAAQ;wBACX,qBAAqBG,KAAK,GAAG;oBACjC;oBAEA;gBACJ;YACA,KAAK;gBAA0B;oBAC3BH,WAAW;wBACP,GAAGA,QAAQ;wBACX,wBAAwBG,KAAK,GAAG;oBACpC;oBAEA;gBACJ;YACA,KAAK;gBAAkC;oBACnCH,WAAW;wBACP,GAAGA,QAAQ;wBACX,gCAAgCG,KAAK,GAAG;oBAC5C;oBAEA;gBACJ;YACA,KAAK;gBAA0B;oBAC3BH,WAAW;wBACP,GAAGA,QAAQ;wBACX,uBAAuB;oBAC3B;oBAEA;gBACJ;YACA,KAAK;gBAA6B;oBAC9BA,WAAW;wBACP,GAAGA,QAAQ;wBACX,uBAAuB;oBAC3B;oBAEA;gBACJ;YACA,KAAK;gBAAmB;oBACpBA,WAAW;wBACP,GAAGA,QAAQ;wBACX,gBAAgB;oBACpB;oBAEA;gBACJ;YACA;gBAAS;oBACL,MAAM,IAAII,MAAM,CAAC,uEAAuE,EAAEL,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC7G;QACJ;QAEA,OAAOC;IACX;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,MAAM;IACtB;AACJ;AAEO,SAASK,qBAAqBR,MAAc;IAC/C,MAAMS,eAAoC;QACtC,sBAAsB;QACtB,iBAAiB;QACjB,YAAY;QACZ,mBAAmB;QACnB,sBAAsB;QACtB,uBAAuB;QACvB,gBAAgB;IACpB;IAEA,OAAO,IAAIZ,eAAeY,cAAcT;AAC5C"}
|
package/dist/FireflyRuntime.d.ts
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
|
-
import type { RegisterRouteOptions, RuntimeOptions } from "@squide/core";
|
|
2
|
-
import { ReactRouterRuntime, type Route } from "@squide/react-router";
|
|
1
|
+
import type { RegisterRouteOptions, RuntimeMethodOptions, RuntimeOptions } from "@squide/core";
|
|
2
|
+
import { type IReactRouterRuntime, ReactRouterRuntime, ReactRouterRuntimeScope, type Route } from "@squide/react-router";
|
|
3
|
+
import type { Logger } from "@workleap/logging";
|
|
3
4
|
import type { RequestHandler } from "msw";
|
|
4
5
|
import { type AppRouterStore } from "./AppRouterStore.ts";
|
|
5
6
|
export interface FireflyRuntimeOptions extends RuntimeOptions {
|
|
6
7
|
useMsw?: boolean;
|
|
7
8
|
}
|
|
8
|
-
export
|
|
9
|
-
|
|
9
|
+
export interface RegisterRequestHandlersOptions extends RuntimeMethodOptions {
|
|
10
|
+
}
|
|
11
|
+
export interface IFireflyRuntime extends IReactRouterRuntime {
|
|
12
|
+
registerRequestHandlers: (handlers: RequestHandler[]) => void;
|
|
13
|
+
get requestHandlers(): RequestHandler[];
|
|
14
|
+
get appRouterStore(): AppRouterStore;
|
|
15
|
+
get isMswEnabled(): boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class FireflyRuntime extends ReactRouterRuntime implements IFireflyRuntime {
|
|
18
|
+
protected _appRouterStore: AppRouterStore;
|
|
19
|
+
protected _useMsw: boolean;
|
|
10
20
|
constructor({ plugins, useMsw, ...options }?: FireflyRuntimeOptions);
|
|
11
|
-
registerRequestHandlers(handlers: RequestHandler[]): void;
|
|
21
|
+
registerRequestHandlers(handlers: RequestHandler[], options?: RegisterRequestHandlersOptions): void;
|
|
12
22
|
get requestHandlers(): RequestHandler[];
|
|
13
23
|
registerRoute(route: Route, options?: RegisterRouteOptions): void;
|
|
14
24
|
get appRouterStore(): AppRouterStore;
|
|
15
25
|
get isMswEnabled(): boolean;
|
|
26
|
+
startScope(logger: Logger): FireflyRuntime;
|
|
27
|
+
}
|
|
28
|
+
export declare class FireflyRuntimeScope<TRuntime extends FireflyRuntime = FireflyRuntime> extends ReactRouterRuntimeScope<TRuntime> implements IFireflyRuntime {
|
|
29
|
+
registerRequestHandlers(handlers: RequestHandler[], options?: RegisterRequestHandlersOptions): void;
|
|
30
|
+
get requestHandlers(): RequestHandler[];
|
|
31
|
+
get appRouterStore(): AppRouterStore;
|
|
32
|
+
get isMswEnabled(): boolean;
|
|
16
33
|
}
|
package/dist/FireflyRuntime.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MswPlugin, MswPluginName } from "@squide/msw";
|
|
2
|
-
import { ReactRouterRuntime } from "@squide/react-router";
|
|
2
|
+
import { ReactRouterRuntime, ReactRouterRuntimeScope } from "@squide/react-router";
|
|
3
3
|
import { getAreModulesRegistered } from "./AppRouterReducer.js";
|
|
4
4
|
import { createAppRouterStore } from "./AppRouterStore.js";
|
|
5
5
|
|
|
@@ -17,8 +17,8 @@ import { createAppRouterStore } from "./AppRouterStore.js";
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class FireflyRuntime extends ReactRouterRuntime {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
_appRouterStore;
|
|
21
|
+
_useMsw;
|
|
22
22
|
constructor({ plugins, useMsw, ...options } = {}){
|
|
23
23
|
if (useMsw) {
|
|
24
24
|
super({
|
|
@@ -28,17 +28,18 @@ class FireflyRuntime extends ReactRouterRuntime {
|
|
|
28
28
|
],
|
|
29
29
|
...options
|
|
30
30
|
});
|
|
31
|
-
this
|
|
31
|
+
this._useMsw = true;
|
|
32
32
|
} else {
|
|
33
33
|
super({
|
|
34
34
|
plugins,
|
|
35
35
|
...options
|
|
36
36
|
});
|
|
37
|
-
this
|
|
37
|
+
this._useMsw = false;
|
|
38
38
|
}
|
|
39
|
-
this
|
|
39
|
+
this._appRouterStore = createAppRouterStore(this._logger);
|
|
40
40
|
}
|
|
41
|
-
registerRequestHandlers(handlers) {
|
|
41
|
+
registerRequestHandlers(handlers, options = {}) {
|
|
42
|
+
const logger = this._getLogger(options);
|
|
42
43
|
const mswPlugin = this.getPlugin(MswPluginName);
|
|
43
44
|
if (!mswPlugin) {
|
|
44
45
|
throw new Error("[squide] Cannot register the provided MSW request handlers because the runtime hasn't been initialized with MSW. Did you instanciate the FireflyRuntime with the \"useMsw\" option?");
|
|
@@ -46,7 +47,9 @@ class FireflyRuntime extends ReactRouterRuntime {
|
|
|
46
47
|
if (getAreModulesRegistered()) {
|
|
47
48
|
throw new Error("[squide] Cannot register an MSW request handlers once the modules are registered. Are you trying to register an MSW request handler in a deferred registration function? Only navigation items can be registered in a deferred registration function.");
|
|
48
49
|
}
|
|
49
|
-
mswPlugin.registerRequestHandlers(handlers
|
|
50
|
+
mswPlugin.registerRequestHandlers(handlers, {
|
|
51
|
+
logger
|
|
52
|
+
});
|
|
50
53
|
}
|
|
51
54
|
// Must define a return type otherwise we get an "error TS2742: The inferred type of 'requestHandlers' cannot be named" error.
|
|
52
55
|
get requestHandlers() {
|
|
@@ -63,13 +66,33 @@ class FireflyRuntime extends ReactRouterRuntime {
|
|
|
63
66
|
super.registerRoute(route, options);
|
|
64
67
|
}
|
|
65
68
|
get appRouterStore() {
|
|
66
|
-
return this
|
|
69
|
+
return this._appRouterStore;
|
|
67
70
|
}
|
|
68
71
|
get isMswEnabled() {
|
|
69
|
-
return this
|
|
72
|
+
return this._useMsw;
|
|
73
|
+
}
|
|
74
|
+
startScope(logger) {
|
|
75
|
+
return new FireflyRuntimeScope(this, logger);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
class FireflyRuntimeScope extends ReactRouterRuntimeScope {
|
|
79
|
+
registerRequestHandlers(handlers, options = {}) {
|
|
80
|
+
this._runtime.registerRequestHandlers(handlers, {
|
|
81
|
+
...options,
|
|
82
|
+
logger: this._getLogger(options)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
get requestHandlers() {
|
|
86
|
+
return this._runtime.requestHandlers;
|
|
87
|
+
}
|
|
88
|
+
get appRouterStore() {
|
|
89
|
+
return this._runtime.appRouterStore;
|
|
90
|
+
}
|
|
91
|
+
get isMswEnabled() {
|
|
92
|
+
return this._runtime.isMswEnabled;
|
|
70
93
|
}
|
|
71
94
|
}
|
|
72
95
|
|
|
73
|
-
export { FireflyRuntime };
|
|
96
|
+
export { FireflyRuntime, FireflyRuntimeScope };
|
|
74
97
|
|
|
75
98
|
//# sourceMappingURL=FireflyRuntime.js.map
|