11import { DevServerClient , Variation } from './DevServerClient' ;
22import { EnhancedFlag } from '../types/devServer' ;
33import { ApiFlag } from '../ui/Toolbar/types/ldApi' ;
4+ import { parseUrlOverrides } from '../utils/urlOverrides' ;
45
56export 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