@variantlab/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/errors.ts","../../src/config/freeze.ts","../../src/targeting/glob.ts","../../src/targeting/semver.ts","../../src/config/validator.ts"],"names":["v"],"mappings":"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","file":"config.js","sourcesContent":["import type { IssueCode } from \"./codes.js\";\n\n/**\n * A single config-validation issue.\n *\n * `path` is an RFC 6901 JSON Pointer into the source config\n * (`\"\"` for root, `\"/experiments/0/variants/2/id\"` for nested).\n * `code` is a narrow union of strings for programmatic handling.\n * `message` is a human-readable sentence safe for CLI output.\n */\nexport interface ConfigIssue {\n readonly path: string;\n readonly code: IssueCode;\n readonly message: string;\n}\n\n/**\n * Thrown by `validateConfig` when one or more rules fail.\n *\n * `issues` is always non-empty and frozen. The validator collects\n * every issue it finds and throws once at the end — it does not\n * fail fast — so a single throw can surface many independent\n * problems in one pass.\n */\nexport class ConfigValidationError extends Error {\n readonly issues: readonly ConfigIssue[];\n\n constructor(issues: readonly ConfigIssue[]) {\n super(`Config validation failed with ${issues.length} issue(s)`);\n this.name = \"ConfigValidationError\";\n this.issues = Object.freeze(issues.slice());\n }\n}\n","/**\n * Recursively freeze a plain-JSON-shaped value.\n *\n * - Primitives (including `null`/`undefined`) are returned as-is.\n * - Arrays and plain objects are frozen in-place with `Object.freeze`.\n * - Already-frozen subtrees are skipped (short-circuit) so this is\n * cheap to call on shared references and idempotent.\n *\n * Sanitized config trees are tree-shaped (no cycles, no class\n * instances) so no cycle detection is required.\n */\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Object.isFrozen(value)) {\n return value;\n }\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n deepFreeze(value[i]);\n }\n return Object.freeze(value);\n }\n // Plain object (may be null-proto after sanitize).\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n deepFreeze(obj[keys[i] as string]);\n }\n return Object.freeze(value);\n}\n","/**\n * Hand-rolled route glob subset. Linear-time matcher, no regex, no\n * backtracking, no character classes. Supports the surface in\n * `docs/design/targeting-dsl.md`:\n *\n * - Exact: `/about`\n * - Wildcard segment: `/blog/*`\n * - Wildcard deep: `/docs/**` (only allowed as the last segment)\n * - Parameter: `/user/:id` (treated as a single-segment wildcard)\n * - Trailing slash insensitive\n * - Whole-path forms: `*` (single-segment) and `**` (any number of segments)\n *\n * Rejects: character classes, braces, negation, `***`, mixed\n * literal+wildcard in a single segment (e.g. `/foo*bar`).\n */\n\nexport type Segment =\n | { readonly kind: \"literal\"; readonly value: string }\n | { readonly kind: \"param\" }\n | { readonly kind: \"rest\" };\n\n/**\n * Compile a glob pattern into a segment list. Returns `null` for\n * unsupported / malformed patterns. Compiled patterns can be reused\n * and are the hot-path form.\n */\nexport function compileGlob(pattern: string): Segment[] | null {\n if (pattern.length === 0) return null;\n\n // Whole-path shortcuts. `*` and `**` have no leading slash.\n if (pattern === \"*\") return [{ kind: \"param\" }];\n if (pattern === \"**\") return [{ kind: \"rest\" }];\n\n if (pattern[0] !== \"/\") return null;\n\n // Reject `***` anywhere outright.\n if (pattern.indexOf(\"***\") >= 0) return null;\n\n // Strip a trailing slash (except for the root `/` itself).\n const normalized = pattern.length > 1 && pattern.endsWith(\"/\") ? pattern.slice(0, -1) : pattern;\n\n // Root: single empty segment list means \"match `/` exactly\".\n if (normalized === \"/\") return [];\n\n const raw = normalized.slice(1).split(\"/\");\n const segs: Segment[] = [];\n for (let i = 0; i < raw.length; i++) {\n const part = raw[i] as string;\n if (part.length === 0) return null; // e.g. `//` or trailing empty\n if (part === \"**\") {\n // `**` must be the last segment.\n if (i !== raw.length - 1) return null;\n segs.push({ kind: \"rest\" });\n continue;\n }\n if (part === \"*\") {\n segs.push({ kind: \"param\" });\n continue;\n }\n if (part[0] === \":\") {\n // `:id` — single-segment wildcard. Disallow empty name `:` alone.\n if (part.length < 2) return null;\n segs.push({ kind: \"param\" });\n continue;\n }\n // Literal segment. Reject any wildcard chars or colons inside.\n // Compile-time regex (not hot path); linear, no backtracking.\n if (/[*:?[\\]{}!]/.test(part)) return null;\n segs.push({ kind: \"literal\", value: part });\n }\n return segs;\n}\n\n/**\n * Match a compiled glob against a path. O(n + m) linear, no\n * backtracking because `**` is only ever the final segment.\n */\nexport function matchCompiledRoute(segs: readonly Segment[], path: string): boolean {\n if (path.length === 0) return false;\n if (path[0] !== \"/\") return false;\n\n // Strip a trailing slash (except for the root `/`).\n const normalized = path.length > 1 && path.endsWith(\"/\") ? path.slice(0, -1) : path;\n\n // Root `/` case: empty segment list matches exactly `/`.\n if (segs.length === 0) return normalized === \"/\";\n\n const parts = normalized === \"/\" ? [] : normalized.slice(1).split(\"/\");\n\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i] as Segment;\n if (seg.kind === \"rest\") {\n // `**` tail — matches zero or more remaining parts.\n return true;\n }\n if (i >= parts.length) return false;\n const part = parts[i] as string;\n if (part.length === 0) return false;\n if (seg.kind === \"literal\") {\n if (seg.value !== part) return false;\n }\n // `param` always matches a non-empty part.\n }\n return parts.length === segs.length;\n}\n\n/** Convenience: compile and match. Returns false on compile error. */\nexport function matchRoute(pattern: string, path: string): boolean {\n const segs = compileGlob(pattern);\n if (segs === null) return false;\n return matchCompiledRoute(segs, path);\n}\n","/**\n * Hand-rolled semver subset. No dependencies, no regex on the hot path,\n * no backtracking. Supports the surface documented in\n * `docs/design/targeting-dsl.md`:\n *\n * - Comparators: `=`, `<`, `<=`, `>`, `>=`, and a bare version (treated as `=`)\n * - Caret: `^X.Y.Z` → `[>=X.Y.Z, <(X+1).0.0]`\n * - Tilde: `~X.Y.Z` → `[>=X.Y.Z, <X.(Y+1).0]`\n * - Hyphen range: `X.Y.Z - A.B.C` → `[>=X.Y.Z, <=A.B.C]`\n * - Compound (AND): space-separated comparators, e.g. `>=1.0.0 <2.0.0`\n * - OR: `||`-separated clauses\n *\n * Explicitly rejects prereleases (`1.0.0-beta`), build metadata\n * (`1.0.0+sha`), and `x` wildcards (`1.2.x`).\n */\n\nexport type Version = readonly [number, number, number];\nexport type Op = \"=\" | \"<\" | \"<=\" | \">\" | \">=\";\nexport interface Comparator {\n readonly op: Op;\n readonly v: Version;\n}\nexport type Clause = readonly Comparator[];\nexport type Range = readonly Clause[];\n\n/**\n * Pure character scanner. No regex. Returns `[major, minor, patch]`\n * or `null` if the string is not exactly three dot-separated\n * non-negative integers.\n */\nexport function parseVersion(s: string): Version | null {\n if (s.length === 0) return null;\n const parts: number[] = [0, 0, 0];\n let idx = 0;\n let part = 0;\n let seen = false;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c === 46 /* . */) {\n if (!seen) return null;\n parts[idx++] = part;\n if (idx > 2) return null;\n part = 0;\n seen = false;\n } else if (c >= 48 && c <= 57) {\n part = part * 10 + (c - 48);\n seen = true;\n } else return null;\n }\n if (!seen || idx !== 2) return null;\n parts[2] = part;\n return [parts[0] as number, parts[1] as number, parts[2] as number];\n}\n\n/** Numeric comparison, field by field. */\nexport function cmpVersion(a: Version, b: Version): number {\n return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];\n}\n\n/**\n * Parse a semver range string. Returns a `Range` on success or `null`\n * on any syntactic or structural error.\n */\nexport function parseSemver(s: string): Range | null {\n if (s.length === 0) return null;\n const clauses: Clause[] = [];\n for (const part of s.split(\"||\")) {\n const c = parseClause(part.trim());\n if (c === null) return null;\n clauses.push(c);\n }\n return clauses;\n}\n\nfunction parseClause(s: string): Clause | null {\n if (s.length === 0) return null;\n\n // Hyphen range: `X.Y.Z - A.B.C`. Whitespace-sensitive separator.\n const hy = s.indexOf(\" - \");\n if (hy >= 0) {\n const lo = parseVersion(s.slice(0, hy).trim());\n const hi = parseVersion(s.slice(hy + 3).trim());\n if (lo === null || hi === null) return null;\n return [\n { op: \">=\", v: lo },\n { op: \"<=\", v: hi },\n ];\n }\n\n // Compound: whitespace-separated comparators, all ANDed.\n const cmps: Comparator[] = [];\n for (const tok of s.split(/\\s+/)) {\n if (tok.length === 0) continue;\n const parsed = parseComparator(tok);\n if (parsed === null) return null;\n for (const c of parsed) cmps.push(c);\n }\n return cmps.length > 0 ? cmps : null;\n}\n\n/**\n * Parse a single comparator like `>=1.2.3`, `^1.2.3`, `~1.2.3`, or a\n * bare version. Returns an array so that caret/tilde can expand to\n * two comparators.\n */\nfunction parseComparator(s: string): Comparator[] | null {\n const c0 = s[0];\n if (c0 === \"^\" || c0 === \"~\") {\n const v = parseVersion(s.slice(1));\n if (v === null) return null;\n const upper: Version = c0 === \"^\" ? [v[0] + 1, 0, 0] : [v[0], v[1] + 1, 0];\n return [\n { op: \">=\", v },\n { op: \"<\", v: upper },\n ];\n }\n\n let op: Op = \"=\";\n let rest = s;\n if (c0 === \">\" || c0 === \"<\") {\n if (s[1] === \"=\") {\n op = `${c0}=` as Op;\n rest = s.slice(2);\n } else {\n op = c0;\n rest = s.slice(1);\n }\n } else if (c0 === \"=\") {\n rest = s.slice(1);\n }\n\n const v = parseVersion(rest);\n return v === null ? null : [{ op, v }];\n}\n\n/** Match a parsed range against a parsed version. */\nexport function matchCompiled(range: Range, version: Version): boolean {\n for (const clause of range) if (matchClause(clause, version)) return true;\n return false;\n}\n\nfunction matchClause(clause: Clause, version: Version): boolean {\n for (const c of clause) {\n const d = cmpVersion(version, c.v);\n const op = c.op;\n const fail =\n op === \"=\"\n ? d !== 0\n : op === \"<\"\n ? d >= 0\n : op === \"<=\"\n ? d > 0\n : op === \">\"\n ? d <= 0\n : d < 0;\n if (fail) return false;\n }\n return true;\n}\n\n/** Convenience: parse both sides and compare. Returns false on parse error. */\nexport function matchSemver(range: string, version: string): boolean {\n const r = parseSemver(range);\n if (r === null) return false;\n const v = parseVersion(version);\n return v !== null && matchCompiled(r, v);\n}\n","import { compileGlob } from \"../targeting/glob.js\";\nimport { parseSemver } from \"../targeting/semver.js\";\nimport type { IssueCode } from \"./codes.js\";\nimport { type ConfigIssue, ConfigValidationError } from \"./errors.js\";\nimport { deepFreeze } from \"./freeze.js\";\nimport type { ExperimentsConfig } from \"./types.js\";\n\n/* Limits (see docs/design/config-format.md). */\nconst MAX_BYTES = 1_048_576;\nconst MAX_EXP = 1000;\nconst MAX_VAR = 100;\nconst MIN_VAR = 2;\nconst MAX_ROUTES = 100;\nconst MAX_DEPTH = 10;\nconst MAX_NAME = 128;\nconst MAX_DESC = 512;\n\nconst ID_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;\nconst RESERVED = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nconst ASSIGNS = new Set([\"default\", \"random\", \"sticky-hash\", \"weighted\"]);\nconst STATUSES = new Set([\"draft\", \"active\", \"archived\"]);\nconst TYPES = new Set([\"render\", \"value\"]);\nconst PLATFORMS = new Set([\"ios\", \"android\", \"web\", \"node\"]);\nconst SIZES = new Set([\"small\", \"medium\", \"large\"]);\n\n// `TextEncoder` is standardized in Node 18+, browsers, Deno, Bun, and\n// Edge runtimes — the only platform global `@variantlab/core` uses.\ndeclare class TextEncoder {\n encode(input?: string): Uint8Array;\n}\n\n/**\n * Parse, sanitize, validate, and deep-freeze an experiments config.\n * Collects every issue before throwing (fail-slow, not fail-fast).\n */\nexport function validateConfig(input: unknown): ExperimentsConfig {\n const issues: ConfigIssue[] = [];\n\n if (measureBytes(input) > MAX_BYTES) {\n push(issues, \"\", \"config-too-large\");\n throw new ConfigValidationError(issues);\n }\n\n let parsed: unknown = input;\n if (typeof input === \"string\") {\n try {\n parsed = JSON.parse(input);\n } catch (err) {\n push(issues, \"\", \"invalid-json\", (err as Error).message);\n throw new ConfigValidationError(issues);\n }\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n push(issues, \"\", \"not-an-object\");\n throw new ConfigValidationError(issues);\n }\n\n const sanitized = sanitize(parsed, issues, \"\");\n validateRoot(sanitized as Record<string, unknown>, issues);\n\n if (issues.length > 0) {\n throw new ConfigValidationError(issues);\n }\n return deepFreeze(sanitized as ExperimentsConfig);\n}\n\n/* Raw-bytes measurement. Strings: exact UTF-8. Objects: approximate\n * via JSON.stringify then UTF-8 length. The goal is to cap untrusted\n * input memory, so approximate is fine. */\nconst encoder = new TextEncoder();\nfunction measureBytes(input: unknown): number {\n if (typeof input === \"string\") return encoder.encode(input).length;\n try {\n const s = JSON.stringify(input);\n if (typeof s !== \"string\") return 0;\n return encoder.encode(s).length;\n } catch {\n return 0;\n }\n}\n\n/* Sanitize: rebuild every object with Object.create(null) and copy\n * only own, non-reserved keys. Produces a null-proto tree. */\nfunction sanitize(value: unknown, issues: ConfigIssue[], ptr: string): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (let i = 0; i < value.length; i++) {\n out.push(sanitize(value[i], issues, `${ptr}/${i}`));\n }\n return out;\n }\n const src = value as Record<string, unknown>;\n const dst: Record<string, unknown> = Object.create(null);\n const keys = Object.keys(src);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as string;\n if (RESERVED.has(k)) {\n push(issues, jp(ptr, k), \"reserved-key\", k);\n continue;\n }\n dst[k] = sanitize(src[k], issues, jp(ptr, k));\n }\n return dst;\n}\n\nfunction validateRoot(root: Record<string, unknown>, issues: ConfigIssue[]): void {\n const version = root[\"version\"];\n if (version === undefined) {\n push(issues, \"/version\", \"version/missing\");\n } else if (version !== 1) {\n push(issues, \"/version\", \"version/invalid\");\n }\n\n const enabled = root[\"enabled\"];\n if (enabled !== undefined && typeof enabled !== \"boolean\") {\n push(issues, \"/enabled\", \"enabled/invalid\");\n }\n\n const signature = root[\"signature\"];\n if (signature !== undefined && (typeof signature !== \"string\" || signature.length === 0)) {\n push(issues, \"/signature\", \"signature/invalid\");\n }\n\n const experiments = root[\"experiments\"];\n if (experiments === undefined) {\n push(issues, \"/experiments\", \"experiments/missing\");\n return;\n }\n if (!Array.isArray(experiments)) {\n push(issues, \"/experiments\", \"experiments/not-an-array\");\n return;\n }\n if (experiments.length > MAX_EXP) {\n push(issues, \"/experiments\", \"experiments/too-many\");\n }\n\n const seen = new Set<string>();\n for (let i = 0; i < experiments.length; i++) {\n validateExperiment(experiments[i], `/experiments/${i}`, seen, issues);\n }\n}\n\nfunction validateExperiment(\n exp: unknown,\n p: string,\n seen: Set<string>,\n issues: ConfigIssue[],\n): void {\n if (exp === null || typeof exp !== \"object\" || Array.isArray(exp)) {\n push(issues, p, \"experiment/not-an-object\");\n return;\n }\n const e = exp as Record<string, unknown>;\n\n const id = e[\"id\"];\n if (id === undefined) {\n push(issues, `${p}/id`, \"experiment/missing-required\", \"id\");\n } else if (typeof id !== \"string\" || !ID_RE.test(id)) {\n push(issues, `${p}/id`, \"experiment/id/invalid\");\n } else if (seen.has(id)) {\n push(issues, `${p}/id`, \"experiment/id/duplicate\", id);\n } else {\n seen.add(id);\n }\n\n const name = e[\"name\"];\n if (name === undefined) {\n push(issues, `${p}/name`, \"experiment/missing-required\", \"name\");\n } else if (typeof name !== \"string\" || name.length === 0 || name.length > MAX_NAME) {\n push(issues, `${p}/name`, \"experiment/name/invalid\");\n }\n\n checkOptString(\n e[\"description\"],\n `${p}/description`,\n MAX_DESC,\n \"experiment/description/invalid\",\n issues,\n );\n checkEnum(e[\"type\"], `${p}/type`, TYPES, \"experiment/type/invalid\", issues);\n checkEnum(e[\"status\"], `${p}/status`, STATUSES, \"experiment/status/invalid\", issues);\n checkOptString(e[\"mutex\"], `${p}/mutex`, MAX_NAME, \"experiment/mutex/invalid\", issues);\n checkOptString(e[\"owner\"], `${p}/owner`, MAX_NAME, \"experiment/owner/invalid\", issues);\n checkOptBool(e[\"overridable\"], `${p}/overridable`, \"experiment/overridable/invalid\", issues);\n\n const variantIds = validateVariants(e[\"variants\"], p, issues);\n validateDefault(e[\"default\"], variantIds, p, issues);\n validateAssignment(e[\"assignment\"], e[\"split\"], variantIds, p, issues);\n validateRoutes(e[\"routes\"], p, issues);\n validateTargeting(e[\"targeting\"], p, issues);\n validateDates(e[\"startDate\"], e[\"endDate\"], p, issues);\n validateRollback(e[\"rollback\"], p, issues);\n}\n\nfunction validateVariants(field: unknown, p: string, issues: ConfigIssue[]): Set<string> {\n const ids = new Set<string>();\n const vp = `${p}/variants`;\n if (field === undefined) {\n push(issues, vp, \"experiment/variants/missing\");\n return ids;\n }\n if (!Array.isArray(field)) {\n push(issues, vp, \"experiment/variants/missing\");\n return ids;\n }\n if (field.length < MIN_VAR) {\n push(issues, vp, \"experiment/variants/too-few\");\n }\n if (field.length > MAX_VAR) {\n push(issues, vp, \"experiment/variants/too-many\");\n }\n for (let i = 0; i < field.length; i++) {\n const v = field[i];\n const vip = `${vp}/${i}`;\n if (v === null || typeof v !== \"object\" || Array.isArray(v)) {\n push(issues, vip, \"variant/not-an-object\");\n continue;\n }\n const vo = v as Record<string, unknown>;\n const vid = vo[\"id\"];\n if (vid === undefined) {\n push(issues, `${vip}/id`, \"experiment/missing-required\", \"variant.id\");\n } else if (typeof vid !== \"string\" || !ID_RE.test(vid)) {\n push(issues, `${vip}/id`, \"variant/id/invalid\");\n } else if (ids.has(vid)) {\n push(issues, `${vip}/id`, \"variant/id/duplicate\", vid);\n } else {\n ids.add(vid);\n }\n checkOptString(vo[\"label\"], `${vip}/label`, MAX_NAME, \"variant/label/invalid\", issues);\n checkOptString(\n vo[\"description\"],\n `${vip}/description`,\n MAX_DESC,\n \"variant/description/invalid\",\n issues,\n );\n }\n return ids;\n}\n\nfunction validateDefault(field: unknown, ids: Set<string>, p: string, issues: ConfigIssue[]): void {\n const dp = `${p}/default`;\n if (field === undefined) {\n push(issues, dp, \"experiment/default/missing\");\n return;\n }\n if (typeof field !== \"string\") {\n push(issues, dp, \"experiment/default/unknown-variant\");\n return;\n }\n if (ids.size > 0 && !ids.has(field)) {\n push(issues, dp, \"experiment/default/unknown-variant\", field);\n }\n}\n\nfunction validateAssignment(\n aField: unknown,\n sField: unknown,\n ids: Set<string>,\n p: string,\n issues: ConfigIssue[],\n): void {\n let strategy = \"default\";\n if (aField !== undefined) {\n if (typeof aField !== \"string\" || !ASSIGNS.has(aField)) {\n push(issues, `${p}/assignment`, \"experiment/assignment/invalid\");\n } else {\n strategy = aField;\n }\n }\n\n const sp = `${p}/split`;\n if (strategy === \"weighted\" && sField === undefined) {\n push(issues, sp, \"split/missing\");\n return;\n }\n if (sField === undefined) return;\n if (sField === null || typeof sField !== \"object\" || Array.isArray(sField)) {\n push(issues, sp, \"split/not-an-object\");\n return;\n }\n const split = sField as Record<string, unknown>;\n const keys = Object.keys(split);\n let sum = 0;\n let bad = false;\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as string;\n if (ids.size > 0 && !ids.has(k)) {\n push(issues, `${sp}/${esc(k)}`, \"split/unknown-variant\", k);\n bad = true;\n continue;\n }\n const v = split[k];\n if (typeof v !== \"number\" || !Number.isInteger(v) || v < 0 || v > 100) {\n push(issues, `${sp}/${esc(k)}`, \"split/value-invalid\");\n bad = true;\n continue;\n }\n sum += v;\n }\n if (!bad && sum !== 100) {\n push(issues, sp, \"split/sum-invalid\", String(sum));\n }\n}\n\nfunction validateRoutes(field: unknown, p: string, issues: ConfigIssue[]): void {\n if (field === undefined) return;\n const rp = `${p}/routes`;\n if (!Array.isArray(field)) {\n push(issues, rp, \"experiment/routes/invalid\");\n return;\n }\n if (field.length > MAX_ROUTES) {\n push(issues, rp, \"experiment/routes/invalid\");\n }\n for (let i = 0; i < field.length; i++) {\n const r = field[i];\n if (typeof r !== \"string\" || compileGlob(r) === null) {\n push(issues, `${rp}/${i}`, \"route/glob/invalid\");\n }\n }\n}\n\nfunction validateTargeting(field: unknown, p: string, issues: ConfigIssue[]): void {\n if (field === undefined) return;\n const tp = `${p}/targeting`;\n if (field === null || typeof field !== \"object\" || Array.isArray(field)) {\n push(issues, tp, \"targeting/not-an-object\");\n return;\n }\n if (depthOf(field, 0) > MAX_DEPTH) {\n push(issues, tp, \"targeting/depth-exceeded\");\n }\n const t = field as Record<string, unknown>;\n\n if (t[\"platform\"] !== undefined) {\n checkEnumArray(\n t[\"platform\"],\n `${tp}/platform`,\n PLATFORMS,\n \"targeting/platform/invalid\",\n issues,\n );\n }\n if (t[\"appVersion\"] !== undefined) {\n const v = t[\"appVersion\"];\n if (typeof v !== \"string\" || parseSemver(v) === null) {\n push(issues, `${tp}/appVersion`, \"targeting/appversion/invalid\");\n }\n }\n if (t[\"locale\"] !== undefined) {\n checkStringArray(t[\"locale\"], `${tp}/locale`, \"targeting/locale/invalid\", issues);\n }\n if (t[\"screenSize\"] !== undefined) {\n checkEnumArray(\n t[\"screenSize\"],\n `${tp}/screenSize`,\n SIZES,\n \"targeting/screensize/invalid\",\n issues,\n );\n }\n if (t[\"routes\"] !== undefined) {\n const r = t[\"routes\"];\n if (!Array.isArray(r) || r.length === 0) {\n push(issues, `${tp}/routes`, \"targeting/routes/invalid\");\n } else {\n for (let i = 0; i < r.length; i++) {\n const v = r[i];\n if (typeof v !== \"string\" || compileGlob(v) === null) {\n push(issues, `${tp}/routes/${i}`, \"targeting/routes/invalid\");\n }\n }\n }\n }\n if (t[\"userId\"] !== undefined) {\n validateUserId(t[\"userId\"], `${tp}/userId`, issues);\n }\n if (t[\"attributes\"] !== undefined) {\n const a = t[\"attributes\"];\n if (a === null || typeof a !== \"object\" || Array.isArray(a)) {\n push(issues, `${tp}/attributes`, \"targeting/attributes/invalid\");\n }\n }\n}\n\nfunction validateUserId(u: unknown, p: string, issues: ConfigIssue[]): void {\n const code: IssueCode = \"targeting/userid/invalid\";\n if (Array.isArray(u)) {\n if (u.length === 0) {\n push(issues, p, code);\n return;\n }\n for (let i = 0; i < u.length; i++) {\n const v = u[i];\n if (typeof v !== \"string\" || v.length === 0) {\n push(issues, `${p}/${i}`, code);\n }\n }\n return;\n }\n if (u !== null && typeof u === \"object\") {\n const o = u as Record<string, unknown>;\n const h = o[\"hash\"];\n const m = o[\"mod\"];\n if (typeof h !== \"string\" || h.length === 0) {\n push(issues, `${p}/hash`, code);\n }\n if (typeof m !== \"number\" || !Number.isInteger(m) || m < 0 || m > 100) {\n push(issues, `${p}/mod`, code);\n }\n return;\n }\n push(issues, p, code);\n}\n\nfunction validateDates(sField: unknown, eField: unknown, p: string, issues: ConfigIssue[]): void {\n let s: number | undefined;\n let e: number | undefined;\n if (sField !== undefined) {\n if (typeof sField !== \"string\" || !isValidIsoDate(sField)) {\n push(issues, `${p}/startDate`, \"experiment/startdate/invalid\");\n } else {\n s = Date.parse(sField);\n }\n }\n if (eField !== undefined) {\n if (typeof eField !== \"string\" || !isValidIsoDate(eField)) {\n push(issues, `${p}/endDate`, \"experiment/enddate/invalid\");\n } else {\n e = Date.parse(eField);\n }\n }\n if (s !== undefined && e !== undefined && !(e > s)) {\n push(issues, `${p}/endDate`, \"experiment/date-range/invalid\");\n }\n}\n\nfunction validateRollback(field: unknown, p: string, issues: ConfigIssue[]): void {\n if (field === undefined) return;\n const rp = `${p}/rollback`;\n if (field === null || typeof field !== \"object\" || Array.isArray(field)) {\n push(issues, rp, \"rollback/not-an-object\");\n return;\n }\n const r = field as Record<string, unknown>;\n const thr = r[\"threshold\"];\n if (thr === undefined) {\n push(issues, `${rp}/threshold`, \"rollback/threshold/invalid\");\n } else if (typeof thr !== \"number\" || !Number.isInteger(thr) || thr < 1 || thr > 100) {\n push(issues, `${rp}/threshold`, \"rollback/threshold/invalid\");\n }\n const win = r[\"window\"];\n if (win === undefined) {\n push(issues, `${rp}/window`, \"rollback/window/invalid\");\n } else if (typeof win !== \"number\" || !Number.isInteger(win) || win < 1000 || win > 3_600_000) {\n push(issues, `${rp}/window`, \"rollback/window/invalid\");\n }\n const persistent = r[\"persistent\"];\n if (persistent !== undefined && typeof persistent !== \"boolean\") {\n push(issues, `${rp}/persistent`, \"rollback/persistent/invalid\");\n }\n}\n\n/* Small shared helpers. */\n\nfunction checkOptString(\n v: unknown,\n p: string,\n max: number,\n code: IssueCode,\n issues: ConfigIssue[],\n): void {\n if (v === undefined) return;\n if (typeof v !== \"string\" || v.length === 0 || v.length > max) {\n push(issues, p, code);\n }\n}\n\nfunction checkOptBool(v: unknown, p: string, code: IssueCode, issues: ConfigIssue[]): void {\n if (v === undefined) return;\n if (typeof v !== \"boolean\") {\n push(issues, p, code);\n }\n}\n\nfunction checkEnum(\n v: unknown,\n p: string,\n set: Set<string>,\n code: IssueCode,\n issues: ConfigIssue[],\n): void {\n if (v === undefined) return;\n if (typeof v !== \"string\" || !set.has(v)) {\n push(issues, p, code);\n }\n}\n\nfunction checkEnumArray(\n v: unknown,\n p: string,\n set: Set<string>,\n code: IssueCode,\n issues: ConfigIssue[],\n): void {\n if (!Array.isArray(v) || v.length === 0) {\n push(issues, p, code);\n return;\n }\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n if (typeof x !== \"string\" || !set.has(x)) {\n push(issues, `${p}/${i}`, code);\n }\n }\n}\n\nfunction checkStringArray(v: unknown, p: string, code: IssueCode, issues: ConfigIssue[]): void {\n if (!Array.isArray(v) || v.length === 0) {\n push(issues, p, code);\n return;\n }\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n if (typeof x !== \"string\" || x.length === 0) {\n push(issues, `${p}/${i}`, code);\n }\n }\n}\n\n/* ISO 8601 date: Date.parse must accept and the string must contain\n * T + Z-or-offset, to reject bare dates like \"2026-01-01\". */\nconst ISO_TAIL_RE = /T.*(?:Z|[+-]\\d{2}:?\\d{2})$/;\nfunction isValidIsoDate(s: string): boolean {\n if (s.length < 10) return false;\n if (Number.isNaN(Date.parse(s))) return false;\n return ISO_TAIL_RE.test(s);\n}\n\n/* Depth of a value inside the targeting subtree (root = 0). */\nfunction depthOf(value: unknown, current: number): number {\n if (value === null || typeof value !== \"object\") return current;\n let m = current;\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const d = depthOf(value[i], current + 1);\n if (d > m) m = d;\n }\n return m;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const d = depthOf(obj[keys[i] as string], current + 1);\n if (d > m) m = d;\n }\n return m;\n}\n\n/* RFC 6901 encoders. */\nfunction jp(parent: string, key: string): string {\n return `${parent}/${esc(key)}`;\n}\nfunction esc(s: string): string {\n return s.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n}\n\n/**\n * Append an issue. The `message` defaults to the code itself — issue\n * messages are intentionally terse so that bundle size stays under\n * budget. Consumers that want pretty messages should switch on `code`.\n */\nfunction push(issues: ConfigIssue[], path: string, code: IssueCode, message?: string): void {\n issues.push({ path, code, message: message ?? code });\n}\n"]}