@guidelytech/flags 0.13.0 → 0.15.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/dist/chunk-IUQQC2EC.js +1085 -0
- package/dist/chunk-IUQQC2EC.js.map +1 -0
- package/dist/chunk-QR5XXIW2.js +1085 -0
- package/dist/chunk-QR5XXIW2.js.map +1 -0
- package/dist/cli.cjs +1 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-main.ts","../src/hash.ts","../src/crypto.ts","../src/util.ts","../src/dev-overrides.ts","../src/values.ts","../src/evaluate.ts","../src/evaluator.ts","../src/sse.ts","../src/client.ts","../src/code-refs.ts","../src/cli.ts"],"sourcesContent":["/** `guidely-flags` command line (Node only). Kept separate from `cli.ts` so tests can call {@link main}. */\nimport { resolve } from \"node:path\";\nimport { createFlagsClient, DEFAULT_FLAGS_API_URL } from \"./client\";\nimport { gitValue, listFiles, scanFiles, MAX_REFS, type CodeRef } from \"./code-refs\";\nimport { decryptPayloadString } from \"./crypto\";\nimport type { FlagsPayload } from \"./types\";\nimport { isEncryptedPayload, isFlagsPayload } from \"./util\";\n\nexport const HELP = `guidely-flags — Guidely feature flag tools\n\nUsage:\n guidely-flags code-refs --key gly_sk_… --environment production --repo <name> [options]\n guidely-flags evaluate --key <pk_…|gly_sk_…> [--environment <env>] [--flag <key>] [--attributes '{\"id\":\"u1\"}']\n\ncode-refs: finds flag keys used as quoted string literals in your code and uploads the\nreferences, so the dashboard shows where each flag is used (run it in CI on your main branch).\n --api-url <url> Guidely URL (default ${DEFAULT_FLAGS_API_URL}; env GUIDELY_API_URL)\n --key <gly_sk_…> Secret API key with flags:read and flags:code-refs (env GUIDELY_API_KEY)\n --environment <env> development | staging | production (env GUIDELY_ENVIRONMENT)\n --repo <name> Repository name, e.g. acme/web (env GITHUB_REPOSITORY)\n --branch <branch> Default: the current git branch\n --commit <sha> Default: the current git commit\n --dir <path> Directory to scan (default .)\n --decryption-key <key> For environments with encrypted payloads\n --dry-run Print the references instead of uploading them\n\nevaluate: prints how a flag (or every flag) evaluates for some attributes.\n --flag <key> Flag key (default: all flags)\n --attributes <json> Attributes object (default {})\n\nExit codes: 0 success, 1 failure, 2 usage error.\n`;\n\nexport interface CliIo {\n fetch?: typeof fetch;\n env?: Record<string, string | undefined>;\n out?: (text: string) => void;\n err?: (text: string) => void;\n cwd?: string;\n}\n\nclass UsageError extends Error {}\n\nfunction parseArgs(argv: string[]): { command?: string; flags: Record<string, string | true> } {\n const flags: Record<string, string | true> = {};\n let command: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\");\n if (eq > 0) flags[a.slice(2, eq)] = a.slice(eq + 1);\n else if (argv[i + 1] !== undefined && !argv[i + 1]!.startsWith(\"--\")) flags[a.slice(2)] = argv[++i]!;\n else flags[a.slice(2)] = true;\n } else if (a === \"-h\") flags.help = true;\n else if (!command) command = a;\n else throw new UsageError(`Unexpected argument: ${a}`);\n }\n return { command, flags };\n}\n\nexport async function main(argv: string[], io: CliIo = {}): Promise<number> {\n const env = io.env ?? process.env;\n const out = io.out ?? ((t: string) => process.stdout.write(t));\n const err = io.err ?? ((t: string) => process.stderr.write(t));\n const doFetch = io.fetch ?? fetch;\n try {\n const { command, flags } = parseArgs(argv);\n if (!command || flags.help || command === \"help\") {\n out(HELP);\n return command || flags.help ? 0 : 2;\n }\n const str = (name: string, envName?: string): string | undefined => {\n const v = flags[name];\n if (v === true) throw new UsageError(`--${name} needs a value`);\n return v ?? (envName ? env[envName] : undefined) ?? undefined;\n };\n const apiUrl = (str(\"api-url\", \"GUIDELY_API_URL\") || DEFAULT_FLAGS_API_URL).replace(/\\/+$/, \"\");\n const key = str(\"key\", \"GUIDELY_API_KEY\");\n const environment = str(\"environment\", \"GUIDELY_ENVIRONMENT\");\n if (!key) throw new UsageError(\"--key is required\");\n\n if (command === \"code-refs\") {\n if (!key.startsWith(\"gly_sk_\")) throw new UsageError(\"code-refs needs a secret gly_sk_ API key\");\n if (!environment) throw new UsageError(\"--environment is required\");\n const dir = resolve(io.cwd ?? process.cwd(), str(\"dir\") ?? \".\");\n const repo = str(\"repo\", \"GITHUB_REPOSITORY\");\n if (!repo) throw new UsageError(\"--repo is required\");\n const branch = str(\"branch\") ?? env.GITHUB_HEAD_REF ?? env.GITHUB_REF_NAME ?? gitValue(dir, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!branch) throw new UsageError(\"--branch is required (not a git checkout)\");\n const commit = str(\"commit\") ?? env.GITHUB_SHA ?? gitValue(dir, [\"rev-parse\", \"HEAD\"]);\n\n const auth = { Authorization: `Bearer ${key}`, Accept: \"application/json\" };\n const res = await doFetch(`${apiUrl}/api/v1/sdk/flags?environment=${encodeURIComponent(environment)}`, { headers: auth });\n if (!res.ok) throw new Error(`Downloading flags failed (${res.status}): ${(await res.text()).slice(0, 300)}`);\n let payload = (await res.json()) as unknown;\n if (isEncryptedPayload(payload)) {\n const dk = str(\"decryption-key\", \"GUIDELY_DECRYPTION_KEY\");\n if (!dk) throw new Error(\"The payload is encrypted: pass --decryption-key\");\n payload = { ...payload, ...JSON.parse(await decryptPayloadString(payload.encryptedPayload, dk)) };\n }\n if (!isFlagsPayload(payload)) throw new Error(\"Unexpected flags payload\");\n const keys = Object.keys((payload as FlagsPayload).flags);\n const files = listFiles(dir);\n const refs: CodeRef[] = scanFiles(dir, files, keys);\n if (refs.length >= MAX_REFS) err(`Stopped after ${MAX_REFS} references.\\n`);\n if (flags[\"dry-run\"]) {\n for (const r of refs) out(`${r.flag}\\t${r.path}:${r.line}\\t${r.snippet}\\n`);\n out(`${refs.length} reference(s) to ${new Set(refs.map((r) => r.flag)).size} of ${keys.length} flag(s) in ${files.length} file(s) (dry run, nothing uploaded)\\n`);\n return 0;\n }\n const up = await doFetch(`${apiUrl}/api/v1/flags/code-refs`, { method: \"POST\", headers: { ...auth, \"Content-Type\": \"application/json\" }, body: JSON.stringify({ repo, branch, ...(commit ? { commit } : {}), refs }) });\n if (!up.ok) throw new Error(`Uploading code references failed (${up.status}): ${(await up.text()).slice(0, 300)}`);\n out(`Uploaded ${refs.length} reference(s) to ${new Set(refs.map((r) => r.flag)).size} flag(s) for ${repo}@${branch}\\n`);\n return 0;\n }\n\n if (command === \"evaluate\") {\n let attributes: Record<string, unknown> = {};\n const raw = str(\"attributes\");\n if (raw) {\n try {\n attributes = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new UsageError(\"--attributes must be a JSON object\");\n }\n if (!attributes || typeof attributes !== \"object\" || Array.isArray(attributes)) throw new UsageError(\"--attributes must be a JSON object\");\n }\n let failure: Error | null = null;\n const client = createFlagsClient({ sdkKey: key, apiUrl, environment, pollingMode: \"manual\", reportUsage: false, trackExposures: false, storage: false, logger: null, fetch: doFetch, decryptionKey: str(\"decryption-key\", \"GUIDELY_DECRYPTION_KEY\"), onError: (e) => (failure = e) });\n await client.refresh();\n client.destroy();\n if (!client.getPayload()) throw failure ?? new Error(\"Could not load flags\");\n const user = client.forUser(attributes);\n const flag = str(\"flag\");\n const result = flag ? user.getDetails(flag, null) : user.getAll();\n out(`${JSON.stringify(result, null, 2)}\\n`);\n return 0;\n }\n throw new UsageError(`Unknown command: ${command}`);\n } catch (e) {\n if (e instanceof UsageError) {\n err(`${e.message}\\n\\n${HELP}`);\n return 2;\n }\n err(`guidely-flags: ${e instanceof Error ? e.message : String(e)}\\n`);\n return 1;\n }\n}\n","/** Hashing shared by every Guidely flag SDK (docs/feature-flags-spec.md §3.4, §3.3). Synchronous and dependency-free so it runs in browsers, React Native, Node and edge runtimes alike. */\n\nexport function utf8(input: string): Uint8Array {\n const out: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const d = input.charCodeAt(i + 1);\n if (d >= 0xdc00 && d <= 0xdfff) {\n c = 0x10000 + ((c - 0xd800) << 10) + (d - 0xdc00);\n i++;\n }\n }\n if (c >= 0xd800 && c <= 0xdfff) c = 0xfffd; // lone surrogate\n if (c < 0x80) out.push(c);\n else if (c < 0x800) out.push(0xc0 | (c >> 6), 0x80 | (c & 63));\n else if (c < 0x10000) out.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n else out.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 63), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n }\n return Uint8Array.from(out);\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder().decode(bytes);\n let s = \"\";\n for (let i = 0; i < bytes.length; ) {\n const b = bytes[i++]!;\n let c: number;\n if (b < 0x80) c = b;\n else if (b < 0xe0) c = ((b & 31) << 6) | (bytes[i++]! & 63);\n else if (b < 0xf0) c = ((b & 15) << 12) | ((bytes[i++]! & 63) << 6) | (bytes[i++]! & 63);\n else c = ((b & 7) << 18) | ((bytes[i++]! & 63) << 12) | ((bytes[i++]! & 63) << 6) | (bytes[i++]! & 63);\n s += String.fromCodePoint(c);\n }\n return s;\n}\n\nexport function fnv1a32(bytes: Uint8Array): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < bytes.length; i++) {\n h ^= bytes[i]!;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h >>> 0;\n}\n\n/** Deterministic bucket in [0, 1) with 4 decimals (GrowthBook hash v2 for ASCII input). */\nexport function hashBucket(seed: string, value: string): number {\n const inner = fnv1a32(utf8(seed + value));\n return (fnv1a32(utf8(String(inner))) % 10000) / 10000;\n}\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\n/** Lowercase hex SHA-256 of the UTF-8 bytes of `input`. */\nexport function sha256Hex(input: string | Uint8Array): string {\n const msg = typeof input === \"string\" ? utf8(input) : input;\n const bitLen = msg.length * 8;\n const padded = new Uint8Array(((msg.length + 9 + 63) >> 6) << 6);\n padded.set(msg);\n padded[msg.length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(bitLen / 0x100000000));\n view.setUint32(padded.length - 4, bitLen >>> 0);\n const h = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n const w = new Uint32Array(64);\n for (let off = 0; off < padded.length; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + i * 4);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!, b = w[i - 2]!;\n const s0 = ((a >>> 7) | (a << 25)) ^ ((a >>> 18) | (a << 14)) ^ (a >>> 3);\n const s1 = ((b >>> 17) | (b << 15)) ^ ((b >>> 19) | (b << 13)) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let a = h[0]!, b = h[1]!, c = h[2]!, d = h[3]!, e = h[4]!, f = h[5]!, g = h[6]!, hh = h[7]!;\n for (let i = 0; i < 64; i++) {\n const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n const ch = (e & f) ^ (~e & g);\n const t1 = (hh + S1 + ch + K[i]! + w[i]!) >>> 0;\n const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (S0 + maj) >>> 0;\n hh = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = (h[0]! + a) >>> 0;\n h[1] = (h[1]! + b) >>> 0;\n h[2] = (h[2]! + c) >>> 0;\n h[3] = (h[3]! + d) >>> 0;\n h[4] = (h[4]! + e) >>> 0;\n h[5] = (h[5]! + f) >>> 0;\n h[6] = (h[6]! + g) >>> 0;\n h[7] = (h[7]! + hh) >>> 0;\n }\n let hex = \"\";\n for (let i = 0; i < 8; i++) hex += h[i]!.toString(16).padStart(8, \"0\");\n return hex;\n}\n\n/** `H(x)` for the hashed operators: SHA-256 of `salt + value`. */\nexport function hashConfidential(salt: string, value: string | Uint8Array): string {\n if (typeof value === \"string\") return sha256Hex(salt + value);\n const s = utf8(salt);\n const joined = new Uint8Array(s.length + value.length);\n joined.set(s);\n joined.set(value, s.length);\n return sha256Hex(joined);\n}\n\n/** Comparison value for the hashed prefix/suffix operators: `\"<byteLength>_<H(part)>\"`. */\nexport function hashConfidentialAffix(salt: string, part: string): string {\n return `${utf8(part).length}_${hashConfidential(salt, part)}`;\n}\n","/** AES-256-GCM decryption of encrypted payloads (docs/feature-flags-spec.md §1.3) through WebCrypto. */\nimport { decodeUtf8 } from \"./hash\";\n\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/** Standard or URL-safe base64, padding optional. Throws on invalid input. */\nexport function base64ToBytes(input: string): Uint8Array {\n const s = input.trim().replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/=+$/, \"\");\n const out = new Uint8Array(Math.floor((s.length * 3) / 4));\n let buffer = 0;\n let bits = 0;\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const v = ALPHABET.indexOf(s[i]!);\n if (v < 0) throw new Error(\"invalid base64\");\n buffer = (buffer << 6) | v;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out[n++] = (buffer >> bits) & 0xff;\n }\n }\n return out.subarray(0, n);\n}\n\n/** Decrypts `\"<base64 iv>.<base64 ciphertext+tag>\"` with a base64 32-byte key; returns the UTF-8 plaintext. */\nexport async function decryptPayloadString(encrypted: string, decryptionKey: string): Promise<string> {\n const subtle = (globalThis as { crypto?: Crypto }).crypto?.subtle;\n if (!subtle) throw new Error(\"WebCrypto (crypto.subtle) is not available in this runtime; encrypted payloads need it (Node ≥ 19, browsers, edge runtimes, or a polyfill)\");\n const [ivText, dataText] = encrypted.split(\".\");\n if (!ivText || !dataText) throw new Error(\"malformed encrypted payload\");\n const key = base64ToBytes(decryptionKey);\n if (key.length !== 32) throw new Error(\"decryptionKey must be base64 of 32 bytes\");\n const cryptoKey = await subtle.importKey(\"raw\", key as BufferSource, { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n const plain = await subtle.decrypt({ name: \"AES-GCM\", iv: base64ToBytes(ivText) as BufferSource }, cryptoKey, base64ToBytes(dataText) as BufferSource);\n return decodeUtf8(new Uint8Array(plain));\n}\n","/** Small runtime-neutral helpers shared by the flags client. No Node built-ins, no DOM at module scope. */\nimport type { Attributes, EncryptedFlagsPayload, FlagsPayload, JsonValue, RemoteEvaluationResponse } from \"./types\";\n\n/** JSON with object keys sorted: equal attribute sets give equal strings (remote-eval cache keys). */\nexport function stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n if (Array.isArray(value)) return `[${value.map((v) => (v === undefined ? \"null\" : stableStringify(v))).join(\",\")}]`;\n if (value instanceof Date) return JSON.stringify(value.toISOString());\n const obj = value as Record<string, unknown>;\n return `{${Object.keys(obj)\n .filter((k) => obj[k] !== undefined)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`)\n .join(\",\")}}`;\n}\n\nexport function isEncryptedPayload(x: unknown): x is EncryptedFlagsPayload {\n return !!x && typeof x === \"object\" && typeof (x as EncryptedFlagsPayload).encryptedPayload === \"string\";\n}\n\n/** A remote-evaluation response (`{ version, flags: { key: EvaluationResult } }`) rather than a payload. */\nexport function isRemoteResults(x: unknown): x is RemoteEvaluationResponse {\n return !!x && typeof x === \"object\" && !(\"schemaVersion\" in x) && !!(x as RemoteEvaluationResponse).flags && typeof (x as RemoteEvaluationResponse).flags === \"object\";\n}\n\nexport function isFlagsPayload(x: unknown): x is FlagsPayload {\n return !!x && typeof x === \"object\" && \"schemaVersion\" in x && !!(x as FlagsPayload).flags && typeof (x as FlagsPayload).flags === \"object\";\n}\n\n/** JSON type name used by the typed getters (`array` and `object` are distinct). */\nexport function kindOf(v: unknown): string {\n if (v === null || v === undefined) return \"null\";\n if (Array.isArray(v)) return \"array\";\n return typeof v;\n}\n\n/** Drops `undefined` values (they are not attributes). */\nexport function compact(attrs: Attributes): Attributes {\n const out: Attributes = {};\n for (const [k, v] of Object.entries(attrs)) if (v !== undefined) out[k] = v;\n return out;\n}\n\n/** `?guidely_flags=key:value,key2:\"str\"` → overrides (text as in {@link parseOverrides}; invalid text gives none). */\nexport function parseUrlOverrides(search: string, param = \"guidely_flags\"): Record<string, JsonValue> {\n let raw: string | null = null;\n try {\n raw = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search).get(param);\n } catch {\n return {};\n }\n return (raw && parseOverrides(raw)) || {};\n}\n\n/**\n * Overrides text (docs/feature-flags-spec.md §4.1), as held by `GUIDELY_FLAG_OVERRIDES`, an\n * overrides file or `?guidely_flags=`: a JSON object (`{\"new-checkout\":true}`) or a list\n * `key:value` separated by commas or newlines (`new-checkout:true,limit:5,theme:\"dark\"`), where each\n * value is JSON when it parses and text otherwise. `null` when the text is a malformed JSON object.\n */\nexport function parseOverrides(text: string): Record<string, JsonValue> | null {\n const raw = text.trim();\n if (raw.startsWith(\"{\")) {\n try {\n const obj = JSON.parse(raw) as unknown;\n return obj && typeof obj === \"object\" && !Array.isArray(obj) ? (obj as Record<string, JsonValue>) : null;\n } catch {\n return null;\n }\n }\n const out: Record<string, JsonValue> = {};\n // Split on top-level commas and newlines: those inside quotes, arrays or objects belong to the value.\n const items: string[] = [];\n let depth = 0;\n let quoted = false;\n let start = 0;\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i];\n if (quoted) {\n if (c === \"\\\\\") i++;\n else if (c === '\"') quoted = false;\n } else if (c === '\"') quoted = true;\n else if (c === \"[\" || c === \"{\") depth++;\n else if (c === \"]\" || c === \"}\") depth = Math.max(0, depth - 1);\n else if ((c === \",\" || c === \"\\n\") && depth === 0) {\n items.push(raw.slice(start, i));\n start = i + 1;\n }\n }\n items.push(raw.slice(start));\n for (const item of items) {\n const sep = item.indexOf(\":\");\n if (sep <= 0) continue;\n const key = item.slice(0, sep).trim();\n const text = item.slice(sep + 1).trim();\n if (!key) continue;\n try {\n out[key] = JSON.parse(text) as JsonValue;\n } catch {\n out[key] = text;\n }\n }\n return out;\n}\n\nexport function isDev(): boolean {\n try {\n const p = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return !!p?.env && p.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n}\n\n/** `setTimeout` that never keeps a Node process alive. */\nexport function timer(fn: () => void, ms: number): ReturnType<typeof setTimeout> {\n const t = setTimeout(fn, ms);\n (t as unknown as { unref?: () => void }).unref?.();\n return t;\n}\n","/**\n * Dev overrides (docs/feature-flags-spec.md §4.1): flag values pinned from outside the code, so CI\n * and tests can switch flags without editing the app. Read once, when a client is created.\n * Runtime-neutral: environment variables via `process.env` (Node, Bun, Next.js server) or\n * `Deno.env`, files via `process.getBuiltinModule(\"node:fs\")` or `Deno`, and a global that test\n * runners set in the page (`page.addInitScript`).\n */\nimport type { OverrideBehaviour } from \"./client\";\nimport type { JsonValue } from \"./types\";\nimport { parseOverrides } from \"./util\";\n\nexport const OVERRIDES_ENV = \"GUIDELY_FLAG_OVERRIDES\";\nexport const OVERRIDES_FILE_ENV = \"GUIDELY_FLAG_OVERRIDES_FILE\";\nexport const OVERRIDE_BEHAVIOUR_ENV = \"GUIDELY_FLAG_OVERRIDE_BEHAVIOUR\";\nexport const OVERRIDES_GLOBAL = \"__GUIDELY_FLAG_OVERRIDES__\";\nexport const OVERRIDE_BEHAVIOUR_GLOBAL = \"__GUIDELY_FLAG_OVERRIDE_BEHAVIOUR__\";\n\nconst BEHAVIOURS: readonly OverrideBehaviour[] = [\"localOnly\", \"localOverRemote\", \"remoteOverLocal\"];\n\nexport interface DevOverrides {\n /** Merged values: file, then environment variable, then global (later wins per key). */\n values: Record<string, JsonValue>;\n /** Replaces the configured `overrideBehaviour` when set. */\n behaviour?: OverrideBehaviour;\n /** Where values or the behaviour came from, for the start-up notice. */\n sources: string[];\n /** Unreadable or malformed sources (ignored). */\n errors: string[];\n}\n\ntype Runtime = {\n process?: { env?: Record<string, string | undefined>; getBuiltinModule?: (id: string) => unknown };\n Deno?: { env?: { get(name: string): string | undefined }; readTextFileSync?(path: string): string };\n};\n\nconst runtime = () => globalThis as unknown as Runtime & Record<string, unknown>;\n\nfunction env(name: string): string | undefined {\n const g = runtime();\n try {\n const v = g.process?.env?.[name];\n if (v !== undefined) return v;\n } catch {\n // Some edge runtimes throw on unknown variables.\n }\n try {\n return g.Deno?.env?.get(name);\n } catch {\n return undefined; // Deno without --allow-env\n }\n}\n\nfunction readFile(path: string): string {\n const g = runtime();\n const fs = g.process?.getBuiltinModule?.(\"node:fs\") as { readFileSync(p: string, enc: \"utf8\"): string } | undefined;\n if (fs) return fs.readFileSync(path, \"utf8\");\n if (g.Deno?.readTextFileSync) return g.Deno.readTextFileSync(path);\n throw new Error(\"this runtime cannot read files\");\n}\n\nfunction behaviourOf(raw: unknown, source: string, out: DevOverrides): void {\n if (typeof raw !== \"string\" || !raw.trim()) return;\n const b = raw.trim() as OverrideBehaviour;\n if (BEHAVIOURS.includes(b)) {\n out.behaviour = b;\n out.sources.push(source);\n } else out.errors.push(`${source} must be localOnly, localOverRemote or remoteOverLocal (got \"${raw}\"); ignoring it.`);\n}\n\nfunction merge(text: string | undefined, source: string, out: DevOverrides): void {\n if (text === undefined || !text.trim()) return;\n const values = parseOverrides(text);\n if (!values) return void out.errors.push(`${source} is not a JSON object or a key:value list; ignoring it.`);\n if (!Object.keys(values).length) return;\n Object.assign(out.values, values);\n out.sources.push(source);\n}\n\n/** Reads every dev-override source. Never throws: problems land in `errors`. */\nexport function readDevOverrides(): DevOverrides {\n const out: DevOverrides = { values: {}, sources: [], errors: [] };\n const file = env(OVERRIDES_FILE_ENV);\n if (file?.trim()) {\n try {\n merge(readFile(file.trim()), `${OVERRIDES_FILE_ENV} (${file.trim()})`, out);\n } catch (err) {\n out.errors.push(`Could not read ${OVERRIDES_FILE_ENV} (${file.trim()}): ${err instanceof Error ? err.message : String(err)}; ignoring it.`);\n }\n }\n merge(env(OVERRIDES_ENV), OVERRIDES_ENV, out);\n const g = runtime()[OVERRIDES_GLOBAL];\n if (g && typeof g === \"object\" && !Array.isArray(g)) {\n if (Object.keys(g).length) {\n Object.assign(out.values, g as Record<string, JsonValue>);\n out.sources.push(OVERRIDES_GLOBAL);\n }\n } else if (typeof g === \"string\") merge(g, OVERRIDES_GLOBAL, out);\n else if (g !== undefined && g !== null) out.errors.push(`${OVERRIDES_GLOBAL} must be an object or overrides text; ignoring it.`);\n behaviourOf(env(OVERRIDE_BEHAVIOUR_ENV), OVERRIDE_BEHAVIOUR_ENV, out);\n behaviourOf(runtime()[OVERRIDE_BEHAVIOUR_GLOBAL], OVERRIDE_BEHAVIOUR_GLOBAL, out);\n return out;\n}\n","/** Value conversions used by the condition operators (docs/feature-flags-spec.md §3.2–3.3). */\n\n/** Text form of a scalar, or `undefined` for arrays, objects, null and non-finite numbers. */\nexport function textOf(v: unknown): string | undefined {\n if (typeof v === \"string\") return v;\n if (typeof v === \"boolean\") return v ? \"true\" : \"false\";\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return undefined;\n if (Number.isInteger(v) && Math.abs(v) < 1e21) return v.toFixed(0);\n return String(v);\n }\n if (typeof v === \"bigint\") return v.toString();\n return undefined;\n}\n\nconst NUMERIC = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport function numberOf(v: unknown): number | undefined {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : undefined;\n if (typeof v === \"string\") {\n const s = v.trim();\n if (!NUMERIC.test(s)) return undefined;\n const n = Number(s);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\n/** Elements of an array attribute (or a string holding a JSON array). */\nexport function arrayOf(v: unknown): unknown[] | undefined {\n if (Array.isArray(v)) return v;\n if (typeof v === \"string\") {\n const s = v.trim();\n if (!s.startsWith(\"[\")) return undefined;\n try {\n const parsed: unknown = JSON.parse(s);\n return Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n pre: string[];\n}\n\nconst SEMVER = /^[vV]?(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport function parseSemver(v: unknown): SemVer | undefined {\n const s = typeof v === \"number\" ? textOf(v) : typeof v === \"string\" ? v.trim() : undefined;\n if (s === undefined) return undefined;\n const m = SEMVER.exec(s);\n if (!m) return undefined;\n return { major: Number(m[1]), minor: Number(m[2] ?? 0), patch: Number(m[3] ?? 0), pre: m[4] ? m[4].split(\".\") : [] };\n}\n\nfunction cmp(a: number, b: number): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** SemVer 2.0 precedence: -1, 0 or 1. */\nexport function compareSemver(a: SemVer, b: SemVer): number {\n const c = cmp(a.major, b.major) || cmp(a.minor, b.minor) || cmp(a.patch, b.patch);\n if (c) return c;\n // A release outranks its pre-releases.\n if (!a.pre.length || !b.pre.length) return a.pre.length ? -1 : b.pre.length ? 1 : 0;\n for (let i = 0; i < Math.max(a.pre.length, b.pre.length); i++) {\n const x = a.pre[i], y = b.pre[i];\n if (x === undefined) return -1;\n if (y === undefined) return 1;\n const xn = /^\\d+$/.test(x), yn = /^\\d+$/.test(y);\n if (xn && yn) {\n const d = cmp(Number(x), Number(y));\n if (d) return d;\n } else if (xn) return -1;\n else if (yn) return 1;\n else if (x !== y) return x < y ? -1 : 1;\n }\n return 0;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 29 : 28;\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n\n/** Days since 1970-01-01 in the proleptic Gregorian calendar (H. Hinnant's days_from_civil); unlike Date.UTC, years 0–99 are literal. */\nfunction daysFromCivil(year: number, month: number, day: number): number {\n const y = month <= 2 ? year - 1 : year;\n const era = Math.floor(y / 400);\n const yoe = y - era * 400;\n const doy = Math.floor((153 * (month + (month > 2 ? -3 : 9)) + 2) / 5) + day - 1;\n const doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy;\n return era * 146097 + doe - 719468;\n}\n\nconst ISO = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[Tt ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|z|[+-]\\d{2}:\\d{2})?)?$/;\n\n/** Milliseconds since the epoch: numbers are Unix seconds, strings ISO 8601, Date objects as-is. */\nexport function instantOf(v: unknown): number | undefined {\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? undefined : v.getTime();\n if (typeof v === \"number\") return Number.isFinite(v) ? v * 1000 : undefined;\n if (typeof v !== \"string\") return undefined;\n const m = ISO.exec(v.trim());\n if (!m) return undefined;\n const [, y, mo, d, h = \"0\", mi = \"0\", s = \"0\", frac, tz] = m;\n const month = Number(mo), day = Number(d), hour = Number(h), minute = Number(mi), second = Number(s);\n const year = Number(y);\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) return undefined;\n let ms = (daysFromCivil(year, month, day) * 86400 + hour * 3600 + minute * 60 + second) * 1000 + (frac ? Math.floor(Number(`0.${frac}`) * 1000) : 0);\n if (tz && tz !== \"Z\" && tz !== \"z\") {\n const sign = tz[0] === \"-\" ? -1 : 1;\n ms -= sign * (Number(tz.slice(1, 3)) * 60 + Number(tz.slice(4, 6))) * 60_000;\n }\n return ms;\n}\n\n/** JSON deep equality; numbers compare numerically, object keys unordered. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || a === undefined || b === undefined) return (a ?? null) === (b ?? null);\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((x, i) => jsonEquals(x, b[i]));\n if (typeof a === \"object\" && typeof b === \"object\" && !Array.isArray(b)) {\n const ka = Object.keys(a as object).filter((k) => (a as Record<string, unknown>)[k] !== undefined);\n const kb = Object.keys(b as object).filter((k) => (b as Record<string, unknown>)[k] !== undefined);\n return ka.length === kb.length && ka.every((k) => Object.prototype.hasOwnProperty.call(b, k) && jsonEquals((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\n/** `isOn`: anything except null, false, 0 and \"\". */\nexport function isOn(v: unknown): boolean {\n return !(v === null || v === undefined || v === false || v === 0 || v === \"\");\n}\n\nexport function jsonTypeOf(v: unknown): string | undefined {\n if (v === null || v === undefined) return undefined;\n if (Array.isArray(v)) return \"array\";\n if (typeof v === \"object\") return \"object\";\n if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") return typeof v;\n return undefined;\n}\n","/**\n * Pure, synchronous flag evaluation — the reference implementation of docs/feature-flags-spec.md §3.\n * No I/O: give it a payload and attributes, get a result. Used by every TypeScript SDK and by the\n * Guidely server for remote evaluation and the dashboard's test panel.\n */\nimport { hashBucket, hashConfidential, utf8 } from \"./hash\";\nimport type { AttributeCondition, Attributes, Condition, EvaluationResult, ExperimentRule, FlagComparisonOperator, FlagDefinition, FlagRule, FlagsPayload, JsonValue, RuleSchedule, StickyAssignments, StickyBucketStore } from \"./types\";\nimport { arrayOf, compareSemver, instantOf, isOn, jsonEquals, jsonTypeOf, numberOf, parseSemver, textOf } from \"./values\";\n\nexport * from \"./types\";\nexport { hashBucket, sha256Hex, hashConfidential, hashConfidentialAffix, fnv1a32 } from \"./hash\";\nexport { textOf, numberOf, parseSemver, compareSemver, instantOf, jsonEquals, isOn } from \"./values\";\n\nexport interface EvaluateOptions {\n /** Evaluation time (default: now). */\n now?: Date | number | string;\n /** Sticky bucketing store; experiments keep a user's variation across config changes. */\n stickyBuckets?: StickyBucketStore;\n}\n\nconst MAX_DEPTH = 32;\n\nclass CycleError extends Error {}\n\ninterface Ctx {\n payload: FlagsPayload;\n attributes: Attributes;\n now: number;\n sticky?: StickyBucketStore;\n stack: string[];\n}\n\nfunction nowOf(now: EvaluateOptions[\"now\"]): number {\n if (now === undefined) return Date.now();\n if (typeof now === \"number\") return now;\n if (now instanceof Date) return now.getTime();\n return instantOf(now) ?? Date.now();\n}\n\n/** Attribute by literal key, then by dot path. `null` counts as missing (`undefined`). */\nexport function lookupAttribute(attributes: Attributes, name: string): unknown {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) return attributes[name] ?? undefined;\n if (!name.includes(\".\")) return undefined;\n let cur: unknown = attributes;\n for (const part of name.split(\".\")) {\n if (cur && typeof cur === \"object\" && !Array.isArray(cur) && Object.prototype.hasOwnProperty.call(cur, part)) cur = (cur as Record<string, unknown>)[part];\n else return undefined;\n }\n return cur ?? undefined;\n}\n\n/** Text form of a hashing attribute, or `undefined` when missing or empty. */\nfunction hashValueOf(attributes: Attributes, name: string): string | undefined {\n const t = textOf(lookupAttribute(attributes, name));\n return t === undefined || t === \"\" ? undefined : t;\n}\n\nexport function isScheduleActive(schedule: RuleSchedule | undefined, now: number): boolean {\n if (!schedule) return true;\n if (schedule.start) {\n const start = instantOf(schedule.start);\n if (start === undefined || now < start) return false;\n }\n if (schedule.end) {\n const end = instantOf(schedule.end);\n if (end === undefined || now >= end) return false;\n }\n return true;\n}\n\nfunction clamp01(n: unknown): number {\n return typeof n === \"number\" && Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 0;\n}\n\nexport function effectiveCoverage(rule: { coverage: number; ramp?: Array<{ at: string; coverage: number }> }, now: number): number {\n let coverage = clamp01(rule.coverage);\n let latest = -Infinity;\n for (const step of rule.ramp ?? []) {\n const at = instantOf(step.at);\n if (at !== undefined && at <= now && at >= latest) {\n latest = at;\n coverage = clamp01(step.coverage);\n }\n }\n return coverage;\n}\n\nconst regexCache = new Map<string, RegExp | null>();\nfunction compile(pattern: string, ci: boolean): RegExp | null {\n const k = `${ci ? \"i\" : \"-\"}:${pattern}`;\n let re = regexCache.get(k);\n if (re === undefined) {\n try {\n re = new RegExp(pattern, ci ? \"i\" : \"\");\n } catch {\n re = null;\n }\n if (regexCache.size > 500) regexCache.clear();\n regexCache.set(k, re);\n }\n return re;\n}\n\nfunction lower(s: string, ci: boolean | undefined) {\n return ci ? s.toLowerCase() : s;\n}\n\nfunction textValues(values: JsonValue[], ci: boolean | undefined): string[] {\n const out: string[] = [];\n for (const v of values) {\n const t = textOf(v);\n if (t !== undefined) out.push(lower(t, ci));\n }\n return out;\n}\n\nfunction affixMatches(salt: string, text: string, values: JsonValue[], suffix: boolean): boolean {\n const bytes = utf8(text);\n return values.some((v) => {\n if (typeof v !== \"string\") return false;\n const sep = v.indexOf(\"_\");\n if (sep <= 0) return false;\n const n = Number(v.slice(0, sep));\n if (!Number.isInteger(n) || n < 0 || n > bytes.length) return false;\n const part = suffix ? bytes.slice(bytes.length - n) : bytes.slice(0, n);\n return hashConfidential(salt, part) === v.slice(sep + 1);\n });\n}\n\nfunction evalAttribute(ctx: Ctx, c: AttributeCondition): boolean {\n const raw = lookupAttribute(ctx.attributes, c.attribute);\n const values = Array.isArray(c.values) ? c.values : [];\n const op = c.operator;\n if (op === \"notExists\") return raw === undefined;\n if (raw === undefined) return false;\n const ci = c.caseInsensitive;\n switch (op) {\n case \"exists\":\n return true;\n case \"isType\":\n return jsonTypeOf(raw) === values[0];\n case \"isTrue\":\n return raw === true || (typeof raw === \"string\" && raw.toLowerCase() === \"true\");\n case \"isFalse\":\n return raw === false || (typeof raw === \"string\" && raw.toLowerCase() === \"false\");\n case \"equals\":\n case \"notEquals\":\n case \"in\":\n case \"notIn\":\n case \"contains\":\n case \"notContains\":\n case \"startsWith\":\n case \"notStartsWith\":\n case \"endsWith\":\n case \"notEndsWith\": {\n const t0 = textOf(raw);\n if (t0 === undefined) return false;\n const t = lower(t0, ci);\n const vs = textValues(values, ci);\n switch (op) {\n case \"equals\":\n return vs.length > 0 && t === vs[0];\n case \"notEquals\":\n return vs.length > 0 && t !== vs[0];\n case \"in\":\n return vs.includes(t);\n case \"notIn\":\n return !vs.includes(t);\n case \"contains\":\n return vs.some((v) => t.includes(v));\n case \"notContains\":\n return !vs.some((v) => t.includes(v));\n case \"startsWith\":\n return vs.some((v) => t.startsWith(v));\n case \"notStartsWith\":\n return !vs.some((v) => t.startsWith(v));\n case \"endsWith\":\n return vs.some((v) => t.endsWith(v));\n default:\n return !vs.some((v) => t.endsWith(v));\n }\n }\n case \"regex\":\n case \"notRegex\": {\n const t = textOf(raw);\n if (t === undefined) return false;\n const res: RegExp[] = [];\n for (const v of values) {\n const re = typeof v === \"string\" ? compile(v, !!ci) : null;\n if (!re) return false;\n res.push(re);\n }\n const any = res.some((re) => re.test(t));\n return op === \"regex\" ? any : !any;\n }\n case \"numEquals\":\n case \"numNotEquals\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\": {\n const a = numberOf(raw);\n const b = numberOf(values[0]);\n if (a === undefined || b === undefined) return false;\n if (op === \"numEquals\") return a === b;\n if (op === \"numNotEquals\") return a !== b;\n if (op === \"gt\") return a > b;\n if (op === \"gte\") return a >= b;\n if (op === \"lt\") return a < b;\n return a <= b;\n }\n case \"semverEquals\":\n case \"semverNotEquals\":\n case \"semverGt\":\n case \"semverGte\":\n case \"semverLt\":\n case \"semverLte\":\n case \"semverIn\":\n case \"semverNotIn\": {\n const a = parseSemver(raw);\n if (!a) return false;\n const bs = values.map(parseSemver);\n if (bs.some((b) => !b)) return false;\n if (op === \"semverIn\") return bs.some((b) => compareSemver(a, b!) === 0);\n if (op === \"semverNotIn\") return !bs.some((b) => compareSemver(a, b!) === 0);\n if (!bs[0]) return false;\n const d = compareSemver(a, bs[0]);\n if (op === \"semverEquals\") return d === 0;\n if (op === \"semverNotEquals\") return d !== 0;\n if (op === \"semverGt\") return d > 0;\n if (op === \"semverGte\") return d >= 0;\n if (op === \"semverLt\") return d < 0;\n return d <= 0;\n }\n case \"before\":\n case \"after\": {\n const a = instantOf(raw);\n const b = instantOf(values[0]);\n if (a === undefined || b === undefined) return false;\n return op === \"before\" ? a < b : a > b;\n }\n case \"arrayContainsAny\":\n case \"arrayNotContainsAny\":\n case \"arrayContainsAll\": {\n const arr = arrayOf(raw);\n if (!arr) return false;\n const elems = textValues(arr as JsonValue[], ci);\n const vs = textValues(values, ci);\n if (op === \"arrayContainsAll\") return vs.every((v) => elems.includes(v));\n const any = vs.some((v) => elems.includes(v));\n return op === \"arrayContainsAny\" ? any : !any;\n }\n case \"equalsHashed\":\n case \"notEqualsHashed\":\n case \"inHashed\":\n case \"notInHashed\":\n case \"startsWithHashed\":\n case \"notStartsWithHashed\":\n case \"endsWithHashed\":\n case \"notEndsWithHashed\": {\n const t = textOf(raw);\n if (t === undefined) return false;\n const salt = ctx.payload.salt ?? \"\";\n if (op === \"startsWithHashed\" || op === \"notStartsWithHashed\" || op === \"endsWithHashed\" || op === \"notEndsWithHashed\") {\n const any = affixMatches(salt, t, values, op === \"endsWithHashed\" || op === \"notEndsWithHashed\");\n return op.startsWith(\"not\") ? !any : any;\n }\n const h = hashConfidential(salt, t);\n if (op === \"equalsHashed\") return typeof values[0] === \"string\" && h === values[0];\n if (op === \"notEqualsHashed\") return typeof values[0] === \"string\" && h !== values[0];\n if (op === \"inHashed\") return values.includes(h);\n return !values.includes(h);\n }\n case \"arrayContainsAnyHashed\":\n case \"arrayNotContainsAnyHashed\": {\n const arr = arrayOf(raw);\n if (!arr) return false;\n const salt = ctx.payload.salt ?? \"\";\n const any = arr.some((e) => {\n const t = textOf(e);\n return t !== undefined && values.includes(hashConfidential(salt, t));\n });\n return op === \"arrayContainsAnyHashed\" ? any : !any;\n }\n default:\n return false;\n }\n}\n\nfunction enter<T>(ctx: Ctx, frame: string, fn: () => T): T {\n if (ctx.stack.includes(frame)) throw new CycleError(`Cycle detected: ${[...ctx.stack, frame].join(\" → \")}`);\n if (ctx.stack.length >= MAX_DEPTH) throw new CycleError(`Flag references nest deeper than ${MAX_DEPTH} levels: ${ctx.stack.join(\" → \")}`);\n ctx.stack.push(frame);\n try {\n return fn();\n } finally {\n ctx.stack.pop();\n }\n}\n\nfunction segmentMatches(ctx: Ctx, key: string): boolean | undefined {\n const seg = ctx.payload.segments?.[key];\n if (!seg) return undefined;\n return enter(ctx, `segment:${key}`, () => {\n if (seg.kind === \"list\") {\n const t = textOf(lookupAttribute(ctx.attributes, seg.attribute));\n if (t === undefined) return false;\n const needle = seg.hashed ? hashConfidential(ctx.payload.salt ?? \"\", t) : t;\n return Array.isArray(seg.values) && seg.values.includes(needle);\n }\n if (seg.kind === \"conditions\") return allMatch(ctx, seg.conditions);\n return false;\n });\n}\n\nfunction compareFlag(op: FlagComparisonOperator, actual: unknown, expected: JsonValue | undefined): boolean {\n switch (op) {\n case \"isOn\":\n return isOn(actual);\n case \"isOff\":\n return !isOn(actual);\n case \"equals\":\n return jsonEquals(actual, expected ?? null);\n case \"notEquals\":\n return !jsonEquals(actual, expected ?? null);\n default:\n return false;\n }\n}\n\n/** Value of a referenced flag, or `undefined` when it does not exist. */\nfunction referencedValue(ctx: Ctx, key: string): { value: unknown } | undefined {\n const res = evalFlag(ctx, key);\n return res.reason === \"FLAG_NOT_FOUND\" ? undefined : { value: res.value };\n}\n\nfunction conditionMatches(ctx: Ctx, c: Condition): boolean {\n if (!c || typeof c !== \"object\") return false;\n switch (c.kind) {\n case \"attribute\":\n return evalAttribute(ctx, c);\n case \"segment\": {\n const m = segmentMatches(ctx, c.segment);\n if (m === undefined) return false;\n if (c.operator === \"in\") return m;\n if (c.operator === \"notIn\") return !m;\n return false;\n }\n case \"flag\": {\n const ref = referencedValue(ctx, c.flag);\n return ref ? compareFlag(c.operator, ref.value, c.value) : false;\n }\n case \"group\": {\n const list = Array.isArray(c.conditions) ? c.conditions : [];\n let r: boolean;\n if (c.op === \"and\") r = allMatch(ctx, list);\n else if (c.op === \"or\") r = list.some((x) => conditionMatches(ctx, x));\n else return false;\n return c.negate ? !r : r;\n }\n default:\n return false;\n }\n}\n\nfunction allMatch(ctx: Ctx, conditions: Condition[] | undefined): boolean {\n if (!conditions) return true;\n for (const c of conditions) if (!conditionMatches(ctx, c)) return false;\n return true;\n}\n\nfunction base(flag: FlagDefinition, value: JsonValue | undefined, reason: EvaluationResult[\"reason\"]): EvaluationResult {\n return { key: flag.key, value: value === undefined ? null : value, reason, inExperiment: false };\n}\n\nfunction stickyDocKey(attribute: string, value: string) {\n return `${attribute}||${value}`;\n}\n\nfunction runExperiment(ctx: Ctx, flag: FlagDefinition, rule: ExperimentRule): EvaluationResult | undefined {\n const variations = Array.isArray(rule.variations) ? rule.variations : [];\n if (!variations.length) return undefined;\n let hashAttribute = rule.hashAttribute;\n let hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n const fallbackValue = rule.fallbackAttribute ? hashValueOf(ctx.attributes, rule.fallbackAttribute) : undefined;\n if (hv === undefined && rule.fallbackAttribute && fallbackValue !== undefined) {\n hashAttribute = rule.fallbackAttribute;\n hv = fallbackValue;\n }\n if (hv === undefined) return undefined;\n\n const bucketVersion = rule.bucketVersion ?? 0;\n const useSticky = !!ctx.sticky && !rule.disableStickyBucketing;\n let index = -1;\n const bucket = hashBucket(rule.seed, hv);\n let stickyUsed = false;\n if (useSticky) {\n const merged: StickyAssignments = {};\n if (rule.fallbackAttribute && fallbackValue !== undefined) Object.assign(merged, ctx.sticky!.get(stickyDocKey(rule.fallbackAttribute, fallbackValue)) ?? {});\n const primary = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (primary !== undefined) Object.assign(merged, ctx.sticky!.get(stickyDocKey(rule.hashAttribute, primary)) ?? {});\n const prefix = `${rule.key}__`;\n const minVersion = rule.minBucketVersion ?? 0;\n for (const k of Object.keys(merged)) {\n if (!k.startsWith(prefix)) continue;\n const v = Number(k.slice(prefix.length));\n if (Number.isInteger(v) && v < minVersion) return undefined; // blocked from re-entering\n }\n const assigned = merged[`${prefix}${bucketVersion}`];\n if (assigned !== undefined) {\n const i = variations.findIndex((v) => v.id === assigned);\n if (i >= 0) {\n index = i;\n stickyUsed = true;\n }\n }\n }\n if (index < 0) {\n if (rule.namespace) {\n const n = hashBucket(`__${rule.namespace.id}`, hv);\n if (!(n >= rule.namespace.start && n < rule.namespace.end)) return undefined;\n }\n const coverage = clamp01(rule.coverage);\n let cum = 0;\n for (let i = 0; i < variations.length; i++) {\n const w = Math.max(0, Number(variations[i]!.weight) || 0);\n const start = cum;\n const end = cum + coverage * w;\n cum += w;\n if (bucket >= start && bucket < end) {\n index = i;\n break;\n }\n }\n if (index < 0) return undefined;\n if (useSticky) {\n const docKey = stickyDocKey(hashAttribute, hv);\n const doc = { ...(ctx.sticky!.get(docKey) ?? {}) };\n doc[`${rule.key}__${bucketVersion}`] = variations[index]!.id;\n ctx.sticky!.set(docKey, doc);\n }\n }\n const variation = variations[index]!;\n return {\n key: flag.key,\n value: variation.value === undefined ? null : variation.value,\n reason: \"EXPERIMENT\",\n ruleId: rule.id,\n variationId: variation.id,\n inExperiment: true,\n experiment: { key: rule.key, name: rule.name, variationId: variation.id, variationName: variation.name, variationIndex: index, hashAttribute, hashValue: hv, bucket, stickyBucketUsed: stickyUsed },\n };\n}\n\nfunction applyRule(ctx: Ctx, flag: FlagDefinition, rule: FlagRule): EvaluationResult | undefined {\n switch (rule.type) {\n case \"force\":\n return { ...base(flag, rule.value, \"RULE_MATCH\"), ruleId: rule.id, ...(rule.variationId ? { variationId: rule.variationId } : {}) };\n case \"rollout\": {\n const hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (hv === undefined) return undefined;\n if (hashBucket(rule.seed, hv) >= effectiveCoverage(rule, ctx.now)) return undefined;\n return { ...base(flag, rule.value, \"RULE_MATCH\"), ruleId: rule.id, ...(rule.variationId ? { variationId: rule.variationId } : {}) };\n }\n case \"split\": {\n const hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (hv === undefined || !Array.isArray(rule.buckets)) return undefined;\n const n = hashBucket(rule.seed, hv);\n let cum = 0;\n for (const b of rule.buckets) {\n cum += Math.max(0, Number(b.weight) || 0);\n if (n < cum) return { ...base(flag, b.value, \"RULE_MATCH\"), ruleId: rule.id, ...(b.variationId ? { variationId: b.variationId } : {}) };\n }\n return undefined;\n }\n case \"experiment\":\n return runExperiment(ctx, flag, rule);\n default:\n return undefined;\n }\n}\n\nfunction evalFlag(ctx: Ctx, key: string): EvaluationResult {\n const flag = ctx.payload.flags?.[key];\n if (!flag) return { key, value: null, reason: \"FLAG_NOT_FOUND\", inExperiment: false };\n return enter(ctx, `flag:${key}`, () => {\n if (!flag.enabled) return base(flag, flag.offValue, \"DISABLED\");\n for (const p of flag.prerequisites ?? []) {\n const ref = referencedValue(ctx, p.flag);\n if (!ref || !compareFlag(p.operator, ref.value, p.value)) return base(flag, flag.offValue, \"PREREQUISITE_FAILED\");\n }\n for (const h of ctx.payload.holdouts ?? []) {\n if (!Array.isArray(h.flags) || !h.flags.includes(key)) continue;\n const hv = hashValueOf(ctx.attributes, h.hashAttribute);\n if (hv !== undefined && hashBucket(h.seed, hv) < clamp01(h.coverage)) return base(flag, flag.defaultValue, \"HOLDOUT\");\n }\n for (const rule of flag.rules ?? []) {\n if (!rule || !isScheduleActive(rule.schedule, ctx.now)) continue;\n if (!allMatch(ctx, rule.conditions)) continue;\n const res = applyRule(ctx, flag, rule);\n if (res) return res;\n }\n return base(flag, flag.defaultValue, \"DEFAULT\");\n });\n}\n\n/** Evaluate one flag. Never throws: problems come back as reason `ERROR`. */\nexport function evaluateFlag(payload: FlagsPayload, key: string, attributes: Attributes = {}, options: EvaluateOptions = {}): EvaluationResult {\n const ctx: Ctx = { payload, attributes: attributes ?? {}, now: nowOf(options.now), sticky: options.stickyBuckets, stack: [] };\n try {\n return evalFlag(ctx, key);\n } catch (err) {\n return { key, value: null, reason: \"ERROR\", inExperiment: false, errorMessage: err instanceof Error ? err.message : String(err) };\n }\n}\n\n/** Evaluate every flag in the payload. */\nexport function evaluateAllFlags(payload: FlagsPayload, attributes: Attributes = {}, options: EvaluateOptions = {}): Record<string, EvaluationResult> {\n const out: Record<string, EvaluationResult> = {};\n for (const key of Object.keys(payload.flags ?? {})) out[key] = evaluateFlag(payload, key, attributes, options);\n return out;\n}\n","/** The getter surface shared by the client, `forUser()` evaluators and static (SSR) snapshots. */\nimport { evaluateFlag } from \"./evaluate\";\nimport type { Attributes, EvaluationResult, FlagsPayload, JsonValue, RemoteEvaluationResponse } from \"./types\";\nimport { isEncryptedPayload, isFlagsPayload, isRemoteResults, kindOf } from \"./util\";\n\n/** The value type a getter returns for a fallback: literals widen (`\"blue\"` → `string`), JSON types stay. */\nexport type FlagValue<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T;\n\n/** An evaluation result whose `value` is the caller's fallback when the flag is missing, null or of another type. */\nexport interface FlagDetails<T = JsonValue> extends Omit<EvaluationResult, \"value\"> {\n value: T;\n /** The fallback was served (flag missing, value null or of the wrong type). */\n usedFallback: boolean;\n}\n\n/** Synchronous flag getters. They never throw: problems give the fallback. */\nexport interface FlagsEvaluator {\n /** Boolean flag value; `fallback` (default `false`) when missing or not a boolean. */\n isEnabled(key: string, fallback?: boolean): boolean;\n /** Flag value; `fallback` when missing, null or of a different JSON type than `fallback`. */\n getValue<T extends JsonValue>(key: string, fallback: T): FlagValue<T>;\n getString(key: string, fallback: string): string;\n getNumber(key: string, fallback: number): number;\n getBoolean(key: string, fallback: boolean): boolean;\n /** Object or array value. */\n getJson<T = JsonValue>(key: string, fallback: T): T;\n /** Value plus why it was served (reason, rule, variation, experiment). */\n getDetails<T extends JsonValue>(key: string, fallback: T): FlagDetails<FlagValue<T>>;\n /** Every flag's value for these attributes (no exposures or usage are recorded). */\n getAll(): Record<string, JsonValue>;\n /** The attributes these getters evaluate with. */\n getAttributes(): Attributes;\n}\n\n/** What framework bindings read from: an evaluator that can say whether it has loaded and notify changes. */\nexport interface FlagsReader extends FlagsEvaluator {\n isReady(): boolean;\n /** Calls `listener` whenever values may have changed. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void;\n}\n\nexport type Resolver = (key: string) => EvaluationResult;\n\nfunction typeMatches(value: unknown, fallback: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (fallback === null || fallback === undefined) return true;\n return kindOf(value) === kindOf(fallback);\n}\n\n/** Builds the getters from a resolver (key → result). */\nexport function makeEvaluator(resolve: Resolver, all: () => Record<string, JsonValue>, attributes: () => Attributes): FlagsEvaluator {\n const details = <T,>(key: string, fallback: T): FlagDetails<T> => {\n const r = resolve(key);\n const ok = typeMatches(r.value, fallback);\n return { ...r, value: ok ? (r.value as T) : fallback, usedFallback: !ok };\n };\n const of = <T,>(type: string, key: string, fallback: T): T => {\n const v = resolve(key).value;\n return kindOf(v) === type ? (v as T) : fallback;\n };\n return {\n isEnabled: (key, fallback = false) => of(\"boolean\", key, fallback),\n getValue: <T extends JsonValue>(key: string, fallback: T) => details(key, fallback).value as FlagValue<T>,\n getString: (key, fallback) => of(\"string\", key, fallback),\n getNumber: (key, fallback) => of(\"number\", key, fallback),\n getBoolean: (key, fallback) => of(\"boolean\", key, fallback),\n getJson: <T,>(key: string, fallback: T) => {\n const v = resolve(key).value;\n return v !== null && typeof v === \"object\" ? (v as T) : fallback;\n },\n getDetails: details as FlagsEvaluator[\"getDetails\"],\n getAll: all,\n getAttributes: attributes,\n };\n}\n\nexport function notFound(key: string): EvaluationResult {\n return { key, value: null, reason: \"FLAG_NOT_FOUND\", inExperiment: false };\n}\n\nexport interface StaticFlagsInput {\n /** A payload (or remote-evaluation results) from `client.getPayload()` on the server. */\n payload?: FlagsPayload | RemoteEvaluationResponse | unknown;\n attributes?: Attributes;\n now?: Date | number;\n}\n\n/**\n * A network-free, read-only snapshot over a bootstrap payload. Framework bindings render with it\n * on the server and during hydration so the HTML matches; it records no exposures or usage.\n * Encrypted payloads cannot be read synchronously and give fallbacks.\n */\nexport function createStaticFlags(input: StaticFlagsInput = {}): FlagsReader {\n const attrs = { ...(input.attributes ?? {}) };\n const p = input.payload;\n const payload = isFlagsPayload(p) && !isEncryptedPayload(p) ? p : null;\n const results = !payload && isRemoteResults(p) ? p.flags : null;\n const resolve: Resolver = (key) => {\n try {\n if (payload) return evaluateFlag(payload, key, attrs, { now: input.now });\n return results?.[key] ?? notFound(key);\n } catch {\n return notFound(key);\n }\n };\n const all = () => {\n const out: Record<string, JsonValue> = {};\n for (const key of Object.keys(payload?.flags ?? results ?? {})) out[key] = resolve(key).value;\n return out;\n };\n return { ...makeEvaluator(resolve, all, () => ({ ...attrs })), isReady: () => !!(payload || results), subscribe: () => () => {} };\n}\n","/** Incremental `text/event-stream` parser for runtimes without `EventSource` (Node, Deno, Bun, edge). */\nexport function createSseParser(onEvent: (event: string, data: string) => void): { feed(chunk: string): void; end(): void } {\n let buffer = \"\";\n const dispatch = (raw: string) => {\n let event = \"message\";\n const data: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (!line || line.startsWith(\":\")) continue; // comments (`: ping`)\n const i = line.indexOf(\":\");\n const field = i < 0 ? line : line.slice(0, i);\n const value = i < 0 ? \"\" : line.slice(i + 1).replace(/^ /, \"\");\n if (field === \"event\") event = value;\n else if (field === \"data\") data.push(value);\n }\n if (data.length) onEvent(event, data.join(\"\\n\"));\n };\n return {\n feed(chunk) {\n buffer += chunk.replace(/\\r\\n?/g, \"\\n\");\n let sep: number;\n while ((sep = buffer.indexOf(\"\\n\\n\")) >= 0) {\n dispatch(buffer.slice(0, sep));\n buffer = buffer.slice(sep + 2);\n }\n },\n end() {\n if (buffer.trim()) dispatch(buffer);\n buffer = \"\";\n },\n };\n}\n","/**\n * The feature-flag client (docs/feature-flags-spec.md §4): downloads the environment's payload (or\n * asks the server to evaluate), keeps it fresh, evaluates locally and reports usage and exposures.\n * Isomorphic: browsers, Node ≥ 18, Next.js server and edge, Deno, Bun and React Native. Uses the\n * global `fetch` (injectable) and touches no DOM or Node API at module scope.\n */\nimport { decryptPayloadString } from \"./crypto\";\nimport { readDevOverrides } from \"./dev-overrides\";\nimport { evaluateFlag, textOf } from \"./evaluate\";\nimport { makeEvaluator, notFound, type FlagDetails, type FlagValue, type FlagsEvaluator, type FlagsReader } from \"./evaluator\";\nimport { createSseParser } from \"./sse\";\nimport type { Attributes, EncryptedFlagsPayload, EvaluationResult, ExperimentAssignment, FlagEventsBatch, FlagsPayload, JsonValue, RemoteEvaluationResponse, StickyBucketStore } from \"./types\";\nimport { compact, isDev, isEncryptedPayload, isFlagsPayload, isRemoteResults, parseUrlOverrides, stableStringify, timer } from \"./util\";\n\nexport const FLAGS_SDK_NAME = \"@guidelytech/flags\";\nexport const FLAGS_SDK_VERSION = \"0.13.0\";\nexport const DEFAULT_FLAGS_API_URL = \"https://guidelytech.com\";\n\n/**\n * - `auto` — fetch at start, then every `pollIntervalSeconds`.\n * - `lazy` — fetch when a flag is read and the cache is older than `cacheTtlSeconds` (serverless, edge).\n * - `manual` — only `refresh()` fetches.\n * - `stream` — server-sent events push changes; polls while the stream is down.\n */\nexport type PollingMode = \"auto\" | \"lazy\" | \"manual\" | \"stream\";\n/** `localOnly`: never fetch; serve overrides, then the bootstrap. `localOverRemote`: overrides win. `remoteOverLocal`: overrides fill in flags missing remotely. */\nexport type OverrideBehaviour = \"localOnly\" | \"localOverRemote\" | \"remoteOverLocal\";\n\n/** Key/value storage for the last payload: `localStorage`-like or AsyncStorage-like (sync or async). */\nexport interface FlagsStorage {\n getItem(key: string): string | null | undefined | Promise<string | null | undefined>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem?(key: string): void | Promise<void>;\n}\n\nexport interface FlagsLogger {\n debug?(...args: unknown[]): void;\n warn?(...args: unknown[]): void;\n error?(...args: unknown[]): void;\n}\n\n/** What a bootstrap / `getPayload()` can hold. */\nexport type FlagsBootstrap = FlagsPayload | EncryptedFlagsPayload | RemoteEvaluationResponse;\n\nexport interface FlagsClientOptions {\n /** Environment public key `pk_…` (the `projectId` used for tracking) or, on servers only, a secret `gly_sk_…` key. */\n sdkKey?: string;\n /** Alias of `sdkKey`. */\n projectId?: string;\n /** Base URL of your Guidely deployment (default `https://guidelytech.com`). */\n apiUrl?: string;\n /** `development` | `staging` | `production`. Required with a `gly_sk_` key. */\n environment?: string;\n /** Default attributes, merged under per-call (`forUser`) attributes. */\n attributes?: Attributes;\n /**\n * Attributes supplied by a Guidely SDK integration (identity, page, device). App attributes\n * (`attributes`, `setAttributes`) are merged over them.\n */\n contextAttributes?: Attributes;\n pollingMode?: PollingMode;\n /** `auto` / `stream` fallback polling interval (default 60). */\n pollIntervalSeconds?: number;\n /** `lazy` cache lifetime (default 60). */\n cacheTtlSeconds?: number;\n /** Bootstrap: a payload (plain or encrypted) or remote-evaluation results, used immediately. */\n payload?: FlagsBootstrap | null;\n /** Bootstrap for remote evaluation: `{ version, flags }` or a map of results. */\n remoteResults?: RemoteEvaluationResponse | Record<string, EvaluationResult> | null;\n /** Base64 AES-256 key for environments that encrypt their payload. */\n decryptionKey?: string;\n /** Ask the server to evaluate (`POST /flags/evaluate`) instead of downloading rules. Needed when the environment hides rules. */\n remoteEval?: boolean;\n /** Debounce for re-evaluating remotely after attribute changes (default 50 ms). */\n remoteEvalDebounceMs?: number;\n /** Local flag values (tests, QA, kill switches) applied per `overrideBehaviour`. */\n overrides?: Record<string, JsonValue> | null;\n overrideBehaviour?: OverrideBehaviour;\n /**\n * Read dev overrides from outside the code (default `true`): `GUIDELY_FLAG_OVERRIDES`,\n * `GUIDELY_FLAG_OVERRIDES_FILE` and `GUIDELY_FLAG_OVERRIDE_BEHAVIOUR` environment variables, and\n * the `__GUIDELY_FLAG_OVERRIDES__` / `__GUIDELY_FLAG_OVERRIDE_BEHAVIOUR__` globals (browser tests).\n * They win over `overrides`, and their behaviour over `overrideBehaviour`.\n */\n devOverrides?: boolean;\n /** Keeps experiment assignments stable (`InMemoryStickyBucketStore`, `LocalStorageStickyBucketStore`). */\n stickyBucketService?: StickyBucketStore;\n /** Persists the last payload. Default: `localStorage` in browsers, none elsewhere. `false` disables. */\n storage?: FlagsStorage | null | false;\n /** Browser only: read `?guidely_flags=key:value,key2:\"text\"` from the URL as overrides (QA). */\n enableUrlOverrides?: boolean;\n /** Called once per (experiment, user, variation) when a user is bucketed into an experiment. */\n trackingCallback?: (experiment: ExperimentAssignment, result: EvaluationResult) => void;\n /** Send experiment exposures to Guidely (`POST /flags/events`). Default: `true` unless `trackingCallback` is set. */\n trackExposures?: boolean;\n /** Send aggregated evaluation counts to Guidely at most every 60 s (default `true`). */\n reportUsage?: boolean;\n onReady?: () => void;\n /** New payload (or remote results) applied. */\n onChange?: (data: FlagsPayload | RemoteEvaluationResponse) => void;\n onFlagEvaluated?: (result: EvaluationResult) => void;\n onError?: (error: Error) => void;\n /** Start without network activity (cached / bootstrapped data keeps serving). */\n offline?: boolean;\n fetch?: typeof fetch;\n /**\n * Defaults to `console`: `error` for failed requests (once per streak), `warn` for misuse and,\n * in development, reads of flags that do not exist. `null` silences the client.\n */\n logger?: FlagsLogger | null;\n /** Evaluation clock (tests). */\n now?: () => Date | number;\n /** Reported with usage (set by Guidely SDK integrations). */\n sdk?: { name: string; version: string };\n}\n\ninterface Resolved {\n mode: PollingMode;\n pollMs: number;\n ttlMs: number;\n debounceMs: number;\n behaviour: OverrideBehaviour;\n trackExposures: boolean;\n reportUsage: boolean;\n}\n\ntype Exposure = NonNullable<FlagEventsBatch[\"exposures\"]>[number];\ninterface HttpResult<T> {\n status: number;\n ok: boolean;\n data: T | null;\n etag: string | null;\n}\n\nconst SECRET_PREFIX = \"gly_sk_\";\nconst MAX_RESULT_CACHE = 20;\nconst MAX_QUEUE = 1000;\nconst USAGE_FLUSH_MS = 60_000;\nconst EXPOSURE_FLUSH_MS = 5_000;\nconst MAX_BACKOFF_MS = 5 * 60_000;\n\nconst isBrowser = () => typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nfunction defaultStorage(): FlagsStorage | null {\n try {\n if (!isBrowser() || typeof localStorage === \"undefined\") return null;\n const probe = \"__guidely_flags_probe__\";\n localStorage.setItem(probe, \"1\");\n localStorage.removeItem(probe);\n return localStorage;\n } catch {\n return null;\n }\n}\n\nfunction backoff(failures: number, capMs: number): number {\n const base = Math.min(capMs, 1000 * 2 ** Math.max(0, failures - 1));\n return Math.round(base * (0.8 + Math.random() * 0.4));\n}\n\n/**\n * Feature flags for one environment. Create with {@link createFlagsClient}; one per app (browser)\n * or per process (server — use {@link FlagsClient.forUser} per request).\n */\nexport class FlagsClient implements FlagsReader {\n readonly sdkKey: string;\n readonly apiUrl: string;\n readonly environment: string | undefined;\n private readonly o: FlagsClientOptions;\n private readonly cfg: Resolved;\n private readonly secret: boolean;\n private readonly log: FlagsLogger;\n private readonly storage: FlagsStorage | null;\n private readonly storageKey: string;\n private readonly getters: FlagsEvaluator;\n private payload: FlagsPayload | null = null;\n /** The payload as received (possibly encrypted): what `getPayload()` hands to browsers. */\n private raw: FlagsPayload | EncryptedFlagsPayload | null = null;\n private etag: string | null = null;\n private remote: boolean;\n private results: RemoteEvaluationResponse | null = null;\n private resultsKey: string | null = null;\n private readonly resultCache = new Map<string, RemoteEvaluationResponse>();\n private context: Attributes;\n private attributes: Attributes;\n private overrides: Record<string, JsonValue>;\n private readonly devOverrides: Record<string, JsonValue>;\n private readonly urlOverrides: Record<string, JsonValue>;\n private offline: boolean;\n private destroyed = false;\n private ready_ = false;\n private resolveReady!: () => void;\n private readonly readyPromise: Promise<void>;\n private readonly listeners = new Set<() => void>();\n private inflight: Promise<boolean> | null = null;\n private lastFetchAt = 0;\n private failures = 0;\n private retryAt = 0;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private remoteTimer: ReturnType<typeof setTimeout> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private flushDue = Infinity;\n private stream: { close(): void } | null = null;\n private streamConnected = false;\n private streamFailures = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly exposed = new Set<string>();\n private readonly usage = new Map<string, { flag: string; variationId?: string; value: string; count: number }>();\n private exposures: Exposure[] = [];\n private readonly warned = new Set<string>();\n private cleanups: Array<() => void> = [];\n private lastError = \"\";\n\n constructor(options: FlagsClientOptions) {\n const o = options ?? {};\n this.o = o;\n const key = o.sdkKey ?? o.projectId ?? \"\";\n if (!key) throw new Error(\"[Guidely flags] `sdkKey` (your environment public key pk_…, or a gly_sk_… secret key on servers) is required.\");\n this.sdkKey = key;\n this.secret = key.startsWith(SECRET_PREFIX);\n this.environment = o.environment;\n this.apiUrl = (o.apiUrl || DEFAULT_FLAGS_API_URL).replace(/\\/+$/, \"\");\n this.log = o.logger === null ? {} : (o.logger ?? { warn: (...a) => console.warn(\"[Guidely flags]\", ...a), error: (...a) => console.error(\"[Guidely flags]\", ...a) });\n if (this.secret && !o.environment) throw new Error(\"[Guidely flags] `environment` (development | staging | production) is required with a gly_sk_ key.\");\n if (this.secret && isBrowser()) this.log.warn?.(\"A gly_sk_ secret key is being used in a browser. Secret keys belong on servers; use the environment's public pk_ key here.\");\n const dev = o.devOverrides === false ? null : readDevOverrides();\n this.cfg = {\n mode: o.pollingMode ?? \"auto\",\n pollMs: Math.max(1, o.pollIntervalSeconds ?? 60) * 1000,\n ttlMs: Math.max(0, o.cacheTtlSeconds ?? 60) * 1000,\n debounceMs: Math.max(0, o.remoteEvalDebounceMs ?? 50),\n behaviour: dev?.behaviour ?? o.overrideBehaviour ?? \"localOverRemote\",\n trackExposures: o.trackExposures ?? !o.trackingCallback,\n reportUsage: o.reportUsage ?? true,\n };\n this.remote = !!o.remoteEval;\n this.offline = !!o.offline;\n this.context = compact(o.contextAttributes ?? {});\n this.attributes = compact(o.attributes ?? {});\n this.overrides = { ...(o.overrides ?? {}) };\n this.devOverrides = dev?.values ?? {};\n this.urlOverrides = o.enableUrlOverrides && isBrowser() ? parseUrlOverrides(location.search) : {};\n this.storage = o.storage === false || o.storage === null ? null : (o.storage ?? defaultStorage());\n this.storageKey = `guidely:flags:${key}${o.environment && this.secret ? `:${o.environment}` : \"\"}`;\n this.readyPromise = new Promise<void>((r) => (this.resolveReady = r));\n if (dev) {\n dev.errors.forEach((e) => this.reportError(new Error(e)));\n const n = Object.keys(dev.values).length;\n if (dev.sources.length) this.log.warn?.(`Dev overrides from ${dev.sources.join(\", \")}: ${n} flag${n === 1 ? \"\" : \"s\"}, behaviour ${this.cfg.behaviour}.`);\n }\n this.getters = makeEvaluator(\n (k) => this.resolve(k, this.getAttributes(), true),\n () => this.all(this.getAttributes()),\n () => this.getAttributes(),\n );\n\n // Synchronous bootstrap: plain payloads and remote results serve from the first render.\n const boot = o.payload;\n if (isRemoteResults(boot)) this.setResults(boot, stableStringify(this.getAttributes()), false);\n else if (isFlagsPayload(boot) && !isEncryptedPayload(boot)) this.setPayload(boot, boot, null, false);\n if (o.remoteResults) {\n const r = o.remoteResults as RemoteEvaluationResponse;\n this.setResults(isRemoteResults(r) && typeof r.version === \"number\" ? r : { version: 0, flags: o.remoteResults as Record<string, EvaluationResult> }, stableStringify(this.getAttributes()), false);\n }\n if (this.results) this.remote = true;\n this.wireBrowser();\n // Bootstrapped (plain payload or results): ready now, so server and browser render the same.\n if (this.payload || this.results) this.settle();\n void this.start();\n }\n\n // ---------------------------------------------------------------------------\n // Getters (never throw)\n // ---------------------------------------------------------------------------\n\n /** Boolean flag value; `fallback` (default `false`) when missing or not a boolean. */\n isEnabled(key: string, fallback = false): boolean {\n return this.getters.isEnabled(key, fallback);\n }\n /** Flag value; `fallback` when missing, null or of a different JSON type than `fallback`. */\n getValue<T extends JsonValue>(key: string, fallback: T): FlagValue<T> {\n return this.getters.getValue(key, fallback);\n }\n getString(key: string, fallback: string): string {\n return this.getters.getString(key, fallback);\n }\n getNumber(key: string, fallback: number): number {\n return this.getters.getNumber(key, fallback);\n }\n getBoolean(key: string, fallback: boolean): boolean {\n return this.getters.getBoolean(key, fallback);\n }\n getJson<T = JsonValue>(key: string, fallback: T): T {\n return this.getters.getJson(key, fallback);\n }\n /** Value plus reason, rule, variation and experiment assignment. */\n getDetails<T extends JsonValue>(key: string, fallback: T): FlagDetails<FlagValue<T>> {\n return this.getters.getDetails(key, fallback);\n }\n /** Every flag's value for the current attributes (records no exposures or usage). */\n getAll(): Record<string, JsonValue> {\n return this.getters.getAll();\n }\n\n /**\n * Getters bound to other attributes (merged over the client's), without changing the client:\n * the per-request pattern on servers. With remote evaluation they serve results already cached\n * for these attributes, else fallbacks.\n */\n forUser(attributes: Attributes): FlagsEvaluator {\n const attrs = { ...this.getAttributes(), ...compact(attributes ?? {}) };\n if (this.remote) this.warnOnce(\"forUser:remote\", \"forUser() with remote evaluation only serves results cached for those attributes.\");\n return makeEvaluator(\n (k) => this.resolve(k, attrs, true),\n () => this.all(attrs),\n () => ({ ...attrs }),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Attributes and overrides\n // ---------------------------------------------------------------------------\n\n /** Replaces the app attributes. */\n setAttributes(attributes: Attributes): void {\n this.changeAttributes(() => (this.attributes = compact(attributes ?? {})));\n }\n /** Merges into the app attributes. */\n updateAttributes(partial: Attributes): void {\n this.changeAttributes(() => (this.attributes = compact({ ...this.attributes, ...partial })));\n }\n /** Replaces the integration-supplied attributes (see `contextAttributes`). */\n setContextAttributes(attributes: Attributes): void {\n this.changeAttributes(() => (this.context = compact(attributes ?? {})));\n }\n /** Context attributes with app attributes merged over them. */\n getAttributes(): Attributes {\n return { ...this.context, ...this.attributes };\n }\n\n /** Replaces the overrides (`null` clears them). Dev and URL overrides stay. */\n setOverrides(overrides: Record<string, JsonValue> | null): void {\n this.overrides = { ...(overrides ?? {}) };\n this.notify();\n }\n\n private changeAttributes(apply: () => void): void {\n const before = stableStringify(this.getAttributes());\n apply();\n const after = stableStringify(this.getAttributes());\n if (before === after) return;\n if (this.remote) {\n const cached = this.resultCache.get(after);\n if (cached) {\n this.results = cached;\n this.resultsKey = after;\n }\n this.scheduleRemote();\n }\n this.notify();\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /** Resolves once the first load settled (bootstrap, network success or failure). Never rejects. */\n ready(): Promise<void> {\n return this.readyPromise;\n }\n isReady(): boolean {\n return this.ready_;\n }\n\n /** Calls `listener` whenever values may have changed (payload, attributes, overrides, readiness). */\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => void this.listeners.delete(listener);\n };\n\n /** `true` stops all network activity; cached data keeps serving. `false` resumes and refreshes. */\n setOffline(offline: boolean): void {\n if (this.offline === offline) return;\n this.offline = offline;\n if (offline) return this.stopNetwork();\n void this.refresh().then(() => this.schedule());\n }\n\n /** Fetches now (payload, or remote evaluation). Resolves when done; never rejects. */\n async refresh(): Promise<void> {\n await this.fetchNow();\n }\n\n /**\n * The current data for server-side rendering: pass it as `payload` to the browser client (or\n * framework provider) to render the same values without a flash. Encrypted payloads stay\n * encrypted; with remote evaluation it returns the results. `null` before anything loaded.\n */\n getPayload(): FlagsBootstrap | null {\n if (this.remote) return this.results;\n return this.raw;\n }\n\n /** Sends pending usage counts and exposures now. */\n async flush(): Promise<void> {\n const batch = this.takeBatch();\n if (!batch) return;\n try {\n const res = await this.request<unknown>(\"POST\", \"/flags/events\", { body: batch, keepalive: true });\n if (!res.ok && (res.status >= 500 || res.status === 429)) this.requeue(batch);\n } catch {\n this.requeue(batch);\n }\n }\n\n /** Stops timers and streams and sends pending usage. The client keeps serving cached values. */\n destroy(): void {\n if (this.destroyed) return;\n this.flushOnExit();\n this.destroyed = true;\n this.stopNetwork();\n if (this.flushTimer) clearTimeout(this.flushTimer);\n this.cleanups.splice(0).forEach((fn) => fn());\n this.listeners.clear();\n this.settle();\n }\n\n // ---------------------------------------------------------------------------\n // Evaluation\n // ---------------------------------------------------------------------------\n\n private overrideFor(key: string): JsonValue | undefined {\n if (Object.prototype.hasOwnProperty.call(this.urlOverrides, key)) return this.urlOverrides[key];\n if (Object.prototype.hasOwnProperty.call(this.devOverrides, key)) return this.devOverrides[key];\n if (Object.prototype.hasOwnProperty.call(this.overrides, key)) return this.overrides[key];\n return undefined;\n }\n\n private resolve(key: string, attrs: Attributes, track: boolean): EvaluationResult {\n let res: EvaluationResult;\n try {\n if (this.cfg.mode === \"lazy\") this.lazyRefresh();\n const ov = this.overrideFor(key);\n const forced = Object.prototype.hasOwnProperty.call(this.urlOverrides, key);\n const override: EvaluationResult | null = ov === undefined ? null : { key, value: ov, reason: \"OVERRIDE\", inExperiment: false };\n if (override && (forced || this.cfg.behaviour !== \"remoteOverLocal\")) res = override;\n else {\n res = this.evaluateRemoteOrLocal(key, attrs);\n if (override && res.reason === \"FLAG_NOT_FOUND\") res = override;\n }\n } catch (err) {\n res = { key, value: null, reason: \"ERROR\", inExperiment: false, errorMessage: err instanceof Error ? err.message : String(err) };\n }\n if (track) this.record(res, attrs);\n return res;\n }\n\n private evaluateRemoteOrLocal(key: string, attrs: Attributes): EvaluationResult {\n if (this.remote) {\n const k = stableStringify(attrs);\n const results = k === this.resultsKey || k === stableStringify(this.getAttributes()) ? this.results : this.resultCache.get(k);\n return results?.flags[key] ?? notFound(key);\n }\n if (!this.payload) return notFound(key);\n return evaluateFlag(this.payload, key, attrs, { now: this.now(), stickyBuckets: this.o.stickyBucketService });\n }\n\n private all(attrs: Attributes): Record<string, JsonValue> {\n const keys = new Set<string>([...Object.keys(this.overrides), ...Object.keys(this.devOverrides), ...Object.keys(this.urlOverrides)]);\n if (this.remote) for (const k of Object.keys(this.results?.flags ?? {})) keys.add(k);\n else for (const k of Object.keys(this.payload?.flags ?? {})) keys.add(k);\n const out: Record<string, JsonValue> = {};\n for (const k of keys) {\n const v = this.resolve(k, attrs, false).value;\n if (v !== null) out[k] = v;\n }\n return out;\n }\n\n private now(): number {\n const n = this.o.now?.();\n return n === undefined ? Date.now() : typeof n === \"number\" ? n : n.getTime();\n }\n\n private record(res: EvaluationResult, attrs: Attributes): void {\n try {\n this.o.onFlagEvaluated?.(res);\n } catch (err) {\n this.reportError(err);\n }\n if (res.reason === \"FLAG_NOT_FOUND\") {\n if (this.ready_ && (this.payload || this.results) && isDev()) this.warnOnce(`missing:${res.key}`, `Flag \"${res.key}\" does not exist in this environment; serving the fallback.`);\n return;\n }\n if (res.reason === \"OVERRIDE\" || res.reason === \"ERROR\") return;\n if (this.cfg.reportUsage) {\n const value = (JSON.stringify(res.value) ?? \"null\").slice(0, 200);\n const k = `${res.key}\\u0000${res.variationId ?? \"\"}\\u0000${res.variationId ? \"\" : value}`;\n const u = this.usage.get(k);\n if (u) u.count++;\n else if (this.usage.size < MAX_QUEUE) this.usage.set(k, { flag: res.key, ...(res.variationId ? { variationId: res.variationId } : {}), value, count: 1 });\n this.scheduleFlush(USAGE_FLUSH_MS);\n }\n const exp = res.inExperiment ? res.experiment : undefined;\n if (!exp) return;\n const dedupe = `${exp.key}\\u0000${exp.hashValue}\\u0000${exp.variationId}`;\n if (this.exposed.has(dedupe)) return;\n if (this.exposed.size >= 50_000) this.exposed.clear(); // long-running servers evaluating many users\n this.exposed.add(dedupe);\n try {\n this.o.trackingCallback?.(exp, res);\n } catch (err) {\n this.reportError(err);\n }\n if (!this.cfg.trackExposures) return;\n const userId = textOf(attrs.id);\n const anonymousId = textOf(attrs.anonymousId);\n if (this.exposures.length < MAX_QUEUE) {\n this.exposures.push({ experiment: exp.key, flag: res.key, variationId: exp.variationId, hashAttribute: exp.hashAttribute, hashValue: exp.hashValue, ...(userId ? { userId } : {}), ...(anonymousId ? { anonymousId } : {}), timestamp: new Date(this.now()).toISOString() });\n }\n this.scheduleFlush(EXPOSURE_FLUSH_MS);\n }\n\n private warnOnce(id: string, message: string): void {\n if (this.warned.has(id)) return;\n this.warned.add(id);\n this.log.warn?.(message);\n }\n\n // ---------------------------------------------------------------------------\n // Data\n // ---------------------------------------------------------------------------\n\n private setPayload(payload: FlagsPayload, raw: FlagsPayload | EncryptedFlagsPayload, etag: string | null, emit: boolean): void {\n const same = this.payload && this.payload.version === payload.version && this.payload.generatedAt === payload.generatedAt && this.payload.environment === payload.environment;\n this.payload = payload;\n this.raw = raw;\n this.etag = etag;\n if (!emit || same) return;\n try {\n this.o.onChange?.(payload);\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n private setResults(results: RemoteEvaluationResponse, key: string, emit: boolean): void {\n this.resultCache.delete(key);\n this.resultCache.set(key, results);\n while (this.resultCache.size > MAX_RESULT_CACHE) this.resultCache.delete(this.resultCache.keys().next().value!);\n if (key !== stableStringify(this.getAttributes())) return; // attributes moved on meanwhile\n const same = this.results && stableStringify(this.results) === stableStringify(results);\n this.results = results;\n this.resultsKey = key;\n if (!emit || same) return;\n try {\n this.o.onChange?.(results);\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n /** Decrypts when needed and applies. Returns false (keeping the previous payload) when unusable. */\n private async applyRaw(raw: unknown, etag: string | null): Promise<boolean> {\n if (isEncryptedPayload(raw)) {\n if (!this.o.decryptionKey) {\n this.reportError(new Error(\"The payload is encrypted but no `decryptionKey` was given; keeping the previous flags.\"));\n return false;\n }\n try {\n const plain = JSON.parse(await decryptPayloadString(raw.encryptedPayload, this.o.decryptionKey)) as Partial<FlagsPayload>;\n const envelope: Record<string, unknown> = { ...raw };\n delete envelope.encryptedPayload;\n const merged = { ...envelope, ...plain } as FlagsPayload;\n if (!isFlagsPayload(merged)) throw new Error(\"decrypted payload has no flags\");\n this.setPayload(merged, raw, etag, true);\n return true;\n } catch (err) {\n this.reportError(new Error(`Could not decrypt the flags payload (${err instanceof Error ? err.message : String(err)}); keeping the previous flags.`));\n return false;\n }\n }\n if (!isFlagsPayload(raw)) {\n this.reportError(new Error(\"Unexpected flags payload; keeping the previous flags.\"));\n return false;\n }\n this.setPayload(raw, raw, etag, true);\n return true;\n }\n\n private async loadStored(): Promise<void> {\n if (!this.storage) return;\n try {\n const text = await this.storage.getItem(this.storageKey);\n if (!text || this.payload) return;\n const saved = JSON.parse(text) as { payload?: unknown; etag?: string | null };\n if (saved?.payload && !this.payload) await this.applyRaw(saved.payload, saved.etag ?? null);\n } catch (err) {\n this.log.debug?.(\"could not read cached flags\", err);\n }\n }\n\n private persist(): void {\n if (!this.storage || !this.raw) return;\n try {\n void Promise.resolve(this.storage.setItem(this.storageKey, JSON.stringify({ payload: this.raw, etag: this.etag, savedAt: new Date().toISOString() }))).catch(() => {});\n } catch {\n /* quota / private mode */\n }\n }\n\n // ---------------------------------------------------------------------------\n // Network\n // ---------------------------------------------------------------------------\n\n private url(path: string): string {\n const q = this.secret ? `environment=${encodeURIComponent(this.environment ?? \"\")}` : `key=${encodeURIComponent(this.sdkKey)}`;\n return `${this.apiUrl}/api/v1/sdk${path}?${q}`;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n return { ...extra, ...(this.secret ? { Authorization: `Bearer ${this.sdkKey}` } : { \"X-Guidely-Key\": this.sdkKey }) };\n }\n\n private get fetcher(): typeof fetch | null {\n if (this.o.fetch) return this.o.fetch;\n return typeof fetch === \"function\" ? fetch.bind(globalThis) : null;\n }\n\n private async request<T>(method: \"GET\" | \"POST\", path: string, opts: { body?: unknown; etag?: string | null; keepalive?: boolean; timeoutMs?: number } = {}): Promise<HttpResult<T>> {\n const f = this.fetcher;\n if (!f) throw new Error(\"fetch is not available; pass `fetch`\");\n const headers = this.headers({ Accept: \"application/json\" });\n if (opts.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n if (opts.etag) headers[\"If-None-Match\"] = opts.etag;\n const ac = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const t = ac ? timer(() => ac.abort(), opts.timeoutMs ?? 10_000) : null;\n try {\n // `credentials` / `keepalive` only in browsers: some edge runtimes reject unknown RequestInit fields.\n const browserOnly: RequestInit = isBrowser() ? { credentials: \"omit\", keepalive: opts.keepalive } : {};\n const res = await f(this.url(path), { method, headers, body: opts.body === undefined ? undefined : JSON.stringify(opts.body), signal: ac?.signal, ...browserOnly });\n let data: T | null = null;\n if (res.status !== 304 && res.status !== 204) {\n try {\n data = (await res.json()) as T;\n } catch {\n data = null;\n }\n }\n return { status: res.status, ok: res.ok, data, etag: res.headers?.get?.(\"etag\") ?? null };\n } finally {\n if (t) clearTimeout(t);\n }\n }\n\n private fetchNow(): Promise<boolean> {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return Promise.resolve(false);\n if (this.inflight) return this.inflight;\n this.inflight = (this.remote ? this.fetchRemote() : this.fetchPayload())\n .catch((err) => {\n this.reportError(err);\n return false;\n })\n .then((ok) => {\n this.inflight = null;\n this.lastFetchAt = Date.now();\n this.failures = ok ? 0 : this.failures + 1;\n this.retryAt = ok ? 0 : Date.now() + backoff(this.failures, Math.max(this.cfg.pollMs, MAX_BACKOFF_MS));\n if (ok) this.lastError = \"\";\n return ok;\n });\n return this.inflight;\n }\n\n private async fetchPayload(): Promise<boolean> {\n let res: HttpResult<unknown>;\n try {\n res = await this.request<unknown>(\"GET\", \"/flags\", { etag: this.payload ? this.etag : null });\n } catch (err) {\n this.reportError(new Error(`Flags request failed: ${err instanceof Error ? err.message : String(err)}`));\n return false;\n }\n if (res.status === 304) return true;\n const code = (res.data as { error?: { code?: string } } | null)?.error?.code;\n if (res.status === 403 && code === \"remote_evaluation_required\" && !this.secret) {\n // The environment hides its rules from public keys: evaluate on the server instead.\n this.log.warn?.(\"This environment requires remote evaluation; switching to `remoteEval: true`.\");\n this.remote = true;\n return this.fetchRemote();\n }\n if (!res.ok || res.data == null) {\n this.reportError(new Error(`Flags request failed (${res.status}${code ? ` ${code}` : \"\"})${this.payload ? \"; serving the last good flags\" : \"\"}`));\n return false;\n }\n const applied = await this.applyRaw(res.data, res.etag);\n if (applied) this.persist();\n return applied;\n }\n\n private async fetchRemote(): Promise<boolean> {\n const attrs = this.getAttributes();\n const key = stableStringify(attrs);\n let res: HttpResult<RemoteEvaluationResponse>;\n try {\n res = await this.request<RemoteEvaluationResponse>(\"POST\", \"/flags/evaluate\", { body: { attributes: attrs } });\n } catch (err) {\n this.reportError(new Error(`Remote evaluation failed: ${err instanceof Error ? err.message : String(err)}`));\n return false;\n }\n if (!res.ok || !res.data || !isRemoteResults(res.data)) {\n this.reportError(new Error(`Remote evaluation failed (${res.status})`));\n return false;\n }\n this.setResults(res.data, key, true);\n return true;\n }\n\n private scheduleRemote(): void {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return;\n if (this.remoteTimer) clearTimeout(this.remoteTimer);\n this.remoteTimer = timer(() => {\n this.remoteTimer = null;\n void this.fetchRemote().then((ok) => {\n if (!ok) this.failures++;\n });\n }, this.cfg.debounceMs);\n }\n\n private lazyRefresh(): void {\n if (this.inflight || this.offline || this.destroyed || this.cfg.behaviour === \"localOnly\") return;\n const now = Date.now();\n if (now - this.lastFetchAt < this.cfg.ttlMs || now < this.retryAt) return;\n this.lastFetchAt = now; // one fetch per expiry, however many reads\n void this.fetchNow();\n }\n\n private async start(): Promise<void> {\n const boot = this.o.payload;\n if (isEncryptedPayload(boot)) await this.applyRaw(boot, null);\n // localOnly is hermetic: a payload cached by an earlier run must not leak into tests.\n if (!this.payload && !this.results && !this.remote && this.cfg.behaviour !== \"localOnly\") await this.loadStored();\n if (this.destroyed) return;\n const bootstrapped = !!(boot || this.o.remoteResults) && !!(this.payload || this.results);\n if (this.cfg.behaviour === \"localOnly\" || this.offline || this.cfg.mode === \"manual\") return this.settle();\n if (bootstrapped) {\n // Serve the bootstrap from the first render, then revalidate straight away: a server-rendered\n // payload can be a poll interval old, and a kill switch must not wait another one.\n this.settle();\n await this.fetchNow();\n return this.schedule();\n }\n await this.fetchNow();\n this.settle();\n this.schedule();\n }\n\n private settle(): void {\n if (this.ready_) return;\n this.ready_ = true;\n this.resolveReady();\n try {\n this.o.onReady?.();\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n /** Arms the poll timer / stream for the current mode. */\n private schedule(): void {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return;\n if (this.cfg.mode === \"auto\") this.schedulePoll();\n else if (this.cfg.mode === \"stream\") {\n if (!this.stream) this.openStream();\n if (!this.streamConnected) this.schedulePoll();\n }\n }\n\n private schedulePoll(): void {\n if (this.pollTimer) clearTimeout(this.pollTimer);\n const delay = this.failures ? Math.max(0, this.retryAt - Date.now()) : this.cfg.pollMs;\n this.pollTimer = timer(() => {\n this.pollTimer = null;\n if (this.cfg.mode === \"stream\" && this.streamConnected) return;\n if (isBrowser() && document.visibilityState === \"hidden\") return this.schedulePoll(); // resumes on visibilitychange\n void this.fetchNow().then(() => this.schedule());\n }, delay);\n }\n\n private stopNetwork(): void {\n for (const t of [this.pollTimer, this.remoteTimer, this.reconnectTimer]) if (t) clearTimeout(t);\n this.pollTimer = this.remoteTimer = this.reconnectTimer = null;\n this.stream?.close();\n this.stream = null;\n this.streamConnected = false;\n }\n\n // ---------------------------------------------------------------------------\n // Streaming\n // ---------------------------------------------------------------------------\n\n private onStreamEvent(event: string, data: string): void {\n if (event !== \"flags\") return;\n let version: number | undefined;\n try {\n version = (JSON.parse(data) as { version?: number }).version;\n } catch {\n return;\n }\n const current = this.remote ? (this.results?.version ?? -1) : (this.payload?.version ?? -1);\n if (typeof version === \"number\" && version > current) void this.fetchNow();\n }\n\n private openStream(): void {\n if (this.destroyed || this.offline || this.stream) return;\n const url = this.url(\"/flags/stream\");\n const ES = (globalThis as { EventSource?: typeof EventSource }).EventSource;\n const opened = () => {\n this.streamConnected = true;\n this.streamFailures = 0;\n if (this.pollTimer) clearTimeout(this.pollTimer);\n this.pollTimer = null;\n };\n if (ES && !this.secret) {\n // EventSource cannot send headers: the public key travels in the query string.\n const es = new ES(url);\n es.addEventListener(\"flags\", (e) => this.onStreamEvent(\"flags\", (e as MessageEvent).data as string));\n es.onopen = opened;\n es.onerror = () => {\n es.close();\n if (this.stream === handle) this.streamDown();\n };\n const handle = { close: () => es.close() };\n this.stream = handle;\n return;\n }\n const f = this.fetcher;\n if (!f || typeof TextDecoder === \"undefined\") return this.streamDown(true);\n const ac = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const handle = { close: () => ac?.abort() };\n this.stream = handle;\n void (async () => {\n try {\n const res = await f(url, { headers: this.headers({ Accept: \"text/event-stream\" }), signal: ac?.signal, ...(isBrowser() ? { credentials: \"omit\" as const } : {}) });\n const reader = res.ok ? (res.body as ReadableStream<Uint8Array> | null)?.getReader?.() : undefined;\n if (!reader) {\n if (this.stream === handle) this.streamDown(res.ok); // no streaming body (React Native): poll instead\n return;\n }\n opened();\n const parser = createSseParser((event, data) => this.onStreamEvent(event, data));\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n if (done) break;\n }\n parser.end();\n } catch {\n /* aborted or dropped */\n }\n if (this.stream === handle) this.streamDown();\n })();\n }\n\n /** The stream dropped: poll meanwhile and reconnect with backoff (`permanent`: never retry). */\n private streamDown(permanent = false): void {\n this.stream = null;\n this.streamConnected = false;\n if (this.destroyed || this.offline) return;\n this.schedulePoll();\n if (permanent) return;\n this.streamFailures++;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = timer(() => {\n this.reconnectTimer = null;\n this.openStream();\n void this.fetchNow(); // catch up on changes missed while disconnected\n }, backoff(this.streamFailures, MAX_BACKOFF_MS));\n }\n\n // ---------------------------------------------------------------------------\n // Usage + exposures\n // ---------------------------------------------------------------------------\n\n private scheduleFlush(ms: number): void {\n if (this.destroyed) return;\n const due = Date.now() + ms;\n if (this.flushTimer && due >= this.flushDue) return;\n if (this.flushTimer) clearTimeout(this.flushTimer);\n this.flushDue = due;\n this.flushTimer = timer(() => {\n this.flushTimer = null;\n this.flushDue = Infinity;\n if (!this.offline) void this.flush();\n else if (this.usage.size || this.exposures.length) this.scheduleFlush(USAGE_FLUSH_MS);\n }, ms);\n }\n\n private takeBatch(): FlagEventsBatch | null {\n if (!this.usage.size && !this.exposures.length) return null;\n if (this.cfg.behaviour === \"localOnly\") {\n // localOnly makes no requests at all: nothing a test evaluates reaches Guidely.\n this.usage.clear();\n this.exposures = [];\n return null;\n }\n const batch: FlagEventsBatch = { sdk: this.o.sdk ?? { name: FLAGS_SDK_NAME, version: FLAGS_SDK_VERSION } };\n if (this.usage.size) batch.usage = Array.from(this.usage.values());\n if (this.exposures.length) batch.exposures = this.exposures;\n this.usage.clear();\n this.exposures = [];\n return batch;\n }\n\n private requeue(batch: FlagEventsBatch): void {\n for (const u of batch.usage ?? []) {\n const k = `${u.flag}\\u0000${u.variationId ?? \"\"}\\u0000${u.variationId ? \"\" : (u.value ?? \"\")}`;\n const cur = this.usage.get(k);\n if (cur) cur.count += u.count;\n else if (this.usage.size < MAX_QUEUE) this.usage.set(k, { flag: u.flag, variationId: u.variationId, value: u.value ?? \"\", count: u.count });\n }\n this.exposures = [...(batch.exposures ?? []), ...this.exposures].slice(0, MAX_QUEUE);\n this.scheduleFlush(USAGE_FLUSH_MS);\n }\n\n /** Page hide / destroy: `sendBeacon` for public keys, else a `keepalive` fetch. */\n private flushOnExit(): void {\n if (this.offline) return;\n const batch = this.takeBatch();\n if (!batch) return;\n try {\n if (!this.secret && typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\" && typeof Blob !== \"undefined\") {\n // text/plain needs no CORS preflight (browsers drop those during unload).\n if (navigator.sendBeacon(this.url(\"/flags/events\"), new Blob([JSON.stringify(batch)], { type: \"text/plain;charset=UTF-8\" }))) return;\n }\n } catch {\n /* fall through */\n }\n void this.request(\"POST\", \"/flags/events\", { body: batch, keepalive: true }).catch(() => {});\n }\n\n private wireBrowser(): void {\n if (!isBrowser()) return;\n const onHide = () => this.flushOnExit();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") return this.flushOnExit();\n // Back in view: catch up if a poll was skipped while hidden.\n if ((this.cfg.mode === \"auto\" || (this.cfg.mode === \"stream\" && !this.streamConnected)) && Date.now() - this.lastFetchAt > this.cfg.pollMs) void this.fetchNow().then(() => this.schedule());\n };\n window.addEventListener(\"pagehide\", onHide);\n document.addEventListener(\"visibilitychange\", onVisibility);\n this.cleanups.push(() => {\n window.removeEventListener(\"pagehide\", onHide);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n });\n }\n\n // ---------------------------------------------------------------------------\n\n private notify(): void {\n for (const l of Array.from(this.listeners)) {\n try {\n l();\n } catch (err) {\n this.reportError(err);\n }\n }\n }\n\n private reportError(err: unknown): void {\n const error = err instanceof Error ? err : new Error(String(err));\n // Repeats (a poll failing every minute) are logged once.\n if (error.message !== this.lastError) this.log.error?.(error.message);\n this.lastError = error.message;\n try {\n this.o.onError?.(error);\n } catch {\n /* ignore */\n }\n }\n}\n\n/** Creates a flags client and starts loading (per `pollingMode`). */\nexport function createFlagsClient(options: FlagsClientOptions): FlagsClient {\n return new FlagsClient(options);\n}\n","/** Node-only: finds flag keys used as string literals in a source tree (`guidely-flags code-refs`). */\nimport { execFileSync } from \"node:child_process\";\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\n\nexport interface CodeRef {\n flag: string;\n path: string;\n line: number;\n snippet: string;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"vendor\", \".next\", \".svelte-kit\", \".turbo\", \"coverage\", \"target\", \"out\"]);\nconst SKIP_FILES = /(^|\\/)(package-lock\\.json|pnpm-lock\\.yaml|yarn\\.lock|bun\\.lockb?|composer\\.lock|Cargo\\.lock|Gemfile\\.lock|poetry\\.lock)$|\\.(min\\.js|map|png|jpe?g|gif|webp|ico|svg|pdf|zip|gz|woff2?|ttf|eot|mp4|mov|mp3|jar|class|so|dylib|dll|exe|bin)$/i;\nexport const MAX_FILE_BYTES = 1024 * 1024;\nexport const MAX_REFS = 10_000;\n\n/** Files to scan, relative to `dir` with `/` separators: `git ls-files` (tracked + untracked, not ignored), else a directory walk. */\nexport function listFiles(dir: string): string[] {\n try {\n const out = execFileSync(\"git\", [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"], { cwd: dir, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"], maxBuffer: 256 * 1024 * 1024 });\n const files = out.split(\"\\0\").filter(Boolean);\n if (files.length) return files.filter((f) => !f.split(\"/\").some((p) => SKIP_DIRS.has(p)));\n } catch {\n /* not a git checkout, or git missing */\n }\n const files: string[] = [];\n const walk = (abs: string) => {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = readdirSync(abs, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!SKIP_DIRS.has(e.name)) walk(join(abs, e.name));\n } else if (e.isFile()) files.push(relative(dir, join(abs, e.name)).split(sep).join(\"/\"));\n }\n };\n walk(dir);\n return files.sort();\n}\n\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Every line where a flag key appears as a quoted literal: `'key'`, `\"key\"` or `` `key` ``. */\nexport function scanFiles(dir: string, files: string[], flagKeys: string[]): CodeRef[] {\n const keys = Array.from(new Set(flagKeys.filter(Boolean))).sort((a, b) => b.length - a.length);\n if (!keys.length) return [];\n const re = new RegExp(`(['\"\\`])(${keys.map(escapeRe).join(\"|\")})\\\\1`, \"g\");\n const refs: CodeRef[] = [];\n for (const path of files) {\n if (SKIP_FILES.test(path)) continue;\n const abs = join(dir, path);\n let text: string;\n try {\n const st = statSync(abs);\n if (!st.isFile() || st.size > MAX_FILE_BYTES) continue;\n const buf = readFileSync(abs);\n if (buf.subarray(0, 8000).includes(0)) continue; // binary\n text = buf.toString(\"utf8\");\n } catch {\n continue;\n }\n if (!keys.some((k) => text.includes(k))) continue;\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n re.lastIndex = 0;\n const seen = new Set<string>();\n for (let m = re.exec(line); m; m = re.exec(line)) {\n const flag = m[2]!;\n if (seen.has(flag)) continue;\n seen.add(flag);\n refs.push({ flag, path, line: i + 1, snippet: line.trim().slice(0, 200) });\n if (refs.length >= MAX_REFS) return refs;\n }\n }\n }\n return refs;\n}\n\nexport function gitValue(dir: string, args: string[]): string | undefined {\n try {\n return execFileSync(\"git\", args, { cwd: dir, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }).trim() || undefined;\n } catch {\n return undefined;\n }\n}\n","#!/usr/bin/env node\nimport { main } from \"./cli-main\";\n\nmain(process.argv.slice(2)).then((code) => process.exit(code));\n"],"mappings":"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","names":["import_node_path","a","b","sep","text","sep","resolve","sep","base","handle","files","env"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-main.ts","../src/hash.ts","../src/crypto.ts","../src/util.ts","../src/dev-overrides.ts","../src/values.ts","../src/evaluate.ts","../src/evaluator.ts","../src/sse.ts","../src/client.ts","../src/code-refs.ts","../src/cli.ts"],"sourcesContent":["/** `guidely-flags` command line (Node only). Kept separate from `cli.ts` so tests can call {@link main}. */\nimport { resolve } from \"node:path\";\nimport { createFlagsClient, DEFAULT_FLAGS_API_URL } from \"./client\";\nimport { gitValue, listFiles, scanFiles, MAX_REFS, type CodeRef } from \"./code-refs\";\nimport { decryptPayloadString } from \"./crypto\";\nimport type { FlagsPayload } from \"./types\";\nimport { isEncryptedPayload, isFlagsPayload } from \"./util\";\n\nexport const HELP = `guidely-flags — Guidely feature flag tools\n\nUsage:\n guidely-flags code-refs --key gly_sk_… --environment production --repo <name> [options]\n guidely-flags evaluate --key <pk_…|gly_sk_…> [--environment <env>] [--flag <key>] [--attributes '{\"id\":\"u1\"}']\n\ncode-refs: finds flag keys used as quoted string literals in your code and uploads the\nreferences, so the dashboard shows where each flag is used (run it in CI on your main branch).\n --api-url <url> Guidely URL (default ${DEFAULT_FLAGS_API_URL}; env GUIDELY_API_URL)\n --key <gly_sk_…> Secret API key with flags:read and flags:code-refs (env GUIDELY_API_KEY)\n --environment <env> development | staging | production (env GUIDELY_ENVIRONMENT)\n --repo <name> Repository name, e.g. acme/web (env GITHUB_REPOSITORY)\n --branch <branch> Default: the current git branch\n --commit <sha> Default: the current git commit\n --dir <path> Directory to scan (default .)\n --decryption-key <key> For environments with encrypted payloads\n --dry-run Print the references instead of uploading them\n\nevaluate: prints how a flag (or every flag) evaluates for some attributes.\n --flag <key> Flag key (default: all flags)\n --attributes <json> Attributes object (default {})\n\nExit codes: 0 success, 1 failure, 2 usage error.\n`;\n\nexport interface CliIo {\n fetch?: typeof fetch;\n env?: Record<string, string | undefined>;\n out?: (text: string) => void;\n err?: (text: string) => void;\n cwd?: string;\n}\n\nclass UsageError extends Error {}\n\nfunction parseArgs(argv: string[]): { command?: string; flags: Record<string, string | true> } {\n const flags: Record<string, string | true> = {};\n let command: string | undefined;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\");\n if (eq > 0) flags[a.slice(2, eq)] = a.slice(eq + 1);\n else if (argv[i + 1] !== undefined && !argv[i + 1]!.startsWith(\"--\")) flags[a.slice(2)] = argv[++i]!;\n else flags[a.slice(2)] = true;\n } else if (a === \"-h\") flags.help = true;\n else if (!command) command = a;\n else throw new UsageError(`Unexpected argument: ${a}`);\n }\n return { command, flags };\n}\n\nexport async function main(argv: string[], io: CliIo = {}): Promise<number> {\n const env = io.env ?? process.env;\n const out = io.out ?? ((t: string) => process.stdout.write(t));\n const err = io.err ?? ((t: string) => process.stderr.write(t));\n const doFetch = io.fetch ?? fetch;\n try {\n const { command, flags } = parseArgs(argv);\n if (!command || flags.help || command === \"help\") {\n out(HELP);\n return command || flags.help ? 0 : 2;\n }\n const str = (name: string, envName?: string): string | undefined => {\n const v = flags[name];\n if (v === true) throw new UsageError(`--${name} needs a value`);\n return v ?? (envName ? env[envName] : undefined) ?? undefined;\n };\n const apiUrl = (str(\"api-url\", \"GUIDELY_API_URL\") || DEFAULT_FLAGS_API_URL).replace(/\\/+$/, \"\");\n const key = str(\"key\", \"GUIDELY_API_KEY\");\n const environment = str(\"environment\", \"GUIDELY_ENVIRONMENT\");\n if (!key) throw new UsageError(\"--key is required\");\n\n if (command === \"code-refs\") {\n if (!key.startsWith(\"gly_sk_\")) throw new UsageError(\"code-refs needs a secret gly_sk_ API key\");\n if (!environment) throw new UsageError(\"--environment is required\");\n const dir = resolve(io.cwd ?? process.cwd(), str(\"dir\") ?? \".\");\n const repo = str(\"repo\", \"GITHUB_REPOSITORY\");\n if (!repo) throw new UsageError(\"--repo is required\");\n const branch = str(\"branch\") ?? env.GITHUB_HEAD_REF ?? env.GITHUB_REF_NAME ?? gitValue(dir, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!branch) throw new UsageError(\"--branch is required (not a git checkout)\");\n const commit = str(\"commit\") ?? env.GITHUB_SHA ?? gitValue(dir, [\"rev-parse\", \"HEAD\"]);\n\n const auth = { Authorization: `Bearer ${key}`, Accept: \"application/json\" };\n const res = await doFetch(`${apiUrl}/api/v1/sdk/flags?environment=${encodeURIComponent(environment)}`, { headers: auth });\n if (!res.ok) throw new Error(`Downloading flags failed (${res.status}): ${(await res.text()).slice(0, 300)}`);\n let payload = (await res.json()) as unknown;\n if (isEncryptedPayload(payload)) {\n const dk = str(\"decryption-key\", \"GUIDELY_DECRYPTION_KEY\");\n if (!dk) throw new Error(\"The payload is encrypted: pass --decryption-key\");\n payload = { ...payload, ...JSON.parse(await decryptPayloadString(payload.encryptedPayload, dk)) };\n }\n if (!isFlagsPayload(payload)) throw new Error(\"Unexpected flags payload\");\n const keys = Object.keys((payload as FlagsPayload).flags);\n const files = listFiles(dir);\n const refs: CodeRef[] = scanFiles(dir, files, keys);\n if (refs.length >= MAX_REFS) err(`Stopped after ${MAX_REFS} references.\\n`);\n if (flags[\"dry-run\"]) {\n for (const r of refs) out(`${r.flag}\\t${r.path}:${r.line}\\t${r.snippet}\\n`);\n out(`${refs.length} reference(s) to ${new Set(refs.map((r) => r.flag)).size} of ${keys.length} flag(s) in ${files.length} file(s) (dry run, nothing uploaded)\\n`);\n return 0;\n }\n const up = await doFetch(`${apiUrl}/api/v1/flags/code-refs`, { method: \"POST\", headers: { ...auth, \"Content-Type\": \"application/json\" }, body: JSON.stringify({ repo, branch, ...(commit ? { commit } : {}), refs }) });\n if (!up.ok) throw new Error(`Uploading code references failed (${up.status}): ${(await up.text()).slice(0, 300)}`);\n out(`Uploaded ${refs.length} reference(s) to ${new Set(refs.map((r) => r.flag)).size} flag(s) for ${repo}@${branch}\\n`);\n return 0;\n }\n\n if (command === \"evaluate\") {\n let attributes: Record<string, unknown> = {};\n const raw = str(\"attributes\");\n if (raw) {\n try {\n attributes = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new UsageError(\"--attributes must be a JSON object\");\n }\n if (!attributes || typeof attributes !== \"object\" || Array.isArray(attributes)) throw new UsageError(\"--attributes must be a JSON object\");\n }\n let failure: Error | null = null;\n const client = createFlagsClient({ sdkKey: key, apiUrl, environment, pollingMode: \"manual\", reportUsage: false, trackExposures: false, storage: false, logger: null, fetch: doFetch, decryptionKey: str(\"decryption-key\", \"GUIDELY_DECRYPTION_KEY\"), onError: (e) => (failure = e) });\n await client.refresh();\n client.destroy();\n if (!client.getPayload()) throw failure ?? new Error(\"Could not load flags\");\n const user = client.forUser(attributes);\n const flag = str(\"flag\");\n const result = flag ? user.getDetails(flag, null) : user.getAll();\n out(`${JSON.stringify(result, null, 2)}\\n`);\n return 0;\n }\n throw new UsageError(`Unknown command: ${command}`);\n } catch (e) {\n if (e instanceof UsageError) {\n err(`${e.message}\\n\\n${HELP}`);\n return 2;\n }\n err(`guidely-flags: ${e instanceof Error ? e.message : String(e)}\\n`);\n return 1;\n }\n}\n","/** Hashing shared by every Guidely flag SDK (docs/feature-flags-spec.md §3.4, §3.3). Synchronous and dependency-free so it runs in browsers, React Native, Node and edge runtimes alike. */\n\nexport function utf8(input: string): Uint8Array {\n const out: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const d = input.charCodeAt(i + 1);\n if (d >= 0xdc00 && d <= 0xdfff) {\n c = 0x10000 + ((c - 0xd800) << 10) + (d - 0xdc00);\n i++;\n }\n }\n if (c >= 0xd800 && c <= 0xdfff) c = 0xfffd; // lone surrogate\n if (c < 0x80) out.push(c);\n else if (c < 0x800) out.push(0xc0 | (c >> 6), 0x80 | (c & 63));\n else if (c < 0x10000) out.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n else out.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 63), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n }\n return Uint8Array.from(out);\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder().decode(bytes);\n let s = \"\";\n for (let i = 0; i < bytes.length; ) {\n const b = bytes[i++]!;\n let c: number;\n if (b < 0x80) c = b;\n else if (b < 0xe0) c = ((b & 31) << 6) | (bytes[i++]! & 63);\n else if (b < 0xf0) c = ((b & 15) << 12) | ((bytes[i++]! & 63) << 6) | (bytes[i++]! & 63);\n else c = ((b & 7) << 18) | ((bytes[i++]! & 63) << 12) | ((bytes[i++]! & 63) << 6) | (bytes[i++]! & 63);\n s += String.fromCodePoint(c);\n }\n return s;\n}\n\nexport function fnv1a32(bytes: Uint8Array): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < bytes.length; i++) {\n h ^= bytes[i]!;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h >>> 0;\n}\n\n/** Deterministic bucket in [0, 1) with 4 decimals (GrowthBook hash v2 for ASCII input). */\nexport function hashBucket(seed: string, value: string): number {\n const inner = fnv1a32(utf8(seed + value));\n return (fnv1a32(utf8(String(inner))) % 10000) / 10000;\n}\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\n/** Lowercase hex SHA-256 of the UTF-8 bytes of `input`. */\nexport function sha256Hex(input: string | Uint8Array): string {\n const msg = typeof input === \"string\" ? utf8(input) : input;\n const bitLen = msg.length * 8;\n const padded = new Uint8Array(((msg.length + 9 + 63) >> 6) << 6);\n padded.set(msg);\n padded[msg.length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(bitLen / 0x100000000));\n view.setUint32(padded.length - 4, bitLen >>> 0);\n const h = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n const w = new Uint32Array(64);\n for (let off = 0; off < padded.length; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + i * 4);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!, b = w[i - 2]!;\n const s0 = ((a >>> 7) | (a << 25)) ^ ((a >>> 18) | (a << 14)) ^ (a >>> 3);\n const s1 = ((b >>> 17) | (b << 15)) ^ ((b >>> 19) | (b << 13)) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let a = h[0]!, b = h[1]!, c = h[2]!, d = h[3]!, e = h[4]!, f = h[5]!, g = h[6]!, hh = h[7]!;\n for (let i = 0; i < 64; i++) {\n const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n const ch = (e & f) ^ (~e & g);\n const t1 = (hh + S1 + ch + K[i]! + w[i]!) >>> 0;\n const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (S0 + maj) >>> 0;\n hh = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = (h[0]! + a) >>> 0;\n h[1] = (h[1]! + b) >>> 0;\n h[2] = (h[2]! + c) >>> 0;\n h[3] = (h[3]! + d) >>> 0;\n h[4] = (h[4]! + e) >>> 0;\n h[5] = (h[5]! + f) >>> 0;\n h[6] = (h[6]! + g) >>> 0;\n h[7] = (h[7]! + hh) >>> 0;\n }\n let hex = \"\";\n for (let i = 0; i < 8; i++) hex += h[i]!.toString(16).padStart(8, \"0\");\n return hex;\n}\n\n/** `H(x)` for the hashed operators: SHA-256 of `salt + value`. */\nexport function hashConfidential(salt: string, value: string | Uint8Array): string {\n if (typeof value === \"string\") return sha256Hex(salt + value);\n const s = utf8(salt);\n const joined = new Uint8Array(s.length + value.length);\n joined.set(s);\n joined.set(value, s.length);\n return sha256Hex(joined);\n}\n\n/** Comparison value for the hashed prefix/suffix operators: `\"<byteLength>_<H(part)>\"`. */\nexport function hashConfidentialAffix(salt: string, part: string): string {\n return `${utf8(part).length}_${hashConfidential(salt, part)}`;\n}\n","/** AES-256-GCM decryption of encrypted payloads (docs/feature-flags-spec.md §1.3) through WebCrypto. */\nimport { decodeUtf8 } from \"./hash\";\n\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/** Standard or URL-safe base64, padding optional. Throws on invalid input. */\nexport function base64ToBytes(input: string): Uint8Array {\n const s = input.trim().replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/=+$/, \"\");\n const out = new Uint8Array(Math.floor((s.length * 3) / 4));\n let buffer = 0;\n let bits = 0;\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const v = ALPHABET.indexOf(s[i]!);\n if (v < 0) throw new Error(\"invalid base64\");\n buffer = (buffer << 6) | v;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out[n++] = (buffer >> bits) & 0xff;\n }\n }\n return out.subarray(0, n);\n}\n\n/** Decrypts `\"<base64 iv>.<base64 ciphertext+tag>\"` with a base64 32-byte key; returns the UTF-8 plaintext. */\nexport async function decryptPayloadString(encrypted: string, decryptionKey: string): Promise<string> {\n const subtle = (globalThis as { crypto?: Crypto }).crypto?.subtle;\n if (!subtle) throw new Error(\"WebCrypto (crypto.subtle) is not available in this runtime; encrypted payloads need it (Node ≥ 19, browsers, edge runtimes, or a polyfill)\");\n const [ivText, dataText] = encrypted.split(\".\");\n if (!ivText || !dataText) throw new Error(\"malformed encrypted payload\");\n const key = base64ToBytes(decryptionKey);\n if (key.length !== 32) throw new Error(\"decryptionKey must be base64 of 32 bytes\");\n const cryptoKey = await subtle.importKey(\"raw\", key as BufferSource, { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n const plain = await subtle.decrypt({ name: \"AES-GCM\", iv: base64ToBytes(ivText) as BufferSource }, cryptoKey, base64ToBytes(dataText) as BufferSource);\n return decodeUtf8(new Uint8Array(plain));\n}\n","/** Small runtime-neutral helpers shared by the flags client. No Node built-ins, no DOM at module scope. */\nimport type { Attributes, EncryptedFlagsPayload, FlagsPayload, JsonValue, RemoteEvaluationResponse } from \"./types\";\n\n/** JSON with object keys sorted: equal attribute sets give equal strings (remote-eval cache keys). */\nexport function stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n if (Array.isArray(value)) return `[${value.map((v) => (v === undefined ? \"null\" : stableStringify(v))).join(\",\")}]`;\n if (value instanceof Date) return JSON.stringify(value.toISOString());\n const obj = value as Record<string, unknown>;\n return `{${Object.keys(obj)\n .filter((k) => obj[k] !== undefined)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`)\n .join(\",\")}}`;\n}\n\nexport function isEncryptedPayload(x: unknown): x is EncryptedFlagsPayload {\n return !!x && typeof x === \"object\" && typeof (x as EncryptedFlagsPayload).encryptedPayload === \"string\";\n}\n\n/** A remote-evaluation response (`{ version, flags: { key: EvaluationResult } }`) rather than a payload. */\nexport function isRemoteResults(x: unknown): x is RemoteEvaluationResponse {\n return !!x && typeof x === \"object\" && !(\"schemaVersion\" in x) && !!(x as RemoteEvaluationResponse).flags && typeof (x as RemoteEvaluationResponse).flags === \"object\";\n}\n\nexport function isFlagsPayload(x: unknown): x is FlagsPayload {\n return !!x && typeof x === \"object\" && \"schemaVersion\" in x && !!(x as FlagsPayload).flags && typeof (x as FlagsPayload).flags === \"object\";\n}\n\n/** JSON type name used by the typed getters (`array` and `object` are distinct). */\nexport function kindOf(v: unknown): string {\n if (v === null || v === undefined) return \"null\";\n if (Array.isArray(v)) return \"array\";\n return typeof v;\n}\n\n/** Drops `undefined` values (they are not attributes). */\nexport function compact(attrs: Attributes): Attributes {\n const out: Attributes = {};\n for (const [k, v] of Object.entries(attrs)) if (v !== undefined) out[k] = v;\n return out;\n}\n\n/** `?guidely_flags=key:value,key2:\"str\"` → overrides (text as in {@link parseOverrides}; invalid text gives none). */\nexport function parseUrlOverrides(search: string, param = \"guidely_flags\"): Record<string, JsonValue> {\n let raw: string | null = null;\n try {\n raw = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search).get(param);\n } catch {\n return {};\n }\n return (raw && parseOverrides(raw)) || {};\n}\n\n/**\n * Overrides text (docs/feature-flags-spec.md §4.1), as held by `GUIDELY_FLAG_OVERRIDES`, an\n * overrides file or `?guidely_flags=`: a JSON object (`{\"new-checkout\":true}`) or a list\n * `key:value` separated by commas or newlines (`new-checkout:true,limit:5,theme:\"dark\"`), where each\n * value is JSON when it parses and text otherwise. `null` when the text is a malformed JSON object.\n */\nexport function parseOverrides(text: string): Record<string, JsonValue> | null {\n const raw = text.trim();\n if (raw.startsWith(\"{\")) {\n try {\n const obj = JSON.parse(raw) as unknown;\n return obj && typeof obj === \"object\" && !Array.isArray(obj) ? (obj as Record<string, JsonValue>) : null;\n } catch {\n return null;\n }\n }\n const out: Record<string, JsonValue> = {};\n // Split on top-level commas and newlines: those inside quotes, arrays or objects belong to the value.\n const items: string[] = [];\n let depth = 0;\n let quoted = false;\n let start = 0;\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i];\n if (quoted) {\n if (c === \"\\\\\") i++;\n else if (c === '\"') quoted = false;\n } else if (c === '\"') quoted = true;\n else if (c === \"[\" || c === \"{\") depth++;\n else if (c === \"]\" || c === \"}\") depth = Math.max(0, depth - 1);\n else if ((c === \",\" || c === \"\\n\") && depth === 0) {\n items.push(raw.slice(start, i));\n start = i + 1;\n }\n }\n items.push(raw.slice(start));\n for (const item of items) {\n const sep = item.indexOf(\":\");\n if (sep <= 0) continue;\n const key = item.slice(0, sep).trim();\n const text = item.slice(sep + 1).trim();\n if (!key) continue;\n try {\n out[key] = JSON.parse(text) as JsonValue;\n } catch {\n out[key] = text;\n }\n }\n return out;\n}\n\nexport function isDev(): boolean {\n try {\n const p = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return !!p?.env && p.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n}\n\n/** `setTimeout` that never keeps a Node process alive. */\nexport function timer(fn: () => void, ms: number): ReturnType<typeof setTimeout> {\n const t = setTimeout(fn, ms);\n (t as unknown as { unref?: () => void }).unref?.();\n return t;\n}\n","/**\n * Dev overrides (docs/feature-flags-spec.md §4.1): flag values pinned from outside the code, so CI\n * and tests can switch flags without editing the app. Read once, when a client is created.\n * Runtime-neutral: environment variables via `process.env` (Node, Bun, Next.js server) or\n * `Deno.env`, files via `process.getBuiltinModule(\"node:fs\")` or `Deno`, and a global that test\n * runners set in the page (`page.addInitScript`).\n */\nimport type { OverrideBehaviour } from \"./client\";\nimport type { JsonValue } from \"./types\";\nimport { parseOverrides } from \"./util\";\n\nexport const OVERRIDES_ENV = \"GUIDELY_FLAG_OVERRIDES\";\nexport const OVERRIDES_FILE_ENV = \"GUIDELY_FLAG_OVERRIDES_FILE\";\nexport const OVERRIDE_BEHAVIOUR_ENV = \"GUIDELY_FLAG_OVERRIDE_BEHAVIOUR\";\nexport const OVERRIDES_GLOBAL = \"__GUIDELY_FLAG_OVERRIDES__\";\nexport const OVERRIDE_BEHAVIOUR_GLOBAL = \"__GUIDELY_FLAG_OVERRIDE_BEHAVIOUR__\";\n\nconst BEHAVIOURS: readonly OverrideBehaviour[] = [\"localOnly\", \"localOverRemote\", \"remoteOverLocal\"];\n\nexport interface DevOverrides {\n /** Merged values: file, then environment variable, then global (later wins per key). */\n values: Record<string, JsonValue>;\n /** Replaces the configured `overrideBehaviour` when set. */\n behaviour?: OverrideBehaviour;\n /** Where values or the behaviour came from, for the start-up notice. */\n sources: string[];\n /** Unreadable or malformed sources (ignored). */\n errors: string[];\n}\n\ntype Runtime = {\n process?: { env?: Record<string, string | undefined>; getBuiltinModule?: (id: string) => unknown };\n Deno?: { env?: { get(name: string): string | undefined }; readTextFileSync?(path: string): string };\n};\n\nconst runtime = () => globalThis as unknown as Runtime & Record<string, unknown>;\n\nfunction env(name: string): string | undefined {\n const g = runtime();\n try {\n const v = g.process?.env?.[name];\n if (v !== undefined) return v;\n } catch {\n // Some edge runtimes throw on unknown variables.\n }\n try {\n return g.Deno?.env?.get(name);\n } catch {\n return undefined; // Deno without --allow-env\n }\n}\n\nfunction readFile(path: string): string {\n const g = runtime();\n const fs = g.process?.getBuiltinModule?.(\"node:fs\") as { readFileSync(p: string, enc: \"utf8\"): string } | undefined;\n if (fs) return fs.readFileSync(path, \"utf8\");\n if (g.Deno?.readTextFileSync) return g.Deno.readTextFileSync(path);\n throw new Error(\"this runtime cannot read files\");\n}\n\nfunction behaviourOf(raw: unknown, source: string, out: DevOverrides): void {\n if (typeof raw !== \"string\" || !raw.trim()) return;\n const b = raw.trim() as OverrideBehaviour;\n if (BEHAVIOURS.includes(b)) {\n out.behaviour = b;\n out.sources.push(source);\n } else out.errors.push(`${source} must be localOnly, localOverRemote or remoteOverLocal (got \"${raw}\"); ignoring it.`);\n}\n\nfunction merge(text: string | undefined, source: string, out: DevOverrides): void {\n if (text === undefined || !text.trim()) return;\n const values = parseOverrides(text);\n if (!values) return void out.errors.push(`${source} is not a JSON object or a key:value list; ignoring it.`);\n if (!Object.keys(values).length) return;\n Object.assign(out.values, values);\n out.sources.push(source);\n}\n\n/** Reads every dev-override source. Never throws: problems land in `errors`. */\nexport function readDevOverrides(): DevOverrides {\n const out: DevOverrides = { values: {}, sources: [], errors: [] };\n const file = env(OVERRIDES_FILE_ENV);\n if (file?.trim()) {\n try {\n merge(readFile(file.trim()), `${OVERRIDES_FILE_ENV} (${file.trim()})`, out);\n } catch (err) {\n out.errors.push(`Could not read ${OVERRIDES_FILE_ENV} (${file.trim()}): ${err instanceof Error ? err.message : String(err)}; ignoring it.`);\n }\n }\n merge(env(OVERRIDES_ENV), OVERRIDES_ENV, out);\n const g = runtime()[OVERRIDES_GLOBAL];\n if (g && typeof g === \"object\" && !Array.isArray(g)) {\n if (Object.keys(g).length) {\n Object.assign(out.values, g as Record<string, JsonValue>);\n out.sources.push(OVERRIDES_GLOBAL);\n }\n } else if (typeof g === \"string\") merge(g, OVERRIDES_GLOBAL, out);\n else if (g !== undefined && g !== null) out.errors.push(`${OVERRIDES_GLOBAL} must be an object or overrides text; ignoring it.`);\n behaviourOf(env(OVERRIDE_BEHAVIOUR_ENV), OVERRIDE_BEHAVIOUR_ENV, out);\n behaviourOf(runtime()[OVERRIDE_BEHAVIOUR_GLOBAL], OVERRIDE_BEHAVIOUR_GLOBAL, out);\n return out;\n}\n","/** Value conversions used by the condition operators (docs/feature-flags-spec.md §3.2–3.3). */\n\n/** Text form of a scalar, or `undefined` for arrays, objects, null and non-finite numbers. */\nexport function textOf(v: unknown): string | undefined {\n if (typeof v === \"string\") return v;\n if (typeof v === \"boolean\") return v ? \"true\" : \"false\";\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return undefined;\n if (Number.isInteger(v) && Math.abs(v) < 1e21) return v.toFixed(0);\n return String(v);\n }\n if (typeof v === \"bigint\") return v.toString();\n return undefined;\n}\n\nconst NUMERIC = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport function numberOf(v: unknown): number | undefined {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : undefined;\n if (typeof v === \"string\") {\n const s = v.trim();\n if (!NUMERIC.test(s)) return undefined;\n const n = Number(s);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\n/** Elements of an array attribute (or a string holding a JSON array). */\nexport function arrayOf(v: unknown): unknown[] | undefined {\n if (Array.isArray(v)) return v;\n if (typeof v === \"string\") {\n const s = v.trim();\n if (!s.startsWith(\"[\")) return undefined;\n try {\n const parsed: unknown = JSON.parse(s);\n return Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n pre: string[];\n}\n\nconst SEMVER = /^[vV]?(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport function parseSemver(v: unknown): SemVer | undefined {\n const s = typeof v === \"number\" ? textOf(v) : typeof v === \"string\" ? v.trim() : undefined;\n if (s === undefined) return undefined;\n const m = SEMVER.exec(s);\n if (!m) return undefined;\n return { major: Number(m[1]), minor: Number(m[2] ?? 0), patch: Number(m[3] ?? 0), pre: m[4] ? m[4].split(\".\") : [] };\n}\n\nfunction cmp(a: number, b: number): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** SemVer 2.0 precedence: -1, 0 or 1. */\nexport function compareSemver(a: SemVer, b: SemVer): number {\n const c = cmp(a.major, b.major) || cmp(a.minor, b.minor) || cmp(a.patch, b.patch);\n if (c) return c;\n // A release outranks its pre-releases.\n if (!a.pre.length || !b.pre.length) return a.pre.length ? -1 : b.pre.length ? 1 : 0;\n for (let i = 0; i < Math.max(a.pre.length, b.pre.length); i++) {\n const x = a.pre[i], y = b.pre[i];\n if (x === undefined) return -1;\n if (y === undefined) return 1;\n const xn = /^\\d+$/.test(x), yn = /^\\d+$/.test(y);\n if (xn && yn) {\n const d = cmp(Number(x), Number(y));\n if (d) return d;\n } else if (xn) return -1;\n else if (yn) return 1;\n else if (x !== y) return x < y ? -1 : 1;\n }\n return 0;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 29 : 28;\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n\n/** Days since 1970-01-01 in the proleptic Gregorian calendar (H. Hinnant's days_from_civil); unlike Date.UTC, years 0–99 are literal. */\nfunction daysFromCivil(year: number, month: number, day: number): number {\n const y = month <= 2 ? year - 1 : year;\n const era = Math.floor(y / 400);\n const yoe = y - era * 400;\n const doy = Math.floor((153 * (month + (month > 2 ? -3 : 9)) + 2) / 5) + day - 1;\n const doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy;\n return era * 146097 + doe - 719468;\n}\n\nconst ISO = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[Tt ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|z|[+-]\\d{2}:\\d{2})?)?$/;\n\n/** Milliseconds since the epoch: numbers are Unix seconds, strings ISO 8601, Date objects as-is. */\nexport function instantOf(v: unknown): number | undefined {\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? undefined : v.getTime();\n if (typeof v === \"number\") return Number.isFinite(v) ? v * 1000 : undefined;\n if (typeof v !== \"string\") return undefined;\n const m = ISO.exec(v.trim());\n if (!m) return undefined;\n const [, y, mo, d, h = \"0\", mi = \"0\", s = \"0\", frac, tz] = m;\n const month = Number(mo), day = Number(d), hour = Number(h), minute = Number(mi), second = Number(s);\n const year = Number(y);\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) return undefined;\n let ms = (daysFromCivil(year, month, day) * 86400 + hour * 3600 + minute * 60 + second) * 1000 + (frac ? Math.floor(Number(`0.${frac}`) * 1000) : 0);\n if (tz && tz !== \"Z\" && tz !== \"z\") {\n const sign = tz[0] === \"-\" ? -1 : 1;\n ms -= sign * (Number(tz.slice(1, 3)) * 60 + Number(tz.slice(4, 6))) * 60_000;\n }\n return ms;\n}\n\n/** JSON deep equality; numbers compare numerically, object keys unordered. */\nexport function jsonEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || a === undefined || b === undefined) return (a ?? null) === (b ?? null);\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (Array.isArray(a)) return Array.isArray(b) && a.length === b.length && a.every((x, i) => jsonEquals(x, b[i]));\n if (typeof a === \"object\" && typeof b === \"object\" && !Array.isArray(b)) {\n const ka = Object.keys(a as object).filter((k) => (a as Record<string, unknown>)[k] !== undefined);\n const kb = Object.keys(b as object).filter((k) => (b as Record<string, unknown>)[k] !== undefined);\n return ka.length === kb.length && ka.every((k) => Object.prototype.hasOwnProperty.call(b, k) && jsonEquals((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\n/** `isOn`: anything except null, false, 0 and \"\". */\nexport function isOn(v: unknown): boolean {\n return !(v === null || v === undefined || v === false || v === 0 || v === \"\");\n}\n\nexport function jsonTypeOf(v: unknown): string | undefined {\n if (v === null || v === undefined) return undefined;\n if (Array.isArray(v)) return \"array\";\n if (typeof v === \"object\") return \"object\";\n if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") return typeof v;\n return undefined;\n}\n","/**\n * Pure, synchronous flag evaluation — the reference implementation of docs/feature-flags-spec.md §3.\n * No I/O: give it a payload and attributes, get a result. Used by every TypeScript SDK and by the\n * Guidely server for remote evaluation and the dashboard's test panel.\n */\nimport { hashBucket, hashConfidential, utf8 } from \"./hash\";\nimport type { AttributeCondition, Attributes, Condition, EvaluationResult, ExperimentRule, FlagComparisonOperator, FlagDefinition, FlagRule, FlagsPayload, JsonValue, RuleSchedule, StickyAssignments, StickyBucketStore } from \"./types\";\nimport { arrayOf, compareSemver, instantOf, isOn, jsonEquals, jsonTypeOf, numberOf, parseSemver, textOf } from \"./values\";\n\nexport * from \"./types\";\nexport { hashBucket, sha256Hex, hashConfidential, hashConfidentialAffix, fnv1a32 } from \"./hash\";\nexport { textOf, numberOf, parseSemver, compareSemver, instantOf, jsonEquals, isOn } from \"./values\";\n\nexport interface EvaluateOptions {\n /** Evaluation time (default: now). */\n now?: Date | number | string;\n /** Sticky bucketing store; experiments keep a user's variation across config changes. */\n stickyBuckets?: StickyBucketStore;\n}\n\nconst MAX_DEPTH = 32;\n\nclass CycleError extends Error {}\n\ninterface Ctx {\n payload: FlagsPayload;\n attributes: Attributes;\n now: number;\n sticky?: StickyBucketStore;\n stack: string[];\n}\n\nfunction nowOf(now: EvaluateOptions[\"now\"]): number {\n if (now === undefined) return Date.now();\n if (typeof now === \"number\") return now;\n if (now instanceof Date) return now.getTime();\n return instantOf(now) ?? Date.now();\n}\n\n/** Attribute by literal key, then by dot path. `null` counts as missing (`undefined`). */\nexport function lookupAttribute(attributes: Attributes, name: string): unknown {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) return attributes[name] ?? undefined;\n if (!name.includes(\".\")) return undefined;\n let cur: unknown = attributes;\n for (const part of name.split(\".\")) {\n if (cur && typeof cur === \"object\" && !Array.isArray(cur) && Object.prototype.hasOwnProperty.call(cur, part)) cur = (cur as Record<string, unknown>)[part];\n else return undefined;\n }\n return cur ?? undefined;\n}\n\n/** Text form of a hashing attribute, or `undefined` when missing or empty. */\nfunction hashValueOf(attributes: Attributes, name: string): string | undefined {\n const t = textOf(lookupAttribute(attributes, name));\n return t === undefined || t === \"\" ? undefined : t;\n}\n\nexport function isScheduleActive(schedule: RuleSchedule | undefined, now: number): boolean {\n if (!schedule) return true;\n if (schedule.start) {\n const start = instantOf(schedule.start);\n if (start === undefined || now < start) return false;\n }\n if (schedule.end) {\n const end = instantOf(schedule.end);\n if (end === undefined || now >= end) return false;\n }\n return true;\n}\n\nfunction clamp01(n: unknown): number {\n return typeof n === \"number\" && Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 0;\n}\n\nexport function effectiveCoverage(rule: { coverage: number; ramp?: Array<{ at: string; coverage: number }> }, now: number): number {\n let coverage = clamp01(rule.coverage);\n let latest = -Infinity;\n for (const step of rule.ramp ?? []) {\n const at = instantOf(step.at);\n if (at !== undefined && at <= now && at >= latest) {\n latest = at;\n coverage = clamp01(step.coverage);\n }\n }\n return coverage;\n}\n\nconst regexCache = new Map<string, RegExp | null>();\nfunction compile(pattern: string, ci: boolean): RegExp | null {\n const k = `${ci ? \"i\" : \"-\"}:${pattern}`;\n let re = regexCache.get(k);\n if (re === undefined) {\n try {\n re = new RegExp(pattern, ci ? \"i\" : \"\");\n } catch {\n re = null;\n }\n if (regexCache.size > 500) regexCache.clear();\n regexCache.set(k, re);\n }\n return re;\n}\n\nfunction lower(s: string, ci: boolean | undefined) {\n return ci ? s.toLowerCase() : s;\n}\n\nfunction textValues(values: JsonValue[], ci: boolean | undefined): string[] {\n const out: string[] = [];\n for (const v of values) {\n const t = textOf(v);\n if (t !== undefined) out.push(lower(t, ci));\n }\n return out;\n}\n\nfunction affixMatches(salt: string, text: string, values: JsonValue[], suffix: boolean): boolean {\n const bytes = utf8(text);\n return values.some((v) => {\n if (typeof v !== \"string\") return false;\n const sep = v.indexOf(\"_\");\n if (sep <= 0) return false;\n const n = Number(v.slice(0, sep));\n if (!Number.isInteger(n) || n < 0 || n > bytes.length) return false;\n const part = suffix ? bytes.slice(bytes.length - n) : bytes.slice(0, n);\n return hashConfidential(salt, part) === v.slice(sep + 1);\n });\n}\n\nfunction evalAttribute(ctx: Ctx, c: AttributeCondition): boolean {\n const raw = lookupAttribute(ctx.attributes, c.attribute);\n const values = Array.isArray(c.values) ? c.values : [];\n const op = c.operator;\n if (op === \"notExists\") return raw === undefined;\n if (raw === undefined) return false;\n const ci = c.caseInsensitive;\n switch (op) {\n case \"exists\":\n return true;\n case \"isType\":\n return jsonTypeOf(raw) === values[0];\n case \"isTrue\":\n return raw === true || (typeof raw === \"string\" && raw.toLowerCase() === \"true\");\n case \"isFalse\":\n return raw === false || (typeof raw === \"string\" && raw.toLowerCase() === \"false\");\n case \"equals\":\n case \"notEquals\":\n case \"in\":\n case \"notIn\":\n case \"contains\":\n case \"notContains\":\n case \"startsWith\":\n case \"notStartsWith\":\n case \"endsWith\":\n case \"notEndsWith\": {\n const t0 = textOf(raw);\n if (t0 === undefined) return false;\n const t = lower(t0, ci);\n const vs = textValues(values, ci);\n switch (op) {\n case \"equals\":\n return vs.length > 0 && t === vs[0];\n case \"notEquals\":\n return vs.length > 0 && t !== vs[0];\n case \"in\":\n return vs.includes(t);\n case \"notIn\":\n return !vs.includes(t);\n case \"contains\":\n return vs.some((v) => t.includes(v));\n case \"notContains\":\n return !vs.some((v) => t.includes(v));\n case \"startsWith\":\n return vs.some((v) => t.startsWith(v));\n case \"notStartsWith\":\n return !vs.some((v) => t.startsWith(v));\n case \"endsWith\":\n return vs.some((v) => t.endsWith(v));\n default:\n return !vs.some((v) => t.endsWith(v));\n }\n }\n case \"regex\":\n case \"notRegex\": {\n const t = textOf(raw);\n if (t === undefined) return false;\n const res: RegExp[] = [];\n for (const v of values) {\n const re = typeof v === \"string\" ? compile(v, !!ci) : null;\n if (!re) return false;\n res.push(re);\n }\n const any = res.some((re) => re.test(t));\n return op === \"regex\" ? any : !any;\n }\n case \"numEquals\":\n case \"numNotEquals\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\": {\n const a = numberOf(raw);\n const b = numberOf(values[0]);\n if (a === undefined || b === undefined) return false;\n if (op === \"numEquals\") return a === b;\n if (op === \"numNotEquals\") return a !== b;\n if (op === \"gt\") return a > b;\n if (op === \"gte\") return a >= b;\n if (op === \"lt\") return a < b;\n return a <= b;\n }\n case \"semverEquals\":\n case \"semverNotEquals\":\n case \"semverGt\":\n case \"semverGte\":\n case \"semverLt\":\n case \"semverLte\":\n case \"semverIn\":\n case \"semverNotIn\": {\n const a = parseSemver(raw);\n if (!a) return false;\n const bs = values.map(parseSemver);\n if (bs.some((b) => !b)) return false;\n if (op === \"semverIn\") return bs.some((b) => compareSemver(a, b!) === 0);\n if (op === \"semverNotIn\") return !bs.some((b) => compareSemver(a, b!) === 0);\n if (!bs[0]) return false;\n const d = compareSemver(a, bs[0]);\n if (op === \"semverEquals\") return d === 0;\n if (op === \"semverNotEquals\") return d !== 0;\n if (op === \"semverGt\") return d > 0;\n if (op === \"semverGte\") return d >= 0;\n if (op === \"semverLt\") return d < 0;\n return d <= 0;\n }\n case \"before\":\n case \"after\": {\n const a = instantOf(raw);\n const b = instantOf(values[0]);\n if (a === undefined || b === undefined) return false;\n return op === \"before\" ? a < b : a > b;\n }\n case \"arrayContainsAny\":\n case \"arrayNotContainsAny\":\n case \"arrayContainsAll\": {\n const arr = arrayOf(raw);\n if (!arr) return false;\n const elems = textValues(arr as JsonValue[], ci);\n const vs = textValues(values, ci);\n if (op === \"arrayContainsAll\") return vs.every((v) => elems.includes(v));\n const any = vs.some((v) => elems.includes(v));\n return op === \"arrayContainsAny\" ? any : !any;\n }\n case \"equalsHashed\":\n case \"notEqualsHashed\":\n case \"inHashed\":\n case \"notInHashed\":\n case \"startsWithHashed\":\n case \"notStartsWithHashed\":\n case \"endsWithHashed\":\n case \"notEndsWithHashed\": {\n const t = textOf(raw);\n if (t === undefined) return false;\n const salt = ctx.payload.salt ?? \"\";\n if (op === \"startsWithHashed\" || op === \"notStartsWithHashed\" || op === \"endsWithHashed\" || op === \"notEndsWithHashed\") {\n const any = affixMatches(salt, t, values, op === \"endsWithHashed\" || op === \"notEndsWithHashed\");\n return op.startsWith(\"not\") ? !any : any;\n }\n const h = hashConfidential(salt, t);\n if (op === \"equalsHashed\") return typeof values[0] === \"string\" && h === values[0];\n if (op === \"notEqualsHashed\") return typeof values[0] === \"string\" && h !== values[0];\n if (op === \"inHashed\") return values.includes(h);\n return !values.includes(h);\n }\n case \"arrayContainsAnyHashed\":\n case \"arrayNotContainsAnyHashed\": {\n const arr = arrayOf(raw);\n if (!arr) return false;\n const salt = ctx.payload.salt ?? \"\";\n const any = arr.some((e) => {\n const t = textOf(e);\n return t !== undefined && values.includes(hashConfidential(salt, t));\n });\n return op === \"arrayContainsAnyHashed\" ? any : !any;\n }\n default:\n return false;\n }\n}\n\nfunction enter<T>(ctx: Ctx, frame: string, fn: () => T): T {\n if (ctx.stack.includes(frame)) throw new CycleError(`Cycle detected: ${[...ctx.stack, frame].join(\" → \")}`);\n if (ctx.stack.length >= MAX_DEPTH) throw new CycleError(`Flag references nest deeper than ${MAX_DEPTH} levels: ${ctx.stack.join(\" → \")}`);\n ctx.stack.push(frame);\n try {\n return fn();\n } finally {\n ctx.stack.pop();\n }\n}\n\nfunction segmentMatches(ctx: Ctx, key: string): boolean | undefined {\n const seg = ctx.payload.segments?.[key];\n if (!seg) return undefined;\n return enter(ctx, `segment:${key}`, () => {\n if (seg.kind === \"list\") {\n const t = textOf(lookupAttribute(ctx.attributes, seg.attribute));\n if (t === undefined) return false;\n const needle = seg.hashed ? hashConfidential(ctx.payload.salt ?? \"\", t) : t;\n return Array.isArray(seg.values) && seg.values.includes(needle);\n }\n if (seg.kind === \"conditions\") return allMatch(ctx, seg.conditions);\n return false;\n });\n}\n\nfunction compareFlag(op: FlagComparisonOperator, actual: unknown, expected: JsonValue | undefined): boolean {\n switch (op) {\n case \"isOn\":\n return isOn(actual);\n case \"isOff\":\n return !isOn(actual);\n case \"equals\":\n return jsonEquals(actual, expected ?? null);\n case \"notEquals\":\n return !jsonEquals(actual, expected ?? null);\n default:\n return false;\n }\n}\n\n/** Value of a referenced flag, or `undefined` when it does not exist. */\nfunction referencedValue(ctx: Ctx, key: string): { value: unknown } | undefined {\n const res = evalFlag(ctx, key);\n return res.reason === \"FLAG_NOT_FOUND\" ? undefined : { value: res.value };\n}\n\nfunction conditionMatches(ctx: Ctx, c: Condition): boolean {\n if (!c || typeof c !== \"object\") return false;\n switch (c.kind) {\n case \"attribute\":\n return evalAttribute(ctx, c);\n case \"segment\": {\n const m = segmentMatches(ctx, c.segment);\n if (m === undefined) return false;\n if (c.operator === \"in\") return m;\n if (c.operator === \"notIn\") return !m;\n return false;\n }\n case \"flag\": {\n const ref = referencedValue(ctx, c.flag);\n return ref ? compareFlag(c.operator, ref.value, c.value) : false;\n }\n case \"group\": {\n const list = Array.isArray(c.conditions) ? c.conditions : [];\n let r: boolean;\n if (c.op === \"and\") r = allMatch(ctx, list);\n else if (c.op === \"or\") r = list.some((x) => conditionMatches(ctx, x));\n else return false;\n return c.negate ? !r : r;\n }\n default:\n return false;\n }\n}\n\nfunction allMatch(ctx: Ctx, conditions: Condition[] | undefined): boolean {\n if (!conditions) return true;\n for (const c of conditions) if (!conditionMatches(ctx, c)) return false;\n return true;\n}\n\nfunction base(flag: FlagDefinition, value: JsonValue | undefined, reason: EvaluationResult[\"reason\"]): EvaluationResult {\n return { key: flag.key, value: value === undefined ? null : value, reason, inExperiment: false };\n}\n\nfunction stickyDocKey(attribute: string, value: string) {\n return `${attribute}||${value}`;\n}\n\nfunction runExperiment(ctx: Ctx, flag: FlagDefinition, rule: ExperimentRule): EvaluationResult | undefined {\n const variations = Array.isArray(rule.variations) ? rule.variations : [];\n if (!variations.length) return undefined;\n let hashAttribute = rule.hashAttribute;\n let hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n const fallbackValue = rule.fallbackAttribute ? hashValueOf(ctx.attributes, rule.fallbackAttribute) : undefined;\n if (hv === undefined && rule.fallbackAttribute && fallbackValue !== undefined) {\n hashAttribute = rule.fallbackAttribute;\n hv = fallbackValue;\n }\n if (hv === undefined) return undefined;\n\n const bucketVersion = rule.bucketVersion ?? 0;\n const useSticky = !!ctx.sticky && !rule.disableStickyBucketing;\n let index = -1;\n const bucket = hashBucket(rule.seed, hv);\n let stickyUsed = false;\n if (useSticky) {\n const merged: StickyAssignments = {};\n if (rule.fallbackAttribute && fallbackValue !== undefined) Object.assign(merged, ctx.sticky!.get(stickyDocKey(rule.fallbackAttribute, fallbackValue)) ?? {});\n const primary = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (primary !== undefined) Object.assign(merged, ctx.sticky!.get(stickyDocKey(rule.hashAttribute, primary)) ?? {});\n const prefix = `${rule.key}__`;\n const minVersion = rule.minBucketVersion ?? 0;\n for (const k of Object.keys(merged)) {\n if (!k.startsWith(prefix)) continue;\n const v = Number(k.slice(prefix.length));\n if (Number.isInteger(v) && v < minVersion) return undefined; // blocked from re-entering\n }\n const assigned = merged[`${prefix}${bucketVersion}`];\n if (assigned !== undefined) {\n const i = variations.findIndex((v) => v.id === assigned);\n if (i >= 0) {\n index = i;\n stickyUsed = true;\n }\n }\n }\n if (index < 0) {\n if (rule.namespace) {\n const n = hashBucket(`__${rule.namespace.id}`, hv);\n if (!(n >= rule.namespace.start && n < rule.namespace.end)) return undefined;\n }\n const coverage = clamp01(rule.coverage);\n let cum = 0;\n for (let i = 0; i < variations.length; i++) {\n const w = Math.max(0, Number(variations[i]!.weight) || 0);\n const start = cum;\n const end = cum + coverage * w;\n cum += w;\n if (bucket >= start && bucket < end) {\n index = i;\n break;\n }\n }\n if (index < 0) return undefined;\n if (useSticky) {\n const docKey = stickyDocKey(hashAttribute, hv);\n const doc = { ...(ctx.sticky!.get(docKey) ?? {}) };\n doc[`${rule.key}__${bucketVersion}`] = variations[index]!.id;\n ctx.sticky!.set(docKey, doc);\n }\n }\n const variation = variations[index]!;\n return {\n key: flag.key,\n value: variation.value === undefined ? null : variation.value,\n reason: \"EXPERIMENT\",\n ruleId: rule.id,\n variationId: variation.id,\n inExperiment: true,\n experiment: { key: rule.key, name: rule.name, variationId: variation.id, variationName: variation.name, variationIndex: index, hashAttribute, hashValue: hv, bucket, stickyBucketUsed: stickyUsed },\n };\n}\n\nfunction applyRule(ctx: Ctx, flag: FlagDefinition, rule: FlagRule): EvaluationResult | undefined {\n switch (rule.type) {\n case \"force\":\n return { ...base(flag, rule.value, \"RULE_MATCH\"), ruleId: rule.id, ...(rule.variationId ? { variationId: rule.variationId } : {}) };\n case \"rollout\": {\n const hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (hv === undefined) return undefined;\n if (hashBucket(rule.seed, hv) >= effectiveCoverage(rule, ctx.now)) return undefined;\n return { ...base(flag, rule.value, \"RULE_MATCH\"), ruleId: rule.id, ...(rule.variationId ? { variationId: rule.variationId } : {}) };\n }\n case \"split\": {\n const hv = hashValueOf(ctx.attributes, rule.hashAttribute);\n if (hv === undefined || !Array.isArray(rule.buckets)) return undefined;\n const n = hashBucket(rule.seed, hv);\n let cum = 0;\n for (const b of rule.buckets) {\n cum += Math.max(0, Number(b.weight) || 0);\n if (n < cum) return { ...base(flag, b.value, \"RULE_MATCH\"), ruleId: rule.id, ...(b.variationId ? { variationId: b.variationId } : {}) };\n }\n return undefined;\n }\n case \"experiment\":\n return runExperiment(ctx, flag, rule);\n default:\n return undefined;\n }\n}\n\nfunction evalFlag(ctx: Ctx, key: string): EvaluationResult {\n const flag = ctx.payload.flags?.[key];\n if (!flag) return { key, value: null, reason: \"FLAG_NOT_FOUND\", inExperiment: false };\n return enter(ctx, `flag:${key}`, () => {\n if (!flag.enabled) return base(flag, flag.offValue, \"DISABLED\");\n for (const p of flag.prerequisites ?? []) {\n const ref = referencedValue(ctx, p.flag);\n if (!ref || !compareFlag(p.operator, ref.value, p.value)) return base(flag, flag.offValue, \"PREREQUISITE_FAILED\");\n }\n for (const h of ctx.payload.holdouts ?? []) {\n if (!Array.isArray(h.flags) || !h.flags.includes(key)) continue;\n const hv = hashValueOf(ctx.attributes, h.hashAttribute);\n if (hv !== undefined && hashBucket(h.seed, hv) < clamp01(h.coverage)) return base(flag, flag.defaultValue, \"HOLDOUT\");\n }\n for (const rule of flag.rules ?? []) {\n if (!rule || !isScheduleActive(rule.schedule, ctx.now)) continue;\n if (!allMatch(ctx, rule.conditions)) continue;\n const res = applyRule(ctx, flag, rule);\n if (res) return res;\n }\n return base(flag, flag.defaultValue, \"DEFAULT\");\n });\n}\n\n/** Evaluate one flag. Never throws: problems come back as reason `ERROR`. */\nexport function evaluateFlag(payload: FlagsPayload, key: string, attributes: Attributes = {}, options: EvaluateOptions = {}): EvaluationResult {\n const ctx: Ctx = { payload, attributes: attributes ?? {}, now: nowOf(options.now), sticky: options.stickyBuckets, stack: [] };\n try {\n return evalFlag(ctx, key);\n } catch (err) {\n return { key, value: null, reason: \"ERROR\", inExperiment: false, errorMessage: err instanceof Error ? err.message : String(err) };\n }\n}\n\n/** Evaluate every flag in the payload. */\nexport function evaluateAllFlags(payload: FlagsPayload, attributes: Attributes = {}, options: EvaluateOptions = {}): Record<string, EvaluationResult> {\n const out: Record<string, EvaluationResult> = {};\n for (const key of Object.keys(payload.flags ?? {})) out[key] = evaluateFlag(payload, key, attributes, options);\n return out;\n}\n","/** The getter surface shared by the client, `forUser()` evaluators and static (SSR) snapshots. */\nimport { evaluateFlag } from \"./evaluate\";\nimport type { Attributes, EvaluationResult, FlagsPayload, JsonValue, RemoteEvaluationResponse } from \"./types\";\nimport { isEncryptedPayload, isFlagsPayload, isRemoteResults, kindOf } from \"./util\";\n\n/** The value type a getter returns for a fallback: literals widen (`\"blue\"` → `string`), JSON types stay. */\nexport type FlagValue<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T;\n\n/** An evaluation result whose `value` is the caller's fallback when the flag is missing, null or of another type. */\nexport interface FlagDetails<T = JsonValue> extends Omit<EvaluationResult, \"value\"> {\n value: T;\n /** The fallback was served (flag missing, value null or of the wrong type). */\n usedFallback: boolean;\n}\n\n/** Synchronous flag getters. They never throw: problems give the fallback. */\nexport interface FlagsEvaluator {\n /** Boolean flag value; `fallback` (default `false`) when missing or not a boolean. */\n isEnabled(key: string, fallback?: boolean): boolean;\n /** Flag value; `fallback` when missing, null or of a different JSON type than `fallback`. */\n getValue<T extends JsonValue>(key: string, fallback: T): FlagValue<T>;\n getString(key: string, fallback: string): string;\n getNumber(key: string, fallback: number): number;\n getBoolean(key: string, fallback: boolean): boolean;\n /** Object or array value. */\n getJson<T = JsonValue>(key: string, fallback: T): T;\n /** Value plus why it was served (reason, rule, variation, experiment). */\n getDetails<T extends JsonValue>(key: string, fallback: T): FlagDetails<FlagValue<T>>;\n /** Every flag's value for these attributes (no exposures or usage are recorded). */\n getAll(): Record<string, JsonValue>;\n /** The attributes these getters evaluate with. */\n getAttributes(): Attributes;\n}\n\n/** What framework bindings read from: an evaluator that can say whether it has loaded and notify changes. */\nexport interface FlagsReader extends FlagsEvaluator {\n isReady(): boolean;\n /** Calls `listener` whenever values may have changed. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void;\n}\n\nexport type Resolver = (key: string) => EvaluationResult;\n\nfunction typeMatches(value: unknown, fallback: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (fallback === null || fallback === undefined) return true;\n return kindOf(value) === kindOf(fallback);\n}\n\n/** Builds the getters from a resolver (key → result). */\nexport function makeEvaluator(resolve: Resolver, all: () => Record<string, JsonValue>, attributes: () => Attributes): FlagsEvaluator {\n const details = <T,>(key: string, fallback: T): FlagDetails<T> => {\n const r = resolve(key);\n const ok = typeMatches(r.value, fallback);\n return { ...r, value: ok ? (r.value as T) : fallback, usedFallback: !ok };\n };\n const of = <T,>(type: string, key: string, fallback: T): T => {\n const v = resolve(key).value;\n return kindOf(v) === type ? (v as T) : fallback;\n };\n return {\n isEnabled: (key, fallback = false) => of(\"boolean\", key, fallback),\n getValue: <T extends JsonValue>(key: string, fallback: T) => details(key, fallback).value as FlagValue<T>,\n getString: (key, fallback) => of(\"string\", key, fallback),\n getNumber: (key, fallback) => of(\"number\", key, fallback),\n getBoolean: (key, fallback) => of(\"boolean\", key, fallback),\n getJson: <T,>(key: string, fallback: T) => {\n const v = resolve(key).value;\n return v !== null && typeof v === \"object\" ? (v as T) : fallback;\n },\n getDetails: details as FlagsEvaluator[\"getDetails\"],\n getAll: all,\n getAttributes: attributes,\n };\n}\n\nexport function notFound(key: string): EvaluationResult {\n return { key, value: null, reason: \"FLAG_NOT_FOUND\", inExperiment: false };\n}\n\nexport interface StaticFlagsInput {\n /** A payload (or remote-evaluation results) from `client.getPayload()` on the server. */\n payload?: FlagsPayload | RemoteEvaluationResponse | unknown;\n attributes?: Attributes;\n now?: Date | number;\n}\n\n/**\n * A network-free, read-only snapshot over a bootstrap payload. Framework bindings render with it\n * on the server and during hydration so the HTML matches; it records no exposures or usage.\n * Encrypted payloads cannot be read synchronously and give fallbacks.\n */\nexport function createStaticFlags(input: StaticFlagsInput = {}): FlagsReader {\n const attrs = { ...(input.attributes ?? {}) };\n const p = input.payload;\n const payload = isFlagsPayload(p) && !isEncryptedPayload(p) ? p : null;\n const results = !payload && isRemoteResults(p) ? p.flags : null;\n const resolve: Resolver = (key) => {\n try {\n if (payload) return evaluateFlag(payload, key, attrs, { now: input.now });\n return results?.[key] ?? notFound(key);\n } catch {\n return notFound(key);\n }\n };\n const all = () => {\n const out: Record<string, JsonValue> = {};\n for (const key of Object.keys(payload?.flags ?? results ?? {})) out[key] = resolve(key).value;\n return out;\n };\n return { ...makeEvaluator(resolve, all, () => ({ ...attrs })), isReady: () => !!(payload || results), subscribe: () => () => {} };\n}\n","/** Incremental `text/event-stream` parser for runtimes without `EventSource` (Node, Deno, Bun, edge). */\nexport function createSseParser(onEvent: (event: string, data: string) => void): { feed(chunk: string): void; end(): void } {\n let buffer = \"\";\n const dispatch = (raw: string) => {\n let event = \"message\";\n const data: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (!line || line.startsWith(\":\")) continue; // comments (`: ping`)\n const i = line.indexOf(\":\");\n const field = i < 0 ? line : line.slice(0, i);\n const value = i < 0 ? \"\" : line.slice(i + 1).replace(/^ /, \"\");\n if (field === \"event\") event = value;\n else if (field === \"data\") data.push(value);\n }\n if (data.length) onEvent(event, data.join(\"\\n\"));\n };\n return {\n feed(chunk) {\n buffer += chunk.replace(/\\r\\n?/g, \"\\n\");\n let sep: number;\n while ((sep = buffer.indexOf(\"\\n\\n\")) >= 0) {\n dispatch(buffer.slice(0, sep));\n buffer = buffer.slice(sep + 2);\n }\n },\n end() {\n if (buffer.trim()) dispatch(buffer);\n buffer = \"\";\n },\n };\n}\n","/**\n * The feature-flag client (docs/feature-flags-spec.md §4): downloads the environment's payload (or\n * asks the server to evaluate), keeps it fresh, evaluates locally and reports usage and exposures.\n * Isomorphic: browsers, Node ≥ 18, Next.js server and edge, Deno, Bun and React Native. Uses the\n * global `fetch` (injectable) and touches no DOM or Node API at module scope.\n */\nimport { decryptPayloadString } from \"./crypto\";\nimport { readDevOverrides } from \"./dev-overrides\";\nimport { evaluateFlag, textOf } from \"./evaluate\";\nimport { makeEvaluator, notFound, type FlagDetails, type FlagValue, type FlagsEvaluator, type FlagsReader } from \"./evaluator\";\nimport { createSseParser } from \"./sse\";\nimport type { Attributes, EncryptedFlagsPayload, EvaluationResult, ExperimentAssignment, FlagEventsBatch, FlagsPayload, JsonValue, RemoteEvaluationResponse, StickyBucketStore } from \"./types\";\nimport { compact, isDev, isEncryptedPayload, isFlagsPayload, isRemoteResults, parseUrlOverrides, stableStringify, timer } from \"./util\";\n\nexport const FLAGS_SDK_NAME = \"@guidelytech/flags\";\nexport const FLAGS_SDK_VERSION = \"0.15.0\";\nexport const DEFAULT_FLAGS_API_URL = \"https://guidelytech.com\";\n\n/**\n * - `auto` — fetch at start, then every `pollIntervalSeconds`.\n * - `lazy` — fetch when a flag is read and the cache is older than `cacheTtlSeconds` (serverless, edge).\n * - `manual` — only `refresh()` fetches.\n * - `stream` — server-sent events push changes; polls while the stream is down.\n */\nexport type PollingMode = \"auto\" | \"lazy\" | \"manual\" | \"stream\";\n/** `localOnly`: never fetch; serve overrides, then the bootstrap. `localOverRemote`: overrides win. `remoteOverLocal`: overrides fill in flags missing remotely. */\nexport type OverrideBehaviour = \"localOnly\" | \"localOverRemote\" | \"remoteOverLocal\";\n\n/** Key/value storage for the last payload: `localStorage`-like or AsyncStorage-like (sync or async). */\nexport interface FlagsStorage {\n getItem(key: string): string | null | undefined | Promise<string | null | undefined>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem?(key: string): void | Promise<void>;\n}\n\nexport interface FlagsLogger {\n debug?(...args: unknown[]): void;\n warn?(...args: unknown[]): void;\n error?(...args: unknown[]): void;\n}\n\n/** What a bootstrap / `getPayload()` can hold. */\nexport type FlagsBootstrap = FlagsPayload | EncryptedFlagsPayload | RemoteEvaluationResponse;\n\nexport interface FlagsClientOptions {\n /** Environment public key `pk_…` (the `projectId` used for tracking) or, on servers only, a secret `gly_sk_…` key. */\n sdkKey?: string;\n /** Alias of `sdkKey`. */\n projectId?: string;\n /** Base URL of your Guidely deployment (default `https://guidelytech.com`). */\n apiUrl?: string;\n /** `development` | `staging` | `production`. Required with a `gly_sk_` key. */\n environment?: string;\n /** Default attributes, merged under per-call (`forUser`) attributes. */\n attributes?: Attributes;\n /**\n * Attributes supplied by a Guidely SDK integration (identity, page, device). App attributes\n * (`attributes`, `setAttributes`) are merged over them.\n */\n contextAttributes?: Attributes;\n pollingMode?: PollingMode;\n /** `auto` / `stream` fallback polling interval (default 60). */\n pollIntervalSeconds?: number;\n /** `lazy` cache lifetime (default 60). */\n cacheTtlSeconds?: number;\n /** Bootstrap: a payload (plain or encrypted) or remote-evaluation results, used immediately. */\n payload?: FlagsBootstrap | null;\n /** Bootstrap for remote evaluation: `{ version, flags }` or a map of results. */\n remoteResults?: RemoteEvaluationResponse | Record<string, EvaluationResult> | null;\n /** Base64 AES-256 key for environments that encrypt their payload. */\n decryptionKey?: string;\n /** Ask the server to evaluate (`POST /flags/evaluate`) instead of downloading rules. Needed when the environment hides rules. */\n remoteEval?: boolean;\n /** Debounce for re-evaluating remotely after attribute changes (default 50 ms). */\n remoteEvalDebounceMs?: number;\n /** Local flag values (tests, QA, kill switches) applied per `overrideBehaviour`. */\n overrides?: Record<string, JsonValue> | null;\n overrideBehaviour?: OverrideBehaviour;\n /**\n * Read dev overrides from outside the code (default `true`): `GUIDELY_FLAG_OVERRIDES`,\n * `GUIDELY_FLAG_OVERRIDES_FILE` and `GUIDELY_FLAG_OVERRIDE_BEHAVIOUR` environment variables, and\n * the `__GUIDELY_FLAG_OVERRIDES__` / `__GUIDELY_FLAG_OVERRIDE_BEHAVIOUR__` globals (browser tests).\n * They win over `overrides`, and their behaviour over `overrideBehaviour`.\n */\n devOverrides?: boolean;\n /** Keeps experiment assignments stable (`InMemoryStickyBucketStore`, `LocalStorageStickyBucketStore`). */\n stickyBucketService?: StickyBucketStore;\n /** Persists the last payload. Default: `localStorage` in browsers, none elsewhere. `false` disables. */\n storage?: FlagsStorage | null | false;\n /** Browser only: read `?guidely_flags=key:value,key2:\"text\"` from the URL as overrides (QA). */\n enableUrlOverrides?: boolean;\n /** Called once per (experiment, user, variation) when a user is bucketed into an experiment. */\n trackingCallback?: (experiment: ExperimentAssignment, result: EvaluationResult) => void;\n /** Send experiment exposures to Guidely (`POST /flags/events`). Default: `true` unless `trackingCallback` is set. */\n trackExposures?: boolean;\n /** Send aggregated evaluation counts to Guidely at most every 60 s (default `true`). */\n reportUsage?: boolean;\n onReady?: () => void;\n /** New payload (or remote results) applied. */\n onChange?: (data: FlagsPayload | RemoteEvaluationResponse) => void;\n onFlagEvaluated?: (result: EvaluationResult) => void;\n onError?: (error: Error) => void;\n /** Start without network activity (cached / bootstrapped data keeps serving). */\n offline?: boolean;\n fetch?: typeof fetch;\n /**\n * Defaults to `console`: `error` for failed requests (once per streak), `warn` for misuse and,\n * in development, reads of flags that do not exist. `null` silences the client.\n */\n logger?: FlagsLogger | null;\n /** Evaluation clock (tests). */\n now?: () => Date | number;\n /** Reported with usage (set by Guidely SDK integrations). */\n sdk?: { name: string; version: string };\n}\n\ninterface Resolved {\n mode: PollingMode;\n pollMs: number;\n ttlMs: number;\n debounceMs: number;\n behaviour: OverrideBehaviour;\n trackExposures: boolean;\n reportUsage: boolean;\n}\n\ntype Exposure = NonNullable<FlagEventsBatch[\"exposures\"]>[number];\ninterface HttpResult<T> {\n status: number;\n ok: boolean;\n data: T | null;\n etag: string | null;\n}\n\nconst SECRET_PREFIX = \"gly_sk_\";\nconst MAX_RESULT_CACHE = 20;\nconst MAX_QUEUE = 1000;\nconst USAGE_FLUSH_MS = 60_000;\nconst EXPOSURE_FLUSH_MS = 5_000;\nconst MAX_BACKOFF_MS = 5 * 60_000;\n\nconst isBrowser = () => typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nfunction defaultStorage(): FlagsStorage | null {\n try {\n if (!isBrowser() || typeof localStorage === \"undefined\") return null;\n const probe = \"__guidely_flags_probe__\";\n localStorage.setItem(probe, \"1\");\n localStorage.removeItem(probe);\n return localStorage;\n } catch {\n return null;\n }\n}\n\nfunction backoff(failures: number, capMs: number): number {\n const base = Math.min(capMs, 1000 * 2 ** Math.max(0, failures - 1));\n return Math.round(base * (0.8 + Math.random() * 0.4));\n}\n\n/**\n * Feature flags for one environment. Create with {@link createFlagsClient}; one per app (browser)\n * or per process (server — use {@link FlagsClient.forUser} per request).\n */\nexport class FlagsClient implements FlagsReader {\n readonly sdkKey: string;\n readonly apiUrl: string;\n readonly environment: string | undefined;\n private readonly o: FlagsClientOptions;\n private readonly cfg: Resolved;\n private readonly secret: boolean;\n private readonly log: FlagsLogger;\n private readonly storage: FlagsStorage | null;\n private readonly storageKey: string;\n private readonly getters: FlagsEvaluator;\n private payload: FlagsPayload | null = null;\n /** The payload as received (possibly encrypted): what `getPayload()` hands to browsers. */\n private raw: FlagsPayload | EncryptedFlagsPayload | null = null;\n private etag: string | null = null;\n private remote: boolean;\n private results: RemoteEvaluationResponse | null = null;\n private resultsKey: string | null = null;\n private readonly resultCache = new Map<string, RemoteEvaluationResponse>();\n private context: Attributes;\n private attributes: Attributes;\n private overrides: Record<string, JsonValue>;\n private readonly devOverrides: Record<string, JsonValue>;\n private readonly urlOverrides: Record<string, JsonValue>;\n private offline: boolean;\n private destroyed = false;\n private ready_ = false;\n private resolveReady!: () => void;\n private readonly readyPromise: Promise<void>;\n private readonly listeners = new Set<() => void>();\n private inflight: Promise<boolean> | null = null;\n private lastFetchAt = 0;\n private failures = 0;\n private retryAt = 0;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private remoteTimer: ReturnType<typeof setTimeout> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private flushDue = Infinity;\n private stream: { close(): void } | null = null;\n private streamConnected = false;\n private streamFailures = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly exposed = new Set<string>();\n private readonly usage = new Map<string, { flag: string; variationId?: string; value: string; count: number }>();\n private exposures: Exposure[] = [];\n private readonly warned = new Set<string>();\n private cleanups: Array<() => void> = [];\n private lastError = \"\";\n\n constructor(options: FlagsClientOptions) {\n const o = options ?? {};\n this.o = o;\n const key = o.sdkKey ?? o.projectId ?? \"\";\n if (!key) throw new Error(\"[Guidely flags] `sdkKey` (your environment public key pk_…, or a gly_sk_… secret key on servers) is required.\");\n this.sdkKey = key;\n this.secret = key.startsWith(SECRET_PREFIX);\n this.environment = o.environment;\n this.apiUrl = (o.apiUrl || DEFAULT_FLAGS_API_URL).replace(/\\/+$/, \"\");\n this.log = o.logger === null ? {} : (o.logger ?? { warn: (...a) => console.warn(\"[Guidely flags]\", ...a), error: (...a) => console.error(\"[Guidely flags]\", ...a) });\n if (this.secret && !o.environment) throw new Error(\"[Guidely flags] `environment` (development | staging | production) is required with a gly_sk_ key.\");\n if (this.secret && isBrowser()) this.log.warn?.(\"A gly_sk_ secret key is being used in a browser. Secret keys belong on servers; use the environment's public pk_ key here.\");\n const dev = o.devOverrides === false ? null : readDevOverrides();\n this.cfg = {\n mode: o.pollingMode ?? \"auto\",\n pollMs: Math.max(1, o.pollIntervalSeconds ?? 60) * 1000,\n ttlMs: Math.max(0, o.cacheTtlSeconds ?? 60) * 1000,\n debounceMs: Math.max(0, o.remoteEvalDebounceMs ?? 50),\n behaviour: dev?.behaviour ?? o.overrideBehaviour ?? \"localOverRemote\",\n trackExposures: o.trackExposures ?? !o.trackingCallback,\n reportUsage: o.reportUsage ?? true,\n };\n this.remote = !!o.remoteEval;\n this.offline = !!o.offline;\n this.context = compact(o.contextAttributes ?? {});\n this.attributes = compact(o.attributes ?? {});\n this.overrides = { ...(o.overrides ?? {}) };\n this.devOverrides = dev?.values ?? {};\n this.urlOverrides = o.enableUrlOverrides && isBrowser() ? parseUrlOverrides(location.search) : {};\n this.storage = o.storage === false || o.storage === null ? null : (o.storage ?? defaultStorage());\n this.storageKey = `guidely:flags:${key}${o.environment && this.secret ? `:${o.environment}` : \"\"}`;\n this.readyPromise = new Promise<void>((r) => (this.resolveReady = r));\n if (dev) {\n dev.errors.forEach((e) => this.reportError(new Error(e)));\n const n = Object.keys(dev.values).length;\n if (dev.sources.length) this.log.warn?.(`Dev overrides from ${dev.sources.join(\", \")}: ${n} flag${n === 1 ? \"\" : \"s\"}, behaviour ${this.cfg.behaviour}.`);\n }\n this.getters = makeEvaluator(\n (k) => this.resolve(k, this.getAttributes(), true),\n () => this.all(this.getAttributes()),\n () => this.getAttributes(),\n );\n\n // Synchronous bootstrap: plain payloads and remote results serve from the first render.\n const boot = o.payload;\n if (isRemoteResults(boot)) this.setResults(boot, stableStringify(this.getAttributes()), false);\n else if (isFlagsPayload(boot) && !isEncryptedPayload(boot)) this.setPayload(boot, boot, null, false);\n if (o.remoteResults) {\n const r = o.remoteResults as RemoteEvaluationResponse;\n this.setResults(isRemoteResults(r) && typeof r.version === \"number\" ? r : { version: 0, flags: o.remoteResults as Record<string, EvaluationResult> }, stableStringify(this.getAttributes()), false);\n }\n if (this.results) this.remote = true;\n this.wireBrowser();\n // Bootstrapped (plain payload or results): ready now, so server and browser render the same.\n if (this.payload || this.results) this.settle();\n void this.start();\n }\n\n // ---------------------------------------------------------------------------\n // Getters (never throw)\n // ---------------------------------------------------------------------------\n\n /** Boolean flag value; `fallback` (default `false`) when missing or not a boolean. */\n isEnabled(key: string, fallback = false): boolean {\n return this.getters.isEnabled(key, fallback);\n }\n /** Flag value; `fallback` when missing, null or of a different JSON type than `fallback`. */\n getValue<T extends JsonValue>(key: string, fallback: T): FlagValue<T> {\n return this.getters.getValue(key, fallback);\n }\n getString(key: string, fallback: string): string {\n return this.getters.getString(key, fallback);\n }\n getNumber(key: string, fallback: number): number {\n return this.getters.getNumber(key, fallback);\n }\n getBoolean(key: string, fallback: boolean): boolean {\n return this.getters.getBoolean(key, fallback);\n }\n getJson<T = JsonValue>(key: string, fallback: T): T {\n return this.getters.getJson(key, fallback);\n }\n /** Value plus reason, rule, variation and experiment assignment. */\n getDetails<T extends JsonValue>(key: string, fallback: T): FlagDetails<FlagValue<T>> {\n return this.getters.getDetails(key, fallback);\n }\n /** Every flag's value for the current attributes (records no exposures or usage). */\n getAll(): Record<string, JsonValue> {\n return this.getters.getAll();\n }\n\n /**\n * Getters bound to other attributes (merged over the client's), without changing the client:\n * the per-request pattern on servers. With remote evaluation they serve results already cached\n * for these attributes, else fallbacks.\n */\n forUser(attributes: Attributes): FlagsEvaluator {\n const attrs = { ...this.getAttributes(), ...compact(attributes ?? {}) };\n if (this.remote) this.warnOnce(\"forUser:remote\", \"forUser() with remote evaluation only serves results cached for those attributes.\");\n return makeEvaluator(\n (k) => this.resolve(k, attrs, true),\n () => this.all(attrs),\n () => ({ ...attrs }),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Attributes and overrides\n // ---------------------------------------------------------------------------\n\n /** Replaces the app attributes. */\n setAttributes(attributes: Attributes): void {\n this.changeAttributes(() => (this.attributes = compact(attributes ?? {})));\n }\n /** Merges into the app attributes. */\n updateAttributes(partial: Attributes): void {\n this.changeAttributes(() => (this.attributes = compact({ ...this.attributes, ...partial })));\n }\n /** Replaces the integration-supplied attributes (see `contextAttributes`). */\n setContextAttributes(attributes: Attributes): void {\n this.changeAttributes(() => (this.context = compact(attributes ?? {})));\n }\n /** Context attributes with app attributes merged over them. */\n getAttributes(): Attributes {\n return { ...this.context, ...this.attributes };\n }\n\n /** Replaces the overrides (`null` clears them). Dev and URL overrides stay. */\n setOverrides(overrides: Record<string, JsonValue> | null): void {\n this.overrides = { ...(overrides ?? {}) };\n this.notify();\n }\n\n private changeAttributes(apply: () => void): void {\n const before = stableStringify(this.getAttributes());\n apply();\n const after = stableStringify(this.getAttributes());\n if (before === after) return;\n if (this.remote) {\n const cached = this.resultCache.get(after);\n if (cached) {\n this.results = cached;\n this.resultsKey = after;\n }\n this.scheduleRemote();\n }\n this.notify();\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /** Resolves once the first load settled (bootstrap, network success or failure). Never rejects. */\n ready(): Promise<void> {\n return this.readyPromise;\n }\n isReady(): boolean {\n return this.ready_;\n }\n\n /** Calls `listener` whenever values may have changed (payload, attributes, overrides, readiness). */\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => void this.listeners.delete(listener);\n };\n\n /** `true` stops all network activity; cached data keeps serving. `false` resumes and refreshes. */\n setOffline(offline: boolean): void {\n if (this.offline === offline) return;\n this.offline = offline;\n if (offline) return this.stopNetwork();\n void this.refresh().then(() => this.schedule());\n }\n\n /** Fetches now (payload, or remote evaluation). Resolves when done; never rejects. */\n async refresh(): Promise<void> {\n await this.fetchNow();\n }\n\n /**\n * The current data for server-side rendering: pass it as `payload` to the browser client (or\n * framework provider) to render the same values without a flash. Encrypted payloads stay\n * encrypted; with remote evaluation it returns the results. `null` before anything loaded.\n */\n getPayload(): FlagsBootstrap | null {\n if (this.remote) return this.results;\n return this.raw;\n }\n\n /** Sends pending usage counts and exposures now. */\n async flush(): Promise<void> {\n const batch = this.takeBatch();\n if (!batch) return;\n try {\n const res = await this.request<unknown>(\"POST\", \"/flags/events\", { body: batch, keepalive: true });\n if (!res.ok && (res.status >= 500 || res.status === 429)) this.requeue(batch);\n } catch {\n this.requeue(batch);\n }\n }\n\n /** Stops timers and streams and sends pending usage. The client keeps serving cached values. */\n destroy(): void {\n if (this.destroyed) return;\n this.flushOnExit();\n this.destroyed = true;\n this.stopNetwork();\n if (this.flushTimer) clearTimeout(this.flushTimer);\n this.cleanups.splice(0).forEach((fn) => fn());\n this.listeners.clear();\n this.settle();\n }\n\n // ---------------------------------------------------------------------------\n // Evaluation\n // ---------------------------------------------------------------------------\n\n private overrideFor(key: string): JsonValue | undefined {\n if (Object.prototype.hasOwnProperty.call(this.urlOverrides, key)) return this.urlOverrides[key];\n if (Object.prototype.hasOwnProperty.call(this.devOverrides, key)) return this.devOverrides[key];\n if (Object.prototype.hasOwnProperty.call(this.overrides, key)) return this.overrides[key];\n return undefined;\n }\n\n private resolve(key: string, attrs: Attributes, track: boolean): EvaluationResult {\n let res: EvaluationResult;\n try {\n if (this.cfg.mode === \"lazy\") this.lazyRefresh();\n const ov = this.overrideFor(key);\n const forced = Object.prototype.hasOwnProperty.call(this.urlOverrides, key);\n const override: EvaluationResult | null = ov === undefined ? null : { key, value: ov, reason: \"OVERRIDE\", inExperiment: false };\n if (override && (forced || this.cfg.behaviour !== \"remoteOverLocal\")) res = override;\n else {\n res = this.evaluateRemoteOrLocal(key, attrs);\n if (override && res.reason === \"FLAG_NOT_FOUND\") res = override;\n }\n } catch (err) {\n res = { key, value: null, reason: \"ERROR\", inExperiment: false, errorMessage: err instanceof Error ? err.message : String(err) };\n }\n if (track) this.record(res, attrs);\n return res;\n }\n\n private evaluateRemoteOrLocal(key: string, attrs: Attributes): EvaluationResult {\n if (this.remote) {\n const k = stableStringify(attrs);\n const results = k === this.resultsKey || k === stableStringify(this.getAttributes()) ? this.results : this.resultCache.get(k);\n return results?.flags[key] ?? notFound(key);\n }\n if (!this.payload) return notFound(key);\n return evaluateFlag(this.payload, key, attrs, { now: this.now(), stickyBuckets: this.o.stickyBucketService });\n }\n\n private all(attrs: Attributes): Record<string, JsonValue> {\n const keys = new Set<string>([...Object.keys(this.overrides), ...Object.keys(this.devOverrides), ...Object.keys(this.urlOverrides)]);\n if (this.remote) for (const k of Object.keys(this.results?.flags ?? {})) keys.add(k);\n else for (const k of Object.keys(this.payload?.flags ?? {})) keys.add(k);\n const out: Record<string, JsonValue> = {};\n for (const k of keys) {\n const v = this.resolve(k, attrs, false).value;\n if (v !== null) out[k] = v;\n }\n return out;\n }\n\n private now(): number {\n const n = this.o.now?.();\n return n === undefined ? Date.now() : typeof n === \"number\" ? n : n.getTime();\n }\n\n private record(res: EvaluationResult, attrs: Attributes): void {\n try {\n this.o.onFlagEvaluated?.(res);\n } catch (err) {\n this.reportError(err);\n }\n if (res.reason === \"FLAG_NOT_FOUND\") {\n if (this.ready_ && (this.payload || this.results) && isDev()) this.warnOnce(`missing:${res.key}`, `Flag \"${res.key}\" does not exist in this environment; serving the fallback.`);\n return;\n }\n if (res.reason === \"OVERRIDE\" || res.reason === \"ERROR\") return;\n if (this.cfg.reportUsage) {\n const value = (JSON.stringify(res.value) ?? \"null\").slice(0, 200);\n const k = `${res.key}\\u0000${res.variationId ?? \"\"}\\u0000${res.variationId ? \"\" : value}`;\n const u = this.usage.get(k);\n if (u) u.count++;\n else if (this.usage.size < MAX_QUEUE) this.usage.set(k, { flag: res.key, ...(res.variationId ? { variationId: res.variationId } : {}), value, count: 1 });\n this.scheduleFlush(USAGE_FLUSH_MS);\n }\n const exp = res.inExperiment ? res.experiment : undefined;\n if (!exp) return;\n const dedupe = `${exp.key}\\u0000${exp.hashValue}\\u0000${exp.variationId}`;\n if (this.exposed.has(dedupe)) return;\n if (this.exposed.size >= 50_000) this.exposed.clear(); // long-running servers evaluating many users\n this.exposed.add(dedupe);\n try {\n this.o.trackingCallback?.(exp, res);\n } catch (err) {\n this.reportError(err);\n }\n if (!this.cfg.trackExposures) return;\n const userId = textOf(attrs.id);\n const anonymousId = textOf(attrs.anonymousId);\n if (this.exposures.length < MAX_QUEUE) {\n this.exposures.push({ experiment: exp.key, flag: res.key, variationId: exp.variationId, hashAttribute: exp.hashAttribute, hashValue: exp.hashValue, ...(userId ? { userId } : {}), ...(anonymousId ? { anonymousId } : {}), timestamp: new Date(this.now()).toISOString() });\n }\n this.scheduleFlush(EXPOSURE_FLUSH_MS);\n }\n\n private warnOnce(id: string, message: string): void {\n if (this.warned.has(id)) return;\n this.warned.add(id);\n this.log.warn?.(message);\n }\n\n // ---------------------------------------------------------------------------\n // Data\n // ---------------------------------------------------------------------------\n\n private setPayload(payload: FlagsPayload, raw: FlagsPayload | EncryptedFlagsPayload, etag: string | null, emit: boolean): void {\n const same = this.payload && this.payload.version === payload.version && this.payload.generatedAt === payload.generatedAt && this.payload.environment === payload.environment;\n this.payload = payload;\n this.raw = raw;\n this.etag = etag;\n if (!emit || same) return;\n try {\n this.o.onChange?.(payload);\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n private setResults(results: RemoteEvaluationResponse, key: string, emit: boolean): void {\n this.resultCache.delete(key);\n this.resultCache.set(key, results);\n while (this.resultCache.size > MAX_RESULT_CACHE) this.resultCache.delete(this.resultCache.keys().next().value!);\n if (key !== stableStringify(this.getAttributes())) return; // attributes moved on meanwhile\n const same = this.results && stableStringify(this.results) === stableStringify(results);\n this.results = results;\n this.resultsKey = key;\n if (!emit || same) return;\n try {\n this.o.onChange?.(results);\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n /** Decrypts when needed and applies. Returns false (keeping the previous payload) when unusable. */\n private async applyRaw(raw: unknown, etag: string | null): Promise<boolean> {\n if (isEncryptedPayload(raw)) {\n if (!this.o.decryptionKey) {\n this.reportError(new Error(\"The payload is encrypted but no `decryptionKey` was given; keeping the previous flags.\"));\n return false;\n }\n try {\n const plain = JSON.parse(await decryptPayloadString(raw.encryptedPayload, this.o.decryptionKey)) as Partial<FlagsPayload>;\n const envelope: Record<string, unknown> = { ...raw };\n delete envelope.encryptedPayload;\n const merged = { ...envelope, ...plain } as FlagsPayload;\n if (!isFlagsPayload(merged)) throw new Error(\"decrypted payload has no flags\");\n this.setPayload(merged, raw, etag, true);\n return true;\n } catch (err) {\n this.reportError(new Error(`Could not decrypt the flags payload (${err instanceof Error ? err.message : String(err)}); keeping the previous flags.`));\n return false;\n }\n }\n if (!isFlagsPayload(raw)) {\n this.reportError(new Error(\"Unexpected flags payload; keeping the previous flags.\"));\n return false;\n }\n this.setPayload(raw, raw, etag, true);\n return true;\n }\n\n private async loadStored(): Promise<void> {\n if (!this.storage) return;\n try {\n const text = await this.storage.getItem(this.storageKey);\n if (!text || this.payload) return;\n const saved = JSON.parse(text) as { payload?: unknown; etag?: string | null };\n if (saved?.payload && !this.payload) await this.applyRaw(saved.payload, saved.etag ?? null);\n } catch (err) {\n this.log.debug?.(\"could not read cached flags\", err);\n }\n }\n\n private persist(): void {\n if (!this.storage || !this.raw) return;\n try {\n void Promise.resolve(this.storage.setItem(this.storageKey, JSON.stringify({ payload: this.raw, etag: this.etag, savedAt: new Date().toISOString() }))).catch(() => {});\n } catch {\n /* quota / private mode */\n }\n }\n\n // ---------------------------------------------------------------------------\n // Network\n // ---------------------------------------------------------------------------\n\n private url(path: string): string {\n const q = this.secret ? `environment=${encodeURIComponent(this.environment ?? \"\")}` : `key=${encodeURIComponent(this.sdkKey)}`;\n return `${this.apiUrl}/api/v1/sdk${path}?${q}`;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n return { ...extra, ...(this.secret ? { Authorization: `Bearer ${this.sdkKey}` } : { \"X-Guidely-Key\": this.sdkKey }) };\n }\n\n private get fetcher(): typeof fetch | null {\n if (this.o.fetch) return this.o.fetch;\n return typeof fetch === \"function\" ? fetch.bind(globalThis) : null;\n }\n\n private async request<T>(method: \"GET\" | \"POST\", path: string, opts: { body?: unknown; etag?: string | null; keepalive?: boolean; timeoutMs?: number } = {}): Promise<HttpResult<T>> {\n const f = this.fetcher;\n if (!f) throw new Error(\"fetch is not available; pass `fetch`\");\n const headers = this.headers({ Accept: \"application/json\" });\n if (opts.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n if (opts.etag) headers[\"If-None-Match\"] = opts.etag;\n const ac = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const t = ac ? timer(() => ac.abort(), opts.timeoutMs ?? 10_000) : null;\n try {\n // `credentials` / `keepalive` only in browsers: some edge runtimes reject unknown RequestInit fields.\n const browserOnly: RequestInit = isBrowser() ? { credentials: \"omit\", keepalive: opts.keepalive } : {};\n const res = await f(this.url(path), { method, headers, body: opts.body === undefined ? undefined : JSON.stringify(opts.body), signal: ac?.signal, ...browserOnly });\n let data: T | null = null;\n if (res.status !== 304 && res.status !== 204) {\n try {\n data = (await res.json()) as T;\n } catch {\n data = null;\n }\n }\n return { status: res.status, ok: res.ok, data, etag: res.headers?.get?.(\"etag\") ?? null };\n } finally {\n if (t) clearTimeout(t);\n }\n }\n\n private fetchNow(): Promise<boolean> {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return Promise.resolve(false);\n if (this.inflight) return this.inflight;\n this.inflight = (this.remote ? this.fetchRemote() : this.fetchPayload())\n .catch((err) => {\n this.reportError(err);\n return false;\n })\n .then((ok) => {\n this.inflight = null;\n this.lastFetchAt = Date.now();\n this.failures = ok ? 0 : this.failures + 1;\n this.retryAt = ok ? 0 : Date.now() + backoff(this.failures, Math.max(this.cfg.pollMs, MAX_BACKOFF_MS));\n if (ok) this.lastError = \"\";\n return ok;\n });\n return this.inflight;\n }\n\n private async fetchPayload(): Promise<boolean> {\n let res: HttpResult<unknown>;\n try {\n res = await this.request<unknown>(\"GET\", \"/flags\", { etag: this.payload ? this.etag : null });\n } catch (err) {\n this.reportError(new Error(`Flags request failed: ${err instanceof Error ? err.message : String(err)}`));\n return false;\n }\n if (res.status === 304) return true;\n const code = (res.data as { error?: { code?: string } } | null)?.error?.code;\n if (res.status === 403 && code === \"remote_evaluation_required\" && !this.secret) {\n // The environment hides its rules from public keys: evaluate on the server instead.\n this.log.warn?.(\"This environment requires remote evaluation; switching to `remoteEval: true`.\");\n this.remote = true;\n return this.fetchRemote();\n }\n if (!res.ok || res.data == null) {\n this.reportError(new Error(`Flags request failed (${res.status}${code ? ` ${code}` : \"\"})${this.payload ? \"; serving the last good flags\" : \"\"}`));\n return false;\n }\n const applied = await this.applyRaw(res.data, res.etag);\n if (applied) this.persist();\n return applied;\n }\n\n private async fetchRemote(): Promise<boolean> {\n const attrs = this.getAttributes();\n const key = stableStringify(attrs);\n let res: HttpResult<RemoteEvaluationResponse>;\n try {\n res = await this.request<RemoteEvaluationResponse>(\"POST\", \"/flags/evaluate\", { body: { attributes: attrs } });\n } catch (err) {\n this.reportError(new Error(`Remote evaluation failed: ${err instanceof Error ? err.message : String(err)}`));\n return false;\n }\n if (!res.ok || !res.data || !isRemoteResults(res.data)) {\n this.reportError(new Error(`Remote evaluation failed (${res.status})`));\n return false;\n }\n this.setResults(res.data, key, true);\n return true;\n }\n\n private scheduleRemote(): void {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return;\n if (this.remoteTimer) clearTimeout(this.remoteTimer);\n this.remoteTimer = timer(() => {\n this.remoteTimer = null;\n void this.fetchRemote().then((ok) => {\n if (!ok) this.failures++;\n });\n }, this.cfg.debounceMs);\n }\n\n private lazyRefresh(): void {\n if (this.inflight || this.offline || this.destroyed || this.cfg.behaviour === \"localOnly\") return;\n const now = Date.now();\n if (now - this.lastFetchAt < this.cfg.ttlMs || now < this.retryAt) return;\n this.lastFetchAt = now; // one fetch per expiry, however many reads\n void this.fetchNow();\n }\n\n private async start(): Promise<void> {\n const boot = this.o.payload;\n if (isEncryptedPayload(boot)) await this.applyRaw(boot, null);\n // localOnly is hermetic: a payload cached by an earlier run must not leak into tests.\n if (!this.payload && !this.results && !this.remote && this.cfg.behaviour !== \"localOnly\") await this.loadStored();\n if (this.destroyed) return;\n const bootstrapped = !!(boot || this.o.remoteResults) && !!(this.payload || this.results);\n if (this.cfg.behaviour === \"localOnly\" || this.offline || this.cfg.mode === \"manual\") return this.settle();\n if (bootstrapped) {\n // Serve the bootstrap from the first render, then revalidate straight away: a server-rendered\n // payload can be a poll interval old, and a kill switch must not wait another one.\n this.settle();\n await this.fetchNow();\n return this.schedule();\n }\n await this.fetchNow();\n this.settle();\n this.schedule();\n }\n\n private settle(): void {\n if (this.ready_) return;\n this.ready_ = true;\n this.resolveReady();\n try {\n this.o.onReady?.();\n } catch (err) {\n this.reportError(err);\n }\n this.notify();\n }\n\n /** Arms the poll timer / stream for the current mode. */\n private schedule(): void {\n if (this.destroyed || this.offline || this.cfg.behaviour === \"localOnly\") return;\n if (this.cfg.mode === \"auto\") this.schedulePoll();\n else if (this.cfg.mode === \"stream\") {\n if (!this.stream) this.openStream();\n if (!this.streamConnected) this.schedulePoll();\n }\n }\n\n private schedulePoll(): void {\n if (this.pollTimer) clearTimeout(this.pollTimer);\n const delay = this.failures ? Math.max(0, this.retryAt - Date.now()) : this.cfg.pollMs;\n this.pollTimer = timer(() => {\n this.pollTimer = null;\n if (this.cfg.mode === \"stream\" && this.streamConnected) return;\n if (isBrowser() && document.visibilityState === \"hidden\") return this.schedulePoll(); // resumes on visibilitychange\n void this.fetchNow().then(() => this.schedule());\n }, delay);\n }\n\n private stopNetwork(): void {\n for (const t of [this.pollTimer, this.remoteTimer, this.reconnectTimer]) if (t) clearTimeout(t);\n this.pollTimer = this.remoteTimer = this.reconnectTimer = null;\n this.stream?.close();\n this.stream = null;\n this.streamConnected = false;\n }\n\n // ---------------------------------------------------------------------------\n // Streaming\n // ---------------------------------------------------------------------------\n\n private onStreamEvent(event: string, data: string): void {\n if (event !== \"flags\") return;\n let version: number | undefined;\n try {\n version = (JSON.parse(data) as { version?: number }).version;\n } catch {\n return;\n }\n const current = this.remote ? (this.results?.version ?? -1) : (this.payload?.version ?? -1);\n if (typeof version === \"number\" && version > current) void this.fetchNow();\n }\n\n private openStream(): void {\n if (this.destroyed || this.offline || this.stream) return;\n const url = this.url(\"/flags/stream\");\n const ES = (globalThis as { EventSource?: typeof EventSource }).EventSource;\n const opened = () => {\n this.streamConnected = true;\n this.streamFailures = 0;\n if (this.pollTimer) clearTimeout(this.pollTimer);\n this.pollTimer = null;\n };\n if (ES && !this.secret) {\n // EventSource cannot send headers: the public key travels in the query string.\n const es = new ES(url);\n es.addEventListener(\"flags\", (e) => this.onStreamEvent(\"flags\", (e as MessageEvent).data as string));\n es.onopen = opened;\n es.onerror = () => {\n es.close();\n if (this.stream === handle) this.streamDown();\n };\n const handle = { close: () => es.close() };\n this.stream = handle;\n return;\n }\n const f = this.fetcher;\n if (!f || typeof TextDecoder === \"undefined\") return this.streamDown(true);\n const ac = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const handle = { close: () => ac?.abort() };\n this.stream = handle;\n void (async () => {\n try {\n const res = await f(url, { headers: this.headers({ Accept: \"text/event-stream\" }), signal: ac?.signal, ...(isBrowser() ? { credentials: \"omit\" as const } : {}) });\n const reader = res.ok ? (res.body as ReadableStream<Uint8Array> | null)?.getReader?.() : undefined;\n if (!reader) {\n if (this.stream === handle) this.streamDown(res.ok); // no streaming body (React Native): poll instead\n return;\n }\n opened();\n const parser = createSseParser((event, data) => this.onStreamEvent(event, data));\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (value) parser.feed(decoder.decode(value, { stream: true }));\n if (done) break;\n }\n parser.end();\n } catch {\n /* aborted or dropped */\n }\n if (this.stream === handle) this.streamDown();\n })();\n }\n\n /** The stream dropped: poll meanwhile and reconnect with backoff (`permanent`: never retry). */\n private streamDown(permanent = false): void {\n this.stream = null;\n this.streamConnected = false;\n if (this.destroyed || this.offline) return;\n this.schedulePoll();\n if (permanent) return;\n this.streamFailures++;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = timer(() => {\n this.reconnectTimer = null;\n this.openStream();\n void this.fetchNow(); // catch up on changes missed while disconnected\n }, backoff(this.streamFailures, MAX_BACKOFF_MS));\n }\n\n // ---------------------------------------------------------------------------\n // Usage + exposures\n // ---------------------------------------------------------------------------\n\n private scheduleFlush(ms: number): void {\n if (this.destroyed) return;\n const due = Date.now() + ms;\n if (this.flushTimer && due >= this.flushDue) return;\n if (this.flushTimer) clearTimeout(this.flushTimer);\n this.flushDue = due;\n this.flushTimer = timer(() => {\n this.flushTimer = null;\n this.flushDue = Infinity;\n if (!this.offline) void this.flush();\n else if (this.usage.size || this.exposures.length) this.scheduleFlush(USAGE_FLUSH_MS);\n }, ms);\n }\n\n private takeBatch(): FlagEventsBatch | null {\n if (!this.usage.size && !this.exposures.length) return null;\n if (this.cfg.behaviour === \"localOnly\") {\n // localOnly makes no requests at all: nothing a test evaluates reaches Guidely.\n this.usage.clear();\n this.exposures = [];\n return null;\n }\n const batch: FlagEventsBatch = { sdk: this.o.sdk ?? { name: FLAGS_SDK_NAME, version: FLAGS_SDK_VERSION } };\n if (this.usage.size) batch.usage = Array.from(this.usage.values());\n if (this.exposures.length) batch.exposures = this.exposures;\n this.usage.clear();\n this.exposures = [];\n return batch;\n }\n\n private requeue(batch: FlagEventsBatch): void {\n for (const u of batch.usage ?? []) {\n const k = `${u.flag}\\u0000${u.variationId ?? \"\"}\\u0000${u.variationId ? \"\" : (u.value ?? \"\")}`;\n const cur = this.usage.get(k);\n if (cur) cur.count += u.count;\n else if (this.usage.size < MAX_QUEUE) this.usage.set(k, { flag: u.flag, variationId: u.variationId, value: u.value ?? \"\", count: u.count });\n }\n this.exposures = [...(batch.exposures ?? []), ...this.exposures].slice(0, MAX_QUEUE);\n this.scheduleFlush(USAGE_FLUSH_MS);\n }\n\n /** Page hide / destroy: `sendBeacon` for public keys, else a `keepalive` fetch. */\n private flushOnExit(): void {\n if (this.offline) return;\n const batch = this.takeBatch();\n if (!batch) return;\n try {\n if (!this.secret && typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\" && typeof Blob !== \"undefined\") {\n // text/plain needs no CORS preflight (browsers drop those during unload).\n if (navigator.sendBeacon(this.url(\"/flags/events\"), new Blob([JSON.stringify(batch)], { type: \"text/plain;charset=UTF-8\" }))) return;\n }\n } catch {\n /* fall through */\n }\n void this.request(\"POST\", \"/flags/events\", { body: batch, keepalive: true }).catch(() => {});\n }\n\n private wireBrowser(): void {\n if (!isBrowser()) return;\n const onHide = () => this.flushOnExit();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") return this.flushOnExit();\n // Back in view: catch up if a poll was skipped while hidden.\n if ((this.cfg.mode === \"auto\" || (this.cfg.mode === \"stream\" && !this.streamConnected)) && Date.now() - this.lastFetchAt > this.cfg.pollMs) void this.fetchNow().then(() => this.schedule());\n };\n window.addEventListener(\"pagehide\", onHide);\n document.addEventListener(\"visibilitychange\", onVisibility);\n this.cleanups.push(() => {\n window.removeEventListener(\"pagehide\", onHide);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n });\n }\n\n // ---------------------------------------------------------------------------\n\n private notify(): void {\n for (const l of Array.from(this.listeners)) {\n try {\n l();\n } catch (err) {\n this.reportError(err);\n }\n }\n }\n\n private reportError(err: unknown): void {\n const error = err instanceof Error ? err : new Error(String(err));\n // Repeats (a poll failing every minute) are logged once.\n if (error.message !== this.lastError) this.log.error?.(error.message);\n this.lastError = error.message;\n try {\n this.o.onError?.(error);\n } catch {\n /* ignore */\n }\n }\n}\n\n/** Creates a flags client and starts loading (per `pollingMode`). */\nexport function createFlagsClient(options: FlagsClientOptions): FlagsClient {\n return new FlagsClient(options);\n}\n","/** Node-only: finds flag keys used as string literals in a source tree (`guidely-flags code-refs`). */\nimport { execFileSync } from \"node:child_process\";\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\n\nexport interface CodeRef {\n flag: string;\n path: string;\n line: number;\n snippet: string;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \"vendor\", \".next\", \".svelte-kit\", \".turbo\", \"coverage\", \"target\", \"out\"]);\nconst SKIP_FILES = /(^|\\/)(package-lock\\.json|pnpm-lock\\.yaml|yarn\\.lock|bun\\.lockb?|composer\\.lock|Cargo\\.lock|Gemfile\\.lock|poetry\\.lock)$|\\.(min\\.js|map|png|jpe?g|gif|webp|ico|svg|pdf|zip|gz|woff2?|ttf|eot|mp4|mov|mp3|jar|class|so|dylib|dll|exe|bin)$/i;\nexport const MAX_FILE_BYTES = 1024 * 1024;\nexport const MAX_REFS = 10_000;\n\n/** Files to scan, relative to `dir` with `/` separators: `git ls-files` (tracked + untracked, not ignored), else a directory walk. */\nexport function listFiles(dir: string): string[] {\n try {\n const out = execFileSync(\"git\", [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"], { cwd: dir, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"], maxBuffer: 256 * 1024 * 1024 });\n const files = out.split(\"\\0\").filter(Boolean);\n if (files.length) return files.filter((f) => !f.split(\"/\").some((p) => SKIP_DIRS.has(p)));\n } catch {\n /* not a git checkout, or git missing */\n }\n const files: string[] = [];\n const walk = (abs: string) => {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = readdirSync(abs, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!SKIP_DIRS.has(e.name)) walk(join(abs, e.name));\n } else if (e.isFile()) files.push(relative(dir, join(abs, e.name)).split(sep).join(\"/\"));\n }\n };\n walk(dir);\n return files.sort();\n}\n\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Every line where a flag key appears as a quoted literal: `'key'`, `\"key\"` or `` `key` ``. */\nexport function scanFiles(dir: string, files: string[], flagKeys: string[]): CodeRef[] {\n const keys = Array.from(new Set(flagKeys.filter(Boolean))).sort((a, b) => b.length - a.length);\n if (!keys.length) return [];\n const re = new RegExp(`(['\"\\`])(${keys.map(escapeRe).join(\"|\")})\\\\1`, \"g\");\n const refs: CodeRef[] = [];\n for (const path of files) {\n if (SKIP_FILES.test(path)) continue;\n const abs = join(dir, path);\n let text: string;\n try {\n const st = statSync(abs);\n if (!st.isFile() || st.size > MAX_FILE_BYTES) continue;\n const buf = readFileSync(abs);\n if (buf.subarray(0, 8000).includes(0)) continue; // binary\n text = buf.toString(\"utf8\");\n } catch {\n continue;\n }\n if (!keys.some((k) => text.includes(k))) continue;\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n re.lastIndex = 0;\n const seen = new Set<string>();\n for (let m = re.exec(line); m; m = re.exec(line)) {\n const flag = m[2]!;\n if (seen.has(flag)) continue;\n seen.add(flag);\n refs.push({ flag, path, line: i + 1, snippet: line.trim().slice(0, 200) });\n if (refs.length >= MAX_REFS) return refs;\n }\n }\n }\n return refs;\n}\n\nexport function gitValue(dir: string, args: string[]): string | undefined {\n try {\n return execFileSync(\"git\", args, { cwd: dir, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] }).trim() || undefined;\n } catch {\n return undefined;\n }\n}\n","#!/usr/bin/env node\nimport { main } from \"./cli-main\";\n\nmain(process.argv.slice(2)).then((code) => process.exit(code));\n"],"mappings":"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","names":["import_node_path","a","b","sep","text","sep","resolve","sep","base","handle","files","env"]}
|