@launchdarkly/toolbar 0.10.1 → 0.11.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.
Files changed (30) hide show
  1. package/README.md +48 -132
  2. package/dist/index.d.ts +3 -0
  3. package/dist/js/index.js +1730 -994
  4. package/dist/plugins/FlagOverridePlugin.d.ts +57 -0
  5. package/dist/plugins/index.d.ts +2 -0
  6. package/dist/tests/DevServerProvider.test.d.ts +1 -0
  7. package/dist/tests/ExpandedToolbarContent.test.d.ts +1 -0
  8. package/dist/tests/FlagSdkOverrideProvider.test.d.ts +1 -0
  9. package/dist/types/devServer.d.ts +2 -2
  10. package/dist/types/plugin.d.ts +31 -0
  11. package/dist/ui/Toolbar/Header/Header.d.ts +2 -0
  12. package/dist/ui/Toolbar/Header/components/ActionButtons.d.ts +1 -0
  13. package/dist/ui/Toolbar/LaunchDarklyToolbar.d.ts +8 -2
  14. package/dist/ui/Toolbar/TabContent/FlagDevServerTabContent.d.ts +1 -0
  15. package/dist/ui/Toolbar/TabContent/FlagSdkOverrideTabContent.d.ts +6 -0
  16. package/dist/ui/Toolbar/TabContent/SettingsTabContent.d.ts +6 -1
  17. package/dist/ui/Toolbar/components/ExpandedToolbarContent.d.ts +4 -1
  18. package/dist/ui/Toolbar/components/LocalFlagControls.css.d.ts +4 -0
  19. package/dist/ui/Toolbar/components/LocalFlagControls.d.ts +20 -0
  20. package/dist/ui/Toolbar/components/TabContentRenderer.d.ts +4 -1
  21. package/dist/ui/Toolbar/constants/index.d.ts +1 -1
  22. package/dist/ui/Toolbar/constants/virtualization.d.ts +4 -0
  23. package/dist/ui/Toolbar/context/{LaunchDarklyToolbarProvider.d.ts → DevServerProvider.d.ts} +6 -6
  24. package/dist/ui/Toolbar/context/FlagSdkOverrideProvider.d.ts +19 -0
  25. package/dist/ui/Toolbar/context/index.d.ts +3 -0
  26. package/dist/ui/Toolbar/types/toolbar.d.ts +7 -1
  27. package/package.json +5 -3
  28. package/dist/ui/Toolbar/TabContent/FlagTabContent.d.ts +0 -1
  29. package/dist/ui/Toolbar/constants/config.d.ts +0 -3
  30. /package/dist/ui/Toolbar/TabContent/{FlagTabContent.css.d.ts → FlagDevServerTabContent.css.d.ts} +0 -0
@@ -0,0 +1,57 @@
1
+ import type { LDClient, LDPlugin, LDDebugOverride, LDPluginMetadata } from 'launchdarkly-js-client-sdk';
2
+ /**
3
+ * Configuration options for the FlagOverridePlugin
4
+ */
5
+ export type FlagOverridePluginConfig = {
6
+ /** Namespace for localStorage keys. Defaults to 'ld-flag-override' */
7
+ storageNamespace?: string;
8
+ };
9
+ export declare class FlagOverridePlugin implements LDPlugin {
10
+ private debugOverride?;
11
+ private config;
12
+ private ldClient;
13
+ constructor(config?: FlagOverridePluginConfig);
14
+ /**
15
+ * Returns plugin metadata
16
+ */
17
+ getMetadata(): LDPluginMetadata;
18
+ /**
19
+ * Called when the plugin is registered with the LaunchDarkly client
20
+ */
21
+ register(ldClient: LDClient): void;
22
+ /**
23
+ * Called when the debug interface is available
24
+ * Loads any existing overrides from localStorage
25
+ */
26
+ registerDebug(debugOverride: LDDebugOverride): void;
27
+ private loadExistingOverrides;
28
+ /**
29
+ * Sets an override value for a feature flag and persists it to localStorage
30
+ * @param flagKey - The key of the flag to override
31
+ * @param value - The value to set for the flag
32
+ */
33
+ setOverride(flagKey: string, value: unknown): void;
34
+ /**
35
+ * Removes an override for a specific feature flag
36
+ * @param flagKey - The key of the flag to remove the override for
37
+ */
38
+ removeOverride(flagKey: string): void;
39
+ /**
40
+ * Clears all feature flag overrides from both memory and localStorage
41
+ */
42
+ clearAllOverrides(): void;
43
+ /**
44
+ * Returns all currently active feature flag overrides
45
+ * @returns Record of flag keys to their override values
46
+ */
47
+ getAllOverrides(): Record<string, unknown>;
48
+ /**
49
+ * Returns the LaunchDarkly client instance
50
+ * @returns The LaunchDarkly client
51
+ */
52
+ getClient(): LDClient | null;
53
+ private getStorage;
54
+ private persistOverride;
55
+ private removePersistedOverride;
56
+ private clearPersistedOverrides;
57
+ }
@@ -0,0 +1,2 @@
1
+ export { FlagOverridePlugin } from './FlagOverridePlugin';
2
+ export type { FlagOverridePluginConfig } from './FlagOverridePlugin';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -12,11 +12,11 @@ export interface EnhancedFlag {
12
12
  enabled: boolean;
13
13
  }
