{"version":3,"file":"FeatureFlagsProvider.cjs","names":[],"sources":["../../src/feature-flags/FeatureFlagsProvider.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\nconst FeatureFlagsContext = createContext<FeatureFlagsAdapter | null>(null);\n\nexport interface FeatureFlagsProviderProps {\n    adapter: FeatureFlagsAdapter;\n    children: ReactNode;\n}\n\n/** Inject a feature flags adapter into the tree. */\nexport function FeatureFlagsProvider({ adapter, children }: FeatureFlagsProviderProps) {\n    const value = useMemo(() => adapter, [adapter]);\n    useEffect(() => undefined, [value]);\n    return <FeatureFlagsContext.Provider value={value}>{children}</FeatureFlagsContext.Provider>;\n}\n\nfunction useAdapter(): FeatureFlagsAdapter {\n    const ctx = useContext(FeatureFlagsContext);\n    if (!ctx) throw new Error(\"useFeatureFlag requires <FeatureFlagsProvider>\");\n    return ctx;\n}\n\n/**\n * Read a boolean flag and re-render when the adapter fires `onChange`.\n *\n * @example\n * const showNewFeed = useFeatureFlag(\"new-feed\", false);\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n    const adapter = useAdapter();\n    const subscribe = (listener: () => void): (() => void) =>\n        adapter.onChange ? adapter.onChange(listener) : () => undefined;\n    const get = (): boolean => adapter.isEnabled(key, defaultValue);\n    return useSyncExternalStore(subscribe, get, get);\n}\n\n/**\n * Read a typed flag value (string / number / boolean / null) and re-render\n * on change.\n */\nexport function useFlagValue<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n    const adapter = useAdapter();\n    const subscribe = (listener: () => void): (() => void) =>\n        adapter.onChange ? adapter.onChange(listener) : () => undefined;\n    const get = (): T => adapter.get<T>(key, defaultValue);\n    return useSyncExternalStore(subscribe, get, get);\n}\n"],"mappings":"sDAIA,IAAM,GAAA,EAAsB,EAAA,cAAA,CAA0C,IAAI,EAQ1E,SAAgB,EAAqB,CAAE,UAAS,YAAuC,CACnF,IAAM,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAS,CAAC,CAAO,CAAC,EAE9C,OADA,EAAA,EAAA,UAAA,KAAgB,IAAA,GAAW,CAAC,CAAK,CAAC,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAoB,SAArB,CAAqC,QAAQ,UAAuC,CAAA,CAC/F,CAEA,SAAS,GAAkC,CACvC,IAAM,GAAA,EAAM,EAAA,WAAA,CAAW,CAAmB,EAC1C,GAAI,CAAC,EAAK,MAAU,MAAM,gDAAgD,EAC1E,OAAO,CACX,CAQA,SAAgB,EAAe,EAAa,EAAe,GAAgB,CACvE,IAAM,EAAU,EAAW,EACrB,EAAa,GACf,EAAQ,SAAW,EAAQ,SAAS,CAAQ,MAAU,IAAA,GACpD,MAAqB,EAAQ,UAAU,EAAK,CAAY,EAC9D,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAAW,EAAK,CAAG,CACnD,CAMA,SAAgB,EAA8C,EAAa,EAAqB,CAC5F,IAAM,EAAU,EAAW,EACrB,EAAa,GACf,EAAQ,SAAW,EAAQ,SAAS,CAAQ,MAAU,IAAA,GACpD,MAAe,EAAQ,IAAO,EAAK,CAAY,EACrD,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAAW,EAAK,CAAG,CACnD"}