@ops-ai/react-router-toggly 1.1.0 → 1.2.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.
- package/CHANGELOG.md +11 -0
- package/dist/client.cjs +72 -7
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +26 -0
- package/dist/client.d.ts +26 -0
- package/dist/client.js +72 -7
- package/dist/client.js.map +1 -1
- package/dist/server.cjs +212 -64
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +49 -5
- package/dist/server.d.ts +49 -5
- package/dist/server.js +212 -64
- package/dist/server.js.map +1 -1
- package/dist/telemetry/grpc.cjs +1 -1
- package/dist/telemetry/grpc.cjs.map +1 -1
- package/dist/telemetry/grpc.js +1 -1
- package/dist/telemetry/grpc.js.map +1 -1
- package/package.json +1 -1
package/dist/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/constants.ts","../src/client/telemetry.ts","../src/client/sdk-identity.ts","../src/client/context.tsx","../src/client/hooks.ts","../src/client/components/Feature.tsx","../src/client/router.tsx"],"names":["appendEvaluationContext","resolveEvaluatedDefinition","createTelemetryReporter","attachBrowserLifecycle","createContext","useEffect","useLayoutEffect","useRef","jsx","useMemo","useState","buildFlagGateIndex","useCallback","applyLocalGate","registerContext","normalizeEntityContext","useContext","Fragment","useRouteLoaderData","useLoaderData","serializeJsonForInlineScript"],"mappings":"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","file":"client.cjs","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 /** Enable compact browser telemetry (default: true with an app key). */\n enableTelemetry?: boolean;\n /** Browser telemetry interval, 30000–60000 ms (default: 45000). */\n telemetryFlushIntervalMs?: number;\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 /** Host-minted browser capability; takes precedence over client identity targeting. */\n instanceId?: string;\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://metrics.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 /** Browser capability. An empty value clears the token; omitted identity updates use client targeting. */\n instanceId?: string;\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","import { createTelemetryReporter, type TelemetryReporter } from '@ops-ai/toggly-client-telemetry';\nimport { attachBrowserLifecycle } from '@ops-ai/toggly-client-telemetry/browser';\nimport type { TogglyConfig } from '../core/types';\n\nexport interface FrontendTelemetry {\n recordUsage(featureKey: string, variant?: string): void;\n recordView(featureKey: string, variant?: string): void;\n incrementCounter(metricKey: string, value?: number): void;\n setGauge(metricKey: string, value: number): void;\n flushTelemetry(): Promise<void>;\n}\ntype Attribution = {identity?: string; instanceId?: string};\ntype Entry = {partition: number; context: Attribution; key: string; variant?: string; kind: 'feature' | 'counter' | 'gauge'; values: number[]};\n\n/** Render may be abandoned: keep its bounded aggregate inert until commit. */\nexport function createBrowserTelemetry(config: TogglyConfig) {\n const enabled = globalThis.window !== undefined && typeof document !== 'undefined' &&\n !!config.appKey?.trim() && config.enableTelemetry !== false;\n const usage = enabled && config.enableUsageTracking !== false;\n const metrics = enabled && config.enableMetrics !== false;\n let context: Attribution = {identity: config.identity, instanceId: config.instanceId};\n let partition = 0;\n let active = false;\n let disposed = false;\n let reporter: TelemetryReporter | undefined;\n let detach: (() => void) | undefined;\n let staged = new Map<string, Entry>();\n let diagnostics = 0;\n const diagnostic = () => {\n if (diagnostics++ >= 10) return;\n try {config.onError?.('Frontend telemetry pre-commit event rejected.');} catch { /* Diagnostics are isolated. */ }\n };\n const getReporter = () => {\n if (!reporter) {\n reporter = createTelemetryReporter({appKey: config.appKey, environment: config.environment, ...context,\n metricsBaseUrl: config.metricsBaseUrl, telemetryFlushIntervalMs: config.telemetryFlushIntervalMs,\n fetch: config.telemetryFetch, onDiagnostic: code => {try {config.onError?.(code);} catch { /* Host callback. */ }}});\n detach = attachBrowserLifecycle(reporter);\n }\n return reporter;\n };\n function replay(entry: Entry) {\n const target = getReporter();\n target.setContext(entry.context);\n if (entry.kind === 'feature') {\n const methods = ['recordCheck', 'recordUsage', 'recordView'] as const;\n entry.values.forEach((count, index) => {for (let i = 0; i < count; i++) target[methods[index]](entry.key, entry.variant!);});\n } else if (entry.kind === 'gauge') target.setGauge(entry.key, entry.values[0]);\n else {\n let remaining = entry.values[0];\n do {const value = Math.min(remaining, 1000000); target.incrementCounter(entry.key, value); remaining -= value;} while (remaining > 0);\n }\n target.setContext(context);\n }\n function isValidEntry(entry: Entry): boolean {\n return !(typeof entry.key !== 'string' || !entry.key.trim() || (entry.kind === 'feature' &&\n (typeof entry.variant !== 'string' || !entry.variant.length || entry.variant.length > 64 || /[^A-Za-z0-9_-]/.test(entry.variant))) ||\n entry.values.some(value => !Number.isFinite(value) || value < 0 || value > 1000000 || (entry.kind !== 'gauge' && !Number.isInteger(value))));\n }\n function fitsAdmissionBudget(entries: Entry[], entry: Entry): boolean {\n // Reserve eventual counter chunks and feature replay operations. Both admission\n // work and activation stay bounded even when render repeats before commit.\n let operations = 0;\n let bytes = 0;\n let variants = 0;\n for (const value of entries) {\n if (value.kind === 'feature' && value.key === entry.key && value.partition === entry.partition) variants++;\n const count = value.kind === 'feature' ? value.values.reduce((a,b)=>a+b,0) : Math.max(1, Math.ceil(value.values[0] / 1000000));\n operations += count;\n const serialized = JSON.stringify({k: config.appKey, e: config.environment ?? 'Production', ...value});\n const size = new TextEncoder().encode(serialized).byteLength;\n if (size > 49152) return false;\n bytes += size * count;\n }\n return entries.length <= 2000 && operations <= 2000 && bytes <= 262144 && variants <= 16;\n }\n function event(entry: Entry) {\n if (disposed || (entry.kind === 'feature' ? !usage : !metrics)) return;\n if (!isValidEntry(entry)) {diagnostic(); return;}\n if (active) {replay(entry); return;}\n const id = JSON.stringify([entry.partition, entry.kind === 'feature' ? 'f' : 'm', entry.key, entry.variant]);\n const previous = staged.get(id);\n if (previous && previous.kind !== entry.kind) {diagnostic(); return;}\n if (previous && entry.kind !== 'gauge') entry.values = entry.values.map((value, index) => value + previous.values[index]);\n const entries = [...staged.entries()].filter(([key]) => key !== id).map(([, value]) => value);\n entries.push(entry);\n if (!fitsAdmissionBudget(entries, entry)) {diagnostic(); return;}\n staged.set(id, entry);\n }\n function feature(key: string, variant: string, index: number, attribution = context, capturedPartition = partition) {\n const values = [0,0,0]; values[index] = 1;\n event({partition: capturedPartition, context: attribution, key, variant, kind: 'feature', values});\n }\n const api: FrontendTelemetry = {\n recordUsage: (key, variant = 'enabled') => feature(key, variant, 1),\n recordView: (key, variant = 'enabled') => feature(key, variant, 2),\n incrementCounter: (key, value = 1) => event({partition, context, key, kind: 'counter', values: [value]}),\n setGauge: (key, value) => event({partition, context, key, kind: 'gauge', values: [value]}),\n flushTelemetry: async () => {await reporter?.flush();},\n };\n return {\n api,\n setContext(next: Attribution) {\n if (disposed) return;\n if (context.identity !== next.identity || context.instanceId !== next.instanceId) partition++;\n context = {identity: next.identity, instanceId: next.instanceId};\n reporter?.setContext(context);\n },\n captureCheck(): (key: string, result: boolean) => void {\n if (disposed || !usage) return () => {};\n if (active) {\n const record = getReporter().captureCheck();\n return (key, result) => record(key, result ? 'enabled' : 'disabled');\n }\n const attribution = context;\n const capturedPartition = partition;\n return (key, result) => feature(key, result ? 'enabled' : 'disabled', 0, attribution, capturedPartition);\n },\n recordCheck: (key: string, result: boolean) => feature(key, result ? 'enabled' : 'disabled', 0),\n activate() {\n if (disposed || active) return;\n active = true;\n const pending = staged; staged = new Map();\n for (const entry of pending.values()) replay(entry);\n pending.clear();\n },\n dispose(options?: {flush?: boolean}) {\n disposed = true; staged.clear(); detach?.(); reporter?.dispose(options);\n },\n };\n}\n","export const SDK_ID = 'react-router';\nexport const SDK_VERSION = '1.1.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 useLayoutEffect,\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 { createBrowserTelemetry, type FrontendTelemetry } from './telemetry';\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 extends FrontendTelemetry {\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\ntype BrowserTelemetry = ReturnType<typeof createBrowserTelemetry>;\ntype CommittedOwner = { telemetry: BrowserTelemetry; transport: string; fetch?: TogglyConfig['telemetryFetch'] };\nconst transportIds = new WeakMap<object, number>();\nlet nextTransportId = 0;\nfunction transportId(value?: TogglyConfig['telemetryFetch']): number {\n if (!value) return 0;\n let id = transportIds.get(value);\n if (id === undefined) { id = ++nextTransportId; transportIds.set(value, id); }\n return id;\n}\n\n// Browser targeting changes must commit before descendant passive refreshes.\n// Server imports and renders retain the inert passive-effect path.\nconst useCommittedContextEffect = globalThis.window === undefined ? useEffect : useLayoutEffect;\n\n/**\n * Toggly Provider component\n */\nexport function TogglyProvider(props: Readonly<TogglyProviderProps>): ReactElement {\n const config = props.config ?? (props.serverContext ? {appKey: props.serverContext.appKey, environment: props.serverContext.environment} : undefined);\n const committedOwner = useRef<CommittedOwner>();\n const ownerKey = JSON.stringify([transportId(config?.telemetryFetch), config?.appKey ?? '', config?.environment ?? 'Production', config?.enableTelemetry, config?.enableUsageTracking, config?.enableMetrics, config?.metricsBaseUrl, config?.telemetryFlushIntervalMs]);\n const snapshot = props.serverContext;\n const matchesOwner = (!snapshot?.appKey || snapshot.appKey === config?.appKey) &&\n (!snapshot?.environment || snapshot.environment === (config?.environment ?? 'Production'));\n return <TogglyProviderOwner key={ownerKey} {...props} committedOwner={committedOwner} config={config} serverContext={matchesOwner ? snapshot : undefined} />;\n}\n\nfunction TogglyProviderOwner({\n committedOwner,\n children,\n serverContext,\n config,\n enableRefresh = false,\n refreshInterval = 60000,\n onFlagsChange,\n}: Readonly<TogglyProviderProps & { committedOwner: { current?: CommittedOwner } }>): 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 const contextRef = useRef({\n identity: serverContext ? serverContext.identity : mergedConfig?.identity,\n instanceId: mergedConfig?.instanceId?.trim() || undefined,\n groups: [...(mergedConfig?.groups ?? [])],\n claims: { ...mergedConfig?.claims },\n });\n const committedTargetingProps = useRef({\n groups: [...(mergedConfig?.groups ?? [])],\n claims: { ...mergedConfig?.claims },\n });\n const flagsRef = useRef<FeatureFlags>(serverContext?.flags ?? mergedConfig?.featureDefaults ?? {});\n const generationRef = useRef(0);\n const updateRevisionRef = useRef(0);\n const [telemetry] = useState(() => createBrowserTelemetry({ ...config, ...contextRef.current }));\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n const transport = JSON.stringify([config?.metricsBaseUrl ?? 'https://metrics.toggly.io',\n config?.telemetryFlushIntervalMs ?? 45000, config?.enableTelemetry !== false,\n config?.enableUsageTracking !== false, config?.enableMetrics !== false]);\n const previous = committedOwner.current;\n if (previous && previous.telemetry !== telemetry) {\n previous.telemetry.dispose({ flush: previous.transport === transport && previous.fetch === config?.telemetryFetch });\n }\n committedOwner.current = { telemetry, transport, fetch: config?.telemetryFetch };\n telemetry.activate();\n return () => {\n mountedRef.current = false;\n generationRef.current++;\n queueMicrotask(() => {\n if (!mountedRef.current) {\n if (committedOwner.current?.telemetry === telemetry) committedOwner.current = undefined;\n telemetry.dispose();\n }\n });\n };\n }, [telemetry]);\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 captureEvaluation = useCallback((featureKeys: readonly string[]) => {\n const selectedKeys = new Set(featureKeys);\n const selectedFlags = Object.fromEntries([...selectedKeys].map(key => [key, flagsRef.current[key]]));\n const capturedFlags = JSON.parse(JSON.stringify(selectedFlags)) as FeatureFlags;\n const applicableGates = localGatesRef.current.filter(gate => gate.flagKeys.some(key => selectedKeys.has(key)));\n const index = buildFlagGateIndex(applicableGates);\n // Preserve the shared helper's first-gate-by-id semantics, including when\n // several gate entries share an id. Only applicable callbacks are captured.\n const gates = [...new Set(index.values())].map(id => {\n const gate = localGatesRef.current.find(candidate => candidate.id === id)!;\n return { ...gate, flagKeys: [...gate.flagKeys] };\n });\n const record = telemetry.captureCheck();\n return (featureKey: string, defaultValue = false, entityContext?: TogglyEntityContext | null): boolean => {\n const remote = coreIsFeatureEnabled(capturedFlags, featureKey, defaultValue, entityContext);\n const result = applyLocalGate(remote, featureKey, gates, index);\n record(featureKey, result);\n return result;\n };\n }, [flags, localGatesRevision, telemetry]);\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, generation: number, revision: number): Promise<void> => {\n for (const hook of hooks) {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\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 (target = contextRef.current): Promise<FeatureFlags> => {\n if (!mountedRef.current) return flagsRef.current;\n if (!mergedConfig?.appKey) {\n logger.debug('No appKey, using current flags.');\n return flagsRef.current;\n }\n\n try {\n const parsedUrl = new URL(buildDefinitionsUrl(mergedConfig, target));\n if (target.instanceId) {\n // Deleting live query entries can skip repeated targeting keys.\n const capturedKeys = [...parsedUrl.searchParams.keys()];\n for (const key of capturedKeys) {\n if (key === 'u' || key === 'userId' || key === 'g' || key.startsWith('claim.')) parsedUrl.searchParams.delete(key);\n }\n parsedUrl.searchParams.set('i', target.instanceId);\n }\n const url = parsedUrl.toString();\n logger.debug('Fetching feature flags');\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 flagsRef.current;\n }\n },\n [mergedConfig, logger]\n );\n\n // Update flags and trigger callbacks\n const updateFlags = useCallback(\n async (newFlags: FeatureFlags, generation: number, revision: number) => {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\n flagsRef.current = newFlags;\n setFlags(newFlags);\n await executeAfterRefresh(newFlags, generation, revision);\n if (mountedRef.current && generation === generationRef.current && revision === updateRevisionRef.current) 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 const evaluate = captureEvaluation([featureKey]);\n return evaluate(\n featureKey,\n defaultValue,\n normalizeEntityContext(entity, kind),\n );\n },\n [captureEvaluation]\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 selectedKeys = [...featureKeys];\n const evaluate = captureEvaluation(selectedKeys);\n const entityContext = normalizeEntityContext(entity, kind);\n\n let result: boolean;\n if (requirement === 'any') {\n result = selectedKeys.some((key) =>\n evaluate(key, false, entityContext),\n );\n } else {\n result = selectedKeys.every((key) =>\n evaluate(key, false, entityContext),\n );\n }\n\n return negate ? !result : result;\n },\n [captureEvaluation]\n );\n\n const installContext = useCallback((target: typeof contextRef.current) => {\n contextRef.current = target;\n telemetry.setContext(target);\n flagsRef.current = mergedConfig?.featureDefaults ?? {};\n setFlags(flagsRef.current);\n setIdentity(target.identity);\n }, [mergedConfig?.featureDefaults, telemetry]);\n\n const isCurrentGeneration = useCallback((generation: number): boolean =>\n mountedRef.current && generation === generationRef.current, []);\n\n const completeIdentification = useCallback((generation: number): void => {\n if (isCurrentGeneration(generation)) setIsReady(true);\n }, [isCurrentGeneration]);\n\n // Check ownership before selecting each hook without adding Promise boundaries.\n const currentIdentifyHooks = useCallback(function* (generation: number, reverse = false): Generator<TogglyHook> {\n let index = reverse ? hooks.length - 1 : 0;\n while (reverse ? index >= 0 : index < hooks.length) {\n if (!isCurrentGeneration(generation)) return;\n yield hooks[index];\n index += reverse ? -1 : 1;\n }\n }, [hooks, isCurrentGeneration]);\n\n // Hook order remains unchanged; every asynchronous boundary checks ownership.\n const identify = useCallback(\n async (newIdentity: string, context?: IdentityContext): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = ++generationRef.current;\n logger.debug('Identifying user');\n for (const hook of currentIdentifyHooks(generation)) {\n if (!hook.beforeIdentify) continue;\n try { await hook.beforeIdentify(newIdentity); }\n catch (error) { logger.error(`Error in hook \"${hook.getMetadata().name}.beforeIdentify\":`, error); }\n }\n if (!isCurrentGeneration(generation)) return;\n const target = {\n identity: newIdentity,\n instanceId: context?.instanceId?.trim() || undefined,\n groups: [...(context?.groups ?? contextRef.current.groups)],\n claims: { ...(context?.claims ?? contextRef.current.claims) },\n };\n installContext(target);\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(target), generation, revision);\n for (const hook of currentIdentifyHooks(generation, true)) {\n if (!hook.afterIdentify) continue;\n try { await hook.afterIdentify(newIdentity, undefined); }\n catch (error) { logger.error(`Error in hook \"${hook.getMetadata().name}.afterIdentify\":`, error); }\n }\n completeIdentification(generation);\n },\n [hooks, fetchFlags, updateFlags, installContext, logger, isCurrentGeneration, completeIdentification, currentIdentifyHooks]\n );\n\n useCommittedContextEffect(() => {\n const previous = committedTargetingProps.current;\n const groups = [...(mergedConfig?.groups ?? [])];\n const claims = { ...mergedConfig?.claims };\n const groupsChanged = previous.groups.length !== groups.length || groups.some((group, index) => group !== previous.groups[index]);\n const claimKeys = Object.keys(claims);\n const claimsChanged = Object.keys(previous.claims).length !== claimKeys.length || claimKeys.some(key => claims[key] !== previous.claims[key]);\n if (!groupsChanged && !claimsChanged) return;\n committedTargetingProps.current = { groups, claims };\n generationRef.current++;\n updateRevisionRef.current++;\n installContext({\n ...contextRef.current,\n groups: groupsChanged ? groups : contextRef.current.groups,\n claims: claimsChanged ? claims : contextRef.current.claims,\n });\n setIsReady(false);\n }, [mergedConfig?.groups, mergedConfig?.claims, installContext]);\n\n const reset = useCallback(async (): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = ++generationRef.current;\n const target = { ...contextRef.current, identity: undefined, instanceId: undefined };\n installContext(target);\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(target), generation, revision);\n if (mountedRef.current && generation === generationRef.current) setIsReady(true);\n }, [fetchFlags, updateFlags, installContext]);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = generationRef.current;\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(contextRef.current), generation, revision);\n if (mountedRef.current && generation === generationRef.current && revision === updateRevisionRef.current) setIsReady(true);\n }, [fetchFlags, updateFlags]);\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 let live = true;\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 (!live || !mountedRef.current || 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 if (!live || wsRef.current !== socket) return;\n wsConnectedRef.current = true;\n lastFallbackRefreshRef.current = Date.now();\n logger.debug('WebSocket connected');\n };\n\n socket.onmessage = (event: MessageEvent) => {\n if (!live || wsRef.current !== socket) return;\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 if (!live || wsRef.current !== socket) return;\n wsConnectedRef.current = false;\n wsRef.current = null;\n logger.debug('WebSocket disconnected, reconnecting in 5s');\n scheduleReconnect();\n };\n\n socket.onerror = () => {\n if (!live || wsRef.current !== socket) return;\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 live = false;\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 const generation = generationRef.current;\n const revision = ++updateRevisionRef.current;\n fetchFlags(contextRef.current).then((newFlags) => {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\n flagsRef.current = newFlags;\n setFlags(newFlags);\n setIsReady(true);\n });\n }\n }, []);\n\n const contextValue = useMemo<TogglyContextValue>(\n () => ({\n ...telemetry.api,\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 telemetry,\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 { useTogglyContext } from '../context';\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 {isEnabled, evaluateGate} = useTogglyContext();\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 = isEnabled(keys[0], defaultValue, context, contextKind);\n } else {\n enabled = evaluateGate(keys, requirement, false, context, contextKind);\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/constants.ts","../src/client/telemetry.ts","../src/client/sdk-identity.ts","../src/client/context.tsx","../src/client/hooks.ts","../src/client/components/Feature.tsx","../src/client/router.tsx"],"names":["appendEvaluationContext","asVariantDefsRecord","unwrapDefsPayload","resolveEvaluatedDefinition","createTelemetryReporter","attachBrowserLifecycle","createContext","useEffect","useLayoutEffect","useRef","jsx","useMemo","useState","buildFlagGateIndex","useCallback","applyLocalGate","registerContext","newFlags","normalizeEntityContext","useContext","Fragment","useRouteLoaderData","useLoaderData","serializeJsonForInlineScript"],"mappings":"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","file":"client.cjs","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 /** Enable compact browser telemetry (default: true with an app key). */\n enableTelemetry?: boolean;\n /** Browser telemetry interval, 30000–60000 ms (default: 45000). */\n telemetryFlushIntervalMs?: number;\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 /**\n * Use `/evaluated-variants-signed` and expose {@link TogglyContextValue.getVariant} /\n * `getVariantValue` (client) or the equivalent {@link TogglyServerClient} methods\n * (server). Only applies in `remote` evaluationMode client-side; the server\n * package forces `remote` when this is set (mirrors the Nuxt/Astro OPS-825\n * override — server otherwise defaults to `definitions-signed` + local eval).\n */\n enableVariants?: boolean;\n /** Host-minted browser capability; takes precedence over client identity targeting. */\n instanceId?: string;\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://metrics.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 /** Browser capability. An empty value clears the token; omitted identity updates use client targeting. */\n instanceId?: string;\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 * Assigned variant for a feature (aligned with @ops-ai/feature-flags-toggly).\n */\nexport interface VariantResult {\n name: string;\n configurationValue?: unknown;\n}\n\n/**\n * Raw evaluated entry from `/evaluated-variants-signed` `defs`.\n */\nexport interface EvaluatedVariantDef {\n enabled: boolean;\n variant?: string;\n configurationValue?: unknown;\n}\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 EvaluatedVariantDef,\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';\nimport { asVariantDefsRecord, unwrapDefsPayload } from '@ops-ai/toggly-signed-defs';\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 * - `enableVariants: true` (remote only): `/evaluated-variants-signed/...` instead of\n * `/evaluated-signed/...`; identity is sent as `userId` rather than `u` (worker contract).\n */\nexport function buildDefinitionsUrl(\n config: TogglyConfig,\n context?: string | TogglyEvaluationContext\n): string {\n const { baseUrl, appKey, environment, groups, claims, evaluationMode, enableVariants } =\n mergeConfig(config);\n\n if (!appKey) {\n throw new Error('appKey is required');\n }\n\n const mode = evaluationMode ?? 'remote';\n const useVariants = mode !== 'local' && enableVariants === true;\n let pathSegment = 'evaluated-signed';\n if (mode === 'local') {\n pathSegment = 'definitions-signed';\n } else if (useVariants) {\n pathSegment = 'evaluated-variants-signed';\n }\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 useVariants ? 'variants' : 'evaluated',\n );\n\n return url.toString();\n}\n\n/**\n * Parse an evaluated-variants-signed HTTP body into a variant defs record.\n * Unwraps a `{ defs }` envelope (unverified path) or accepts an already-unwrapped\n * verified payload; rejects error envelopes; coerces non-map shapes (arrays,\n * primitives) to `{}`.\n */\nexport function parseVariantDefsPayload(\n parsed: unknown,\n): Record<string, EvaluatedVariantDef> {\n return asVariantDefsRecord<EvaluatedVariantDef>(unwrapDefsPayload(parsed));\n}\n\n/** Derive a boolean feature map from evaluated variant defs. */\nexport function variantDefsToFlags(\n defs: Record<string, EvaluatedVariantDef>,\n): FeatureFlags {\n const out: FeatureFlags = {};\n for (const key of Object.keys(defs)) {\n out[key] = defs[key]?.enabled === true;\n }\n return out;\n}\n\n/**\n * Soft-decode a variant configuration value as `T`.\n * Missing/null -> null; with `isT` -> null when guard fails; otherwise value as T.\n */\nexport function decodeVariantValue<T = unknown>(\n value: unknown,\n isT?: (v: unknown) => v is T,\n): T | null {\n if (value === null || value === undefined) return null;\n if (isT) return isT(value) ? value : null;\n return value as T;\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","import { createTelemetryReporter, type TelemetryReporter } from '@ops-ai/toggly-client-telemetry';\nimport { attachBrowserLifecycle } from '@ops-ai/toggly-client-telemetry/browser';\nimport type { TogglyConfig } from '../core/types';\n\nexport interface FrontendTelemetry {\n recordUsage(featureKey: string, variant?: string): void;\n recordView(featureKey: string, variant?: string): void;\n incrementCounter(metricKey: string, value?: number): void;\n setGauge(metricKey: string, value: number): void;\n flushTelemetry(): Promise<void>;\n}\ntype Attribution = {identity?: string; instanceId?: string};\ntype Entry = {partition: number; context: Attribution; key: string; variant?: string; kind: 'feature' | 'counter' | 'gauge'; values: number[]};\n\nfunction checkVariantLabel(result: boolean | string): string {\n if (typeof result === 'string') {\n return result;\n }\n return result ? 'enabled' : 'disabled';\n}\n\n/** Render may be abandoned: keep its bounded aggregate inert until commit. */\nexport function createBrowserTelemetry(config: TogglyConfig) {\n const enabled = globalThis.window !== undefined && typeof document !== 'undefined' &&\n !!config.appKey?.trim() && config.enableTelemetry !== false;\n const usage = enabled && config.enableUsageTracking !== false;\n const metrics = enabled && config.enableMetrics !== false;\n let context: Attribution = {identity: config.identity, instanceId: config.instanceId};\n let partition = 0;\n let active = false;\n let disposed = false;\n let reporter: TelemetryReporter | undefined;\n let detach: (() => void) | undefined;\n let staged = new Map<string, Entry>();\n let diagnostics = 0;\n const diagnostic = () => {\n if (diagnostics++ >= 10) return;\n try {config.onError?.('Frontend telemetry pre-commit event rejected.');} catch { /* Diagnostics are isolated. */ }\n };\n const getReporter = () => {\n if (!reporter) {\n reporter = createTelemetryReporter({appKey: config.appKey, environment: config.environment, ...context,\n metricsBaseUrl: config.metricsBaseUrl, telemetryFlushIntervalMs: config.telemetryFlushIntervalMs,\n fetch: config.telemetryFetch, onDiagnostic: code => {try {config.onError?.(code);} catch { /* Host callback. */ }}});\n detach = attachBrowserLifecycle(reporter);\n }\n return reporter;\n };\n function replay(entry: Entry) {\n const target = getReporter();\n target.setContext(entry.context);\n if (entry.kind === 'feature') {\n const methods = ['recordCheck', 'recordUsage', 'recordView'] as const;\n entry.values.forEach((count, index) => {for (let i = 0; i < count; i++) target[methods[index]](entry.key, entry.variant!);});\n } else if (entry.kind === 'gauge') target.setGauge(entry.key, entry.values[0]);\n else {\n let remaining = entry.values[0];\n do {const value = Math.min(remaining, 1000000); target.incrementCounter(entry.key, value); remaining -= value;} while (remaining > 0);\n }\n target.setContext(context);\n }\n function isValidEntry(entry: Entry): boolean {\n return !(typeof entry.key !== 'string' || !entry.key.trim() || (entry.kind === 'feature' &&\n (typeof entry.variant !== 'string' || !entry.variant.length || entry.variant.length > 64 || /[^A-Za-z0-9_-]/.test(entry.variant))) ||\n entry.values.some(value => !Number.isFinite(value) || value < 0 || value > 1000000 || (entry.kind !== 'gauge' && !Number.isInteger(value))));\n }\n function fitsAdmissionBudget(entries: Entry[], entry: Entry): boolean {\n // Reserve eventual counter chunks and feature replay operations. Both admission\n // work and activation stay bounded even when render repeats before commit.\n let operations = 0;\n let bytes = 0;\n let variants = 0;\n for (const value of entries) {\n if (value.kind === 'feature' && value.key === entry.key && value.partition === entry.partition) variants++;\n const count = value.kind === 'feature' ? value.values.reduce((a,b)=>a+b,0) : Math.max(1, Math.ceil(value.values[0] / 1000000));\n operations += count;\n const serialized = JSON.stringify({k: config.appKey, e: config.environment ?? 'Production', ...value});\n const size = new TextEncoder().encode(serialized).byteLength;\n if (size > 49152) return false;\n bytes += size * count;\n }\n return entries.length <= 2000 && operations <= 2000 && bytes <= 262144 && variants <= 16;\n }\n function event(entry: Entry) {\n if (disposed || (entry.kind === 'feature' ? !usage : !metrics)) return;\n if (!isValidEntry(entry)) {diagnostic(); return;}\n if (active) {replay(entry); return;}\n const id = JSON.stringify([entry.partition, entry.kind === 'feature' ? 'f' : 'm', entry.key, entry.variant]);\n const previous = staged.get(id);\n if (previous && previous.kind !== entry.kind) {diagnostic(); return;}\n if (previous && entry.kind !== 'gauge') entry.values = entry.values.map((value, index) => value + previous.values[index]);\n const entries = [...staged.entries()].filter(([key]) => key !== id).map(([, value]) => value);\n entries.push(entry);\n if (!fitsAdmissionBudget(entries, entry)) {diagnostic(); return;}\n staged.set(id, entry);\n }\n function feature(key: string, variant: string, index: number, attribution = context, capturedPartition = partition) {\n const values = [0,0,0]; values[index] = 1;\n event({partition: capturedPartition, context: attribution, key, variant, kind: 'feature', values});\n }\n const api: FrontendTelemetry = {\n recordUsage: (key, variant = 'enabled') => feature(key, variant, 1),\n recordView: (key, variant = 'enabled') => feature(key, variant, 2),\n incrementCounter: (key, value = 1) => event({partition, context, key, kind: 'counter', values: [value]}),\n setGauge: (key, value) => event({partition, context, key, kind: 'gauge', values: [value]}),\n flushTelemetry: async () => {await reporter?.flush();},\n };\n return {\n api,\n setContext(next: Attribution) {\n if (disposed) return;\n if (context.identity !== next.identity || context.instanceId !== next.instanceId) partition++;\n context = {identity: next.identity, instanceId: next.instanceId};\n reporter?.setContext(context);\n },\n captureCheck(): (key: string, result: boolean | string) => void {\n if (disposed || !usage) return () => {};\n if (active) {\n const record = getReporter().captureCheck();\n return (key, result) => record(key, checkVariantLabel(result));\n }\n const attribution = context;\n const capturedPartition = partition;\n return (key, result) =>\n feature(key, checkVariantLabel(result), 0, attribution, capturedPartition);\n },\n recordCheck: (key: string, result: boolean | string) =>\n feature(key, checkVariantLabel(result), 0),\n activate() {\n if (disposed || active) return;\n active = true;\n const pending = staged; staged = new Map();\n for (const entry of pending.values()) replay(entry);\n pending.clear();\n },\n dispose(options?: {flush?: boolean}) {\n disposed = true; staged.clear(); detach?.(); reporter?.dispose(options);\n },\n };\n}\n","export const SDK_ID = 'react-router';\nexport const SDK_VERSION = '1.2.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 useLayoutEffect,\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 parseVariantDefsPayload,\n variantDefsToFlags,\n decodeVariantValue,\n type TogglyEntityContext,\n type VariantResult,\n type EvaluatedVariantDef,\n type FeatureFlags,\n type ServerFeatureContext,\n type IdentityContext,\n type TogglyConfig,\n type TogglyHook,\n} from '../core';\nimport { createBrowserTelemetry, type FrontendTelemetry } from './telemetry';\nimport { appendSdkQueryParams } from './sdk-identity';\nimport {\n applyLocalGate,\n buildFlagGateIndex,\n type FlagGateIndex,\n type LocalGate,\n} from '@ops-ai/toggly-local-gates';\n\n/**\n * Toggly context value\n */\nexport interface TogglyContextValue extends FrontendTelemetry {\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 /**\n * Current variant assignment for a feature (requires `enableVariants` in the\n * provider config). Soft-null when variants are disabled, unassigned, or the\n * effective flag is off — never throws.\n */\n getVariant: (featureKey: string) => VariantResult | null;\n /**\n * Configuration payload for the assigned variant, if any.\n * Optional `isT` type guard soft-fails to null on mismatch.\n */\n getVariantValue: <T = unknown>(\n featureKey: string,\n isT?: (v: unknown) => v is T,\n ) => T | null;\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\ntype BrowserTelemetry = ReturnType<typeof createBrowserTelemetry>;\ntype CommittedOwner = { telemetry: BrowserTelemetry; transport: string; fetch?: TogglyConfig['telemetryFetch'] };\nconst transportIds = new WeakMap<object, number>();\nlet nextTransportId = 0;\nfunction transportId(value?: TogglyConfig['telemetryFetch']): number {\n if (!value) return 0;\n let id = transportIds.get(value);\n if (id === undefined) { id = ++nextTransportId; transportIds.set(value, id); }\n return id;\n}\n\n// Browser targeting changes must commit before descendant passive refreshes.\n// Server imports and renders retain the inert passive-effect path.\nconst useCommittedContextEffect = globalThis.window === undefined ? useEffect : useLayoutEffect;\n\n/**\n * Toggly Provider component\n */\nexport function TogglyProvider(props: Readonly<TogglyProviderProps>): ReactElement {\n const config = props.config ?? (props.serverContext ? {appKey: props.serverContext.appKey, environment: props.serverContext.environment} : undefined);\n const committedOwner = useRef<CommittedOwner>();\n const ownerKey = JSON.stringify([transportId(config?.telemetryFetch), config?.appKey ?? '', config?.environment ?? 'Production', config?.enableTelemetry, config?.enableUsageTracking, config?.enableMetrics, config?.metricsBaseUrl, config?.telemetryFlushIntervalMs]);\n const snapshot = props.serverContext;\n const matchesOwner = (!snapshot?.appKey || snapshot.appKey === config?.appKey) &&\n (!snapshot?.environment || snapshot.environment === (config?.environment ?? 'Production'));\n return <TogglyProviderOwner key={ownerKey} {...props} committedOwner={committedOwner} config={config} serverContext={matchesOwner ? snapshot : undefined} />;\n}\n\nfunction TogglyProviderOwner({\n committedOwner,\n children,\n serverContext,\n config,\n enableRefresh = false,\n refreshInterval = 60000,\n onFlagsChange,\n}: Readonly<TogglyProviderProps & { committedOwner: { current?: CommittedOwner } }>): 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 const contextRef = useRef({\n identity: serverContext ? serverContext.identity : mergedConfig?.identity,\n instanceId: mergedConfig?.instanceId?.trim() || undefined,\n groups: [...(mergedConfig?.groups ?? [])],\n claims: { ...mergedConfig?.claims },\n });\n const committedTargetingProps = useRef({\n groups: [...(mergedConfig?.groups ?? [])],\n claims: { ...mergedConfig?.claims },\n });\n const flagsRef = useRef<FeatureFlags>(serverContext?.flags ?? mergedConfig?.featureDefaults ?? {});\n // Raw evaluated-variants-signed defs (`enableVariants`); null until a remote\n // variants fetch has resolved — server-hydrated boolean snapshots cannot\n // carry variant assignment, so getVariant soft-nulls until refresh()/identify().\n const variantsRef = useRef<Record<string, EvaluatedVariantDef> | null>(null);\n const generationRef = useRef(0);\n const updateRevisionRef = useRef(0);\n const [telemetry] = useState(() => createBrowserTelemetry({ ...config, ...contextRef.current }));\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n const transport = JSON.stringify([config?.metricsBaseUrl ?? 'https://metrics.toggly.io',\n config?.telemetryFlushIntervalMs ?? 45000, config?.enableTelemetry !== false,\n config?.enableUsageTracking !== false, config?.enableMetrics !== false]);\n const previous = committedOwner.current;\n if (previous && previous.telemetry !== telemetry) {\n previous.telemetry.dispose({ flush: previous.transport === transport && previous.fetch === config?.telemetryFetch });\n }\n committedOwner.current = { telemetry, transport, fetch: config?.telemetryFetch };\n telemetry.activate();\n return () => {\n mountedRef.current = false;\n generationRef.current++;\n queueMicrotask(() => {\n if (!mountedRef.current) {\n if (committedOwner.current?.telemetry === telemetry) committedOwner.current = undefined;\n telemetry.dispose();\n }\n });\n };\n }, [telemetry]);\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 captureEvaluation = useCallback((featureKeys: readonly string[]) => {\n const selectedKeys = new Set(featureKeys);\n const selectedFlags = Object.fromEntries([...selectedKeys].map(key => [key, flagsRef.current[key]]));\n const capturedFlags = JSON.parse(JSON.stringify(selectedFlags)) as FeatureFlags;\n const applicableGates = localGatesRef.current.filter(gate => gate.flagKeys.some(key => selectedKeys.has(key)));\n const index = buildFlagGateIndex(applicableGates);\n // Preserve the shared helper's first-gate-by-id semantics, including when\n // several gate entries share an id. Only applicable callbacks are captured.\n const gates = [...new Set(index.values())].map(id => {\n const gate = localGatesRef.current.find(candidate => candidate.id === id)!;\n return { ...gate, flagKeys: [...gate.flagKeys] };\n });\n const record = telemetry.captureCheck();\n return (featureKey: string, defaultValue = false, entityContext?: TogglyEntityContext | null): boolean => {\n const remote = coreIsFeatureEnabled(capturedFlags, featureKey, defaultValue, entityContext);\n const result = applyLocalGate(remote, featureKey, gates, index);\n record(featureKey, result);\n return result;\n };\n }, [flags, localGatesRevision, telemetry]);\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, generation: number, revision: number): Promise<void> => {\n for (const hook of hooks) {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\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 (target = contextRef.current): Promise<FeatureFlags> => {\n if (!mountedRef.current) return flagsRef.current;\n if (!mergedConfig?.appKey) {\n logger.debug('No appKey, using current flags.');\n return flagsRef.current;\n }\n\n try {\n const parsedUrl = new URL(buildDefinitionsUrl(mergedConfig, target));\n if (target.instanceId) {\n // Deleting live query entries can skip repeated targeting keys.\n const capturedKeys = [...parsedUrl.searchParams.keys()];\n for (const key of capturedKeys) {\n if (key === 'u' || key === 'userId' || key === 'g' || key.startsWith('claim.')) parsedUrl.searchParams.delete(key);\n }\n parsedUrl.searchParams.set('i', target.instanceId);\n }\n const url = parsedUrl.toString();\n logger.debug('Fetching feature flags');\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 if (mergedConfig.enableVariants === true) {\n const defs = parseVariantDefsPayload(payload);\n variantsRef.current = defs;\n const newFlags = variantDefsToFlags(defs);\n logger.debug(`Fetched ${Object.keys(newFlags).length} flags (variants).`);\n return newFlags;\n }\n\n variantsRef.current = null;\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 flagsRef.current;\n }\n },\n [mergedConfig, logger]\n );\n\n // Update flags and trigger callbacks\n const updateFlags = useCallback(\n async (newFlags: FeatureFlags, generation: number, revision: number) => {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\n flagsRef.current = newFlags;\n setFlags(newFlags);\n await executeAfterRefresh(newFlags, generation, revision);\n if (mountedRef.current && generation === generationRef.current && revision === updateRevisionRef.current) 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 const evaluate = captureEvaluation([featureKey]);\n return evaluate(\n featureKey,\n defaultValue,\n normalizeEntityContext(entity, kind),\n );\n },\n [captureEvaluation]\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 selectedKeys = [...featureKeys];\n const evaluate = captureEvaluation(selectedKeys);\n const entityContext = normalizeEntityContext(entity, kind);\n\n let result: boolean;\n if (requirement === 'any') {\n result = selectedKeys.some((key) =>\n evaluate(key, false, entityContext),\n );\n } else {\n result = selectedKeys.every((key) =>\n evaluate(key, false, entityContext),\n );\n }\n\n return negate ? !result : result;\n },\n [captureEvaluation]\n );\n\n const getVariant = useCallback(\n (featureKey: string): VariantResult | null => {\n if (!mergedConfig?.enableVariants) return null;\n const entry = variantsRef.current?.[featureKey];\n const enabled = applyLocalGate(\n entry?.enabled === true,\n featureKey,\n localGatesRef.current,\n localGateIndexRef.current,\n );\n const record = telemetry.captureCheck();\n record(featureKey, enabled && entry?.variant ? entry.variant : 'disabled');\n if (!enabled || !entry?.variant) return null;\n return { name: entry.variant, configurationValue: entry.configurationValue };\n },\n [mergedConfig?.enableVariants, localGatesRevision, telemetry, flags],\n );\n\n const getVariantValue = useCallback(\n <T = unknown>(featureKey: string, isT?: (v: unknown) => v is T): T | null => {\n return decodeVariantValue(getVariant(featureKey)?.configurationValue, isT);\n },\n [getVariant],\n );\n\n const installContext = useCallback((target: typeof contextRef.current) => {\n contextRef.current = target;\n telemetry.setContext(target);\n flagsRef.current = mergedConfig?.featureDefaults ?? {};\n // Previous identity's variant assignment must not leak while the new\n // identity's fetch is in flight.\n variantsRef.current = null;\n setFlags(flagsRef.current);\n setIdentity(target.identity);\n }, [mergedConfig?.featureDefaults, telemetry]);\n\n const isCurrentGeneration = useCallback((generation: number): boolean =>\n mountedRef.current && generation === generationRef.current, []);\n\n const completeIdentification = useCallback((generation: number): void => {\n if (isCurrentGeneration(generation)) setIsReady(true);\n }, [isCurrentGeneration]);\n\n // Check ownership before selecting each hook without adding Promise boundaries.\n const currentIdentifyHooks = useCallback(function* (generation: number, reverse = false): Generator<TogglyHook> {\n let index = reverse ? hooks.length - 1 : 0;\n while (reverse ? index >= 0 : index < hooks.length) {\n if (!isCurrentGeneration(generation)) return;\n yield hooks[index];\n index += reverse ? -1 : 1;\n }\n }, [hooks, isCurrentGeneration]);\n\n // Hook order remains unchanged; every asynchronous boundary checks ownership.\n const identify = useCallback(\n async (newIdentity: string, context?: IdentityContext): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = ++generationRef.current;\n logger.debug('Identifying user');\n for (const hook of currentIdentifyHooks(generation)) {\n if (!hook.beforeIdentify) continue;\n try { await hook.beforeIdentify(newIdentity); }\n catch (error) { logger.error(`Error in hook \"${hook.getMetadata().name}.beforeIdentify\":`, error); }\n }\n if (!isCurrentGeneration(generation)) return;\n const target = {\n identity: newIdentity,\n instanceId: context?.instanceId?.trim() || undefined,\n groups: [...(context?.groups ?? contextRef.current.groups)],\n claims: { ...(context?.claims ?? contextRef.current.claims) },\n };\n installContext(target);\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(target), generation, revision);\n for (const hook of currentIdentifyHooks(generation, true)) {\n if (!hook.afterIdentify) continue;\n try { await hook.afterIdentify(newIdentity, undefined); }\n catch (error) { logger.error(`Error in hook \"${hook.getMetadata().name}.afterIdentify\":`, error); }\n }\n completeIdentification(generation);\n },\n [hooks, fetchFlags, updateFlags, installContext, logger, isCurrentGeneration, completeIdentification, currentIdentifyHooks]\n );\n\n useCommittedContextEffect(() => {\n const previous = committedTargetingProps.current;\n const groups = [...(mergedConfig?.groups ?? [])];\n const claims = { ...mergedConfig?.claims };\n const groupsChanged = previous.groups.length !== groups.length || groups.some((group, index) => group !== previous.groups[index]);\n const claimKeys = Object.keys(claims);\n const claimsChanged = Object.keys(previous.claims).length !== claimKeys.length || claimKeys.some(key => claims[key] !== previous.claims[key]);\n if (!groupsChanged && !claimsChanged) return;\n committedTargetingProps.current = { groups, claims };\n generationRef.current++;\n updateRevisionRef.current++;\n installContext({\n ...contextRef.current,\n groups: groupsChanged ? groups : contextRef.current.groups,\n claims: claimsChanged ? claims : contextRef.current.claims,\n });\n setIsReady(false);\n }, [mergedConfig?.groups, mergedConfig?.claims, installContext]);\n\n const reset = useCallback(async (): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = ++generationRef.current;\n const target = { ...contextRef.current, identity: undefined, instanceId: undefined };\n installContext(target);\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(target), generation, revision);\n if (mountedRef.current && generation === generationRef.current) setIsReady(true);\n }, [fetchFlags, updateFlags, installContext]);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!mountedRef.current) return;\n const generation = generationRef.current;\n const revision = ++updateRevisionRef.current;\n await updateFlags(await fetchFlags(contextRef.current), generation, revision);\n if (mountedRef.current && generation === generationRef.current && revision === updateRevisionRef.current) setIsReady(true);\n }, [fetchFlags, updateFlags]);\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 let live = true;\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 (!live || !mountedRef.current || 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 if (!live || wsRef.current !== socket) return;\n wsConnectedRef.current = true;\n lastFallbackRefreshRef.current = Date.now();\n logger.debug('WebSocket connected');\n };\n\n socket.onmessage = (event: MessageEvent) => {\n if (!live || wsRef.current !== socket) return;\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 if (!live || wsRef.current !== socket) return;\n wsConnectedRef.current = false;\n wsRef.current = null;\n logger.debug('WebSocket disconnected, reconnecting in 5s');\n scheduleReconnect();\n };\n\n socket.onerror = () => {\n if (!live || wsRef.current !== socket) return;\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 live = false;\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 const generation = generationRef.current;\n const revision = ++updateRevisionRef.current;\n fetchFlags(contextRef.current).then((newFlags) => {\n if (!mountedRef.current || generation !== generationRef.current || revision !== updateRevisionRef.current) return;\n flagsRef.current = newFlags;\n setFlags(newFlags);\n setIsReady(true);\n });\n }\n }, []);\n\n const contextValue = useMemo<TogglyContextValue>(\n () => ({\n ...telemetry.api,\n flags,\n isReady,\n identity,\n isEnabled,\n isDisabled,\n evaluateGate,\n registerContext,\n getVariant,\n getVariantValue,\n identify,\n reset,\n refresh,\n addHook,\n removeHook,\n setLocalGates,\n notifyLocalGatesChanged,\n subscribeLocalGatesChanged,\n }),\n [\n telemetry,\n flags,\n isReady,\n identity,\n isEnabled,\n isDisabled,\n evaluateGate,\n registerContext,\n getVariant,\n getVariantValue,\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 { useTogglyContext } from '../context';\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 {isEnabled, evaluateGate} = useTogglyContext();\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 = isEnabled(keys[0], defaultValue, context, contextKind);\n } else {\n enabled = evaluateGate(keys, requirement, false, context, contextKind);\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"]}
|
package/dist/client.d.cts
CHANGED
|
@@ -65,6 +65,14 @@ interface TogglyConfig {
|
|
|
65
65
|
localGates?: LocalGate[];
|
|
66
66
|
/** Optional SDK error callback for reporting fetch/evaluation failures. */
|
|
67
67
|
onError?: (message: string, error?: unknown) => void;
|
|
68
|
+
/**
|
|
69
|
+
* Use `/evaluated-variants-signed` and expose {@link TogglyContextValue.getVariant} /
|
|
70
|
+
* `getVariantValue` (client) or the equivalent {@link TogglyServerClient} methods
|
|
71
|
+
* (server). Only applies in `remote` evaluationMode client-side; the server
|
|
72
|
+
* package forces `remote` when this is set (mirrors the Nuxt/Astro OPS-825
|
|
73
|
+
* override — server otherwise defaults to `definitions-signed` + local eval).
|
|
74
|
+
*/
|
|
75
|
+
enableVariants?: boolean;
|
|
68
76
|
/** Host-minted browser capability; takes precedence over client identity targeting. */
|
|
69
77
|
instanceId?: string;
|
|
70
78
|
/** Initial browser identity; hydrated server identity takes precedence. */
|
|
@@ -144,6 +152,13 @@ interface IdentityContext {
|
|
|
144
152
|
* Feature flags state (boolean or entity gate per flag)
|
|
145
153
|
*/
|
|
146
154
|
type FeatureFlags = EvaluatedDefinitions;
|
|
155
|
+
/**
|
|
156
|
+
* Assigned variant for a feature (aligned with @ops-ai/feature-flags-toggly).
|
|
157
|
+
*/
|
|
158
|
+
interface VariantResult {
|
|
159
|
+
name: string;
|
|
160
|
+
configurationValue?: unknown;
|
|
161
|
+
}
|
|
147
162
|
/**
|
|
148
163
|
* Feature evaluation result
|
|
149
164
|
*/
|
|
@@ -276,6 +291,17 @@ interface TogglyContextValue extends FrontendTelemetry {
|
|
|
276
291
|
evaluateGate: (featureKeys: string[], requirement?: 'all' | 'any', negate?: boolean, entity?: TogglyEntityContext | Record<string, unknown> | null, kind?: string) => boolean;
|
|
277
292
|
/** Register a domain-object mapper for entity-context evaluation */
|
|
278
293
|
registerContext: <T>(kind: string, mapper: (entity: T) => TogglyEntityContext) => void;
|
|
294
|
+
/**
|
|
295
|
+
* Current variant assignment for a feature (requires `enableVariants` in the
|
|
296
|
+
* provider config). Soft-null when variants are disabled, unassigned, or the
|
|
297
|
+
* effective flag is off — never throws.
|
|
298
|
+
*/
|
|
299
|
+
getVariant: (featureKey: string) => VariantResult | null;
|
|
300
|
+
/**
|
|
301
|
+
* Configuration payload for the assigned variant, if any.
|
|
302
|
+
* Optional `isT` type guard soft-fails to null on mismatch.
|
|
303
|
+
*/
|
|
304
|
+
getVariantValue: <T = unknown>(featureKey: string, isT?: (v: unknown) => v is T) => T | null;
|
|
279
305
|
/** Set user identity */
|
|
280
306
|
identify: (identity: string, context?: IdentityContext) => Promise<void>;
|
|
281
307
|
/** Clear user identity */
|