@fabricorg/experiments-web 0.0.2

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/hash.ts","../src/dom-ops.ts","../src/preview.ts","../src/storage.ts","../src/trigger.ts","../src/index.ts"],"names":["k1","_a","_b","forced"],"mappings":"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","file":"index.js","sourcesContent":["// Inlined Murmur3 x86 32 — duplicated from @fabricorg/experiments-assignment to\n// keep the web bundle under 8 kB (no cross-package import overhead).\n// Conformance vectors in @fabricorg/experiments-testkit lock both implementations.\n\nexport function murmur3(key: string): number {\n const data = new TextEncoder().encode(key);\n const len = data.length;\n const nblocks = len >>> 2;\n let h1 = 0;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n for (let i = 0; i < nblocks; i++) {\n const o = i * 4;\n let k1 =\n (data[o]! & 0xff) |\n ((data[o + 1]! & 0xff) << 8) |\n ((data[o + 2]! & 0xff) << 16) |\n ((data[o + 3]! & 0xff) << 24);\n k1 = mul(k1, c1);\n k1 = rot(k1, 15);\n k1 = mul(k1, c2);\n h1 ^= k1;\n h1 = rot(h1, 13);\n h1 = (mul(h1, 5) + 0xe6546b64) >>> 0;\n }\n let k1 = 0;\n const tail = len & 3;\n const ts = nblocks * 4;\n if (tail >= 3) k1 ^= (data[ts + 2]! & 0xff) << 16;\n if (tail >= 2) k1 ^= (data[ts + 1]! & 0xff) << 8;\n if (tail >= 1) {\n k1 ^= data[ts]! & 0xff;\n k1 = mul(k1, c1);\n k1 = rot(k1, 15);\n k1 = mul(k1, c2);\n h1 ^= k1;\n }\n h1 ^= len;\n h1 ^= h1 >>> 16;\n h1 = mul(h1, 0x85ebca6b);\n h1 ^= h1 >>> 13;\n h1 = mul(h1, 0xc2b2ae35);\n h1 ^= h1 >>> 16;\n return h1 >>> 0;\n}\n\nfunction rot(x: number, r: number): number {\n return ((x << r) | (x >>> (32 - r))) >>> 0;\n}\n\nfunction mul(a: number, b: number): number {\n const aH = (a >>> 16) & 0xffff;\n const aL = a & 0xffff;\n const bH = (b >>> 16) & 0xffff;\n const bL = b & 0xffff;\n return (aL * bL + ((((aH * bL + aL * bH) << 16) >>> 0) | 0)) >>> 0;\n}\n\nexport function bucket(experimentId: string, salt: string, subjectId: string): number {\n return murmur3(`${experimentId}:${salt}:${subjectId}`) % 10000;\n}\n","import type { DomOp } from './types.js';\n\nconst DEFAULT_WAIT_MS = 2000;\nconst POLL_INTERVAL_MS = 50;\n\n/**\n * Resolve a selector, optionally polling until it appears or the timeout elapses.\n * Mirrors Mojito's `waitForElement` (50ms / 2000ms defaults). Returns null on\n * timeout — callers treat the op as a no-op rather than throwing.\n */\nfunction waitFor(selector: string, timeoutMs: number): Promise<Element | null> {\n return new Promise((resolve) => {\n if (typeof document === 'undefined') return resolve(null);\n const initial = document.querySelector(selector);\n if (initial) return resolve(initial);\n if (timeoutMs <= 0) return resolve(null);\n const deadline = Date.now() + timeoutMs;\n const tick = () => {\n const el = document.querySelector(selector);\n if (el) return resolve(el);\n if (Date.now() >= deadline) return resolve(null);\n setTimeout(tick, POLL_INTERVAL_MS);\n };\n setTimeout(tick, POLL_INTERVAL_MS);\n });\n}\n\nfunction injectStyle(experimentId: string, css: string): void {\n if (typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.dataset.fxExperiment = experimentId;\n style.dataset.fxOp = 'injectCSS';\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/**\n * Apply one declarative op. Async because some ops poll for elements; resolves\n * with `true` on success, `false` if the target wasn't found within the wait\n * budget (the SDK's outer try/catch reports thrown errors as exposure failures).\n */\nasync function applyOne(experimentId: string, op: DomOp): Promise<boolean> {\n if (typeof document === 'undefined') return false;\n if (op.op === 'injectCSS') {\n injectStyle(experimentId, op.value);\n return true;\n }\n const wait = 'waitForMs' in op && typeof op.waitForMs === 'number' ? op.waitForMs : DEFAULT_WAIT_MS;\n const el = await waitFor(op.selector, wait);\n if (!el) return false;\n switch (op.op) {\n case 'replaceText':\n el.textContent = op.value;\n return true;\n case 'replaceHTML':\n el.innerHTML = op.value;\n return true;\n case 'setAttr':\n el.setAttribute(op.name, op.value);\n return true;\n case 'addClass':\n el.classList.add(...op.value.split(/\\s+/).filter(Boolean));\n return true;\n case 'removeClass':\n el.classList.remove(...op.value.split(/\\s+/).filter(Boolean));\n return true;\n case 'setStyle':\n (el as HTMLElement).style.setProperty(op.name, op.value);\n return true;\n case 'remove':\n el.parentNode?.removeChild(el);\n return true;\n case 'injectHTML':\n el.insertAdjacentHTML(op.position, op.value);\n return true;\n }\n}\n\nexport async function applyDomOps(experimentId: string, ops: readonly DomOp[]): Promise<void> {\n for (const op of ops) {\n try {\n await applyOne(experimentId, op);\n } catch {\n /* per-op failure is non-fatal; remaining ops still attempt */\n }\n }\n}\n","/**\n * Signed preview tokens. Marketing QA flow parity with Mojito's\n * `?mojito_<id>=<recipeId>` URL param, but gated by a short-lived HS256 JWT\n * so anyone holding the token (and only them) can preview a variant.\n *\n * Token payload: { exp, scope: { experimentId, variantKey }, tenantId }\n * Header: { alg: 'HS256', typ: 'JWT' }\n *\n * The SDK verifies the token client-side using a tenant-issued preview secret\n * exposed only to authenticated Studio users. The secret rotates independently\n * of the manifest signing keys; compromise scope is \"force a variant in the\n * browser of whoever holds the link\" — never bypasses governance because\n * preview assignments are not exposure-tracked.\n */\n\nimport type { Manifest } from './types.js';\n\nexport interface PreviewClaim {\n experimentId: string;\n variantKey: string;\n tenantId: string;\n exp: number;\n}\n\nexport interface ParsedPreview {\n expId: string;\n variantKey: string;\n /** Encoded JWT to optionally verify against a secret. */\n token: string;\n}\n\n/** Reads `?fxpreview=<expId>:<variantKey>&fxtoken=<jwt>` from the URL. */\nexport function parsePreviewParams(search: string | undefined): ParsedPreview | null {\n if (!search) return null;\n const q = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n const fxp = q.get('fxpreview');\n const tok = q.get('fxtoken');\n if (!fxp || !tok) return null;\n const [expId, variantKey] = fxp.split(':');\n if (!expId || !variantKey) return null;\n return { expId, variantKey, token: tok };\n}\n\nfunction b64urlToBytes(s: string): Uint8Array {\n const pad = s.length % 4 === 0 ? '' : '='.repeat(4 - (s.length % 4));\n const b64 = (s + pad).replace(/-/g, '+').replace(/_/g, '/');\n const bin = typeof atob === 'function' ? atob(b64) : Buffer.from(b64, 'base64').toString('binary');\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction bytesToString(bytes: Uint8Array): string {\n return typeof TextDecoder !== 'undefined'\n ? new TextDecoder().decode(bytes)\n : Buffer.from(bytes).toString('utf8');\n}\n\nfunction constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let r = 0;\n for (let i = 0; i < a.length; i++) r |= a[i]! ^ b[i]!;\n return r === 0;\n}\n\n/**\n * Verifies an HS256 JWT against the tenant preview secret and returns the\n * claim if valid + unexpired + matching the requested manifest tenant.\n *\n * Returns null when verification fails, the token is expired, or the SubtleCrypto\n * API isn't available (server-rendered without crypto polyfill).\n */\nexport async function verifyPreviewToken(\n token: string,\n secret: string,\n manifest: Manifest,\n now: number = Date.now(),\n): Promise<PreviewClaim | null> {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const [headerB64, payloadB64, sigB64] = parts as [string, string, string];\n\n let header: { alg?: string; typ?: string };\n let payload: Partial<PreviewClaim>;\n try {\n header = JSON.parse(bytesToString(b64urlToBytes(headerB64)));\n payload = JSON.parse(bytesToString(b64urlToBytes(payloadB64)));\n } catch {\n return null;\n }\n if (header.alg !== 'HS256') return null;\n\n const subtle =\n (globalThis as { crypto?: { subtle?: SubtleCrypto } }).crypto?.subtle ?? null;\n if (!subtle) return null;\n\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signed = enc.encode(`${headerB64}.${payloadB64}`);\n const expectedBuf = await subtle.sign('HMAC', key, signed);\n const expected = new Uint8Array(expectedBuf);\n const provided = b64urlToBytes(sigB64);\n if (!constantTimeEqual(expected, provided)) return null;\n\n if (\n typeof payload.exp !== 'number' ||\n payload.exp * 1000 < now ||\n typeof payload.experimentId !== 'string' ||\n typeof payload.variantKey !== 'string' ||\n typeof payload.tenantId !== 'string'\n ) {\n return null;\n }\n if (payload.tenantId !== manifest.tenantId) return null;\n return payload as PreviewClaim;\n}\n","/** Sticky bucket persistence — pluggable adapter + Mojito-parity built-ins. */\n\nconst DEFAULT_PREFIX = 'fx.';\n\n/**\n * Pluggable sticky-storage interface. Built-ins below cover the common cases:\n * - cookieStorage() — cookie + localStorage cascade (default)\n * - localStorageOnly() — no cookie writes (privacy-first apps)\n * - sessionStorageOnly()— per-tab assignment lifetime\n * - inMemoryStorage() — tests + SSR fallback\n */\nexport interface StickyStorageAdapter {\n read(experimentId: string): string | null;\n write(experimentId: string, variantKey: string): void;\n}\n\nexport interface StorageOptions {\n cookiePrefix?: string;\n /** Cookie max-age in seconds. Default 365 days. */\n cookieMaxAgeSeconds?: number;\n}\n\nfunction escape(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function cookieStorage(options: StorageOptions = {}): StickyStorageAdapter {\n const prefix = options.cookiePrefix ?? DEFAULT_PREFIX;\n const maxAge = options.cookieMaxAgeSeconds ?? 365 * 24 * 60 * 60;\n return {\n read(experimentId) {\n const k = prefix + experimentId;\n if (typeof document !== 'undefined' && document.cookie) {\n const m = document.cookie.match(new RegExp(`(?:^|; )${escape(k)}=([^;]*)`));\n if (m) return decodeURIComponent(m[1]!);\n }\n try {\n const v = globalThis.localStorage?.getItem(k);\n if (v != null) return v;\n } catch {\n /* private mode etc */\n }\n return null;\n },\n write(experimentId, variantKey) {\n const k = prefix + experimentId;\n try {\n if (typeof document !== 'undefined') {\n document.cookie = `${k}=${encodeURIComponent(variantKey)};max-age=${maxAge};path=/;samesite=lax`;\n }\n } catch {\n /* ignore */\n }\n try {\n globalThis.localStorage?.setItem(k, variantKey);\n } catch {\n /* ignore */\n }\n },\n };\n}\n\nexport function localStorageOnly(options: StorageOptions = {}): StickyStorageAdapter {\n const prefix = options.cookiePrefix ?? DEFAULT_PREFIX;\n return {\n read(experimentId) {\n try {\n return globalThis.localStorage?.getItem(prefix + experimentId) ?? null;\n } catch {\n return null;\n }\n },\n write(experimentId, variantKey) {\n try {\n globalThis.localStorage?.setItem(prefix + experimentId, variantKey);\n } catch {\n /* ignore */\n }\n },\n };\n}\n\nexport function sessionStorageOnly(options: StorageOptions = {}): StickyStorageAdapter {\n const prefix = options.cookiePrefix ?? DEFAULT_PREFIX;\n return {\n read(experimentId) {\n try {\n return globalThis.sessionStorage?.getItem(prefix + experimentId) ?? null;\n } catch {\n return null;\n }\n },\n write(experimentId, variantKey) {\n try {\n globalThis.sessionStorage?.setItem(prefix + experimentId, variantKey);\n } catch {\n /* ignore */\n }\n },\n };\n}\n\nexport function inMemoryStorage(): StickyStorageAdapter {\n const map = new Map<string, string>();\n return {\n read: (experimentId) => map.get(experimentId) ?? null,\n write: (experimentId, variantKey) => {\n map.set(experimentId, variantKey);\n },\n };\n}\n\n/** Backwards-compatible default — cookie + localStorage cascade with `fx.` prefix. */\nexport function defaultStorage(options: StorageOptions = {}): StickyStorageAdapter {\n return cookieStorage(options);\n}\n\n/** @deprecated Use a `StickyStorageAdapter` via `InitOptions.storage`. Retained for tests. */\nexport function readSticky(experimentId: string): string | null {\n return cookieStorage().read(experimentId);\n}\n\n/** @deprecated Use a `StickyStorageAdapter` via `InitOptions.storage`. Retained for tests. */\nexport function writeSticky(experimentId: string, variantKey: string): void {\n cookieStorage().write(experimentId, variantKey);\n}\n\nconst ANON_DEFAULT_COOKIE = '_fx_sid';\nconst ANON_DEFAULT_TTL_DAYS = 365;\n\nfunction readCookie(name: string): string | null {\n if (typeof document === 'undefined' || !document.cookie) return null;\n const m = document.cookie.match(new RegExp(`(?:^|; )${escape(name)}=([^;]*)`));\n return m ? decodeURIComponent(m[1]!) : null;\n}\n\nfunction randomId(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string; getRandomValues?: (a: Uint8Array) => Uint8Array } })\n .crypto;\n if (c?.randomUUID) return c.randomUUID();\n if (c?.getRandomValues) {\n const a = new Uint8Array(16);\n c.getRandomValues(a);\n return Array.from(a, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n return (\n Date.now().toString(36) +\n Math.random().toString(36).slice(2) +\n Math.random().toString(36).slice(2)\n );\n}\n\nexport interface AnonymousIdOptions {\n cookieName?: string;\n ttlDays?: number;\n}\n\n/**\n * Reads or creates a stable anonymous subject id, persisted in a cookie\n * (and mirrored to localStorage when available). Use as the `subjectId`\n * for static-site / tag-loader installs that don't have a logged-in user.\n */\nexport function getOrCreateAnonymousId(options: AnonymousIdOptions = {}): string {\n const cookieName = options.cookieName ?? ANON_DEFAULT_COOKIE;\n const ttlDays = options.ttlDays ?? ANON_DEFAULT_TTL_DAYS;\n const existing = readCookie(cookieName);\n if (existing) return existing;\n const fromStorage = (() => {\n try {\n return globalThis.localStorage?.getItem(cookieName) ?? null;\n } catch {\n return null;\n }\n })();\n const id = fromStorage ?? randomId();\n try {\n if (typeof document !== 'undefined') {\n const maxAge = ttlDays * 24 * 60 * 60;\n document.cookie = `${cookieName}=${encodeURIComponent(id)};max-age=${maxAge};path=/;samesite=lax`;\n }\n } catch {\n /* ignore */\n }\n try {\n globalThis.localStorage?.setItem(cookieName, id);\n } catch {\n /* ignore */\n }\n return id;\n}\n","import type { Trigger } from './types.js';\n\n/**\n * Returns a promise that resolves when the trigger's activation condition is\n * met. Resolves with `true` if the experiment should activate, `false` if the\n * trigger ruled it out (e.g. URL doesn't match, selector never appeared).\n */\nexport function awaitTrigger(trigger: Trigger | undefined): Promise<boolean> {\n if (!trigger || trigger.kind === 'auto') return Promise.resolve(true);\n\n if (trigger.kind === 'urlMatch') {\n if (typeof location === 'undefined') return Promise.resolve(false);\n const href = location.href;\n if (trigger.regex) {\n try {\n return Promise.resolve(new RegExp(trigger.pattern).test(href));\n } catch {\n return Promise.resolve(false);\n }\n }\n return Promise.resolve(href.includes(trigger.pattern));\n }\n\n if (trigger.kind === 'waitForSelector') {\n if (typeof document === 'undefined') return Promise.resolve(false);\n const timeoutMs = trigger.timeoutMs ?? 2000;\n return new Promise((resolve) => {\n const found = document.querySelector(trigger.selector);\n if (found) return resolve(true);\n if (timeoutMs <= 0) return resolve(false);\n const deadline = Date.now() + timeoutMs;\n const tick = () => {\n if (document.querySelector(trigger.selector)) return resolve(true);\n if (Date.now() >= deadline) return resolve(false);\n setTimeout(tick, 50);\n };\n setTimeout(tick, 50);\n });\n }\n\n // event\n if (typeof addEventListener === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n const handler = () => {\n removeEventListener(trigger.name, handler);\n resolve(true);\n };\n addEventListener(trigger.name, handler);\n });\n}\n","import { bucket } from './hash.js';\nimport { applyDomOps } from './dom-ops.js';\nimport { parsePreviewParams, verifyPreviewToken } from './preview.js';\nimport {\n cookieStorage,\n defaultStorage,\n type StickyStorageAdapter,\n} from './storage.js';\nimport { awaitTrigger } from './trigger.js';\nimport type { Manifest, ManifestExperiment, ManifestVariant } from './types.js';\n\nexport interface DecisionContext {\n experimentId: string;\n salt: string;\n subjectId: string;\n variants: ReadonlyArray<{ key: string; weight?: number }>;\n}\n\n/**\n * Optional override for the bucketing function. Return a variant key to\n * force assignment, or null to fall through to the built-in murmur3 bucketer.\n *\n * Precedence: preview token > divertTo > sticky > decisionAdapter > bucket.\n */\nexport type DecisionAdapter = (ctx: DecisionContext) => string | null;\n\nexport interface InitOptions {\n manifestUrl: string;\n subjectId: string;\n /** Optional fetch override (SSR/tests). */\n fetchImpl?: typeof fetch;\n /** Optional exposure tracker. Receives one record per assignment. */\n onExposure?: (record: ExposureRecord) => void;\n /**\n * Optional separate hook for variant-code failures (Mojito `onRecipeFailure`).\n * Fires *only* when variant `js` or a `domOps` op throws. Fires in addition\n * to `onExposure` (which still receives a record with `failure` set).\n */\n onRecipeFailure?: (record: ExposureRecord) => void;\n /** Optional generic tracker for `track(...)`. */\n onTrack?: (eventName: string, props?: Record<string, unknown>) => void;\n /** Endpoint for sendBeacon batched exposure POSTs. */\n beaconEndpoint?: string;\n /** Tenant-scoped HS256 secret used to verify `?fxpreview=&fxtoken=` URL params. */\n previewSecret?: string;\n /** Override window.location.search (tests). */\n locationSearch?: string;\n /** Per-experiment host-supplied trigger overrides (Mojito `trigger.js` escape hatch). */\n triggers?: Record<string, () => boolean | Promise<boolean | void>>;\n /** Sticky-storage adapter. Defaults to cookie + localStorage cascade with `cookiePrefix`. */\n storage?: StickyStorageAdapter;\n /** Cookie / storage key prefix for sticky bucketing. Default `'fx.'`. */\n cookiePrefix?: string;\n /** Pluggable bucketing override. See `DecisionAdapter`. */\n decisionAdapter?: DecisionAdapter;\n /**\n * Global exclusion predicate. When truthy at construction time, all\n * `treatment()` / `payload()` calls return null/undefined and no exposures\n * are emitted. Default: `() => typeof navigator !== 'undefined' && !navigator.cookieEnabled`.\n */\n excluded?: boolean | (() => boolean);\n /**\n * Cap on `failure.stack` length sent to `onExposure`/`onRecipeFailure`/beacon.\n * Default 1000 (matches Mojito `maxErrorStackLength`). Set to `0` to disable.\n */\n maxErrorStackLength?: number;\n}\n\nexport interface ExposureRecord {\n experimentId: string;\n subjectId: string;\n variantKey: string;\n manifestVersion: number;\n at: string;\n failure: { message: string; stack?: string } | null;\n /** True when this assignment came from a signed preview token. Such records are dropped. */\n preview?: boolean;\n}\n\nexport interface ClientApi {\n treatment(experimentId: string): string | null;\n payload<T = Record<string, unknown>>(experimentId: string): T | undefined;\n /**\n * Manually emits the exposure for an experiment authored with\n * `manualExposure: true`. No-op otherwise.\n */\n expose(experimentId: string): void;\n /**\n * Returns the per-experiment metadata bag (or undefined). Useful when variant\n * code needs config (e.g. `{ debounceMs: 300 }`) that is not per-variant.\n */\n metadata<T = Record<string, unknown>>(experimentId: string): T | undefined;\n track(eventName: string, props?: Record<string, unknown>): void;\n}\n\nexport async function init(options: InitOptions): Promise<ClientApi> {\n const f = options.fetchImpl ?? globalThis.fetch;\n if (!f) throw new Error('init: no fetch available');\n const res = await f(options.manifestUrl);\n if (!res.ok) throw new Error(`init: manifest fetch ${res.status}`);\n const manifest = (await res.json()) as Manifest;\n return createClient(manifest, options);\n}\n\n/** Synchronous entry for SSR-hydrated apps that already have the manifest. */\nexport function createClient(manifest: Manifest, options: InitOptions): ClientApi {\n const exposed = new Set<string>();\n const pending: ExposureRecord[] = [];\n const pendingExposure = new Map<string, { variant: ManifestVariant; preview: boolean }>();\n const forcedPreviews = new Map<string, string>();\n // Track which experiments have already had their sharedJs/sharedCss applied.\n const sharedApplied = new Set<string>();\n\n // Resolve the global exclusion predicate once at construction time.\n const isExcluded = (() => {\n if (options.excluded === false) return false;\n if (options.excluded === true) return true;\n if (typeof options.excluded === 'function') {\n try {\n return Boolean(options.excluded());\n } catch {\n return true; // be conservative\n }\n }\n // Node 22+ exposes `navigator` with `cookieEnabled` undefined; only\n // exclude when a browser explicitly reports cookies disabled.\n return typeof navigator !== 'undefined' && navigator.cookieEnabled === false;\n })();\n\n const storage =\n options.storage ??\n (options.cookiePrefix\n ? cookieStorage({ cookiePrefix: options.cookiePrefix })\n : defaultStorage());\n const stackLimit = options.maxErrorStackLength ?? 1000;\n const decisionAdapter = options.decisionAdapter;\n\n const search =\n options.locationSearch ??\n (typeof location !== 'undefined' ? location.search : undefined);\n const previewParams = parsePreviewParams(search);\n if (previewParams && options.previewSecret) {\n void verifyPreviewToken(previewParams.token, options.previewSecret, manifest).then((claim) => {\n if (\n claim &&\n claim.experimentId === previewParams.expId &&\n claim.variantKey === previewParams.variantKey\n ) {\n forcedPreviews.set(claim.experimentId, claim.variantKey);\n }\n });\n }\n\n if (options.beaconEndpoint && typeof addEventListener !== 'undefined') {\n const flush = () => {\n if (pending.length === 0) return;\n const body = JSON.stringify({ exposures: pending.splice(0, pending.length) });\n try {\n const sb = (navigator as unknown as { sendBeacon?: (u: string, b: BodyInit) => boolean })\n .sendBeacon;\n if (sb?.call(navigator, options.beaconEndpoint!, body)) return;\n } catch {\n /* fallthrough */\n }\n try {\n fetch(options.beaconEndpoint!, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n keepalive: true,\n }).catch(() => undefined);\n } catch {\n /* swallow */\n }\n };\n addEventListener('pagehide', flush);\n addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') flush();\n });\n }\n\n function decide(experimentId: string): {\n exp: ManifestExperiment | null;\n variant: ManifestVariant | null;\n variantKey: string | null;\n preview: boolean;\n } {\n const exp = manifest.experiments.find((e) => e.id === experimentId);\n if (!exp) return { exp: null, variant: null, variantKey: null, preview: false };\n\n const forced = forcedPreviews.get(experimentId);\n if (forced) {\n const v = exp.variants.find((vv) => vv.key === forced);\n if (v) return { exp, variant: v, variantKey: forced, preview: true };\n }\n\n if (exp.state !== 'running') {\n return { exp, variant: null, variantKey: null, preview: false };\n }\n\n if (exp.divertTo) {\n const v = exp.variants.find((vv) => vv.key === exp.divertTo);\n if (v) return { exp, variant: v, variantKey: v.key, preview: false };\n }\n\n const sticky = storage.read(experimentId);\n if (sticky && exp.variants.some((v) => v.key === sticky)) {\n return {\n exp,\n variant: exp.variants.find((v) => v.key === sticky)!,\n variantKey: sticky,\n preview: false,\n };\n }\n\n if (exp.sampleRate < 1) {\n const sb = bucket(`${exp.id}:sample`, exp.salt, options.subjectId) / 10000;\n if (sb >= exp.sampleRate)\n return { exp, variant: null, variantKey: null, preview: false };\n }\n\n // decisionAdapter override (post-eligibility, pre-bucketing). Falls\n // through to bucketing when the adapter returns null/throws/unknown key.\n let chosenKey: string | null = null;\n if (decisionAdapter) {\n try {\n const forced = decisionAdapter({\n experimentId: exp.id,\n salt: exp.salt,\n subjectId: options.subjectId,\n variants: exp.variants.map((v) => ({ key: v.key, weight: v.weight })),\n });\n if (forced && exp.variants.some((v) => v.key === forced)) {\n chosenKey = forced;\n }\n } catch {\n /* fall through to bucketing */\n }\n }\n\n const b = bucket(exp.id, exp.salt, options.subjectId);\n let key: string;\n if (chosenKey !== null) {\n key = chosenKey;\n } else {\n const total = exp.variants.reduce((s, v) => s + (v.weight ?? 0), 0);\n if (total > 0) {\n let cum = 0;\n key = exp.variants[exp.variants.length - 1]!.key;\n for (const v of exp.variants) {\n cum += v.weight ?? 0;\n if (b < cum) {\n key = v.key;\n break;\n }\n }\n } else {\n const idx = Math.min(Math.floor((b / 10000) * exp.variants.length), exp.variants.length - 1);\n key = exp.variants[idx]!.key;\n }\n }\n const chosen = exp.variants.find((v) => v.key === key)!;\n\n // Per-variant recipeSampleRate gate (Mojito parity). Independent of test sampleRate.\n if (typeof chosen.recipeSampleRate === 'number' && chosen.recipeSampleRate < 1) {\n const rs = bucket(`${exp.id}:${key}:rs`, exp.salt, options.subjectId) / 10000;\n if (rs >= chosen.recipeSampleRate) {\n // In-test, but this variant is gated out for this subject.\n return { exp, variant: null, variantKey: null, preview: false };\n }\n }\n\n return { exp, variant: chosen, variantKey: key, preview: false };\n }\n\n function truncStack(stack: string | undefined): string | undefined {\n if (!stack || stackLimit <= 0) return stack;\n return stack.length > stackLimit ? stack.slice(0, stackLimit) : stack;\n }\n\n function expose(\n experimentId: string,\n variantKey: string,\n failure: ExposureRecord['failure'],\n preview: boolean,\n ) {\n const sig = `${experimentId}:${variantKey}:${failure ? 'F' : 'O'}`;\n if (exposed.has(sig)) return;\n exposed.add(sig);\n // Preview assignments are deliberately not exposure-tracked.\n if (preview) return;\n const record: ExposureRecord = {\n experimentId,\n subjectId: options.subjectId,\n variantKey,\n manifestVersion: manifest.manifestVersion,\n at: new Date().toISOString(),\n failure: failure\n ? { message: failure.message, stack: truncStack(failure.stack) }\n : null,\n };\n options.onExposure?.(record);\n if (failure) options.onRecipeFailure?.(record);\n if (options.beaconEndpoint) pending.push(record);\n }\n\n function applyShared(exp: ManifestExperiment): void {\n if (typeof document === 'undefined') return;\n if (sharedApplied.has(exp.id)) return;\n sharedApplied.add(exp.id);\n if (exp.sharedCss) {\n const style = document.createElement('style');\n style.dataset.fxExperiment = exp.id;\n style.dataset.fxScope = 'shared';\n style.textContent = exp.sharedCss;\n document.head.appendChild(style);\n }\n if (exp.sharedJs) {\n try {\n new Function('experiment', exp.sharedJs)(exp);\n } catch (err) {\n const e = err as Error;\n // Surface as a recipe-level failure with a synthetic key 'shared'.\n expose(exp.id, 'shared', { message: e.message, stack: e.stack }, false);\n }\n }\n }\n\n /** Returns true if applied cleanly; false if variant.js threw (failure already exposed). */\n function applyVariant(exp: ManifestExperiment, variant: ManifestVariant): boolean {\n if (typeof document === 'undefined') return true;\n applyShared(exp);\n if (variant.css) {\n const style = document.createElement('style');\n style.dataset.fxExperiment = exp.id;\n style.textContent = variant.css;\n document.head.appendChild(style);\n }\n if (variant.domOps && variant.domOps.length > 0) {\n void applyDomOps(exp.id, variant.domOps);\n }\n if (variant.js) {\n try {\n new Function('experiment', 'variant', variant.js)(exp, variant);\n } catch (err) {\n const e = err as Error;\n expose(exp.id, variant.key, { message: e.message, stack: e.stack }, false);\n return false;\n }\n }\n return true;\n }\n\n function activate(\n experimentId: string,\n ): { variant: ManifestVariant; key: string; preview: boolean } | null {\n if (isExcluded) return null;\n const { exp, variant, variantKey, preview } = decide(experimentId);\n if (!exp || !variant || !variantKey) return null;\n if (!preview) storage.write(experimentId, variantKey);\n\n const hostTrigger = options.triggers?.[experimentId];\n const manifestTrigger = exp.trigger;\n const needsAsyncTrigger =\n !!hostTrigger || (manifestTrigger !== undefined && manifestTrigger.kind !== 'auto');\n\n const finish = () => {\n const ok = exp.applyVariants ? applyVariant(exp, variant) : true;\n // If variant.js threw, applyVariant already emitted a failure exposure.\n // Skip the success record so we never double-emit for the same assignment.\n if (!ok) return;\n if (exp.manualExposure) {\n pendingExposure.set(experimentId, { variant, preview });\n } else {\n expose(experimentId, variantKey, null, preview);\n }\n };\n\n if (!needsAsyncTrigger) {\n finish();\n } else {\n void (async () => {\n if (hostTrigger) {\n try {\n const r = await hostTrigger();\n if (r === false) return;\n } catch {\n return;\n }\n }\n if (manifestTrigger) {\n const ok = await awaitTrigger(manifestTrigger);\n if (!ok) return;\n }\n finish();\n })();\n }\n\n return { variant, key: variantKey, preview };\n }\n\n return {\n treatment(experimentId) {\n const a = activate(experimentId);\n return a ? a.key : null;\n },\n payload<T = Record<string, unknown>>(experimentId: string): T | undefined {\n if (isExcluded) return undefined;\n const { variant } = decide(experimentId);\n return variant?.payload as T | undefined;\n },\n metadata<T = Record<string, unknown>>(experimentId: string): T | undefined {\n const exp = manifest.experiments.find((e) => e.id === experimentId);\n return exp?.metadata as T | undefined;\n },\n expose(experimentId) {\n if (isExcluded) return;\n const p = pendingExposure.get(experimentId);\n if (!p) return;\n pendingExposure.delete(experimentId);\n expose(experimentId, p.variant.key, null, p.preview);\n },\n track(eventName, props) {\n if (isExcluded) return;\n options.onTrack?.(eventName, props);\n },\n };\n}\n\nexport type { Manifest, ManifestExperiment, ManifestVariant, DomOp, Trigger } from './types.js';\nexport {\n getOrCreateAnonymousId,\n cookieStorage,\n localStorageOnly,\n sessionStorageOnly,\n inMemoryStorage,\n defaultStorage,\n} from './storage.js';\nexport type { StickyStorageAdapter, StorageOptions, AnonymousIdOptions } from './storage.js';\nexport { parsePreviewParams, verifyPreviewToken } from './preview.js';\nexport { applyDomOps } from './dom-ops.js';\nexport { awaitTrigger } from './trigger.js';\n\n/** Internal — exposed only for cross-SDK conformance testing in @fabricorg/experiments-testkit. */\nexport { murmur3 as _murmur3, bucket as _bucket } from './hash.js';\n"]}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@fabricorg/experiments-web",
3
+ "version": "0.0.2",
4
+ "publishConfig": {
5
+ "registry": "https://registry.npmjs.org",
6
+ "access": "public"
7
+ },
8
+ "description": "Browser SDK for Fabric Experiments. Single-global, manifest-driven, <8 kB gzipped.",
9
+ "license": "MIT",
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "main": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts",
14
+ "module": "./dist/index.js",
15
+ "browser": "./dist/index.global.js",
16
+ "exports": {
17
+ ".": {
18
+ "import": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "require": {
23
+ "types": "./dist/index.d.cts",
24
+ "default": "./dist/index.cjs"
25
+ }
26
+ },
27
+ "./tag-loader": "./dist/experiments.tag.global.js",
28
+ "./tag-loader.map": "./dist/experiments.tag.global.js.map"
29
+ },
30
+ "files": ["dist"],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "type-check": "tsc --noEmit",
34
+ "test": "vitest run src",
35
+ "test:browser": "pnpm run build && vitest run test/browser",
36
+ "size": "size-limit",
37
+ "clean": "rm -rf dist"
38
+ },
39
+ "size-limit": [
40
+ {
41
+ "path": "dist/index.global.js",
42
+ "limit": "6 KB",
43
+ "gzip": true,
44
+ "name": "core SDK (gzipped) — assignment + dom-ops + trigger + preview"
45
+ },
46
+ {
47
+ "path": "dist/experiments.tag.global.js",
48
+ "limit": "6 KB",
49
+ "gzip": true,
50
+ "name": "tag-loader IIFE (gzipped) — drop-in for marketing sites + GTM"
51
+ }
52
+ ],
53
+ "devDependencies": {
54
+ "@size-limit/preset-small-lib": "^11.1.6",
55
+ "chrome-launcher": "^1.2.1",
56
+ "puppeteer-core": "^24.43.0",
57
+ "size-limit": "^11.1.6",
58
+ "tsup": "^8.3.5",
59
+ "typescript": "^5.8.3",
60
+ "vitest": "^2.1.8"
61
+ }
62
+ }