@launchdarkly/toolbar 2.2.0-beta.1 → 2.2.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 (116) hide show
  1. package/README.md +246 -19
  2. package/cdn/toolbar.min.js +658 -13
  3. package/cdn/toolbar.min.js.LICENSE.txt +14 -0
  4. package/dist/angular/launchdarkly-toolbar.service.d.ts +104 -0
  5. package/dist/angular.cjs +439 -0
  6. package/dist/angular.cjs.map +1 -0
  7. package/dist/angular.d.ts +51 -0
  8. package/dist/core/index.d.ts +0 -1
  9. package/dist/core/services/DevServerClient.d.ts +9 -3
  10. package/dist/core/services/FlagStateManager.d.ts +2 -0
  11. package/dist/core/styles/constants.d.ts +24 -0
  12. package/dist/core/styles/index.d.ts +2 -0
  13. package/dist/core/styles/shadowDomStyles.d.ts +41 -0
  14. package/dist/core/tests/mocks/providers.d.ts +132 -0
  15. package/dist/core/ui/Buttons/IconButton.d.ts +2 -1
  16. package/dist/core/ui/JsonEditor/JsonEditor.d.ts +2 -1
  17. package/dist/core/ui/Toolbar/components/AuthenticationModal/AuthenticationModal.d.ts +1 -1
  18. package/dist/core/ui/Toolbar/components/CircleLogo.d.ts +1 -2
  19. package/dist/core/ui/Toolbar/components/{FlagKeyWithCopy.css.d.ts → CopyableText.css.d.ts} +1 -1
  20. package/dist/core/ui/Toolbar/components/CopyableText.d.ts +18 -0
  21. package/dist/core/ui/Toolbar/components/FilterOptions/FilterOptions.css.d.ts +1 -0
  22. package/dist/core/ui/Toolbar/components/FilterOptions/FilterOptions.d.ts +1 -0
  23. package/dist/core/ui/Toolbar/components/FilterOptions/ShareUrlButton.css.d.ts +2 -0
  24. package/dist/core/ui/Toolbar/components/FilterOptions/ShareUrlButton.d.ts +7 -0
  25. package/dist/core/ui/Toolbar/components/LoadingScreen/LoadingScreen.css.d.ts +7 -0
  26. package/dist/core/ui/Toolbar/components/LoadingScreen/LoadingScreen.d.ts +5 -0
  27. package/dist/core/ui/Toolbar/components/LoadingScreen/index.d.ts +1 -0
  28. package/dist/core/ui/Toolbar/components/ShareStatePopover/ShareStatePopover.css.d.ts +10 -0
  29. package/dist/core/ui/Toolbar/components/ShareStatePopover/ShareStatePopover.d.ts +15 -0
  30. package/dist/core/ui/Toolbar/components/ShareStatePopover/index.d.ts +2 -0
  31. package/dist/core/ui/Toolbar/components/icons/ShareIcon.d.ts +5 -0
  32. package/dist/core/ui/Toolbar/components/icons/index.d.ts +2 -0
  33. package/dist/core/ui/Toolbar/components/index.d.ts +1 -0
  34. package/dist/core/ui/Toolbar/components/legacy/ExpandedToolbarContentLegacy.d.ts +1 -0
  35. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/AnalyticsConsentToast.d.ts +5 -0
  36. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/AnalyticsConsentToast.module.css.d.ts +13 -0
  37. package/dist/core/ui/Toolbar/components/new/AnalyticsConsentToast/index.d.ts +1 -0
  38. package/dist/core/ui/Toolbar/components/new/ContentActions.module.css.d.ts +4 -0
  39. package/dist/core/ui/Toolbar/components/new/Contexts/AddContextForm.d.ts +6 -0
  40. package/dist/core/ui/Toolbar/components/new/Contexts/AddContextForm.module.css.d.ts +14 -0
  41. package/dist/core/ui/Toolbar/components/new/Contexts/ContextItem.d.ts +9 -0
  42. package/dist/core/ui/Toolbar/components/new/Contexts/ContextItem.module.css.d.ts +19 -0
  43. package/dist/core/ui/Toolbar/components/new/Contexts/ContextList.d.ts +1 -0
  44. package/dist/core/ui/Toolbar/components/new/Contexts/ContextList.module.css.d.ts +8 -0
  45. package/dist/core/ui/Toolbar/components/new/Contexts/ContextListContent.d.ts +1 -0
  46. package/dist/core/ui/Toolbar/components/new/Contexts/index.d.ts +4 -0
  47. package/dist/core/ui/Toolbar/components/new/ExpandedToolbarContent.d.ts +4 -3
  48. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagControls.d.ts +5 -5
  49. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagItem.d.ts +2 -1
  50. package/dist/core/ui/Toolbar/components/new/FeatureFlags/FlagListContent.d.ts +1 -1
  51. package/dist/core/ui/Toolbar/components/new/FilterOverlay/FilterOverlay.module.css.d.ts +1 -0
  52. package/dist/core/ui/Toolbar/components/new/Monitoring/EventsContent.module.css.d.ts +1 -0
  53. package/dist/core/ui/Toolbar/components/new/Settings/Privacy/PrivacySettings.d.ts +1 -0
  54. package/dist/core/ui/Toolbar/components/new/Settings/SettingsContent.module.css.d.ts +2 -0
  55. package/dist/core/ui/Toolbar/components/new/Settings/ShareButton.d.ts +5 -0
  56. package/dist/core/ui/Toolbar/components/new/Settings/ShareButton.module.css.d.ts +1 -0
  57. package/dist/core/ui/Toolbar/components/new/Settings/index.d.ts +1 -1
  58. package/dist/core/ui/Toolbar/components/new/Tooltip.d.ts +3 -1
  59. package/dist/core/ui/Toolbar/components/new/context/TabSearchProvider.d.ts +7 -5
  60. package/dist/core/ui/Toolbar/components/new/types.d.ts +2 -2
  61. package/dist/core/ui/Toolbar/constants/animations.d.ts +14 -0
  62. package/dist/core/ui/Toolbar/context/DevServerProvider.d.ts +2 -0
  63. package/dist/core/ui/Toolbar/context/api/ApiProvider.d.ts +1 -2
  64. package/dist/core/ui/Toolbar/context/api/ContextsProvider.d.ts +19 -0
  65. package/dist/core/ui/Toolbar/context/api/FlagsProvider.d.ts +1 -0
  66. package/dist/core/ui/Toolbar/context/api/index.d.ts +1 -0
  67. package/dist/core/ui/Toolbar/context/state/ToolbarStateProvider.d.ts +6 -0
  68. package/dist/core/ui/Toolbar/context/telemetry/AnalyticsPreferencesProvider.d.ts +14 -0
  69. package/dist/core/ui/Toolbar/context/telemetry/InternalClientProvider.d.ts +15 -1
  70. package/dist/core/ui/Toolbar/context/telemetry/TelemetryBundleProvider.d.ts +2 -0
  71. package/dist/core/ui/Toolbar/context/telemetry/index.d.ts +1 -0
  72. package/dist/core/ui/Toolbar/hooks/index.d.ts +2 -0
  73. package/dist/core/ui/Toolbar/hooks/useLocalStorage.d.ts +10 -0
  74. package/dist/core/ui/Toolbar/hooks/useReducedMotion.d.ts +5 -0
  75. package/dist/core/ui/Toolbar/hooks/useToolbarAnimations.d.ts +1 -1
  76. package/dist/core/ui/Toolbar/utils/context.d.ts +33 -0
  77. package/dist/core/ui/Toolbar/utils/localStorage.d.ts +21 -2
  78. package/dist/core/utils/analytics.d.ts +48 -2
  79. package/dist/core/utils/feedback.d.ts +18 -0
  80. package/dist/core/utils/urlOverrides.d.ts +105 -0
  81. package/dist/flags/toolbarFlags.d.ts +5 -2
  82. package/dist/index.cjs +10 -6
  83. package/dist/index.cjs.map +1 -1
  84. package/dist/js/374.js +446 -0
  85. package/dist/js/374.js.map +1 -0
  86. package/dist/js/816.js +56 -0
  87. package/dist/js/816.js.map +1 -0
  88. package/dist/js/96.js +38 -0
  89. package/dist/js/96.js.map +1 -0
  90. package/dist/js/angular.js +353 -0
  91. package/dist/js/angular.js.map +1 -0
  92. package/dist/js/index.js +3 -527
  93. package/dist/js/index.js.map +1 -1
  94. package/dist/js/plugins.js +1 -0
  95. package/dist/js/react.js +2 -0
  96. package/dist/js/types-entry.js +0 -0
  97. package/dist/js/vue.js +34 -0
  98. package/dist/js/vue.js.map +1 -0
  99. package/dist/plugins.cjs +483 -0
  100. package/dist/plugins.cjs.map +1 -0
  101. package/dist/plugins.d.ts +21 -0
  102. package/dist/react/useLaunchDarklyToolbar.d.ts +1 -1
  103. package/dist/react.cjs +127 -0
  104. package/dist/react.cjs.map +1 -0
  105. package/dist/react.d.ts +25 -0
  106. package/dist/types-entry.cjs +20 -0
  107. package/dist/types-entry.cjs.map +1 -0
  108. package/dist/types-entry.d.ts +12 -0
  109. package/dist/vue/useLaunchDarklyToolbar.d.ts +20 -0
  110. package/dist/vue.cjs +122 -0
  111. package/dist/vue.cjs.map +1 -0
  112. package/dist/vue.d.ts +24 -0
  113. package/package.json +133 -36
  114. package/dist/core/ui/Toolbar/components/FlagKeyWithCopy.d.ts +0 -6
  115. package/dist/core/ui/Toolbar/components/new/Settings/SettingsContent.d.ts +0 -1
  116. /package/dist/{react → core}/lazyLoadToolbar.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/374.js","sources":["../../src/types/analytics.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"],"sourcesContent":["export const ANALYTICS_EVENT_PREFIX = 'ld.toolbar';\n\nexport type FeedbackSentiment = 'positive' | 'negative';\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"],"names":["ANALYTICS_EVENT_PREFIX","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","key","storedValue","value","JSON","flagKey","storageKey","keysToRemove","prefix"],"mappings":"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"}
