@launchdarkly/toolbar 2.0.0-beta.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +6 -4
  2. package/cdn/toolbar.min.js +984 -10
  3. package/cdn/toolbar.min.js.LICENSE.txt +14 -0
  4. package/dist/core/services/DevServerClient.d.ts +4 -6
  5. package/dist/core/tests/mocks/providers.d.ts +132 -0
  6. package/dist/core/types/devServer.d.ts +2 -3
  7. package/dist/core/ui/{Toolbar/components → Buttons}/IconButton.d.ts +2 -1
  8. package/dist/core/ui/{Toolbar/components → Buttons}/StarButton.css.d.ts +1 -0
  9. package/dist/core/ui/JsonEditor/JsonEditor.d.ts +2 -1
  10. package/dist/core/ui/Toolbar/LaunchDarklyToolbar.d.ts +0 -1
  11. package/dist/core/ui/Toolbar/components/{AuthenticationModal.d.ts → AuthenticationModal/AuthenticationModal.d.ts} +1 -1
  12. package/dist/core/ui/Toolbar/components/CopyableText.css.d.ts +4 -0
  13. package/dist/core/ui/Toolbar/components/CopyableText.d.ts +18 -0
  14. package/dist/core/ui/Toolbar/components/FilterOptions/FilterOptions.css.d.ts +1 -0
  15. package/dist/core/ui/Toolbar/components/FilterOptions/FilterOptions.d.ts +1 -0
  16. package/dist/core/ui/Toolbar/components/FilterOptions/ShareUrlButton.css.d.ts +2 -0
  17. package/dist/core/ui/Toolbar/components/FilterOptions/ShareUrlButton.d.ts +7 -0
  18. package/dist/core/ui/Toolbar/components/LoadingScreen/LoadingScreen.css.d.ts +7 -0
  19. package/dist/core/ui/Toolbar/components/LoadingScreen/LoadingScreen.d.ts +5 -0
  20. package/dist/core/ui/Toolbar/components/LoadingScreen/index.d.ts +1 -0
  21. package/dist/core/ui/Toolbar/components/ShareStatePopover/ShareStatePopover.css.d.ts +10 -0
  22. package/dist/core/ui/Toolbar/components/ShareStatePopover/ShareStatePopover.d.ts +15 -0
  23. package/dist/core/ui/Toolbar/components/ShareStatePopover/index.d.ts +2 -0
  24. package/dist/core/ui/Toolbar/components/icons/ChartHistogram.d.ts +5 -0
  25. package/dist/core/ui/Toolbar/components/icons/ChipAiIcon.d.ts +5 -0
  26. package/dist/core/ui/Toolbar/components/icons/ClickIcon.d.ts +5 -0
  27. package/dist/core/ui/Toolbar/components/icons/CursorIcon.d.ts +7 -0
  28. package/dist/core/ui/Toolbar/components/icons/ExternalLinkIcon.d.ts +6 -0
  29. package/dist/core/ui/Toolbar/components/icons/FilterTuneIcon.d.ts +5 -0
  30. package/dist/core/ui/Toolbar/components/icons/FlaskIcon.d.ts +5 -0
  31. package/dist/core/ui/Toolbar/components/icons/Icon.css.d.ts +1 -0
  32. package/dist/core/ui/Toolbar/components/icons/InfoIcon.d.ts +5 -0
  33. package/dist/core/ui/Toolbar/components/icons/ShareIcon.d.ts +5 -0
  34. package/dist/core/ui/Toolbar/components/icons/index.d.ts +10 -0
  35. package/dist/core/ui/Toolbar/components/index.d.ts +3 -4
  36. package/dist/core/ui/Toolbar/components/{ExpandedToolbarContent.d.ts → legacy/ExpandedToolbarContentLegacy.d.ts} +4 -3
  37. package/dist/core/ui/Toolbar/components/{FlagControls.d.ts → legacy/FlagControls.d.ts} +1 -1
  38. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/Header.d.ts +1 -1
  39. package/dist/core/ui/Toolbar/components/{LocalFlagControls.d.ts → legacy/LocalFlagControls.d.ts} +2 -2
  40. package/dist/core/ui/Toolbar/components/{LocalObjectFlagControlListItem.d.ts → legacy/LocalObjectFlagControlListItem.d.ts} +2 -2
  41. package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/EventsTabContent.d.ts +1 -1
  42. package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/FlagSdkOverrideTabContent.d.ts +1 -1
  43. package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/SettingsTabContent.d.ts +1 -1
  44. package/dist/core/ui/Toolbar/components/{TabContentRenderer.d.ts → legacy/TabContentRenderer.d.ts} +2 -2
  45. package/dist/core/ui/Toolbar/components/legacy/index.d.ts +1 -0
  46. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/AnalyticsConsentToast.d.ts +5 -0
  47. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/AnalyticsConsentToast.module.css.d.ts +13 -0
  48. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/index.d.ts +1 -0
  49. package/dist/core/ui/Toolbar/components/new/ContentActions.d.ts +1 -0
  50. package/dist/core/ui/Toolbar/components/new/ContentActions.module.css.d.ts +8 -0
  51. package/dist/core/ui/Toolbar/components/new/ContentRenderer.d.ts +1 -0
  52. package/dist/core/ui/Toolbar/components/new/Contexts/AddContextForm.d.ts +6 -0
  53. package/dist/core/ui/Toolbar/components/new/Contexts/AddContextForm.module.css.d.ts +14 -0
  54. package/dist/core/ui/Toolbar/components/new/Contexts/ContextItem.d.ts +9 -0
  55. package/dist/core/ui/Toolbar/components/new/Contexts/ContextItem.module.css.d.ts +19 -0
  56. package/dist/core/ui/Toolbar/components/new/Contexts/ContextList.d.ts +1 -0
  57. package/dist/core/ui/Toolbar/components/new/Contexts/ContextList.module.css.d.ts +8 -0
  58. package/dist/core/ui/Toolbar/components/new/Contexts/ContextListContent.d.ts +1 -0
  59. package/dist/core/ui/Toolbar/components/new/Contexts/index.d.ts +4 -0
  60. package/dist/core/ui/Toolbar/components/new/ExpandedToolbarContent.d.ts +10 -0
  61. package/dist/core/ui/Toolbar/components/new/ExpandedToolbarContent.module.css.d.ts +2 -0
  62. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagControls.d.ts +37 -0
  63. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagControls.module.css.d.ts +9 -0
  64. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagItem.d.ts +11 -0
  65. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagItem.module.css.d.ts +18 -0
  66. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagList.d.ts +1 -0
  67. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagList.module.css.d.ts +5 -0
  68. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagListContent.d.ts +1 -0
  69. package/dist/core/ui/Toolbar/components/new/FeatureFlags/types.d.ts +9 -0
  70. package/dist/core/ui/Toolbar/components/new/FilterOverlay/FilterOverlay.d.ts +11 -0
  71. package/dist/core/ui/Toolbar/components/new/FilterOverlay/FilterOverlay.module.css.d.ts +17 -0
  72. package/dist/core/ui/Toolbar/components/new/FilterOverlay/index.d.ts +1 -0
  73. package/dist/core/ui/Toolbar/components/new/Header/ToolbarHeader.d.ts +7 -0
  74. package/dist/core/ui/Toolbar/components/new/Header/ToolbarHeader.module.css.d.ts +6 -0
  75. package/dist/core/ui/Toolbar/components/new/IconBar/IconBar.d.ts +6 -0
  76. package/dist/core/ui/Toolbar/components/new/IconBar/IconBar.module.css.d.ts +6 -0
  77. package/dist/core/ui/Toolbar/components/new/Interactive/InteractiveContent.d.ts +1 -0
  78. package/dist/core/ui/Toolbar/components/new/Interactive/InteractiveContent.module.css.d.ts +4 -0
  79. package/dist/core/ui/Toolbar/components/new/Interactive/InteractiveWrapper.d.ts +10 -0
  80. package/dist/core/ui/Toolbar/components/new/Interactive/MCPSetupAlert.d.ts +10 -0
  81. package/dist/core/ui/Toolbar/components/new/Interactive/MCPSetupAlert.module.css.d.ts +12 -0
  82. package/dist/core/ui/Toolbar/components/new/Interactive/SelectedElementInfo.d.ts +1 -0
  83. package/dist/core/ui/Toolbar/components/new/Interactive/SelectedElementInfo.module.css.d.ts +21 -0
  84. package/dist/core/ui/Toolbar/components/new/Interactive/SelectionModeBar.d.ts +1 -0
  85. package/dist/core/ui/Toolbar/components/new/Interactive/SelectionOverlay.d.ts +2 -0
  86. package/dist/core/ui/Toolbar/components/new/Interactive/WorkflowCard.d.ts +13 -0
  87. package/dist/core/ui/Toolbar/components/new/Interactive/WorkflowCard.module.css.d.ts +27 -0
  88. package/dist/core/ui/Toolbar/components/new/Interactive/WorkflowSection.d.ts +6 -0
  89. package/dist/core/ui/Toolbar/components/new/Interactive/WorkflowSection.module.css.d.ts +5 -0
  90. package/dist/core/ui/Toolbar/components/new/Interactive/index.d.ts +9 -0
  91. package/dist/core/ui/Toolbar/components/new/Interactive/utils/elementUtils.d.ts +56 -0
  92. package/dist/core/ui/Toolbar/components/new/Interactive/utils/ideLinks.d.ts +58 -0
  93. package/dist/core/ui/Toolbar/components/new/Interactive/utils/promptBuilder.d.ts +26 -0
  94. package/dist/core/ui/Toolbar/components/new/Interactive/utils/throttle.d.ts +10 -0
  95. package/dist/core/ui/Toolbar/components/new/Interactive/workflowConfigs.d.ts +36 -0
  96. package/dist/core/ui/Toolbar/components/new/Monitoring/EventsContent.d.ts +1 -0
  97. package/dist/core/ui/Toolbar/components/new/Monitoring/EventsContent.module.css.d.ts +25 -0
  98. package/dist/core/ui/Toolbar/components/new/SearchSection.d.ts +8 -0
  99. package/dist/core/ui/Toolbar/components/new/SearchSection.module.css.d.ts +3 -0
  100. package/dist/core/ui/Toolbar/components/new/Settings/ConnectionStatus.d.ts +5 -0
  101. package/dist/core/ui/Toolbar/components/new/Settings/ConnectionStatus.module.css.d.ts +6 -0
  102. package/dist/core/ui/Toolbar/components/new/Settings/EnvironmentSelector.d.ts +1 -0
  103. package/dist/core/ui/Toolbar/components/new/Settings/GeneralSettings.d.ts +1 -0
  104. package/dist/core/ui/Toolbar/components/new/Settings/LogoutButton.d.ts +1 -0
  105. package/dist/core/ui/Toolbar/components/new/Settings/LogoutButton.module.css.d.ts +1 -0
  106. package/dist/core/ui/Toolbar/components/new/Settings/PositionSelector.d.ts +6 -0
  107. package/dist/core/ui/Toolbar/components/new/Settings/Privacy/PrivacySettings.d.ts +1 -0
  108. package/dist/core/ui/Toolbar/components/new/Settings/ProjectSelector.d.ts +1 -0
  109. package/dist/core/ui/Toolbar/components/new/Settings/SettingsContent.module.css.d.ts +5 -0
  110. package/dist/core/ui/Toolbar/components/new/Settings/SettingsItem.d.ts +8 -0
  111. package/dist/core/ui/Toolbar/components/new/Settings/SettingsItem.module.css.d.ts +6 -0
  112. package/dist/core/ui/Toolbar/components/new/Settings/SettingsSection.d.ts +7 -0
  113. package/dist/core/ui/Toolbar/components/new/Settings/SettingsSection.module.css.d.ts +3 -0
  114. package/dist/core/ui/Toolbar/components/new/Settings/ShareButton.d.ts +5 -0
  115. package/dist/core/ui/Toolbar/components/new/Settings/ShareButton.module.css.d.ts +1 -0
  116. package/dist/core/ui/Toolbar/components/new/Settings/index.d.ts +8 -0
  117. package/dist/core/ui/Toolbar/components/new/SubtabDropdown.d.ts +8 -0
  118. package/dist/core/ui/Toolbar/components/new/SubtabDropdown.module.css.d.ts +10 -0
  119. package/dist/core/ui/Toolbar/components/new/TabBar.d.ts +1 -0
  120. package/dist/core/ui/Toolbar/components/new/TabBar.module.css.d.ts +4 -0
  121. package/dist/core/ui/Toolbar/components/new/Tooltip.d.ts +9 -0
  122. package/dist/core/ui/Toolbar/components/new/Tooltip.module.css.d.ts +2 -0
  123. package/dist/core/ui/Toolbar/components/new/context/ActiveSubtabProvider.d.ts +12 -0
  124. package/dist/core/ui/Toolbar/components/new/context/FiltersProvider.d.ts +41 -0
  125. package/dist/core/ui/Toolbar/components/new/context/TabSearchProvider.d.ts +12 -0
  126. package/dist/core/ui/Toolbar/components/new/context/index.d.ts +3 -0
  127. package/dist/core/ui/Toolbar/components/new/index.d.ts +10 -0
  128. package/dist/core/ui/Toolbar/components/new/types.d.ts +16 -0
  129. package/dist/core/ui/Toolbar/constants/virtualization.d.ts +1 -0
  130. package/dist/core/ui/Toolbar/context/DevServerProvider.d.ts +2 -0
  131. package/dist/core/ui/Toolbar/context/ElementSelectionProvider.d.ts +52 -0
  132. package/dist/core/ui/Toolbar/context/FlagSdkOverrideProvider.d.ts +5 -1
  133. package/dist/core/ui/Toolbar/context/api/ApiBundleProvider.d.ts +8 -0
  134. package/dist/core/ui/Toolbar/context/{ApiProvider.d.ts → api/ApiProvider.d.ts} +1 -2
  135. package/dist/core/ui/Toolbar/context/{AuthProvider.d.ts → api/AuthProvider.d.ts} +3 -3
  136. package/dist/core/ui/Toolbar/context/api/ContextsProvider.d.ts +19 -0
  137. package/dist/core/ui/Toolbar/context/api/EnvironmentProvider.d.ts +12 -0
  138. package/dist/core/ui/Toolbar/context/{FlagsProvider.d.ts → api/FlagsProvider.d.ts} +5 -4
  139. package/dist/core/ui/Toolbar/context/{ProjectProvider.d.ts → api/ProjectProvider.d.ts} +4 -3
  140. package/dist/core/ui/Toolbar/context/api/index.d.ts +8 -0
  141. package/dist/core/ui/Toolbar/context/index.d.ts +7 -7
  142. package/dist/core/ui/Toolbar/context/{ActiveTabProvider.d.ts → state/ActiveTabProvider.d.ts} +3 -3
  143. package/dist/core/ui/Toolbar/context/state/PluginsProvider.d.ts +16 -0
  144. package/dist/core/ui/Toolbar/context/{SearchProvider.d.ts → state/SearchProvider.d.ts} +2 -2
  145. package/dist/core/ui/Toolbar/context/state/ToolbarStateBundleProvider.d.ts +13 -0
  146. package/dist/core/ui/Toolbar/context/state/ToolbarStateProvider.d.ts +35 -0
  147. package/dist/core/ui/Toolbar/context/{ToolbarUIProvider.d.ts → state/ToolbarUIProvider.d.ts} +1 -1
  148. package/dist/core/ui/Toolbar/context/state/index.d.ts +6 -0
  149. package/dist/core/ui/Toolbar/context/telemetry/AnalyticsPreferencesProvider.d.ts +14 -0
  150. package/dist/core/ui/Toolbar/context/{AnalyticsProvider.d.ts → telemetry/AnalyticsProvider.d.ts} +2 -2
  151. package/dist/core/ui/Toolbar/context/{InternalClientProvider.d.ts → telemetry/InternalClientProvider.d.ts} +10 -1
  152. package/dist/core/ui/Toolbar/context/telemetry/TelemetryBundleProvider.d.ts +12 -0
  153. package/dist/core/ui/Toolbar/context/telemetry/index.d.ts +4 -0
  154. package/dist/core/ui/Toolbar/hooks/index.d.ts +1 -1
  155. package/dist/core/ui/Toolbar/hooks/useLocalStorage.d.ts +10 -0
  156. package/dist/core/ui/Toolbar/types/toolbar.d.ts +3 -2
  157. package/dist/core/ui/Toolbar/utils/clipboard.d.ts +6 -0
  158. package/dist/core/ui/Toolbar/utils/context.d.ts +33 -0
  159. package/dist/core/ui/Toolbar/utils/localStorage.d.ts +29 -1
  160. package/dist/core/utils/analytics.d.ts +51 -1
  161. package/dist/core/utils/urlOverrides.d.ts +105 -0
  162. package/dist/flags/toolbarFlags.d.ts +6 -1
  163. package/dist/index.cjs +8 -6
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/js/263.js +88 -0
  166. package/dist/js/263.js.map +1 -0
  167. package/dist/js/758.js +446 -0
  168. package/dist/js/758.js.map +1 -0
  169. package/dist/js/index.js +3 -527
  170. package/dist/js/index.js.map +1 -1
  171. package/dist/js/plugins.js +1 -0
  172. package/dist/js/react.js +1 -0
  173. package/dist/js/types-entry.js +0 -0
  174. package/dist/plugins.cjs +483 -0
  175. package/dist/plugins.cjs.map +1 -0
  176. package/dist/plugins.d.ts +21 -0
  177. package/dist/react.cjs +125 -0
  178. package/dist/react.cjs.map +1 -0
  179. package/dist/react.d.ts +25 -0
  180. package/dist/types-entry.cjs +20 -0
  181. package/dist/types-entry.cjs.map +1 -0
  182. package/dist/types-entry.d.ts +12 -0
  183. package/package.json +94 -46
  184. package/dist/core/ui/Toolbar/components/Popover.css.d.ts +0 -2
  185. package/dist/core/ui/Toolbar/hooks/useToolbarState.d.ts +0 -25
  186. package/dist/core/ui/{Toolbar/components → Buttons}/IconButton.css.d.ts +0 -0
  187. package/dist/core/ui/{Toolbar/components → Buttons}/IconLinkButton.d.ts +0 -0
  188. package/dist/core/ui/{Toolbar/components → Buttons}/StarButton.d.ts +0 -0
  189. package/dist/core/ui/{Toolbar/components → Select}/Select.css.d.ts +0 -0
  190. package/dist/core/ui/{Toolbar/components → Select}/Select.d.ts +0 -0
  191. package/dist/core/ui/Toolbar/components/{AuthenticationModal.css.d.ts → AuthenticationModal/AuthenticationModal.css.d.ts} +0 -0
  192. package/dist/core/ui/Toolbar/components/{LoginScreen.css.d.ts → LoginScreen/LoginScreen.css.d.ts} +0 -0
  193. package/dist/core/ui/Toolbar/components/{LoginScreen.d.ts → LoginScreen/LoginScreen.d.ts} +0 -0
  194. package/dist/core/ui/Toolbar/components/{ActionButtonsContainer.css.d.ts → legacy/ActionButtonsContainer.css.d.ts} +0 -0
  195. package/dist/core/ui/Toolbar/components/{ActionButtonsContainer.d.ts → legacy/ActionButtonsContainer.d.ts} +0 -0
  196. package/dist/core/ui/Toolbar/components/{FlagControls.css.d.ts → legacy/FlagControls.css.d.ts} +0 -0
  197. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/Header.css.d.ts +0 -0
  198. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/components/ActionButtons.d.ts +0 -0
  199. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/components/EnvironmentLabel.d.ts +0 -0
  200. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/components/LogoSection.d.ts +0 -0
  201. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/components/SearchSection.d.ts +0 -0
  202. package/dist/core/ui/Toolbar/{Header → components/legacy/Header}/components/index.d.ts +1 -1
  203. /package/dist/core/ui/Toolbar/components/{LocalFlagControls.css.d.ts → legacy/LocalFlagControls.css.d.ts} +0 -0
  204. /package/dist/core/ui/Toolbar/components/{LocalObjectFlagControlListItem.css.d.ts → legacy/LocalObjectFlagControlListItem.css.d.ts} +0 -0
  205. /package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/EventsTabContent.css.d.ts +0 -0
  206. /package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/FlagDevServerTabContent.css.d.ts +0 -0
  207. /package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/FlagDevServerTabContent.d.ts +0 -0
  208. /package/dist/core/ui/Toolbar/{TabContent → components/legacy/TabContent}/SettingsTab.css.d.ts +0 -0
  209. /package/dist/core/ui/Toolbar/components/{TabContentRenderer.css.d.ts → legacy/TabContentRenderer.css.d.ts} +0 -0
  210. /package/dist/core/ui/Toolbar/context/{IFrameProvider.d.ts → api/IFrameProvider.d.ts} +0 -0