14
14
  export interface LdToolbarConfig {
15
- devServerUrl: string;
15
+ devServerUrl?: string;
16
16
  pollIntervalInMs: number;
17
17
  projectKey?: string;
18
18
  showEnvironmentInfo?: boolean;
19
- onFlagOverride?: (flagKey: string, value: any, isOverride: boolean) => void;
19
+ onDebugOverride?: (flagKey: string, value: any, isOverride: boolean) => void;
20
20
  onError?: (error: string) => void;
21
21
  }
22
22
  export interface ToolbarState {
@@ -0,0 +1,31 @@
1
+ import type { LDClient, LDDebugOverride, LDFlagSet, LDFlagValue, LDPlugin } from 'launchdarkly-js-client-sdk';
2
+ /**
3
+ * Interface for flag override plugins that can be used with the LaunchDarkly Toolbar
4
+ */
5
+ export interface IFlagOverridePlugin extends LDPlugin, LDDebugOverride {
6
+ /**
7
+ * Sets an override value for a feature flag
8
+ * @param flagKey - The key of the flag to override
9
+ * @param value - The value to set for the flag
10
+ */
11
+ setOverride(flagKey: string, value: LDFlagValue): void;
12
+ /**
13
+ * Removes an override for a specific feature flag
14
+ * @param flagKey - The key of the flag to remove the override for
15
+ */
16
+ removeOverride(flagKey: string): void;
17
+ /**
18
+ * Clears all feature flag overrides
19
+ */
20
+ clearAllOverrides(): void;
21
+ /**
22
+ * Returns all currently active feature flag overrides
23
+ * @returns Record of flag keys to their override values
24
+ */
25
+ getAllOverrides(): LDFlagSet;
26
+ /**
27
+ * Returns the LaunchDarkly client instance
28
+ * @returns The LaunchDarkly client with allFlags method
29
+ */
30
+ getClient(): LDClient | null;
31
+ }
@@ -1,4 +1,5 @@
1
1
  import { Dispatch, SetStateAction } from 'react';
2
+ import { ToolbarMode } from '../types/toolbar';
2
3
  export interface HeaderProps {
3
4
  searchTerm: string;
4
5
  onSearch: (searchTerm: string) => void;
@@ -6,5 +7,6 @@ export interface HeaderProps {
6
7
  searchIsExpanded: boolean;
7
8
  setSearchIsExpanded: Dispatch<SetStateAction<boolean>>;
8
9
  label: string;
10
+ mode: ToolbarMode;
9
11
  }
10
12
  export declare function Header(props: HeaderProps): import("react/jsx-runtime").JSX.Element;
@@ -5,6 +5,7 @@ interface ActionButtonsProps {
5
5
  onClose: () => void;
6
6
  onRefresh: () => void;
7
7
  showSearchButton: boolean;
8
+ showRefreshButton: boolean;
8
9
  }
9
10
  export declare function ActionButtons(props: ActionButtonsProps): import("react/jsx-runtime").JSX.Element;
10
11
  export {};
@@ -1,8 +1,14 @@
1
- import { ToolbarPosition } from './types/toolbar';
2
- export declare function LdToolbar(): import("react/jsx-runtime").JSX.Element;
1
+ import { ToolbarMode, ToolbarPosition } from './types/toolbar';
2
+ import type { IFlagOverridePlugin } from '../../types/plugin';
3
+ export interface LdToolbarProps {
4
+ flagOverridePlugin?: IFlagOverridePlugin;
5
+ mode: ToolbarMode;
6
+ }
7
+ export declare function LdToolbar(props: LdToolbarProps): import("react/jsx-runtime").JSX.Element;
3
8
  export interface LaunchDarklyToolbarProps {
4
9
  devServerUrl?: string;
5
10
  projectKey?: string;
11
+ flagOverridePlugin?: IFlagOverridePlugin;
6
12
  pollIntervalInMs?: number;
7
13
  position?: ToolbarPosition;
8
14
  }
@@ -0,0 +1 @@
1
+ export declare function FlagDevServerTabContent(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { IFlagOverridePlugin } from '../../../types/plugin';
2
+ interface FlagSdkOverrideTabContentProps {
3
+ flagOverridePlugin?: IFlagOverridePlugin;
4
+ }
5
+ export declare function FlagSdkOverrideTabContent(props: FlagSdkOverrideTabContentProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -1 +1,6 @@
1
- export declare function SettingsTabContent(): import("react/jsx-runtime").JSX.Element;
1
+ import { type ToolbarMode } from '../types/toolbar';
2
+ interface SettingsTabContentProps {
3
+ mode: ToolbarMode;
4
+ }
5
+ export declare function SettingsTabContent(props: SettingsTabContentProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { Dispatch, SetStateAction } from 'react';
2
- import { ActiveTabId } from '../types';
2
+ import { ActiveTabId, ToolbarMode } from '../types';
3
+ import type { IFlagOverridePlugin } from '../../../types/plugin';
3
4
  interface ExpandedToolbarContentProps {
4
5
  isExpanded: boolean;
5
6
  activeTab: ActiveTabId;
@@ -10,6 +11,8 @@ interface ExpandedToolbarContentProps {
10
11
  onClose: () => void;
11
12
  onTabChange: (tabId: string) => void;
12
13
  setSearchIsExpanded: Dispatch<SetStateAction<boolean>>;
14
+ flagOverridePlugin?: IFlagOverridePlugin;
15
+ mode: ToolbarMode;
13
16
  }
14
17
  export declare function ExpandedToolbarContent(props: ExpandedToolbarContentProps): import("react/jsx-runtime").JSX.Element;
15
18
  export {};
@@ -0,0 +1,4 @@
1
+ export declare const jsonTextarea: string;
2
+ export declare const jsonTextareaError: string;
3
+ export declare const jsonButtonGroup: string;
4
+ export declare const jsonParseError: string;
@@ -0,0 +1,20 @@
1
+ import type { LocalFlag } from '../context';
2
+ interface LocalBooleanFlagControlProps {
3
+ flag: LocalFlag;
4
+ onOverride: (value: boolean) => void;
5
+ disabled?: boolean;
6
+ }
7
+ export declare function LocalBooleanFlagControl(props: LocalBooleanFlagControlProps): import("react/jsx-runtime").JSX.Element;
8
+ interface LocalStringNumberFlagControlProps {
9
+ flag: LocalFlag;
10
+ onOverride: (value: string | number) => void;
11
+ disabled?: boolean;
12
+ }
13
+ export declare function LocalStringNumberFlagControl(props: LocalStringNumberFlagControlProps): import("react/jsx-runtime").JSX.Element;
14
+ interface LocalObjectFlagControlProps {
15
+ flag: LocalFlag;
16
+ onOverride: (value: any) => void;
17
+ disabled?: boolean;
18
+ }
19
+ export declare function LocalObjectFlagControl(props: LocalObjectFlagControlProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -1,7 +1,10 @@
1
- import { TabId } from '../types';
1
+ import { TabId, ToolbarMode } from '../types';
2
+ import type { IFlagOverridePlugin } from '../../../types/plugin';
2
3
  interface TabContentRendererProps {
3
4
  activeTab: TabId;
4
5
  slideDirection: number;
6
+ flagOverridePlugin?: IFlagOverridePlugin;
7
+ mode: ToolbarMode;
5
8
  }
6
9
  export declare function TabContentRenderer(props: TabContentRendererProps): import("react/jsx-runtime").JSX.Element | null;
7
10
  export {};
@@ -1,2 +1,2 @@
1
1
  export { EASING, ANIMATION_CONFIG, DIMENSIONS, SHADOWS } from './animations';
2
- export { TOOLBAR_CONFIG } from './config';
2
+ export { VIRTUALIZATION } from './virtualization';
@@ -0,0 +1,4 @@
1
+ export declare const VIRTUALIZATION: {
2
+ readonly ITEM_HEIGHT: 85;
3
+ readonly OVERSCAN: 5;
4
+ };
@@ -1,7 +1,7 @@
1
- import React from 'react';
1
+ import type { FC, ReactNode } from 'react';
2
2
  import { LdToolbarConfig, ToolbarState } from '../../../types/devServer';
3
3
  import { ToolbarPosition } from '../types/toolbar';
4
- interface LaunchDarklyToolbarContextValue {
4
+ interface DevServerContextValue {
5
5
  state: ToolbarState & {
6
6
  availableProjects: string[];
7
7
  currentProjectKey: string | null;
@@ -14,11 +14,11 @@ interface LaunchDarklyToolbarContextValue {
14
14
  switchProject: (projectKey: string) => Promise<void>;
15
15
  handlePositionChange: (position: ToolbarPosition) => void;
16
16
  }
17
- export declare const useToolbarContext: () => LaunchDarklyToolbarContextValue;
18
- export interface LaunchDarklyToolbarProviderProps {
19
- children: React.ReactNode;
17
+ export declare const useDevServerContext: () => DevServerContextValue;
18
+ export interface DevServerProviderProps {
19
+ children: ReactNode;
20
20
  config: LdToolbarConfig;
21
21
  initialPosition?: ToolbarPosition;
22
22
  }
23
- export declare const LaunchDarklyToolbarProvider: React.FC<LaunchDarklyToolbarProviderProps>;
23
+ export declare const DevServerProvider: FC<DevServerProviderProps>;
24
24
  export {};
@@ -0,0 +1,19 @@
1
+ import type { IFlagOverridePlugin } from '../../../types/plugin';
2
+ interface LocalFlag {
3
+ key: string;
4
+ name: string;
5
+ currentValue: any;
6
+ isOverridden: boolean;
7
+ type: 'boolean' | 'string' | 'number' | 'object';
8
+ }
9
+ interface FlagSdkOverrideContextType {
10
+ flags: Record<string, LocalFlag>;
11
+ isLoading: boolean;
12
+ }
13
+ interface FlagSdkOverrideProviderProps {
14
+ children: React.ReactNode;
15
+ flagOverridePlugin: IFlagOverridePlugin;
16
+ }
17
+ export declare function FlagSdkOverrideProvider({ children, flagOverridePlugin }: FlagSdkOverrideProviderProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function useFlagSdkOverrideContext(): FlagSdkOverrideContextType;
19
+ export type { LocalFlag, FlagSdkOverrideContextType };
@@ -0,0 +1,3 @@
1
+ export { DevServerProvider, useDevServerContext } from './DevServerProvider';
2
+ export { SearchProvider, useSearchContext } from './SearchProvider';
3
+ export { FlagSdkOverrideProvider, useFlagSdkOverrideContext, type LocalFlag, type FlagSdkOverrideContextType, } from './FlagSdkOverrideProvider';
@@ -1,6 +1,12 @@
1
- export type TabId = 'flags' | 'settings';
1
+ export type TabId = 'flag-sdk' | 'flag-dev-server' | 'settings';
2
2
  export type ActiveTabId = TabId | undefined;
3
3
  export declare const TAB_ORDER: readonly TabId[];
4
+ export type ToolbarMode = 'dev-server' | 'sdk';
5
+ export declare const DEV_SERVER_TABS: readonly TabId[];
6
+ export declare const SDK_MODE_TABS: readonly TabId[];
7
+ export declare function getToolbarMode(devServerUrl?: string): ToolbarMode;
8
+ export declare function getTabsForMode(mode: ToolbarMode, hasFlagOverridePlugin: boolean): readonly TabId[];
9
+ export declare function getDefaultActiveTab(mode: ToolbarMode): TabId;
4
10
  export interface FeatureFlag {
5
11
  id: string;
6
12
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@launchdarkly/toolbar",
3
- "version": "0.10.1",
3
+ "version": "0.11.0-beta.1",
4
4
  "description": "A React component that provides a developer-friendly toolbar for interacting with LaunchDarkly during development",
5
5
  "keywords": [
6
6
  "launchdarkly",
@@ -80,6 +80,7 @@
80
80
  "@vanilla-extract/vite-plugin": "^5.1.1",
81
81
  "http-server": "^14.1.1",
82
82
  "jsdom": "^26.1.0",
83
+ "launchdarkly-js-client-sdk": "^3.9.0",
83
84
  "oxlint": "^1.0.0",
84
85
  "prettier": "^3.5.3",
85
86
  "react": "^19.1.1",
@@ -91,8 +92,9 @@
91
92
  "webpack": "5.101.3"
92
93
  },
93
94
  "peerDependencies": {
94
- "react": "19.1.1",
95
- "react-dom": "19.1.1"
95
+ "launchdarkly-js-client-sdk": "^3.9.0",
96
+ "react": "^18.0.0 || ^19.0.0",
97
+ "react-dom": "^18.0.0 || ^19.0.0"
96
98
  },
97
99
  "private": false,
98
100
  "publishConfig": {
@@ -1 +0,0 @@
1
- export declare function FlagTabContent(): import("react/jsx-runtime").JSX.Element;
@@ -1,3 +0,0 @@
1
- export declare const TOOLBAR_CONFIG: {
2
- readonly defaultActiveTab: "flags";
3
- };