package/dist/js/816.js ADDED
@@ -0,0 +1,56 @@
1
+ function getWindow() {
2
+ return window;
3
+ }
4
+ async function lazyLoadToolbar(signal, url) {
5
+ const existing = getWindow().LaunchDarklyToolbar;
6
+ if (existing) return Promise.resolve(existing);
7
+ await lazyLoad(signal, url);
8
+ const toolbarModule = getWindow().LaunchDarklyToolbar;
9
+ if (!toolbarModule) throw new Error(`Unable to detect LaunchDarklyToolbar global from ${url}`);
10
+ return toolbarModule;
11
+ }
12
+ async function lazyLoad(signal, url) {
13
+ const existingScript = document.querySelector(`script[src="${url}"]`);
14
+ if (existingScript) {
15
+ if ('true' === existingScript.dataset.loaded) return Promise.resolve();
16
+ return new Promise((resolve, reject)=>{
17
+ existingScript.addEventListener('load', ()=>{
18
+ if (!signal.aborted) {
19
+ existingScript.dataset.loaded = 'true';
20
+ resolve();
21
+ }
22
+ });
23
+ existingScript.addEventListener('error', (error)=>{
24
+ if (!signal.aborted) reject(error);
25
+ });
26
+ });
27
+ }
28
+ const script = document.createElement("script");
29
+ script.src = url;
30
+ script.crossOrigin = 'anonymous';
31
+ script.referrerPolicy = 'origin';
32
+ const waitForLoad = new Promise((resolve, reject)=>{
33
+ script.addEventListener('load', ()=>{
34
+ if (!signal.aborted) {
35
+ script.dataset.loaded = 'true';
36
+ resolve();
37
+ }
38
+ });
39
+ script.addEventListener('error', (error)=>{
40
+ if (!signal.aborted) reject(error);
41
+ });
42
+ });
43
+ document.body.appendChild(script);
44
+ try {
45
+ await waitForLoad;
46
+ } catch (error) {
47
+ console.log(error);
48
+ throw new Error(`Could not load LaunchDarkly developer toolbar bundle from ${url}`);
49
+ }
50
+ }
51
+ var package_namespaceObject = {
52
+ rE: "2.2.0"
53
+ };
54
+ export { lazyLoadToolbar, package_namespaceObject };
55
+
56
+ //# sourceMappingURL=816.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/816.js","sources":["../../src/core/lazyLoadToolbar.ts"],"sourcesContent":["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"],"names":["getWindow","window","lazyLoadToolbar","signal","url","existing","Promise","lazyLoad","toolbarModule","Error","existingScript","document","resolve","reject","error","script","waitForLoad","console"],"mappings":"AAMA,SAASA;IACP,OAAOC;AACT;AAEe,eAAeC,gBAAgBC,MAAmB,EAAEC,GAAW;IAC5E,MAAMC,WAAWL,YAAY,mBAAmB;IAEhD,IAAIK,UACF,OAAOC,QAAQ,OAAO,CAACD;IAGzB,MAAME,SAASJ,QAAQC;IAEvB,MAAMI,gBAAgBR,YAAY,mBAAmB;IACrD,IAAI,CAACQ,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,CAACI;gBACxC,IAAI,CAACX,OAAO,OAAO,EACjBU,OAAOC;YAEX;QACF;IACF;IAGA,MAAMC,SAASJ,SAAS,aAAa,CAAC;IACtCI,OAAO,GAAG,GAAGX;IACbW,OAAO,WAAW,GAAG;IACrBA,OAAO,cAAc,GAAG;IAExB,MAAMC,cAAc,IAAIV,QAAc,CAACM,SAASC;QAC9CE,OAAO,gBAAgB,CAAC,QAAQ;YAC9B,IAAI,CAACZ,OAAO,OAAO,EAAE;gBACnBY,OAAO,OAAO,CAAC,MAAM,GAAG;gBACxBH;YACF;QACF;QACAG,OAAO,gBAAgB,CAAC,SAAS,CAACD;YAChC,IAAI,CAACX,OAAO,OAAO,EACjBU,OAAOC;QAEX;IACF;IAEAH,SAAS,IAAI,CAAC,WAAW,CAACI;IAE1B,IAAI;QACF,MAAMC;IACR,EAAE,OAAOF,OAAO;QACdG,QAAQ,GAAG,CAACH;QACZ,MAAM,IAAIL,MAAM,CAAC,0DAA0D,EAAEL,KAAK;IACpF;AACF"}
package/dist/js/96.js ADDED
@@ -0,0 +1,38 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { package_namespaceObject, lazyLoadToolbar } from "./816.js";
3
+ function useLaunchDarklyToolbar(args) {
4
+ const { toolbarBundleUrl, enabled, ...initConfig } = args;
5
+ const configRef = useRef(null);
6
+ const url = toolbarBundleUrl ?? versionToCdn(package_namespaceObject.rE);
7
+ useEffect(()=>{
8
+ if (false === enabled) return;
9
+ if (null === configRef.current) configRef.current = initConfig;
10
+ }, [
11
+ enabled,
12
+ initConfig
13
+ ]);
14
+ useEffect(()=>{
15
+ if (false === enabled || null === configRef.current) return;
16
+ const controller = new AbortController();
17
+ let cleanup = ()=>{};
18
+ lazyLoadToolbar(controller.signal, url).then((importedToolbar)=>{
19
+ if (null === configRef.current) return;
20
+ cleanup = importedToolbar.init(configRef.current);
21
+ }).catch((error)=>{
22
+ console.error('[LaunchDarkly Toolbar] Failed to initialize:', error);
23
+ });
24
+ return ()=>{
25
+ controller.abort();
26
+ cleanup();
27
+ };
28
+ }, [
29
+ enabled,
30
+ url
31
+ ]);
32
+ }
33
+ function versionToCdn(version = 'latest') {
34
+ return `https://unpkg.com/@launchdarkly/toolbar@${version}/cdn/toolbar.min.js`;
35
+ }
36
+ export { useLaunchDarklyToolbar };
37
+
38
+ //# sourceMappingURL=96.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/96.js","sources":["../../src/react/useLaunchDarklyToolbar.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport lazyLoadToolbar from '../core/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:5764/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)\n .then((importedToolbar) => {\n if (configRef.current === null) {\n return;\n }\n\n cleanup = importedToolbar.init(configRef.current);\n })\n .catch((error) => {\n console.error('[LaunchDarkly Toolbar] Failed to initialize:', error);\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":["useLaunchDarklyToolbar","args","toolbarBundleUrl","enabled","initConfig","configRef","useRef","url","versionToCdn","packageJson","useEffect","controller","AbortController","cleanup","lazyLoadToolbar","importedToolbar","error","console","version"],"mappings":";;AAyBe,SAASA,uBAAuBC,IAAkC;IAC/E,MAAM,EAAEC,gBAAgB,EAAEC,OAAO,EAAE,GAAGC,YAAY,GAAGH;IACrD,MAAMI,YAAYC,OAAoC;IACtD,MAAMC,MAAML,oBAAoBM,aAAaC,wBAAAA,EAAmB;IAEhEC,UAAU;QACR,IAAIP,AAAY,UAAZA,SACF;QAGF,IAAIE,AAAsB,SAAtBA,UAAU,OAAO,EACnBA,UAAU,OAAO,GAAGD;IAExB,GAAG;QAACD;QAASC;KAAW;IAExBM,UAAU;QACR,IAAIP,AAAY,UAAZA,WAAqBE,AAAsB,SAAtBA,UAAU,OAAO,EACxC;QAGF,MAAMM,aAAa,IAAIC;QAEvB,IAAIC,UAAsB,KAAO;QACjCC,gBAAgBH,WAAW,MAAM,EAAEJ,KAChC,IAAI,CAAC,CAACQ;YACL,IAAIV,AAAsB,SAAtBA,UAAU,OAAO,EACnB;YAGFQ,UAAUE,gBAAgB,IAAI,CAACV,UAAU,OAAO;QAClD,GACC,KAAK,CAAC,CAACW;YACNC,QAAQ,KAAK,CAAC,gDAAgDD;QAChE;QAEF,OAAO;YACLL,WAAW,KAAK;YAChBE;QACF;IACF,GAAG;QAACV;QAASI;KAAI;AACnB;AAEA,SAASC,aAAaU,UAAU,QAAQ;IACtC,OAAO,CAAC,wCAAwC,EAAEA,QAAQ,mBAAmB,CAAC;AAChF"}
@@ -0,0 +1,353 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { package_namespaceObject, lazyLoadToolbar } from "./816.js";
3
+ function applyDecs2203RFactory() {
4
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
5
+ return function(initializer) {
6
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
7
+ assertCallable(initializer, "An initializer");
8
+ initializers.push(initializer);
9
+ };
10
+ }
11
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
12
+ var kindStr;
13
+ switch(kind){
14
+ case 1:
15
+ kindStr = "accessor";
16
+ break;
17
+ case 2:
18
+ kindStr = "method";
19
+ break;
20
+ case 3:
21
+ kindStr = "getter";
22
+ break;
23
+ case 4:
24
+ kindStr = "setter";
25
+ break;
26
+ default:
27
+ kindStr = "field";
28
+ }
29
+ var ctx = {
30
+ kind: kindStr,
31
+ name: isPrivate ? "#" + name : name,
32
+ static: isStatic,
33
+ private: isPrivate,
34
+ metadata: metadata
35
+ };
36
+ var decoratorFinishedRef = {
37
+ v: false
38
+ };
39
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
40
+ var get, set;
41
+ if (0 === kind) if (isPrivate) {
42
+ get = desc.get;
43
+ set = desc.set;
44
+ } else {
45
+ get = function() {
46
+ return this[name];
47
+ };
48
+ set = function(v) {
49
+ this[name] = v;
50
+ };
51
+ }
52
+ else if (2 === kind) get = function() {
53
+ return desc.value;
54
+ };
55
+ else {
56
+ if (1 === kind || 3 === kind) get = function() {
57
+ return desc.get.call(this);
58
+ };
59
+ if (1 === kind || 4 === kind) set = function(v) {
60
+ desc.set.call(this, v);
61
+ };
62
+ }
63
+ ctx.access = get && set ? {
64
+ get: get,
65
+ set: set
66
+ } : get ? {
67
+ get: get
68
+ } : {
69
+ set: set
70
+ };
71
+ try {
72
+ return dec(value, ctx);
73
+ } finally{
74
+ decoratorFinishedRef.v = true;
75
+ }
76
+ }
77
+ function assertNotFinished(decoratorFinishedRef, fnName) {
78
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
79
+ }
80
+ function assertCallable(fn, hint) {
81
+ if ("function" != typeof fn) throw new TypeError(hint + " must be a function");
82
+ }
83
+ function assertValidReturnValue(kind, value) {
84
+ var type = typeof value;
85
+ if (1 === kind) {
86
+ if ("object" !== type || null === value) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
87
+ if (void 0 !== value.get) assertCallable(value.get, "accessor.get");
88
+ if (void 0 !== value.set) assertCallable(value.set, "accessor.set");
89
+ if (void 0 !== value.init) assertCallable(value.init, "accessor.init");
90
+ } else if ("function" !== type) {
91
+ var hint;
92
+ hint = 0 === kind ? "field" : 10 === kind ? "class" : "method";
93
+ throw new TypeError(hint + " decorators must return a function or void 0");
94
+ }
95
+ }
96
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
97
+ var decs = decInfo[0];
98
+ var desc, init, value;
99
+ if (isPrivate) desc = 0 === kind || 1 === kind ? {
100
+ get: decInfo[3],
101
+ set: decInfo[4]
102
+ } : 3 === kind ? {
103
+ get: decInfo[3]
104
+ } : 4 === kind ? {
105
+ set: decInfo[3]
106
+ } : {
107
+ value: decInfo[3]
108
+ };
109
+ else if (0 !== kind) desc = Object.getOwnPropertyDescriptor(base, name);
110
+ if (1 === kind) value = {
111
+ get: desc.get,
112
+ set: desc.set
113
+ };
114
+ else if (2 === kind) value = desc.value;
115
+ else if (3 === kind) value = desc.get;
116
+ else if (4 === kind) value = desc.set;
117
+ var newValue, get, set;
118
+ if ("function" == typeof decs) {
119
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
120
+ if (void 0 !== newValue) {
121
+ assertValidReturnValue(kind, newValue);
122
+ if (0 === kind) init = newValue;
123
+ else if (1 === kind) {
124
+ init = newValue.init;
125
+ get = newValue.get || value.get;
126
+ set = newValue.set || value.set;
127
+ value = {
128
+ get: get,
129
+ set: set
130
+ };
131
+ } else value = newValue;
132
+ }
133
+ } else for(var i = decs.length - 1; i >= 0; i--){
134
+ var dec = decs[i];
135
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
136
+ if (void 0 !== newValue) {
137
+ assertValidReturnValue(kind, newValue);
138
+ var newInit;
139
+ if (0 === kind) newInit = newValue;
140
+ else if (1 === kind) {
141
+ newInit = newValue.init;
142
+ get = newValue.get || value.get;
143
+ set = newValue.set || value.set;
144
+ value = {
145
+ get: get,
146
+ set: set
147
+ };
148
+ } else value = newValue;
149
+ if (void 0 !== newInit) if (void 0 === init) init = newInit;
150
+ else if ("function" == typeof init) init = [
151
+ init,
152
+ newInit
153
+ ];
154
+ else init.push(newInit);
155
+ }
156
+ }
157
+ if (0 === kind || 1 === kind) {
158
+ if (void 0 === init) init = function(instance, init) {
159
+ return init;
160
+ };
161
+ else if ("function" != typeof init) {
162
+ var ownInitializers = init;
163
+ init = function(instance, init) {
164
+ var value = init;
165
+ for(var i = 0; i < ownInitializers.length; i++)value = ownInitializers[i].call(instance, value);
166
+ return value;
167
+ };
168
+ } else {
169
+ var originalInitializer = init;
170
+ init = function(instance, init) {
171
+ return originalInitializer.call(instance, init);
172
+ };
173
+ }
174
+ ret.push(init);
175
+ }
176
+ if (0 !== kind) {
177
+ if (1 === kind) {
178
+ desc.get = value.get;
179
+ desc.set = value.set;
180
+ } else if (2 === kind) desc.value = value;
181
+ else if (3 === kind) desc.get = value;
182
+ else if (4 === kind) desc.set = value;
183
+ if (isPrivate) if (1 === kind) {
184
+ ret.push(function(instance, args) {
185
+ return value.get.call(instance, args);
186
+ });
187
+ ret.push(function(instance, args) {
188
+ return value.set.call(instance, args);
189
+ });
190
+ } else if (2 === kind) ret.push(value);
191
+ else ret.push(function(instance, args) {
192
+ return value.call(instance, args);
193
+ });
194
+ else Object.defineProperty(base, name, desc);
195
+ }
196
+ }
197
+ function applyMemberDecs(Class, decInfos, metadata) {
198
+ var ret = [];
199
+ var protoInitializers;
200
+ var staticInitializers;
201
+ var existingProtoNonFields = new Map();
202
+ var existingStaticNonFields = new Map();
203
+ for(var i = 0; i < decInfos.length; i++){
204
+ var decInfo = decInfos[i];
205
+ if (Array.isArray(decInfo)) {
206
+ var kind = decInfo[1];
207
+ var name = decInfo[2];
208
+ var isPrivate = decInfo.length > 3;
209
+ var isStatic = kind >= 5;
210
+ var base;
211
+ var initializers;
212
+ if (isStatic) {
213
+ base = Class;
214
+ kind -= 5;
215
+ staticInitializers = staticInitializers || [];
216
+ initializers = staticInitializers;
217
+ } else {
218
+ base = Class.prototype;
219
+ protoInitializers = protoInitializers || [];
220
+ initializers = protoInitializers;
221
+ }
222
+ if (0 !== kind && !isPrivate) {
223
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
224
+ var existingKind = existingNonFields.get(name) || 0;
225
+ if (true === existingKind || 3 === existingKind && 4 !== kind || 4 === existingKind && 3 !== kind) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
226
+ if (!existingKind && kind > 2) existingNonFields.set(name, kind);
227
+ else existingNonFields.set(name, true);
228
+ }
229
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
230
+ }
231
+ }
232
+ pushInitializers(ret, protoInitializers);
233
+ pushInitializers(ret, staticInitializers);
234
+ return ret;
235
+ }
236
+ function pushInitializers(ret, initializers) {
237
+ if (initializers) ret.push(function(instance) {
238
+ for(var i = 0; i < initializers.length; i++)initializers[i].call(instance);
239
+ return instance;
240
+ });
241
+ }
242
+ function applyClassDecs(targetClass, classDecs, metadata) {
243
+ if (classDecs.length > 0) {
244
+ var initializers = [];
245
+ var newClass = targetClass;
246
+ var name = targetClass.name;
247
+ for(var i = classDecs.length - 1; i >= 0; i--){
248
+ var decoratorFinishedRef = {
249
+ v: false
250
+ };
251
+ try {
252
+ var nextNewClass = classDecs[i](newClass, {
253
+ kind: "class",
254
+ name: name,
255
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
256
+ metadata
257
+ });
258
+ } finally{
259
+ decoratorFinishedRef.v = true;
260
+ }
261
+ if (void 0 !== nextNewClass) {
262
+ assertValidReturnValue(10, nextNewClass);
263
+ newClass = nextNewClass;
264
+ }
265
+ }
266
+ return [
267
+ defineMetadata(newClass, metadata),
268
+ function() {
269
+ for(var i = 0; i < initializers.length; i++)initializers[i].call(newClass);
270
+ }
271
+ ];
272
+ }
273
+ }
274
+ function defineMetadata(Class, metadata) {
275
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
276
+ configurable: true,
277
+ enumerable: true,
278
+ value: metadata
279
+ });
280
+ }
281
+ return function(targetClass, memberDecs, classDecs, parentClass) {
282
+ if (void 0 !== parentClass) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
283
+ var metadata = Object.create(void 0 === parentMetadata ? null : parentMetadata);
284
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
285
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
286
+ return {
287
+ e: e,
288
+ get c () {
289
+ return applyClassDecs(targetClass, classDecs, metadata);
290
+ }
291
+ };
292
+ };
293
+ }
294
+ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
295
+ return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
296
+ }
297
+ var _dec, _initClass;
298
+ let _LaunchDarklyToolbarService;
299
+ _dec = Injectable({
300
+ providedIn: 'root'
301
+ });
302
+ class LaunchDarklyToolbarService {
303
+ static{
304
+ ({ c: [_LaunchDarklyToolbarService, _initClass] } = _apply_decs_2203_r(this, [], [
305
+ _dec
306
+ ]));
307
+ }
308
+ cleanup;
309
+ abortController;
310
+ initialized = false;
311
+ async initialize(config) {
312
+ if (this.initialized) return void console.warn('[LaunchDarkly Toolbar] Already initialized. Call destroy() first to reinitialize.');
313
+ const { toolbarBundleUrl, enabled, ...initConfig } = config;
314
+ if (false === enabled) return;
315
+ this.initialized = true;
316
+ this.abortController = new AbortController();
317
+ const url = toolbarBundleUrl ?? this.versionToCdn(package_namespaceObject.rE);
318
+ try {
319
+ const toolbar = await lazyLoadToolbar(this.abortController.signal, url);
320
+ this.cleanup = toolbar.init(initConfig);
321
+ } catch (err) {
322
+ console.error('[LaunchDarkly Toolbar] Failed to initialize:', err);
323
+ this.initialized = false;
324
+ throw err;
325
+ }
326
+ }
327
+ ngOnDestroy() {
328
+ this.destroy();
329
+ }
330
+ destroy() {
331
+ if (this.abortController) {
332
+ this.abortController.abort();
333
+ this.abortController = void 0;
334
+ }
335
+ if (this.cleanup) {
336
+ this.cleanup();
337
+ this.cleanup = void 0;
338
+ }
339
+ this.initialized = false;
340
+ }
341
+ isInitialized() {
342
+ return this.initialized;
343
+ }
344
+ versionToCdn(version = 'latest') {
345
+ return `https://unpkg.com/@launchdarkly/toolbar@${version}/cdn/toolbar.min.js`;
346
+ }
347
+ static{
348
+ _initClass();
349
+ }
350
+ }
351
+ export { _LaunchDarklyToolbarService as LaunchDarklyToolbarService };
352
+
353
+ //# sourceMappingURL=angular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/angular.js","sources":["../../src/angular/launchdarkly-toolbar.service.ts"],"sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\n\nimport lazyLoadToolbar from '../core/lazyLoadToolbar';\nimport type { InitializationConfig } from '../types';\nimport packageJson from '../../package.json';\n\n/**\n * Configuration options for the LaunchDarkly Toolbar service.\n * Extends the base InitializationConfig with Angular-specific options.\n */\nexport interface LaunchDarklyToolbarConfig 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:5764/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\n/**\n * Injectable service for managing the LaunchDarkly Developer Toolbar in Angular applications.\n *\n * This service handles the lifecycle of the toolbar, including initialization,\n * lazy loading, and cleanup. It can be injected into any Angular component or service.\n *\n * @example\n * ```typescript\n * import { Component, OnInit } from '@angular/core';\n * import { LaunchDarklyToolbarService } from '@launchdarkly/toolbar/angular';\n * import { FlagOverridePlugin, EventInterceptionPlugin } from '@launchdarkly/toolbar/plugins';\n *\n * @Component({\n * selector: 'app-root',\n * standalone: true,\n * providers: [LaunchDarklyToolbarService],\n * template: '<router-outlet />'\n * })\n * export class AppComponent implements OnInit {\n * private flagOverridePlugin = new FlagOverridePlugin();\n * private eventInterceptionPlugin = new EventInterceptionPlugin();\n *\n * constructor(private toolbarService: LaunchDarklyToolbarService) {}\n *\n * ngOnInit() {\n * this.toolbarService.initialize({\n * flagOverridePlugin: this.flagOverridePlugin,\n * eventInterceptionPlugin: this.eventInterceptionPlugin,\n * enabled: true,\n * position: 'bottom-right'\n * });\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root', // Singleton service across the application\n})\nexport default class LaunchDarklyToolbarService implements OnDestroy {\n private cleanup?: () => void;\n private abortController?: AbortController;\n private initialized = false;\n\n /**\n * Initializes the LaunchDarkly Toolbar with the provided configuration.\n *\n * This method lazy-loads the toolbar bundle from either a custom URL or the CDN,\n * then initializes it with the provided configuration.\n *\n * @param config - Configuration options for the toolbar\n * @returns Promise that resolves when initialization is complete\n *\n * @throws {Error} If initialization fails or toolbar bundle cannot be loaded\n */\n async initialize(config: LaunchDarklyToolbarConfig): Promise<void> {\n if (this.initialized) {\n console.warn('[LaunchDarkly Toolbar] Already initialized. Call destroy() first to reinitialize.');\n return;\n }\n\n const { toolbarBundleUrl, enabled, ...initConfig } = config;\n\n if (enabled === false) {\n return;\n }\n\n this.initialized = true;\n this.abortController = new AbortController();\n const url = toolbarBundleUrl ?? this.versionToCdn(packageJson.version);\n\n try {\n const toolbar = await lazyLoadToolbar(this.abortController.signal, url);\n this.cleanup = toolbar.init(initConfig);\n } catch (err) {\n console.error('[LaunchDarkly Toolbar] Failed to initialize:', err);\n this.initialized = false;\n throw err;\n }\n }\n\n /**\n * Angular lifecycle hook called when the service is destroyed.\n * Automatically cleans up the toolbar.\n */\n ngOnDestroy(): void {\n this.destroy();\n }\n\n /**\n * Manually destroys the toolbar and cleans up resources.\n *\n * This method:\n * - Aborts any pending lazy-load requests\n * - Calls the toolbar's cleanup function\n * - Resets the initialized state\n *\n * After calling destroy(), you can call initialize() again to reinitialize.\n */\n destroy(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = undefined;\n }\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n this.initialized = false;\n }\n\n /**\n * Checks if the toolbar has been initialized.\n *\n * @returns true if the toolbar is currently initialized, false otherwise\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Generates the CDN URL for a specific toolbar version.\n *\n * @param version - Toolbar version (defaults to 'latest')\n * @returns CDN URL for the toolbar bundle\n */\n private versionToCdn(version = 'latest'): string {\n return `https://unpkg.com/@launchdarkly/toolbar@${version}/cdn/toolbar.min.js`;\n }\n}\n"],"names":["Injectable","_LaunchDarklyToolbarService","config","console","toolbarBundleUrl","enabled","initConfig","AbortController","url","packageJson","toolbar","lazyLoadToolbar","err","undefined","version"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgECA,WAAW;IACV,YAAY;AACd;AACe,MAAMC;;;;;;IACX,QAAqB;IACrB,gBAAkC;IAClC,cAAc,MAAM;IAa5B,MAAM,WAAWC,MAAiC,EAAiB;QACjE,IAAI,IAAI,CAAC,WAAW,EAAE,YACpBC,QAAQ,IAAI,CAAC;QAIf,MAAM,EAAEC,gBAAgB,EAAEC,OAAO,EAAE,GAAGC,YAAY,GAAGJ;QAErD,IAAIG,AAAY,UAAZA,SACF;QAGF,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,eAAe,GAAG,IAAIE;QAC3B,MAAMC,MAAMJ,oBAAoB,IAAI,CAAC,YAAY,CAACK,wBAAAA,EAAmB;QAErE,IAAI;YACF,MAAMC,UAAU,MAAMC,gBAAgB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAEH;YACnE,IAAI,CAAC,OAAO,GAAGE,QAAQ,IAAI,CAACJ;QAC9B,EAAE,OAAOM,KAAK;YACZT,QAAQ,KAAK,CAAC,gDAAgDS;YAC9D,IAAI,CAAC,WAAW,GAAG;YACnB,MAAMA;QACR;IACF;IAMA,cAAoB;QAClB,IAAI,CAAC,OAAO;IACd;IAYA,UAAgB;QACd,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,eAAe,CAAC,KAAK;YAC1B,IAAI,CAAC,eAAe,GAAGC;QACzB;QACA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,GAAGA;QACjB;QACA,IAAI,CAAC,WAAW,GAAG;IACrB;IAOA,gBAAyB;QACvB,OAAO,IAAI,CAAC,WAAW;IACzB;IAQQ,aAAaC,UAAU,QAAQ,EAAU;QAC/C,OAAO,CAAC,wCAAwC,EAAEA,QAAQ,mBAAmB,CAAC;IAChF;;;;AACF"}