@@ -0,0 +1,12 @@
1
+ import { ToolbarMode } from '../../types';
2
+ interface TelemetryBundleProviderProps {
3
+ mode: ToolbarMode;
4
+ baseUrl?: string;
5
+ clientSideId?: string;
6
+ streamUrl?: string;
7
+ eventsUrl?: string;
8
+ backendUrl?: string;
9
+ children: React.ReactNode;
10
+ }
11
+ export declare function TelemetryBundleProvider(props: TelemetryBundleProviderProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from './TelemetryBundleProvider';
2
+ export * from './AnalyticsProvider';
3
+ export * from './InternalClientProvider';
4
+ export * from './AnalyticsPreferencesProvider';
@@ -1,6 +1,6 @@
1
- export { useToolbarState } from './useToolbarState';
2
1
  export { useToolbarAnimations } from './useToolbarAnimations';
3
2
  export { useToolbarVisibility } from './useToolbarVisibility';
4
3
  export { useToolbarDrag } from './useToolbarDrag';
5
4
  export { useEvents } from './useEvents';
6
5
  export { useCurrentDate } from './useCurrentDate';
6
+ export { useLocalStorage } from './useLocalStorage';
@@ -0,0 +1,10 @@
1
+ interface UseLocalStorageOptions<T> {
2
+ /** Sync across browser tabs (default: false) */
3
+ syncTabs?: boolean;
4
+ /** Custom serializer (default: JSON.stringify) */
5
+ serialize?: (value: T) => string;
6
+ /** Custom deserializer (default: JSON.parse) */
7
+ deserialize?: (value: string) => T;
8
+ }
9
+ export declare function useLocalStorage<T>(key: string, defaultValue: T, options?: UseLocalStorageOptions<T>): [T, (value: T | ((prev: T) => T)) => void, () => void];
10
+ export {};
@@ -1,12 +1,13 @@
1
- export type TabId = 'flag-sdk' | 'flag-dev-server' | 'events' | 'settings';
1
+ export type TabId = 'flag-sdk' | 'flag-dev-server' | 'events' | 'settings' | 'flags' | 'monitoring' | 'interactive' | 'ai' | 'optimize';
2
2
  export type ActiveTabId = TabId | undefined;
3
3
  export declare const TAB_ORDER: readonly TabId[];
4
4
  export type ToolbarMode = 'dev-server' | 'sdk';
5
5
  export declare const DEV_SERVER_TABS: readonly TabId[];
6
6
  export declare const SDK_MODE_TABS: readonly TabId[];
7
+ export declare const NEW_TOOLBAR_TABS: readonly TabId[];
7
8
  export declare function getToolbarMode(devServerUrl?: string): ToolbarMode;
8
9
  export declare function getTabsForMode(mode: ToolbarMode, hasFlagOverridePlugin: boolean, hasEventInterceptionPlugin: boolean): readonly TabId[];
9
- export declare function getDefaultActiveTab(mode: ToolbarMode, hasFlagOverridePlugin?: boolean, hasEventInterceptionPlugin?: boolean): TabId;
10
+ export declare function getDefaultActiveTab(mode: ToolbarMode, hasFlagOverridePlugin?: boolean, hasEventInterceptionPlugin?: boolean, useNewToolbarDesign?: boolean): TabId;
10
11
  export interface FeatureFlag {
11
12
  id: string;
12
13
  name: string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copy text to clipboard with fallback for older browsers
3
+ * @param text - The text to copy to clipboard
4
+ * @returns Promise that resolves to true if copy was successful, false otherwise
5
+ */
6
+ export declare function copyToClipboard(text: string): Promise<boolean>;
@@ -0,0 +1,33 @@
1
+ import type { LDContext } from 'launchdarkly-js-client-sdk';
2
+ /**
3
+ * Check if two contexts are the same using their stable IDs (kind+key)
4
+ * @deprecated Prefer comparing getStableContextId(a) === getStableContextId(b) directly
5
+ */
6
+ export declare function areContextsEqual(a: LDContext | null | undefined, b: LDContext | null | undefined): boolean;
7
+ /**
8
+ * Gets the kind of an LDContext (handles multi-kind and single-kind)
9
+ */
10
+ export declare function getContextKind(context: LDContext | null | undefined): string;
11
+ /**
12
+ * Gets the key of an LDContext
13
+ * For multi-kind contexts, returns the key of the first nested context
14
+ */
15
+ export declare function getContextKey(context: LDContext | null | undefined): string;
16
+ /**
17
+ * Gets a display name for an LDContext
18
+ * Uses name if available, otherwise falls back to key
19
+ */
20
+ export declare function getContextDisplayName(context: LDContext | null | undefined): string;
21
+ /**
22
+ * Check if a context is anonymous
23
+ */
24
+ export declare function isContextAnonymous(context: LDContext | null | undefined): boolean;
25
+ /**
26
+ * Generates a stable identifier for a context based on kind+key.
27
+ * This identifier remains the same even if other properties change,
28
+ * allowing contexts to be updated rather than duplicated.
29
+ *
30
+ * For single-kind contexts: "kind:key"
31
+ * For multi-kind contexts: "multi:kind1:key1:kind2:key2" (sorted by kind name)
32
+ */
33
+ export declare function getStableContextId(context: LDContext | null | undefined): string;
@@ -1,14 +1,24 @@
1
+ import type { LDContext } from 'launchdarkly-js-client-sdk';
1
2
  import { ToolbarPosition } from '../types/toolbar';
2
3
  export declare const TOOLBAR_STORAGE_KEYS: {
3
4
  readonly SETTINGS: "ld-toolbar-settings";
4
5
  readonly DISABLED: "ld-toolbar-disabled";
5
- readonly PROJECT: "ld-toolbar-project";
6
6
  readonly STARRED_FLAGS: "ld-toolbar-starred-flags";
7
+ readonly MCP_ALERT_DISMISSED: "ld-toolbar-mcp-alert-dismissed";
8
+ readonly ANALYTICS_CONSENT_SHOWN: "ld-toolbar-analytics-consent-shown";
9
+ readonly CONTEXTS: "ld-toolbar-contexts";
10
+ readonly ACTIVE_CONTEXT: "ld-toolbar-active-context";
7
11
  };
12
+ export type PreferredIde = 'cursor' | 'windsurf' | 'vscode' | 'github-copilot';
13
+ export declare const PREFERRED_IDES: PreferredIde[];
8
14
  export interface ToolbarSettings {
9
15
  position: ToolbarPosition;
10
16
  reloadOnFlagChange: boolean;
11
17
  autoCollapse: boolean;
18
+ preferredIde: PreferredIde;
19
+ isOptedInToAnalytics: boolean;
20
+ isOptedInToEnhancedAnalytics: boolean;
21
+ isOptedInToSessionReplay: boolean;
12
22
  }
13
23
  export declare const DEFAULT_SETTINGS: ToolbarSettings;
14
24
  export declare function saveToolbarPosition(position: ToolbarPosition): void;
@@ -19,3 +29,21 @@ export declare function saveReloadOnFlagChange(isReloadOnFlagChange: boolean): v
19
29
  export declare function loadReloadOnFlagChange(): boolean;
20
30
  export declare function loadStarredFlags(): Set<string>;
21
31
  export declare function saveStarredFlags(starredFlags: Set<string>): void;
32
+ export declare function savePreferredIde(ide: PreferredIde): void;
33
+ export declare function loadPreferredIde(): PreferredIde;
34
+ export declare function saveMCPAlertDismissed(dismissed: boolean): void;
35
+ export declare function loadMCPAlertDismissed(): boolean;
36
+ export declare function loadContexts(): Array<LDContext>;
37
+ export declare function saveContexts(contexts: Array<LDContext>): void;
38
+ export declare function loadActiveContext(): LDContext | null;
39
+ export declare function saveActiveContext(context: LDContext | null): void;
40
+ export declare function saveIsOptedInToAnalytics(isOptedInToAnalytics: boolean): void;
41
+ export declare function loadIsOptedInToAnalytics(): boolean;
42
+ export declare function saveIsOptedInToEnhancedAnalytics(isOptedInToEnhancedAnalytics: boolean): void;
43
+ export declare function saveIsOptedInToSessionReplay(isOptedInToSessionReplay: boolean): void;
44
+ export declare function loadIsOptedInToSessionReplay(): boolean;
45
+ export declare function loadIsOptedInToEnhancedAnalytics(): boolean;
46
+ export declare function saveAnalyticsConsentShown(shown: boolean): void;
47
+ export declare function loadAnalyticsConsentShown(): boolean;
48
+ export declare function loadAllSettings(): Partial<ToolbarSettings>;
49
+ export declare function saveAllSettings(settings: Partial<ToolbarSettings>): void;
@@ -8,8 +8,9 @@ export declare const ANALYTICS_EVENT_PREFIX = "ld.toolbar";
8
8
  export declare class ToolbarAnalytics {
9
9
  private ldClient;
10
10
  private mode;
11
+ private isOptedInToAnalytics;
11
12
  private searchDebounceTimer;
12
- constructor(ldClient?: LDClient | null, mode?: ToolbarMode);
13
+ constructor(ldClient?: LDClient | null, mode?: ToolbarMode, isOptedInToAnalytics?: boolean);
13
14
  /**
14
15
  * Internal method to send tracking events
15
16
  */
@@ -30,6 +31,10 @@ export declare class ToolbarAnalytics {
30
31
  * Track toolbar tab navigation
31
32
  */
32
33
  trackTabChange(fromTab: string | null, toTab: string): void;
34
+ /**
35
+ * Track toolbar subtab navigation
36
+ */
37
+ trackSubtabChange(fromSubtab: string | null, toSubtab: string): void;
33
38
  /**
34
39
  * Track search usage
35
40
  */
@@ -54,6 +59,10 @@ export declare class ToolbarAnalytics {
54
59
  * Track opening a flag deeplink
55
60
  */
56
61
  trackOpenFlagDeeplink(flagKey: string, baseUrl: string): void;
62
+ /**
63
+ * Track clearing events
64
+ */
65
+ trackClearEvents(): void;
57
66
  /**
58
67
  * Track Event clicks
59
68
  */
@@ -94,4 +103,45 @@ export declare class ToolbarAnalytics {
94
103
  * Track user feedback
95
104
  */
96
105
  trackFeedback(feedback: string, sentiment: FeedbackSentiment): void;
106
+ /**
107
+ * Track flag key copy
108
+ */
109
+ trackFlagKeyCopy(flagKey: string): void;
110
+ /**
111
+ * Track context added
112
+ */
113
+ trackContextAdded(contextKind: string, contextKey: string, isMultiKind: boolean): void;
114
+ /**
115
+ * Track context removed
116
+ */
117
+ trackContextRemoved(contextKind: string, contextKey: string): void;
118
+ /**
119
+ * Track context updated
120
+ */
121
+ trackContextUpdated(oldKind: string, oldKey: string, newKind: string, newKey: string): void;
122
+ /**
123
+ * Track context selected/activated
124
+ */
125
+ trackContextSelected(contextKind: string, contextKey: string): void;
126
+ /**
127
+ * Track context edit started
128
+ */
129
+ trackContextEditStarted(contextKind: string, contextKey: string): void;
130
+ /**
131
+ * Track context edit cancelled
132
+ */
133
+ trackContextEditCancelled(contextKind: string, contextKey: string): void;
134
+ /**
135
+ * Track context key copy
136
+ */
137
+ trackContextKeyCopy(contextKey: string): void;
138
+ /**
139
+ * Track state sharing via URL
140
+ */
141
+ trackShareState(options: {
142
+ includeSettings: boolean;
143
+ overrideCount: number;
144
+ contextCount: number;
145
+ starredFlagCount: number;
146
+ }): void;
97
147
  }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Utilities for sharing and loading toolbar state via URL query parameters.
3
+ *
4
+ * State is encoded as a single base64-encoded JSON object in the ldToolbarState parameter.
5
+ * The state includes: flag overrides, contexts, settings, starred flags, etc.
6
+ */
7
+ import { LDContext } from 'launchdarkly-js-client-sdk';
8
+ import { ToolbarSettings } from '../ui/Toolbar/utils/localStorage';
9
+ /** Current version of the shared state format */
10
+ export declare const SHARED_STATE_VERSION = 1;
11
+ /** Default query parameter name for shared toolbar state */
12
+ export declare const DEFAULT_STATE_PARAM = "ldToolbarState";
13
+ /** Maximum size of encoded state in characters (warning threshold) */
14
+ export declare const MAX_STATE_SIZE_WARNING = 2000;
15
+ /** Maximum size of encoded state in characters (hard limit) */
16
+ export declare const MAX_STATE_SIZE_LIMIT = 8192;
17
+ /**
18
+ * Structure of the shared toolbar state
19
+ */
20
+ export interface SharedToolbarState {
21
+ /** Version of the state format */
22
+ version: number;
23
+ /** Flag overrides (flag key -> value) */
24
+ overrides: Record<string, any>;
25
+ /** Saved contexts */
26
+ contexts: LDContext[];
27
+ /** Currently active context */
28
+ activeContext: LDContext | null;
29
+ /** Toolbar settings */
30
+ settings: Partial<ToolbarSettings>;
31
+ /** Starred flag keys */
32
+ starredFlags: string[];
33
+ }
34
+ /**
35
+ * Result of serializing shared state
36
+ */
37
+ export interface SerializeStateResult {
38
+ /** The full URL with the state parameter */
39
+ url: string;
40
+ /** Size of the encoded state in characters */
41
+ size: number;
42
+ /** Whether the size exceeds the warning threshold */
43
+ exceedsWarning: boolean;
44
+ /** Whether the size exceeds the hard limit */
45
+ exceedsLimit: boolean;
46
+ }
47
+ /**
48
+ * Result of parsing shared state from URL
49
+ */
50
+ export interface ParseStateResult {
51
+ /** Whether a state parameter was found in the URL */
52
+ found: boolean;
53
+ /** The parsed state (if found and valid) */
54
+ state: SharedToolbarState | null;
55
+ /** Error message if parsing failed */
56
+ error: string | null;
57
+ }
58
+ /**
59
+ * Serializes toolbar state into a URL with a query parameter
60
+ *
61
+ * @param state - The state to serialize
62
+ * @param baseUrl - The base URL to append the parameter to (defaults to current URL without params)
63
+ * @param paramName - The query parameter name (defaults to 'ldToolbarState')
64
+ * @returns Result containing the URL and size information
65
+ *
66
+ */
67
+ export declare function serializeToolbarState(state: SharedToolbarState, baseUrl?: string, paramName?: string): SerializeStateResult;
68
+ /**
69
+ * Parses toolbar state from a URL query parameter
70
+ *
71
+ * @param url - The URL to parse (defaults to window.location.href)
72
+ * @param paramName - The query parameter name (defaults to 'ldToolbarState')
73
+ * @returns Result containing whether state was found, the parsed state, and any error
74
+ *
75
+ */
76
+ export declare function parseToolbarState(url?: string, paramName?: string): ParseStateResult;
77
+ /**
78
+ * Checks if the current URL contains a toolbar state parameter
79
+ *
80
+ * @param url - The URL to check (defaults to window.location.href)
81
+ * @param paramName - The query parameter name (defaults to 'ldToolbarState')
82
+ * @returns True if the URL contains a state parameter
83
+ */
84
+ export declare function hasToolbarState(url?: string, paramName?: string): boolean;
85
+ /**
86
+ * Removes the toolbar state parameter from the current URL
87
+ * Uses history.replaceState to avoid affecting browser history
88
+ *
89
+ * @param paramName - The query parameter name (defaults to 'ldToolbarState')
90
+ */
91
+ export declare function clearToolbarStateFromUrl(paramName?: string): void;
92
+ /**
93
+ * Loads shared toolbar state from URL and applies it to localStorage
94
+ * Should be called during toolbar initialization, before any components render
95
+ *
96
+ * @param paramName - The query parameter name (defaults to 'ldToolbarState')
97
+ * @param flagOverrideStorageNamespace - The storage namespace for flag overrides (defaults to 'ld-flag-override')
98
+ * @param flagOverridePlugin - Optional flag override plugin to apply overrides to directly
99
+ * @returns Object indicating whether state was loaded and if there were any errors
100
+ *
101
+ */
102
+ export declare function loadSharedStateFromUrl(paramName?: string, flagOverrideStorageNamespace?: string, flagOverridePlugin?: any): {
103
+ loaded: boolean;
104
+ error: string | null;
105
+ };
@@ -7,4 +7,9 @@
7
7
  * To add a toolbar feature flag, export it here like:
8
8
  * export const myFeature = createToolbarFlagFunction('my-feature-key', defaultValue);
9
9
  */
10
- export declare const __placeholder: () => boolean;
10
+ export declare const ENABLE_SESSION_REPLAY_FLAG_KEY = "toolbar-enable-session-replay";
11
+ export declare const enableAiIcon: () => boolean;
12
+ export declare const enableInteractiveIcon: () => boolean;
13
+ export declare const enableOptimizeIcon: () => boolean;
14
+ export declare const enableSessionReplay: () => boolean;
15
+ export declare const useNewToolbarDesign: () => boolean;
package/dist/index.cjs CHANGED
@@ -13,7 +13,7 @@ var __webpack_require__ = {};
13
13
  })();
14
14
  (()=>{
15
15
  __webpack_require__.r = (exports1)=>{
16
- if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
17
  value: 'Module'
18
18
  });
19
19
  Object.defineProperty(exports1, '__esModule', {
@@ -127,7 +127,7 @@ class AfterTrackHook {
127
127
  data: hookContext.data,
128
128
  metricValue: hookContext.metricValue,
129
129
  creationDate: Date.now(),
130
- url: 'undefined' != typeof window ? window.location.href : void 0
130
+ url: "u" > typeof window ? window.location.href : void 0
131
131
  };
132
132
  if (!this.shouldProcessEvent()) return;
133
133
  const processedEvent = this.processEvent(syntheticContext);
@@ -462,7 +462,7 @@ class FlagOverridePlugin {
462
462
  return this.ldClient;
463
463
  }
464
464
  getStorage() {
465
- if ('undefined' == typeof window) return null;
465
+ if ("u" < typeof window) return null;
466
466
  return window.localStorage;
467
467
  }
468
468
  persistOverride(flagKey, value) {
@@ -552,7 +552,9 @@ async function lazyLoad(signal, url) {
552
552
  throw new Error(`Could not load LaunchDarkly developer toolbar bundle from ${url}`);
553
553
  }
554
554
  }
555
- var package_namespaceObject = JSON.parse('{"rE":"2.0.0-beta.1"}');
555
+ var package_namespaceObject = {
556
+ rE: "2.0.0"
557
+ };
556
558
  function useLaunchDarklyToolbar(args) {
557
559
  const { toolbarBundleUrl, enabled, ...initConfig } = args;
558
560
  const configRef = (0, external_react_namespaceObject.useRef)(null);
@@ -591,7 +593,7 @@ exports.TOOLBAR_POSITIONS = __webpack_exports__.TOOLBAR_POSITIONS;
591
593
  exports.isValidEventCategory = __webpack_exports__.isValidEventCategory;
592
594
  exports.isValidEventKind = __webpack_exports__.isValidEventKind;
593
595
  exports.useLaunchDarklyToolbar = __webpack_exports__.useLaunchDarklyToolbar;
594
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
596
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
595
597
  "ANALYTICS_EVENT_PREFIX",
596
598
  "EventInterceptionPlugin",
597
599
  "FlagOverridePlugin",
@@ -599,7 +601,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
599
601
  "isValidEventCategory",
600
602
  "isValidEventKind",
601
603
  "useLaunchDarklyToolbar"
602
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
604
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
603
605
  Object.defineProperty(exports, '__esModule', {
604
606
  value: true
605
607
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../src/types/analytics.ts","../src/types/events.ts","../src/types/position.ts","../src/types/hooks/EventStore.ts","../src/types/hooks/AfterTrackHook.ts","../src/types/hooks/AfterIdentifyHook.ts","../src/types/hooks/AfterEvaluationHook.ts","../src/types/plugins/eventInterceptionPlugin.ts","../src/types/plugins/flagOverridePlugin.ts","../src/react/lazyLoadToolbar.ts","../src/react/useLaunchDarklyToolbar.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const ANALYTICS_EVENT_PREFIX = 'ld.toolbar';\n\nexport type FeedbackSentiment = 'positive' | 'negative';\n","export interface LDEvaluationReason {\n readonly kind?: string;\n readonly errorKind?: string;\n}\n\nexport interface SyntheticEventContext {\n readonly kind: EventKind;\n readonly key?: string;\n readonly context?: object;\n readonly creationDate: number;\n readonly data?: unknown;\n readonly metricValue?: number;\n readonly url?: string;\n readonly value?: any;\n readonly variation?: number | null;\n readonly default?: any;\n readonly reason?: LDEvaluationReason;\n readonly version?: number;\n readonly trackEvents?: boolean;\n readonly debugEventsUntilDate?: number;\n readonly contextKind?: string;\n}\n\n/**\n * Valid event kinds that can be emitted by the LaunchDarkly SDK\n */\nconst VALID_EVENT_KINDS = ['identify', 'feature', 'custom', 'debug', 'summary', 'diagnostic'] as const;\n\n/**\n * Valid event categories used for organizing events\n */\nconst VALID_EVENT_CATEGORIES = ['flag', 'custom', 'identify', 'debug'] as const;\n\n/**\n * Strict typing for event kinds based on LaunchDarkly's event system\n */\nexport type EventKind = (typeof VALID_EVENT_KINDS)[number];\n\n/**\n * Event categories for UI organization\n */\nexport type EventCategory = (typeof VALID_EVENT_CATEGORIES)[number];\n\n/**\n * Enhanced processed event\n */\nexport interface ProcessedEvent {\n readonly id: string;\n readonly kind: EventKind;\n readonly key?: string;\n readonly timestamp: number;\n readonly context: SyntheticEventContext;\n readonly displayName: string;\n readonly category: EventCategory;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Event filter configuration\n */\nexport interface EventFilter {\n readonly kinds?: ReadonlyArray<EventKind>;\n readonly categories?: ReadonlyArray<EventCategory>;\n readonly flagKeys?: ReadonlyArray<string>;\n readonly timeRange?: {\n readonly start: number;\n readonly end: number;\n };\n}\n\n/**\n * Type guards for event validation\n */\nexport function isValidEventKind(kind: string): kind is EventKind {\n return VALID_EVENT_KINDS.includes(kind as EventKind);\n}\n\nexport function isValidEventCategory(category: string): category is EventCategory {\n return VALID_EVENT_CATEGORIES.includes(category as EventCategory);\n}\n","export const TOOLBAR_POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\nexport type ToolbarPosition = (typeof TOOLBAR_POSITIONS)[number];\n","import type { ProcessedEvent } from '../events';\n\nconst DEFAULT_MAX_EVENTS = 100;\nexport interface EventStoreConfig {\n /** Maximum number of events to store */\n maxEvents?: number;\n}\n\nexport class EventStore {\n private events: ProcessedEvent[] = [];\n private listeners: Set<() => void> = new Set();\n private maxEvents: number;\n\n constructor(config: EventStoreConfig = {}) {\n this.maxEvents = config.maxEvents ?? DEFAULT_MAX_EVENTS;\n }\n\n addEvent(event: ProcessedEvent): void {\n try {\n this.events.push(event);\n if (this.events.length > this.maxEvents) {\n // Remove oldest events to maintain the limit\n this.events.splice(0, this.events.length - this.maxEvents);\n }\n this.notifyListeners();\n } catch (error) {\n console.warn('Event store error:', error);\n }\n }\n\n getEvents(): ProcessedEvent[] {\n return [...this.events];\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n listener(); // Send initial notification\n return () => this.listeners.delete(listener);\n }\n\n clear(): void {\n this.events = [];\n this.notifyListeners();\n }\n\n destroy(): void {\n this.listeners.clear();\n this.events = [];\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n console.warn('Listener error:', error);\n }\n });\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type { HookMetadata, TrackSeriesContext } from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterTrackHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterTrackHook implements Hook {\n private config: AfterTrackHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterTrackHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterTrackHook',\n };\n }\n\n afterTrack(hookContext: TrackSeriesContext): void {\n try {\n const syntheticContext: SyntheticEventContext = {\n kind: 'custom',\n key: hookContext.key,\n context: hookContext.context,\n data: hookContext.data,\n metricValue: hookContext.metricValue,\n creationDate: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n };\n\n if (!this.shouldProcessEvent()) {\n return;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterTrackHook:', error);\n }\n }\n\n private shouldProcessEvent(): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterTrackHook only handles custom events\n return (\n !(filter.kinds && !filter.kinds.includes('custom')) &&\n !(filter.categories && !filter.categories.includes('custom'))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Custom: ${context.key || 'unknown'}`,\n category: 'custom',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterTrackHook only handles custom events\n return {\n data: context.data,\n metricValue: context.metricValue,\n url: context.url,\n };\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type {\n HookMetadata,\n IdentifySeriesContext,\n IdentifySeriesData,\n IdentifySeriesResult,\n LDContext,\n} from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterIdentifyHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterIdentifyHook implements Hook {\n private config: AfterIdentifyHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterIdentifyHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterIdentifyHook',\n };\n }\n\n afterIdentify(\n hookContext: IdentifySeriesContext,\n data: IdentifySeriesData,\n result: IdentifySeriesResult,\n ): IdentifySeriesData {\n try {\n // Only process successful identify operations\n if (result.status !== 'completed') {\n return data;\n }\n\n const syntheticContext: SyntheticEventContext = {\n kind: 'identify',\n context: hookContext.context,\n creationDate: Date.now(),\n contextKind: this.determineContextKind(hookContext.context),\n };\n\n if (!this.shouldProcessEvent()) {\n return data;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterIdentifyHook:', error);\n }\n\n return data;\n }\n\n private determineContextKind(context: LDContext): string {\n if (context && typeof context === 'object') {\n if ('kind' in context && context.kind) {\n return context.kind;\n }\n // Legacy user context\n if (context.anonymous) {\n return 'anonymousUser';\n }\n return 'user';\n }\n return 'user';\n }\n\n private shouldProcessEvent(): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterIdentifyHook only handles identify events\n return (\n !(filter.kinds && !filter.kinds.includes('identify')) &&\n !(filter.categories && !filter.categories.includes('identify'))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Identify: ${(context.context as any)?.key || 'anonymous'}`,\n category: 'identify',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterIdentifyHook only handles identify events\n return {\n contextKind: context.contextKind,\n };\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type {\n HookMetadata,\n EvaluationSeriesData,\n LDEvaluationDetail,\n EvaluationSeriesContext,\n} from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterEvaluationHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterEvaluationHook implements Hook {\n private config: AfterEvaluationHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterEvaluationHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterEvaluationHook',\n };\n }\n\n afterEvaluation(\n hookContext: EvaluationSeriesContext,\n data: EvaluationSeriesData,\n detail: LDEvaluationDetail,\n ): EvaluationSeriesData {\n try {\n const syntheticContext: SyntheticEventContext = {\n kind: 'feature',\n key: hookContext.flagKey,\n context: hookContext.context,\n value: detail.value,\n variation: detail.variationIndex,\n default: hookContext.defaultValue,\n reason: detail.reason,\n creationDate: Date.now(),\n // Note: We don't have access to version, trackEvents, or debugEventsUntilDate\n // from the afterEvaluation hook, so these will be undefined\n };\n\n if (!this.shouldProcessEvent(syntheticContext)) {\n return data;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterEvaluationHook:', error);\n }\n\n return data;\n }\n\n private shouldProcessEvent(context: SyntheticEventContext): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterEvaluationHook only handles feature events\n return (\n !(filter.kinds && !filter.kinds.includes('feature')) &&\n !(filter.categories && !filter.categories.includes('flag')) &&\n !(filter.flagKeys && context.key && !filter.flagKeys.includes(context.key))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Flag: ${context.key || 'unknown'}`,\n category: 'flag',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterEvaluationHook only handles feature events\n return {\n flagVersion: context.version,\n variation: context.variation,\n trackEvents: context.trackEvents,\n reason: context.reason,\n defaultValue: context.default,\n };\n }\n}\n","import type { Hook, LDClient, LDPluginEnvironmentMetadata, LDPluginMetadata } from 'launchdarkly-js-client-sdk';\nimport { AfterTrackHook, AfterIdentifyHook, AfterEvaluationHook, EventStore } from '../hooks';\nimport type { EventFilter, ProcessedEvent } from '../events';\nimport type { IEventInterceptionPlugin } from './plugins';\nimport { ANALYTICS_EVENT_PREFIX } from '../analytics';\n\n/**\n * Configuration options for the EventInterceptionPlugin\n */\nexport interface EventInterceptionPluginConfig {\n /** Configuration for event filtering */\n filter?: EventFilter;\n /** Enable console logging for debugging */\n enableLogging?: boolean;\n /** Maximum number of events to store. The default value is 100. */\n eventCapacity?: number;\n}\n\n/**\n * Plugin dedicated to intercepting and processing LaunchDarkly events\n */\nexport class EventInterceptionPlugin implements IEventInterceptionPlugin {\n private afterTrackHook: AfterTrackHook;\n private afterIdentifyHook: AfterIdentifyHook;\n private afterEvaluationHook: AfterEvaluationHook;\n private eventStore: EventStore;\n private config: EventInterceptionPluginConfig;\n private ldClient: LDClient | null = null;\n\n constructor(config: EventInterceptionPluginConfig = {}) {\n this.config = {\n enableLogging: false,\n eventCapacity: 100,\n ...config,\n };\n\n this.eventStore = new EventStore({ maxEvents: this.config.eventCapacity });\n\n const onNewEvent = (event: ProcessedEvent) => {\n const isToolbarEvent = this.isToolbarEvent(event);\n if (isToolbarEvent) {\n return;\n }\n\n if (this.config.enableLogging) {\n console.log('🎯 Event intercepted:', {\n kind: event.kind,\n key: event.key,\n category: event.category,\n displayName: event.displayName,\n });\n }\n\n this.eventStore.addEvent(event);\n };\n\n this.afterTrackHook = new AfterTrackHook({\n filter: config.filter,\n onNewEvent,\n });\n\n this.afterIdentifyHook = new AfterIdentifyHook({\n filter: config.filter,\n onNewEvent,\n });\n\n this.afterEvaluationHook = new AfterEvaluationHook({\n filter: config.filter,\n onNewEvent,\n });\n }\n\n isToolbarEvent(event: ProcessedEvent): boolean {\n return event.key?.startsWith(ANALYTICS_EVENT_PREFIX) ?? false;\n }\n\n getMetadata(): LDPluginMetadata {\n return {\n name: 'EventInterceptionPlugin',\n };\n }\n\n getHooks(_metadata: LDPluginEnvironmentMetadata): Hook[] {\n return [this.afterTrackHook, this.afterIdentifyHook, this.afterEvaluationHook];\n }\n\n register(ldClient: LDClient): void {\n this.ldClient = ldClient;\n }\n\n getClient(): LDClient | null {\n return this.ldClient;\n }\n\n getEvents(): ProcessedEvent[] {\n return this.eventStore.getEvents();\n }\n\n subscribe(listener: () => void): () => void {\n return this.eventStore.subscribe(listener);\n }\n\n clearEvents(): void {\n this.eventStore.clear();\n }\n\n destroy(): void {\n this.eventStore.destroy();\n }\n}\n","import type {\n LDClient,\n LDDebugOverride,\n LDPluginMetadata,\n LDFlagSet,\n Hook,\n LDPluginEnvironmentMetadata,\n} from 'launchdarkly-js-client-sdk';\nimport type { IFlagOverridePlugin } from './plugins';\n\n/**\n * Configuration options for the FlagOverridePlugin\n */\nexport type FlagOverridePluginConfig = {\n /** Namespace for localStorage keys. Defaults to 'ld-flag-override' */\n storageNamespace?: string;\n};\n\nconst DEFAULT_STORAGE_NAMESPACE = 'ld-flag-override';\n\nexport class FlagOverridePlugin implements IFlagOverridePlugin {\n private debugOverride?: LDDebugOverride;\n private config: Required<FlagOverridePluginConfig>;\n private ldClient: LDClient | null = null;\n\n constructor(config: FlagOverridePluginConfig = {}) {\n this.config = {\n storageNamespace: config.storageNamespace ?? DEFAULT_STORAGE_NAMESPACE,\n };\n }\n\n /**\n * Returns plugin metadata\n */\n getMetadata(): LDPluginMetadata {\n return {\n name: 'FlagOverridePlugin',\n };\n }\n\n /**\n * Returns the hooks for the plugin\n */\n getHooks(_metadata: LDPluginEnvironmentMetadata): Hook[] {\n return [];\n }\n\n /**\n * Called when the plugin is registered with the LaunchDarkly client\n */\n register(ldClient: LDClient): void {\n this.ldClient = ldClient;\n }\n\n /**\n * Called when the debug interface is available\n * Loads any existing overrides from localStorage\n */\n registerDebug(debugOverride: LDDebugOverride): void {\n this.debugOverride = debugOverride;\n this.loadExistingOverrides();\n }\n\n private loadExistingOverrides(): void {\n if (!this.debugOverride) return;\n\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (!key?.startsWith(this.config.storageNamespace + ':')) continue;\n\n const storedValue = storage.getItem(key);\n if (storedValue) {\n try {\n const value = JSON.parse(storedValue);\n const flagKey = key.replace(this.config.storageNamespace + ':', '');\n\n this.debugOverride.setOverride(flagKey, value);\n } catch {\n console.warn('flagOverridePlugin: Invalid stored value for', key);\n storage.removeItem(key);\n }\n }\n }\n } catch (error) {\n console.error('flagOverridePlugin: Error loading existing overrides:', error);\n }\n }\n\n /**\n * Sets an override value for a feature flag and persists it to localStorage\n * @param flagKey - The key of the flag to override\n * @param value - The value to set for the flag\n */\n setOverride(flagKey: string, value: unknown): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n if (!flagKey || typeof flagKey !== 'string') {\n console.error('flagOverridePlugin: Invalid flag key:', flagKey);\n return;\n }\n\n if (value === undefined) {\n console.error('flagOverridePlugin: Cannot set undefined value for flag override');\n return;\n }\n\n try {\n this.persistOverride(flagKey, value);\n this.debugOverride.setOverride(flagKey, value);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to set override:', error);\n }\n }\n\n /**\n * Removes an override for a specific feature flag\n * @param flagKey - The key of the flag to remove the override for\n */\n removeOverride(flagKey: string): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n if (!flagKey || typeof flagKey !== 'string') {\n console.error('flagOverridePlugin: Invalid flag key:', flagKey);\n return;\n }\n\n try {\n this.removePersistedOverride(flagKey);\n this.debugOverride.removeOverride(flagKey);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to remove override:', error);\n }\n }\n\n /**\n * Clears all feature flag overrides from both memory and localStorage\n */\n clearAllOverrides(): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n try {\n this.clearPersistedOverrides();\n this.debugOverride.clearAllOverrides();\n } catch (error) {\n console.error('flagOverridePlugin: Failed to clear overrides:', error);\n }\n }\n\n /**\n * Returns all currently active feature flag overrides\n * @returns Record of flag keys to their override values\n */\n getAllOverrides(): LDFlagSet {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return {};\n }\n\n try {\n return this.debugOverride.getAllOverrides();\n } catch (error) {\n console.error('flagOverridePlugin: Failed to get overrides:', error);\n return {};\n }\n }\n\n /**\n * Returns the LaunchDarkly client instance\n * @returns The LaunchDarkly client\n */\n getClient(): LDClient | null {\n return this.ldClient;\n }\n\n private getStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n return window.localStorage;\n }\n\n private persistOverride(flagKey: string, value: unknown): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const storageKey = `${this.config.storageNamespace}:${flagKey}`;\n storage.setItem(storageKey, JSON.stringify(value));\n } catch (error) {\n console.error('flagOverridePlugin: Failed to persist override:', error);\n }\n }\n\n private removePersistedOverride(flagKey: string): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const storageKey = `${this.config.storageNamespace}:${flagKey}`;\n storage.removeItem(storageKey);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to remove persisted override:', error);\n }\n }\n\n private clearPersistedOverrides(): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const keysToRemove: string[] = [];\n const prefix = this.config.storageNamespace + ':';\n\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => storage.removeItem(key));\n } catch (error) {\n console.error('flagOverridePlugin: Failed to clear persisted overrides:', error);\n }\n }\n}\n","import type { LaunchDarklyToolbar } from '../index';\n\ninterface WindowWithMaybeToolbar extends Window {\n LaunchDarklyToolbar?: LaunchDarklyToolbar;\n}\n\nfunction getWindow(): WindowWithMaybeToolbar {\n return window;\n}\n\nexport default async function lazyLoadToolbar(signal: AbortSignal, url: string): Promise<LaunchDarklyToolbar> {\n const existing = getWindow().LaunchDarklyToolbar;\n\n if (existing) {\n return Promise.resolve(existing);\n }\n\n await lazyLoad(signal, url);\n\n const toolbarModule = getWindow().LaunchDarklyToolbar;\n if (!toolbarModule) {\n throw new Error(`Unable to detect LaunchDarklyToolbar global from ${url}`);\n }\n\n return toolbarModule;\n}\n\nasync function lazyLoad(signal: AbortSignal, url: string): Promise<void> {\n // Check if a script with this URL already exists\n const existingScript = document.querySelector(`script[src=\"${url}\"]`) as HTMLScriptElement | null;\n\n if (existingScript) {\n // If script already exists and is loaded, return immediately\n if (existingScript.dataset.loaded === 'true') {\n return Promise.resolve();\n }\n\n // If script exists but is still loading, wait for it to complete\n return new Promise<void>((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n if (!signal.aborted) {\n existingScript.dataset.loaded = 'true';\n resolve();\n }\n });\n existingScript.addEventListener('error', (error) => {\n if (!signal.aborted) {\n reject(error);\n }\n });\n });\n }\n\n // Create new script element\n const script = document.createElement('script');\n script.src = url;\n script.crossOrigin = 'anonymous';\n script.referrerPolicy = 'origin';\n\n const waitForLoad = new Promise<void>((resolve, reject) => {\n script.addEventListener('load', () => {\n if (!signal.aborted) {\n script.dataset.loaded = 'true';\n resolve();\n }\n });\n script.addEventListener('error', (error) => {\n if (!signal.aborted) {\n reject(error);\n }\n });\n });\n\n document.body.appendChild(script);\n\n try {\n await waitForLoad;\n } catch (error) {\n console.log(error);\n throw new Error(`Could not load LaunchDarkly developer toolbar bundle from ${url}`);\n }\n}\n","import { useEffect, useRef } from 'react';\n\nimport lazyLoadToolbar from './lazyLoadToolbar';\nimport type { InitializationConfig } from '../types';\nimport packageJson from '../../package.json';\n\ninterface UseLaunchDarklyToolbarConfig extends InitializationConfig {\n /**\n * URL to load the toolbar bundle from.\n * Use this when developing the toolbar itself locally.\n *\n * Example: `'http://localhost:8080/toolbar.min.js'`\n *\n * Default: CDN URL based on package version\n */\n toolbarBundleUrl?: string;\n\n /**\n * Whether the toolbar should be loaded and displayed.\n *\n * Default: `true`\n */\n enabled?: boolean;\n}\n\nexport default function useLaunchDarklyToolbar(args: UseLaunchDarklyToolbarConfig) {\n const { toolbarBundleUrl, enabled, ...initConfig } = args;\n const configRef = useRef<InitializationConfig | null>(null);\n const url = toolbarBundleUrl ?? versionToCdn(packageJson.version);\n\n useEffect(() => {\n if (enabled === false) {\n return;\n }\n\n if (configRef.current === null) {\n configRef.current = initConfig;\n }\n }, [enabled, initConfig]);\n\n useEffect(() => {\n if (enabled === false || configRef.current === null) {\n return;\n }\n\n const controller = new AbortController();\n\n let cleanup: () => void = () => {};\n lazyLoadToolbar(controller.signal, url).then((importedToolbar) => {\n if (configRef.current === null) {\n return;\n }\n\n cleanup = importedToolbar.init(configRef.current);\n });\n\n return () => {\n controller.abort();\n cleanup();\n };\n }, [enabled, url]);\n}\n\nfunction versionToCdn(version = 'latest'): string {\n return `https://unpkg.com/@launchdarkly/toolbar@${version}/cdn/toolbar.min.js`;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ANALYTICS_EVENT_PREFIX","VALID_EVENT_KINDS","VALID_EVENT_CATEGORIES","isValidEventKind","kind","isValidEventCategory","category","TOOLBAR_POSITIONS","DEFAULT_MAX_EVENTS","EventStore","Set","config","event","error","console","listener","AfterTrackHook","hookContext","syntheticContext","Date","window","undefined","processedEvent","filter","context","timestamp","randomPart","Math","id","AfterIdentifyHook","data","result","AfterEvaluationHook","detail","EventInterceptionPlugin","onNewEvent","isToolbarEvent","_metadata","ldClient","DEFAULT_STORAGE_NAMESPACE","FlagOverridePlugin","debugOverride","storage","i","storedValue","value","JSON","flagKey","storageKey","keysToRemove","prefix","getWindow","lazyLoadToolbar","signal","url","existing","Promise","lazyLoad","toolbarModule","Error","existingScript","document","resolve","reject","script","waitForLoad","useLaunchDarklyToolbar","args","toolbarBundleUrl","enabled","initConfig","configRef","useRef","versionToCdn","packageJson","useEffect","controller","AbortController","cleanup","importedToolbar","version"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../src/types/analytics.ts","../src/types/events.ts","../src/types/position.ts","../src/types/hooks/EventStore.ts","../src/types/hooks/AfterTrackHook.ts","../src/types/hooks/AfterIdentifyHook.ts","../src/types/hooks/AfterEvaluationHook.ts","../src/types/plugins/eventInterceptionPlugin.ts","../src/types/plugins/flagOverridePlugin.ts","../src/react/lazyLoadToolbar.ts","../src/react/useLaunchDarklyToolbar.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const ANALYTICS_EVENT_PREFIX = 'ld.toolbar';\n\nexport type FeedbackSentiment = 'positive' | 'negative';\n","export interface LDEvaluationReason {\n readonly kind?: string;\n readonly errorKind?: string;\n}\n\nexport interface SyntheticEventContext {\n readonly kind: EventKind;\n readonly key?: string;\n readonly context?: object;\n readonly creationDate: number;\n readonly data?: unknown;\n readonly metricValue?: number;\n readonly url?: string;\n readonly value?: any;\n readonly variation?: number | null;\n readonly default?: any;\n readonly reason?: LDEvaluationReason;\n readonly version?: number;\n readonly trackEvents?: boolean;\n readonly debugEventsUntilDate?: number;\n readonly contextKind?: string;\n}\n\n/**\n * Valid event kinds that can be emitted by the LaunchDarkly SDK\n */\nconst VALID_EVENT_KINDS = ['identify', 'feature', 'custom', 'debug', 'summary', 'diagnostic'] as const;\n\n/**\n * Valid event categories used for organizing events\n */\nconst VALID_EVENT_CATEGORIES = ['flag', 'custom', 'identify', 'debug'] as const;\n\n/**\n * Strict typing for event kinds based on LaunchDarkly's event system\n */\nexport type EventKind = (typeof VALID_EVENT_KINDS)[number];\n\n/**\n * Event categories for UI organization\n */\nexport type EventCategory = (typeof VALID_EVENT_CATEGORIES)[number];\n\n/**\n * Enhanced processed event\n */\nexport interface ProcessedEvent {\n readonly id: string;\n readonly kind: EventKind;\n readonly key?: string;\n readonly timestamp: number;\n readonly context: SyntheticEventContext;\n readonly displayName: string;\n readonly category: EventCategory;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Event filter configuration\n */\nexport interface EventFilter {\n readonly kinds?: ReadonlyArray<EventKind>;\n readonly categories?: ReadonlyArray<EventCategory>;\n readonly flagKeys?: ReadonlyArray<string>;\n readonly timeRange?: {\n readonly start: number;\n readonly end: number;\n };\n}\n\n/**\n * Type guards for event validation\n */\nexport function isValidEventKind(kind: string): kind is EventKind {\n return VALID_EVENT_KINDS.includes(kind as EventKind);\n}\n\nexport function isValidEventCategory(category: string): category is EventCategory {\n return VALID_EVENT_CATEGORIES.includes(category as EventCategory);\n}\n","export const TOOLBAR_POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\nexport type ToolbarPosition = (typeof TOOLBAR_POSITIONS)[number];\n","import type { ProcessedEvent } from '../events';\n\nconst DEFAULT_MAX_EVENTS = 100;\nexport interface EventStoreConfig {\n /** Maximum number of events to store */\n maxEvents?: number;\n}\n\nexport class EventStore {\n private events: ProcessedEvent[] = [];\n private listeners: Set<() => void> = new Set();\n private maxEvents: number;\n\n constructor(config: EventStoreConfig = {}) {\n this.maxEvents = config.maxEvents ?? DEFAULT_MAX_EVENTS;\n }\n\n addEvent(event: ProcessedEvent): void {\n try {\n this.events.push(event);\n if (this.events.length > this.maxEvents) {\n // Remove oldest events to maintain the limit\n this.events.splice(0, this.events.length - this.maxEvents);\n }\n this.notifyListeners();\n } catch (error) {\n console.warn('Event store error:', error);\n }\n }\n\n getEvents(): ProcessedEvent[] {\n return [...this.events];\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n listener(); // Send initial notification\n return () => this.listeners.delete(listener);\n }\n\n clear(): void {\n this.events = [];\n this.notifyListeners();\n }\n\n destroy(): void {\n this.listeners.clear();\n this.events = [];\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n console.warn('Listener error:', error);\n }\n });\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type { HookMetadata, TrackSeriesContext } from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterTrackHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterTrackHook implements Hook {\n private config: AfterTrackHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterTrackHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterTrackHook',\n };\n }\n\n afterTrack(hookContext: TrackSeriesContext): void {\n try {\n const syntheticContext: SyntheticEventContext = {\n kind: 'custom',\n key: hookContext.key,\n context: hookContext.context,\n data: hookContext.data,\n metricValue: hookContext.metricValue,\n creationDate: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n };\n\n if (!this.shouldProcessEvent()) {\n return;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterTrackHook:', error);\n }\n }\n\n private shouldProcessEvent(): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterTrackHook only handles custom events\n return (\n !(filter.kinds && !filter.kinds.includes('custom')) &&\n !(filter.categories && !filter.categories.includes('custom'))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Custom: ${context.key || 'unknown'}`,\n category: 'custom',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterTrackHook only handles custom events\n return {\n data: context.data,\n metricValue: context.metricValue,\n url: context.url,\n };\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type {\n HookMetadata,\n IdentifySeriesContext,\n IdentifySeriesData,\n IdentifySeriesResult,\n LDContext,\n} from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterIdentifyHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterIdentifyHook implements Hook {\n private config: AfterIdentifyHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterIdentifyHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterIdentifyHook',\n };\n }\n\n afterIdentify(\n hookContext: IdentifySeriesContext,\n data: IdentifySeriesData,\n result: IdentifySeriesResult,\n ): IdentifySeriesData {\n try {\n // Only process successful identify operations\n if (result.status !== 'completed') {\n return data;\n }\n\n const syntheticContext: SyntheticEventContext = {\n kind: 'identify',\n context: hookContext.context,\n creationDate: Date.now(),\n contextKind: this.determineContextKind(hookContext.context),\n };\n\n if (!this.shouldProcessEvent()) {\n return data;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterIdentifyHook:', error);\n }\n\n return data;\n }\n\n private determineContextKind(context: LDContext): string {\n if (context && typeof context === 'object') {\n if ('kind' in context && context.kind) {\n return context.kind;\n }\n // Legacy user context\n if (context.anonymous) {\n return 'anonymousUser';\n }\n return 'user';\n }\n return 'user';\n }\n\n private shouldProcessEvent(): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterIdentifyHook only handles identify events\n return (\n !(filter.kinds && !filter.kinds.includes('identify')) &&\n !(filter.categories && !filter.categories.includes('identify'))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Identify: ${(context.context as any)?.key || 'anonymous'}`,\n category: 'identify',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterIdentifyHook only handles identify events\n return {\n contextKind: context.contextKind,\n };\n }\n}\n","import type { Hook } from 'launchdarkly-js-client-sdk';\nimport type {\n HookMetadata,\n EvaluationSeriesData,\n LDEvaluationDetail,\n EvaluationSeriesContext,\n} from 'launchdarkly-js-sdk-common';\nimport type { EventFilter, ProcessedEvent, SyntheticEventContext } from '../events';\n\nexport type AfterEvaluationHookConfig = {\n onNewEvent?: (event: ProcessedEvent) => void;\n filter?: EventFilter;\n};\n\nexport class AfterEvaluationHook implements Hook {\n private config: AfterEvaluationHookConfig;\n private idCounter = 0;\n\n constructor(config: AfterEvaluationHookConfig = {}) {\n this.config = {\n filter: config.filter,\n onNewEvent: config.onNewEvent,\n };\n }\n\n getMetadata(): HookMetadata {\n return {\n name: 'AfterEvaluationHook',\n };\n }\n\n afterEvaluation(\n hookContext: EvaluationSeriesContext,\n data: EvaluationSeriesData,\n detail: LDEvaluationDetail,\n ): EvaluationSeriesData {\n try {\n const syntheticContext: SyntheticEventContext = {\n kind: 'feature',\n key: hookContext.flagKey,\n context: hookContext.context,\n value: detail.value,\n variation: detail.variationIndex,\n default: hookContext.defaultValue,\n reason: detail.reason,\n creationDate: Date.now(),\n // Note: We don't have access to version, trackEvents, or debugEventsUntilDate\n // from the afterEvaluation hook, so these will be undefined\n };\n\n if (!this.shouldProcessEvent(syntheticContext)) {\n return data;\n }\n\n const processedEvent = this.processEvent(syntheticContext);\n\n this.config.onNewEvent?.(processedEvent);\n } catch (error) {\n // Simple error handling - just log and continue\n console.warn('Event processing error in AfterEvaluationHook:', error);\n }\n\n return data;\n }\n\n private shouldProcessEvent(context: SyntheticEventContext): boolean {\n const filter = this.config.filter;\n if (!filter) return true;\n\n // AfterEvaluationHook only handles feature events\n return (\n !(filter.kinds && !filter.kinds.includes('feature')) &&\n !(filter.categories && !filter.categories.includes('flag')) &&\n !(filter.flagKeys && context.key && !filter.flagKeys.includes(context.key))\n );\n }\n\n private processEvent(context: SyntheticEventContext): ProcessedEvent {\n const timestamp = Date.now();\n // Create a guaranteed unique ID using timestamp + counter + random\n this.idCounter = (this.idCounter + 1) % 999999; // Reset counter at 999999\n const randomPart = Math.random().toString(36).substring(2, 8);\n const id = `${context.kind}-${timestamp}-${this.idCounter.toString().padStart(6, '0')}-${randomPart}`;\n\n return {\n id,\n kind: context.kind,\n key: context.key,\n timestamp,\n context,\n displayName: `Flag: ${context.key || 'unknown'}`,\n category: 'flag',\n metadata: this.extractMetadata(context),\n };\n }\n\n private extractMetadata(context: SyntheticEventContext): Record<string, unknown> {\n // AfterEvaluationHook only handles feature events\n return {\n flagVersion: context.version,\n variation: context.variation,\n trackEvents: context.trackEvents,\n reason: context.reason,\n defaultValue: context.default,\n };\n }\n}\n","import type { Hook, LDClient, LDPluginEnvironmentMetadata, LDPluginMetadata } from 'launchdarkly-js-client-sdk';\nimport { AfterTrackHook, AfterIdentifyHook, AfterEvaluationHook, EventStore } from '../hooks';\nimport type { EventFilter, ProcessedEvent } from '../events';\nimport type { IEventInterceptionPlugin } from './plugins';\nimport { ANALYTICS_EVENT_PREFIX } from '../analytics';\n\n/**\n * Configuration options for the EventInterceptionPlugin\n */\nexport interface EventInterceptionPluginConfig {\n /** Configuration for event filtering */\n filter?: EventFilter;\n /** Enable console logging for debugging */\n enableLogging?: boolean;\n /** Maximum number of events to store. The default value is 100. */\n eventCapacity?: number;\n}\n\n/**\n * Plugin dedicated to intercepting and processing LaunchDarkly events\n */\nexport class EventInterceptionPlugin implements IEventInterceptionPlugin {\n private afterTrackHook: AfterTrackHook;\n private afterIdentifyHook: AfterIdentifyHook;\n private afterEvaluationHook: AfterEvaluationHook;\n private eventStore: EventStore;\n private config: EventInterceptionPluginConfig;\n private ldClient: LDClient | null = null;\n\n constructor(config: EventInterceptionPluginConfig = {}) {\n this.config = {\n enableLogging: false,\n eventCapacity: 100,\n ...config,\n };\n\n this.eventStore = new EventStore({ maxEvents: this.config.eventCapacity });\n\n const onNewEvent = (event: ProcessedEvent) => {\n const isToolbarEvent = this.isToolbarEvent(event);\n if (isToolbarEvent) {\n return;\n }\n\n if (this.config.enableLogging) {\n console.log('🎯 Event intercepted:', {\n kind: event.kind,\n key: event.key,\n category: event.category,\n displayName: event.displayName,\n });\n }\n\n this.eventStore.addEvent(event);\n };\n\n this.afterTrackHook = new AfterTrackHook({\n filter: config.filter,\n onNewEvent,\n });\n\n this.afterIdentifyHook = new AfterIdentifyHook({\n filter: config.filter,\n onNewEvent,\n });\n\n this.afterEvaluationHook = new AfterEvaluationHook({\n filter: config.filter,\n onNewEvent,\n });\n }\n\n isToolbarEvent(event: ProcessedEvent): boolean {\n return event.key?.startsWith(ANALYTICS_EVENT_PREFIX) ?? false;\n }\n\n getMetadata(): LDPluginMetadata {\n return {\n name: 'EventInterceptionPlugin',\n };\n }\n\n getHooks(_metadata: LDPluginEnvironmentMetadata): Hook[] {\n return [this.afterTrackHook, this.afterIdentifyHook, this.afterEvaluationHook];\n }\n\n register(ldClient: LDClient): void {\n this.ldClient = ldClient;\n }\n\n getClient(): LDClient | null {\n return this.ldClient;\n }\n\n getEvents(): ProcessedEvent[] {\n return this.eventStore.getEvents();\n }\n\n subscribe(listener: () => void): () => void {\n return this.eventStore.subscribe(listener);\n }\n\n clearEvents(): void {\n this.eventStore.clear();\n }\n\n destroy(): void {\n this.eventStore.destroy();\n }\n}\n","import type {\n LDClient,\n LDDebugOverride,\n LDPluginMetadata,\n LDFlagSet,\n Hook,\n LDPluginEnvironmentMetadata,\n} from 'launchdarkly-js-client-sdk';\nimport type { IFlagOverridePlugin } from './plugins';\n\n/**\n * Configuration options for the FlagOverridePlugin\n */\nexport type FlagOverridePluginConfig = {\n /** Namespace for localStorage keys. Defaults to 'ld-flag-override' */\n storageNamespace?: string;\n};\n\nconst DEFAULT_STORAGE_NAMESPACE = 'ld-flag-override';\n\nexport class FlagOverridePlugin implements IFlagOverridePlugin {\n private debugOverride?: LDDebugOverride;\n private config: Required<FlagOverridePluginConfig>;\n private ldClient: LDClient | null = null;\n\n constructor(config: FlagOverridePluginConfig = {}) {\n this.config = {\n storageNamespace: config.storageNamespace ?? DEFAULT_STORAGE_NAMESPACE,\n };\n }\n\n /**\n * Returns plugin metadata\n */\n getMetadata(): LDPluginMetadata {\n return {\n name: 'FlagOverridePlugin',\n };\n }\n\n /**\n * Returns the hooks for the plugin\n */\n getHooks(_metadata: LDPluginEnvironmentMetadata): Hook[] {\n return [];\n }\n\n /**\n * Called when the plugin is registered with the LaunchDarkly client\n */\n register(ldClient: LDClient): void {\n this.ldClient = ldClient;\n }\n\n /**\n * Called when the debug interface is available\n * Loads any existing overrides from localStorage\n */\n registerDebug(debugOverride: LDDebugOverride): void {\n this.debugOverride = debugOverride;\n this.loadExistingOverrides();\n }\n\n private loadExistingOverrides(): void {\n if (!this.debugOverride) return;\n\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (!key?.startsWith(this.config.storageNamespace + ':')) continue;\n\n const storedValue = storage.getItem(key);\n if (storedValue) {\n try {\n const value = JSON.parse(storedValue);\n const flagKey = key.replace(this.config.storageNamespace + ':', '');\n\n this.debugOverride.setOverride(flagKey, value);\n } catch {\n console.warn('flagOverridePlugin: Invalid stored value for', key);\n storage.removeItem(key);\n }\n }\n }\n } catch (error) {\n console.error('flagOverridePlugin: Error loading existing overrides:', error);\n }\n }\n\n /**\n * Sets an override value for a feature flag and persists it to localStorage\n * @param flagKey - The key of the flag to override\n * @param value - The value to set for the flag\n */\n setOverride(flagKey: string, value: unknown): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n if (!flagKey || typeof flagKey !== 'string') {\n console.error('flagOverridePlugin: Invalid flag key:', flagKey);\n return;\n }\n\n if (value === undefined) {\n console.error('flagOverridePlugin: Cannot set undefined value for flag override');\n return;\n }\n\n try {\n this.persistOverride(flagKey, value);\n this.debugOverride.setOverride(flagKey, value);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to set override:', error);\n }\n }\n\n /**\n * Removes an override for a specific feature flag\n * @param flagKey - The key of the flag to remove the override for\n */\n removeOverride(flagKey: string): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n if (!flagKey || typeof flagKey !== 'string') {\n console.error('flagOverridePlugin: Invalid flag key:', flagKey);\n return;\n }\n\n try {\n this.removePersistedOverride(flagKey);\n this.debugOverride.removeOverride(flagKey);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to remove override:', error);\n }\n }\n\n /**\n * Clears all feature flag overrides from both memory and localStorage\n */\n clearAllOverrides(): void {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return;\n }\n\n try {\n this.clearPersistedOverrides();\n this.debugOverride.clearAllOverrides();\n } catch (error) {\n console.error('flagOverridePlugin: Failed to clear overrides:', error);\n }\n }\n\n /**\n * Returns all currently active feature flag overrides\n * @returns Record of flag keys to their override values\n */\n getAllOverrides(): LDFlagSet {\n if (!this.debugOverride) {\n console.warn('flagOverridePlugin: Debug interface not available');\n return {};\n }\n\n try {\n return this.debugOverride.getAllOverrides();\n } catch (error) {\n console.error('flagOverridePlugin: Failed to get overrides:', error);\n return {};\n }\n }\n\n /**\n * Returns the LaunchDarkly client instance\n * @returns The LaunchDarkly client\n */\n getClient(): LDClient | null {\n return this.ldClient;\n }\n\n private getStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n return window.localStorage;\n }\n\n private persistOverride(flagKey: string, value: unknown): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const storageKey = `${this.config.storageNamespace}:${flagKey}`;\n storage.setItem(storageKey, JSON.stringify(value));\n } catch (error) {\n console.error('flagOverridePlugin: Failed to persist override:', error);\n }\n }\n\n private removePersistedOverride(flagKey: string): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const storageKey = `${this.config.storageNamespace}:${flagKey}`;\n storage.removeItem(storageKey);\n } catch (error) {\n console.error('flagOverridePlugin: Failed to remove persisted override:', error);\n }\n }\n\n private clearPersistedOverrides(): void {\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const keysToRemove: string[] = [];\n const prefix = this.config.storageNamespace + ':';\n\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => storage.removeItem(key));\n } catch (error) {\n console.error('flagOverridePlugin: Failed to clear persisted overrides:', error);\n }\n }\n}\n","import type { LaunchDarklyToolbar } from '../index';\n\ninterface WindowWithMaybeToolbar extends Window {\n LaunchDarklyToolbar?: LaunchDarklyToolbar;\n}\n\nfunction getWindow(): WindowWithMaybeToolbar {\n return window;\n}\n\nexport default async function lazyLoadToolbar(signal: AbortSignal, url: string): Promise<LaunchDarklyToolbar> {\n const existing = getWindow().LaunchDarklyToolbar;\n\n if (existing) {\n return Promise.resolve(existing);\n }\n\n await lazyLoad(signal, url);\n\n const toolbarModule = getWindow().LaunchDarklyToolbar;\n if (!toolbarModule) {\n throw new Error(`Unable to detect LaunchDarklyToolbar global from ${url}`);\n }\n\n return toolbarModule;\n}\n\nasync function lazyLoad(signal: AbortSignal, url: string): Promise<void> {\n // Check if a script with this URL already exists\n const existingScript = document.querySelector(`script[src=\"${url}\"]`) as HTMLScriptElement | null;\n\n if (existingScript) {\n // If script already exists and is loaded, return immediately\n if (existingScript.dataset.loaded === 'true') {\n return Promise.resolve();\n }\n\n // If script exists but is still loading, wait for it to complete\n return new Promise<void>((resolve, reject) => {\n existingScript.addEventListener('load', () => {\n if (!signal.aborted) {\n existingScript.dataset.loaded = 'true';\n resolve();\n }\n });\n existingScript.addEventListener('error', (error) => {\n if (!signal.aborted) {\n reject(error);\n }\n });\n });\n }\n\n // Create new script element\n const script = document.createElement('script');\n script.src = url;\n script.crossOrigin = 'anonymous';\n script.referrerPolicy = 'origin';\n\n const waitForLoad = new Promise<void>((resolve, reject) => {\n script.addEventListener('load', () => {\n if (!signal.aborted) {\n script.dataset.loaded = 'true';\n resolve();\n }\n });\n script.addEventListener('error', (error) => {\n if (!signal.aborted) {\n reject(error);\n }\n });\n });\n\n document.body.appendChild(script);\n\n try {\n await waitForLoad;\n } catch (error) {\n console.log(error);\n throw new Error(`Could not load LaunchDarkly developer toolbar bundle from ${url}`);\n }\n}\n","import { useEffect, useRef } from 'react';\n\nimport lazyLoadToolbar from './lazyLoadToolbar';\nimport type { InitializationConfig } from '../types';\nimport packageJson from '../../package.json';\n\ninterface UseLaunchDarklyToolbarConfig extends InitializationConfig {\n /**\n * URL to load the toolbar bundle from.\n * Use this when developing the toolbar itself locally.\n *\n * Example: `'http://localhost:8080/toolbar.min.js'`\n *\n * Default: CDN URL based on package version\n */\n toolbarBundleUrl?: string;\n\n /**\n * Whether the toolbar should be loaded and displayed.\n *\n * Default: `true`\n */\n enabled?: boolean;\n}\n\nexport default function useLaunchDarklyToolbar(args: UseLaunchDarklyToolbarConfig) {\n const { toolbarBundleUrl, enabled, ...initConfig } = args;\n const configRef = useRef<InitializationConfig | null>(null);\n const url = toolbarBundleUrl ?? versionToCdn(packageJson.version);\n\n useEffect(() => {\n if (enabled === false) {\n return;\n }\n\n if (configRef.current === null) {\n configRef.current = initConfig;\n }\n }, [enabled, initConfig]);\n\n useEffect(() => {\n if (enabled === false || configRef.current === null) {\n return;\n }\n\n const controller = new AbortController();\n\n let cleanup: () => void = () => {};\n lazyLoadToolbar(controller.signal, url).then((importedToolbar) => {\n if (configRef.current === null) {\n return;\n }\n\n cleanup = importedToolbar.init(configRef.current);\n });\n\n return () => {\n controller.abort();\n cleanup();\n };\n }, [enabled, url]);\n}\n\nfunction versionToCdn(version = 'latest'): string {\n return `https://unpkg.com/@launchdarkly/toolbar@${version}/cdn/toolbar.min.js`;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ANALYTICS_EVENT_PREFIX","VALID_EVENT_KINDS","VALID_EVENT_CATEGORIES","isValidEventKind","kind","isValidEventCategory","category","TOOLBAR_POSITIONS","DEFAULT_MAX_EVENTS","EventStore","Set","config","event","error","console","listener","AfterTrackHook","hookContext","syntheticContext","Date","window","undefined","processedEvent","filter","context","timestamp","randomPart","Math","id","AfterIdentifyHook","data","result","AfterEvaluationHook","detail","EventInterceptionPlugin","onNewEvent","isToolbarEvent","_metadata","ldClient","DEFAULT_STORAGE_NAMESPACE","FlagOverridePlugin","debugOverride","storage","i","storedValue","value","JSON","flagKey","storageKey","keysToRemove","prefix","getWindow","lazyLoadToolbar","signal","url","existing","Promise","lazyLoad","toolbarModule","Error","existingScript","document","resolve","reject","script","waitForLoad","useLaunchDarklyToolbar","args","toolbarBundleUrl","enabled","initConfig","configRef","useRef","versionToCdn","packageJson","useEffect","controller","AbortController","cleanup","importedToolbar","version"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,MAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;ACNO,MAAMI,yBAAyB;AC0BtC,MAAMC,oBAAoB;IAAC;IAAY;IAAW;IAAU;IAAS;IAAW;CAAa;AAK7F,MAAMC,yBAAyB;IAAC;IAAQ;IAAU;IAAY;CAAQ;AA0C/D,SAASC,iBAAiBC,IAAY;IAC3C,OAAOH,kBAAkB,QAAQ,CAACG;AACpC;AAEO,SAASC,qBAAqBC,QAAgB;IACnD,OAAOJ,uBAAuB,QAAQ,CAACI;AACzC;AC/EO,MAAMC,oBAAoB;IAAC;IAAY;IAAa;IAAe;CAAe;ACEzF,MAAMC,qBAAqB;AAMpB,MAAMC;IACH,SAA2B,EAAE,CAAC;IAC9B,YAA6B,IAAIC,MAAM;IACvC,UAAkB;IAE1B,YAAYC,SAA2B,CAAC,CAAC,CAAE;QACzC,IAAI,CAAC,SAAS,GAAGA,OAAO,SAAS,IAAIH;IACvC;IAEA,SAASI,KAAqB,EAAQ;QACpC,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAACA;YACjB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAErC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAE3D,IAAI,CAAC,eAAe;QACtB,EAAE,OAAOC,OAAO;YACdC,QAAQ,IAAI,CAAC,sBAAsBD;QACrC;IACF;IAEA,YAA8B;QAC5B,OAAO;eAAI,IAAI,CAAC,MAAM;SAAC;IACzB;IAEA,UAAUE,QAAoB,EAAc;QAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAACA;QACnBA;QACA,OAAO,IAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;IACrC;IAEA,QAAc;QACZ,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,eAAe;IACtB;IAEA,UAAgB;QACd,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE;IAClB;IAEQ,kBAAwB;QAC9B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAACA;YACtB,IAAI;gBACFA;YACF,EAAE,OAAOF,OAAO;gBACdC,QAAQ,IAAI,CAAC,mBAAmBD;YAClC;QACF;IACF;AACF;AClDO,MAAMG;IACH,OAA6B;IAC7B,YAAY,EAAE;IAEtB,YAAYL,SAA+B,CAAC,CAAC,CAAE;QAC7C,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQA,OAAO,MAAM;YACrB,YAAYA,OAAO,UAAU;QAC/B;IACF;IAEA,cAA4B;QAC1B,OAAO;YACL,MAAM;QACR;IACF;IAEA,WAAWM,WAA+B,EAAQ;QAChD,IAAI;YACF,MAAMC,mBAA0C;gBAC9C,MAAM;gBACN,KAAKD,YAAY,GAAG;gBACpB,SAASA,YAAY,OAAO;gBAC5B,MAAMA,YAAY,IAAI;gBACtB,aAAaA,YAAY,WAAW;gBACpC,cAAcE,KAAK,GAAG;gBACtB,KAAK,AAAkB,MAAlB,OAAOC,SAAyBA,OAAO,QAAQ,CAAC,IAAI,GAAGC;YAC9D;YAEA,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAC1B;YAGF,MAAMC,iBAAiB,IAAI,CAAC,YAAY,CAACJ;YAEzC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAGI;QAC3B,EAAE,OAAOT,OAAO;YAEdC,QAAQ,IAAI,CAAC,6CAA6CD;QAC5D;IACF;IAEQ,qBAA8B;QACpC,MAAMU,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,IAAI,CAACA,QAAQ,OAAO;QAGpB,OACE,CAAEA,CAAAA,OAAO,KAAK,IAAI,CAACA,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAQ,KACjD,CAAEA,CAAAA,OAAO,UAAU,IAAI,CAACA,OAAO,UAAU,CAAC,QAAQ,CAAC,SAAQ;IAE/D;IAEQ,aAAaC,OAA8B,EAAkB;QACnE,MAAMC,YAAYN,KAAK,GAAG;QAE1B,IAAI,CAAC,SAAS,GAAI,KAAI,CAAC,SAAS,GAAG,KAAK;QACxC,MAAMO,aAAaC,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC,GAAG;QAC3D,MAAMC,KAAK,GAAGJ,QAAQ,IAAI,CAAC,CAAC,EAAEC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAEC,YAAY;QAErG,OAAO;YACLE;YACA,MAAMJ,QAAQ,IAAI;YAClB,KAAKA,QAAQ,GAAG;YAChBC;YACAD;YACA,aAAa,CAAC,QAAQ,EAAEA,QAAQ,GAAG,IAAI,WAAW;YAClD,UAAU;YACV,UAAU,IAAI,CAAC,eAAe,CAACA;QACjC;IACF;IAEQ,gBAAgBA,OAA8B,EAA2B;QAE/E,OAAO;YACL,MAAMA,QAAQ,IAAI;YAClB,aAAaA,QAAQ,WAAW;YAChC,KAAKA,QAAQ,GAAG;QAClB;IACF;AACF;AC1EO,MAAMK;IACH,OAAgC;IAChC,YAAY,EAAE;IAEtB,YAAYlB,SAAkC,CAAC,CAAC,CAAE;QAChD,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQA,OAAO,MAAM;YACrB,YAAYA,OAAO,UAAU;QAC/B;IACF;IAEA,cAA4B;QAC1B,OAAO;YACL,MAAM;QACR;IACF;IAEA,cACEM,WAAkC,EAClCa,IAAwB,EACxBC,MAA4B,EACR;QACpB,IAAI;YAEF,IAAIA,AAAkB,gBAAlBA,OAAO,MAAM,EACf,OAAOD;YAGT,MAAMZ,mBAA0C;gBAC9C,MAAM;gBACN,SAASD,YAAY,OAAO;gBAC5B,cAAcE,KAAK,GAAG;gBACtB,aAAa,IAAI,CAAC,oBAAoB,CAACF,YAAY,OAAO;YAC5D;YAEA,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAC1B,OAAOa;YAGT,MAAMR,iBAAiB,IAAI,CAAC,YAAY,CAACJ;YAEzC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAGI;QAC3B,EAAE,OAAOT,OAAO;YAEdC,QAAQ,IAAI,CAAC,gDAAgDD;QAC/D;QAEA,OAAOiB;IACT;IAEQ,qBAAqBN,OAAkB,EAAU;QACvD,IAAIA,WAAW,AAAmB,YAAnB,OAAOA,SAAsB;YAC1C,IAAI,UAAUA,WAAWA,QAAQ,IAAI,EACnC,OAAOA,QAAQ,IAAI;YAGrB,IAAIA,QAAQ,SAAS,EACnB,OAAO;QAGX;QACA,OAAO;IACT;IAEQ,qBAA8B;QACpC,MAAMD,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,IAAI,CAACA,QAAQ,OAAO;QAGpB,OACE,CAAEA,CAAAA,OAAO,KAAK,IAAI,CAACA,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAU,KACnD,CAAEA,CAAAA,OAAO,UAAU,IAAI,CAACA,OAAO,UAAU,CAAC,QAAQ,CAAC,WAAU;IAEjE;IAEQ,aAAaC,OAA8B,EAAkB;QACnE,MAAMC,YAAYN,KAAK,GAAG;QAE1B,IAAI,CAAC,SAAS,GAAI,KAAI,CAAC,SAAS,GAAG,KAAK;QACxC,MAAMO,aAAaC,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC,GAAG;QAC3D,MAAMC,KAAK,GAAGJ,QAAQ,IAAI,CAAC,CAAC,EAAEC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAEC,YAAY;QAErG,OAAO;YACLE;YACA,MAAMJ,QAAQ,IAAI;YAClB,KAAKA,QAAQ,GAAG;YAChBC;YACAD;YACA,aAAa,CAAC,UAAU,EAAGA,QAAQ,OAAO,EAAU,OAAO,aAAa;YACxE,UAAU;YACV,UAAU,IAAI,CAAC,eAAe,CAACA;QACjC;IACF;IAEQ,gBAAgBA,OAA8B,EAA2B;QAE/E,OAAO;YACL,aAAaA,QAAQ,WAAW;QAClC;IACF;AACF;ACrGO,MAAMQ;IACH,OAAkC;IAClC,YAAY,EAAE;IAEtB,YAAYrB,SAAoC,CAAC,CAAC,CAAE;QAClD,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQA,OAAO,MAAM;YACrB,YAAYA,OAAO,UAAU;QAC/B;IACF;IAEA,cAA4B;QAC1B,OAAO;YACL,MAAM;QACR;IACF;IAEA,gBACEM,WAAoC,EACpCa,IAA0B,EAC1BG,MAA0B,EACJ;QACtB,IAAI;YACF,MAAMf,mBAA0C;gBAC9C,MAAM;gBACN,KAAKD,YAAY,OAAO;gBACxB,SAASA,YAAY,OAAO;gBAC5B,OAAOgB,OAAO,KAAK;gBACnB,WAAWA,OAAO,cAAc;gBAChC,SAAShB,YAAY,YAAY;gBACjC,QAAQgB,OAAO,MAAM;gBACrB,cAAcd,KAAK,GAAG;YAGxB;YAEA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAACD,mBAC3B,OAAOY;YAGT,MAAMR,iBAAiB,IAAI,CAAC,YAAY,CAACJ;YAEzC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAGI;QAC3B,EAAE,OAAOT,OAAO;YAEdC,QAAQ,IAAI,CAAC,kDAAkDD;QACjE;QAEA,OAAOiB;IACT;IAEQ,mBAAmBN,OAA8B,EAAW;QAClE,MAAMD,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,IAAI,CAACA,QAAQ,OAAO;QAGpB,OACE,CAAEA,CAAAA,OAAO,KAAK,IAAI,CAACA,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAS,KAClD,CAAEA,CAAAA,OAAO,UAAU,IAAI,CAACA,OAAO,UAAU,CAAC,QAAQ,CAAC,OAAM,KACzD,CAAEA,CAAAA,OAAO,QAAQ,IAAIC,QAAQ,GAAG,IAAI,CAACD,OAAO,QAAQ,CAAC,QAAQ,CAACC,QAAQ,GAAG;IAE7E;IAEQ,aAAaA,OAA8B,EAAkB;QACnE,MAAMC,YAAYN,KAAK,GAAG;QAE1B,IAAI,CAAC,SAAS,GAAI,KAAI,CAAC,SAAS,GAAG,KAAK;QACxC,MAAMO,aAAaC,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC,GAAG;QAC3D,MAAMC,KAAK,GAAGJ,QAAQ,IAAI,CAAC,CAAC,EAAEC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAEC,YAAY;QAErG,OAAO;YACLE;YACA,MAAMJ,QAAQ,IAAI;YAClB,KAAKA,QAAQ,GAAG;YAChBC;YACAD;YACA,aAAa,CAAC,MAAM,EAAEA,QAAQ,GAAG,IAAI,WAAW;YAChD,UAAU;YACV,UAAU,IAAI,CAAC,eAAe,CAACA;QACjC;IACF;IAEQ,gBAAgBA,OAA8B,EAA2B;QAE/E,OAAO;YACL,aAAaA,QAAQ,OAAO;YAC5B,WAAWA,QAAQ,SAAS;YAC5B,aAAaA,QAAQ,WAAW;YAChC,QAAQA,QAAQ,MAAM;YACtB,cAAcA,QAAQ,OAAO;QAC/B;IACF;AACF;ACrFO,MAAMU;IACH,eAA+B;IAC/B,kBAAqC;IACrC,oBAAyC;IACzC,WAAuB;IACvB,OAAsC;IACtC,WAA4B,KAAK;IAEzC,YAAYvB,SAAwC,CAAC,CAAC,CAAE;QACtD,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe;YACf,eAAe;YACf,GAAGA,MAAM;QACX;QAEA,IAAI,CAAC,UAAU,GAAG,IAAIF,WAAW;YAAE,WAAW,IAAI,CAAC,MAAM,CAAC,aAAa;QAAC;QAExE,MAAM0B,aAAa,CAACvB;YAClB,MAAMwB,iBAAiB,IAAI,CAAC,cAAc,CAACxB;YAC3C,IAAIwB,gBACF;YAGF,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAC3BtB,QAAQ,GAAG,CAAC,yBAAyB;gBACnC,MAAMF,MAAM,IAAI;gBAChB,KAAKA,MAAM,GAAG;gBACd,UAAUA,MAAM,QAAQ;gBACxB,aAAaA,MAAM,WAAW;YAChC;YAGF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAACA;QAC3B;QAEA,IAAI,CAAC,cAAc,GAAG,IAAII,eAAe;YACvC,QAAQL,OAAO,MAAM;YACrBwB;QACF;QAEA,IAAI,CAAC,iBAAiB,GAAG,IAAIN,kBAAkB;YAC7C,QAAQlB,OAAO,MAAM;YACrBwB;QACF;QAEA,IAAI,CAAC,mBAAmB,GAAG,IAAIH,oBAAoB;YACjD,QAAQrB,OAAO,MAAM;YACrBwB;QACF;IACF;IAEA,eAAevB,KAAqB,EAAW;QAC7C,OAAOA,MAAM,GAAG,EAAE,WAAWZ,2BAA2B;IAC1D;IAEA,cAAgC;QAC9B,OAAO;YACL,MAAM;QACR;IACF;IAEA,SAASqC,SAAsC,EAAU;QACvD,OAAO;YAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,mBAAmB;SAAC;IAChF;IAEA,SAASC,QAAkB,EAAQ;QACjC,IAAI,CAAC,QAAQ,GAAGA;IAClB;IAEA,YAA6B;QAC3B,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,YAA8B;QAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS;IAClC;IAEA,UAAUvB,QAAoB,EAAc;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAACA;IACnC;IAEA,cAAoB;QAClB,IAAI,CAAC,UAAU,CAAC,KAAK;IACvB;IAEA,UAAgB;QACd,IAAI,CAAC,UAAU,CAAC,OAAO;IACzB;AACF;AC3FA,MAAMwB,4BAA4B;AAE3B,MAAMC;IACH,cAAgC;IAChC,OAA2C;IAC3C,WAA4B,KAAK;IAEzC,YAAY7B,SAAmC,CAAC,CAAC,CAAE;QACjD,IAAI,CAAC,MAAM,GAAG;YACZ,kBAAkBA,OAAO,gBAAgB,IAAI4B;QAC/C;IACF;IAKA,cAAgC;QAC9B,OAAO;YACL,MAAM;QACR;IACF;IAKA,SAASF,SAAsC,EAAU;QACvD,OAAO,EAAE;IACX;IAKA,SAASC,QAAkB,EAAQ;QACjC,IAAI,CAAC,QAAQ,GAAGA;IAClB;IAMA,cAAcG,aAA8B,EAAQ;QAClD,IAAI,CAAC,aAAa,GAAGA;QACrB,IAAI,CAAC,qBAAqB;IAC5B;IAEQ,wBAA8B;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QAEzB,MAAMC,UAAU,IAAI,CAAC,UAAU;QAC/B,IAAI,CAACA,SAAS;QAEd,IAAI;YACF,IAAK,IAAIC,IAAI,GAAGA,IAAID,QAAQ,MAAM,EAAEC,IAAK;gBACvC,MAAMhD,MAAM+C,QAAQ,GAAG,CAACC;gBACxB,IAAI,CAAChD,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM;gBAE1D,MAAMiD,cAAcF,QAAQ,OAAO,CAAC/C;gBACpC,IAAIiD,aACF,IAAI;oBACF,MAAMC,QAAQC,KAAK,KAAK,CAACF;oBACzB,MAAMG,UAAUpD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK;oBAEhE,IAAI,CAAC,aAAa,CAAC,WAAW,CAACoD,SAASF;gBAC1C,EAAE,OAAM;oBACN/B,QAAQ,IAAI,CAAC,gDAAgDnB;oBAC7D+C,QAAQ,UAAU,CAAC/C;gBACrB;YAEJ;QACF,EAAE,OAAOkB,OAAO;YACdC,QAAQ,KAAK,CAAC,yDAAyDD;QACzE;IACF;IAOA,YAAYkC,OAAe,EAAEF,KAAc,EAAQ;QACjD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YACvB/B,QAAQ,IAAI,CAAC;QAIf,IAAI,CAACiC,WAAW,AAAmB,YAAnB,OAAOA,SAAsB,YAC3CjC,QAAQ,KAAK,CAAC,yCAAyCiC;QAIzD,IAAIF,AAAUxB,WAAVwB,OAAqB,YACvB/B,QAAQ,KAAK,CAAC;QAIhB,IAAI;YACF,IAAI,CAAC,eAAe,CAACiC,SAASF;YAC9B,IAAI,CAAC,aAAa,CAAC,WAAW,CAACE,SAASF;QAC1C,EAAE,OAAOhC,OAAO;YACdC,QAAQ,KAAK,CAAC,+CAA+CD;QAC/D;IACF;IAMA,eAAekC,OAAe,EAAQ;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YACvBjC,QAAQ,IAAI,CAAC;QAIf,IAAI,CAACiC,WAAW,AAAmB,YAAnB,OAAOA,SAAsB,YAC3CjC,QAAQ,KAAK,CAAC,yCAAyCiC;QAIzD,IAAI;YACF,IAAI,CAAC,uBAAuB,CAACA;YAC7B,IAAI,CAAC,aAAa,CAAC,cAAc,CAACA;QACpC,EAAE,OAAOlC,OAAO;YACdC,QAAQ,KAAK,CAAC,kDAAkDD;QAClE;IACF;IAKA,oBAA0B;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YACvBC,QAAQ,IAAI,CAAC;QAIf,IAAI;YACF,IAAI,CAAC,uBAAuB;YAC5B,IAAI,CAAC,aAAa,CAAC,iBAAiB;QACtC,EAAE,OAAOD,OAAO;YACdC,QAAQ,KAAK,CAAC,kDAAkDD;QAClE;IACF;IAMA,kBAA6B;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvBC,QAAQ,IAAI,CAAC;YACb,OAAO,CAAC;QACV;QAEA,IAAI;YACF,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe;QAC3C,EAAE,OAAOD,OAAO;YACdC,QAAQ,KAAK,CAAC,gDAAgDD;YAC9D,OAAO,CAAC;QACV;IACF;IAMA,YAA6B;QAC3B,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEQ,aAA6B;QACnC,IAAI,AAAkB,MAAlB,OAAOO,QAAwB,OAAO;QAC1C,OAAOA,OAAO,YAAY;IAC5B;IAEQ,gBAAgB2B,OAAe,EAAEF,KAAc,EAAQ;QAC7D,MAAMH,UAAU,IAAI,CAAC,UAAU;QAC/B,IAAI,CAACA,SAAS;QAEd,IAAI;YACF,MAAMM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAED,SAAS;YAC/DL,QAAQ,OAAO,CAACM,YAAYF,KAAK,SAAS,CAACD;QAC7C,EAAE,OAAOhC,OAAO;YACdC,QAAQ,KAAK,CAAC,mDAAmDD;QACnE;IACF;IAEQ,wBAAwBkC,OAAe,EAAQ;QACrD,MAAML,UAAU,IAAI,CAAC,UAAU;QAC/B,IAAI,CAACA,SAAS;QAEd,IAAI;YACF,MAAMM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAED,SAAS;YAC/DL,QAAQ,UAAU,CAACM;QACrB,EAAE,OAAOnC,OAAO;YACdC,QAAQ,KAAK,CAAC,4DAA4DD;QAC5E;IACF;IAEQ,0BAAgC;QACtC,MAAM6B,UAAU,IAAI,CAAC,UAAU;QAC/B,IAAI,CAACA,SAAS;QAEd,IAAI;YACF,MAAMO,eAAyB,EAAE;YACjC,MAAMC,SAAS,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG;YAE9C,IAAK,IAAIP,IAAI,GAAGA,IAAID,QAAQ,MAAM,EAAEC,IAAK;gBACvC,MAAMhD,MAAM+C,QAAQ,GAAG,CAACC;gBACxB,IAAIhD,KAAK,WAAWuD,SAClBD,aAAa,IAAI,CAACtD;YAEtB;YAEAsD,aAAa,OAAO,CAAC,CAACtD,MAAQ+C,QAAQ,UAAU,CAAC/C;QACnD,EAAE,OAAOkB,OAAO;YACdC,QAAQ,KAAK,CAAC,4DAA4DD;QAC5E;IACF;AACF;;ACtOA,SAASsC;IACP,OAAO/B;AACT;AAEe,eAAegC,gBAAgBC,MAAmB,EAAEC,GAAW;IAC5E,MAAMC,WAAWJ,YAAY,mBAAmB;IAEhD,IAAII,UACF,OAAOC,QAAQ,OAAO,CAACD;IAGzB,MAAME,SAASJ,QAAQC;IAEvB,MAAMI,gBAAgBP,YAAY,mBAAmB;IACrD,IAAI,CAACO,eACH,MAAM,IAAIC,MAAM,CAAC,iDAAiD,EAAEL,KAAK;IAG3E,OAAOI;AACT;AAEA,eAAeD,SAASJ,MAAmB,EAAEC,GAAW;IAEtD,MAAMM,iBAAiBC,SAAS,aAAa,CAAC,CAAC,YAAY,EAAEP,IAAI,EAAE,CAAC;IAEpE,IAAIM,gBAAgB;QAElB,IAAIA,AAAkC,WAAlCA,eAAe,OAAO,CAAC,MAAM,EAC/B,OAAOJ,QAAQ,OAAO;QAIxB,OAAO,IAAIA,QAAc,CAACM,SAASC;YACjCH,eAAe,gBAAgB,CAAC,QAAQ;gBACtC,IAAI,CAACP,OAAO,OAAO,EAAE;oBACnBO,eAAe,OAAO,CAAC,MAAM,GAAG;oBAChCE;gBACF;YACF;YACAF,eAAe,gBAAgB,CAAC,SAAS,CAAC/C;gBACxC,IAAI,CAACwC,OAAO,OAAO,EACjBU,OAAOlD;YAEX;QACF;IACF;IAGA,MAAMmD,SAASH,SAAS,aAAa,CAAC;IACtCG,OAAO,GAAG,GAAGV;IACbU,OAAO,WAAW,GAAG;IACrBA,OAAO,cAAc,GAAG;IAExB,MAAMC,cAAc,IAAIT,QAAc,CAACM,SAASC;QAC9CC,OAAO,gBAAgB,CAAC,QAAQ;YAC9B,IAAI,CAACX,OAAO,OAAO,EAAE;gBACnBW,OAAO,OAAO,CAAC,MAAM,GAAG;gBACxBF;YACF;QACF;QACAE,OAAO,gBAAgB,CAAC,SAAS,CAACnD;YAChC,IAAI,CAACwC,OAAO,OAAO,EACjBU,OAAOlD;QAEX;IACF;IAEAgD,SAAS,IAAI,CAAC,WAAW,CAACG;IAE1B,IAAI;QACF,MAAMC;IACR,EAAE,OAAOpD,OAAO;QACdC,QAAQ,GAAG,CAACD;QACZ,MAAM,IAAI8C,MAAM,CAAC,0DAA0D,EAAEL,KAAK;IACpF;AACF;;;;ACxDe,SAASY,uBAAuBC,IAAkC;IAC/E,MAAM,EAAEC,gBAAgB,EAAEC,OAAO,EAAE,GAAGC,YAAY,GAAGH;IACrD,MAAMI,YAAYC,AAAAA,IAAAA,+BAAAA,MAAAA,AAAAA,EAAoC;IACtD,MAAMlB,MAAMc,oBAAoBK,aAAaC,wBAAAA,EAAmB;IAEhEC,IAAAA,+BAAAA,SAAAA,AAAAA,EAAU;QACR,IAAIN,AAAY,UAAZA,SACF;QAGF,IAAIE,AAAsB,SAAtBA,UAAU,OAAO,EACnBA,UAAU,OAAO,GAAGD;IAExB,GAAG;QAACD;QAASC;KAAW;IAExBK,IAAAA,+BAAAA,SAAAA,AAAAA,EAAU;QACR,IAAIN,AAAY,UAAZA,WAAqBE,AAAsB,SAAtBA,UAAU,OAAO,EACxC;QAGF,MAAMK,aAAa,IAAIC;QAEvB,IAAIC,UAAsB,KAAO;QACjC1B,gBAAgBwB,WAAW,MAAM,EAAEtB,KAAK,IAAI,CAAC,CAACyB;YAC5C,IAAIR,AAAsB,SAAtBA,UAAU,OAAO,EACnB;YAGFO,UAAUC,gBAAgB,IAAI,CAACR,UAAU,OAAO;QAClD;QAEA,OAAO;YACLK,WAAW,KAAK;YAChBE;QACF;IACF,GAAG;QAACT;QAASf;KAAI;AACnB;AAEA,SAASmB,aAAaO,UAAU,QAAQ;IACtC,OAAO,CAAC,wCAAwC,EAAEA,QAAQ,mBAAmB,CAAC;AAChF"}