Skip to content

Commit 6a9911f

Browse files
feat: implement a way to share overrides with others using urls
1 parent f3d0037 commit 6a9911f

File tree

14 files changed

+856
-20
lines changed

14 files changed

+856
-20
lines changed

packages/toolbar/src/core/services/FlagStateManager.ts

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
import { DevServerClient, Variation } from './DevServerClient';
22
import { EnhancedFlag } from '../types/devServer';
33
import { ApiFlag } from '../ui/Toolbar/types/ldApi';
4+
import { parseUrlOverrides } from '../utils/urlOverrides';
45

56
export class FlagStateManager {
67
private devServerClient: DevServerClient;
78
private listeners: Set<(flags: Record<string, EnhancedFlag>) => void> = new Set();
89
private apiFlags: ApiFlag[] = [];
10+
private urlOverrides: Record<string, any> = {};
911

1012
constructor(devServerClient: DevServerClient) {
1113
this.devServerClient = devServerClient;
14+
this.loadUrlOverrides();
15+
}
16+
17+
private loadUrlOverrides(): void {
18+
try {
19+
this.urlOverrides = parseUrlOverrides();
20+
if (Object.keys(this.urlOverrides).length > 0) {
21+
console.log(
22+
'FlagStateManager: Loaded URL overrides for flags:',
23+
Object.keys(this.urlOverrides)
24+
);
25+
}
26+
} catch (error) {
27+
console.error('FlagStateManager: Error loading URL overrides:', error);
28+
}
1229
}
1330

1431
async getEnhancedFlags(): Promise<Record<string, EnhancedFlag>> {
@@ -25,18 +42,28 @@ export class FlagStateManager {
2542
// Process all flags from the dev server
2643
Object.entries(devServerData.flagsState).forEach(([flagKey, flagState]) => {
2744
const apiFlag = apiFlagsMap.get(flagKey);
28-
const override = devServerData.overrides[flagKey];
45+
const devServerOverride = devServerData.overrides[flagKey];
46+
const urlOverride = this.urlOverrides[flagKey];
2947
const variations = devServerData.availableVariations[flagKey] || [];
3048

31-
// Current value is override if exists, otherwise original value
32-
const currentValue = override ? override.value : flagState.value;
49+
// Priority: URL override > dev server override > original value
50+
let currentValue = flagState.value;
51+
let isOverridden = false;
52+
53+
if (urlOverride !== undefined) {
54+
currentValue = urlOverride;
55+
isOverridden = true;
56+
} else if (devServerOverride) {
57+
currentValue = devServerOverride.value;
58+
isOverridden = true;
59+
}
3360

3461
enhancedFlags[flagKey] = {
3562
key: flagKey,
3663
// Use API flag name if available, otherwise format the key
3764
name: apiFlag?.name || this.formatFlagName(flagKey),
3865
currentValue,
39-
isOverridden: !!override,
66+
isOverridden,
4067
originalValue: flagState.value,
4168
availableVariations: variations,
4269
type: apiFlag?.kind || this.determineFlagType(variations, currentValue),
@@ -103,6 +130,23 @@ export class FlagStateManager {
103130
this.apiFlags = apiFlags;
104131
}
105132

133+
/**
134+
* Returns only the URL-based overrides
135+
* @returns Record of flag keys to their URL override values
136+
*/
137+
getUrlOverrides(): Record<string, any> {
138+
return { ...this.urlOverrides };
139+
}
140+
141+
/**
142+
* Checks if a specific flag override came from the URL
143+
* @param flagKey - The key of the flag to check
144+
* @returns True if the override came from the URL
145+
*/
146+
isUrlOverride(flagKey: string): boolean {
147+
return flagKey in this.urlOverrides;
148+
}
149+
106150
subscribe(listener: (flags: Record<string, EnhancedFlag>) => void): () => void {
107151
this.listeners.add(listener);
108152
return () => this.listeners.delete(listener);

0 commit comments

Comments
 (0)