@ops-ai/react-router-toggly 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/constants.ts","../src/client/sdk-identity.ts","../src/client/context.tsx","../src/client/hooks.ts","../src/client/components/Feature.tsx","../src/client/router.tsx"],"names":["registerContext","useMemo","jsx"],"mappings":"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","file":"client.js","sourcesContent":["/**\n * Core types for Toggly React Router SDK\n */\n\nimport type { LocalGate } from '@ops-ai/toggly-local-gates'\nimport type { EvaluatedDefinitions } from '@ops-ai/toggly-hooks-types'\n\nexport type {\n EntityGate,\n EntityGateRule,\n EvaluatedDefinitions,\n TogglyEntityContext,\n} from '@ops-ai/toggly-hooks-types'\n\nexport type { LocalGate }\n\n/**\n * Feature requirement - whether all or any features must be enabled\n */\nexport type FeatureRequirement = 'all' | 'any';\n\n/**\n * Where feature evaluation happens for definitions fetches.\n * - `remote` (default): fetch `evaluated-signed` with context query params\n * - `local`: fetch `definitions-signed` (rules only) and evaluate with `@ops-ai/toggly-eval`\n */\nexport type EvaluationMode = 'local' | 'remote';\n\n/**\n * Configuration options for Toggly\n */\nexport interface TogglyConfig {\n /** Toggly application key */\n appKey?: string;\n /** Environment name (e.g., 'Production', 'Staging') */\n environment?: string;\n /** Base URL for Toggly API */\n baseUrl?: string;\n /**\n * Evaluation rail. Defaults to `remote` for backward compatibility.\n * Use `local` for definitions-signed + call-site evaluation (server multi-tenant).\n */\n evaluationMode?: EvaluationMode;\n /** Default feature values for offline/fallback mode */\n featureDefaults?: Record<string, boolean>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n /**\n * When true, verify ES256 signed definition envelopes via JWKS before applying flags.\n */\n verifySignatures?: boolean;\n /**\n * Optional allow-list of JWKS `kid` values when verifySignatures is enabled.\n */\n allowedKeyIds?: string[];\n /**\n * Reject envelopes whose `timestamp` is older than this many seconds.\n * Unset or <= 0 disables freshness checks.\n */\n maxSignatureAgeSeconds?: number;\n /** Device-local gates applied as a read-time AND on worker-evaluated booleans */\n localGates?: LocalGate[];\n /** Optional SDK error callback for reporting fetch/evaluation failures. */\n onError?: (message: string, error?: unknown) => void;\n /** Initial browser identity; hydrated server identity takes precedence. */\n identity?: string;\n /** User groups for targeting */\n groups?: string[];\n /** Custom claims for targeting */\n claims?: Record<string, string>;\n /**\n * Base URL for usage/metrics transport (default: https://app.toggly.io/).\n * Separate from `baseUrl`, which is for definitions/JWKS.\n */\n metricsBaseUrl?: string;\n /**\n * Enable feature usage tracking (Usage.SendStats / api/usage/stats).\n * Defaults to false in core; react-router-toggly server enables when appKey is set.\n */\n enableUsageTracking?: boolean;\n /**\n * Enable business metrics (Metrics.SendMetrics / api/metrics).\n * Defaults to false in core; react-router-toggly server enables when appKey is set.\n */\n enableMetrics?: boolean;\n /** Usage flush interval in ms (default: 60000). 0 disables the timer. */\n usageFlushInterval?: number;\n /** Metrics flush interval in ms (default: 60000). 0 disables the timer. */\n metricsFlushInterval?: number;\n /** Hostname/instance name reported with usage/metrics payloads. */\n instanceName?: string;\n /** Application version reported with usage payloads. */\n appVersion?: string;\n /**\n * Telemetry transport when clients are not injected.\n * Server should use `grpc` with injected clients; edge adapters use `https`.\n */\n telemetryTransport?: 'grpc' | 'https';\n /**\n * Attach Node process signal handlers for best-effort flush (default: true for grpc).\n * Edge adapters must set false.\n */\n telemetryAttachProcessHandlers?: boolean;\n /**\n * Injected usage sender (gRPC stub or test double).\n * @internal\n */\n usageClient?: import('./telemetry/index').UsageSender | null;\n /**\n * Injected metrics sender (gRPC stub or test double).\n * @internal\n */\n metricsClient?: import('./telemetry/index').MetricsSender | null;\n /** Optional fetch override for HTTPS telemetry (edge/tests). */\n telemetryFetch?: typeof fetch;\n}\n\n/**\n * User identity context for feature targeting\n */\nexport interface IdentityContext {\n /** Unique user identifier */\n identity?: string;\n /** User groups for targeting */\n groups?: string[];\n /** Custom traits for targeting */\n traits?: Record<string, string | number | boolean>;\n /** Custom claims for targeting */\n claims?: Record<string, string>;\n /** HTTP request segment fields (UA / Accept-Language / country) */\n request?: {\n userAgent?: string;\n acceptLanguage?: string;\n country?: string;\n };\n}\n\n/**\n * Feature flags state (boolean or entity gate per flag)\n */\nexport type FeatureFlags = EvaluatedDefinitions;\n\n/**\n * Feature evaluation options\n */\nexport interface EvaluationOptions {\n /** Feature key or keys to evaluate */\n featureKey?: string;\n featureKeys?: string[];\n /** Requirement type for multiple features */\n requirement?: FeatureRequirement;\n /** Negate the result */\n negate?: boolean;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n}\n\n/**\n * Feature evaluation result\n */\nexport interface EvaluationResult {\n /** Whether the feature(s) are enabled */\n enabled: boolean;\n /** The feature keys that were evaluated */\n featureKeys: string[];\n /** The requirement type used */\n requirement: FeatureRequirement;\n /** Whether the result was negated */\n negated: boolean;\n}\n\n/**\n * Server-side feature context passed to client\n */\nexport interface ServerFeatureContext {\n /** Pre-fetched feature flags */\n flags: FeatureFlags;\n /** User identity (if any) */\n identity?: string;\n /** App key (for client-side refresh) */\n appKey?: string;\n /** Environment */\n environment?: string;\n /** Timestamp when flags were fetched */\n fetchedAt: number;\n}\n\n/**\n * Loader data with feature flags\n */\nexport interface TogglyLoaderData {\n /** Feature context for hydration */\n __toggly: ServerFeatureContext;\n}\n\n/**\n * Hook metadata\n */\nexport interface HookMetadata {\n name: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Evaluation series data passed between before/after hooks\n */\nexport interface EvaluationSeriesData {\n [key: string]: unknown;\n}\n\n/**\n * Identity series data passed between before/after hooks\n */\nexport interface IdentitySeriesData {\n [key: string]: unknown;\n}\n\n/**\n * Hook interface for extending SDK behavior\n */\nexport interface TogglyHook {\n /** Get hook metadata */\n getMetadata(): HookMetadata;\n\n /** Called before feature evaluation */\n beforeEvaluation?(\n flagKey: string,\n defaultValue?: boolean\n ): Promise<EvaluationSeriesData | void> | EvaluationSeriesData | void;\n\n /** Called after feature evaluation */\n afterEvaluation?(\n flagKey: string,\n data: EvaluationSeriesData | void,\n result: boolean\n ): Promise<void> | void;\n\n /** Called before user identification */\n beforeIdentify?(\n identity: string\n ): Promise<IdentitySeriesData | void> | IdentitySeriesData | void;\n\n /** Called after user identification */\n afterIdentify?(\n identity: string,\n data: IdentitySeriesData | void\n ): Promise<void> | void;\n\n /** Called after feature flags are refreshed */\n afterRefresh?(flags: FeatureFlags): Promise<void> | void;\n}\n\n/**\n * Cookie/session storage options\n */\nexport interface StorageOptions {\n /** Cookie name for identity */\n identityCookieName?: string;\n /** Cookie name for feature flags cache */\n flagsCookieName?: string;\n /** Cookie max age in seconds */\n maxAge?: number;\n /** Cookie path */\n path?: string;\n /** Cookie domain */\n domain?: string;\n /** Secure flag */\n secure?: boolean;\n /** SameSite attribute */\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Error types for Toggly SDK\n */\nexport class TogglyError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'TogglyError';\n }\n}\n\nexport class TogglyNetworkError extends TogglyError {\n constructor(message: string, cause?: unknown) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'TogglyNetworkError';\n }\n}\n\nexport class TogglyConfigError extends TogglyError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR');\n this.name = 'TogglyConfigError';\n }\n}\n\nexport class TogglyTimeoutError extends TogglyError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR');\n this.name = 'TogglyTimeoutError';\n }\n}\n","/**\n * Utility functions for Toggly React Router SDK\n */\n\nimport type {\n FeatureFlags,\n FeatureRequirement,\n EvaluationResult,\n TogglyConfig,\n} from './types';\nimport {\n appendEvaluationContext,\n clearRegisteredContexts,\n evaluateEvaluatedGate,\n normalizeEntityContext,\n registerContext,\n resolveEvaluatedDefinition,\n type TogglyEvaluationContext,\n type TogglyEntityContext,\n} from '@ops-ai/toggly-hooks-types';\nimport {\n evaluateDefinitions,\n evaluateFeatureGate as evaluateLocalFeatureGate,\n type DefinitionsByKey,\n type EvalContext,\n} from '@ops-ai/toggly-eval';\n\n/**\n * Default Toggly configuration\n */\nexport const DEFAULT_CONFIG: Required<\n Pick<TogglyConfig, 'baseUrl' | 'environment' | 'timeout' | 'debug' | 'evaluationMode'>\n> = {\n baseUrl: 'https://definitions.toggly.io',\n environment: 'Production',\n timeout: 10000,\n debug: false,\n evaluationMode: 'remote',\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: TogglyConfig): TogglyConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Build the feature definitions URL.\n *\n * - `evaluationMode: 'remote'` (default): `/evaluated-signed/...` + context query params\n * - `evaluationMode: 'local'`: `/definitions-signed/...` with no evaluation context params\n */\nexport function buildDefinitionsUrl(\n config: TogglyConfig,\n context?: string | TogglyEvaluationContext\n): string {\n const { baseUrl, appKey, environment, groups, claims, evaluationMode } =\n mergeConfig(config);\n\n if (!appKey) {\n throw new Error('appKey is required');\n }\n\n const mode = evaluationMode ?? 'remote';\n const pathSegment =\n mode === 'local' ? 'definitions-signed' : 'evaluated-signed';\n const url = new URL(`${baseUrl}/${pathSegment}/${appKey}/${environment}`);\n\n if (mode === 'local') {\n return url.toString();\n }\n\n const fromParam =\n typeof context === 'string' ? { identity: context } : context;\n\n appendEvaluationContext(\n url,\n {\n identity: fromParam?.identity,\n groups: fromParam?.groups ?? groups,\n claims: fromParam?.claims ?? claims,\n },\n 'evaluated',\n );\n\n return url.toString();\n}\n\n/**\n * Evaluate a single feature\n */\nexport function isFeatureEnabled(\n flags: FeatureFlags,\n featureKey: string,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n): boolean {\n if (!flags || Object.keys(flags).length === 0) {\n return defaultValue;\n }\n\n const value = flags[featureKey];\n if (value === undefined) {\n return defaultValue;\n }\n\n return resolveEvaluatedDefinition(value, entityContext);\n}\n\nexport { registerContext, clearRegisteredContexts, normalizeEntityContext };\n\n/**\n * Locally evaluate a single feature against definitions-signed rules.\n */\nexport function isFeatureEnabledLocal(\n defsByKey: DefinitionsByKey | null | undefined,\n featureKey: string,\n evalCtx: EvalContext = {},\n defaultValue = false,\n): boolean {\n if (!defsByKey || defsByKey.size === 0) {\n return defaultValue;\n }\n\n if (!defsByKey.has(featureKey)) {\n return defaultValue;\n }\n\n return evaluateDefinitions(defsByKey, featureKey, evalCtx);\n}\n\n/**\n * Locally evaluate multiple features with requirement against definitions-signed rules.\n */\nexport function evaluateFeatureGateLocal(\n defsByKey: DefinitionsByKey | null | undefined,\n featureKeys: string[],\n requirement: FeatureRequirement = 'all',\n negate = false,\n defaultValue = false,\n evalCtx: EvalContext = {},\n): EvaluationResult {\n if (!defsByKey || defsByKey.size === 0) {\n return {\n enabled: negate ? !defaultValue : defaultValue,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n if (featureKeys.length === 0) {\n return {\n enabled: negate ? false : true,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n const enabled = evaluateLocalFeatureGate(\n defsByKey,\n featureKeys,\n requirement,\n negate,\n evalCtx,\n );\n\n return {\n enabled,\n featureKeys,\n requirement,\n negated: negate,\n };\n}\n\n/**\n * Evaluate multiple features with requirement\n */\nexport function evaluateFeatureGate(\n flags: FeatureFlags,\n featureKeys: string[],\n requirement: FeatureRequirement = 'all',\n negate = false,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n): EvaluationResult {\n if (!flags || Object.keys(flags).length === 0) {\n return {\n enabled: negate ? !defaultValue : defaultValue,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n if (featureKeys.length === 0) {\n return {\n enabled: negate ? false : true,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n const enabled = evaluateEvaluatedGate(\n flags,\n featureKeys,\n requirement,\n negate,\n entityContext,\n );\n\n return {\n enabled,\n featureKeys,\n requirement,\n negated: negate,\n };\n}\n\n/**\n * Normalize feature keys from options\n */\nexport function normalizeFeatureKeys(\n featureKey?: string,\n featureKeys?: string[]\n): string[] {\n const keys: string[] = [];\n\n if (featureKey) {\n keys.push(featureKey);\n }\n\n if (featureKeys && Array.isArray(featureKeys)) {\n keys.push(...featureKeys);\n }\n\n return [...new Set(keys)]; // Remove duplicates\n}\n\n/**\n * Create a debug logger\n */\nexport function createLogger(debug: boolean) {\n return {\n debug: (...args: unknown[]) => {\n if (debug) {\n console.debug('[Toggly]', ...args);\n }\n },\n info: (...args: unknown[]) => {\n if (debug) {\n console.info('[Toggly]', ...args);\n }\n },\n warn: (...args: unknown[]) => {\n console.warn('[Toggly]', ...args);\n },\n error: (...args: unknown[]) => {\n console.error('[Toggly]', ...args);\n },\n };\n}\n\n/**\n * Parse identity from various sources (cookie value, header, etc.)\n */\nexport function parseIdentity(value: string | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n // Try to parse as JSON (in case it's a stringified object)\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n return parsed;\n }\n if (typeof parsed === 'object' && parsed !== null) {\n // Look for common identity fields\n return parsed.identity || parsed.id || parsed.userId || parsed.sub;\n }\n } catch {\n // Not JSON, use as-is\n }\n\n return value;\n}\n\n/**\n * Serialize feature flags for transport\n */\nexport function serializeFlags(flags: FeatureFlags): string {\n return JSON.stringify(flags);\n}\n\n/**\n * Deserialize feature flags from transport\n */\nexport function deserializeFlags(value: string | null | undefined): FeatureFlags {\n if (!value) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null) {\n return parsed as FeatureFlags;\n }\n } catch {\n // Invalid JSON\n }\n\n return {};\n}\n\n/**\n * Check if we're running on the server\n */\nexport function isServer(): boolean {\n return !isClient();\n}\n\n/**\n * Check if we're running on the client\n */\nexport function isClient(): boolean {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: unknown }).window !== 'undefined'\n );\n}\n\n/**\n * Create a timeout promise\n */\nexport function createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Request timed out after ${ms}ms`));\n }, ms);\n });\n}\n\n/**\n * Fetch with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout = 10000\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n","/**\n * Constants for Toggly React Router SDK\n */\n\n/** Default base URL for Toggly API */\nexport const DEFAULT_BASE_URL = 'https://definitions.toggly.io';\n\n/** Default environment name */\nexport const DEFAULT_ENVIRONMENT = 'Production';\n\n/** Default request timeout in milliseconds */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/** Cookie/storage key names */\nexport const STORAGE_KEYS = {\n /** Identity cookie/storage key */\n IDENTITY: 'toggly_identity',\n /** Feature flags cache key */\n FLAGS: 'toggly_flags',\n /** Config cache key */\n CONFIG: 'toggly_config',\n /** Last fetch timestamp key */\n LAST_FETCH: 'toggly_last_fetch',\n} as const;\n\n/** HTTP header names */\nexport const HEADERS = {\n /** Identity header */\n IDENTITY: 'x-toggly-identity',\n /** Feature flags header */\n FLAGS: 'x-toggly-flags',\n /** Cache control */\n CACHE_CONTROL: 'cache-control',\n} as const;\n\n/** Feature requirement types */\nexport const REQUIREMENT = {\n ALL: 'all' as const,\n ANY: 'any' as const,\n};\n\n/** Error codes */\nexport const ERROR_CODES = {\n NETWORK_ERROR: 'NETWORK_ERROR',\n CONFIG_ERROR: 'CONFIG_ERROR',\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n PARSE_ERROR: 'PARSE_ERROR',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\n/** Meta key for loader data */\nexport const TOGGLY_LOADER_KEY = '__toggly' as const;\n","export const SDK_ID = 'react-router';\nexport const SDK_VERSION = '1.0.0';\n\nexport const SDK_HEADER_ID = 'X-Toggly-Sdk';\nexport const SDK_HEADER_VERSION = 'X-Toggly-Sdk-Version';\n\nexport function sdkUserAgent(): string {\n return `toggly-${SDK_ID}/${SDK_VERSION}`;\n}\n\nexport function sdkCustomHeaders(): Record<string, string> {\n return {\n [SDK_HEADER_ID]: SDK_ID,\n [SDK_HEADER_VERSION]: SDK_VERSION,\n };\n}\n\nexport function appendSdkQueryParams(params: URLSearchParams): void {\n params.set('sdk', SDK_ID);\n params.set('sdkVersion', SDK_VERSION);\n}\n\ntype BrowserLikeGlobal = typeof globalThis & {\n window?: unknown;\n document?: unknown;\n navigator?: { product?: string };\n};\n\n/** Browser and React Native use custom headers on HTTP (User-Agent is forbidden in browser fetch). */\nexport function usesSdkCustomHeaders(): boolean {\n const g = globalThis as BrowserLikeGlobal;\n if (g.window !== undefined && g.document !== undefined) {\n return true;\n }\n if (g.navigator?.product === 'ReactNative') {\n return true;\n }\n return false;\n}\n\nexport function buildDefinitionFetchHeaders(existing: Record<string, string> = {}): Record<string, string> {\n const headers = { ...existing };\n if (usesSdkCustomHeaders()) {\n Object.assign(headers, sdkCustomHeaders());\n } else {\n headers['User-Agent'] = sdkUserAgent();\n }\n return headers;\n}\n","/**\n * React context for Toggly feature flags\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport {\n isFeatureEnabled as coreIsFeatureEnabled,\n buildDefinitionsUrl,\n fetchWithTimeout,\n createLogger,\n mergeConfig,\n normalizeEntityContext,\n registerContext as registerEntityContext,\n} from '../core';\nimport type { TogglyEntityContext } from '../core';\nimport { appendSdkQueryParams } from './sdk-identity';\nimport {\n applyLocalGate,\n buildFlagGateIndex,\n type FlagGateIndex,\n type LocalGate,\n} from '@ops-ai/toggly-local-gates';\nimport type {\n FeatureFlags,\n ServerFeatureContext,\n IdentityContext,\n TogglyConfig,\n TogglyHook,\n} from '../core';\n\n/**\n * Toggly context value\n */\nexport interface TogglyContextValue {\n /** Current feature flags */\n flags: FeatureFlags;\n /** Whether the client is initialized */\n isReady: boolean;\n /** Current identity */\n identity?: string;\n /** Check if a feature is enabled */\n isEnabled: (\n featureKey: string,\n defaultValue?: boolean,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ) => boolean;\n /** Check if a feature is disabled */\n isDisabled: (\n featureKey: string,\n defaultValue?: boolean,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ) => boolean;\n /** Evaluate a feature gate */\n evaluateGate: (\n featureKeys: string[],\n requirement?: 'all' | 'any',\n negate?: boolean,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ) => boolean;\n /** Register a domain-object mapper for entity-context evaluation */\n registerContext: <T>(kind: string, mapper: (entity: T) => TogglyEntityContext) => void;\n /** Set user identity */\n identify: (identity: string, context?: IdentityContext) => Promise<void>;\n /** Clear user identity */\n reset: () => Promise<void>;\n /** Refresh feature flags */\n refresh: () => Promise<void>;\n /** Add a hook */\n addHook: (hook: TogglyHook) => void;\n /** Remove a hook by name */\n removeHook: (name: string) => boolean;\n /** Register device-local post-filter gates */\n setLocalGates: (gates: LocalGate[]) => void;\n /** Notify subscribers that local gate state changed (no network) */\n notifyLocalGatesChanged: () => void;\n /** Subscribe to local gate changes */\n subscribeLocalGatesChanged: (listener: () => void) => () => void;\n}\n\n/**\n * Toggly provider props\n */\nexport interface TogglyProviderProps {\n /** Child components */\n children: ReactNode;\n /** Server-side feature context for hydration */\n serverContext?: ServerFeatureContext;\n /** Toggly configuration */\n config?: TogglyConfig;\n /** Enable client-side refresh */\n enableRefresh?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Callback when flags are updated */\n onFlagsChange?: (flags: FeatureFlags) => void;\n}\n\n// Create context with undefined default\nconst TogglyContext = createContext<TogglyContextValue | undefined>(undefined);\n\n/**\n * Toggly Provider component\n */\nexport function TogglyProvider({\n children,\n serverContext,\n config,\n enableRefresh = false,\n refreshInterval = 60000,\n onFlagsChange,\n}: TogglyProviderProps): ReactElement {\n const mergedConfig = useMemo(\n () => (config ? mergeConfig(config) : undefined),\n [config]\n );\n const logger = useMemo(\n () => createLogger(mergedConfig?.debug ?? false),\n [mergedConfig?.debug]\n );\n\n // Initialize state from server context\n const [flags, setFlags] = useState<FeatureFlags>(\n serverContext?.flags ?? mergedConfig?.featureDefaults ?? {}\n );\n const [identity, setIdentity] = useState<string | undefined>(\n serverContext ? serverContext.identity : mergedConfig?.identity\n );\n const [isReady, setIsReady] = useState(!!serverContext);\n const [hooks, setHooks] = useState<TogglyHook[]>([]);\n const [localGatesRevision, setLocalGatesRevision] = useState(0);\n\n const localGatesRef = useRef<LocalGate[]>(mergedConfig?.localGates ?? []);\n const localGateIndexRef = useRef<FlagGateIndex>(\n buildFlagGateIndex(localGatesRef.current)\n );\n const localGatesListenersRef = useRef(new Set<() => void>());\n\n const getEffectiveFlag = useCallback(\n (\n featureKey: string,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n ): boolean => {\n const remote = coreIsFeatureEnabled(\n flags,\n featureKey,\n defaultValue,\n entityContext,\n );\n return applyLocalGate(\n remote,\n featureKey,\n localGatesRef.current,\n localGateIndexRef.current\n );\n },\n [flags, localGatesRevision]\n );\n\n const registerContext = useCallback(\n <T,>(kind: string, mapper: (entity: T) => TogglyEntityContext): void => {\n registerEntityContext(kind, mapper);\n },\n [],\n );\n\n const setLocalGates = useCallback((gates: LocalGate[]): void => {\n localGatesRef.current = [...gates];\n localGateIndexRef.current = buildFlagGateIndex(localGatesRef.current);\n }, []);\n\n const notifyLocalGatesChanged = useCallback((): void => {\n setLocalGatesRevision((revision) => revision + 1);\n localGatesListenersRef.current.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n logger.error('Local gate listener error:', error);\n }\n });\n }, [logger]);\n\n const subscribeLocalGatesChanged = useCallback(\n (listener: () => void): (() => void) => {\n localGatesListenersRef.current.add(listener);\n return () => {\n localGatesListenersRef.current.delete(listener);\n };\n },\n []\n );\n\n useEffect(() => {\n if (mergedConfig?.localGates) {\n setLocalGates(mergedConfig.localGates);\n }\n }, [mergedConfig?.localGates, setLocalGates]);\n\n const executeAfterRefresh = useCallback(\n async (newFlags: FeatureFlags): Promise<void> => {\n for (const hook of hooks) {\n if (hook.afterRefresh) {\n try {\n await hook.afterRefresh(newFlags);\n } catch (error) {\n logger.error(\n `Error in hook \"${hook.getMetadata().name}.afterRefresh\":`,\n error\n );\n }\n }\n }\n },\n [hooks, logger]\n );\n\n // Fetch flags from API\n const fetchFlags = useCallback(\n async (userIdentity?: string): Promise<FeatureFlags> => {\n if (!mergedConfig?.appKey) {\n logger.debug('No appKey, using current flags.');\n return flags;\n }\n\n try {\n const url = buildDefinitionsUrl(mergedConfig, userIdentity);\n logger.debug(`Fetching flags from: ${url}`);\n\n const response = await fetchWithTimeout(url, {}, mergedConfig.timeout);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const payload = await response.json();\n const newFlags =\n payload && typeof payload === 'object'\n ? (payload as FeatureFlags)\n : {};\n logger.debug(`Fetched ${Object.keys(newFlags).length} flags.`);\n\n return newFlags;\n } catch (error) {\n logger.warn('Failed to fetch flags:', error);\n return flags;\n }\n },\n [mergedConfig, flags, logger]\n );\n\n // Update flags and trigger callbacks\n const updateFlags = useCallback(\n async (newFlags: FeatureFlags) => {\n setFlags(newFlags);\n await executeAfterRefresh(newFlags);\n onFlagsChange?.(newFlags);\n },\n [executeAfterRefresh, onFlagsChange]\n );\n\n // Check if feature is enabled (sync for performance)\n const isEnabled = useCallback(\n (\n featureKey: string,\n defaultValue = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ): boolean => {\n return getEffectiveFlag(\n featureKey,\n defaultValue,\n normalizeEntityContext(entity, kind),\n );\n },\n [getEffectiveFlag]\n );\n\n // Check if feature is disabled\n const isDisabled = useCallback(\n (\n featureKey: string,\n defaultValue = true,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ): boolean => {\n return !isEnabled(featureKey, !defaultValue, entity, kind);\n },\n [isEnabled]\n );\n\n // Evaluate feature gate\n const evaluateGate = useCallback(\n (\n featureKeys: string[],\n requirement: 'all' | 'any' = 'all',\n negate = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ): boolean => {\n if (featureKeys.length === 0) {\n return !negate;\n }\n\n const entityContext = normalizeEntityContext(entity, kind);\n\n let result: boolean;\n if (requirement === 'any') {\n result = featureKeys.some((key) =>\n getEffectiveFlag(key, false, entityContext),\n );\n } else {\n result = featureKeys.every((key) =>\n getEffectiveFlag(key, false, entityContext),\n );\n }\n\n return negate ? !result : result;\n },\n [getEffectiveFlag]\n );\n\n // Identify user\n const identify = useCallback(\n async (newIdentity: string, _context?: IdentityContext): Promise<void> => {\n logger.debug(`Identifying user: ${newIdentity}`);\n\n // Execute beforeIdentify hooks\n for (const hook of hooks) {\n if (hook.beforeIdentify) {\n try {\n await hook.beforeIdentify(newIdentity);\n } catch (error) {\n logger.error(\n `Error in hook \"${hook.getMetadata().name}.beforeIdentify\":`,\n error\n );\n }\n }\n }\n\n setIdentity(newIdentity);\n\n // Fetch new flags with identity\n const newFlags = await fetchFlags(newIdentity);\n await updateFlags(newFlags);\n\n // Execute afterIdentify hooks\n for (let i = hooks.length - 1; i >= 0; i--) {\n const hook = hooks[i];\n if (hook.afterIdentify) {\n try {\n await hook.afterIdentify(newIdentity, undefined);\n } catch (error) {\n logger.error(\n `Error in hook \"${hook.getMetadata().name}.afterIdentify\":`,\n error\n );\n }\n }\n }\n\n setIsReady(true);\n },\n [hooks, fetchFlags, updateFlags, logger]\n );\n\n // Reset identity\n const reset = useCallback(async (): Promise<void> => {\n logger.debug('Resetting identity');\n setIdentity(undefined);\n\n // Fetch flags without identity\n const newFlags = await fetchFlags();\n await updateFlags(newFlags);\n }, [fetchFlags, updateFlags, logger]);\n\n // Refresh flags\n const refresh = useCallback(async (): Promise<void> => {\n logger.debug('Refreshing flags');\n const newFlags = await fetchFlags(identity);\n await updateFlags(newFlags);\n }, [identity, fetchFlags, updateFlags, logger]);\n\n // Add hook\n const addHook = useCallback(\n (hook: TogglyHook): void => {\n setHooks((currentHooks) => {\n const metadata = hook.getMetadata();\n const exists = currentHooks.find(\n (h) => h.getMetadata().name === metadata.name\n );\n\n if (exists) {\n logger.warn(`Hook \"${metadata.name}\" already registered. Skipping.`);\n return currentHooks;\n }\n\n logger.debug(`Hook \"${metadata.name}\" registered.`);\n return [...currentHooks, hook];\n });\n },\n [logger]\n );\n\n // Remove hook\n const removeHook = useCallback(\n (name: string): boolean => {\n let removed = false;\n\n setHooks((currentHooks) => {\n const index = currentHooks.findIndex(\n (h) => h.getMetadata().name === name\n );\n\n if (index > -1) {\n logger.debug(`Hook \"${name}\" removed.`);\n removed = true;\n return [\n ...currentHooks.slice(0, index),\n ...currentHooks.slice(index + 1),\n ];\n }\n\n return currentHooks;\n });\n\n return removed;\n },\n [logger]\n );\n\n // WebSocket live updates\n const wsRef = useRef<WebSocket | null>(null);\n const wsReconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wsConnectedRef = useRef(false);\n const lastFallbackRefreshRef = useRef(0);\n\n const FALLBACK_REFRESH_INTERVAL = 20 * 60 * 1000; // 20 minutes\n const WS_RECONNECT_DELAY = 5000; // 5 seconds\n\n // Stable ref for refresh so WebSocket handlers always call the latest version\n const refreshRef = useRef(refresh);\n useEffect(() => {\n refreshRef.current = refresh;\n }, [refresh]);\n\n // Set up refresh interval with WebSocket throttling\n useEffect(() => {\n if (!enableRefresh || !mergedConfig?.appKey) {\n return;\n }\n\n logger.debug(`Setting up refresh interval: ${refreshInterval}ms`);\n\n const intervalId = setInterval(() => {\n // When WebSocket is connected, throttle HTTP polls to fallback interval\n if (wsConnectedRef.current) {\n const now = Date.now();\n if (now - lastFallbackRefreshRef.current < FALLBACK_REFRESH_INTERVAL) {\n return;\n }\n lastFallbackRefreshRef.current = now;\n }\n refresh();\n }, refreshInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [enableRefresh, refreshInterval, refresh, mergedConfig?.appKey, logger]);\n\n // Set up WebSocket connection for live updates (browser only —\n // Node 22+ exposes a global WebSocket that must not reconnect during SSR).\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n if (!mergedConfig?.appKey || !mergedConfig?.baseUrl) {\n return;\n }\n\n // Only run in browser\n if (typeof WebSocket === 'undefined') {\n return;\n }\n\n function buildWebSocketUrl(): string {\n const baseUrl = mergedConfig!.baseUrl!;\n const wsUrl = baseUrl\n .replace(/^https:\\/\\//, 'wss://')\n .replace(/^http:\\/\\//, 'ws://');\n const params = new URLSearchParams();\n appendSdkQueryParams(params);\n const query = params.toString();\n return `${wsUrl.replace(/\\/$/, '')}/${mergedConfig!.appKey}/ws${query ? `?${query}` : ''}`;\n }\n\n function connect(): void {\n if (wsRef.current) {\n return;\n }\n\n const wsUrl = buildWebSocketUrl();\n logger.debug(`WebSocket connecting to: ${wsUrl}`);\n\n try {\n const socket = new WebSocket(wsUrl);\n wsRef.current = socket;\n\n socket.onopen = () => {\n wsConnectedRef.current = true;\n lastFallbackRefreshRef.current = Date.now();\n logger.debug('WebSocket connected');\n };\n\n socket.onmessage = (event: MessageEvent) => {\n const text = typeof event.data === 'string' ? event.data : '';\n try {\n const msg = JSON.parse(text);\n if (msg.type === 'ping') {\n return;\n }\n if (msg.type === 'flags-updated' || msg.type === 'update') {\n logger.debug('WebSocket: definitions updated, refreshing');\n refreshRef.current();\n }\n } catch {\n // Non-JSON message - check for plain text signals\n if (text === 'update' || text === 'flags-updated') {\n refreshRef.current();\n }\n }\n };\n\n socket.onclose = () => {\n wsConnectedRef.current = false;\n wsRef.current = null;\n logger.debug('WebSocket disconnected, reconnecting in 5s');\n scheduleReconnect();\n };\n\n socket.onerror = () => {\n logger.warn('WebSocket error');\n // close event will fire after error, triggering reconnect\n };\n } catch (error) {\n logger.warn('Failed to create WebSocket:', error);\n wsRef.current = null;\n scheduleReconnect();\n }\n }\n\n function scheduleReconnect(): void {\n if (wsReconnectTimerRef.current) {\n return;\n }\n wsReconnectTimerRef.current = setTimeout(() => {\n wsReconnectTimerRef.current = null;\n connect();\n }, WS_RECONNECT_DELAY);\n }\n\n connect();\n\n return () => {\n if (wsReconnectTimerRef.current) {\n clearTimeout(wsReconnectTimerRef.current);\n wsReconnectTimerRef.current = null;\n }\n if (wsRef.current) {\n wsRef.current.onclose = null;\n wsRef.current.onerror = null;\n wsRef.current.onmessage = null;\n wsRef.current.onopen = null;\n wsRef.current.close();\n wsRef.current = null;\n wsConnectedRef.current = false;\n }\n };\n }, [mergedConfig?.appKey, mergedConfig?.baseUrl, logger]);\n\n // Initialize on mount if no server context\n useEffect(() => {\n if (!serverContext && mergedConfig?.appKey) {\n logger.debug('No server context, initializing client-side');\n fetchFlags(identity).then((newFlags) => {\n setFlags(newFlags);\n setIsReady(true);\n });\n }\n }, []);\n\n const contextValue = useMemo<TogglyContextValue>(\n () => ({\n flags,\n isReady,\n identity,\n isEnabled,\n isDisabled,\n evaluateGate,\n registerContext,\n identify,\n reset,\n refresh,\n addHook,\n removeHook,\n setLocalGates,\n notifyLocalGatesChanged,\n subscribeLocalGatesChanged,\n }),\n [\n flags,\n isReady,\n identity,\n isEnabled,\n isDisabled,\n evaluateGate,\n registerContext,\n identify,\n reset,\n refresh,\n addHook,\n removeHook,\n setLocalGates,\n notifyLocalGatesChanged,\n subscribeLocalGatesChanged,\n ]\n );\n\n return (\n <TogglyContext.Provider value={contextValue}>\n {children}\n </TogglyContext.Provider>\n );\n}\n\n/**\n * Hook to access Toggly context\n */\nexport function useTogglyContext(): TogglyContextValue {\n const context = useContext(TogglyContext);\n\n if (!context) {\n throw new Error('useTogglyContext must be used within a TogglyProvider');\n }\n\n return context;\n}\n\n// Export context for advanced usage\nexport { TogglyContext };\n","/**\n * React hooks for Toggly feature flags\n */\n\nimport { useMemo } from 'react';\nimport { useTogglyContext } from './context';\nimport type {\n FeatureFlags,\n FeatureRequirement,\n TogglyEntityContext,\n} from '../core';\n\n/**\n * Hook to access the Toggly context\n */\nexport function useToggly() {\n return useTogglyContext();\n}\n\n/**\n * Hook to check if a feature is enabled\n */\nexport function useFeature(\n featureKey: string,\n defaultValue = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n): boolean {\n const { isEnabled } = useTogglyContext();\n return isEnabled(featureKey, defaultValue, entity, kind);\n}\n\n/**\n * Hook to check if a feature is disabled\n */\nexport function useFeatureDisabled(\n featureKey: string,\n defaultValue = true,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n): boolean {\n const { isDisabled } = useTogglyContext();\n return isDisabled(featureKey, defaultValue, entity, kind);\n}\n\n/**\n * Hook to evaluate a feature gate (multiple features)\n */\nexport function useFeatureGate(\n featureKeys: string[],\n requirement: FeatureRequirement = 'all',\n negate = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n): boolean {\n const { evaluateGate } = useTogglyContext();\n return evaluateGate(featureKeys, requirement, negate, entity, kind);\n}\n\n/**\n * Hook to get all feature flags\n */\nexport function useFeatureFlags(): FeatureFlags {\n const { flags } = useTogglyContext();\n return flags;\n}\n\n/**\n * Hook to check multiple features at once\n */\nexport function useFeatures(\n featureKeys: string[],\n defaultValue = false\n): Record<string, boolean> {\n const { isEnabled } = useTogglyContext();\n\n return useMemo(() => {\n const result: Record<string, boolean> = {};\n for (const key of featureKeys) {\n result[key] = isEnabled(key, defaultValue);\n }\n return result;\n }, [featureKeys, isEnabled, defaultValue]);\n}\n\n/**\n * Hook for feature flag with callback\n */\nexport function useFeatureCallback<T>(\n featureKey: string,\n enabledCallback: () => T,\n disabledCallback: () => T,\n defaultValue = false\n): T {\n const enabled = useFeature(featureKey, defaultValue);\n return enabled ? enabledCallback() : disabledCallback();\n}\n\n/**\n * Hook to get feature value with typing\n */\nexport function useFeatureValue<T>(\n featureKey: string,\n enabledValue: T,\n disabledValue: T,\n defaultValue = false\n): T {\n const enabled = useFeature(featureKey, defaultValue);\n return enabled ? enabledValue : disabledValue;\n}\n\n/**\n * Hook to track feature flag changes\n */\nexport function useFeatureChange(\n featureKey: string,\n _onChange: (enabled: boolean) => void\n): boolean {\n const enabled = useFeature(featureKey);\n\n // Note: This is synchronous, effect-based tracking should use useEffect\n // in the component directly with enabled as dependency\n\n return enabled;\n}\n\n/**\n * Hook for identity management\n */\nexport function useIdentity() {\n const { identity, identify, reset } = useTogglyContext();\n\n return {\n identity,\n identify,\n reset,\n };\n}\n\n/**\n * Hook to check if Toggly is ready\n */\nexport function useTogglyReady(): boolean {\n const { isReady } = useTogglyContext();\n return isReady;\n}\n\n/**\n * Hook for refreshing flags\n */\nexport function useRefreshFlags() {\n const { refresh } = useTogglyContext();\n return refresh;\n}\n\n/**\n * Hook for conditional rendering based on feature\n */\nexport function useFeatureRender<T>(\n featureKey: string,\n enabled: T,\n disabled: T,\n defaultValue = false\n): T {\n const isEnabled = useFeature(featureKey, defaultValue);\n return isEnabled ? enabled : disabled;\n}\n\n/**\n * Hook for A/B testing with feature flags\n */\nexport function useABTest(\n featureKey: string,\n variantA: string,\n variantB: string,\n defaultVariant: 'A' | 'B' = 'A'\n): string {\n const enabled = useFeature(featureKey, defaultVariant === 'B');\n return enabled ? variantB : variantA;\n}\n\n/**\n * Hook to get a feature with loading state\n */\nexport function useFeatureWithLoading(\n featureKey: string,\n defaultValue = false\n): { enabled: boolean; isLoading: boolean } {\n const { isReady, isEnabled } = useTogglyContext();\n\n return {\n enabled: isEnabled(featureKey, defaultValue),\n isLoading: !isReady,\n };\n}\n","/**\n * Feature component for declarative feature flag rendering\n */\n\nimport type { ReactNode, ReactElement } from 'react';\nimport { useFeature, useFeatureGate } from '../hooks';\nimport type { FeatureRequirement, TogglyEntityContext } from '../../core';\n\n/**\n * Props for Feature component\n */\nexport interface FeatureProps {\n /** Feature key to check */\n featureKey?: string;\n /** Multiple feature keys to check */\n featureKeys?: string[];\n /** Requirement type when using multiple features */\n requirement?: FeatureRequirement;\n /** Negate the feature check — use for the off path (same as .NET `<feature negate>`) */\n negate?: boolean;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n /** Content to render when the gate passes */\n children?: ReactNode;\n /** Render prop for custom rendering */\n render?: (enabled: boolean) => ReactNode;\n /** Entity context for mixed evaluated-signed gates */\n context?: TogglyEntityContext | Record<string, unknown> | null;\n /** Context kind for registerContext mapper lookup */\n contextKind?: string;\n}\n\n/**\n * Feature component for conditional rendering based on feature flags\n *\n * @example\n * // Simple usage\n * <Feature featureKey=\"new-dashboard\">\n * <NewDashboard />\n * </Feature>\n *\n * @example\n * // Off path with negate\n * <Feature featureKey=\"maintenance-mode\" negate>\n * <MainContent />\n * </Feature>\n *\n * @example\n * // Multiple features (all required)\n * <Feature featureKeys={[\"premium\", \"analytics\"]} requirement=\"all\">\n * <PremiumAnalytics />\n * </Feature>\n *\n * @example\n * // Render prop\n * <Feature featureKey=\"dark-mode\" render={(enabled) => (\n * <div className={enabled ? 'dark' : 'light'}>Content</div>\n * )} />\n */\nexport function Feature({\n featureKey,\n featureKeys,\n requirement = 'all',\n negate = false,\n defaultValue = false,\n children,\n render,\n context,\n contextKind,\n}: FeatureProps): ReactElement | null {\n // Determine which hook to use\n const keys = featureKeys ?? (featureKey ? [featureKey] : []);\n\n // Use single feature hook for single key, gate hook for multiple\n const singleEnabled = useFeature(keys[0] ?? '', defaultValue, context, contextKind);\n const gateEnabled = useFeatureGate(keys, requirement, false, context, contextKind);\n\n // Calculate final enabled state\n let enabled: boolean;\n if (keys.length === 0) {\n enabled = defaultValue;\n } else if (keys.length === 1) {\n enabled = singleEnabled;\n } else {\n enabled = gateEnabled;\n }\n\n // Apply negation\n if (negate) {\n enabled = !enabled;\n }\n\n // Render prop takes precedence\n if (render) {\n return <>{render(enabled)}</>;\n }\n\n // Conditional rendering — off path uses a separate Feature with negate\n return enabled ? <>{children}</> : null;\n}\n\n/**\n * Props for FeatureEnabled component.\n * Component is deprecated — prefer `<Feature featureKey=\"…\">`.\n */\nexport interface FeatureEnabledProps {\n /** Feature key to check */\n featureKey: string;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n /** Content to render when feature is enabled */\n children: ReactNode;\n}\n\n/**\n * Component that only renders children when feature is enabled\n *\n * @deprecated Use `<Feature featureKey=\"…\">` instead\n *\n * @example\n * <Feature featureKey=\"premium\">\n * <PremiumContent />\n * </Feature>\n */\nexport function FeatureEnabled({\n featureKey,\n defaultValue = false,\n children,\n}: Readonly<FeatureEnabledProps>): ReactElement | null {\n return (\n <Feature featureKey={featureKey} defaultValue={defaultValue}>\n {children}\n </Feature>\n );\n}\n\n/**\n * Props for FeatureDisabled component.\n * Component is deprecated — prefer `<Feature featureKey=\"…\" negate>`.\n */\nexport interface FeatureDisabledProps {\n /** Feature key to check */\n featureKey: string;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n /** Content to render when feature is disabled */\n children: ReactNode;\n}\n\n/**\n * Component that only renders children when feature is disabled\n *\n * @deprecated Use `<Feature featureKey=\"…\" negate>` instead\n *\n * @example\n * <Feature featureKey=\"new-ui\" negate>\n * <LegacyUI />\n * </Feature>\n */\nexport function FeatureDisabled({\n featureKey,\n defaultValue = true,\n children,\n}: Readonly<FeatureDisabledProps>): ReactElement | null {\n return (\n <Feature featureKey={featureKey} defaultValue={!defaultValue} negate>\n {children}\n </Feature>\n );\n}\n\n/**\n * Props for FeatureSwitch component\n */\nexport interface FeatureSwitchProps {\n /** Feature key to check */\n featureKey: string;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n /** Content to render when feature is enabled */\n enabled: ReactNode;\n /** Content to render when feature is disabled */\n disabled: ReactNode;\n}\n\n/**\n * Component that renders different content based on feature state\n *\n * @example\n * <FeatureSwitch\n * featureKey=\"new-pricing\"\n * enabled={<NewPricing />}\n * disabled={<OldPricing />}\n * />\n */\nexport function FeatureSwitch({\n featureKey,\n defaultValue = false,\n enabled,\n disabled,\n}: FeatureSwitchProps): ReactElement {\n const isEnabled = useFeature(featureKey, defaultValue);\n return <>{isEnabled ? enabled : disabled}</>;\n}\n\n/**\n * Props for FeatureGate component\n */\nexport interface FeatureGateProps {\n /** Feature keys to check */\n featureKeys: string[];\n /** Requirement type */\n requirement?: FeatureRequirement;\n /** Negate the check */\n negate?: boolean;\n /** Content to render when gate passes */\n children: ReactNode;\n /** Entity context for mixed evaluated-signed gates */\n context?: TogglyEntityContext | Record<string, unknown> | null;\n /** Context kind for registerContext mapper lookup */\n contextKind?: string;\n}\n\n/**\n * Component for checking multiple features\n *\n * @example\n * <FeatureGate featureKeys={[\"premium\", \"beta\"]} requirement=\"all\">\n * <BetaFeature />\n * </FeatureGate>\n */\nexport function FeatureGate({\n featureKeys,\n requirement = 'all',\n negate = false,\n children,\n context,\n contextKind,\n}: FeatureGateProps): ReactElement | null {\n const enabled = useFeatureGate(featureKeys, requirement, negate, context, contextKind);\n return enabled ? <>{children}</> : null;\n}\n","/**\n * React Router-specific utilities for Toggly\n */\n\nimport { useLoaderData, useRouteLoaderData } from 'react-router';\n\n// SerializeFrom was removed in React Router v2 — define a compatible alias\ntype SerializeFrom<T> = T;\nimport {\n TOGGLY_LOADER_KEY,\n} from '../core';\nimport type { ReactElement } from 'react';\nimport type { ServerFeatureContext, TogglyConfig } from '../core';\nimport { serializeJsonForInlineScript } from '@ops-ai/toggly-hooks-types';\nimport { TogglyProvider, type TogglyProviderProps } from './context';\n\n/**\n * Props for RouterTogglyProvider\n */\nexport interface RouterTogglyProviderProps extends Omit<TogglyProviderProps, 'serverContext'> {\n /** Route ID to get loader data from (optional) */\n routeId?: string;\n /** Fallback server context if not in loader data */\n fallbackContext?: ServerFeatureContext;\n}\n\n/**\n * React Router-specific Toggly Provider that automatically hydrates from loader data\n *\n * @example\n * // In root.tsx\n * export default function App() {\n * return (\n * <RouterTogglyProvider>\n * <Outlet />\n * </RouterTogglyProvider>\n * );\n * }\n */\nexport function RouterTogglyProvider({\n children,\n routeId,\n fallbackContext,\n config,\n ...props\n}: RouterTogglyProviderProps): ReactElement {\n // Get loader data\n let serverContext: ServerFeatureContext | undefined;\n\n try {\n if (routeId) {\n // Get from specific route\n const routeData = useRouteLoaderData(routeId) as\n | Record<string, unknown>\n | undefined;\n serverContext = routeData?.[TOGGLY_LOADER_KEY] as\n | ServerFeatureContext\n | undefined;\n } else {\n // Get from current route\n const loaderData = useLoaderData() as Record<string, unknown>;\n serverContext = loaderData?.[TOGGLY_LOADER_KEY] as\n | ServerFeatureContext\n | undefined;\n }\n } catch {\n // Loader data not available (e.g., error boundary)\n serverContext = fallbackContext;\n }\n\n // Use fallback if no server context\n serverContext = serverContext ?? fallbackContext;\n\n // Merge config with server context\n const mergedConfig: TogglyConfig | undefined = config ?? (serverContext ? {\n appKey: serverContext.appKey,\n environment: serverContext.environment,\n } : undefined);\n\n return (\n <TogglyProvider\n serverContext={serverContext}\n config={mergedConfig}\n {...props}\n >\n {children}\n </TogglyProvider>\n );\n}\n\n/**\n * Hook to get Toggly context from loader data\n */\nexport function useTogglyLoaderData<T extends Record<string, unknown> = Record<string, unknown>>(): {\n data: SerializeFrom<T>;\n toggly: ServerFeatureContext | undefined;\n} {\n const loaderData = useLoaderData() as SerializeFrom<T> & {\n [TOGGLY_LOADER_KEY]?: ServerFeatureContext;\n };\n\n return {\n data: loaderData,\n toggly: loaderData[TOGGLY_LOADER_KEY],\n };\n}\n\n/**\n * Hook to get Toggly context from a specific route's loader data\n */\nexport function useTogglyRouteLoaderData<T extends Record<string, unknown> = Record<string, unknown>>(\n routeId: string\n): {\n data: SerializeFrom<T> | undefined;\n toggly: ServerFeatureContext | undefined;\n} {\n const routeData = useRouteLoaderData(routeId) as\n | (SerializeFrom<T> & { [TOGGLY_LOADER_KEY]?: ServerFeatureContext })\n | undefined;\n\n return {\n data: routeData,\n toggly: routeData?.[TOGGLY_LOADER_KEY],\n };\n}\n\n/**\n * Helper to extract server context from loader data\n */\nexport function extractServerContext<T extends Record<string, unknown>>(\n loaderData: T & { [TOGGLY_LOADER_KEY]?: ServerFeatureContext }\n): ServerFeatureContext | undefined {\n return loaderData[TOGGLY_LOADER_KEY];\n}\n\n/**\n * Helper to check if loader data has Toggly context\n */\nexport function hasTogglyContext<T extends Record<string, unknown>>(\n loaderData: T\n): loaderData is T & { [TOGGLY_LOADER_KEY]: ServerFeatureContext } {\n const data = loaderData as Record<string, unknown>;\n return TOGGLY_LOADER_KEY in data && data[TOGGLY_LOADER_KEY] !== undefined;\n}\n\n/**\n * Type helper for loader data with Toggly context\n */\nexport type LoaderDataWithToggly<T extends Record<string, unknown>> = T & {\n [TOGGLY_LOADER_KEY]: ServerFeatureContext;\n};\n\n/**\n * Script component to inject Toggly flags for client-side hydration\n *\n * @example\n * // In root.tsx head\n * <TogglyScript serverContext={togglyContext} />\n */\nexport function TogglyScript({\n serverContext,\n nonce,\n}: {\n serverContext?: ServerFeatureContext;\n nonce?: string;\n}): ReactElement | null {\n if (!serverContext) {\n return null;\n }\n\n // Prefer shared helper so escape stays consistent with Docusaurus / edge.\n const script = `window.__TOGGLY_DATA__=${serializeJsonForInlineScript(serverContext)};`;\n\n return (\n <script\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: script }}\n suppressHydrationWarning\n />\n );\n}\n\n/**\n * Get server context from window for client-side hydration\n */\nexport function getWindowTogglyData(): ServerFeatureContext | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n return (window as unknown as { __TOGGLY_DATA__?: ServerFeatureContext }).__TOGGLY_DATA__;\n}\n"]}