@launchdarkly/toolbar 1.6.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cdn/toolbar.min.js +6 -6
- package/dist/core/services/DevServerClient.d.ts +1 -4
- package/dist/core/services/FlagStateManager.d.ts +3 -0
- package/dist/core/ui/Toolbar/Header/Header.css.d.ts +2 -0
- package/dist/core/ui/Toolbar/Header/Header.d.ts +0 -1
- package/dist/core/ui/Toolbar/LaunchDarklyToolbar.d.ts +1 -0
- package/dist/core/ui/Toolbar/TabContent/SettingsTabContent.d.ts +0 -2
- package/dist/core/ui/Toolbar/components/ExpandedToolbarContent.d.ts +0 -2
- package/dist/core/ui/Toolbar/components/LoginScreen.css.d.ts +14 -0
- package/dist/core/ui/Toolbar/components/LoginScreen.d.ts +10 -0
- package/dist/core/ui/Toolbar/components/TabContentRenderer.d.ts +0 -2
- package/dist/core/ui/Toolbar/components/icons/LaunchDarklyIcon.d.ts +2 -1
- package/dist/core/ui/Toolbar/components/index.d.ts +1 -0
- package/dist/core/ui/Toolbar/context/ActiveTabProvider.d.ts +10 -0
- package/dist/core/ui/Toolbar/context/ApiProvider.d.ts +5 -1
- package/dist/core/ui/Toolbar/context/AuthProvider.d.ts +1 -0
- package/dist/core/ui/Toolbar/context/DevServerProvider.d.ts +1 -5
- package/dist/core/ui/Toolbar/context/FlagsProvider.d.ts +12 -0
- package/dist/core/ui/Toolbar/context/IFrameProvider.d.ts +13 -11
- package/dist/core/ui/Toolbar/context/ProjectProvider.d.ts +16 -0
- package/dist/core/ui/Toolbar/context/index.d.ts +1 -0
- package/dist/core/ui/Toolbar/hooks/useToolbarState.d.ts +0 -4
- package/dist/core/ui/Toolbar/types/ldApi.d.ts +40 -0
- package/dist/core/ui/Toolbar/utils/localStorage.d.ts +0 -4
- package/dist/core/utils/analytics.d.ts +20 -0
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/js/index.js +1 -3
- package/dist/js/index.js.map +1 -1
- package/dist/types/config.d.ts +11 -1
- package/package.json +1 -1
|
@@ -21,14 +21,11 @@ export interface Override {
|
|
|
21
21
|
export declare class DevServerClient {
|
|
22
22
|
private baseUrl;
|
|
23
23
|
private projectKey;
|
|
24
|
-
constructor(baseUrl: string, projectKey
|
|
25
|
-
setProjectKey(projectKey: string): void;
|
|
26
|
-
getProjectKey(): string | null;
|
|
24
|
+
constructor(baseUrl: string, projectKey: string);
|
|
27
25
|
getProjectData(): Promise<DevServerProjectResponse>;
|
|
28
26
|
setOverride(flagKey: string, value: any): Promise<{
|
|
29
27
|
override: boolean;
|
|
30
28
|
value: any;
|
|
31
29
|
}>;
|
|
32
30
|
clearOverride(flagKey: string): Promise<void>;
|
|
33
|
-
getAvailableProjects(): Promise<string[]>;
|
|
34
31
|
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { DevServerClient } from './DevServerClient';
|
|
2
2
|
import { EnhancedFlag } from '../types/devServer';
|
|
3
|
+
import { ApiFlag } from '../ui/Toolbar/types/ldApi';
|
|
3
4
|
export declare class FlagStateManager {
|
|
4
5
|
private devServerClient;
|
|
5
6
|
private listeners;
|
|
7
|
+
private apiFlags;
|
|
6
8
|
constructor(devServerClient: DevServerClient);
|
|
7
9
|
getEnhancedFlags(): Promise<Record<string, EnhancedFlag>>;
|
|
8
10
|
private formatFlagName;
|
|
9
11
|
private determineFlagType;
|
|
10
12
|
setOverride(flagKey: string, value: any): Promise<void>;
|
|
11
13
|
clearOverride(flagKey: string): Promise<void>;
|
|
14
|
+
setApiFlags(apiFlags: ApiFlag[]): void;
|
|
12
15
|
subscribe(listener: (flags: Record<string, EnhancedFlag>) => void): () => void;
|
|
13
16
|
private notifyListeners;
|
|
14
17
|
destroy(): void;
|
|
@@ -16,3 +16,5 @@ export declare const searchFieldWrapperSvg: string;
|
|
|
16
16
|
export declare const searchWrapper: string;
|
|
17
17
|
export declare const environmentWrapper: string;
|
|
18
18
|
export declare const icon: string;
|
|
19
|
+
export declare const environmentLabelWrapper: string;
|
|
20
|
+
export declare const environmentTooltip: string;
|
|
@@ -18,5 +18,6 @@ export interface LaunchDarklyToolbarProps {
|
|
|
18
18
|
pollIntervalInMs?: number;
|
|
19
19
|
position?: ToolbarPosition;
|
|
20
20
|
domId: string;
|
|
21
|
+
clientSideId?: string;
|
|
21
22
|
}
|
|
22
23
|
export declare function LaunchDarklyToolbar(props: LaunchDarklyToolbarProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -5,8 +5,6 @@ interface SettingsTabContentProps {
|
|
|
5
5
|
onToggleReloadOnFlagChange: () => void;
|
|
6
6
|
isAutoCollapseEnabled: boolean;
|
|
7
7
|
onToggleAutoCollapse: () => void;
|
|
8
|
-
optInToNewFeatures: boolean;
|
|
9
|
-
onToggleOptInToNewFeatures: () => void;
|
|
10
8
|
}
|
|
11
9
|
export declare function SettingsTabContent(props: SettingsTabContentProps): import("react/jsx-runtime").JSX.Element;
|
|
12
10
|
export {};
|
|
@@ -20,8 +20,6 @@ interface ExpandedToolbarContentProps {
|
|
|
20
20
|
onHeaderMouseDown?: (event: React.MouseEvent) => void;
|
|
21
21
|
reloadOnFlagChangeIsEnabled: boolean;
|
|
22
22
|
onToggleReloadOnFlagChange: () => void;
|
|
23
|
-
optInToNewFeatures: boolean;
|
|
24
|
-
onToggleOptInToNewFeatures: () => void;
|
|
25
23
|
}
|
|
26
24
|
export declare const ExpandedToolbarContent: React.ForwardRefExoticComponent<ExpandedToolbarContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
27
25
|
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const loginContainer: string;
|
|
2
|
+
export declare const loginHeader: string;
|
|
3
|
+
export declare const headerLogo: string;
|
|
4
|
+
export declare const loginMainContent: string;
|
|
5
|
+
export declare const closeButtonArea: string;
|
|
6
|
+
export declare const actionButton: string;
|
|
7
|
+
export declare const loginContent: string;
|
|
8
|
+
export declare const title: string;
|
|
9
|
+
export declare const description: string;
|
|
10
|
+
export declare const errorMessage: string;
|
|
11
|
+
export declare const loginButton: string;
|
|
12
|
+
export declare const spinner: string;
|
|
13
|
+
export declare const helpText: string;
|
|
14
|
+
export declare const helpLink: string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface LoginScreenProps {
|
|
2
|
+
onClose: () => void;
|
|
3
|
+
onLogin: () => void;
|
|
4
|
+
onMouseDown?: (event: React.MouseEvent) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Login screen component that prompts users to authenticate with LaunchDarkly
|
|
8
|
+
*/
|
|
9
|
+
export declare function LoginScreen(props: LoginScreenProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -11,8 +11,6 @@ interface TabContentRendererProps {
|
|
|
11
11
|
onToggleReloadOnFlagChange: () => void;
|
|
12
12
|
isAutoCollapseEnabled: boolean;
|
|
13
13
|
onToggleAutoCollapse: () => void;
|
|
14
|
-
optInToNewFeatures: boolean;
|
|
15
|
-
onToggleOptInToNewFeatures: () => void;
|
|
16
14
|
}
|
|
17
15
|
export declare function TabContentRenderer(props: TabContentRendererProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
16
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
interface LaunchDarklyIconProps {
|
|
2
2
|
className?: string;
|
|
3
|
+
onMouseDown?: (event: React.MouseEvent) => void;
|
|
3
4
|
}
|
|
4
|
-
export declare function LaunchDarklyIcon({ className }: LaunchDarklyIconProps): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function LaunchDarklyIcon({ className, onMouseDown }: LaunchDarklyIconProps): import("react/jsx-runtime").JSX.Element;
|
|
5
6
|
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { ActionButtonsContainer } from './ActionButtonsContainer';
|
|
2
|
+
export { LoginScreen } from './LoginScreen';
|
|
2
3
|
export { CircleLogo } from './CircleLogo';
|
|
3
4
|
export { ConnectionStatus } from './ConnectionStatus';
|
|
4
5
|
export { DoNotTrackWarning } from './DoNotTrackWarning';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ActiveTabId } from '../types/toolbar';
|
|
2
|
+
type ActiveTabContextType = {
|
|
3
|
+
activeTab: ActiveTabId;
|
|
4
|
+
setActiveTab: (tab: ActiveTabId) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function ActiveTabProvider({ children }: {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function useActiveTabContext(): ActiveTabContextType;
|
|
10
|
+
export {};
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { FlagsPaginationParams, FlagsResponse, ApiFlag, ProjectsResponse } from '../types/ldApi';
|
|
1
2
|
interface ApiProviderContextValue {
|
|
2
|
-
|
|
3
|
+
apiReady: boolean;
|
|
4
|
+
getFlag: (flagKey: string) => Promise<ApiFlag>;
|
|
5
|
+
getProjects: () => Promise<ProjectsResponse>;
|
|
6
|
+
getFlags: (projectKey: string, params?: FlagsPaginationParams) => Promise<FlagsResponse>;
|
|
3
7
|
}
|
|
4
8
|
export interface ApiProviderProps {
|
|
5
9
|
children: React.ReactNode;
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import type { FC, ReactNode } from 'react';
|
|
2
2
|
import { LdToolbarConfig, ToolbarState } from '../../../types/devServer';
|
|
3
3
|
interface DevServerContextValue {
|
|
4
|
-
state: ToolbarState
|
|
5
|
-
availableProjects: string[];
|
|
6
|
-
currentProjectKey: string | null;
|
|
7
|
-
};
|
|
4
|
+
state: ToolbarState;
|
|
8
5
|
setOverride: (flagKey: string, value: any) => Promise<void>;
|
|
9
6
|
clearOverride: (flagKey: string) => Promise<void>;
|
|
10
7
|
clearAllOverrides: () => Promise<void>;
|
|
11
8
|
refresh: () => Promise<void>;
|
|
12
|
-
switchProject: (projectKey: string) => Promise<void>;
|
|
13
9
|
}
|
|
14
10
|
export declare const useDevServerContext: () => DevServerContextValue;
|
|
15
11
|
export interface DevServerProviderProps {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ApiFlag, FlagsResponse } from '../types/ldApi';
|
|
2
|
+
type FlagsContextType = {
|
|
3
|
+
flags: ApiFlag[];
|
|
4
|
+
loading: boolean;
|
|
5
|
+
getProjectFlags: (projectKey: string) => Promise<FlagsResponse>;
|
|
6
|
+
resetFlags: () => void;
|
|
7
|
+
};
|
|
8
|
+
export declare const FlagsProvider: ({ children }: {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare const useFlagsContext: () => FlagsContextType;
|
|
12
|
+
export {};
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
|
-
export declare const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
export declare const IFRAME_COMMANDS: {
|
|
3
|
+
LOGOUT: string;
|
|
4
|
+
GET_PROJECTS: string;
|
|
5
|
+
GET_FLAGS: string;
|
|
6
|
+
GET_FLAG: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const getResponseTopic: (command: string) => string;
|
|
9
|
+
export declare const getErrorTopic: (command: string) => string;
|
|
10
|
+
export declare const IFRAME_EVENTS: {
|
|
11
|
+
AUTHENTICATED: string;
|
|
12
|
+
AUTH_REQUIRED: string;
|
|
13
|
+
AUTH_ERROR: string;
|
|
14
|
+
API_READY: string;
|
|
13
15
|
};
|
|
14
16
|
interface IFrameProviderProps {
|
|
15
17
|
children: React.ReactNode;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ApiProject, ProjectsResponse } from '../types/ldApi';
|
|
2
|
+
type ProjectContextType = {
|
|
3
|
+
projectKey: string;
|
|
4
|
+
setProjectKey: (projectKey: string) => void;
|
|
5
|
+
getProjects: () => Promise<ProjectsResponse>;
|
|
6
|
+
projects: ApiProject[];
|
|
7
|
+
loading: boolean;
|
|
8
|
+
};
|
|
9
|
+
interface ProjectProviderProps {
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
clientSideId?: string;
|
|
12
|
+
providedProjectKey?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const ProjectProvider: ({ children, clientSideId, providedProjectKey }: ProjectProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function useProjectContext(): ProjectContextType;
|
|
16
|
+
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { DevServerProvider, useDevServerContext } from './DevServerProvider';
|
|
2
2
|
export { SearchProvider, useSearchContext } from './SearchProvider';
|
|
3
|
+
export { ActiveTabProvider, useActiveTabContext } from './ActiveTabProvider';
|
|
3
4
|
export { ToolbarUIProvider, useToolbarUIContext } from './ToolbarUIProvider';
|
|
4
5
|
export { FlagSdkOverrideProvider, useFlagSdkOverrideContext, type LocalFlag, type FlagSdkOverrideContextType, } from './FlagSdkOverrideProvider';
|
|
5
6
|
export { AnalyticsProvider, useAnalytics } from './AnalyticsProvider';
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { Dispatch, SetStateAction } from 'react';
|
|
2
2
|
import { ActiveTabId } from '../types';
|
|
3
3
|
export interface UseToolbarStateProps {
|
|
4
|
-
defaultActiveTab: ActiveTabId;
|
|
5
4
|
domId: string;
|
|
6
5
|
}
|
|
7
6
|
export interface UseToolbarStateReturn {
|
|
8
7
|
isExpanded: boolean;
|
|
9
|
-
activeTab: ActiveTabId;
|
|
10
8
|
previousTab: ActiveTabId;
|
|
11
9
|
isAnimating: boolean;
|
|
12
10
|
searchIsExpanded: boolean;
|
|
@@ -14,14 +12,12 @@ export interface UseToolbarStateReturn {
|
|
|
14
12
|
hasBeenExpanded: boolean;
|
|
15
13
|
reloadOnFlagChangeIsEnabled: boolean;
|
|
16
14
|
isAutoCollapseEnabled: boolean;
|
|
17
|
-
optInToNewFeatures: boolean;
|
|
18
15
|
toolbarRef: React.RefObject<HTMLDivElement | null>;
|
|
19
16
|
handleTabChange: (tabId: string) => void;
|
|
20
17
|
handleClose: () => void;
|
|
21
18
|
handleSearch: (newSearchTerm: string) => void;
|
|
22
19
|
handleToggleReloadOnFlagChange: () => void;
|
|
23
20
|
handleToggleAutoCollapse: () => void;
|
|
24
|
-
handleToggleOptInToNewFeatures: () => void;
|
|
25
21
|
handleCircleClick: () => void;
|
|
26
22
|
setIsAnimating: Dispatch<SetStateAction<boolean>>;
|
|
27
23
|
setSearchIsExpanded: Dispatch<SetStateAction<boolean>>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface ApiProject {
|
|
2
|
+
_id: string;
|
|
3
|
+
key: string;
|
|
4
|
+
name: string;
|
|
5
|
+
environments: ApiEnvironment[];
|
|
6
|
+
}
|
|
7
|
+
export interface ApiEnvironment {
|
|
8
|
+
_id: string;
|
|
9
|
+
key: string;
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ApiFlag {
|
|
13
|
+
archived: boolean;
|
|
14
|
+
clientSideAvailability: {
|
|
15
|
+
usingEnvironmentId: boolean;
|
|
16
|
+
usingMobileKey: boolean;
|
|
17
|
+
};
|
|
18
|
+
customProperties: Record<string, any>;
|
|
19
|
+
description: string;
|
|
20
|
+
key: string;
|
|
21
|
+
kind: 'boolean' | 'string' | 'number' | 'object' | 'multivariate';
|
|
22
|
+
name: string;
|
|
23
|
+
variations: ApiVariation[];
|
|
24
|
+
}
|
|
25
|
+
export interface ApiVariation {
|
|
26
|
+
_id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
value: any;
|
|
29
|
+
}
|
|
30
|
+
export interface FlagsResponse {
|
|
31
|
+
items: ApiFlag[];
|
|
32
|
+
}
|
|
33
|
+
export interface ProjectsResponse {
|
|
34
|
+
items: ApiProject[];
|
|
35
|
+
}
|
|
36
|
+
export interface FlagsPaginationParams {
|
|
37
|
+
limit?: number;
|
|
38
|
+
offset?: number;
|
|
39
|
+
query?: string;
|
|
40
|
+
}
|
|
@@ -3,14 +3,12 @@ export declare const TOOLBAR_STORAGE_KEYS: {
|
|
|
3
3
|
readonly SETTINGS: "ld-toolbar-settings";
|
|
4
4
|
readonly DISABLED: "ld-toolbar-disabled";
|
|
5
5
|
readonly PROJECT: "ld-toolbar-project";
|
|
6
|
-
readonly OPT_IN_TO_NEW_FEATURES: "ld-toolbar-opt-in-to-new-features";
|
|
7
6
|
readonly STARRED_FLAGS: "ld-toolbar-starred-flags";
|
|
8
7
|
};
|
|
9
8
|
export interface ToolbarSettings {
|
|
10
9
|
position: ToolbarPosition;
|
|
11
10
|
reloadOnFlagChange: boolean;
|
|
12
11
|
autoCollapse: boolean;
|
|
13
|
-
optInToNewFeatures: boolean;
|
|
14
12
|
}
|
|
15
13
|
export declare const DEFAULT_SETTINGS: ToolbarSettings;
|
|
16
14
|
export declare function saveToolbarPosition(position: ToolbarPosition): void;
|
|
@@ -19,7 +17,5 @@ export declare function saveToolbarAutoCollapse(autoCollapse: boolean): void;
|
|
|
19
17
|
export declare function loadToolbarAutoCollapse(): boolean;
|
|
20
18
|
export declare function saveReloadOnFlagChange(isReloadOnFlagChange: boolean): void;
|
|
21
19
|
export declare function loadReloadOnFlagChange(): boolean;
|
|
22
|
-
export declare function saveOptInToNewFeatures(optInToNewFeatures: boolean): void;
|
|
23
|
-
export declare function loadOptInToNewFeatures(): boolean;
|
|
24
20
|
export declare function loadStarredFlags(): Set<string>;
|
|
25
21
|
export declare function saveStarredFlags(starredFlags: Set<string>): void;
|
|
@@ -62,10 +62,30 @@ export declare class ToolbarAnalytics {
|
|
|
62
62
|
* Track Reload on Flag Change toggles
|
|
63
63
|
*/
|
|
64
64
|
trackReloadOnFlagChangeToggle(enabled: boolean): void;
|
|
65
|
+
/**
|
|
66
|
+
* Track successful login
|
|
67
|
+
*/
|
|
68
|
+
trackLoginSuccess(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Track when user closes the login screen without logging in
|
|
71
|
+
*/
|
|
72
|
+
trackLoginCancelled(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Track when user logs out
|
|
75
|
+
*/
|
|
76
|
+
trackLogout(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Track authentication errors
|
|
79
|
+
*/
|
|
80
|
+
trackAuthError(error: unknown): void;
|
|
65
81
|
/**
|
|
66
82
|
* Track project switching in dev server mode
|
|
67
83
|
*/
|
|
68
84
|
trackProjectSwitch(fromProject: string, toProject: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Track API errors
|
|
87
|
+
*/
|
|
88
|
+
trackApiError(error: unknown): void;
|
|
69
89
|
/**
|
|
70
90
|
* Track refresh button clicks in dev server mode
|
|
71
91
|
*/
|
package/dist/index.cjs
CHANGED
|
@@ -552,9 +552,7 @@ 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 = {
|
|
556
|
-
rE: "1.6.0"
|
|
557
|
-
};
|
|
555
|
+
var package_namespaceObject = JSON.parse('{"rE":"2.0.0-beta.1"}');
|
|
558
556
|
function useLaunchDarklyToolbar(args) {
|
|
559
557
|
const { toolbarBundleUrl, enabled, ...initConfig } = args;
|
|
560
558
|
const configRef = (0, external_react_namespaceObject.useRef)(null);
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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"}
|
package/dist/js/index.js
CHANGED
|
@@ -518,9 +518,7 @@ async function lazyLoad(signal, url) {
|
|
|
518
518
|
throw new Error(`Could not load LaunchDarkly developer toolbar bundle from ${url}`);
|
|
519
519
|
}
|
|
520
520
|
}
|
|
521
|
-
var package_namespaceObject = {
|
|
522
|
-
rE: "1.6.0"
|
|
523
|
-
};
|
|
521
|
+
var package_namespaceObject = JSON.parse('{"rE":"2.0.0-beta.1"}');
|
|
524
522
|
function useLaunchDarklyToolbar(args) {
|
|
525
523
|
const { toolbarBundleUrl, enabled, ...initConfig } = args;
|
|
526
524
|
const configRef = useRef(null);
|