@squide/firefly 16.2.2 → 17.0.1

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 CHANGED
@@ -1,5 +1,30 @@
1
1
  # @squide/firefly
2
2
 
3
+ ## 17.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#590](https://github.com/workleap/wl-squide/pull/590) [`3803da9`](https://github.com/workleap/wl-squide/commit/3803da93cd8195f61df11de8ff3a062f4fff6b1a) Thanks [@claude](https://github.com/apps/claude)! - Updated dependencies to their latest versions.
8
+
9
+ - Updated dependencies [[`3803da9`](https://github.com/workleap/wl-squide/commit/3803da93cd8195f61df11de8ff3a062f4fff6b1a)]:
10
+ - @squide/launch-darkly@1.0.14
11
+ - @squide/react-router@8.1.20
12
+
13
+ ## 17.0.0
14
+
15
+ ### Major Changes
16
+
17
+ - [#586](https://github.com/workleap/wl-squide/pull/586) [`f26a67f`](https://github.com/workleap/wl-squide/commit/f26a67f80984c50aaf9b3b550a8e1f25edcbb43e) Thanks [@patricklafrance](https://github.com/patricklafrance)! - Added typed EventBus through module augmentation of EventMap.
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [[`f26a67f`](https://github.com/workleap/wl-squide/commit/f26a67f80984c50aaf9b3b550a8e1f25edcbb43e)]:
22
+ - @squide/core@7.0.0
23
+ - @squide/env-vars@1.4.21
24
+ - @squide/launch-darkly@1.0.13
25
+ - @squide/msw@4.0.19
26
+ - @squide/react-router@8.1.19
27
+
3
28
  ## 16.2.2
4
29
 
5
30
  ### Patch Changes
@@ -31,6 +31,23 @@ export declare const PublicDataUpdatedEvent = "squide-public-data-updated";
31
31
  export declare const ProtectedDataUpdatedEvent = "squide-protected-data-updated";
32
32
  export declare const DeferredRegistrationsUpdatedEvent = "squide-deferred-registrations-updated";
33
33
  export declare const ApplicationBoostrappedEvent = "squide-app-boostrapped";
34
+ declare module "@squide/core" {
35
+ interface EventMap {
36
+ "squide-modules-registered": AppRouterWaitState;
37
+ "squide-modules-ready": AppRouterWaitState;
38
+ "squide-msw-ready": AppRouterWaitState;
39
+ "squide-active-route-is-public": AppRouterWaitState;
40
+ "squide-active-route-is-protected": AppRouterWaitState;
41
+ "squide-public-data-ready": AppRouterWaitState;
42
+ "squide-protected-data-ready": AppRouterWaitState;
43
+ "squide-public-data-updated": AppRouterWaitState;
44
+ "squide-protected-data-updated": AppRouterWaitState;
45
+ "squide-deferred-registrations-updated": AppRouterWaitState;
46
+ "squide-feature-flags-updated": AppRouterWaitState;
47
+ "squide-is-unauthorized": AppRouterWaitState;
48
+ "squide-app-boostrapped": AppRouterWaitState;
49
+ }
50
+ }
34
51
  export interface AppRouterAction {
35
52
  type: AppRouterActionType;
36
53
  payload?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"AppRouterReducer.js","sources":["../src/AppRouterReducer.ts"],"sourcesContent":["import { useEventBus, useLogger, useRuntime } from \"@squide/core\";\nimport type { FeatureFlagSetSnapshotChangedListener } from \"@squide/launch-darkly\";\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 featureFlagsUpdatedAt?: 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 | \"feature-flags-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 areModulesRegistered: true,\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 \"feature-flags-updated\": {\n newState = {\n ...newState,\n featureFlagsUpdatedAt: 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 useModuleRegistrationStatusDispatcher(runtime: FireflyRuntime, areModulesRegisteredValue: boolean, areModulesReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchModulesRegistered = useCallback(() => {\n dispatch({ type: \"modules-registered\" });\n\n logger\n .withText(\"[squide] Modules are registered.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n const dispatchModulesReady = useCallback(() => {\n dispatch({ type: \"modules-ready\" });\n\n logger\n .withText(\"[squide] Modules are ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n return useEffect(() => {\n if (!areModulesRegisteredValue) {\n runtime.moduleManager.registerModulesRegisteredListener(dispatchModulesRegistered);\n }\n\n if (!areModulesReadyValue) {\n runtime.moduleManager.registerModulesReadyListener(dispatchModulesReady);\n }\n\n return () => {\n runtime.moduleManager.removeModulesRegisteredListener(dispatchModulesRegistered);\n runtime.moduleManager.removeModulesReadyListener(dispatchModulesReady);\n };\n }, [runtime, areModulesRegisteredValue, areModulesReadyValue, dispatchModulesRegistered, dispatchModulesReady]);\n}\n\nexport function useMswStatusDispatcher(runtime: FireflyRuntime, isMswReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchMswReady = useCallback(() => {\n dispatch({ type: \"msw-ready\" });\n\n logger\n .withText(\"[squide] MSW is ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n useEffect(() => {\n if (runtime.isMswEnabled) {\n if (!isMswReadyValue) {\n runtime.mswState.addMswReadyListener(dispatchMswReady);\n }\n\n return () => {\n runtime.mswState.removeMswReadyListener(dispatchMswReady);\n };\n }\n }, [runtime, isMswReadyValue, dispatchMswReady]);\n}\n\nexport function useFeatureFlagsUpdatedDispatcher(runtime: FireflyRuntime, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchFeatureFlagsUpdated = useCallback<FeatureFlagSetSnapshotChangedListener>(changes => {\n dispatch({ type: \"feature-flags-updated\" });\n\n logger\n .withText(\"[squide] Feature flags has been updated to:\")\n .withObject(changes)\n .debug();\n }, [dispatch, logger]);\n\n useEffect(() => {\n if (runtime.isLaunchDarklyEnabled) {\n runtime.featureFlagSetSnapshot.addSnapshotChangedListener(dispatchFeatureFlagsUpdated);\n\n return () => {\n runtime.featureFlagSetSnapshot.removeSnapshotChangedListener(dispatchFeatureFlagsUpdated);\n };\n }\n }, [runtime, dispatchFeatureFlagsUpdated]);\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 const areModulesInitiallyRegistered = runtime.moduleManager.getAreModulesRegistered();\n const areModulesInitiallyReady = runtime.moduleManager.getAreModulesReady();\n const isMswInitiallyReady = runtime.isMswEnabled ? runtime.mswState.isReady : false;\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(runtime, areModulesRegisteredValue, areModulesReadyValue, dispatch);\n useMswStatusDispatcher(runtime, isMswReadyValue, dispatch);\n useFeatureFlagsUpdatedDispatcher(runtime, dispatch);\n useBootstrappingCompletedDispatcher(waitState, state);\n\n return [state, dispatch];\n}\n"],"names":["useEventBus","useLogger","useRuntime","useCallback","useEffect","useMemo","useReducer","useAppRouterStore","useExecuteOnce","isBootstrapping","ModulesRegisteredEvent","ModulesReadyEvent","MswReadyEvent","ActiveRouteIsPublicEvent","ActiveRouteIsProtectedEvent","PublicDataReadyEvent","ProtectedDataReadyEvent","PublicDataUpdatedEvent","ProtectedDataUpdatedEvent","DeferredRegistrationsUpdatedEvent","ApplicationBoostrappedEvent","reducer","state","action","newState","Date","Error","useModuleRegistrationStatusDispatcher","runtime","areModulesRegisteredValue","areModulesReadyValue","dispatch","logger","dispatchModulesRegistered","dispatchModulesReady","useMswStatusDispatcher","isMswReadyValue","dispatchMswReady","useFeatureFlagsUpdatedDispatcher","dispatchFeatureFlagsUpdated","changes","useBootstrappingCompletedDispatcher","waitState","eventBus","isBoostrapping","dispatchProxyFactory","__setAppReducerDispatchProxyFactory","factory","__clearAppReducerDispatchProxy","undefined","useReducerDispatchProxy","reactDispatch","useEnhancedReducerDispatch","reducerDispatch","appRouterStore","useAppRouterReducer","waitForPublicData","waitForProtectedData","isMswEnabled","areModulesInitiallyRegistered","areModulesInitiallyReady","isMswInitiallyReady","initialState","dispatchProxy"],"mappings":"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"}
1
+ {"version":3,"file":"AppRouterReducer.js","sources":["../src/AppRouterReducer.ts"],"sourcesContent":["import { useEventBus, useLogger, useRuntime } from \"@squide/core\";\nimport type { FeatureFlagSetSnapshotChangedListener } from \"@squide/launch-darkly\";\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 featureFlagsUpdatedAt?: 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 | \"feature-flags-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\ndeclare module \"@squide/core\" {\n interface EventMap {\n \"squide-modules-registered\": AppRouterWaitState;\n \"squide-modules-ready\": AppRouterWaitState;\n \"squide-msw-ready\": AppRouterWaitState;\n \"squide-active-route-is-public\": AppRouterWaitState;\n \"squide-active-route-is-protected\": AppRouterWaitState;\n \"squide-public-data-ready\": AppRouterWaitState;\n \"squide-protected-data-ready\": AppRouterWaitState;\n \"squide-public-data-updated\": AppRouterWaitState;\n \"squide-protected-data-updated\": AppRouterWaitState;\n \"squide-deferred-registrations-updated\": AppRouterWaitState;\n \"squide-feature-flags-updated\": AppRouterWaitState;\n \"squide-is-unauthorized\": AppRouterWaitState;\n \"squide-app-boostrapped\": AppRouterWaitState;\n }\n}\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 areModulesRegistered: true,\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 \"feature-flags-updated\": {\n newState = {\n ...newState,\n featureFlagsUpdatedAt: 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 useModuleRegistrationStatusDispatcher(runtime: FireflyRuntime, areModulesRegisteredValue: boolean, areModulesReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchModulesRegistered = useCallback(() => {\n dispatch({ type: \"modules-registered\" });\n\n logger\n .withText(\"[squide] Modules are registered.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n const dispatchModulesReady = useCallback(() => {\n dispatch({ type: \"modules-ready\" });\n\n logger\n .withText(\"[squide] Modules are ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n return useEffect(() => {\n if (!areModulesRegisteredValue) {\n runtime.moduleManager.registerModulesRegisteredListener(dispatchModulesRegistered);\n }\n\n if (!areModulesReadyValue) {\n runtime.moduleManager.registerModulesReadyListener(dispatchModulesReady);\n }\n\n return () => {\n runtime.moduleManager.removeModulesRegisteredListener(dispatchModulesRegistered);\n runtime.moduleManager.removeModulesReadyListener(dispatchModulesReady);\n };\n }, [runtime, areModulesRegisteredValue, areModulesReadyValue, dispatchModulesRegistered, dispatchModulesReady]);\n}\n\nexport function useMswStatusDispatcher(runtime: FireflyRuntime, isMswReadyValue: boolean, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchMswReady = useCallback(() => {\n dispatch({ type: \"msw-ready\" });\n\n logger\n .withText(\"[squide] MSW is ready.\", {\n style: {\n color: \"green\"\n }\n })\n .information();\n }, [dispatch, logger]);\n\n useEffect(() => {\n if (runtime.isMswEnabled) {\n if (!isMswReadyValue) {\n runtime.mswState.addMswReadyListener(dispatchMswReady);\n }\n\n return () => {\n runtime.mswState.removeMswReadyListener(dispatchMswReady);\n };\n }\n }, [runtime, isMswReadyValue, dispatchMswReady]);\n}\n\nexport function useFeatureFlagsUpdatedDispatcher(runtime: FireflyRuntime, dispatch: AppRouterDispatch) {\n const logger = useLogger();\n\n const dispatchFeatureFlagsUpdated = useCallback<FeatureFlagSetSnapshotChangedListener>(changes => {\n dispatch({ type: \"feature-flags-updated\" });\n\n logger\n .withText(\"[squide] Feature flags has been updated to:\")\n .withObject(changes)\n .debug();\n }, [dispatch, logger]);\n\n useEffect(() => {\n if (runtime.isLaunchDarklyEnabled) {\n runtime.featureFlagSetSnapshot.addSnapshotChangedListener(dispatchFeatureFlagsUpdated);\n\n return () => {\n runtime.featureFlagSetSnapshot.removeSnapshotChangedListener(dispatchFeatureFlagsUpdated);\n };\n }\n }, [runtime, dispatchFeatureFlagsUpdated]);\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 const areModulesInitiallyRegistered = runtime.moduleManager.getAreModulesRegistered();\n const areModulesInitiallyReady = runtime.moduleManager.getAreModulesReady();\n const isMswInitiallyReady = runtime.isMswEnabled ? runtime.mswState.isReady : false;\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(runtime, areModulesRegisteredValue, areModulesReadyValue, dispatch);\n useMswStatusDispatcher(runtime, isMswReadyValue, dispatch);\n useFeatureFlagsUpdatedDispatcher(runtime, dispatch);\n useBootstrappingCompletedDispatcher(waitState, state);\n\n return [state, dispatch];\n}\n"],"names":["useEventBus","useLogger","useRuntime","useCallback","useEffect","useMemo","useReducer","useAppRouterStore","useExecuteOnce","isBootstrapping","ModulesRegisteredEvent","ModulesReadyEvent","MswReadyEvent","ActiveRouteIsPublicEvent","ActiveRouteIsProtectedEvent","PublicDataReadyEvent","ProtectedDataReadyEvent","PublicDataUpdatedEvent","ProtectedDataUpdatedEvent","DeferredRegistrationsUpdatedEvent","ApplicationBoostrappedEvent","reducer","state","action","newState","Date","Error","useModuleRegistrationStatusDispatcher","runtime","areModulesRegisteredValue","areModulesReadyValue","dispatch","logger","dispatchModulesRegistered","dispatchModulesReady","useMswStatusDispatcher","isMswReadyValue","dispatchMswReady","useFeatureFlagsUpdatedDispatcher","dispatchFeatureFlagsUpdated","changes","useBootstrappingCompletedDispatcher","waitState","eventBus","isBoostrapping","dispatchProxyFactory","__setAppReducerDispatchProxyFactory","factory","__clearAppReducerDispatchProxy","undefined","useReducerDispatchProxy","reactDispatch","useEnhancedReducerDispatch","reducerDispatch","appRouterStore","useAppRouterReducer","waitForPublicData","waitForProtectedData","isMswEnabled","areModulesInitiallyRegistered","areModulesInitiallyReady","isMswInitiallyReady","initialState","dispatchProxy"],"mappings":";;;;;;;;;;;AAAkE;AAEiB;AAExB;AACN;AACK;AAsC1D,wFAAwF;AACxF,8DAA8D;AACvD,MAAMU,sBAAsBA,GAAG,4BAA4B;AAC3D,MAAMC,iBAAiBA,GAAG,uBAAuB;AACjD,MAAMC,aAAaA,GAAG,mBAAmB;AACzC,MAAMC,wBAAwBA,GAAG,gCAAgC;AACjE,MAAMC,2BAA2BA,GAAG,mCAAmC;AACvE,MAAMC,oBAAoBA,GAAG,2BAA2B;AACxD,MAAMC,uBAAuBA,GAAG,8BAA8B;AAC9D,MAAMC,sBAAsBA,GAAG,6BAA6B;AAC5D,MAAMC,yBAAyBA,GAAG,gCAAgC;AAClE,MAAMC,iCAAiCA,GAAG,wCAAwC;AAClF,MAAMC,2BAA2BA,GAAG,yBAAyB;AA2BpE,SAASC,OAAOA,CAACC,KAAqB,EAAEC,MAAuB;IAC3D,IAAIC,WAAWF;IAEf,OAAQC,OAAO,IAAI;QACf,KAAK;YAAsB;gBACvBC,WAAW;oBACP,GAAGA,QAAQ;oBACX,sBAAsB;gBAC1B;gBAEA;YACJ;QACA,KAAK;YAAiB;gBAClBA,WAAW;oBACP,GAAGA,QAAQ;oBACX,sBAAsB;oBACtB,iBAAiB;oBACjB,mEAAmE;oBACnE,gCAAgCC,KAAK,GAAG;gBAC5C;gBAEA;YACJ;QACA,KAAK;YAAa;gBACdD,WAAW;oBACP,GAAGA,QAAQ;oBACX,YAAY;gBAChB;gBAEA;YACJ;QACA,KAAK;YAAqB;gBACtBA,WAAW;oBACP,GAAGA,QAAQ;oBACX,mBAAmB;oBACnB,qBAAqBC,KAAK,GAAG;gBACjC;gBAEA;YACJ;QACA,KAAK;YAAwB;gBACzBD,WAAW;oBACP,GAAGA,QAAQ;oBACX,sBAAsB;oBACtB,wBAAwBC,KAAK,GAAG;gBACpC;gBAEA;YACJ;QACA,KAAK;YAAuB;gBACxBD,WAAW;oBACP,GAAGA,QAAQ;oBACX,qBAAqBC,KAAK,GAAG;gBACjC;gBAEA;YACJ;QACA,KAAK;YAA0B;gBAC3BD,WAAW;oBACP,GAAGA,QAAQ;oBACX,wBAAwBC,KAAK,GAAG;gBACpC;gBAEA;YACJ;QACA,KAAK;YAAyB;gBAC1BD,WAAW;oBACP,GAAGA,QAAQ;oBACX,uBAAuBC,KAAK,GAAG;gBACnC;gBAEA;YACJ;QACA,KAAK;YAAkC;gBACnCD,WAAW;oBACP,GAAGA,QAAQ;oBACX,gCAAgCC,KAAK,GAAG;gBAC5C;gBAEA;YACJ;QACA,KAAK;YAA0B;gBAC3BD,WAAW;oBACP,GAAGA,QAAQ;oBACX,uBAAuB;gBAC3B;gBAEA;YACJ;QACA,KAAK;YAA6B;gBAC9BA,WAAW;oBACP,GAAGA,QAAQ;oBACX,uBAAuB;gBAC3B;gBAEA;YACJ;QACA,KAAK;YAAmB;gBACpBA,WAAW;oBACP,GAAGA,QAAQ;oBACX,gBAAgB;gBACpB;gBAEA;YACJ;QACA;YAAS;gBACL,MAAM,IAAIE,MAAM,CAAC,4EAA4E,EAAEH,OAAO,IAAI,CAAC,EAAE,CAAC;YAClH;IACJ;IAEA,OAAOC;AACX;AAEO,SAASG,qCAAqCA,CAACC,OAAuB,EAAEC,yBAAkC,EAAEC,oBAA6B,EAAEC,QAA2B;IACzK,MAAMC,SAAS/B,SAASA;IAExB,MAAMgC,4BAA4B9B,WAAWA,CAAC;QAC1C4B,SAAS;YAAE,MAAM;QAAqB;QAEtCC,OACK,QAAQ,CAAC,oCAAoC;YAC1C,OAAO;gBACH,OAAO;YACX;QACJ,GACC,WAAW;IACpB,GAAG;QAACD;QAAUC;KAAO;IAErB,MAAME,uBAAuB/B,WAAWA,CAAC;QACrC4B,SAAS;YAAE,MAAM;QAAgB;QAEjCC,OACK,QAAQ,CAAC,+BAA+B;YACrC,OAAO;gBACH,OAAO;YACX;QACJ,GACC,WAAW;IACpB,GAAG;QAACD;QAAUC;KAAO;IAErB,OAAO5B,SAASA,CAAC;QACb,IAAI,CAACyB,2BAA2B;YAC5BD,QAAQ,aAAa,CAAC,iCAAiC,CAACK;QAC5D;QAEA,IAAI,CAACH,sBAAsB;YACvBF,QAAQ,aAAa,CAAC,4BAA4B,CAACM;QACvD;QAEA,OAAO;YACHN,QAAQ,aAAa,CAAC,+BAA+B,CAACK;YACtDL,QAAQ,aAAa,CAAC,0BAA0B,CAACM;QACrD;IACJ,GAAG;QAACN;QAASC;QAA2BC;QAAsBG;QAA2BC;KAAqB;AAClH;AAEO,SAASC,sBAAsBA,CAACP,OAAuB,EAAEQ,eAAwB,EAAEL,QAA2B;IACjH,MAAMC,SAAS/B,SAASA;IAExB,MAAMoC,mBAAmBlC,WAAWA,CAAC;QACjC4B,SAAS;YAAE,MAAM;QAAY;QAE7BC,OACK,QAAQ,CAAC,0BAA0B;YAChC,OAAO;gBACH,OAAO;YACX;QACJ,GACC,WAAW;IACpB,GAAG;QAACD;QAAUC;KAAO;IAErB5B,SAASA,CAAC;QACN,IAAIwB,QAAQ,YAAY,EAAE;YACtB,IAAI,CAACQ,iBAAiB;gBAClBR,QAAQ,QAAQ,CAAC,mBAAmB,CAACS;YACzC;YAEA,OAAO;gBACHT,QAAQ,QAAQ,CAAC,sBAAsB,CAACS;YAC5C;QACJ;IACJ,GAAG;QAACT;QAASQ;QAAiBC;KAAiB;AACnD;AAEO,SAASC,gCAAgCA,CAACV,OAAuB,EAAEG,QAA2B;IACjG,MAAMC,SAAS/B,SAASA;IAExB,MAAMsC,8BAA8BpC,WAAWA,CAAwCqC,CAAAA;QACnFT,SAAS;YAAE,MAAM;QAAwB;QAEzCC,OACK,QAAQ,CAAC,+CACT,UAAU,CAACQ,SACX,KAAK;IACd,GAAG;QAACT;QAAUC;KAAO;IAErB5B,SAASA,CAAC;QACN,IAAIwB,QAAQ,qBAAqB,EAAE;YAC/BA,QAAQ,sBAAsB,CAAC,0BAA0B,CAACW;YAE1D,OAAO;gBACHX,QAAQ,sBAAsB,CAAC,6BAA6B,CAACW;YACjE;QACJ;IACJ,GAAG;QAACX;QAASW;KAA4B;AAC7C;AAEA,SAASE,mCAAmCA,CAACC,SAA6B,EAAEpB,KAAqB;IAC7F,MAAMqB,WAAW3C,WAAWA;IAE5B,MAAM6B,4BAA4BP,MAAM,oBAAoB;IAC5D,MAAMsB,iBAAiBnC,eAAeA,CAACa;IAEvCd,cAAcA,CAACL,WAAWA,CAAC;QACvB,IAAI0B,6BAA6B,CAACe,gBAAgB;YAC9CD,SAAS,QAAQ,CAACvB,2BAA2BA,EAAEsB;YAE/C,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACb;QAA2Be;QAAgBF;QAAWC;KAAS,GAAG;AAC1E;AAEA,IAAIE,oBAAoBA;AAExB,8CAA8C;AACvC,SAASC,mCAAmCA,CAACC,OAAgE;IAChHF,oBAAoBA,GAAGE;AAC3B;AAEA,8CAA8C;AACvC,SAASC,8BAA8BA;IAC1CH,oBAAoBA,GAAGI;AAC3B;AAEA,SAASC,uBAAuBA,CAACC,aAAgC;IAC7D,OAAO9C,OAAOA,CAAC;QACX,OAAOwC,oBAAoBA,GAAGA,oBAAoBA,CAACM,iBAAiBA;IACxE,GAAG;QAACA;KAAc;AACtB;AAEA,SAASC,0BAA0BA,CAACV,SAA6B,EAAEW,eAAkC;IACjG,MAAMrB,SAAS/B,SAASA;IACxB,MAAMqD,iBAAiB/C,iBAAiBA;IACxC,MAAMoC,WAAW3C,WAAWA;IAE5B,OAAOG,WAAWA,CAAC,CAACoB;QAChBS,OACK,QAAQ,CAAC,+EACT,UAAU,CAACT,QACX,KAAK;QAEV+B,eAAe,QAAQ,CAAC;YAAE,GAAG/B,MAAM;YAAE,SAASmB;QAAU;QACxDC,SAAS,QAAQ,CAAC,CAAC,OAAO,EAAEpB,OAAO,IAAI,EAAE,EAAEmB;QAE3CW,gBAAgB9B;IACpB,GAAG;QAACmB;QAAWW;QAAiBrB;QAAQsB;QAAgBX;KAAS;AACrE;AAEO,SAASY,mBAAmBA,CAACC,iBAA0B,EAAEC,oBAA6B;IACzF,MAAM7B,UAAU1B,UAAUA;IAC1B,MAAMyC,WAAW3C,WAAWA;IAC5B,MAAMsD,iBAAiB/C,iBAAiBA;IAExC,MAAMmD,eAAe9B,QAAQ,YAAY;IACzC,MAAM+B,gCAAgC/B,QAAQ,aAAa,CAAC,uBAAuB;IACnF,MAAMgC,2BAA2BhC,QAAQ,aAAa,CAAC,kBAAkB;IACzE,MAAMiC,sBAAsBjC,QAAQ,YAAY,GAAGA,QAAQ,QAAQ,CAAC,OAAO,GAAG;IAE9E,MAAMc,YAAYrC,OAAOA,CAAC,IAAO;YAC7B,YAAYqD;YACZF;YACAC;QACJ,IAAI;QAACC;QAAcF;QAAmBC;KAAqB;IAE3D,MAAMK,eAAezD,OAAOA,CAAC,IAAO;YAChC,YAAYqC,UAAU,UAAU;YAChC,mBAAmBA,UAAU,iBAAiB;YAC9C,sBAAsBA,UAAU,oBAAoB;YACpD,4HAA4H;YAC5H,sBAAsBiB;YACtB,iBAAiBC;YACjB,YAAYC;YACZ,mBAAmB;YACnB,sBAAsB;YACtB,uBAAuB;YACvB,gBAAgB;QACpB,IAA6B;QAACnB;QAAWiB;QAA+BC;QAA0BC;KAAoB;IAEtH,2IAA2I;IAC3I,6HAA6H;IAC7HrD,cAAcA,CAACL,WAAWA,CAAC;QACvB,IAAIwD,+BAA+B;YAC/BL,eAAe,QAAQ,CAAC;gBAAE,MAAM;gBAAsB,SAASZ;YAAU;YACzEC,SAAS,QAAQ,CAACjC,sBAAsBA,EAAEgC;QAC9C;QAEA,OAAO;IACX,GAAG;QAACiB;QAA+BL;QAAgBX;QAAUD;KAAU,GAAG;IAE1E,2IAA2I;IAC3I,6HAA6H;IAC7HlC,cAAcA,CAACL,WAAWA,CAAC;QACvB,IAAIyD,0BAA0B;YAC1BN,eAAe,QAAQ,CAAC;gBAAE,MAAM;gBAAiB,SAASZ;YAAU;YACpEC,SAAS,QAAQ,CAAChC,iBAAiBA,EAAE+B;QACzC;QAEA,OAAO;IACX,GAAG;QAACkB;QAA0BN;QAAgBX;QAAUD;KAAU,GAAG;IAErE,2IAA2I;IAC3I,6HAA6H;IAC7HlC,cAAcA,CAACL,WAAWA,CAAC;QACvB,IAAI0D,qBAAqB;YACrBP,eAAe,QAAQ,CAAC;gBAAE,MAAM;gBAAa,SAASZ;YAAU;YAChEC,SAAS,QAAQ,CAAC/B,aAAaA,EAAE8B;QACrC;QAEA,OAAO;IACX,GAAG;QAACmB;QAAqBP;QAAgBX;QAAUD;KAAU,GAAG;IAEhE,MAAM,CAACpB,OAAO6B,cAAc,GAAG7C,UAAUA,CAACe,OAAOA,EAAEyC;IAEnD,MAAM,EACF,sBAAsBjC,yBAAyB,EAC/C,iBAAiBC,oBAAoB,EACrC,YAAYM,eAAe,EAC9B,GAAGd;IAEJ,iHAAiH;IACjH,sCAAsC;IACtC,MAAMyC,gBAAgBb,uBAAuBA,CAACC;IAC9C,MAAMpB,WAAWqB,0BAA0BA,CAACV,WAAWqB;IAEvDpC,qCAAqCA,CAACC,SAASC,2BAA2BC,sBAAsBC;IAChGI,sBAAsBA,CAACP,SAASQ,iBAAiBL;IACjDO,gCAAgCA,CAACV,SAASG;IAC1CU,mCAAmCA,CAACC,WAAWpB;IAE/C,OAAO;QAACA;QAAOS;KAAS;AAC5B"}
@@ -1,10 +1,10 @@
1
1
  import type { Span } from "@opentelemetry/api";
2
- import { type AddListenerOptions, type EventCallbackFunction, type EventName } from "@squide/core";
2
+ import { type AddListenerOptions, type EventCallbackFunction, type EventMap, type EventMapKey } from "@squide/core";
3
3
  import type { FireflyRuntime } from "../FireflyRuntime.tsx";
4
4
  export interface AddProtectedListenerOptions extends AddListenerOptions {
5
5
  onError?: (error: unknown) => void;
6
6
  }
7
- export declare function addProtectedListener(runtime: FireflyRuntime, eventName: EventName, callback: EventCallbackFunction, options?: AddProtectedListenerOptions): void;
7
+ export declare function addProtectedListener<K extends EventMapKey>(runtime: FireflyRuntime, eventName: K, callback: EventCallbackFunction<EventMap[K]>, options?: AddProtectedListenerOptions): void;
8
8
  export type GetSpanFunction = () => Span;
9
9
  export type HoneycombTrackingUnmanagedErrorHandler = (error: unknown) => void;
10
10
  export declare function reduceDataFetchEvents(runtime: FireflyRuntime, onDataFetchStarted: () => void, onDataReady: () => void, onPublicDataFetchStarted: () => void, onPublicDataReady: () => void, onProtectedDataFetchStarted: () => void, onProtectedDataReady: () => void, onDataFetchFailed: (queriesErrors: Error[]) => void, onUnmanagedError: (error: unknown) => void): void;
@@ -27,11 +27,11 @@ import { endActiveSpan, startActiveChildSpan, startChildSpan, startSpan, traceEr
27
27
 
28
28
 
29
29
  function addProtectedListener(runtime, eventName, callback, options) {
30
- const protectedCallback = (...args)=>{
30
+ const protectedCallback = (data)=>{
31
31
  try {
32
- callback(...args);
32
+ callback(data);
33
33
  } catch (error) {
34
- runtime.logger.withText(`[squide] An unmanaged error occurred while handling event "${eventName.toString()}" for Honeycomb instrumentation:`).withError(error).error();
34
+ runtime.logger.withText(`[squide] An unmanaged error occurred while handling event "${String(eventName)}" for Honeycomb instrumentation:`).withError(error).error();
35
35
  }
36
36
  };
37
37
  runtime.eventBus.addListener(eventName, protectedCallback, options);
@@ -95,7 +95,7 @@ function reduceDataFetchEvents(runtime, onDataFetchStarted, onDataReady, onPubli
95
95
  const handleDataFetchFailed = (payload)=>{
96
96
  if (dataFetchState !== "data-fetch-failed") {
97
97
  dataFetchState = "data-fetch-failed";
98
- onDataFetchFailed(payload);
98
+ onDataFetchFailed(payload ?? []);
99
99
  }
100
100
  };
101
101
  addProtectedListener(runtime, PublicDataFetchFailedEvent, handleDataFetchFailed, {
@@ -166,7 +166,7 @@ function registerTrackingListeners(runtime) {
166
166
  });
167
167
  addProtectedListener(runtime, LocalModulesRegistrationStartedEvent, (payload)=>{
168
168
  const attributes = {
169
- "app.squide.module_count": payload.moduleCount
169
+ "app.squide.module_count": payload?.moduleCount
170
170
  };
171
171
  if (bootstrappingSpan) {
172
172
  bootstrappingSpan.addEvent("local-module-registration-started", attributes);
@@ -184,7 +184,7 @@ function registerTrackingListeners(runtime) {
184
184
  addProtectedListener(runtime, LocalModulesRegistrationCompletedEvent, (payload)=>{
185
185
  if (bootstrappingSpan) {
186
186
  bootstrappingSpan.addEvent("local-module-registration-completed", {
187
- "app.squide.module_count": payload.moduleCount
187
+ "app.squide.module_count": payload?.moduleCount
188
188
  });
189
189
  }
190
190
  if (localModuleRegistrationSpan) {
@@ -196,16 +196,15 @@ function registerTrackingListeners(runtime) {
196
196
  });
197
197
  // Can occur multiple times.
198
198
  addProtectedListener(runtime, LocalModuleRegistrationFailedEvent, (payload)=>{
199
- const registrationError = payload;
200
199
  if (localModuleRegistrationSpan) {
201
- traceError(localModuleRegistrationSpan, registrationError);
200
+ traceError(localModuleRegistrationSpan, payload);
202
201
  }
203
202
  }, {
204
203
  onError: handleUnmanagedError
205
204
  });
206
205
  addProtectedListener(runtime, LocalModulesDeferredRegistrationStartedEvent, (payload)=>{
207
206
  const attributes = {
208
- "app.squide.registration_count": payload.registrationCount
207
+ "app.squide.registration_count": payload?.registrationCount
209
208
  };
210
209
  if (bootstrappingSpan) {
211
210
  bootstrappingSpan.addEvent("local-module-deferred-registration-started", attributes);
@@ -223,7 +222,7 @@ function registerTrackingListeners(runtime) {
223
222
  addProtectedListener(runtime, LocalModulesDeferredRegistrationCompletedEvent, (payload)=>{
224
223
  if (bootstrappingSpan) {
225
224
  bootstrappingSpan.addEvent("local-module-deferred-registration-completed", {
226
- "app.squide.registration_count": payload.registrationCount
225
+ "app.squide.registration_count": payload?.registrationCount
227
226
  });
228
227
  }
229
228
  if (localModuleDeferredRegistrationSpan) {
@@ -235,9 +234,8 @@ function registerTrackingListeners(runtime) {
235
234
  });
236
235
  // Can occur multiple times.
237
236
  addProtectedListener(runtime, LocalModuleDeferredRegistrationFailedEvent, (payload)=>{
238
- const registrationError = payload;
239
237
  if (localModuleDeferredRegistrationSpan) {
240
- traceError(localModuleRegistrationSpan, registrationError);
238
+ traceError(localModuleRegistrationSpan, payload);
241
239
  }
242
240
  }, {
243
241
  onError: handleUnmanagedError
@@ -325,7 +323,7 @@ function registerTrackingListeners(runtime) {
325
323
  // Can occur multiple times.
326
324
  addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateStartedEvent, (payload)=>{
327
325
  const attributes = {
328
- "app.squide.registration_count": payload.registrationCount
326
+ "app.squide.registration_count": payload?.registrationCount
329
327
  };
330
328
  if (deferredRegistrationsUpdateSpan) {
331
329
  deferredRegistrationsUpdateSpan.addEvent("local-module-deferred-registrations-update-started", attributes);
@@ -348,7 +346,7 @@ function registerTrackingListeners(runtime) {
348
346
  addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateCompletedEvent, (payload)=>{
349
347
  if (deferredRegistrationsUpdateSpan) {
350
348
  deferredRegistrationsUpdateSpan.addEvent("local-module-deferred-registrations-update-completed", {
351
- "app.squide.registration_count": payload.registrationCount
349
+ "app.squide.registration_count": payload?.registrationCount
352
350
  });
353
351
  }
354
352
  if (localModuleDeferredRegistrationsUpdateSpan) {
@@ -359,9 +357,8 @@ function registerTrackingListeners(runtime) {
359
357
  });
360
358
  // Can occur multiple times.
361
359
  addProtectedListener(runtime, LocalModuleDeferredRegistrationUpdateFailedEvent, (payload)=>{
362
- const registrationError = payload;
363
360
  if (localModuleDeferredRegistrationsUpdateSpan) {
364
- traceError(localModuleDeferredRegistrationsUpdateSpan.instance, registrationError);
361
+ traceError(localModuleDeferredRegistrationsUpdateSpan.instance, payload);
365
362
  }
366
363
  }, {
367
364
  onError: handleUnmanagedError
@@ -1 +1 @@
1
- {"version":3,"file":"honeycomb/registerHoneycombInstrumentation.js","sources":["../../src/honeycomb/registerHoneycombInstrumentation.ts"],"sourcesContent":["import type { Span } from \"@opentelemetry/api\";\nimport {\n type AddListenerOptions,\n type EventCallbackFunction,\n type EventName,\n LocalModuleDeferredRegistrationFailedEvent,\n LocalModuleDeferredRegistrationUpdateFailedEvent,\n LocalModuleRegistrationFailedEvent,\n LocalModulesDeferredRegistrationCompletedEvent,\n type LocalModulesDeferredRegistrationCompletedEventPayload,\n LocalModulesDeferredRegistrationStartedEvent,\n type LocalModulesDeferredRegistrationStartedEventPayload,\n LocalModulesDeferredRegistrationsUpdateCompletedEvent,\n type LocalModulesDeferredRegistrationsUpdateCompletedEventPayload,\n LocalModulesDeferredRegistrationsUpdateStartedEvent,\n type LocalModulesDeferredRegistrationsUpdateStartedEventPayload,\n LocalModulesRegistrationCompletedEvent,\n type LocalModulesRegistrationCompletedEventPayload,\n LocalModulesRegistrationStartedEvent,\n type LocalModulesRegistrationStartedEventPayload,\n type ModuleRegistrationError\n} from \"@squide/core\";\nimport { ApplicationBoostrappedEvent, type AppRouterWaitState, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, PublicDataReadyEvent } from \"../AppRouterReducer.ts\";\nimport { FireflyPlugin } from \"../FireflyPlugin.ts\";\nimport type { FireflyRuntime } from \"../FireflyRuntime.tsx\";\nimport { ApplicationBootstrappingStartedEvent } from \"../initializeFirefly.ts\";\nimport { ProtectedDataFetchFailedEvent, ProtectedDataFetchStartedEvent } from \"../useProtectedDataQueries.ts\";\nimport { PublicDataFetchFailedEvent, PublicDataFetchStartedEvent } from \"../usePublicDataQueries.ts\";\nimport { DeferredRegistrationsUpdateCompletedEvent, DeferredRegistrationsUpdateStartedEvent } from \"../useUpdateDeferredRegistrations.ts\";\nimport { type ActiveSpan, createOverrideFetchRequestSpanWithActiveSpanContext, registerActiveSpanStack } from \"./activeSpan.ts\";\nimport { getTracer } from \"./tracer.ts\";\nimport { endActiveSpan, startActiveChildSpan, startChildSpan, startSpan, traceError } from \"./utils.ts\";\n\n// TIPS:\n// To query those traces in Honeycomb, use the following query filter:\n// \"root.name = squide-bootstrapping\" and\n// \"root.name = squide-deferred-registrations-update\".\n\nexport interface AddProtectedListenerOptions extends AddListenerOptions {\n onError?: (error: unknown) => void;\n}\n\nexport function addProtectedListener(runtime: FireflyRuntime, eventName: EventName, callback: EventCallbackFunction, options?: AddProtectedListenerOptions) {\n const protectedCallback = (...args: unknown[]) => {\n try {\n callback(...args);\n } catch (error: unknown) {\n runtime.logger\n .withText(`[squide] An unmanaged error occurred while handling event \"${eventName.toString()}\" for Honeycomb instrumentation:`)\n .withError(error as Error)\n .error();\n }\n };\n\n runtime.eventBus.addListener(eventName, protectedCallback, options);\n}\n\nexport type GetSpanFunction = () => Span;\nexport type HoneycombTrackingUnmanagedErrorHandler = (error: unknown) => void;\n\ntype DataFetchState = \"none\" | \"fetching-data\" | \"public-data-ready\" | \"protected-data-ready\" | \"data-ready\" | \"data-fetch-failed\";\n\nexport function reduceDataFetchEvents(\n runtime: FireflyRuntime,\n onDataFetchStarted: () => void,\n onDataReady: () => void,\n onPublicDataFetchStarted: () => void,\n onPublicDataReady: () => void,\n onProtectedDataFetchStarted: () => void,\n onProtectedDataReady: () => void,\n onDataFetchFailed: (queriesErrors: Error[]) => void,\n onUnmanagedError: (error: unknown) => void\n) {\n let dataFetchState: DataFetchState = \"none\";\n\n addProtectedListener(runtime, PublicDataFetchStartedEvent, () => {\n if (dataFetchState === \"none\") {\n dataFetchState = \"fetching-data\";\n onDataFetchStarted();\n }\n\n onPublicDataFetchStarted();\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, PublicDataReadyEvent, payload => {\n onPublicDataReady();\n\n if (dataFetchState === \"fetching-data\") {\n if (payload && !(payload as AppRouterWaitState).waitForProtectedData) {\n dataFetchState = \"data-ready\";\n onDataReady();\n } else {\n dataFetchState = \"public-data-ready\";\n }\n } else if (dataFetchState === \"protected-data-ready\") {\n dataFetchState = \"data-ready\";\n onDataReady();\n }\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataFetchStartedEvent, () => {\n if (dataFetchState === \"none\") {\n dataFetchState = \"fetching-data\";\n onDataFetchStarted();\n }\n\n onProtectedDataFetchStarted();\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataReadyEvent, payload => {\n onProtectedDataReady();\n\n if (dataFetchState === \"fetching-data\") {\n if (payload && !(payload as AppRouterWaitState).waitForPublicData) {\n dataFetchState = \"data-ready\";\n onDataReady();\n } else {\n dataFetchState = \"protected-data-ready\";\n }\n } else if (dataFetchState === \"public-data-ready\") {\n dataFetchState = \"data-ready\";\n onDataReady();\n }\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n const handleDataFetchFailed = (payload: unknown) => {\n if (dataFetchState !== \"data-fetch-failed\") {\n dataFetchState = \"data-fetch-failed\";\n\n onDataFetchFailed(payload as Error[]);\n }\n };\n\n addProtectedListener(runtime, PublicDataFetchFailedEvent, handleDataFetchFailed, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataFetchFailedEvent, handleDataFetchFailed, {\n once: true,\n onError: onUnmanagedError\n });\n}\n\nfunction registerTrackingListeners(runtime: FireflyRuntime) {\n let bootstrappingSpan: Span;\n let bootstrappingSpanHasEnded: boolean = false;\n let localModuleRegistrationSpan: Span;\n let localModuleDeferredRegistrationSpan: Span;\n let dataFetchSpan: ActiveSpan;\n let deferredRegistrationsUpdateSpan: Span;\n let localModuleDeferredRegistrationsUpdateSpan: ActiveSpan;\n\n const pluginsUnmanagedErrorHandlers: HoneycombTrackingUnmanagedErrorHandler[] = [];\n\n const handleUnmanagedError = (error: unknown) => {\n if (bootstrappingSpan && !bootstrappingSpanHasEnded) {\n traceError(bootstrappingSpan, error as Error);\n\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n\n if (localModuleRegistrationSpan) {\n localModuleRegistrationSpan.end();\n }\n\n if (localModuleDeferredRegistrationSpan) {\n localModuleDeferredRegistrationSpan.end();\n }\n\n if (dataFetchSpan) {\n dataFetchSpan.instance.end();\n }\n\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.end();\n }\n\n if (localModuleDeferredRegistrationsUpdateSpan) {\n localModuleDeferredRegistrationsUpdateSpan.instance.end();\n }\n\n pluginsUnmanagedErrorHandlers.forEach(x => {\n x(error);\n });\n };\n\n addProtectedListener(runtime, ApplicationBootstrappingStartedEvent, () => {\n bootstrappingSpan = startSpan((options, context) => getTracer().startSpan(\"squide-bootstrapping\", options, context));\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, ApplicationBoostrappedEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, MswReadyEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"msw-ready\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesRegistrationStartedEvent, (payload: unknown) => {\n const attributes = {\n \"app.squide.module_count\": (payload as LocalModulesRegistrationStartedEventPayload).moduleCount\n };\n\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-registration-started\", attributes);\n }\n\n localModuleRegistrationSpan = startChildSpan(bootstrappingSpan, (options, context) => {\n return getTracer().startSpan(\"local-module-registration\", { ...options, attributes }, context);\n });\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesRegistrationCompletedEvent, (payload: unknown) => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-registration-completed\", {\n \"app.squide.module_count\": (payload as LocalModulesRegistrationCompletedEventPayload).moduleCount\n });\n }\n\n if (localModuleRegistrationSpan) {\n localModuleRegistrationSpan.end();\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleRegistrationFailedEvent, (payload: unknown) => {\n const registrationError = payload as ModuleRegistrationError;\n\n if (localModuleRegistrationSpan) {\n traceError(localModuleRegistrationSpan, registrationError);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesDeferredRegistrationStartedEvent, (payload: unknown) => {\n const attributes = {\n \"app.squide.registration_count\": (payload as LocalModulesDeferredRegistrationStartedEventPayload).registrationCount\n };\n\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-deferred-registration-started\", attributes);\n }\n\n localModuleDeferredRegistrationSpan = startChildSpan(bootstrappingSpan, (options, context) => {\n return getTracer().startSpan(\"local-module-deferred-registration\", { ...options, attributes }, context);\n });\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesDeferredRegistrationCompletedEvent, (payload: unknown) => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-deferred-registration-completed\", {\n \"app.squide.registration_count\": (payload as LocalModulesDeferredRegistrationCompletedEventPayload).registrationCount\n });\n }\n\n if (localModuleDeferredRegistrationSpan) {\n localModuleDeferredRegistrationSpan.end();\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleDeferredRegistrationFailedEvent, (payload: unknown) => {\n const registrationError = payload as ModuleRegistrationError;\n\n if (localModuleDeferredRegistrationSpan) {\n traceError(localModuleRegistrationSpan, registrationError);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n const handleFetchDataStarted = () => {\n dataFetchSpan = startActiveChildSpan(bootstrappingSpan, (options, context) => {\n const name = \"data-fetch\";\n const span = getTracer().startSpan(name, options, context);\n\n return {\n name,\n span\n };\n });\n };\n\n const handleDataReady = () => {\n if (dataFetchSpan) {\n endActiveSpan(dataFetchSpan);\n }\n };\n\n const handlePublicDataFetchStarted = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"public-data-fetch-started\");\n }\n };\n\n const handlePublicDataReady = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"public-data-ready\");\n }\n };\n\n const handleProtectedDataFetchStarted = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"protected-data-fetch-started\");\n }\n };\n\n const handleProtectedDataReady = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"protected-data-ready\");\n }\n };\n\n const handleDataFetchFailed = (queriesErrors: Error[]) => {\n if (dataFetchSpan) {\n queriesErrors.forEach(x => {\n traceError(dataFetchSpan.instance, x);\n });\n\n endActiveSpan(dataFetchSpan);\n\n // Global data fetch errors are unmanaged, which mean the host application bootstrapping flow\n // will be aborted and a react-router error boundary will be rendered.\n if (bootstrappingSpan) {\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n }\n };\n\n reduceDataFetchEvents(\n runtime,\n handleFetchDataStarted,\n handleDataReady,\n handlePublicDataFetchStarted,\n handlePublicDataReady,\n handleProtectedDataFetchStarted,\n handleProtectedDataReady,\n handleDataFetchFailed,\n handleUnmanagedError\n );\n\n addProtectedListener(runtime, ModulesRegisteredEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"modules-registered\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, ModulesReadyEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"modules-ready\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, DeferredRegistrationsUpdateStartedEvent, () => {\n deferredRegistrationsUpdateSpan = startSpan((options, context) => getTracer().startSpan(\"squide-deferred-registrations-update\", options, context));\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, DeferredRegistrationsUpdateCompletedEvent, () => {\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.end();\n }\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateStartedEvent, (payload: unknown) => {\n const attributes = {\n \"app.squide.registration_count\": (payload as LocalModulesDeferredRegistrationsUpdateStartedEventPayload).registrationCount\n };\n\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.addEvent(\"local-module-deferred-registrations-update-started\", attributes);\n }\n\n localModuleDeferredRegistrationsUpdateSpan = startActiveChildSpan(deferredRegistrationsUpdateSpan, (options, context) => {\n const name = \"local-module-deferred-registrations-update\";\n\n const span = getTracer().startSpan(name, {\n attributes,\n ...options\n }, context);\n\n return {\n name,\n span\n };\n });\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateCompletedEvent, (payload: unknown) => {\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.addEvent(\"local-module-deferred-registrations-update-completed\", {\n \"app.squide.registration_count\": (payload as LocalModulesDeferredRegistrationsUpdateCompletedEventPayload).registrationCount\n });\n }\n\n if (localModuleDeferredRegistrationsUpdateSpan) {\n endActiveSpan(localModuleDeferredRegistrationsUpdateSpan);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleDeferredRegistrationUpdateFailedEvent, (payload: unknown) => {\n const registrationError = payload as ModuleRegistrationError;\n\n if (localModuleDeferredRegistrationsUpdateSpan) {\n traceError(localModuleDeferredRegistrationsUpdateSpan.instance, registrationError);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n const getBootstrappingSpan: GetSpanFunction = () => bootstrappingSpan;\n const getDeferredRegistrationsUpdateSpan: GetSpanFunction = () => deferredRegistrationsUpdateSpan;\n\n const handlePluginUnmanagedError: HoneycombTrackingUnmanagedErrorHandler = (error: unknown) => {\n handleUnmanagedError(error);\n };\n\n // Register plugins specific handlers for Honeycomb telemetry.\n runtime.plugins.forEach(x => {\n const plugin = x as FireflyPlugin;\n\n if (plugin.registerHoneycombTrackingListeners) {\n const unmanagedErrorHandler = plugin.registerHoneycombTrackingListeners(\n getBootstrappingSpan,\n getDeferredRegistrationsUpdateSpan,\n handlePluginUnmanagedError\n );\n\n pluginsUnmanagedErrorHandlers.push(unmanagedErrorHandler);\n }\n });\n}\n\nexport function registerHoneycombInstrumentation(runtime: FireflyRuntime) {\n try {\n registerActiveSpanStack();\n\n // Dynamically registering this request hook function to nest the HTTP requests\n // of squide bootstrapping under the appropriate Honeycomb span.\n runtime.honeycombInstrumentationClient?.registerFetchRequestHook(createOverrideFetchRequestSpanWithActiveSpanContext(runtime.logger));\n\n registerTrackingListeners(runtime);\n\n runtime.logger.information(\"[squide] Honeycomb instrumentation is registered.\");\n } catch (error: unknown) {\n runtime.logger\n .withText(\"[squide] An error occurred while registering Honeycomb instrumentation:\")\n .withError(error as Error)\n .error();\n }\n}\n"],"names":["LocalModuleDeferredRegistrationFailedEvent","LocalModuleDeferredRegistrationUpdateFailedEvent","LocalModuleRegistrationFailedEvent","LocalModulesDeferredRegistrationCompletedEvent","LocalModulesDeferredRegistrationStartedEvent","LocalModulesDeferredRegistrationsUpdateCompletedEvent","LocalModulesDeferredRegistrationsUpdateStartedEvent","LocalModulesRegistrationCompletedEvent","LocalModulesRegistrationStartedEvent","ApplicationBoostrappedEvent","ModulesReadyEvent","ModulesRegisteredEvent","MswReadyEvent","ProtectedDataReadyEvent","PublicDataReadyEvent","ApplicationBootstrappingStartedEvent","ProtectedDataFetchFailedEvent","ProtectedDataFetchStartedEvent","PublicDataFetchFailedEvent","PublicDataFetchStartedEvent","DeferredRegistrationsUpdateCompletedEvent","DeferredRegistrationsUpdateStartedEvent","createOverrideFetchRequestSpanWithActiveSpanContext","registerActiveSpanStack","getTracer","endActiveSpan","startActiveChildSpan","startChildSpan","startSpan","traceError","addProtectedListener","runtime","eventName","callback","options","protectedCallback","args","error","reduceDataFetchEvents","onDataFetchStarted","onDataReady","onPublicDataFetchStarted","onPublicDataReady","onProtectedDataFetchStarted","onProtectedDataReady","onDataFetchFailed","onUnmanagedError","dataFetchState","payload","handleDataFetchFailed","registerTrackingListeners","bootstrappingSpan","bootstrappingSpanHasEnded","localModuleRegistrationSpan","localModuleDeferredRegistrationSpan","dataFetchSpan","deferredRegistrationsUpdateSpan","localModuleDeferredRegistrationsUpdateSpan","pluginsUnmanagedErrorHandlers","handleUnmanagedError","x","context","attributes","registrationError","handleFetchDataStarted","name","span","handleDataReady","handlePublicDataFetchStarted","handlePublicDataReady","handleProtectedDataFetchStarted","handleProtectedDataReady","queriesErrors","getBootstrappingSpan","getDeferredRegistrationsUpdateSpan","handlePluginUnmanagedError","plugin","unmanagedErrorHandler","registerHoneycombInstrumentation"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBsB;AACiL;AAGxH;AAC+B;AACT;AACqC;AACV;AACxF;AACgE;AAWjG,SAAS8B,oBAAoBA,CAACC,OAAuB,EAAEC,SAAoB,EAAEC,QAA+B,EAAEC,OAAqC;IACtJ,MAAMC,oBAAoB,CAAC,GAAGC;QAC1B,IAAI;YACAH,YAAYG;QAChB,EAAE,OAAOC,OAAgB;YACrBN,QAAQ,MAAM,CACT,QAAQ,CAAC,CAAC,2DAA2D,EAAEC,UAAU,QAAQ,GAAG,gCAAgC,CAAC,EAC7H,SAAS,CAACK,OACV,KAAK;QACd;IACJ;IAEAN,QAAQ,QAAQ,CAAC,WAAW,CAACC,WAAWG,mBAAmBD;AAC/D;AAOO,SAASI,qBAAqBA,CACjCP,OAAuB,EACvBQ,kBAA8B,EAC9BC,WAAuB,EACvBC,wBAAoC,EACpCC,iBAA6B,EAC7BC,2BAAuC,EACvCC,oBAAgC,EAChCC,iBAAmD,EACnDC,gBAA0C;IAE1C,IAAIC,iBAAiC;IAErCjB,oBAAoBA,CAACC,SAASZ,2BAA2BA,EAAE;QACvD,IAAI4B,mBAAmB,QAAQ;YAC3BA,iBAAiB;YACjBR;QACJ;QAEAE;IACJ,GAAG;QACC,MAAM;QACN,SAASK;IACb;IAEAhB,oBAAoBA,CAACC,SAASjB,oBAAoBA,EAAEkC,CAAAA;QAChDN;QAEA,IAAIK,mBAAmB,iBAAiB;YACpC,IAAIC,WAAW,CAAEA,QAA+B,oBAAoB,EAAE;gBAClED,iBAAiB;gBACjBP;YACJ,OAAO;gBACHO,iBAAiB;YACrB;QACJ,OAAO,IAAIA,mBAAmB,wBAAwB;YAClDA,iBAAiB;YACjBP;QACJ;IACJ,GAAG;QACC,MAAM;QACN,SAASM;IACb;IAEAhB,oBAAoBA,CAACC,SAASd,8BAA8BA,EAAE;QAC1D,IAAI8B,mBAAmB,QAAQ;YAC3BA,iBAAiB;YACjBR;QACJ;QAEAI;IACJ,GAAG;QACC,MAAM;QACN,SAASG;IACb;IAEAhB,oBAAoBA,CAACC,SAASlB,uBAAuBA,EAAEmC,CAAAA;QACnDJ;QAEA,IAAIG,mBAAmB,iBAAiB;YACpC,IAAIC,WAAW,CAAEA,QAA+B,iBAAiB,EAAE;gBAC/DD,iBAAiB;gBACjBP;YACJ,OAAO;gBACHO,iBAAiB;YACrB;QACJ,OAAO,IAAIA,mBAAmB,qBAAqB;YAC/CA,iBAAiB;YACjBP;QACJ;IACJ,GAAG;QACC,MAAM;QACN,SAASM;IACb;IAEA,MAAMG,wBAAwB,CAACD;QAC3B,IAAID,mBAAmB,qBAAqB;YACxCA,iBAAiB;YAEjBF,kBAAkBG;QACtB;IACJ;IAEAlB,oBAAoBA,CAACC,SAASb,0BAA0BA,EAAE+B,uBAAuB;QAC7E,MAAM;QACN,SAASH;IACb;IAEAhB,oBAAoBA,CAACC,SAASf,6BAA6BA,EAAEiC,uBAAuB;QAChF,MAAM;QACN,SAASH;IACb;AACJ;AAEA,SAASI,yBAAyBA,CAACnB,OAAuB;IACtD,IAAIoB;IACJ,IAAIC,4BAAqC;IACzC,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJ,MAAMC,gCAA0E,EAAE;IAElF,MAAMC,uBAAuB,CAACtB;QAC1B,IAAIc,qBAAqB,CAACC,2BAA2B;YACjDvB,UAAUA,CAACsB,mBAAmBd;YAE9Bc,kBAAkB,GAAG;YACrBC,4BAA4B;QAChC;QAEA,IAAIC,6BAA6B;YAC7BA,4BAA4B,GAAG;QACnC;QAEA,IAAIC,qCAAqC;YACrCA,oCAAoC,GAAG;QAC3C;QAEA,IAAIC,eAAe;YACfA,cAAc,QAAQ,CAAC,GAAG;QAC9B;QAEA,IAAIC,iCAAiC;YACjCA,gCAAgC,GAAG;QACvC;QAEA,IAAIC,4CAA4C;YAC5CA,2CAA2C,QAAQ,CAAC,GAAG;QAC3D;QAEAC,8BAA8B,OAAO,CAACE,CAAAA;YAClCA,EAAEvB;QACN;IACJ;IAEAP,oBAAoBA,CAACC,SAAShB,oCAAoCA,EAAE;QAChEoC,oBAAoBvB,SAASA,CAAC,CAACM,SAAS2B,UAAYrC,SAASA,GAAG,SAAS,CAAC,wBAAwBU,SAAS2B;IAC/G,GAAG;QACC,MAAM;QACN,SAASF;IACb;IAEA7B,oBAAoBA,CAACC,SAAStB,2BAA2BA,EAAE;QACvD,IAAI0C,mBAAmB;YACnBA,kBAAkB,GAAG;YACrBC,4BAA4B;QAChC;IACJ,GAAG;QACC,MAAM;QACN,SAASO;IACb;IAEA7B,oBAAoBA,CAACC,SAASnB,aAAaA,EAAE;QACzC,IAAIuC,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC;QAC/B;IACJ,GAAG;QACC,MAAM;QACN,SAASQ;IACb;IAEA7B,oBAAoBA,CAACC,SAASvB,oCAAoCA,EAAE,CAACwC;QACjE,MAAMc,aAAa;YACf,2BAA4Bd,QAAwD,WAAW;QACnG;QAEA,IAAIG,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC,qCAAqCW;QACpE;QAEAT,8BAA8B1B,cAAcA,CAACwB,mBAAmB,CAACjB,SAAS2B;YACtE,OAAOrC,SAASA,GAAG,SAAS,CAAC,6BAA6B;gBAAE,GAAGU,OAAO;gBAAE4B;YAAW,GAAGD;QAC1F;IACJ,GAAG;QACC,MAAM;QACN,SAASF;IACb;IAEA7B,oBAAoBA,CAACC,SAASxB,sCAAsCA,EAAE,CAACyC;QACnE,IAAIG,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC,uCAAuC;gBAC9D,2BAA4BH,QAA0D,WAAW;YACrG;QACJ;QAEA,IAAIK,6BAA6B;YAC7BA,4BAA4B,GAAG;QACnC;IACJ,GAAG;QACC,MAAM;QACN,SAASM;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAAS7B,kCAAkCA,EAAE,CAAC8C;QAC/D,MAAMe,oBAAoBf;QAE1B,IAAIK,6BAA6B;YAC7BxB,UAAUA,CAACwB,6BAA6BU;QAC5C;IACJ,GAAG;QACC,SAASJ;IACb;IAEA7B,oBAAoBA,CAACC,SAAS3B,4CAA4CA,EAAE,CAAC4C;QACzE,MAAMc,aAAa;YACf,iCAAkCd,QAAgE,iBAAiB;QACvH;QAEA,IAAIG,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC,8CAA8CW;QAC7E;QAEAR,sCAAsC3B,cAAcA,CAACwB,mBAAmB,CAACjB,SAAS2B;YAC9E,OAAOrC,SAASA,GAAG,SAAS,CAAC,sCAAsC;gBAAE,GAAGU,OAAO;gBAAE4B;YAAW,GAAGD;QACnG;IACJ,GAAG;QACC,MAAM;QACN,SAASF;IACb;IAEA7B,oBAAoBA,CAACC,SAAS5B,8CAA8CA,EAAE,CAAC6C;QAC3E,IAAIG,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC,gDAAgD;gBACvE,iCAAkCH,QAAkE,iBAAiB;YACzH;QACJ;QAEA,IAAIM,qCAAqC;YACrCA,oCAAoC,GAAG;QAC3C;IACJ,GAAG;QACC,MAAM;QACN,SAASK;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAAS/B,0CAA0CA,EAAE,CAACgD;QACvE,MAAMe,oBAAoBf;QAE1B,IAAIM,qCAAqC;YACrCzB,UAAUA,CAACwB,6BAA6BU;QAC5C;IACJ,GAAG;QACC,SAASJ;IACb;IAEA,MAAMK,yBAAyB;QAC3BT,gBAAgB7B,oBAAoBA,CAACyB,mBAAmB,CAACjB,SAAS2B;YAC9D,MAAMI,OAAO;YACb,MAAMC,OAAO1C,SAASA,GAAG,SAAS,CAACyC,MAAM/B,SAAS2B;YAElD,OAAO;gBACHI;gBACAC;YACJ;QACJ;IACJ;IAEA,MAAMC,kBAAkB;QACpB,IAAIZ,eAAe;YACf9B,aAAaA,CAAC8B;QAClB;IACJ;IAEA,MAAMa,+BAA+B;QACjC,IAAIb,eAAe;YACfA,cAAc,QAAQ,CAAC,QAAQ,CAAC;QACpC;IACJ;IAEA,MAAMc,wBAAwB;QAC1B,IAAId,eAAe;YACfA,cAAc,QAAQ,CAAC,QAAQ,CAAC;QACpC;IACJ;IAEA,MAAMe,kCAAkC;QACpC,IAAIf,eAAe;YACfA,cAAc,QAAQ,CAAC,QAAQ,CAAC;QACpC;IACJ;IAEA,MAAMgB,2BAA2B;QAC7B,IAAIhB,eAAe;YACfA,cAAc,QAAQ,CAAC,QAAQ,CAAC;QACpC;IACJ;IAEA,MAAMN,wBAAwB,CAACuB;QAC3B,IAAIjB,eAAe;YACfiB,cAAc,OAAO,CAACZ,CAAAA;gBAClB/B,UAAUA,CAAC0B,cAAc,QAAQ,EAAEK;YACvC;YAEAnC,aAAaA,CAAC8B;YAEd,6FAA6F;YAC7F,sEAAsE;YACtE,IAAIJ,mBAAmB;gBACnBA,kBAAkB,GAAG;gBACrBC,4BAA4B;YAChC;QACJ;IACJ;IAEAd,qBAAqBA,CACjBP,SACAiC,wBACAG,iBACAC,8BACAC,uBACAC,iCACAC,0BACAtB,uBACAU;IAGJ7B,oBAAoBA,CAACC,SAASpB,sBAAsBA,EAAE;QAClD,IAAIwC,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC;QAC/B;IACJ,GAAG;QACC,MAAM;QACN,SAASQ;IACb;IAEA7B,oBAAoBA,CAACC,SAASrB,iBAAiBA,EAAE;QAC7C,IAAIyC,mBAAmB;YACnBA,kBAAkB,QAAQ,CAAC;QAC/B;IACJ,GAAG;QACC,MAAM;QACN,SAASQ;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAASV,uCAAuCA,EAAE;QACnEmC,kCAAkC5B,SAASA,CAAC,CAACM,SAAS2B,UAAYrC,SAASA,GAAG,SAAS,CAAC,wCAAwCU,SAAS2B;IAC7I,GAAG;QACC,SAASF;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAASX,yCAAyCA,EAAE;QACrE,IAAIoC,iCAAiC;YACjCA,gCAAgC,GAAG;QACvC;IACJ,GAAG;QACC,SAASG;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAASzB,mDAAmDA,EAAE,CAAC0C;QAChF,MAAMc,aAAa;YACf,iCAAkCd,QAAuE,iBAAiB;QAC9H;QAEA,IAAIQ,iCAAiC;YACjCA,gCAAgC,QAAQ,CAAC,sDAAsDM;QACnG;QAEAL,6CAA6C/B,oBAAoBA,CAAC8B,iCAAiC,CAACtB,SAAS2B;YACzG,MAAMI,OAAO;YAEb,MAAMC,OAAO1C,SAASA,GAAG,SAAS,CAACyC,MAAM;gBACrCH;gBACA,GAAG5B,OAAO;YACd,GAAG2B;YAEH,OAAO;gBACHI;gBACAC;YACJ;QACJ;IACJ,GAAG;QACC,SAASP;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAAS1B,qDAAqDA,EAAE,CAAC2C;QAClF,IAAIQ,iCAAiC;YACjCA,gCAAgC,QAAQ,CAAC,wDAAwD;gBAC7F,iCAAkCR,QAAyE,iBAAiB;YAChI;QACJ;QAEA,IAAIS,4CAA4C;YAC5ChC,aAAaA,CAACgC;QAClB;IACJ,GAAG;QACC,SAASE;IACb;IAEA,4BAA4B;IAC5B7B,oBAAoBA,CAACC,SAAS9B,gDAAgDA,EAAE,CAAC+C;QAC7E,MAAMe,oBAAoBf;QAE1B,IAAIS,4CAA4C;YAC5C5B,UAAUA,CAAC4B,2CAA2C,QAAQ,EAAEM;QACpE;IACJ,GAAG;QACC,SAASJ;IACb;IAEA,MAAMc,uBAAwC,IAAMtB;IACpD,MAAMuB,qCAAsD,IAAMlB;IAElE,MAAMmB,6BAAqE,CAACtC;QACxEsB,qBAAqBtB;IACzB;IAEA,8DAA8D;IAC9DN,QAAQ,OAAO,CAAC,OAAO,CAAC6B,CAAAA;QACpB,MAAMgB,SAAShB;QAEf,IAAIgB,OAAO,kCAAkC,EAAE;YAC3C,MAAMC,wBAAwBD,OAAO,kCAAkC,CACnEH,sBACAC,oCACAC;YAGJjB,8BAA8B,IAAI,CAACmB;QACvC;IACJ;AACJ;AAEO,SAASC,gCAAgCA,CAAC/C,OAAuB;IACpE,IAAI;QACAR,uBAAuBA;QAEvB,+EAA+E;QAC/E,gEAAgE;QAChEQ,QAAQ,8BAA8B,EAAE,yBAAyBT,mDAAmDA,CAACS,QAAQ,MAAM;QAEnImB,yBAAyBA,CAACnB;QAE1BA,QAAQ,MAAM,CAAC,WAAW,CAAC;IAC/B,EAAE,OAAOM,OAAgB;QACrBN,QAAQ,MAAM,CACT,QAAQ,CAAC,2EACT,SAAS,CAACM,OACV,KAAK;IACd;AACJ"}
1
+ {"version":3,"file":"honeycomb/registerHoneycombInstrumentation.js","sources":["../../src/honeycomb/registerHoneycombInstrumentation.ts"],"sourcesContent":["import type { Span } from \"@opentelemetry/api\";\nimport {\n type AddListenerOptions,\n type EventCallbackFunction,\n type EventMap,\n type EventMapKey,\n LocalModuleDeferredRegistrationFailedEvent,\n LocalModuleDeferredRegistrationUpdateFailedEvent,\n LocalModuleRegistrationFailedEvent,\n LocalModulesDeferredRegistrationCompletedEvent,\n LocalModulesDeferredRegistrationStartedEvent,\n LocalModulesDeferredRegistrationsUpdateCompletedEvent,\n LocalModulesDeferredRegistrationsUpdateStartedEvent,\n LocalModulesRegistrationCompletedEvent,\n LocalModulesRegistrationStartedEvent\n} from \"@squide/core\";\nimport { ApplicationBoostrappedEvent, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, PublicDataReadyEvent } from \"../AppRouterReducer.ts\";\nimport { FireflyPlugin } from \"../FireflyPlugin.ts\";\nimport type { FireflyRuntime } from \"../FireflyRuntime.tsx\";\nimport { ApplicationBootstrappingStartedEvent } from \"../initializeFirefly.ts\";\nimport { ProtectedDataFetchFailedEvent, ProtectedDataFetchStartedEvent } from \"../useProtectedDataQueries.ts\";\nimport { PublicDataFetchFailedEvent, PublicDataFetchStartedEvent } from \"../usePublicDataQueries.ts\";\nimport { DeferredRegistrationsUpdateCompletedEvent, DeferredRegistrationsUpdateStartedEvent } from \"../useUpdateDeferredRegistrations.ts\";\nimport { type ActiveSpan, createOverrideFetchRequestSpanWithActiveSpanContext, registerActiveSpanStack } from \"./activeSpan.ts\";\nimport { getTracer } from \"./tracer.ts\";\nimport { endActiveSpan, startActiveChildSpan, startChildSpan, startSpan, traceError } from \"./utils.ts\";\n\n// TIPS:\n// To query those traces in Honeycomb, use the following query filter:\n// \"root.name = squide-bootstrapping\" and\n// \"root.name = squide-deferred-registrations-update\".\n\nexport interface AddProtectedListenerOptions extends AddListenerOptions {\n onError?: (error: unknown) => void;\n}\n\nexport function addProtectedListener<K extends EventMapKey>(runtime: FireflyRuntime, eventName: K, callback: EventCallbackFunction<EventMap[K]>, options?: AddProtectedListenerOptions) {\n const protectedCallback: EventCallbackFunction<EventMap[K]> = data => {\n try {\n callback(data);\n } catch (error: unknown) {\n runtime.logger\n .withText(`[squide] An unmanaged error occurred while handling event \"${String(eventName)}\" for Honeycomb instrumentation:`)\n .withError(error as Error)\n .error();\n }\n };\n\n runtime.eventBus.addListener(eventName, protectedCallback, options);\n}\n\nexport type GetSpanFunction = () => Span;\nexport type HoneycombTrackingUnmanagedErrorHandler = (error: unknown) => void;\n\ntype DataFetchState = \"none\" | \"fetching-data\" | \"public-data-ready\" | \"protected-data-ready\" | \"data-ready\" | \"data-fetch-failed\";\n\nexport function reduceDataFetchEvents(\n runtime: FireflyRuntime,\n onDataFetchStarted: () => void,\n onDataReady: () => void,\n onPublicDataFetchStarted: () => void,\n onPublicDataReady: () => void,\n onProtectedDataFetchStarted: () => void,\n onProtectedDataReady: () => void,\n onDataFetchFailed: (queriesErrors: Error[]) => void,\n onUnmanagedError: (error: unknown) => void\n) {\n let dataFetchState: DataFetchState = \"none\";\n\n addProtectedListener(runtime, PublicDataFetchStartedEvent, () => {\n if (dataFetchState === \"none\") {\n dataFetchState = \"fetching-data\";\n onDataFetchStarted();\n }\n\n onPublicDataFetchStarted();\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, PublicDataReadyEvent, payload => {\n onPublicDataReady();\n\n if (dataFetchState === \"fetching-data\") {\n if (payload && !payload.waitForProtectedData) {\n dataFetchState = \"data-ready\";\n onDataReady();\n } else {\n dataFetchState = \"public-data-ready\";\n }\n } else if (dataFetchState === \"protected-data-ready\") {\n dataFetchState = \"data-ready\";\n onDataReady();\n }\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataFetchStartedEvent, () => {\n if (dataFetchState === \"none\") {\n dataFetchState = \"fetching-data\";\n onDataFetchStarted();\n }\n\n onProtectedDataFetchStarted();\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataReadyEvent, payload => {\n onProtectedDataReady();\n\n if (dataFetchState === \"fetching-data\") {\n if (payload && !payload.waitForPublicData) {\n dataFetchState = \"data-ready\";\n onDataReady();\n } else {\n dataFetchState = \"protected-data-ready\";\n }\n } else if (dataFetchState === \"public-data-ready\") {\n dataFetchState = \"data-ready\";\n onDataReady();\n }\n }, {\n once: true,\n onError: onUnmanagedError\n });\n\n const handleDataFetchFailed: EventCallbackFunction<Error[]> = payload => {\n if (dataFetchState !== \"data-fetch-failed\") {\n dataFetchState = \"data-fetch-failed\";\n\n onDataFetchFailed(payload ?? []);\n }\n };\n\n addProtectedListener(runtime, PublicDataFetchFailedEvent, handleDataFetchFailed, {\n once: true,\n onError: onUnmanagedError\n });\n\n addProtectedListener(runtime, ProtectedDataFetchFailedEvent, handleDataFetchFailed, {\n once: true,\n onError: onUnmanagedError\n });\n}\n\nfunction registerTrackingListeners(runtime: FireflyRuntime) {\n let bootstrappingSpan: Span;\n let bootstrappingSpanHasEnded: boolean = false;\n let localModuleRegistrationSpan: Span;\n let localModuleDeferredRegistrationSpan: Span;\n let dataFetchSpan: ActiveSpan;\n let deferredRegistrationsUpdateSpan: Span;\n let localModuleDeferredRegistrationsUpdateSpan: ActiveSpan;\n\n const pluginsUnmanagedErrorHandlers: HoneycombTrackingUnmanagedErrorHandler[] = [];\n\n const handleUnmanagedError = (error: unknown) => {\n if (bootstrappingSpan && !bootstrappingSpanHasEnded) {\n traceError(bootstrappingSpan, error as Error);\n\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n\n if (localModuleRegistrationSpan) {\n localModuleRegistrationSpan.end();\n }\n\n if (localModuleDeferredRegistrationSpan) {\n localModuleDeferredRegistrationSpan.end();\n }\n\n if (dataFetchSpan) {\n dataFetchSpan.instance.end();\n }\n\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.end();\n }\n\n if (localModuleDeferredRegistrationsUpdateSpan) {\n localModuleDeferredRegistrationsUpdateSpan.instance.end();\n }\n\n pluginsUnmanagedErrorHandlers.forEach(x => {\n x(error);\n });\n };\n\n addProtectedListener(runtime, ApplicationBootstrappingStartedEvent, () => {\n bootstrappingSpan = startSpan((options, context) => getTracer().startSpan(\"squide-bootstrapping\", options, context));\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, ApplicationBoostrappedEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, MswReadyEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"msw-ready\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesRegistrationStartedEvent, payload => {\n const attributes = {\n \"app.squide.module_count\": payload?.moduleCount\n };\n\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-registration-started\", attributes);\n }\n\n localModuleRegistrationSpan = startChildSpan(bootstrappingSpan, (options, context) => {\n return getTracer().startSpan(\"local-module-registration\", { ...options, attributes }, context);\n });\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesRegistrationCompletedEvent, payload => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-registration-completed\", {\n \"app.squide.module_count\": payload?.moduleCount\n });\n }\n\n if (localModuleRegistrationSpan) {\n localModuleRegistrationSpan.end();\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleRegistrationFailedEvent, payload => {\n if (localModuleRegistrationSpan) {\n traceError(localModuleRegistrationSpan, payload as Error);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesDeferredRegistrationStartedEvent, payload => {\n const attributes = {\n \"app.squide.registration_count\": payload?.registrationCount\n };\n\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-deferred-registration-started\", attributes);\n }\n\n localModuleDeferredRegistrationSpan = startChildSpan(bootstrappingSpan, (options, context) => {\n return getTracer().startSpan(\"local-module-deferred-registration\", { ...options, attributes }, context);\n });\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, LocalModulesDeferredRegistrationCompletedEvent, payload => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"local-module-deferred-registration-completed\", {\n \"app.squide.registration_count\": payload?.registrationCount\n });\n }\n\n if (localModuleDeferredRegistrationSpan) {\n localModuleDeferredRegistrationSpan.end();\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleDeferredRegistrationFailedEvent, payload => {\n if (localModuleDeferredRegistrationSpan) {\n traceError(localModuleRegistrationSpan, payload as Error);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n const handleFetchDataStarted = () => {\n dataFetchSpan = startActiveChildSpan(bootstrappingSpan, (options, context) => {\n const name = \"data-fetch\";\n const span = getTracer().startSpan(name, options, context);\n\n return {\n name,\n span\n };\n });\n };\n\n const handleDataReady = () => {\n if (dataFetchSpan) {\n endActiveSpan(dataFetchSpan);\n }\n };\n\n const handlePublicDataFetchStarted = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"public-data-fetch-started\");\n }\n };\n\n const handlePublicDataReady = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"public-data-ready\");\n }\n };\n\n const handleProtectedDataFetchStarted = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"protected-data-fetch-started\");\n }\n };\n\n const handleProtectedDataReady = () => {\n if (dataFetchSpan) {\n dataFetchSpan.instance.addEvent(\"protected-data-ready\");\n }\n };\n\n const handleDataFetchFailed = (queriesErrors: Error[]) => {\n if (dataFetchSpan) {\n queriesErrors.forEach(x => {\n traceError(dataFetchSpan.instance, x);\n });\n\n endActiveSpan(dataFetchSpan);\n\n // Global data fetch errors are unmanaged, which mean the host application bootstrapping flow\n // will be aborted and a react-router error boundary will be rendered.\n if (bootstrappingSpan) {\n bootstrappingSpan.end();\n bootstrappingSpanHasEnded = true;\n }\n }\n };\n\n reduceDataFetchEvents(\n runtime,\n handleFetchDataStarted,\n handleDataReady,\n handlePublicDataFetchStarted,\n handlePublicDataReady,\n handleProtectedDataFetchStarted,\n handleProtectedDataReady,\n handleDataFetchFailed,\n handleUnmanagedError\n );\n\n addProtectedListener(runtime, ModulesRegisteredEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"modules-registered\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n addProtectedListener(runtime, ModulesReadyEvent, () => {\n if (bootstrappingSpan) {\n bootstrappingSpan.addEvent(\"modules-ready\");\n }\n }, {\n once: true,\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, DeferredRegistrationsUpdateStartedEvent, () => {\n deferredRegistrationsUpdateSpan = startSpan((options, context) => getTracer().startSpan(\"squide-deferred-registrations-update\", options, context));\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, DeferredRegistrationsUpdateCompletedEvent, () => {\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.end();\n }\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateStartedEvent, payload => {\n const attributes = {\n \"app.squide.registration_count\": payload?.registrationCount\n };\n\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.addEvent(\"local-module-deferred-registrations-update-started\", attributes);\n }\n\n localModuleDeferredRegistrationsUpdateSpan = startActiveChildSpan(deferredRegistrationsUpdateSpan, (options, context) => {\n const name = \"local-module-deferred-registrations-update\";\n\n const span = getTracer().startSpan(name, {\n attributes,\n ...options\n }, context);\n\n return {\n name,\n span\n };\n });\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateCompletedEvent, payload => {\n if (deferredRegistrationsUpdateSpan) {\n deferredRegistrationsUpdateSpan.addEvent(\"local-module-deferred-registrations-update-completed\", {\n \"app.squide.registration_count\": payload?.registrationCount\n });\n }\n\n if (localModuleDeferredRegistrationsUpdateSpan) {\n endActiveSpan(localModuleDeferredRegistrationsUpdateSpan);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n // Can occur multiple times.\n addProtectedListener(runtime, LocalModuleDeferredRegistrationUpdateFailedEvent, payload => {\n if (localModuleDeferredRegistrationsUpdateSpan) {\n traceError(localModuleDeferredRegistrationsUpdateSpan.instance, payload as Error);\n }\n }, {\n onError: handleUnmanagedError\n });\n\n const getBootstrappingSpan: GetSpanFunction = () => bootstrappingSpan;\n const getDeferredRegistrationsUpdateSpan: GetSpanFunction = () => deferredRegistrationsUpdateSpan;\n\n const handlePluginUnmanagedError: HoneycombTrackingUnmanagedErrorHandler = (error: unknown) => {\n handleUnmanagedError(error);\n };\n\n // Register plugins specific handlers for Honeycomb telemetry.\n runtime.plugins.forEach(x => {\n const plugin = x as FireflyPlugin;\n\n if (plugin.registerHoneycombTrackingListeners) {\n const unmanagedErrorHandler = plugin.registerHoneycombTrackingListeners(\n getBootstrappingSpan,\n getDeferredRegistrationsUpdateSpan,\n handlePluginUnmanagedError\n );\n\n pluginsUnmanagedErrorHandlers.push(unmanagedErrorHandler);\n }\n });\n}\n\nexport function registerHoneycombInstrumentation(runtime: FireflyRuntime) {\n try {\n registerActiveSpanStack();\n\n // Dynamically registering this request hook function to nest the HTTP requests\n // of squide bootstrapping under the appropriate Honeycomb span.\n runtime.honeycombInstrumentationClient?.registerFetchRequestHook(createOverrideFetchRequestSpanWithActiveSpanContext(runtime.logger));\n\n registerTrackingListeners(runtime);\n\n runtime.logger.information(\"[squide] Honeycomb instrumentation is registered.\");\n } catch (error: unknown) {\n runtime.logger\n .withText(\"[squide] An error occurred while registering Honeycomb instrumentation:\")\n .withError(error as Error)\n .error();\n }\n}\n"],"names":["LocalModuleDeferredRegistrationFailedEvent","LocalModuleDeferredRegistrationUpdateFailedEvent","LocalModuleRegistrationFailedEvent","LocalModulesDeferredRegistrationCompletedEvent","LocalModulesDeferredRegistrationStartedEvent","LocalModulesDeferredRegistrationsUpdateCompletedEvent","LocalModulesDeferredRegistrationsUpdateStartedEvent","LocalModulesRegistrationCompletedEvent","LocalModulesRegistrationStartedEvent","ApplicationBoostrappedEvent","ModulesReadyEvent","ModulesRegisteredEvent","MswReadyEvent","ProtectedDataReadyEvent","PublicDataReadyEvent","ApplicationBootstrappingStartedEvent","ProtectedDataFetchFailedEvent","ProtectedDataFetchStartedEvent","PublicDataFetchFailedEvent","PublicDataFetchStartedEvent","DeferredRegistrationsUpdateCompletedEvent","DeferredRegistrationsUpdateStartedEvent","createOverrideFetchRequestSpanWithActiveSpanContext","registerActiveSpanStack","getTracer","endActiveSpan","startActiveChildSpan","startChildSpan","startSpan","traceError","addProtectedListener","runtime","eventName","callback","options","protectedCallback","data","error","String","reduceDataFetchEvents","onDataFetchStarted","onDataReady","onPublicDataFetchStarted","onPublicDataReady","onProtectedDataFetchStarted","onProtectedDataReady","onDataFetchFailed","onUnmanagedError","dataFetchState","payload","handleDataFetchFailed","registerTrackingListeners","bootstrappingSpan","bootstrappingSpanHasEnded","localModuleRegistrationSpan","localModuleDeferredRegistrationSpan","dataFetchSpan","deferredRegistrationsUpdateSpan","localModuleDeferredRegistrationsUpdateSpan","pluginsUnmanagedErrorHandlers","handleUnmanagedError","x","context","attributes","handleFetchDataStarted","name","span","handleDataReady","handlePublicDataFetchStarted","handlePublicDataReady","handleProtectedDataFetchStarted","handleProtectedDataReady","queriesErrors","getBootstrappingSpan","getDeferredRegistrationsUpdateSpan","handlePluginUnmanagedError","plugin","unmanagedErrorHandler","registerHoneycombInstrumentation"],"mappings":"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"}
@@ -4,6 +4,11 @@ import type { HoneycombInstrumentationPartialClient } from "@workleap-telemetry/
4
4
  import { LDClient } from "launchdarkly-js-client-sdk";
5
5
  import { FireflyRuntime, type FireflyRuntimeOptions } from "./FireflyRuntime.tsx";
6
6
  export declare const ApplicationBootstrappingStartedEvent = "squide-app-bootstrapping-started";
7
+ declare module "@squide/core" {
8
+ interface EventMap {
9
+ "squide-app-bootstrapping-started": void;
10
+ }
11
+ }
7
12
  export type OnInitializationErrorFunction = (error: unknown) => void;
8
13
  export type StartMswFunction<TRuntime = FireflyRuntime> = (runtime: TRuntime) => Promise<void>;
9
14
  export interface InitializeFireflyOptions<TRuntime extends FireflyRuntime, TContext = unknown, TData = unknown> extends RegisterModulesOptions<TContext>, FireflyRuntimeOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"initializeFirefly.js","sources":["../src/initializeFirefly.ts"],"sourcesContent":["import { ModuleDefinition, PluginFactory, toLocalModuleDefinitions, type ModuleRegisterFunction, type RegisterModulesOptions } from \"@squide/core\";\nimport { isFunction } from \"@squide/core/internal\";\nimport { EnvironmentVariables, EnvironmentVariablesPlugin } from \"@squide/env-vars\";\nimport { LaunchDarklyPlugin } from \"@squide/launch-darkly\";\nimport { MswPlugin } from \"@squide/msw\";\nimport type { HoneycombInstrumentationPartialClient } from \"@workleap-telemetry/core\";\nimport { RootLogger } from \"@workleap/logging\";\nimport { LDClient } from \"launchdarkly-js-client-sdk\";\nimport { FireflyRuntime, type FireflyRuntimeOptions } from \"./FireflyRuntime.tsx\";\nimport { initializeHoneycomb } from \"./honeycomb/initializeHoneycomb.ts\";\n\nexport const ApplicationBootstrappingStartedEvent = \"squide-app-bootstrapping-started\";\n\nexport type OnInitializationErrorFunction = (error: unknown) => void;\n\nexport type StartMswFunction<TRuntime = FireflyRuntime> = (runtime: TRuntime) => Promise<void>;\n\nexport interface InitializeFireflyOptions<TRuntime extends FireflyRuntime, TContext = unknown, TData = unknown> extends RegisterModulesOptions<TContext>, FireflyRuntimeOptions {\n localModules?: (ModuleRegisterFunction<TRuntime, TContext, TData> | undefined)[];\n moduleDefinitions?: ModuleDefinition<TRuntime, TContext, TData>[];\n useMsw?: boolean;\n environmentVariables?: Partial<EnvironmentVariables>;\n honeycombInstrumentationClient?: HoneycombInstrumentationPartialClient;\n launchDarklyClient?: LDClient;\n startMsw?: StartMswFunction<FireflyRuntime>;\n onError?: OnInitializationErrorFunction;\n}\n\nexport function bootstrap<TRuntime extends FireflyRuntime = FireflyRuntime, TContext = unknown, TData = unknown>(\n runtime: TRuntime,\n modulesDefinitions: (ModuleDefinition<TRuntime, TContext, TData> | undefined)[],\n options: Omit<InitializeFireflyOptions<TRuntime, TContext, TData>, \"localModules\" | \"moduleDefinitions\"> = {}\n) {\n const {\n startMsw,\n onError,\n context\n } = options;\n\n runtime.eventBus.dispatch(ApplicationBootstrappingStartedEvent);\n\n runtime.moduleManager.registerModules(\n modulesDefinitions.filter((x): x is ModuleDefinition => Boolean(x)),\n { context }\n ).then(results => {\n if (runtime.isMswEnabled) {\n if (!isFunction(startMsw)) {\n throw new Error(\"[squide] When MSW is enabled, the \\\"startMsw\\\" function must be provided.\");\n }\n\n startMsw(runtime)\n .then(() => {\n if (runtime.isMswEnabled) {\n runtime.mswState.setAsReady();\n }\n })\n .catch((error: unknown) => {\n runtime.logger\n .withText(\"[squide] An error occured while starting MSW.\")\n .withError(error as Error)\n .error();\n });\n }\n\n if (onError) {\n results.forEach(error => {\n onError(error);\n });\n }\n });\n}\n\nfunction logInitializationState<TContext = unknown, TData = unknown>(\n runtime: FireflyRuntime,\n options: InitializeFireflyOptions<FireflyRuntime, TContext, TData>,\n plugins: PluginFactory<FireflyRuntime>[]\n) {\n const {\n mode,\n localModules,\n moduleDefinitions,\n useMsw,\n environmentVariables,\n honeycombInstrumentationClient,\n launchDarklyClient\n } = options;\n const scope = (runtime.logger as RootLogger).startScope(\"[squide] Initializing the application.\");\n\n try {\n scope.information(`[squide] Mode: ${mode ?? \"development\"}`);\n\n if (localModules) {\n scope\n .withText(\"[squide] Local modules:\")\n .withObject(localModules)\n .information();\n }\n\n if (moduleDefinitions) {\n scope\n .withText(\"[squide] Module definitions:\")\n .withObject(moduleDefinitions)\n .information();\n }\n\n scope.information(`[squide] Use MSW: ${useMsw ? \"Yes\" : \"No\"}`);\n\n if (environmentVariables && Object.keys(environmentVariables).length > 0) {\n scope\n .withText(\"[squide] Environment variables:\")\n .withObject(environmentVariables)\n .information();\n }\n\n if (honeycombInstrumentationClient) {\n scope\n .withText(\"[squide] Honeycomb instrumentation client:\")\n .withObject(honeycombInstrumentationClient)\n .information();\n }\n\n if (launchDarklyClient) {\n scope\n .withText(\"[squide] LaunchDarkly client:\")\n .withObject(launchDarklyClient)\n .information();\n }\n\n if (plugins.length > 0) {\n scope\n .withText(\"[squide] Plugins:\")\n .withObject(plugins)\n .information();\n }\n } finally {\n scope.end();\n }\n}\n\nlet hasExecuted = false;\n\n// Should only be used by tests.\nexport function __resetHasExecutedGuard() {\n hasExecuted = false;\n}\n\nexport function initializeFirefly<TContext = unknown, TData = unknown>(options: InitializeFireflyOptions<FireflyRuntime, TContext, TData> = {}) {\n const {\n mode,\n localModules = [],\n moduleDefinitions = [],\n useMsw,\n environmentVariables,\n honeycombInstrumentationClient,\n launchDarklyClient,\n plugins = [],\n loggers,\n onError\n } = options;\n\n if (hasExecuted) {\n throw new Error(\"[squide] A squide application can only be initialized once. Did you call the \\\"initializeSquide\\\" function twice?\");\n }\n\n hasExecuted = true;\n\n if (useMsw) {\n plugins.push(x => new MswPlugin(x));\n }\n\n if (launchDarklyClient) {\n plugins.push(x => new LaunchDarklyPlugin(x, launchDarklyClient));\n }\n\n const runtime = new FireflyRuntime({\n mode,\n honeycombInstrumentationClient,\n loggers,\n plugins: [\n x => new EnvironmentVariablesPlugin(x, {\n variables: environmentVariables\n }),\n ...plugins\n ]\n });\n\n logInitializationState(runtime, options, plugins);\n\n initializeHoneycomb(runtime)\n .catch((error: unknown) => {\n if (onError) {\n onError(error);\n }\n })\n .finally(() => {\n bootstrap(\n runtime,\n [...moduleDefinitions, ...toLocalModuleDefinitions(localModules)],\n options\n );\n });\n\n return runtime;\n}\n"],"names":["toLocalModuleDefinitions","isFunction","EnvironmentVariablesPlugin","LaunchDarklyPlugin","MswPlugin","FireflyRuntime","initializeHoneycomb","ApplicationBootstrappingStartedEvent","bootstrap","runtime","modulesDefinitions","options","startMsw","onError","context","x","Boolean","results","Error","error","logInitializationState","plugins","mode","localModules","moduleDefinitions","useMsw","environmentVariables","honeycombInstrumentationClient","launchDarklyClient","scope","Object","hasExecuted","__resetHasExecutedGuard","initializeFirefly","loggers"],"mappings":"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"}
1
+ {"version":3,"file":"initializeFirefly.js","sources":["../src/initializeFirefly.ts"],"sourcesContent":["import { ModuleDefinition, PluginFactory, toLocalModuleDefinitions, type ModuleRegisterFunction, type RegisterModulesOptions } from \"@squide/core\";\nimport { isFunction } from \"@squide/core/internal\";\nimport { EnvironmentVariables, EnvironmentVariablesPlugin } from \"@squide/env-vars\";\nimport { LaunchDarklyPlugin } from \"@squide/launch-darkly\";\nimport { MswPlugin } from \"@squide/msw\";\nimport type { HoneycombInstrumentationPartialClient } from \"@workleap-telemetry/core\";\nimport { RootLogger } from \"@workleap/logging\";\nimport { LDClient } from \"launchdarkly-js-client-sdk\";\nimport { FireflyRuntime, type FireflyRuntimeOptions } from \"./FireflyRuntime.tsx\";\nimport { initializeHoneycomb } from \"./honeycomb/initializeHoneycomb.ts\";\n\nexport const ApplicationBootstrappingStartedEvent = \"squide-app-bootstrapping-started\";\n\ndeclare module \"@squide/core\" {\n interface EventMap {\n \"squide-app-bootstrapping-started\": void;\n }\n}\n\nexport type OnInitializationErrorFunction = (error: unknown) => void;\n\nexport type StartMswFunction<TRuntime = FireflyRuntime> = (runtime: TRuntime) => Promise<void>;\n\nexport interface InitializeFireflyOptions<TRuntime extends FireflyRuntime, TContext = unknown, TData = unknown> extends RegisterModulesOptions<TContext>, FireflyRuntimeOptions {\n localModules?: (ModuleRegisterFunction<TRuntime, TContext, TData> | undefined)[];\n moduleDefinitions?: ModuleDefinition<TRuntime, TContext, TData>[];\n useMsw?: boolean;\n environmentVariables?: Partial<EnvironmentVariables>;\n honeycombInstrumentationClient?: HoneycombInstrumentationPartialClient;\n launchDarklyClient?: LDClient;\n startMsw?: StartMswFunction<FireflyRuntime>;\n onError?: OnInitializationErrorFunction;\n}\n\nexport function bootstrap<TRuntime extends FireflyRuntime = FireflyRuntime, TContext = unknown, TData = unknown>(\n runtime: TRuntime,\n modulesDefinitions: (ModuleDefinition<TRuntime, TContext, TData> | undefined)[],\n options: Omit<InitializeFireflyOptions<TRuntime, TContext, TData>, \"localModules\" | \"moduleDefinitions\"> = {}\n) {\n const {\n startMsw,\n onError,\n context\n } = options;\n\n runtime.eventBus.dispatch(ApplicationBootstrappingStartedEvent);\n\n runtime.moduleManager.registerModules(\n modulesDefinitions.filter((x): x is ModuleDefinition => Boolean(x)),\n { context }\n ).then(results => {\n if (runtime.isMswEnabled) {\n if (!isFunction(startMsw)) {\n throw new Error(\"[squide] When MSW is enabled, the \\\"startMsw\\\" function must be provided.\");\n }\n\n startMsw(runtime)\n .then(() => {\n if (runtime.isMswEnabled) {\n runtime.mswState.setAsReady();\n }\n })\n .catch((error: unknown) => {\n runtime.logger\n .withText(\"[squide] An error occured while starting MSW.\")\n .withError(error as Error)\n .error();\n });\n }\n\n if (onError) {\n results.forEach(error => {\n onError(error);\n });\n }\n });\n}\n\nfunction logInitializationState<TContext = unknown, TData = unknown>(\n runtime: FireflyRuntime,\n options: InitializeFireflyOptions<FireflyRuntime, TContext, TData>,\n plugins: PluginFactory<FireflyRuntime>[]\n) {\n const {\n mode,\n localModules,\n moduleDefinitions,\n useMsw,\n environmentVariables,\n honeycombInstrumentationClient,\n launchDarklyClient\n } = options;\n const scope = (runtime.logger as RootLogger).startScope(\"[squide] Initializing the application.\");\n\n try {\n scope.information(`[squide] Mode: ${mode ?? \"development\"}`);\n\n if (localModules) {\n scope\n .withText(\"[squide] Local modules:\")\n .withObject(localModules)\n .information();\n }\n\n if (moduleDefinitions) {\n scope\n .withText(\"[squide] Module definitions:\")\n .withObject(moduleDefinitions)\n .information();\n }\n\n scope.information(`[squide] Use MSW: ${useMsw ? \"Yes\" : \"No\"}`);\n\n if (environmentVariables && Object.keys(environmentVariables).length > 0) {\n scope\n .withText(\"[squide] Environment variables:\")\n .withObject(environmentVariables)\n .information();\n }\n\n if (honeycombInstrumentationClient) {\n scope\n .withText(\"[squide] Honeycomb instrumentation client:\")\n .withObject(honeycombInstrumentationClient)\n .information();\n }\n\n if (launchDarklyClient) {\n scope\n .withText(\"[squide] LaunchDarkly client:\")\n .withObject(launchDarklyClient)\n .information();\n }\n\n if (plugins.length > 0) {\n scope\n .withText(\"[squide] Plugins:\")\n .withObject(plugins)\n .information();\n }\n } finally {\n scope.end();\n }\n}\n\nlet hasExecuted = false;\n\n// Should only be used by tests.\nexport function __resetHasExecutedGuard() {\n hasExecuted = false;\n}\n\nexport function initializeFirefly<TContext = unknown, TData = unknown>(options: InitializeFireflyOptions<FireflyRuntime, TContext, TData> = {}) {\n const {\n mode,\n localModules = [],\n moduleDefinitions = [],\n useMsw,\n environmentVariables,\n honeycombInstrumentationClient,\n launchDarklyClient,\n plugins = [],\n loggers,\n onError\n } = options;\n\n if (hasExecuted) {\n throw new Error(\"[squide] A squide application can only be initialized once. Did you call the \\\"initializeSquide\\\" function twice?\");\n }\n\n hasExecuted = true;\n\n if (useMsw) {\n plugins.push(x => new MswPlugin(x));\n }\n\n if (launchDarklyClient) {\n plugins.push(x => new LaunchDarklyPlugin(x, launchDarklyClient));\n }\n\n const runtime = new FireflyRuntime({\n mode,\n honeycombInstrumentationClient,\n loggers,\n plugins: [\n x => new EnvironmentVariablesPlugin(x, {\n variables: environmentVariables\n }),\n ...plugins\n ]\n });\n\n logInitializationState(runtime, options, plugins);\n\n initializeHoneycomb(runtime)\n .catch((error: unknown) => {\n if (onError) {\n onError(error);\n }\n })\n .finally(() => {\n bootstrap(\n runtime,\n [...moduleDefinitions, ...toLocalModuleDefinitions(localModules)],\n options\n );\n });\n\n return runtime;\n}\n"],"names":["toLocalModuleDefinitions","isFunction","EnvironmentVariablesPlugin","LaunchDarklyPlugin","MswPlugin","FireflyRuntime","initializeHoneycomb","ApplicationBootstrappingStartedEvent","bootstrap","runtime","modulesDefinitions","options","startMsw","onError","context","x","Boolean","results","Error","error","logInitializationState","plugins","mode","localModules","moduleDefinitions","useMsw","environmentVariables","honeycombInstrumentationClient","launchDarklyClient","scope","Object","hasExecuted","__resetHasExecutedGuard","initializeFirefly","loggers"],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import { type QueriesOptions, type QueriesResults, type UseQueryResult } from "@tanstack/react-query";
2
2
  export declare const ProtectedDataFetchStartedEvent = "squide-protected-data-fetch-started";
3
3
  export declare const ProtectedDataFetchFailedEvent = "squide-protected-data-fetch-failed";
4
+ declare module "@squide/core" {
5
+ interface EventMap {
6
+ "squide-protected-data-fetch-started": void;
7
+ "squide-protected-data-fetch-failed": Error[];
8
+ }
9
+ }
4
10
  export type IsUnauthorizedErrorCallback = (error: unknown) => boolean;
5
11
  type MapUseQueryResultToData<T> = {
6
12
  [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never;
@@ -1 +1 @@
1
- {"version":3,"file":"useProtectedDataQueries.js","sources":["../src/useProtectedDataQueries.ts"],"sourcesContent":["import { useEventBus } from \"@squide/core\";\nimport { useQueries, type QueriesOptions, type QueriesResults, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useAppRouterDispatcher, useAppRouterState } from \"./AppRouterContext.ts\";\nimport { GlobalDataQueriesError } from \"./GlobalDataQueriesError.ts\";\nimport { useCanFetchProtectedData } from \"./useCanFetchProtectedData.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\n\nexport const ProtectedDataFetchStartedEvent = \"squide-protected-data-fetch-started\";\nexport const ProtectedDataFetchFailedEvent = \"squide-protected-data-fetch-failed\";\n\nexport type IsUnauthorizedErrorCallback = (error: unknown) => boolean;\n\n// This converts an array of UseQueryResult to an array of the data type of each query result.\n// For more information, view: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays.\ntype MapUseQueryResultToData<T> = { [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useProtectedDataQueries<T extends Array<any>>(queries: QueriesOptions<T>, isUnauthorizedError: IsUnauthorizedErrorCallback): MapUseQueryResultToData<QueriesResults<T>> {\n const canFetchProtectedData = useCanFetchProtectedData();\n const eventBus = useEventBus();\n\n const dispatch = useAppRouterDispatcher();\n\n const combineResults = useCallback((results: UseQueryResult<unknown, unknown>[]) => {\n const errors = results.filter(x => x.error).map(x => x.error) as Error[];\n const hasErrors = errors.length > 0;\n\n return {\n data: results.map(x => x.data) as MapUseQueryResultToData<QueriesResults<T>>,\n errors,\n hasErrors,\n isReady: !hasErrors && !results.some(x => x.isPending)\n };\n }, []);\n\n const { data, errors: queriesErrors, hasErrors, isReady } = useQueries({\n queries: queries.map(x => ({\n enabled: canFetchProtectedData,\n ...x\n })),\n combine: combineResults\n });\n\n const { isProtectedDataReady, isUnauthorized } = useAppRouterState();\n\n useExecuteOnce(useCallback(() => {\n if (canFetchProtectedData) {\n eventBus.dispatch(ProtectedDataFetchStartedEvent);\n\n return true;\n }\n\n return false;\n }, [canFetchProtectedData, eventBus]), true);\n\n // Using a ref seems to be the only way to prevent starting two deferred registrations scope.\n const isReadyRef = useRef(false);\n\n const dispatchReady = useExecuteOnce(useCallback(() => {\n if (isReady) {\n isReadyRef.current = true;\n\n dispatch({ type: \"protected-data-ready\" });\n\n return true;\n }\n\n return false;\n }, [isReady, dispatch]));\n\n useEffect(() => {\n // State update must be executed in useEffect.\n dispatchReady();\n }, [dispatchReady]);\n\n useEffect(() => {\n if (isReadyRef.current && data) {\n dispatch({ type: \"protected-data-updated\" });\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n if (hasErrors) {\n if (!isProtectedDataReady && !isUnauthorized && queriesErrors.some(x => isUnauthorizedError(x))) {\n // Will transition the state to allow the routes to render even if the bootstrapping is not complete, because otherwise\n // a login page for example could not be rendered.\n dispatch({ type: \"is-unauthorized\" });\n }\n\n // Otherwise, when a user is logged off, a refetch might throws a 401.\n if (!queriesErrors.every(x => isUnauthorizedError(x))) {\n eventBus.dispatch(ProtectedDataFetchFailedEvent, queriesErrors);\n\n throw new GlobalDataQueriesError(\"[squide] Global protected data queries failed.\", queriesErrors);\n }\n }\n }, [hasErrors, queriesErrors, isProtectedDataReady, isUnauthorized, isUnauthorizedError, dispatch, eventBus]);\n\n return data;\n}\n"],"names":["useEventBus","useQueries","useCallback","useEffect","useRef","useAppRouterDispatcher","useAppRouterState","GlobalDataQueriesError","useCanFetchProtectedData","useExecuteOnce","ProtectedDataFetchStartedEvent","ProtectedDataFetchFailedEvent","useProtectedDataQueries","queries","isUnauthorizedError","canFetchProtectedData","eventBus","dispatch","combineResults","results","errors","x","hasErrors","data","queriesErrors","isReady","isProtectedDataReady","isUnauthorized","isReadyRef","dispatchReady"],"mappings":";;;;;;;;;;;;;;;AAA2C;AACuE;AAC3D;AAC2B;AACb;AACI;AACpB;AAE9C,MAAMU,8BAA8BA,GAAG,sCAAsC;AAC7E,MAAMC,6BAA6BA,GAAG,qCAAqC;AAQlF,8DAA8D;AACvD,SAASC,uBAAuBA,CAAuBC,OAA0B,EAAEC,mBAAgD;IACtI,MAAMC,wBAAwBP,wBAAwBA;IACtD,MAAMQ,WAAWhB,WAAWA;IAE5B,MAAMiB,WAAWZ,sBAAsBA;IAEvC,MAAMa,iBAAiBhB,WAAWA,CAAC,CAACiB;QAChC,MAAMC,SAASD,QAAQ,MAAM,CAACE,CAAAA,IAAKA,EAAE,KAAK,EAAE,GAAG,CAACA,CAAAA,IAAKA,EAAE,KAAK;QAC5D,MAAMC,YAAYF,OAAO,MAAM,GAAG;QAElC,OAAO;YACH,MAAMD,QAAQ,GAAG,CAACE,CAAAA,IAAKA,EAAE,IAAI;YAC7BD;YACAE;YACA,SAAS,CAACA,aAAa,CAACH,QAAQ,IAAI,CAACE,CAAAA,IAAKA,EAAE,SAAS;QACzD;IACJ,GAAG,EAAE;IAEL,MAAM,EAAEE,IAAI,EAAE,QAAQC,aAAa,EAAEF,SAAS,EAAEG,OAAO,EAAE,GAAGxB,UAAUA,CAAC;QACnE,SAASY,QAAQ,GAAG,CAACQ,CAAAA,IAAM;gBACvB,SAASN;gBACT,GAAGM,CAAC;YACR;QACA,SAASH;IACb;IAEA,MAAM,EAAEQ,oBAAoB,EAAEC,cAAc,EAAE,GAAGrB,iBAAiBA;IAElEG,cAAcA,CAACP,WAAWA,CAAC;QACvB,IAAIa,uBAAuB;YACvBC,SAAS,QAAQ,CAACN,8BAA8BA;YAEhD,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACK;QAAuBC;KAAS,GAAG;IAEvC,6FAA6F;IAC7F,MAAMY,aAAaxB,MAAMA,CAAC;IAE1B,MAAMyB,gBAAgBpB,cAAcA,CAACP,WAAWA,CAAC;QAC7C,IAAIuB,SAAS;YACTG,WAAW,OAAO,GAAG;YAErBX,SAAS;gBAAE,MAAM;YAAuB;YAExC,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACQ;QAASR;KAAS;IAEtBd,SAASA,CAAC;QACN,8CAA8C;QAC9C0B;IACJ,GAAG;QAACA;KAAc;IAElB1B,SAASA,CAAC;QACN,IAAIyB,WAAW,OAAO,IAAIL,MAAM;YAC5BN,SAAS;gBAAE,MAAM;YAAyB;QAC9C;IACJ,GAAG;QAACM;QAAMN;KAAS;IAEnBd,SAASA,CAAC;QACN,IAAImB,WAAW;YACX,IAAI,CAACI,wBAAwB,CAACC,kBAAkBH,cAAc,IAAI,CAACH,CAAAA,IAAKP,oBAAoBO,KAAK;gBAC7F,uHAAuH;gBACvH,kDAAkD;gBAClDJ,SAAS;oBAAE,MAAM;gBAAkB;YACvC;YAEA,sEAAsE;YACtE,IAAI,CAACO,cAAc,KAAK,CAACH,CAAAA,IAAKP,oBAAoBO,KAAK;gBACnDL,SAAS,QAAQ,CAACL,6BAA6BA,EAAEa;gBAEjD,MAAM,IAAIjB,sBAAsBA,CAAC,kDAAkDiB;YACvF;QACJ;IACJ,GAAG;QAACF;QAAWE;QAAeE;QAAsBC;QAAgBb;QAAqBG;QAAUD;KAAS;IAE5G,OAAOO;AACX"}
1
+ {"version":3,"file":"useProtectedDataQueries.js","sources":["../src/useProtectedDataQueries.ts"],"sourcesContent":["import { useEventBus } from \"@squide/core\";\nimport { useQueries, type QueriesOptions, type QueriesResults, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useAppRouterDispatcher, useAppRouterState } from \"./AppRouterContext.ts\";\nimport { GlobalDataQueriesError } from \"./GlobalDataQueriesError.ts\";\nimport { useCanFetchProtectedData } from \"./useCanFetchProtectedData.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\n\nexport const ProtectedDataFetchStartedEvent = \"squide-protected-data-fetch-started\";\nexport const ProtectedDataFetchFailedEvent = \"squide-protected-data-fetch-failed\";\n\ndeclare module \"@squide/core\" {\n interface EventMap {\n \"squide-protected-data-fetch-started\": void;\n \"squide-protected-data-fetch-failed\": Error[];\n }\n}\n\nexport type IsUnauthorizedErrorCallback = (error: unknown) => boolean;\n\n// This converts an array of UseQueryResult to an array of the data type of each query result.\n// For more information, view: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays.\ntype MapUseQueryResultToData<T> = { [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useProtectedDataQueries<T extends Array<any>>(queries: QueriesOptions<T>, isUnauthorizedError: IsUnauthorizedErrorCallback): MapUseQueryResultToData<QueriesResults<T>> {\n const canFetchProtectedData = useCanFetchProtectedData();\n const eventBus = useEventBus();\n\n const dispatch = useAppRouterDispatcher();\n\n const combineResults = useCallback((results: UseQueryResult<unknown, unknown>[]) => {\n const errors = results.filter(x => x.error).map(x => x.error) as Error[];\n const hasErrors = errors.length > 0;\n\n return {\n data: results.map(x => x.data) as MapUseQueryResultToData<QueriesResults<T>>,\n errors,\n hasErrors,\n isReady: !hasErrors && !results.some(x => x.isPending)\n };\n }, []);\n\n const { data, errors: queriesErrors, hasErrors, isReady } = useQueries({\n queries: queries.map(x => ({\n enabled: canFetchProtectedData,\n ...x\n })),\n combine: combineResults\n });\n\n const { isProtectedDataReady, isUnauthorized } = useAppRouterState();\n\n useExecuteOnce(useCallback(() => {\n if (canFetchProtectedData) {\n eventBus.dispatch(ProtectedDataFetchStartedEvent);\n\n return true;\n }\n\n return false;\n }, [canFetchProtectedData, eventBus]), true);\n\n // Using a ref seems to be the only way to prevent starting two deferred registrations scope.\n const isReadyRef = useRef(false);\n\n const dispatchReady = useExecuteOnce(useCallback(() => {\n if (isReady) {\n isReadyRef.current = true;\n\n dispatch({ type: \"protected-data-ready\" });\n\n return true;\n }\n\n return false;\n }, [isReady, dispatch]));\n\n useEffect(() => {\n // State update must be executed in useEffect.\n dispatchReady();\n }, [dispatchReady]);\n\n useEffect(() => {\n if (isReadyRef.current && data) {\n dispatch({ type: \"protected-data-updated\" });\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n if (hasErrors) {\n if (!isProtectedDataReady && !isUnauthorized && queriesErrors.some(x => isUnauthorizedError(x))) {\n // Will transition the state to allow the routes to render even if the bootstrapping is not complete, because otherwise\n // a login page for example could not be rendered.\n dispatch({ type: \"is-unauthorized\" });\n }\n\n // Otherwise, when a user is logged off, a refetch might throws a 401.\n if (!queriesErrors.every(x => isUnauthorizedError(x))) {\n eventBus.dispatch(ProtectedDataFetchFailedEvent, queriesErrors);\n\n throw new GlobalDataQueriesError(\"[squide] Global protected data queries failed.\", queriesErrors);\n }\n }\n }, [hasErrors, queriesErrors, isProtectedDataReady, isUnauthorized, isUnauthorizedError, dispatch, eventBus]);\n\n return data;\n}\n"],"names":["useEventBus","useQueries","useCallback","useEffect","useRef","useAppRouterDispatcher","useAppRouterState","GlobalDataQueriesError","useCanFetchProtectedData","useExecuteOnce","ProtectedDataFetchStartedEvent","ProtectedDataFetchFailedEvent","useProtectedDataQueries","queries","isUnauthorizedError","canFetchProtectedData","eventBus","dispatch","combineResults","results","errors","x","hasErrors","data","queriesErrors","isReady","isProtectedDataReady","isUnauthorized","isReadyRef","dispatchReady"],"mappings":";;;;;;;;;;;;;;;AAA2C;AACuE;AAC3D;AAC2B;AACb;AACI;AACpB;AAE9C,MAAMU,8BAA8BA,GAAG,sCAAsC;AAC7E,MAAMC,6BAA6BA,GAAG,qCAAqC;AAelF,8DAA8D;AACvD,SAASC,uBAAuBA,CAAuBC,OAA0B,EAAEC,mBAAgD;IACtI,MAAMC,wBAAwBP,wBAAwBA;IACtD,MAAMQ,WAAWhB,WAAWA;IAE5B,MAAMiB,WAAWZ,sBAAsBA;IAEvC,MAAMa,iBAAiBhB,WAAWA,CAAC,CAACiB;QAChC,MAAMC,SAASD,QAAQ,MAAM,CAACE,CAAAA,IAAKA,EAAE,KAAK,EAAE,GAAG,CAACA,CAAAA,IAAKA,EAAE,KAAK;QAC5D,MAAMC,YAAYF,OAAO,MAAM,GAAG;QAElC,OAAO;YACH,MAAMD,QAAQ,GAAG,CAACE,CAAAA,IAAKA,EAAE,IAAI;YAC7BD;YACAE;YACA,SAAS,CAACA,aAAa,CAACH,QAAQ,IAAI,CAACE,CAAAA,IAAKA,EAAE,SAAS;QACzD;IACJ,GAAG,EAAE;IAEL,MAAM,EAAEE,IAAI,EAAE,QAAQC,aAAa,EAAEF,SAAS,EAAEG,OAAO,EAAE,GAAGxB,UAAUA,CAAC;QACnE,SAASY,QAAQ,GAAG,CAACQ,CAAAA,IAAM;gBACvB,SAASN;gBACT,GAAGM,CAAC;YACR;QACA,SAASH;IACb;IAEA,MAAM,EAAEQ,oBAAoB,EAAEC,cAAc,EAAE,GAAGrB,iBAAiBA;IAElEG,cAAcA,CAACP,WAAWA,CAAC;QACvB,IAAIa,uBAAuB;YACvBC,SAAS,QAAQ,CAACN,8BAA8BA;YAEhD,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACK;QAAuBC;KAAS,GAAG;IAEvC,6FAA6F;IAC7F,MAAMY,aAAaxB,MAAMA,CAAC;IAE1B,MAAMyB,gBAAgBpB,cAAcA,CAACP,WAAWA,CAAC;QAC7C,IAAIuB,SAAS;YACTG,WAAW,OAAO,GAAG;YAErBX,SAAS;gBAAE,MAAM;YAAuB;YAExC,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACQ;QAASR;KAAS;IAEtBd,SAASA,CAAC;QACN,8CAA8C;QAC9C0B;IACJ,GAAG;QAACA;KAAc;IAElB1B,SAASA,CAAC;QACN,IAAIyB,WAAW,OAAO,IAAIL,MAAM;YAC5BN,SAAS;gBAAE,MAAM;YAAyB;QAC9C;IACJ,GAAG;QAACM;QAAMN;KAAS;IAEnBd,SAASA,CAAC;QACN,IAAImB,WAAW;YACX,IAAI,CAACI,wBAAwB,CAACC,kBAAkBH,cAAc,IAAI,CAACH,CAAAA,IAAKP,oBAAoBO,KAAK;gBAC7F,uHAAuH;gBACvH,kDAAkD;gBAClDJ,SAAS;oBAAE,MAAM;gBAAkB;YACvC;YAEA,sEAAsE;YACtE,IAAI,CAACO,cAAc,KAAK,CAACH,CAAAA,IAAKP,oBAAoBO,KAAK;gBACnDL,SAAS,QAAQ,CAACL,6BAA6BA,EAAEa;gBAEjD,MAAM,IAAIjB,sBAAsBA,CAAC,kDAAkDiB;YACvF;QACJ;IACJ,GAAG;QAACF;QAAWE;QAAeE;QAAsBC;QAAgBb;QAAqBG;QAAUD;KAAS;IAE5G,OAAOO;AACX"}
@@ -1,6 +1,12 @@
1
1
  import { type QueriesOptions, type QueriesResults, type UseQueryResult } from "@tanstack/react-query";
2
2
  export declare const PublicDataFetchStartedEvent = "squide-public-data-fetch-started";
3
3
  export declare const PublicDataFetchFailedEvent = "squide-public-data-fetch-failed";
4
+ declare module "@squide/core" {
5
+ interface EventMap {
6
+ "squide-public-data-fetch-started": void;
7
+ "squide-public-data-fetch-failed": Error[];
8
+ }
9
+ }
4
10
  type MapUseQueryResultToData<T> = {
5
11
  [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never;
6
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"usePublicDataQueries.js","sources":["../src/usePublicDataQueries.ts"],"sourcesContent":["import { useEventBus } from \"@squide/core\";\nimport { useQueries, type QueriesOptions, type QueriesResults, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useAppRouterDispatcher } from \"./AppRouterContext.ts\";\nimport { GlobalDataQueriesError } from \"./GlobalDataQueriesError.ts\";\nimport { useCanFetchPublicData } from \"./useCanFetchPublicData.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\n\nexport const PublicDataFetchStartedEvent = \"squide-public-data-fetch-started\";\nexport const PublicDataFetchFailedEvent = \"squide-public-data-fetch-failed\";\n\n// This converts an array of UseQueryResult to an array of the data type of each query result.\n// For more information, view: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays.\ntype MapUseQueryResultToData<T> = { [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function usePublicDataQueries<T extends Array<any>>(queries: QueriesOptions<T>): MapUseQueryResultToData<QueriesResults<T>> {\n const canFetchPublicData = useCanFetchPublicData();\n const eventBus = useEventBus();\n\n const dispatch = useAppRouterDispatcher();\n\n const combineResults = useCallback((results: UseQueryResult<unknown, unknown>[]) => {\n const errors = results.filter(x => x.error).map(x => x.error) as Error[];\n const hasErrors = errors.length > 0;\n\n return {\n data: results.map(x => x.data) as MapUseQueryResultToData<QueriesResults<T>>,\n errors,\n hasErrors,\n isReady: !hasErrors && !results.some(x => x.isPending)\n };\n }, []);\n\n const { data, errors: queriesErrors, hasErrors, isReady } = useQueries({\n queries: queries.map(x => ({\n enabled: canFetchPublicData,\n ...x\n })),\n combine: combineResults\n });\n\n useExecuteOnce(useCallback(() => {\n if (canFetchPublicData) {\n eventBus.dispatch(PublicDataFetchStartedEvent);\n\n return true;\n }\n\n return false;\n }, [canFetchPublicData, eventBus]), true);\n\n // Using a ref seems to be the only way to prevent starting two deferred registrations scope.\n const isReadyRef = useRef(false);\n\n const dispatchReady = useExecuteOnce(useCallback(() => {\n if (isReady) {\n isReadyRef.current = true;\n\n dispatch({ type: \"public-data-ready\" });\n\n return true;\n }\n\n return false;\n }, [isReady, dispatch]));\n\n useEffect(() => {\n // State update must be executed in useEffect.\n dispatchReady();\n }, [dispatchReady]);\n\n useEffect(() => {\n if (isReadyRef.current && data) {\n dispatch({ type: \"public-data-updated\" });\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n if (hasErrors) {\n eventBus.dispatch(PublicDataFetchFailedEvent, queriesErrors);\n\n throw new GlobalDataQueriesError(\"[squide] Global public data queries failed.\", queriesErrors);\n }\n }, [hasErrors, queriesErrors, eventBus]);\n\n return data;\n}\n"],"names":["useEventBus","useQueries","useCallback","useEffect","useRef","useAppRouterDispatcher","GlobalDataQueriesError","useCanFetchPublicData","useExecuteOnce","PublicDataFetchStartedEvent","PublicDataFetchFailedEvent","usePublicDataQueries","queries","canFetchPublicData","eventBus","dispatch","combineResults","results","errors","x","hasErrors","data","queriesErrors","isReady","isReadyRef","dispatchReady"],"mappings":";;;;;;;;;;;;;;;AAA2C;AACuE;AAC3D;AACQ;AACM;AACF;AACd;AAE9C,MAAMS,2BAA2BA,GAAG,mCAAmC;AACvE,MAAMC,0BAA0BA,GAAG,kCAAkC;AAM5E,8DAA8D;AACvD,SAASC,oBAAoBA,CAAuBC,OAA0B;IACjF,MAAMC,qBAAqBN,qBAAqBA;IAChD,MAAMO,WAAWd,WAAWA;IAE5B,MAAMe,WAAWV,sBAAsBA;IAEvC,MAAMW,iBAAiBd,WAAWA,CAAC,CAACe;QAChC,MAAMC,SAASD,QAAQ,MAAM,CAACE,CAAAA,IAAKA,EAAE,KAAK,EAAE,GAAG,CAACA,CAAAA,IAAKA,EAAE,KAAK;QAC5D,MAAMC,YAAYF,OAAO,MAAM,GAAG;QAElC,OAAO;YACH,MAAMD,QAAQ,GAAG,CAACE,CAAAA,IAAKA,EAAE,IAAI;YAC7BD;YACAE;YACA,SAAS,CAACA,aAAa,CAACH,QAAQ,IAAI,CAACE,CAAAA,IAAKA,EAAE,SAAS;QACzD;IACJ,GAAG,EAAE;IAEL,MAAM,EAAEE,IAAI,EAAE,QAAQC,aAAa,EAAEF,SAAS,EAAEG,OAAO,EAAE,GAAGtB,UAAUA,CAAC;QACnE,SAASW,QAAQ,GAAG,CAACO,CAAAA,IAAM;gBACvB,SAASN;gBACT,GAAGM,CAAC;YACR;QACA,SAASH;IACb;IAEAR,cAAcA,CAACN,WAAWA,CAAC;QACvB,IAAIW,oBAAoB;YACpBC,SAAS,QAAQ,CAACL,2BAA2BA;YAE7C,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACI;QAAoBC;KAAS,GAAG;IAEpC,6FAA6F;IAC7F,MAAMU,aAAapB,MAAMA,CAAC;IAE1B,MAAMqB,gBAAgBjB,cAAcA,CAACN,WAAWA,CAAC;QAC7C,IAAIqB,SAAS;YACTC,WAAW,OAAO,GAAG;YAErBT,SAAS;gBAAE,MAAM;YAAoB;YAErC,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACQ;QAASR;KAAS;IAEtBZ,SAASA,CAAC;QACN,8CAA8C;QAC9CsB;IACJ,GAAG;QAACA;KAAc;IAElBtB,SAASA,CAAC;QACN,IAAIqB,WAAW,OAAO,IAAIH,MAAM;YAC5BN,SAAS;gBAAE,MAAM;YAAsB;QAC3C;IACJ,GAAG;QAACM;QAAMN;KAAS;IAEnBZ,SAASA,CAAC;QACN,IAAIiB,WAAW;YACXN,SAAS,QAAQ,CAACJ,0BAA0BA,EAAEY;YAE9C,MAAM,IAAIhB,sBAAsBA,CAAC,+CAA+CgB;QACpF;IACJ,GAAG;QAACF;QAAWE;QAAeR;KAAS;IAEvC,OAAOO;AACX"}
1
+ {"version":3,"file":"usePublicDataQueries.js","sources":["../src/usePublicDataQueries.ts"],"sourcesContent":["import { useEventBus } from \"@squide/core\";\nimport { useQueries, type QueriesOptions, type QueriesResults, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useAppRouterDispatcher } from \"./AppRouterContext.ts\";\nimport { GlobalDataQueriesError } from \"./GlobalDataQueriesError.ts\";\nimport { useCanFetchPublicData } from \"./useCanFetchPublicData.ts\";\nimport { useExecuteOnce } from \"./useExecuteOnce.ts\";\n\nexport const PublicDataFetchStartedEvent = \"squide-public-data-fetch-started\";\nexport const PublicDataFetchFailedEvent = \"squide-public-data-fetch-failed\";\n\ndeclare module \"@squide/core\" {\n interface EventMap {\n \"squide-public-data-fetch-started\": void;\n \"squide-public-data-fetch-failed\": Error[];\n }\n}\n\n// This converts an array of UseQueryResult to an array of the data type of each query result.\n// For more information, view: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays.\ntype MapUseQueryResultToData<T> = { [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function usePublicDataQueries<T extends Array<any>>(queries: QueriesOptions<T>): MapUseQueryResultToData<QueriesResults<T>> {\n const canFetchPublicData = useCanFetchPublicData();\n const eventBus = useEventBus();\n\n const dispatch = useAppRouterDispatcher();\n\n const combineResults = useCallback((results: UseQueryResult<unknown, unknown>[]) => {\n const errors = results.filter(x => x.error).map(x => x.error) as Error[];\n const hasErrors = errors.length > 0;\n\n return {\n data: results.map(x => x.data) as MapUseQueryResultToData<QueriesResults<T>>,\n errors,\n hasErrors,\n isReady: !hasErrors && !results.some(x => x.isPending)\n };\n }, []);\n\n const { data, errors: queriesErrors, hasErrors, isReady } = useQueries({\n queries: queries.map(x => ({\n enabled: canFetchPublicData,\n ...x\n })),\n combine: combineResults\n });\n\n useExecuteOnce(useCallback(() => {\n if (canFetchPublicData) {\n eventBus.dispatch(PublicDataFetchStartedEvent);\n\n return true;\n }\n\n return false;\n }, [canFetchPublicData, eventBus]), true);\n\n // Using a ref seems to be the only way to prevent starting two deferred registrations scope.\n const isReadyRef = useRef(false);\n\n const dispatchReady = useExecuteOnce(useCallback(() => {\n if (isReady) {\n isReadyRef.current = true;\n\n dispatch({ type: \"public-data-ready\" });\n\n return true;\n }\n\n return false;\n }, [isReady, dispatch]));\n\n useEffect(() => {\n // State update must be executed in useEffect.\n dispatchReady();\n }, [dispatchReady]);\n\n useEffect(() => {\n if (isReadyRef.current && data) {\n dispatch({ type: \"public-data-updated\" });\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n if (hasErrors) {\n eventBus.dispatch(PublicDataFetchFailedEvent, queriesErrors);\n\n throw new GlobalDataQueriesError(\"[squide] Global public data queries failed.\", queriesErrors);\n }\n }, [hasErrors, queriesErrors, eventBus]);\n\n return data;\n}\n"],"names":["useEventBus","useQueries","useCallback","useEffect","useRef","useAppRouterDispatcher","GlobalDataQueriesError","useCanFetchPublicData","useExecuteOnce","PublicDataFetchStartedEvent","PublicDataFetchFailedEvent","usePublicDataQueries","queries","canFetchPublicData","eventBus","dispatch","combineResults","results","errors","x","hasErrors","data","queriesErrors","isReady","isReadyRef","dispatchReady"],"mappings":";;;;;;;;;;;;;;;AAA2C;AACuE;AAC3D;AACQ;AACM;AACF;AACd;AAE9C,MAAMS,2BAA2BA,GAAG,mCAAmC;AACvE,MAAMC,0BAA0BA,GAAG,kCAAkC;AAa5E,8DAA8D;AACvD,SAASC,oBAAoBA,CAAuBC,OAA0B;IACjF,MAAMC,qBAAqBN,qBAAqBA;IAChD,MAAMO,WAAWd,WAAWA;IAE5B,MAAMe,WAAWV,sBAAsBA;IAEvC,MAAMW,iBAAiBd,WAAWA,CAAC,CAACe;QAChC,MAAMC,SAASD,QAAQ,MAAM,CAACE,CAAAA,IAAKA,EAAE,KAAK,EAAE,GAAG,CAACA,CAAAA,IAAKA,EAAE,KAAK;QAC5D,MAAMC,YAAYF,OAAO,MAAM,GAAG;QAElC,OAAO;YACH,MAAMD,QAAQ,GAAG,CAACE,CAAAA,IAAKA,EAAE,IAAI;YAC7BD;YACAE;YACA,SAAS,CAACA,aAAa,CAACH,QAAQ,IAAI,CAACE,CAAAA,IAAKA,EAAE,SAAS;QACzD;IACJ,GAAG,EAAE;IAEL,MAAM,EAAEE,IAAI,EAAE,QAAQC,aAAa,EAAEF,SAAS,EAAEG,OAAO,EAAE,GAAGtB,UAAUA,CAAC;QACnE,SAASW,QAAQ,GAAG,CAACO,CAAAA,IAAM;gBACvB,SAASN;gBACT,GAAGM,CAAC;YACR;QACA,SAASH;IACb;IAEAR,cAAcA,CAACN,WAAWA,CAAC;QACvB,IAAIW,oBAAoB;YACpBC,SAAS,QAAQ,CAACL,2BAA2BA;YAE7C,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACI;QAAoBC;KAAS,GAAG;IAEpC,6FAA6F;IAC7F,MAAMU,aAAapB,MAAMA,CAAC;IAE1B,MAAMqB,gBAAgBjB,cAAcA,CAACN,WAAWA,CAAC;QAC7C,IAAIqB,SAAS;YACTC,WAAW,OAAO,GAAG;YAErBT,SAAS;gBAAE,MAAM;YAAoB;YAErC,OAAO;QACX;QAEA,OAAO;IACX,GAAG;QAACQ;QAASR;KAAS;IAEtBZ,SAASA,CAAC;QACN,8CAA8C;QAC9CsB;IACJ,GAAG;QAACA;KAAc;IAElBtB,SAASA,CAAC;QACN,IAAIqB,WAAW,OAAO,IAAIH,MAAM;YAC5BN,SAAS;gBAAE,MAAM;YAAsB;QAC3C;IACJ,GAAG;QAACM;QAAMN;KAAS;IAEnBZ,SAASA,CAAC;QACN,IAAIiB,WAAW;YACXN,SAAS,QAAQ,CAACJ,0BAA0BA,EAAEY;YAE9C,MAAM,IAAIhB,sBAAsBA,CAAC,+CAA+CgB;QACpF;IACJ,GAAG;QAACF;QAAWE;QAAeR;KAAS;IAEvC,OAAOO;AACX"}
@@ -1,3 +1,9 @@
1
1
  export declare const DeferredRegistrationsUpdateStartedEvent = "squide-deferred-registrations-update-started";
2
2
  export declare const DeferredRegistrationsUpdateCompletedEvent = "squide-deferred-registrations-update-completed-started";
3
+ declare module "@squide/core" {
4
+ interface EventMap {
5
+ "squide-deferred-registrations-update-started": void;
6
+ "squide-deferred-registrations-update-completed-started": void;
7
+ }
8
+ }
3
9
  export declare function useUpdateDeferredRegistrations(): <TData = unknown>(data?: TData) => Promise<import("@squide/core").ModuleRegistrationError[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"useUpdateDeferredRegistrations.js","sources":["../src/useUpdateDeferredRegistrations.ts"],"sourcesContent":["import { useRuntime } from \"@squide/core\";\nimport { useCallback } from \"react\";\nimport { useAppRouterDispatcher } from \"./AppRouterContext.ts\";\n\nexport const DeferredRegistrationsUpdateStartedEvent = \"squide-deferred-registrations-update-started\";\nexport const DeferredRegistrationsUpdateCompletedEvent = \"squide-deferred-registrations-update-completed-started\";\n\nexport function useUpdateDeferredRegistrations() {\n const runtime = useRuntime();\n const dispatch = useAppRouterDispatcher();\n\n return useCallback(async <TData = unknown>(data?: TData) => {\n runtime.eventBus.dispatch(DeferredRegistrationsUpdateStartedEvent);\n\n const errors = await runtime.moduleManager.updateDeferredRegistrations(data);\n\n dispatch({ type: \"deferred-registrations-updated\" });\n\n runtime.eventBus.dispatch(DeferredRegistrationsUpdateCompletedEvent);\n\n return errors;\n }, [runtime, dispatch]);\n}\n"],"names":["useRuntime","useCallback","useAppRouterDispatcher","DeferredRegistrationsUpdateStartedEvent","DeferredRegistrationsUpdateCompletedEvent","useUpdateDeferredRegistrations","runtime","dispatch","data","errors"],"mappings":";;;;;;;AAA0C;AACN;AAC2B;AAExD,MAAMG,uCAAuCA,GAAG,+CAA+C;AAC/F,MAAMC,yCAAyCA,GAAG,yDAAyD;AAE3G,SAASC,8BAA8BA;IAC1C,MAAMC,UAAUN,UAAUA;IAC1B,MAAMO,WAAWL,sBAAsBA;IAEvC,OAAOD,WAAWA,CAAC,OAAwBO;QACvCF,QAAQ,QAAQ,CAAC,QAAQ,CAACH,uCAAuCA;QAEjE,MAAMM,SAAS,MAAMH,QAAQ,aAAa,CAAC,2BAA2B,CAACE;QAEvED,SAAS;YAAE,MAAM;QAAiC;QAElDD,QAAQ,QAAQ,CAAC,QAAQ,CAACF,yCAAyCA;QAEnE,OAAOK;IACX,GAAG;QAACH;QAASC;KAAS;AAC1B"}
1
+ {"version":3,"file":"useUpdateDeferredRegistrations.js","sources":["../src/useUpdateDeferredRegistrations.ts"],"sourcesContent":["import { useRuntime } from \"@squide/core\";\nimport { useCallback } from \"react\";\nimport { useAppRouterDispatcher } from \"./AppRouterContext.ts\";\n\nexport const DeferredRegistrationsUpdateStartedEvent = \"squide-deferred-registrations-update-started\";\nexport const DeferredRegistrationsUpdateCompletedEvent = \"squide-deferred-registrations-update-completed-started\";\n\ndeclare module \"@squide/core\" {\n interface EventMap {\n \"squide-deferred-registrations-update-started\": void;\n \"squide-deferred-registrations-update-completed-started\": void;\n }\n}\n\nexport function useUpdateDeferredRegistrations() {\n const runtime = useRuntime();\n const dispatch = useAppRouterDispatcher();\n\n return useCallback(async <TData = unknown>(data?: TData) => {\n runtime.eventBus.dispatch(DeferredRegistrationsUpdateStartedEvent);\n\n const errors = await runtime.moduleManager.updateDeferredRegistrations(data);\n\n dispatch({ type: \"deferred-registrations-updated\" });\n\n runtime.eventBus.dispatch(DeferredRegistrationsUpdateCompletedEvent);\n\n return errors;\n }, [runtime, dispatch]);\n}\n"],"names":["useRuntime","useCallback","useAppRouterDispatcher","DeferredRegistrationsUpdateStartedEvent","DeferredRegistrationsUpdateCompletedEvent","useUpdateDeferredRegistrations","runtime","dispatch","data","errors"],"mappings":";;;;;;;AAA0C;AACN;AAC2B;AAExD,MAAMG,uCAAuCA,GAAG,+CAA+C;AAC/F,MAAMC,yCAAyCA,GAAG,yDAAyD;AAS3G,SAASC,8BAA8BA;IAC1C,MAAMC,UAAUN,UAAUA;IAC1B,MAAMO,WAAWL,sBAAsBA;IAEvC,OAAOD,WAAWA,CAAC,OAAwBO;QACvCF,QAAQ,QAAQ,CAAC,QAAQ,CAACH,uCAAuCA;QAEjE,MAAMM,SAAS,MAAMH,QAAQ,aAAa,CAAC,2BAA2B,CAACE;QAEvED,SAAS;YAAE,MAAM;QAAiC;QAElDD,QAAQ,QAAQ,CAAC,QAAQ,CAACF,yCAAyCA;QAEnE,OAAOK;IACX,GAAG;QAACH;QAASC;KAAS;AAC1B"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@squide/firefly",
3
3
  "author": "Workleap",
4
- "version": "16.2.2",
4
+ "version": "17.0.1",
5
5
  "description": "Squide bundle for the firefly technology stack.",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -33,12 +33,12 @@
33
33
  ],
34
34
  "peerDependencies": {
35
35
  "@opentelemetry/api": "^1.9.1",
36
- "@tanstack/react-query": "^5.96.0",
37
- "launchdarkly-js-client-sdk": "^3.9.0",
36
+ "@tanstack/react-query": "^5.96.2",
37
+ "launchdarkly-js-client-sdk": "^3.9.1",
38
38
  "msw": "^2.12.14",
39
39
  "react": "^18.0.0 || ^19.0.0",
40
40
  "react-dom": "^18.0.0 || ^19.0.0",
41
- "react-router": "^7.13.2"
41
+ "react-router": "^7.14.0"
42
42
  },
43
43
  "peerDependenciesMeta": {
44
44
  "@opentelemetry/api": {
@@ -49,22 +49,22 @@
49
49
  "@workleap-telemetry/core": "^2.0.1",
50
50
  "@workleap/logging": "^1.3.7",
51
51
  "uuid": "^13.0.0",
52
- "@squide/core": "^6.1.15",
53
- "@squide/env-vars": "^1.4.20",
54
- "@squide/launch-darkly": "^1.0.11",
55
- "@squide/msw": "^4.0.18",
56
- "@squide/react-router": "^8.1.18"
52
+ "@squide/core": "^7.0.0",
53
+ "@squide/env-vars": "^1.4.21",
54
+ "@squide/launch-darkly": "^1.0.14",
55
+ "@squide/msw": "^4.0.19",
56
+ "@squide/react-router": "^8.1.20"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@eslint/js": "9.39.2",
60
60
  "@rsbuild/core": "1.7.5",
61
- "@rslib/core": "0.20.2",
61
+ "@rslib/core": "0.20.3",
62
62
  "@testing-library/react": "16.3.2",
63
- "@types/node": "25.5.0",
63
+ "@types/node": "25.5.2",
64
64
  "@types/react": "19.2.14",
65
65
  "@types/react-dom": "19.2.3",
66
66
  "@typescript-eslint/parser": "8.58.0",
67
- "@typescript/native-preview": "7.0.0-dev.20260331.1",
67
+ "@typescript/native-preview": "7.0.0-dev.20260407.1",
68
68
  "@vitejs/plugin-react": "6.0.1",
69
69
  "@workleap/eslint-configs": "2.0.1",
70
70
  "@workleap/rslib-configs": "1.1.11",
@@ -73,7 +73,7 @@
73
73
  "happy-dom": "20.8.9",
74
74
  "typescript": "6.0.2",
75
75
  "typescript-eslint": "8.54.0",
76
- "vitest": "4.1.2"
76
+ "vitest": "4.1.3"
77
77
  },
78
78
  "sideEffects": false,
79
79
  "scripts": {
@@ -56,6 +56,24 @@ export const ProtectedDataUpdatedEvent = "squide-protected-data-updated";
56
56
  export const DeferredRegistrationsUpdatedEvent = "squide-deferred-registrations-updated";
57
57
  export const ApplicationBoostrappedEvent = "squide-app-boostrapped";
58
58
 
59
+ declare module "@squide/core" {
60
+ interface EventMap {
61
+ "squide-modules-registered": AppRouterWaitState;
62
+ "squide-modules-ready": AppRouterWaitState;
63
+ "squide-msw-ready": AppRouterWaitState;
64
+ "squide-active-route-is-public": AppRouterWaitState;
65
+ "squide-active-route-is-protected": AppRouterWaitState;
66
+ "squide-public-data-ready": AppRouterWaitState;
67
+ "squide-protected-data-ready": AppRouterWaitState;
68
+ "squide-public-data-updated": AppRouterWaitState;
69
+ "squide-protected-data-updated": AppRouterWaitState;
70
+ "squide-deferred-registrations-updated": AppRouterWaitState;
71
+ "squide-feature-flags-updated": AppRouterWaitState;
72
+ "squide-is-unauthorized": AppRouterWaitState;
73
+ "squide-app-boostrapped": AppRouterWaitState;
74
+ }
75
+ }
76
+
59
77
  export interface AppRouterAction {
60
78
  type: AppRouterActionType;
61
79
  payload?: unknown;
@@ -2,25 +2,19 @@ import type { Span } from "@opentelemetry/api";
2
2
  import {
3
3
  type AddListenerOptions,
4
4
  type EventCallbackFunction,
5
- type EventName,
5
+ type EventMap,
6
+ type EventMapKey,
6
7
  LocalModuleDeferredRegistrationFailedEvent,
7
8
  LocalModuleDeferredRegistrationUpdateFailedEvent,
8
9
  LocalModuleRegistrationFailedEvent,
9
10
  LocalModulesDeferredRegistrationCompletedEvent,
10
- type LocalModulesDeferredRegistrationCompletedEventPayload,
11
11
  LocalModulesDeferredRegistrationStartedEvent,
12
- type LocalModulesDeferredRegistrationStartedEventPayload,
13
12
  LocalModulesDeferredRegistrationsUpdateCompletedEvent,
14
- type LocalModulesDeferredRegistrationsUpdateCompletedEventPayload,
15
13
  LocalModulesDeferredRegistrationsUpdateStartedEvent,
16
- type LocalModulesDeferredRegistrationsUpdateStartedEventPayload,
17
14
  LocalModulesRegistrationCompletedEvent,
18
- type LocalModulesRegistrationCompletedEventPayload,
19
- LocalModulesRegistrationStartedEvent,
20
- type LocalModulesRegistrationStartedEventPayload,
21
- type ModuleRegistrationError
15
+ LocalModulesRegistrationStartedEvent
22
16
  } from "@squide/core";
23
- import { ApplicationBoostrappedEvent, type AppRouterWaitState, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, PublicDataReadyEvent } from "../AppRouterReducer.ts";
17
+ import { ApplicationBoostrappedEvent, ModulesReadyEvent, ModulesRegisteredEvent, MswReadyEvent, ProtectedDataReadyEvent, PublicDataReadyEvent } from "../AppRouterReducer.ts";
24
18
  import { FireflyPlugin } from "../FireflyPlugin.ts";
25
19
  import type { FireflyRuntime } from "../FireflyRuntime.tsx";
26
20
  import { ApplicationBootstrappingStartedEvent } from "../initializeFirefly.ts";
@@ -40,13 +34,13 @@ export interface AddProtectedListenerOptions extends AddListenerOptions {
40
34
  onError?: (error: unknown) => void;
41
35
  }
42
36
 
43
- export function addProtectedListener(runtime: FireflyRuntime, eventName: EventName, callback: EventCallbackFunction, options?: AddProtectedListenerOptions) {
44
- const protectedCallback = (...args: unknown[]) => {
37
+ export function addProtectedListener<K extends EventMapKey>(runtime: FireflyRuntime, eventName: K, callback: EventCallbackFunction<EventMap[K]>, options?: AddProtectedListenerOptions) {
38
+ const protectedCallback: EventCallbackFunction<EventMap[K]> = data => {
45
39
  try {
46
- callback(...args);
40
+ callback(data);
47
41
  } catch (error: unknown) {
48
42
  runtime.logger
49
- .withText(`[squide] An unmanaged error occurred while handling event "${eventName.toString()}" for Honeycomb instrumentation:`)
43
+ .withText(`[squide] An unmanaged error occurred while handling event "${String(eventName)}" for Honeycomb instrumentation:`)
50
44
  .withError(error as Error)
51
45
  .error();
52
46
  }
@@ -89,7 +83,7 @@ export function reduceDataFetchEvents(
89
83
  onPublicDataReady();
90
84
 
91
85
  if (dataFetchState === "fetching-data") {
92
- if (payload && !(payload as AppRouterWaitState).waitForProtectedData) {
86
+ if (payload && !payload.waitForProtectedData) {
93
87
  dataFetchState = "data-ready";
94
88
  onDataReady();
95
89
  } else {
@@ -120,7 +114,7 @@ export function reduceDataFetchEvents(
120
114
  onProtectedDataReady();
121
115
 
122
116
  if (dataFetchState === "fetching-data") {
123
- if (payload && !(payload as AppRouterWaitState).waitForPublicData) {
117
+ if (payload && !payload.waitForPublicData) {
124
118
  dataFetchState = "data-ready";
125
119
  onDataReady();
126
120
  } else {
@@ -135,11 +129,11 @@ export function reduceDataFetchEvents(
135
129
  onError: onUnmanagedError
136
130
  });
137
131
 
138
- const handleDataFetchFailed = (payload: unknown) => {
132
+ const handleDataFetchFailed: EventCallbackFunction<Error[]> = payload => {
139
133
  if (dataFetchState !== "data-fetch-failed") {
140
134
  dataFetchState = "data-fetch-failed";
141
135
 
142
- onDataFetchFailed(payload as Error[]);
136
+ onDataFetchFailed(payload ?? []);
143
137
  }
144
138
  };
145
139
 
@@ -224,9 +218,9 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
224
218
  onError: handleUnmanagedError
225
219
  });
226
220
 
227
- addProtectedListener(runtime, LocalModulesRegistrationStartedEvent, (payload: unknown) => {
221
+ addProtectedListener(runtime, LocalModulesRegistrationStartedEvent, payload => {
228
222
  const attributes = {
229
- "app.squide.module_count": (payload as LocalModulesRegistrationStartedEventPayload).moduleCount
223
+ "app.squide.module_count": payload?.moduleCount
230
224
  };
231
225
 
232
226
  if (bootstrappingSpan) {
@@ -241,10 +235,10 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
241
235
  onError: handleUnmanagedError
242
236
  });
243
237
 
244
- addProtectedListener(runtime, LocalModulesRegistrationCompletedEvent, (payload: unknown) => {
238
+ addProtectedListener(runtime, LocalModulesRegistrationCompletedEvent, payload => {
245
239
  if (bootstrappingSpan) {
246
240
  bootstrappingSpan.addEvent("local-module-registration-completed", {
247
- "app.squide.module_count": (payload as LocalModulesRegistrationCompletedEventPayload).moduleCount
241
+ "app.squide.module_count": payload?.moduleCount
248
242
  });
249
243
  }
250
244
 
@@ -257,19 +251,17 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
257
251
  });
258
252
 
259
253
  // Can occur multiple times.
260
- addProtectedListener(runtime, LocalModuleRegistrationFailedEvent, (payload: unknown) => {
261
- const registrationError = payload as ModuleRegistrationError;
262
-
254
+ addProtectedListener(runtime, LocalModuleRegistrationFailedEvent, payload => {
263
255
  if (localModuleRegistrationSpan) {
264
- traceError(localModuleRegistrationSpan, registrationError);
256
+ traceError(localModuleRegistrationSpan, payload as Error);
265
257
  }
266
258
  }, {
267
259
  onError: handleUnmanagedError
268
260
  });
269
261
 
270
- addProtectedListener(runtime, LocalModulesDeferredRegistrationStartedEvent, (payload: unknown) => {
262
+ addProtectedListener(runtime, LocalModulesDeferredRegistrationStartedEvent, payload => {
271
263
  const attributes = {
272
- "app.squide.registration_count": (payload as LocalModulesDeferredRegistrationStartedEventPayload).registrationCount
264
+ "app.squide.registration_count": payload?.registrationCount
273
265
  };
274
266
 
275
267
  if (bootstrappingSpan) {
@@ -284,10 +276,10 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
284
276
  onError: handleUnmanagedError
285
277
  });
286
278
 
287
- addProtectedListener(runtime, LocalModulesDeferredRegistrationCompletedEvent, (payload: unknown) => {
279
+ addProtectedListener(runtime, LocalModulesDeferredRegistrationCompletedEvent, payload => {
288
280
  if (bootstrappingSpan) {
289
281
  bootstrappingSpan.addEvent("local-module-deferred-registration-completed", {
290
- "app.squide.registration_count": (payload as LocalModulesDeferredRegistrationCompletedEventPayload).registrationCount
282
+ "app.squide.registration_count": payload?.registrationCount
291
283
  });
292
284
  }
293
285
 
@@ -300,11 +292,9 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
300
292
  });
301
293
 
302
294
  // Can occur multiple times.
303
- addProtectedListener(runtime, LocalModuleDeferredRegistrationFailedEvent, (payload: unknown) => {
304
- const registrationError = payload as ModuleRegistrationError;
305
-
295
+ addProtectedListener(runtime, LocalModuleDeferredRegistrationFailedEvent, payload => {
306
296
  if (localModuleDeferredRegistrationSpan) {
307
- traceError(localModuleRegistrationSpan, registrationError);
297
+ traceError(localModuleRegistrationSpan, payload as Error);
308
298
  }
309
299
  }, {
310
300
  onError: handleUnmanagedError
@@ -416,9 +406,9 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
416
406
  });
417
407
 
418
408
  // Can occur multiple times.
419
- addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateStartedEvent, (payload: unknown) => {
409
+ addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateStartedEvent, payload => {
420
410
  const attributes = {
421
- "app.squide.registration_count": (payload as LocalModulesDeferredRegistrationsUpdateStartedEventPayload).registrationCount
411
+ "app.squide.registration_count": payload?.registrationCount
422
412
  };
423
413
 
424
414
  if (deferredRegistrationsUpdateSpan) {
@@ -443,10 +433,10 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
443
433
  });
444
434
 
445
435
  // Can occur multiple times.
446
- addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateCompletedEvent, (payload: unknown) => {
436
+ addProtectedListener(runtime, LocalModulesDeferredRegistrationsUpdateCompletedEvent, payload => {
447
437
  if (deferredRegistrationsUpdateSpan) {
448
438
  deferredRegistrationsUpdateSpan.addEvent("local-module-deferred-registrations-update-completed", {
449
- "app.squide.registration_count": (payload as LocalModulesDeferredRegistrationsUpdateCompletedEventPayload).registrationCount
439
+ "app.squide.registration_count": payload?.registrationCount
450
440
  });
451
441
  }
452
442
 
@@ -458,11 +448,9 @@ function registerTrackingListeners(runtime: FireflyRuntime) {
458
448
  });
459
449
 
460
450
  // Can occur multiple times.
461
- addProtectedListener(runtime, LocalModuleDeferredRegistrationUpdateFailedEvent, (payload: unknown) => {
462
- const registrationError = payload as ModuleRegistrationError;
463
-
451
+ addProtectedListener(runtime, LocalModuleDeferredRegistrationUpdateFailedEvent, payload => {
464
452
  if (localModuleDeferredRegistrationsUpdateSpan) {
465
- traceError(localModuleDeferredRegistrationsUpdateSpan.instance, registrationError);
453
+ traceError(localModuleDeferredRegistrationsUpdateSpan.instance, payload as Error);
466
454
  }
467
455
  }, {
468
456
  onError: handleUnmanagedError
@@ -11,6 +11,12 @@ import { initializeHoneycomb } from "./honeycomb/initializeHoneycomb.ts";
11
11
 
12
12
  export const ApplicationBootstrappingStartedEvent = "squide-app-bootstrapping-started";
13
13
 
14
+ declare module "@squide/core" {
15
+ interface EventMap {
16
+ "squide-app-bootstrapping-started": void;
17
+ }
18
+ }
19
+
14
20
  export type OnInitializationErrorFunction = (error: unknown) => void;
15
21
 
16
22
  export type StartMswFunction<TRuntime = FireflyRuntime> = (runtime: TRuntime) => Promise<void>;
@@ -9,6 +9,13 @@ import { useExecuteOnce } from "./useExecuteOnce.ts";
9
9
  export const ProtectedDataFetchStartedEvent = "squide-protected-data-fetch-started";
10
10
  export const ProtectedDataFetchFailedEvent = "squide-protected-data-fetch-failed";
11
11
 
12
+ declare module "@squide/core" {
13
+ interface EventMap {
14
+ "squide-protected-data-fetch-started": void;
15
+ "squide-protected-data-fetch-failed": Error[];
16
+ }
17
+ }
18
+
12
19
  export type IsUnauthorizedErrorCallback = (error: unknown) => boolean;
13
20
 
14
21
  // This converts an array of UseQueryResult to an array of the data type of each query result.
@@ -9,6 +9,13 @@ import { useExecuteOnce } from "./useExecuteOnce.ts";
9
9
  export const PublicDataFetchStartedEvent = "squide-public-data-fetch-started";
10
10
  export const PublicDataFetchFailedEvent = "squide-public-data-fetch-failed";
11
11
 
12
+ declare module "@squide/core" {
13
+ interface EventMap {
14
+ "squide-public-data-fetch-started": void;
15
+ "squide-public-data-fetch-failed": Error[];
16
+ }
17
+ }
18
+
12
19
  // This converts an array of UseQueryResult to an array of the data type of each query result.
13
20
  // For more information, view: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#mapped-types-on-tuples-and-arrays.
14
21
  type MapUseQueryResultToData<T> = { [K in keyof T]: T[K] extends UseQueryResult<infer U> ? U : never };
@@ -5,6 +5,13 @@ import { useAppRouterDispatcher } from "./AppRouterContext.ts";
5
5
  export const DeferredRegistrationsUpdateStartedEvent = "squide-deferred-registrations-update-started";
6
6
  export const DeferredRegistrationsUpdateCompletedEvent = "squide-deferred-registrations-update-completed-started";
7
7
 
8
+ declare module "@squide/core" {
9
+ interface EventMap {
10
+ "squide-deferred-registrations-update-started": void;
11
+ "squide-deferred-registrations-update-completed-started": void;
12
+ }
13
+ }
14
+
8
15
  export function useUpdateDeferredRegistrations() {
9
16
  const runtime = useRuntime();
10
17
  const dispatch = useAppRouterDispatcher();