@drip-apex/sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/bundle-report.json +584 -226
- package/dist/define.cjs +123 -0
- package/dist/define.cjs.map +7 -0
- package/dist/define.mjs +102 -0
- package/dist/define.mjs.map +7 -0
- package/dist/drip.cjs +19262 -0
- package/dist/drip.cjs.map +7 -0
- package/dist/drip.debug.js +1 -1
- package/dist/drip.debug.js.map +1 -1
- package/dist/drip.heatmap.js +1 -1
- package/dist/drip.heatmap.js.map +1 -1
- package/dist/drip.js +1 -1
- package/dist/drip.js.map +1 -1
- package/dist/drip.live.js +1 -1
- package/dist/drip.live.js.map +1 -1
- package/dist/drip.mjs +19246 -0
- package/dist/drip.mjs.map +7 -0
- package/dist/drip.replay-recorder.js +2 -0
- package/dist/drip.replay-recorder.js.map +1 -0
- package/dist/editor.js +147 -142
- package/dist/editor.js.map +4 -4
- package/dist/flags.cjs +1788 -0
- package/dist/flags.cjs.map +7 -0
- package/dist/flags.mjs +1765 -0
- package/dist/flags.mjs.map +7 -0
- package/dist/index.mjs +12 -0
- package/dist/index.mjs.map +2 -2
- package/dist/metafiles/define.cjs.meta.json +28 -0
- package/dist/metafiles/define.mjs.meta.json +32 -0
- package/dist/metafiles/drip.cjs.meta.json +3193 -0
- package/dist/metafiles/drip.debug.meta.json +2859 -574
- package/dist/metafiles/drip.heatmap.meta.json +2732 -460
- package/dist/metafiles/drip.live.meta.json +2732 -460
- package/dist/metafiles/drip.meta.json +2859 -574
- package/dist/metafiles/drip.mjs.meta.json +3235 -0
- package/dist/metafiles/drip.replay-recorder.meta.json +82 -0
- package/dist/metafiles/editor.meta.json +67 -27
- package/dist/metafiles/flags.cjs.meta.json +220 -0
- package/dist/metafiles/flags.mjs.meta.json +225 -0
- package/dist/metafiles/index.meta.json +2717 -491
- package/dist/metafiles/index.mjs.meta.json +14 -4
- package/dist/react/index.js +16621 -13539
- package/dist/react/index.js.map +4 -4
- package/dist/sri.json +20 -15
- package/dist/types/activation-runtime.d.ts +91 -0
- package/dist/types/analytics-runtime.d.ts +166 -0
- package/dist/types/antiflicker.d.ts +9 -3
- package/dist/types/assignment-cookie-sync.d.ts +31 -0
- package/dist/types/assignment-runtime.d.ts +257 -0
- package/dist/types/assignment-store.d.ts +4 -8
- package/dist/types/bucket.d.ts +1 -2
- package/dist/types/compact-store.d.ts +1 -0
- package/dist/types/config-runtime.d.ts +313 -0
- package/dist/types/consent-evaluation.d.ts +27 -0
- package/dist/types/css.d.ts +5 -3
- package/dist/types/debug-loader.d.ts +2 -0
- package/dist/types/decide-assignments.d.ts +31 -0
- package/dist/types/delivery-timing.d.ts +8 -0
- package/dist/types/early-interaction-capture.d.ts +79 -0
- package/dist/types/early-reassert.d.ts +32 -0
- package/dist/types/edge-runtime.d.ts +11 -0
- package/dist/types/editor/api.d.ts +3 -0
- package/dist/types/editor/controller.d.ts +3 -1
- package/dist/types/editor/publication-result.d.ts +11 -0
- package/dist/types/editor/types.d.ts +2 -1
- package/dist/types/editor/view-kit.d.ts +1 -1
- package/dist/types/endpoint.d.ts +8 -0
- package/dist/types/exclusion-groups.d.ts +4 -7
- package/dist/types/flags.d.ts +2 -0
- package/dist/types/goal-eligibility.d.ts +4 -0
- package/dist/types/goals.d.ts +10 -1
- package/dist/types/guards.d.ts +7 -7
- package/dist/types/handover.d.ts +12 -1
- package/dist/types/hash.d.ts +8 -4
- package/dist/types/hydration.d.ts +2 -1
- package/dist/types/index.d.ts +24 -128
- package/dist/types/init-test-helpers.d.ts +48 -0
- package/dist/types/inline-bootstrap.d.ts +26 -0
- package/dist/types/js.d.ts +3 -1
- package/dist/types/money.d.ts +12 -0
- package/dist/types/mutate.d.ts +45 -6
- package/dist/types/performance.d.ts +2 -0
- package/dist/types/persistence-decoders.d.ts +12 -0
- package/dist/types/public-api.d.ts +209 -0
- package/dist/types/qa-assistant-state.d.ts +34 -0
- package/dist/types/react/index.d.ts +28 -3
- package/dist/types/reassert-sentinel.d.ts +6 -0
- package/dist/types/redirect.d.ts +48 -0
- package/dist/types/replay-recorder-entry.d.ts +1 -0
- package/dist/types/replay-signal-state.d.ts +6 -0
- package/dist/types/replay-signals.d.ts +13 -0
- package/dist/types/replay.d.ts +110 -0
- package/dist/types/router.d.ts +12 -2
- package/dist/types/runtime-state.d.ts +166 -0
- package/dist/types/sanitize.d.ts +1 -0
- package/dist/types/shadow.d.ts +3 -0
- package/dist/types/shopify-cart.d.ts +25 -1
- package/dist/types/storefront-vitals.d.ts +24 -0
- package/dist/types/targeting-diagnostics.d.ts +1 -0
- package/dist/types/targeting.d.ts +16 -2
- package/dist/types/track.d.ts +15 -1
- package/dist/types/types.d.ts +115 -9
- package/dist/types/wait.d.ts +14 -1
- package/dist/types/weekday-schedule.d.ts +3 -0
- package/package.json +17 -8
- package/src/activation-runtime.ts +2737 -0
- package/src/analytics-runtime.ts +2175 -0
- package/src/antiflicker.test.ts +216 -44
- package/src/antiflicker.ts +103 -28
- package/src/artifact-concurrency.test.ts +1091 -0
- package/src/assignment-cookie-sync.test.ts +202 -0
- package/src/assignment-cookie-sync.ts +189 -0
- package/src/assignment-runtime.ts +3204 -0
- package/src/assignment-store.test.ts +56 -0
- package/src/assignment-store.ts +7 -38
- package/src/bucket.ts +3 -18
- package/src/commerce-analytics-lifecycle.test.ts +75 -15
- package/src/commerce-config-lifecycle.test.ts +81 -1
- package/src/commerce-price-preserve.test.ts +133 -0
- package/src/commerce-price.test.ts +97 -0
- package/src/commerce-price.ts +74 -20
- package/src/commerce-shipping.test.ts +53 -0
- package/src/commerce-shipping.ts +5 -11
- package/src/compact-store.ts +15 -0
- package/src/config-fetch.test.ts +480 -9
- package/src/config-runtime.ts +2070 -0
- package/src/consent-evaluation-cookiescript.test.ts +50 -0
- package/src/consent-evaluation.ts +138 -0
- package/src/css.test.ts +30 -0
- package/src/css.ts +120 -6
- package/src/cwv.test.ts +60 -77
- package/src/debug-loader.test.ts +214 -0
- package/src/debug-loader.ts +41 -0
- package/src/decide-assignments.test.ts +196 -0
- package/src/decide-assignments.ts +204 -0
- package/src/delivery-timing.test.ts +104 -0
- package/src/delivery-timing.ts +89 -0
- package/src/early-interaction-capture.test.ts +451 -0
- package/src/early-interaction-capture.ts +230 -0
- package/src/early-reassert.test.ts +207 -0
- package/src/early-reassert.ts +152 -0
- package/src/edge-adoption.test.ts +435 -0
- package/src/edge-runtime.ts +30 -0
- package/src/editor/api.test.ts +109 -0
- package/src/editor/api.ts +34 -3
- package/src/editor/controller.test.ts +297 -14
- package/src/editor/controller.ts +69 -5
- package/src/editor/index.test.ts +2 -0
- package/src/editor/index.ts +1 -0
- package/src/editor/publication-result.ts +58 -0
- package/src/editor/types.ts +10 -1
- package/src/editor/view-kit.ts +2 -1
- package/src/editor/view.test.ts +108 -0
- package/src/editor/view.ts +49 -7
- package/src/endpoint.test.ts +15 -0
- package/src/endpoint.ts +10 -0
- package/src/exclusion-groups.ts +8 -18
- package/src/flags.test.ts +88 -1
- package/src/flags.ts +29 -29
- package/src/global-runtime-reconciler.test.ts +271 -0
- package/src/goal-eligibility.test.ts +29 -0
- package/src/goal-eligibility.ts +17 -0
- package/src/goals.test.ts +144 -1
- package/src/goals.ts +97 -18
- package/src/guards.test.ts +99 -1
- package/src/guards.ts +34 -15
- package/src/handover-cache-order.test.ts +6 -3
- package/src/handover.test.ts +154 -8
- package/src/handover.ts +122 -12
- package/src/hash.ts +29 -54
- package/src/holdout.test.ts +26 -0
- package/src/hydration.test.ts +73 -2
- package/src/hydration.ts +18 -9
- package/src/index.ts +130 -7287
- package/src/init-analytics.test.ts +1694 -0
- package/src/init-anti-flicker.test.ts +1211 -0
- package/src/init-cart-attributes.test.ts +2003 -0
- package/src/init-config-resolution.test.ts +999 -0
- package/src/init-consent.test.ts +971 -0
- package/src/init-empty.test.ts +11 -5406
- package/src/init-integrations.test.ts +846 -0
- package/src/init-page-activation.test.ts +5064 -0
- package/src/init-qa-loading.test.ts +740 -0
- package/src/init-redirects.test.ts +2156 -0
- package/src/init-test-helpers.ts +287 -0
- package/src/inline-bootstrap.test.ts +184 -0
- package/src/inline-bootstrap.ts +73 -0
- package/src/js.test.ts +51 -1
- package/src/js.ts +86 -2
- package/src/money.test.ts +55 -1
- package/src/money.ts +104 -2
- package/src/money.web-parity.contract.test.ts +85 -0
- package/src/mutate.test.ts +474 -10
- package/src/mutate.ts +739 -230
- package/src/page-trigger.test.ts +218 -8
- package/src/performance.ts +10 -0
- package/src/persistence-decoders.ts +18 -0
- package/src/public-api.ts +1828 -0
- package/src/qa-assistant-state.test.ts +249 -3
- package/src/qa-assistant-state.ts +146 -6
- package/src/qa-assistant-view.test.ts +220 -2
- package/src/qa-assistant-view.ts +102 -5
- package/src/react/index.test.tsx +37 -0
- package/src/react/index.tsx +19 -3
- package/src/reassert-sentinel.test.ts +155 -1
- package/src/reassert-sentinel.ts +168 -8
- package/src/redirect.test.ts +541 -0
- package/src/redirect.ts +572 -0
- package/src/replay-recorder-entry.ts +115 -0
- package/src/replay-signal-state.ts +100 -0
- package/src/replay-signals.test.ts +249 -0
- package/src/replay-signals.ts +151 -0
- package/src/replay.test.ts +764 -0
- package/src/replay.ts +514 -0
- package/src/router.test.ts +61 -2
- package/src/router.ts +50 -12
- package/src/runtime-state.ts +507 -0
- package/src/runtime.test.ts +174 -7
- package/src/runtime.ts +88 -14
- package/src/sanitize.test.ts +34 -0
- package/src/sanitize.ts +23 -12
- package/src/shadow.test.ts +187 -0
- package/src/shadow.ts +99 -0
- package/src/shopify-cart.test.ts +733 -23
- package/src/shopify-cart.ts +402 -49
- package/src/storefront-vitals.test.ts +217 -0
- package/src/storefront-vitals.ts +206 -0
- package/src/surface-signals.ts +6 -0
- package/src/targeting-conformance.test.ts +9 -0
- package/src/targeting-diagnostics.ts +38 -8
- package/src/targeting-parity-corpus.json +559 -0
- package/src/targeting-parity-corpus.test.ts +18 -0
- package/src/targeting.detailed.test.ts +105 -0
- package/src/targeting.test.ts +211 -0
- package/src/targeting.ts +88 -207
- package/src/track.test.ts +147 -0
- package/src/track.ts +125 -26
- package/src/types.ts +120 -13
- package/src/wait.test.ts +23 -0
- package/src/wait.ts +129 -13
- package/src/weekday-delivery.test.ts +56 -0
- package/src/weekday-schedule-parity-corpus.json +92 -0
- package/src/weekday-schedule.test.ts +69 -0
- package/src/weekday-schedule.ts +20 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../shared-runtime/src/bucketing.ts", "../src/define.ts", "../src/edge-runtime.ts", "../src/hash.ts", "../src/data-layer-normalize.ts", "../src/runtime-tools.ts", "../../event-schema/src/targeting-core.ts", "../src/signals.ts", "../src/targeting.ts", "../../shared-runtime/src/weekday-schedule.ts", "../src/weekday-schedule.ts", "../src/flags.ts"],
|
|
4
|
+
"sourcesContent": ["// Deterministic bucketing kernel shared by SDK and Worker (#2476).\n//\n// This module is the single source of truth for how a visitor is turned into\n// an assignment decision. It carries zero imports so every consumer inlines\n// the same bytes at build time.\n//\n// apps/web cannot import workspace packages; it keeps a byte-identical mirror\n// at apps/web/src/lib/bucketing.ts. The mirror is bound to this file by\n// src/web-parity.contract.test.ts, which replays the golden-vector corpus\n// (ops/bucketing-golden-vectors.json) through both implementations.\n//\n// Changing any function here reshuffles live assignments. The golden vectors\n// are the gate: they must keep passing unchanged.\n\nexport function murmurhash3_32_gc(key: string, seed = 0): number {\n let remainder = key.length & 3;\n let bytes = key.length - remainder;\n let h1 = seed;\n let c1 = 0xcc9e2d51;\n let c2 = 0x1b873593;\n let i = 0;\n\n while (i < bytes) {\n let k1 =\n (key.charCodeAt(i) & 0xff) |\n ((key.charCodeAt(++i) & 0xff) << 8) |\n ((key.charCodeAt(++i) & 0xff) << 16) |\n ((key.charCodeAt(++i) & 0xff) << 24);\n ++i;\n\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = Math.imul(h1, 5) + 0xe6546b64;\n }\n\n let k1 = 0;\n switch (remainder) {\n case 3:\n k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n case 2:\n k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n case 1:\n k1 ^= key.charCodeAt(i) & 0xff;\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n h1 ^= h1 >>> 16;\n h1 = Math.imul(h1, 0x85ebca6b);\n h1 ^= h1 >>> 13;\n h1 = Math.imul(h1, 0xc2b2ae35);\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n\nexport function hashToFloat(seed: string, value: string): number {\n const hash = murmurhash3_32_gc(seed + value, 1);\n return (hash % 10000) / 10000;\n}\n\nexport function variationHashToFloat(experimentId: string, value: string): number {\n return hashToFloat(`${experimentId}:variation`, value);\n}\n\nexport function inTrafficAllocation(hashValue: number, allocation = 1): boolean {\n if (allocation <= 0) return false;\n if (allocation >= 1) return true;\n return hashValue < allocation;\n}\n\nexport function chooseVariation(hashValue: number, weights: number[]): number {\n if (!weights.length) return -1;\n const total = weights.reduce((sum, w) => sum + (w > 0 ? w : 0), 0);\n if (total <= 0) return 0;\n const n = hashValue * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] > 0 ? weights[i] : 0;\n if (n < acc) return i;\n }\n return weights.length - 1;\n}\n", "/**\n * defineExperiment \u2014 typed experiment definitions with validation.\n *\n * Usage:\n * const hero = defineExperiment({\n * slug: \"hero-banner-v2\",\n * name: \"Hero Banner V2\",\n * variations: [\n * { id: \"control\", weight: 0.5, mutations: [], isControl: true },\n * { id: \"variant-a\", weight: 0.5, mutations: [{ selector: \".hero h1\", action: \"text\", text: \"New headline\" }] },\n * ],\n * targeting: { url: [{ type: \"simple\", pattern: \"/\" }] },\n * goals: [{ id: \"cta-click\", type: \"click\", selector: \".hero-cta\" }],\n * });\n */\n\nimport type { Experiment, Goal, Mutation, Targeting, Variation } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Input types \u2014 looser than runtime types for developer ergonomics\n// ---------------------------------------------------------------------------\n\nexport interface ExperimentDefinition {\n /** Unique slug for GitOps upsert. Required for code-first experiments. */\n slug: string;\n /** Human-readable name. */\n name: string;\n /** Traffic allocation percentage (0\u20131). Default: 1. */\n trafficAllocation?: number;\n /** Targeting rules. */\n targeting?: Targeting;\n /** Hash attribute override (default: visitor cookie). */\n hashAttribute?: string;\n /** Variation definitions. At least two required. */\n variations: VariationDefinition[];\n /** Goal definitions for conversion tracking. */\n goals?: GoalDefinition[];\n}\n\nexport interface VariationDefinition {\n /** Variation identifier (used as slug within the experiment). */\n id: string;\n /** Display name. Falls back to id if omitted. */\n name?: string;\n /** Traffic weight (0\u20131). All weights should sum to 1. */\n weight: number;\n /** DOM mutations to apply. Default: []. */\n mutations?: Mutation[];\n /** Optional typed value returned by feature-flag helpers. */\n value?: unknown;\n /** Custom CSS injected when this variation is active. */\n css?: string;\n /** Custom JavaScript executed when this variation is active. */\n js?: string;\n /** Reset JavaScript executed on SPA navigation away. */\n resetJs?: string;\n /** External CSS artifact URL loaded when this variation is active. */\n externalCssUrl?: string;\n /** External JS artifact URL loaded when this variation is active. */\n externalJsUrl?: string;\n /** Mark as control variation. Exactly one variation should be control. */\n isControl?: boolean;\n}\n\nexport interface GoalDefinition {\n /** Goal identifier (used as slug). */\n id: string;\n /** Goal type. */\n type: \"click\" | \"pageview\" | \"custom\" | \"revenue\";\n /** CSS selector for click/element goals. */\n selector?: string;\n /** URL pattern for pageview goals. */\n urlPattern?: string;\n /** Only count once per session. Default: false. */\n countOnce?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Validation errors\n// ---------------------------------------------------------------------------\n\nexport class ExperimentDefinitionError extends Error {\n public readonly issues: string[];\n\n constructor(slug: string, issues: string[]) {\n super(`Invalid experiment \"${slug}\": ${issues.join(\"; \")}`);\n this.name = \"ExperimentDefinitionError\";\n this.issues = issues;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nfunction validate(def: ExperimentDefinition): string[] {\n const issues: string[] = [];\n\n if (!def.slug || typeof def.slug !== \"string\") {\n issues.push(\"slug is required and must be a non-empty string\");\n } else if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(def.slug) && def.slug.length > 1) {\n issues.push(\"slug must be lowercase alphanumeric with hyphens (e.g. 'hero-banner-v2')\");\n }\n\n if (!def.name || typeof def.name !== \"string\") {\n issues.push(\"name is required\");\n }\n\n if (!Array.isArray(def.variations) || def.variations.length < 2) {\n issues.push(\"at least 2 variations are required\");\n } else {\n const controls = def.variations.filter((v) => v.isControl);\n if (controls.length === 0) {\n issues.push(\"exactly one variation must be marked as control (isControl: true)\");\n } else if (controls.length > 1) {\n issues.push(\"only one variation can be the control\");\n }\n\n const totalWeight = def.variations.reduce((sum, v) => sum + v.weight, 0);\n if (Math.abs(totalWeight - 1) > 0.01) {\n issues.push(`variation weights should sum to 1 (got ${totalWeight.toFixed(3)})`);\n }\n\n const ids = new Set<string>();\n for (const v of def.variations) {\n if (!v.id) issues.push(\"every variation must have an id\");\n if (ids.has(v.id)) issues.push(`duplicate variation id: \"${v.id}\"`);\n ids.add(v.id);\n if (v.weight < 0 || v.weight > 1) issues.push(`variation \"${v.id}\" weight must be between 0 and 1`);\n }\n }\n\n if (def.trafficAllocation !== undefined) {\n if (def.trafficAllocation < 0 || def.trafficAllocation > 1) {\n issues.push(\"trafficAllocation must be between 0 and 1\");\n }\n }\n\n if (def.goals) {\n const goalIds = new Set<string>();\n for (const g of def.goals) {\n if (!g.id) issues.push(\"every goal must have an id\");\n if (goalIds.has(g.id)) issues.push(`duplicate goal id: \"${g.id}\"`);\n goalIds.add(g.id);\n\n if (g.type === \"click\" && !g.selector) {\n issues.push(`click goal \"${g.id}\" requires a selector`);\n }\n }\n }\n\n return issues;\n}\n\n// ---------------------------------------------------------------------------\n// defineExperiment\n// ---------------------------------------------------------------------------\n\n/**\n * Define a typed, validated experiment configuration.\n *\n * Returns a frozen Experiment object ready for use with `init({ experiments: [...] })`.\n * Throws `ExperimentDefinitionError` if the definition is invalid.\n */\nexport function defineExperiment(def: ExperimentDefinition): Experiment & { slug: string } {\n const issues = validate(def);\n if (issues.length > 0) {\n throw new ExperimentDefinitionError(def.slug ?? \"(unnamed)\", issues);\n }\n\n const experiment: Experiment & { slug: string } = {\n id: def.slug, // slug is used as the id for code-first experiments\n slug: def.slug,\n name: def.name,\n trafficAllocation: def.trafficAllocation ?? 1,\n targeting: def.targeting,\n hashAttribute: def.hashAttribute,\n variations: def.variations.map((v) => ({\n id: v.id,\n name: v.name,\n weight: v.weight,\n mutations: v.mutations ?? [],\n value: v.value,\n css: v.css,\n js: v.js,\n resetJs: v.resetJs,\n externalCssUrl: v.externalCssUrl,\n externalJsUrl: v.externalJsUrl,\n isControl: v.isControl ?? false,\n })),\n goals: def.goals?.map((g) => ({\n id: g.id,\n type: g.type,\n selector: g.selector,\n urlPattern: g.urlPattern,\n countOnce: g.countOnce,\n })),\n };\n\n return Object.freeze(experiment) as Experiment & { slug: string };\n}\n\n/**\n * Define multiple experiments at once. Validates all, throws on first invalid.\n */\nexport function defineExperiments(defs: ExperimentDefinition[]): Array<Experiment & { slug: string }> {\n return defs.map(defineExperiment);\n}\n", "export type EdgeRuntimeAssignment = {\n experimentId: string;\n variationId: string;\n index: number;\n};\n\ntype EdgeRuntimeGlobals = Record<string, unknown>;\n\nexport function edgeRuntimeActive(): boolean {\n return (globalThis as EdgeRuntimeGlobals).__dripEdgeInit === true;\n}\n\n/**\n * Reads the edge worker's authoritative assignment set.\n * The adoption evaluator validates each selected variation and index.\n */\nexport function readEdgeRuntimeAssignments(): Map<string, EdgeRuntimeAssignment> | null {\n if (!edgeRuntimeActive()) return null;\n const raw = (globalThis as EdgeRuntimeGlobals).__dripEdgeAssignments;\n if (!Array.isArray(raw)) return new Map();\n const assignments = new Map<string, EdgeRuntimeAssignment>();\n for (const value of raw) {\n if (!value || typeof value !== \"object\") return new Map();\n const assignment = value as EdgeRuntimeAssignment;\n const { experimentId } = assignment;\n if (typeof experimentId !== \"string\") return new Map();\n assignments.set(experimentId, assignment);\n }\n return assignments;\n}\n", "import { hashToFloat } from \"@drip/shared-runtime/bucketing\";\nimport { edgeRuntimeActive } from \"./edge-runtime\";\n\n// The bucketing kernel lives in @drip/shared-runtime/bucketing (#2476). This\n// module keeps re-exporting it so SDK call sites and the holdout gate below\n// stay unchanged.\nexport { hashToFloat, murmurhash3_32_gc, variationHashToFloat } from \"@drip/shared-runtime/bucketing\";\n\nconst UID_KEY = \"drip_uid\";\n\ntype StorageMode = \"localStorage\" | \"sessionStorage\" | \"cookie\" | \"memory\";\n\nlet storageMode: StorageMode = \"localStorage\";\nlet encodeStorageValues = false;\nlet cookieDomain = \"\";\nlet memoryUserId: string | null = null;\n\nexport function isHoldoutVisitor(\n config: { holdout_v1_enabled?: unknown; holdout_pct?: unknown },\n visitorId: string,\n): boolean {\n const pct = config.holdout_pct;\n return config.holdout_v1_enabled === true && typeof pct === \"number\" &&\n pct > 0 && pct <= 10 && hashToFloat(\"apex:global-holdout:v1\", visitorId) < pct / 100;\n}\n\nexport function applyHoldoutGate<T>(config: Parameters<typeof isHoldoutVisitor>[0], visitorId: string, values: T[]): T[] {\n return isHoldoutVisitor(config, visitorId) ? [] : values;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let out = \"\";\n for (let i = 0; i < bytes.length; i++) {\n out += bytes[i].toString(16).padStart(2, \"0\");\n }\n return out;\n}\n\nfunction generateId(): string {\n if (globalThis.crypto && globalThis.crypto.getRandomValues) {\n const bytes = new Uint8Array(16);\n globalThis.crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport function configureIdentityStorage(settings?: {\n storageMode?: StorageMode;\n encodeStorageValues?: boolean;\n cookieDomain?: string;\n}): void {\n storageMode = settings?.storageMode ?? \"localStorage\";\n encodeStorageValues = settings?.encodeStorageValues === true;\n cookieDomain = normalizeCookieDomain(settings?.cookieDomain);\n}\n\nfunction normalizeCookieDomain(value: string | undefined): string {\n const normalized = (value ?? \"\")\n .trim()\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/\\/.*$/, \"\")\n .replace(/[?#].*$/, \"\")\n .replace(/:\\d+$/, \"\")\n .toLowerCase();\n if (!normalized || normalized === \"localhost\" || normalized.includes(\":\")) return \"\";\n const candidate = normalized.replace(/^\\.+/, \".\");\n const labels = candidate.replace(/^\\./, \"\").split(\".\");\n return labels.length > 1\n && labels.every((label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label))\n ? candidate\n : \"\";\n}\n\nfunction encodeStoredValue(value: string): string {\n if (!encodeStorageValues) return value;\n try {\n return \"b64:\" + btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n } catch {\n return value;\n }\n}\n\nfunction decodeStoredValue(value: string | null): string | null {\n if (!value) return null;\n if (!value.startsWith(\"b64:\")) return value;\n try {\n const raw = value.slice(4).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = raw + \"=\".repeat((4 - (raw.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\n/**\n * Lifetime (cross-session) storage permitted by the configured identity\n * storage mode. Only localStorage mode has one; sessionStorage/memory/cookie\n * modes return null so lifetime counters stay unpersisted under them.\n */\nexport function lifetimeIdentityStorage(): Storage | null {\n if (storageMode !== \"localStorage\") return null;\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction browserStorage(): Storage | null {\n try {\n if (storageMode === \"sessionStorage\") return globalThis.sessionStorage ?? null;\n if (storageMode === \"localStorage\") return globalThis.localStorage ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nfunction readStorage(): string | null {\n if (storageMode === \"memory\") return memoryUserId;\n if (storageMode === \"cookie\") return null;\n try {\n return decodeStoredValue(browserStorage()?.getItem(UID_KEY) || null);\n } catch {\n return null;\n }\n}\n\nfunction writeStorage(value: string): void {\n if (storageMode === \"memory\") {\n memoryUserId = value;\n return;\n }\n if (storageMode === \"cookie\") return;\n try {\n browserStorage()?.setItem(UID_KEY, encodeStoredValue(value));\n } catch {\n // ignore\n }\n}\n\nfunction readCookie(): string | null {\n if (!globalThis.document?.cookie) return null;\n const match = globalThis.document.cookie.match(\n new RegExp(\"(^| )\" + UID_KEY + \"=([^;]+)\"),\n );\n return match ? decodeStoredValue(decodeURIComponent(match[2])) : null;\n}\n\nfunction writeCookie(value: string): void {\n if (!globalThis.document) return;\n const expires = new Date(Date.now() + 365 * 864e5).toUTCString();\n const domain = cookieDomain ? \"; domain=\" + cookieDomain : \"\";\n globalThis.document.cookie =\n UID_KEY + \"=\" + encodeURIComponent(encodeStoredValue(value)) + \"; expires=\" + expires + \"; path=/\" + domain;\n}\n\nexport function getUserId(provided?: string): string {\n if (provided) return provided;\n if (edgeRuntimeActive()) {\n const edgeUserId = readCookie();\n if (edgeUserId) {\n if (readStorage() !== edgeUserId) writeStorage(edgeUserId);\n return edgeUserId;\n }\n }\n const existing = readStorage() || readCookie();\n if (existing) return existing;\n const created = generateId();\n writeStorage(created);\n if (storageMode !== \"memory\") writeCookie(created);\n return created;\n}\n\n/** Reads an existing durable identity without minting or persisting a new one. */\nexport function getPersistedUserId(): string | null {\n return readStorage() || readCookie();\n}\n\nexport function getEphemeralUserId(provided?: string): string {\n return provided || generateId();\n}\n\nexport function adoptUserId(value: string): void {\n if (!value) return;\n writeStorage(value);\n if (storageMode !== \"memory\") writeCookie(value);\n}\n", "function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function normalizeDataLayerEntry(\n item: unknown,\n): Record<string, unknown> | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null;\n\n const record = item as Record<PropertyKey, unknown>;\n if (typeof record.event === \"string\") {\n return item as Record<string, unknown>;\n }\n\n if (record[0] !== \"event\" || typeof record[1] !== \"string\") return null;\n\n const params = isPlainObject(record[2]) ? record[2] : {};\n return { ...params, event: record[1] };\n}\n", "import { normalizeDataLayerEntry } from \"./data-layer-normalize\";\n\ntype Cleanup = () => void;\n\ntype DataLayerEntry = Record<string, unknown>;\ntype DataLayerMatcher = Record<string, unknown> | Array<[string, unknown]>;\n\ntype RuntimeToolsEnvironment = {\n document?: Document;\n window?: Window & typeof globalThis;\n location?: Location;\n track?: (type: string, data?: Record<string, unknown>) => void;\n trackGoal?: (goalId: string, data?: Record<string, unknown>) => void;\n signal?: (key: string, value: unknown, ttlDays?: number) => void;\n reInit?: (forceReapply?: boolean) => unknown;\n get?: (key: string) => unknown;\n};\n\nexport type WaitForElementOptions = {\n root?: ParentNode;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type DomChangedOptions = {\n root?: Node;\n subtree?: boolean;\n debounceMs?: number;\n};\n\nexport type ElementInViewOptions = {\n root?: Element | Document | null;\n rootMargin?: string;\n threshold?: number;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type DataLayerOptions = {\n layerName?: string;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type ApexRuntimeTools = {\n waitForElement: (\n selector: string,\n callback: (element: Element) => void,\n options?: WaitForElementOptions,\n ) => Cleanup;\n elementIsInView: (\n selector: string,\n callback: (element: Element) => void,\n options?: ElementInViewOptions | boolean,\n ) => Cleanup;\n domChanged: (\n callback: (mutations: MutationRecord[]) => void,\n options?: DomChangedOptions,\n ) => Cleanup;\n domLoaded: (callback: () => void) => Cleanup;\n waitForDataLayer: (\n matcher: DataLayerMatcher,\n callback: (entry: DataLayerEntry) => void,\n options?: DataLayerOptions,\n ) => Cleanup;\n track: (type: string, data?: Record<string, unknown>) => void;\n trackGoal: (goalId: string, data?: Record<string, unknown>) => void;\n signal: (key: string, value: unknown, ttlDays?: number) => void;\n redirect: (target: string) => void;\n reInit: (forceReapply?: boolean) => unknown;\n get: (key: string) => unknown;\n};\n\nfunction noopCleanup(): Cleanup {\n return () => {};\n}\n\nfunction readDocument(env: RuntimeToolsEnvironment): Document | undefined {\n return env.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction readWindow(\n env: RuntimeToolsEnvironment,\n): (Window & typeof globalThis) | undefined {\n return env.window ?? (typeof window !== \"undefined\" ? window : undefined);\n}\n\nfunction readLocation(env: RuntimeToolsEnvironment): Location | undefined {\n return env.location ?? (typeof location !== \"undefined\" ? location : undefined);\n}\n\nfunction safeCallback<T>(callback: (value: T) => void, value: T): void {\n try {\n callback(value);\n } catch {}\n}\n\nfunction isElement(value: unknown): value is Element {\n return typeof Element !== \"undefined\" && value instanceof Element;\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== \"undefined\" && value instanceof Document;\n}\n\nfunction collectMatches(root: ParentNode, selector: string): Element[] {\n const matches: Element[] = [];\n if (isElement(root) && root.matches(selector)) {\n matches.push(root);\n }\n try {\n root.querySelectorAll(selector).forEach((element) => matches.push(element));\n } catch {}\n return matches;\n}\n\nfunction observeRootFor(root: ParentNode, doc: Document): Node | null {\n if (isDocument(root)) {\n return root.documentElement ?? root.body;\n }\n if (isElement(root)) return root;\n return doc.documentElement ?? doc.body;\n}\n\nfunction normalizeInViewOptions(\n options: ElementInViewOptions | boolean | undefined,\n): ElementInViewOptions {\n if (typeof options === \"boolean\") return { once: !options };\n return options ?? {};\n}\n\nfunction normalizeMatcher(matcher: DataLayerMatcher): Array<[string, unknown]> {\n return Array.isArray(matcher) ? matcher : Object.entries(matcher);\n}\n\nfunction matchesDataLayerEntry(\n entry: unknown,\n matcher: DataLayerMatcher,\n): entry is DataLayerEntry {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return false;\n const record = entry as DataLayerEntry;\n return normalizeMatcher(matcher).every(([key, expected]) => {\n if (expected instanceof RegExp) {\n return expected.test(String(record[key] ?? \"\"));\n }\n return record[key] === expected;\n });\n}\n\nexport function createApexRuntimeTools(\n env: RuntimeToolsEnvironment = {},\n): ApexRuntimeTools {\n const tools: ApexRuntimeTools = {\n waitForElement(\n selector: string,\n callback: (element: Element) => void,\n options: WaitForElementOptions = {},\n ): Cleanup {\n const doc = readDocument(env);\n if (!doc || !selector.trim()) return noopCleanup();\n const root = options.root ?? doc;\n const seen = new WeakSet<Element>();\n let active = true;\n let observer: MutationObserver | null = null;\n let timeoutId: number | null = null;\n\n const stop = () => {\n active = false;\n observer?.disconnect();\n observer = null;\n if (timeoutId !== null) {\n readWindow(env)?.clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const handle = (scope: ParentNode) => {\n if (!active) return;\n for (const element of collectMatches(scope, selector)) {\n if (seen.has(element)) continue;\n seen.add(element);\n safeCallback(callback, element);\n if (options.once !== false) {\n stop();\n return;\n }\n }\n };\n\n handle(root);\n if (!active || typeof MutationObserver === \"undefined\") return stop;\n\n const observeTarget = observeRootFor(root, doc);\n if (!observeTarget) return stop;\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (isElement(node)) handle(node);\n });\n }\n });\n observer.observe(observeTarget, { childList: true, subtree: true });\n\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutId = readWindow(env)?.setTimeout(stop, options.timeoutMs) ?? null;\n }\n return stop;\n },\n\n elementIsInView(\n selector: string,\n callback: (element: Element) => void,\n rawOptions?: ElementInViewOptions | boolean,\n ): Cleanup {\n const doc = readDocument(env);\n const win = readWindow(env);\n if (!doc || !win || !selector.trim()) return noopCleanup();\n const options = normalizeInViewOptions(rawOptions);\n const once = options.once !== false;\n const observed = new WeakSet<Element>();\n const cleanups: Cleanup[] = [];\n let observer: IntersectionObserver | null = null;\n\n const stop = () => {\n observer?.disconnect();\n observer = null;\n cleanups.splice(0).forEach((cleanup) => cleanup());\n };\n\n if (typeof IntersectionObserver === \"undefined\") {\n return tools.waitForElement(\n selector,\n (element: Element) => {\n const rect = element.getBoundingClientRect();\n const inView =\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom >= 0 &&\n rect.right >= 0 &&\n rect.top <= win.innerHeight &&\n rect.left <= win.innerWidth;\n if (inView) safeCallback(callback, element);\n },\n { once, timeoutMs: options.timeoutMs },\n );\n }\n\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n safeCallback(callback, entry.target);\n if (once) observer?.unobserve(entry.target);\n }\n },\n {\n root: isDocument(options.root) ? null : (options.root ?? null),\n rootMargin: options.rootMargin,\n threshold: options.threshold ?? 1,\n },\n );\n\n cleanups.push(\n tools.waitForElement(\n selector,\n (element: Element) => {\n if (observed.has(element)) return;\n observed.add(element);\n observer?.observe(element);\n },\n { once: false, timeoutMs: options.timeoutMs },\n ),\n );\n return stop;\n },\n\n domChanged(\n callback: (mutations: MutationRecord[]) => void,\n options: DomChangedOptions = {},\n ): Cleanup {\n const doc = readDocument(env);\n const win = readWindow(env);\n if (!doc || typeof MutationObserver === \"undefined\") return noopCleanup();\n const root = options.root ?? doc.documentElement ?? doc.body;\n if (!root) return noopCleanup();\n const debounceMs = Math.max(0, options.debounceMs ?? 50);\n let pending: MutationRecord[] = [];\n let timeoutId: number | null = null;\n const flush = () => {\n timeoutId = null;\n const mutations = pending;\n pending = [];\n safeCallback(callback, mutations);\n };\n const observer = new MutationObserver((mutations) => {\n pending.push(...mutations);\n if (debounceMs === 0) {\n flush();\n return;\n }\n if (timeoutId !== null) return;\n timeoutId = win?.setTimeout(flush, debounceMs) ?? null;\n });\n observer.observe(root, { childList: true, subtree: options.subtree !== false });\n return () => {\n observer.disconnect();\n if (timeoutId !== null) win?.clearTimeout(timeoutId);\n };\n },\n\n domLoaded(callback: () => void): Cleanup {\n const doc = readDocument(env);\n if (!doc || doc.readyState !== \"loading\") {\n safeCallback(callback, undefined);\n return noopCleanup();\n }\n const handler = () => safeCallback(callback, undefined);\n doc.addEventListener(\"DOMContentLoaded\", handler, { once: true });\n return () => doc.removeEventListener(\"DOMContentLoaded\", handler);\n },\n\n waitForDataLayer(\n matcher: DataLayerMatcher,\n callback: (entry: DataLayerEntry) => void,\n options: DataLayerOptions = {},\n ): Cleanup {\n const win = readWindow(env);\n if (!win) return noopCleanup();\n const layerName = options.layerName || \"dataLayer\";\n const layerHost = win as unknown as Record<string, unknown>;\n const layer = Array.isArray(layerHost[layerName])\n ? (layerHost[layerName] as unknown[])\n : [];\n layerHost[layerName] = layer;\n const originalPush = layer.push;\n let active = true;\n let timeoutId: number | null = null;\n\n const process = (entry: unknown) => {\n if (!active) return;\n const normalized = normalizeDataLayerEntry(entry);\n const rawRecord = entry && typeof entry === \"object\" && !Array.isArray(entry)\n ? entry as DataLayerEntry\n : null;\n const candidate = normalized ?? (\n rawRecord && typeof rawRecord[0] !== \"string\" ? rawRecord : null\n );\n if (!candidate || !matchesDataLayerEntry(candidate, matcher)) return;\n safeCallback(callback, candidate);\n if (options.once !== false) cleanup();\n };\n const cleanup = () => {\n active = false;\n if (layer.push === wrappedPush) layer.push = originalPush;\n if (timeoutId !== null) {\n win.clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n const wrappedPush = function (...items: unknown[]) {\n const result = originalPush.apply(layer, items);\n items.forEach(process);\n return result;\n };\n\n layer.slice(Math.max(0, layer.length - 50)).forEach(process);\n if (active) layer.push = wrappedPush as typeof layer.push;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutId = win.setTimeout(cleanup, options.timeoutMs);\n }\n return cleanup;\n },\n\n track(type: string, data?: Record<string, unknown>) {\n env.track?.(type, data);\n },\n\n trackGoal(goalId: string, data?: Record<string, unknown>) {\n env.trackGoal?.(goalId, data);\n },\n\n signal(key: string, value: unknown, ttlDays?: number) {\n env.signal?.(key, value, ttlDays);\n },\n\n redirect(target: string) {\n const loc = readLocation(env);\n if (!loc || !target.trim()) return;\n loc.assign(new URL(target, loc.href).toString());\n },\n\n reInit(forceReapply?: boolean) {\n return env.reInit?.(forceReapply);\n },\n\n get(key: string) {\n if (key === \"tools\") return tools;\n return env.get?.(key);\n },\n };\n\n return tools;\n}\n", "/** Dependency-free targeting primitives shared by browser and server runtimes. */\nexport type CoreUrlRule = {\n type: \"simple\" | \"regex\";\n pattern: string;\n include?: boolean;\n matchType?: \"exact\" | \"contains\" | \"wildcard\" | \"regex\";\n match_type?: \"exact\" | \"contains\" | \"wildcard\" | \"regex\";\n};\n\nexport type CoreSegmentCondition = {\n operator: string;\n value?: string | number | boolean | string[];\n};\n\nfunction isRegexOuterQuantifierStart(\n pattern: string,\n index: number,\n): boolean {\n return pattern[index] !== \"?\" && isRegexQuantifierStart(pattern, index);\n}\n\nfunction isRegexQuantifierStart(pattern: string, index: number): boolean {\n const char = pattern[index];\n if (char === \"*\" || char === \"+\" || char === \"?\") return true;\n if (char !== \"{\") return false;\n const end = pattern.indexOf(\"}\", index + 1);\n if (end === -1) return false;\n return /^\\{\\d+(?:,\\d*)?\\}$/.test(pattern.slice(index, end + 1));\n}\n\nfunction isSafeRegexPattern(pattern: string): boolean {\n if (!pattern || pattern.length > MAX_PATTERN_LENGTH) return false;\n\n const groups: Array<{ hasAlternation: boolean; hasQuantifier: boolean }> = [];\n let escaped = false;\n let inClass = false;\n let hasBackreference = false;\n let hasQuantifiedGroup = false;\n let hasQuantifierInGroup = false;\n let hasQuantifiedBackreference = false;\n\n for (let index = 0; index < pattern.length; index += 1) {\n const char = pattern[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n const numericBackreference = /^[1-9]$/.test(pattern[index + 1] ?? \"\");\n const namedBackreference =\n pattern[index + 1] === \"k\"\n ? pattern.slice(index + 2).match(/^<[^>]+>/)?.[0]\n : undefined;\n if (numericBackreference || namedBackreference) {\n hasBackreference = true;\n const backreferenceEnd = numericBackreference\n ? index + 2\n : index + 2 + namedBackreference!.length;\n if (isRegexQuantifierStart(pattern, backreferenceEnd)) {\n hasQuantifiedBackreference = true;\n }\n index = backreferenceEnd - 1;\n } else {\n escaped = true;\n }\n continue;\n }\n if (char === \"[\") {\n inClass = true;\n continue;\n }\n if (char === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n\n if (char === \"(\") {\n groups.push({ hasAlternation: false, hasQuantifier: false });\n continue;\n }\n if (char === \"|\") {\n const current = groups[groups.length - 1];\n if (current) current.hasAlternation = true;\n continue;\n }\n if (isRegexQuantifierStart(pattern, index)) {\n // A question mark immediately after an opening parenthesis introduces a\n // lookaround, named capture, or non-capturing group; it is not a repeat.\n if (char === \"?\" && pattern[index - 1] === \"(\") continue;\n const current = groups[groups.length - 1];\n if (current) {\n current.hasQuantifier = true;\n hasQuantifierInGroup = true;\n }\n if (char === \"{\") index = pattern.indexOf(\"}\", index + 1);\n continue;\n }\n if (char === \")\") {\n const group = groups.pop();\n if (!group) return false;\n const quantified = isRegexOuterQuantifierStart(pattern, index + 1);\n hasQuantifiedGroup = hasQuantifiedGroup || quantified;\n if (quantified && (group.hasQuantifier || group.hasAlternation))\n return false;\n const parent = groups[groups.length - 1];\n if (parent) {\n parent.hasQuantifier =\n parent.hasQuantifier || group.hasQuantifier || quantified;\n parent.hasAlternation = parent.hasAlternation || group.hasAlternation;\n }\n }\n }\n\n return (\n !escaped &&\n !inClass &&\n groups.length === 0 &&\n !(\n hasBackreference &&\n (hasQuantifiedGroup || hasQuantifierInGroup || hasQuantifiedBackreference)\n )\n );\n}\n\n// Both pre-refactor runtimes enforced this cap and cache (SDK safe-regex.ts,\n// web targeting-evaluation.ts); the shared core must not weaken them \u2014\n// patterns are tenant-authored and reach the server request path.\nconst MAX_PATTERN_LENGTH = 1024;\nconst MAX_CACHE_ENTRIES = 256;\nconst regexCache = new Map<string, RegExp | null>();\n\nfunction cacheRegex(pattern: string, compiled: RegExp | null): void {\n if (!regexCache.has(pattern) && regexCache.size >= MAX_CACHE_ENTRIES) {\n const oldest = regexCache.keys().next().value;\n if (oldest !== undefined) regexCache.delete(oldest);\n }\n regexCache.set(pattern, compiled);\n}\n\nexport type RegexTestResult = { matched: boolean; indeterminate?: true };\n\nfunction safeRegexTestDetailed(\n pattern: string,\n input: string,\n executeUnsafePatterns: boolean,\n): RegexTestResult {\n if (!pattern || pattern.length > MAX_PATTERN_LENGTH) return { matched: false };\n if (!executeUnsafePatterns && !isSafeRegexPattern(pattern)) {\n // Compile only to distinguish unsupported-but-valid patterns from invalid\n // ones. Guarded patterns are never executed on the server: tenant-authored\n // catastrophic regexes must not run on the request path (they surface as\n // indeterminate). The browser SDK executes them \u2014 the cost lands in the\n // visitor's own tab, matching the pre-refactor split.\n try {\n new RegExp(pattern);\n return { matched: false, indeterminate: true };\n } catch {\n return { matched: false };\n }\n }\n if (regexCache.has(pattern)) {\n const cached = regexCache.get(pattern);\n return { matched: cached ? cached.test(input) : false };\n }\n let compiled: RegExp | null = null;\n try {\n compiled = new RegExp(pattern);\n } catch {\n compiled = null;\n }\n cacheRegex(pattern, compiled);\n return { matched: compiled ? compiled.test(input) : false };\n}\n\nfunction safeRegexTest(pattern: string, input: string): boolean {\n return safeRegexTestDetailed(pattern, input, true).matched;\n}\n\nfunction evalSimpleUrlPart(actual: string, pattern: string, isPath: boolean): boolean {\n try {\n let escaped = pattern.replace(/[*.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/_____/g, \".*\");\n if (isPath) escaped = \"\\\\/?\" + escaped.replace(/(^\\/|\\/$)/g, \"\") + \"\\\\/?\";\n return new RegExp(\"^\" + escaped + \"$\", \"i\").test(actual);\n } catch { return false; }\n}\n\nfunction evalSimpleUrlTarget(actual: URL, pattern: string): boolean {\n try {\n const expected = new URL(pattern.replace(/^([^:/?]*)\\./i, \"https://$1.\").replace(/\\*/g, \"_____\"), \"https://_____\");\n const components: Array<[string, string, boolean]> = [\n [actual.host, expected.host, false], [actual.pathname, expected.pathname, true],\n ];\n if (expected.hash) components.push([actual.hash, expected.hash, false]);\n expected.searchParams.forEach((value, key) => components.push([actual.searchParams.get(key) || \"\", value, false]));\n return !components.some(([value, expectedValue, path]) => !evalSimpleUrlPart(value, expectedValue, path));\n } catch { return false; }\n}\n\nfunction unescapeRegexLiteral(value: string): string {\n return value.replace(/\\\\([.*+?^${}()|[\\]\\\\\\/])/g, \"$1\");\n}\n\nexport function evaluateUrlRuleDetailed(\n url: string,\n rule: CoreUrlRule,\n options?: { executeUnsafePatterns?: boolean },\n): RegexTestResult {\n const executeUnsafePatterns = options?.executeUnsafePatterns !== false;\n try {\n const parsed = new URL(url, \"https://_\");\n const matchType = rule.matchType ?? rule.match_type;\n if (matchType === \"contains\") {\n const actual = parsed.href.toLowerCase();\n const pattern = rule.pattern.toLowerCase();\n return { matched: actual.includes(pattern) || actual.includes(unescapeRegexLiteral(pattern)) };\n }\n if (rule.type === \"regex\") {\n const escaped = rule.pattern.replace(/([^\\\\])\\//g, \"$1\\\\/\");\n const absolute = safeRegexTestDetailed(escaped, parsed.href, executeUnsafePatterns);\n if (absolute.matched || absolute.indeterminate) return absolute;\n return safeRegexTestDetailed(escaped, parsed.href.substring(parsed.origin.length), executeUnsafePatterns);\n }\n return { matched: evalSimpleUrlTarget(parsed, rule.pattern) };\n } catch { return { matched: false }; }\n}\n\nexport function evaluateUrlRule(url: string, rule: CoreUrlRule): boolean {\n return evaluateUrlRuleDetailed(url, rule).matched;\n}\n\nexport function urlRuleExplicitlyNamesHost(rule: CoreUrlRule): boolean {\n const pattern = unescapeRegexLiteral(rule.pattern.trim()).replace(/^\\^/, \"\");\n return /^\\(?[a-z][a-z0-9+.-]*\\??:\\/\\//i.test(pattern) || /^\\/\\/[^/]/.test(pattern) || /^(?:\\*\\.)?[^/?#\\s*]+\\.[^/?#\\s]+(?::\\d+)?(?:[/?#]|$)/i.test(pattern);\n}\n\nexport function normalizeUrlRule(value: unknown): CoreUrlRule | null {\n if (typeof value === \"string\") {\n const pattern = value.trim();\n return pattern ? { type: \"simple\", pattern, include: true } : null;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const raw = value as Record<string, unknown>;\n const candidate = raw.pattern ?? raw.value ?? raw.url ?? raw.path;\n const pattern = typeof candidate === \"string\" ? candidate.trim() : \"\";\n if (!pattern) return null;\n const rawMatch = raw.matchType ?? raw.match_type;\n const matchType = [\"exact\", \"contains\", \"wildcard\", \"regex\"].includes(String(rawMatch))\n ? rawMatch as CoreUrlRule[\"matchType\"] : raw.type === \"url_contains\" ? \"contains\" : undefined;\n return {\n type: raw.type === \"regex\" || raw.type === \"url_regex\" ? \"regex\" : \"simple\",\n pattern,\n include: typeof raw.include === \"boolean\" ? raw.include : true,\n ...(matchType ? { matchType } : {}),\n };\n}\n\nexport function normalizeUrlRules(targeting: unknown): CoreUrlRule[] {\n if (!targeting || typeof targeting !== \"object\" || Array.isArray(targeting)) return [];\n const raw = targeting as Record<string, unknown>;\n const urls = Array.isArray(raw.url) ? raw.url : raw.url == null ? [] : [raw.url];\n return urls.concat(Array.isArray(raw.rules) ? raw.rules : []).map(normalizeUrlRule).filter((rule): rule is CoreUrlRule => Boolean(rule));\n}\n\nfunction stringValues(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((item) => String(item).trim()).filter(Boolean);\n if (value == null) return [];\n return [String(value)];\n}\nfunction meaningful(value: unknown): boolean {\n if (value == null) return false;\n if (Array.isArray(value)) return value.length > 0;\n return typeof value !== \"string\" || value.trim().length > 0;\n}\nfunction compareNumber(actual: unknown, expected: unknown, predicate: (a: number, b: number) => boolean): boolean {\n const a = Number(Array.isArray(actual) ? actual[0] : actual);\n const b = Number(Array.isArray(expected) ? expected[0] : expected);\n return Number.isFinite(a) && Number.isFinite(b) && predicate(a, b);\n}\nfunction wildcard(pattern: string): string { return \"^\" + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\"; }\n\nexport function matchSegmentConditionValues(condition: CoreSegmentCondition, actual: unknown, expected = condition.value): boolean {\n const actualValues = stringValues(actual);\n const expectedValues = stringValues(expected);\n const first = expectedValues[0] ?? \"\";\n switch (condition.operator) {\n case \"equals\": return actualValues.some((value) => value === String(expected ?? \"\"));\n case \"not_equals\": return !actualValues.some((value) => value === String(expected ?? \"\"));\n case \"contains\": return actualValues.some((value) => expectedValues.length > 1 ? expectedValues.includes(value) : value.includes(first));\n case \"not_contains\": return !actualValues.some((value) => expectedValues.length > 1 ? expectedValues.includes(value) : value.includes(first));\n case \"starts_with\": return actualValues.some((value) => value.startsWith(first));\n case \"ends_with\": return actualValues.some((value) => value.endsWith(first));\n case \"is_set\": return meaningful(actual);\n case \"is_empty\": return !meaningful(actual);\n case \"in\": return actualValues.some((value) => expectedValues.includes(value));\n case \"not_in\": return !actualValues.some((value) => expectedValues.includes(value));\n case \"matches_wildcard\": return actualValues.some((value) => safeRegexTest(wildcard(first), value));\n case \"matches_regex\": return actualValues.some((value) => safeRegexTest(first, value));\n case \"greater_than\": return compareNumber(actual, expected, (a, b) => a > b);\n case \"greater_than_or_equal\": return compareNumber(actual, expected, (a, b) => a >= b);\n case \"less_than\": return compareNumber(actual, expected, (a, b) => a < b);\n case \"less_than_or_equal\": return compareNumber(actual, expected, (a, b) => a <= b);\n default: return false;\n }\n}\n\nexport type TargetingConformanceCase =\n | { name: string; kind: \"url\"; rule: CoreUrlRule; context: { url: string }; verdict: boolean }\n | { name: string; kind: \"condition\"; rule: CoreSegmentCondition; context: { actual: unknown }; verdict: boolean }\n | { name: string; kind: \"segment-expansion\"; rule: { segmentIds: string[]; expandedIds: string[] }; context: Record<string, never>; verdict: boolean };\n\nexport function evaluateConformanceCase(entry: TargetingConformanceCase): boolean {\n if (entry.kind === \"url\") return evaluateUrlRule(entry.context.url, entry.rule);\n if (entry.kind === \"condition\") return matchSegmentConditionValues(entry.rule, entry.context.actual);\n return entry.rule.segmentIds.every((id) => entry.rule.expandedIds.includes(id));\n}\n", "type SignalValue = string | number | boolean | string[] | Record<string, unknown> | null;\n\ntype StoredSignal = {\n value: SignalValue;\n updatedAt: number;\n expiresAt?: number;\n};\n\nexport type ProductSignalInput = {\n id?: string | number | null;\n handle?: string | null;\n title?: string | null;\n type?: string | null;\n vendor?: string | null;\n tags?: string[] | null;\n price?: number | string | null;\n};\n\nconst STORE_KEY = \"drip_signals_v1\";\nconst VISITOR_SEEN_KEY = \"drip_visitor_seen_v1\";\nconst DEFAULT_TTL_DAYS = 30;\nconst MAX_ARRAY_LENGTH = 24;\nconst MAX_VALUE_BYTES = 4096;\nconst runtimeSignals: Record<string, SignalValue> = {};\nconst signalSources: Record<string, string> = {};\nlet signalPersistenceAllowed: () => boolean = () => true;\n\nfunction now(): number {\n return Date.now();\n}\n\nfunction ttlMs(days: number): number {\n return Math.max(1, days) * 86400 * 1000;\n}\n\nfunction canUseLocalStorage(): boolean {\n if (!canPersistSignals()) return false;\n try {\n if (typeof localStorage === \"undefined\") return false;\n const key = \"__drip_signal_test__\";\n localStorage.setItem(key, \"1\");\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction canPersistSignals(): boolean {\n try {\n return signalPersistenceAllowed() === true;\n } catch {\n return false;\n }\n}\n\nexport function configureSignalPersistenceAllowed(predicate?: () => boolean): void {\n signalPersistenceAllowed = predicate ?? (() => true);\n}\n\nfunction readStore(): Record<string, StoredSignal> {\n if (!canUseLocalStorage()) return {};\n try {\n const parsed = JSON.parse(localStorage.getItem(STORE_KEY) || \"{}\");\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction writeStore(store: Record<string, StoredSignal>): void {\n if (!canUseLocalStorage()) return;\n try {\n localStorage.setItem(STORE_KEY, JSON.stringify(store));\n } catch {}\n}\n\nfunction normalizeValue(value: unknown): SignalValue | undefined {\n if (value === null) return null;\n if (typeof value === \"string\") return value.slice(0, 1000);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value === \"boolean\") return value;\n if (Array.isArray(value)) {\n return value\n .map((item) => String(item).trim())\n .filter(Boolean)\n .slice(0, MAX_ARRAY_LENGTH);\n }\n if (value && typeof value === \"object\") {\n try {\n const json = JSON.stringify(value);\n if (json.length > MAX_VALUE_BYTES) return undefined;\n return JSON.parse(json);\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction compactStore(store: Record<string, StoredSignal>): Record<string, StoredSignal> {\n const ts = now();\n const next: Record<string, StoredSignal> = {};\n for (const [key, entry] of Object.entries(store)) {\n if (!entry || typeof entry !== \"object\") continue;\n if (entry.expiresAt && entry.expiresAt <= ts) continue;\n next[key] = entry;\n }\n return next;\n}\n\nexport function setSignal(key: string, value: unknown, ttlDays = DEFAULT_TTL_DAYS, source = \"manual\"): void {\n if (!canPersistSignals()) return;\n const normalized = normalizeValue(value);\n if (normalized === undefined) return;\n const store = compactStore(readStore());\n store[key] = {\n value: normalized,\n updatedAt: now(),\n expiresAt: now() + ttlMs(ttlDays),\n };\n writeStore(store);\n signalSources[key] = source;\n}\n\nexport function getSignals(options: { markVisitorSeen?: boolean } = {}): Record<string, SignalValue> {\n const store = compactStore(readStore());\n if (options.markVisitorSeen !== false) writeStore(store);\n const signals: Record<string, SignalValue> = {};\n for (const [key, entry] of Object.entries(store)) {\n signals[key] = entry.value;\n }\n Object.assign(signals, runtimeSignals);\n\n if (options.markVisitorSeen !== false && canPersistSignals()) {\n try {\n const seen = localStorage.getItem(VISITOR_SEEN_KEY) === \"1\";\n signals[\"visitor.returning\"] = seen;\n localStorage.setItem(VISITOR_SEEN_KEY, \"1\");\n } catch {}\n }\n\n return signals;\n}\n\nexport function clearStoredSignals(): void {\n try {\n localStorage.removeItem(STORE_KEY);\n localStorage.removeItem(VISITOR_SEEN_KEY);\n } catch {}\n}\n\nexport function setRuntimeSignal(key: string, value: unknown, source = \"runtime\"): void {\n const normalized = normalizeValue(value);\n if (normalized === undefined) return;\n runtimeSignals[key] = normalized;\n signalSources[key] = source;\n}\n\nexport function clearRuntimeSignal(key: string): void {\n delete runtimeSignals[key];\n delete signalSources[key];\n}\n\nexport function getSignalDiagnostics(options: { markVisitorSeen?: boolean } = {}): { values: Record<string, SignalValue>; sources: Record<string, string> } {\n const values = getSignals(options);\n return {\n values,\n sources: { ...signalSources },\n };\n}\n\nfunction prependUnique(values: string[], next: string): string[] {\n const clean = next.trim();\n if (!clean) return values;\n return [clean, ...values.filter((value) => value !== clean)].slice(0, MAX_ARRAY_LENGTH);\n}\n\nfunction readStringArray(key: string): string[] {\n const value = getSignals({ markVisitorSeen: false })[key];\n return Array.isArray(value) ? value.map((item) => String(item)) : [];\n}\n\nexport function rememberProduct(product: ProductSignalInput, ttlDays = DEFAULT_TTL_DAYS): void {\n const id = product.id == null ? \"\" : String(product.id);\n const handle = product.handle ? String(product.handle) : \"\";\n const productType = product.type ? String(product.type) : \"\";\n\n if (id) {\n setSignal(\"recently_viewed.product_ids\", prependUnique(readStringArray(\"recently_viewed.product_ids\"), id), ttlDays);\n }\n if (handle) {\n setSignal(\"recently_viewed.product_handles\", prependUnique(readStringArray(\"recently_viewed.product_handles\"), handle), ttlDays);\n }\n if (productType) {\n setSignal(\n \"recently_viewed.product_types\",\n prependUnique(readStringArray(\"recently_viewed.product_types\"), productType),\n ttlDays,\n );\n }\n if (product.tags?.length) {\n const existing = readStringArray(\"recently_viewed.product_tags\");\n const next = product.tags.reduce((acc, tag) => prependUnique(acc, String(tag)), existing);\n setSignal(\"recently_viewed.product_tags\", next, ttlDays);\n }\n setSignal(\"recently_viewed.last_product\", {\n id: id || undefined,\n handle: handle || undefined,\n title: product.title || undefined,\n type: productType || undefined,\n vendor: product.vendor || undefined,\n price: product.price ?? undefined,\n }, ttlDays);\n}\n\nexport function setCartSignals(args: { itemCount?: number; productIds?: string[] }, ttlDays = 14): void {\n if (typeof args.itemCount === \"number\") setSignal(\"cart.item_count\", args.itemCount, ttlDays);\n if (args.productIds) setSignal(\"cart.product_ids\", args.productIds, ttlDays);\n}\n\nexport function setSearchSignal(query: string, ttlDays = 7): void {\n const trimmed = query.trim();\n if (!trimmed) return;\n setSignal(\"search.last_query\", trimmed, ttlDays);\n}\n", "import {\n AttributeRule,\n ActivationGateDiagnostic,\n Experiment,\n PageTargetingRule,\n SegmentCondition,\n SegmentTargetingRule,\n Targeting,\n TargetingDiagnostics,\n UrlRule,\n} from \"./types\";\nimport { createApexRuntimeTools } from \"./runtime-tools\";\nimport { evaluateUrlRule, matchSegmentConditionValues as matchCoreSegmentConditionValues, normalizeUrlRules, urlRuleExplicitlyNamesHost } from \"@drip/event-schema/targeting-core\";\nimport { getSignals, rememberProduct } from \"./signals\";\nimport { evaluateTargetingGatesWithConditionDiagnostics } from \"./targeting-diagnostics\";\n\ndeclare const __DRIP_QA_BUILD__: boolean;\n\nconst FAIL_CLOSED_TARGETING_ATTRIBUTE =\n \"apex.internal.invalid_stored_targeting\";\n\nexport const evalUrlRule = evaluateUrlRule;\n\nexport function normalizeRuntimeUrlRules(targeting: Targeting | undefined): UrlRule[] {\n return normalizeUrlRules(targeting) as UrlRule[];\n}\n\nfunction normalizedHttpOrigins(value: string | string[] | undefined): Set<string> {\n const origins = new Set<string>();\n for (const candidate of Array.isArray(value) ? value : value ? [value] : []) {\n try { const parsed = new URL(candidate); if (/^https?:$/.test(parsed.protocol)) origins.add(parsed.origin); } catch {}\n }\n return origins;\n}\n\nexport function matchUrlRules(url: string, rules: UrlRule[], hostAgnosticIncludeOrigin?: string | string[]): boolean {\n if (!rules.length) return true;\n let hasInclude = false; let included = false;\n for (const rule of rules) {\n const match = evalUrlRuleForIncludeOrigin(url, rule, hostAgnosticIncludeOrigin);\n if (rule.include === false) { if (match) return false; }\n else { hasInclude = true; if (match) included = true; }\n }\n return included || !hasInclude;\n}\n\nexport function evalUrlRuleForIncludeOrigin(url: string, rule: UrlRule, origins?: string | string[]): boolean {\n const allowed = normalizedHttpOrigins(origins);\n let origin = \"\";\n try { origin = new URL(url, \"https://_\").origin; } catch {}\n return (rule.include === false || !allowed.size || urlRuleExplicitlyNamesHost(rule) || allowed.has(origin)) && evaluateUrlRule(url, rule);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction jsErrorReason(error: unknown): string {\n const message = errorMessage(error);\n return message ? `js_error: ${message}` : \"js_error\";\n}\n\ntype BooleanDiagnosticResult = {\n matched: boolean;\n reason?: string;\n error?: unknown;\n};\n\nexport function evaluatePageAdvancedConditionResult(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): BooleanDiagnosticResult {\n const code = rule.advancedCondition?.code?.trim();\n if (!code) return { matched: true };\n try {\n const url = new URL(\n ctx.url,\n typeof location !== \"undefined\" ? location.origin : \"https://_\",\n );\n const fn = new Function(\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const url=context.url;` +\n `const window=context.window;` +\n `return Boolean((function(){${/\\breturn\\b|;\\s*$|\\bthrow\\b/.test(code) ? code : `return (${code});`}}).call(window));`,\n );\n const matched = Boolean(fn({\n attributes: ctx.attributes,\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n url,\n window: typeof window !== \"undefined\" ? window : undefined,\n }));\n return { matched, reason: matched ? undefined : \"js_false\" };\n } catch (error) {\n return { matched: false, reason: jsErrorReason(error), error };\n }\n}\n\nfunction evaluatePageAdvancedCondition(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const result = evaluatePageAdvancedConditionResult(rule, ctx);\n if (!result.matched && result.reason?.startsWith(\"js_error\")) {\n try {\n console.warn(\"[drip] Page trigger failed closed\", {\n pageId: rule.id,\n pageName: rule.name,\n error: result.error,\n });\n } catch {}\n }\n return result.matched;\n}\n\nexport function pageManualTriggerMatches(\n rule: PageTargetingRule,\n ctx: { attributes: Record<string, unknown> },\n): boolean {\n // Shop defaults map to page overrides as follows: direct -> immediate,\n // url_change -> history/polling, dom_change -> dom, manual -> manual-*.\n // Non-manual modes choose when this rule is checked; they are not an\n // additional targeting condition.\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") return true;\n const signal = rule.trigger?.signal;\n if (!signal) return false;\n return ctx.attributes[signal] === true;\n}\n\nexport function matchPageTargetingRule(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (rule.disabled || rule.trigger?.disabled) return false;\n const includeRules = rule.includeRules ?? [];\n const excludeRules = (rule.excludeRules ?? []).map((item) => ({ ...item, include: false }));\n const urlMatched = matchUrlRules(ctx.url, [...includeRules, ...excludeRules]);\n return urlMatched && pageManualTriggerMatches(rule, ctx) && evaluatePageAdvancedCondition(rule, ctx);\n}\n\nexport function matchedPageRuleIds(\n rules: PageTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): Set<string> {\n const ids = new Set<string>();\n for (const rule of rules) {\n if (rule.id && matchPageTargetingRule(rule, ctx)) ids.add(rule.id);\n }\n return ids;\n}\n\nfunction matchPageRules(\n rules: PageTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (!rules.length) return true;\n let hasInclude = false;\n let included = false;\n\n for (const rule of rules) {\n const matched = matchPageTargetingRule(rule, ctx);\n if (rule.include === false) {\n if (matched) return false;\n } else {\n hasInclude = true;\n if (matched) included = true;\n }\n }\n\n return included || !hasInclude;\n}\n\nexport function matchAttributeRule(\n attrs: Record<string, unknown>,\n rule: AttributeRule,\n): boolean {\n if (rule.attribute === FAIL_CLOSED_TARGETING_ATTRIBUTE) return false;\n const value = attrs[rule.attribute];\n switch (rule.operator) {\n case \"exists\":\n return value !== undefined && value !== null;\n case \"equals\":\n return value === rule.value;\n case \"contains\":\n return typeof value === \"string\" && typeof rule.value === \"string\"\n ? value.includes(rule.value)\n : false;\n case \"in\":\n return Array.isArray(rule.value) ? rule.value.includes(String(value)) : false;\n case \"not_in\":\n return Array.isArray(rule.value) ? !rule.value.includes(String(value)) : false;\n default:\n return false;\n }\n}\n\nfunction wildcardToRegex(pattern: string): string {\n return `^${pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\")}$`;\n}\n\ntype RuntimeNavigator = Navigator & {\n userAgentData?: {\n mobile?: boolean;\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n fullVersionList?: Array<{ brand: string; version: string }>;\n getHighEntropyValues?: (hints: string[]) => Promise<unknown>;\n };\n};\n\ntype BrowserInfo = {\n name: string;\n version: string;\n};\n\ntype OsInfo = {\n name: string;\n version: string;\n};\n\nconst EMPTY_BROWSER_INFO: BrowserInfo = { name: \"\", version: \"\" };\nconst EMPTY_OS_INFO: OsInfo = { name: \"\", version: \"\" };\nlet highEntropyBrowserInfo: BrowserInfo | null = null;\nlet highEntropyBrowserInfoRequested = false;\n\nfunction runtimeNavigator(): RuntimeNavigator | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator as RuntimeNavigator;\n}\n\nfunction lower(value: unknown): string {\n return typeof value === \"string\" ? value.toLowerCase() : \"\";\n}\n\nfunction normalizeVersion(value: unknown): string {\n if (typeof value !== \"string\") return \"\";\n const match = value.match(/\\d+(?:[._]\\d+)*/);\n return match ? match[0].replace(/_/g, \".\") : \"\";\n}\n\nfunction firstVersionMatch(ua: string, patterns: RegExp[]): string {\n for (const pattern of patterns) {\n const match = ua.match(pattern);\n const version = normalizeVersion(match?.[1]);\n if (version) return version;\n }\n return \"\";\n}\n\nfunction getUserAgent(): string {\n return runtimeNavigator()?.userAgent ?? \"\";\n}\n\nfunction getPlatform(): string {\n const nav = runtimeNavigator();\n return nav?.userAgentData?.platform || nav?.platform || \"\";\n}\n\nfunction getDeviceTypeFromUserAgent(ua: string, platform: string): string {\n const normalizedUa = ua.toLowerCase();\n const normalizedPlatform = platform.toLowerCase();\n if (!normalizedUa && !normalizedPlatform) return \"\";\n\n const isIpad =\n /\\bipad\\b/.test(normalizedUa) ||\n (normalizedPlatform === \"macintel\" &&\n typeof navigator !== \"undefined\" &&\n Number((navigator as Navigator).maxTouchPoints || 0) > 1);\n if (isIpad || /\\btablet\\b|playbook|silk|kindle|nexus 7|nexus 9|sm-t|gt-p/i.test(ua)) {\n return \"tablet\";\n }\n if (/\\bmobi\\b|iphone|ipod|android.*mobile|windows phone|blackberry|bb10/i.test(ua)) {\n return \"mobile\";\n }\n if (/android/i.test(ua)) return \"tablet\";\n // Client-hints platform \"Android\" with mobile=false and no UA string is a\n // tablet, not a desktop.\n if (/android/i.test(normalizedPlatform)) return \"tablet\";\n if (/windows|macintosh|mac os x|linux|x11|cros/i.test(ua) || normalizedPlatform) {\n return \"desktop\";\n }\n return \"\";\n}\n\nfunction getDeviceType(): string {\n const nav = runtimeNavigator();\n if (nav?.userAgentData?.mobile === true) return \"mobile\";\n\n const fromUa = getDeviceTypeFromUserAgent(getUserAgent(), getPlatform());\n if (fromUa) return fromUa;\n\n if (typeof window === \"undefined\") return \"\";\n const width = window.innerWidth || 0;\n if (width > 0 && width < 768) return \"mobile\";\n if (width >= 768 && width < 1024) return \"tablet\";\n return \"desktop\";\n}\n\nconst DEVICE_TYPE_TOKENS = new Set([\"desktop\", \"mobile\", \"tablet\"]);\n\nfunction normalizeDeviceType(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim().toLowerCase();\n return DEVICE_TYPE_TOKENS.has(normalized) ? normalized : undefined;\n}\n\nfunction browserInfoFromBrands(brands: unknown): BrowserInfo {\n if (!Array.isArray(brands)) return EMPTY_BROWSER_INFO;\n\n for (const item of brands) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n const brand = lower(record.brand);\n const version = normalizeVersion(record.version);\n if (!brand || brand.includes(\"not\") || brand.includes(\"brand\")) continue;\n if (brand.includes(\"edge\")) return { name: \"edge\", version };\n if (brand.includes(\"chrome\") || brand.includes(\"chromium\")) return { name: \"chrome\", version };\n if (brand.includes(\"firefox\")) return { name: \"firefox\", version };\n if (brand.includes(\"safari\")) return { name: \"safari\", version };\n }\n\n return EMPTY_BROWSER_INFO;\n}\n\nfunction requestHighEntropyBrowserInfo(): void {\n const userAgentData = runtimeNavigator()?.userAgentData;\n if (!userAgentData?.getHighEntropyValues || highEntropyBrowserInfoRequested) return;\n highEntropyBrowserInfoRequested = true;\n try {\n userAgentData\n .getHighEntropyValues([\"brands\", \"fullVersionList\"])\n .then((values) => {\n if (!values || typeof values !== \"object\") return;\n const record = values as Record<string, unknown>;\n const info = browserInfoFromBrands(record.fullVersionList ?? record.brands);\n if (info.name) highEntropyBrowserInfo = info;\n })\n .catch(() => {});\n } catch {}\n}\n\nfunction getBrowserInfoFromClientHints(): BrowserInfo {\n const userAgentData = runtimeNavigator()?.userAgentData;\n const fullVersionInfo = browserInfoFromBrands(userAgentData?.fullVersionList);\n if (fullVersionInfo.name) return fullVersionInfo;\n if (highEntropyBrowserInfo?.name) return highEntropyBrowserInfo;\n requestHighEntropyBrowserInfo();\n return browserInfoFromBrands(userAgentData?.brands);\n}\n\nfunction browserWithVersionPriority(name: string, uaVersion: string, hinted: BrowserInfo): BrowserInfo {\n return {\n name,\n version: hinted.name === name && hinted.version ? hinted.version : uaVersion || hinted.version,\n };\n}\n\nfunction getBrowserInfo(): BrowserInfo {\n const hinted = getBrowserInfoFromClientHints();\n const ua = getUserAgent();\n if (!ua) return hinted;\n\n if (/Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"edge\", firstVersionMatch(ua, [/Edg\\/([\\d.]+)/]), hinted);\n }\n if (/Firefox\\//.test(ua)) {\n return browserWithVersionPriority(\"firefox\", firstVersionMatch(ua, [/Firefox\\/([\\d.]+)/]), hinted);\n }\n if (/CriOS\\//.test(ua)) {\n return browserWithVersionPriority(\"chrome\", firstVersionMatch(ua, [/CriOS\\/([\\d.]+)/]), hinted);\n }\n if (/Chrome\\//.test(ua) && !/Chromium|OPR\\/|Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"chrome\", firstVersionMatch(ua, [/Chrome\\/([\\d.]+)/]), hinted);\n }\n if (/Version\\/[\\d.]+.*Safari\\//.test(ua) && !/Chrome|CriOS|FxiOS|Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"safari\", firstVersionMatch(ua, [/Version\\/([\\d.]+)/]), hinted);\n }\n\n return hinted;\n}\n\nfunction getOsInfo(): OsInfo {\n const ua = getUserAgent();\n const platform = getPlatform();\n const normalized = `${ua} ${platform}`.toLowerCase();\n if (!normalized.trim()) return EMPTY_OS_INFO;\n\n if (/iphone|ipad|ipod/.test(normalized) || (platform === \"MacIntel\" && typeof navigator !== \"undefined\" && Number(navigator.maxTouchPoints || 0) > 1)) {\n return { name: \"ios\", version: firstVersionMatch(ua, [/OS ([\\d_]+)/]) };\n }\n if (/android/.test(normalized)) {\n return { name: \"android\", version: firstVersionMatch(ua, [/Android ([\\d.]+)/]) };\n }\n if (/windows/.test(normalized)) {\n return { name: \"windows\", version: firstVersionMatch(ua, [/Windows NT ([\\d.]+)/]) };\n }\n if (/mac os x|macintosh|macintel/.test(normalized)) {\n return { name: \"macos\", version: firstVersionMatch(ua, [/Mac OS X ([\\d_]+)/]) };\n }\n if (/linux|x11/.test(normalized)) {\n return { name: \"linux\", version: \"\" };\n }\n\n return EMPTY_OS_INFO;\n}\n\nfunction getLanguage(): string {\n const navLanguage = runtimeNavigator()?.language;\n if (typeof navLanguage === \"string\" && navLanguage.trim()) return navLanguage;\n if (typeof document !== \"undefined\") return document.documentElement.lang || \"\";\n return \"\";\n}\n\nfunction decodeCookieComponent(value: string): string {\n try {\n return decodeURIComponent(value.replace(/\\+/g, \" \"));\n } catch {\n return value;\n }\n}\n\nfunction getCookieValue(name: string): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n const needle = name.trim();\n if (!needle) return undefined;\n const pairs = document.cookie ? document.cookie.split(\";\") : [];\n for (const pair of pairs) {\n const index = pair.indexOf(\"=\");\n const rawName = (index >= 0 ? pair.slice(0, index) : pair).trim();\n if (decodeCookieComponent(rawName) !== needle) continue;\n return decodeCookieComponent(index >= 0 ? pair.slice(index + 1) : \"\");\n }\n return undefined;\n}\n\nfunction parseNamedValue(value: unknown): { name: string; expected: string } {\n const raw = String(value ?? \"\").trim();\n const index = raw.indexOf(\"=\");\n if (index < 0) return { name: raw, expected: \"\" };\n return {\n name: raw.slice(0, index).trim(),\n expected: raw.slice(index + 1),\n };\n}\n\nfunction getPersistedUtmValue(key: string): string {\n try {\n const params = new URLSearchParams(location.search);\n const direct = params.get(key);\n if (direct) return direct;\n } catch {}\n try {\n const stored = sessionStorage.getItem(\"drip_utm\");\n if (!stored) return \"\";\n const parsed = JSON.parse(stored) as Record<string, unknown>;\n return typeof parsed[key] === \"string\" ? parsed[key] : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeReferrer(): string {\n if (typeof document === \"undefined\") return \"\";\n const referrer = document.referrer;\n if (!referrer) return \"(direct)\";\n try {\n const host = new URL(referrer).hostname;\n return host === location.hostname ? \"(internal)\" : host;\n } catch {\n return \"(direct)\";\n }\n}\n\nfunction normalizeTrafficSource(utmSource: unknown, referrer: unknown): string {\n const source = typeof utmSource === \"string\" ? utmSource.toLowerCase() : \"\";\n const ref = typeof referrer === \"string\" ? referrer.toLowerCase() : \"\";\n if (source.includes(\"facebook\") || source.includes(\"instagram\") || source.includes(\"meta\") || source.includes(\"tiktok\")) {\n return \"paid-social\";\n }\n if (source.includes(\"google\") || source.includes(\"bing\") || ref.includes(\"google\") || ref.includes(\"bing\")) {\n return \"search\";\n }\n if (source.includes(\"email\") || source.includes(\"newsletter\")) return \"email\";\n if (source) return source;\n if (ref && ref !== \"(direct)\" && ref !== \"(internal)\") return \"referral\";\n return \"direct\";\n}\n\nexport function readShopifySignal(signal: string): unknown {\n if (typeof window === \"undefined\") return undefined;\n const root = (window as any).ShopifyAnalytics?.meta ?? (window as any).Shopify?.analytics?.meta;\n if (!root || typeof root !== \"object\") return undefined;\n\n if (signal === \"shopify.page_type\") {\n return root.page?.pageType ?? root.page?.page_type ?? root.pageType;\n }\n if (signal === \"shopify.product_type\") {\n return root.product?.type ?? root.product?.product_type;\n }\n if (signal === \"shopify.product_tag\") {\n return root.product?.tags;\n }\n if (signal === \"shopify.customer_tag\") {\n return root.customer?.tags;\n }\n return undefined;\n}\n\nexport function buildTargetingAttributes(\n baseAttributes: Record<string, unknown> = {},\n currentUrl?: string,\n options: { persistSignals?: boolean } = {},\n): Record<string, unknown> {\n const attrs: Record<string, unknown> = { ...baseAttributes };\n const href = currentUrl || (typeof location !== \"undefined\" ? location.href : \"\");\n const persistSignals = options.persistSignals !== false;\n\n try {\n const parsed = new URL(href, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n attrs[\"url.full\"] ??= parsed.href;\n attrs[\"url.path\"] ??= parsed.pathname;\n attrs[\"url.query\"] ??= parsed.search;\n } catch {}\n\n attrs[\"utm.source\"] ??= baseAttributes.utm_source ?? getPersistedUtmValue(\"utm_source\");\n attrs[\"utm.medium\"] ??= baseAttributes.utm_medium ?? getPersistedUtmValue(\"utm_medium\");\n attrs[\"utm.campaign\"] ??= baseAttributes.utm_campaign ?? getPersistedUtmValue(\"utm_campaign\");\n attrs.referrer ??= normalizeReferrer();\n const deviceTypeOverride = attrs[\"device.type\"] ?? baseAttributes.device;\n attrs[\"device.type\"] = normalizeDeviceType(deviceTypeOverride) ?? normalizeDeviceType(getDeviceType()) ?? \"\";\n const browser = getBrowserInfo();\n attrs[\"device.browser\"] ??= browser.name;\n attrs[\"device.browser.version\"] ??= browser.version;\n const os = getOsInfo();\n attrs[\"device.os\"] ??= os.name;\n attrs[\"device.os.version\"] ??= os.version;\n attrs[\"navigator.language\"] ??= getLanguage();\n attrs[\"traffic.source\"] ??= normalizeTrafficSource(attrs[\"utm.source\"], attrs.referrer);\n\n for (const signal of [\n \"shopify.page_type\",\n \"shopify.product_type\",\n \"shopify.product_tag\",\n \"shopify.customer_tag\",\n ]) {\n attrs[signal] ??= readShopifySignal(signal);\n }\n\n if (persistSignals) {\n const productMeta = readShopifyProductMeta();\n if (productMeta) rememberProduct(productMeta);\n }\n\n for (const [signal, value] of Object.entries(getSignals({ markVisitorSeen: persistSignals }))) {\n attrs[signal] ??= value;\n }\n\n return attrs;\n}\n\nfunction resolveUrlQueryValue(url: string, conditionValue: unknown): string | undefined {\n const { name } = parseNamedValue(conditionValue);\n if (!name) return undefined;\n try {\n const parsed = new URL(url, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n return parsed.searchParams.get(name) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function resolveNamedConditionActual(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): unknown {\n if (condition.signal === \"cookie.value\") {\n const { name } = parseNamedValue(condition.value);\n return getCookieValue(name);\n }\n if (condition.signal === \"url.query\") {\n if (isLegacyRawQueryCondition(condition)) {\n return rawQueryString(ctx.url);\n }\n return resolveUrlQueryValue(ctx.url, condition.value);\n }\n return condition.js\n ? evaluateJsTrigger(condition, ctx)\n : resolveSignalValue(ctx.attributes, ctx.url, condition.signal);\n}\n\nexport function resolveNamedConditionExpected(condition: SegmentCondition): SegmentCondition[\"value\"] {\n if (condition.signal !== \"cookie.value\" && condition.signal !== \"url.query\") return condition.value;\n if (condition.operator === \"is_set\" || condition.operator === \"is_empty\") return condition.value;\n if (condition.signal === \"url.query\" && isLegacyRawQueryCondition(condition)) {\n return condition.value;\n }\n return parseNamedValue(condition.value).expected;\n}\n\n// Pre-fix url.query rules matched against the raw query string. Substring\n// operators without a name=value form keep that raw semantics so existing\n// audiences like `url.query contains \"spring\"` continue to match; presence\n// and equality operators use the named-parameter semantics from APX-59.\nconst LEGACY_RAW_QUERY_OPERATORS = new Set([\"contains\", \"not_contains\", \"starts_with\", \"ends_with\"]);\n\nfunction isLegacyRawQueryCondition(condition: SegmentCondition): boolean {\n if (!LEGACY_RAW_QUERY_OPERATORS.has(String(condition.operator))) return false;\n return !String(condition.value ?? \"\").includes(\"=\");\n}\n\nfunction rawQueryString(url: string): string {\n try {\n const parsed = new URL(url, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n return parsed.search || \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction readShopifyProductMeta(): Parameters<typeof rememberProduct>[0] | null {\n if (typeof window === \"undefined\") return null;\n const root = (window as any).ShopifyAnalytics?.meta ?? (window as any).Shopify?.analytics?.meta;\n const product = root?.product;\n if (!product || typeof product !== \"object\") return null;\n const id = product.id ?? product.gid ?? product.product_id;\n if (!id && !product.handle) return null;\n return {\n id,\n handle: product.handle,\n title: product.title,\n type: product.type ?? product.product_type,\n vendor: product.vendor,\n tags: Array.isArray(product.tags) ? product.tags : undefined,\n price: product.price,\n };\n}\n\nfunction resolveSignalValue(\n attrs: Record<string, unknown>,\n url: string,\n signal: string,\n): unknown {\n if (attrs[signal] !== undefined) return attrs[signal];\n\n try {\n const parsed = new URL(url, \"https://_\");\n if (signal === \"url.full\") return parsed.href;\n if (signal === \"url.path\") return parsed.pathname;\n if (signal === \"url.query\") return parsed.search;\n } catch {}\n\n return undefined;\n}\n\nfunction buildJsTriggerSource(code: string): string {\n const trimmed = code.trim();\n if (!trimmed) return \"return false;\";\n if (/\\breturn\\b/.test(trimmed)) return trimmed;\n return `return (${trimmed});`;\n}\n\nfunction isActivateJsTrigger(condition: SegmentCondition): boolean {\n const code = condition.js?.code ?? \"\";\n return condition.js?.mode === \"activate\" ||\n /\\bactivate\\s*\\(/.test(code) ||\n /\\bcallbackFn\\b/.test(code);\n}\n\nfunction evaluateJsTrigger(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): unknown {\n return evaluateJsTriggerResult(condition, ctx).actual;\n}\n\nexport function evaluateJsTriggerResult(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { actual: unknown; reason?: string } {\n const code = condition.js?.code?.trim();\n if (!code || code.length > 4000) return { actual: undefined };\n if (isActivateJsTrigger(condition)) {\n return { actual: resolveSignalValue(ctx.attributes, ctx.url, condition.signal) };\n }\n\n try {\n const url = new URL(\n ctx.url,\n typeof location !== \"undefined\" ? location.origin : \"https://_\",\n );\n const apexTools = createApexRuntimeTools();\n const context = {\n apexTools,\n attributes: ctx.attributes,\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n signal: condition.signal,\n url,\n value: condition.value,\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n const fn = new Function(\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const apexTools=context.apexTools;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const value=context.value;` +\n `const window=context.window;` +\n `return Boolean((function(){${buildJsTriggerSource(code)}}).call(window));`,\n );\n const actual = Boolean(fn(context));\n return { actual, reason: actual ? undefined : \"js_false\" };\n } catch (error) {\n return { actual: false, reason: jsErrorReason(error) };\n }\n}\n\nfunction matchSegmentCondition(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const actual = resolveNamedConditionActual(condition, ctx);\n const expected = resolveNamedConditionExpected(condition);\n return matchSegmentConditionValues(condition, actual, expected);\n}\n\nexport function matchSegmentConditionValues(\n condition: SegmentCondition, actual: unknown, expected: SegmentCondition[\"value\"],\n): boolean {\n return matchCoreSegmentConditionValues(condition, actual, expected);\n}\n\nfunction matchSegmentRule(\n rule: SegmentTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const groups = Array.isArray(rule.rules?.groups)\n ? rule.rules.groups.filter((group) => Array.isArray(group) && group.length > 0)\n : [];\n if (groups.length) {\n return groups.every((group) =>\n group.some((condition) => matchSegmentCondition(condition, ctx)),\n );\n }\n\n const conditions = rule.rules?.conditions ?? [];\n if (!conditions.length) return true;\n if (rule.rules.operator === \"or\") {\n return conditions.some((condition) => matchSegmentCondition(condition, ctx));\n }\n return conditions.every((condition) => matchSegmentCondition(condition, ctx));\n}\n\nfunction matchSegmentRules(\n rules: SegmentTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (!rules.length) return true;\n let hasInclude = false;\n let included = false;\n\n for (const rule of rules) {\n const matched = matchSegmentRule(rule, ctx);\n if (rule.include === false) {\n if (matched) return false;\n } else {\n hasInclude = true;\n if (matched) included = true;\n }\n }\n\n return included || !hasInclude;\n}\n\nexport function matchesTargeting(\n targeting: Targeting | undefined,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n hostAgnosticIncludeOrigin?: string | string[];\n },\n): boolean {\n return evaluateTargetingGates(targeting, ctx).matched;\n}\n\nexport function targetingHasJsTriggers(experiments: Experiment[]): boolean {\n return experiments.some((experiment) =>\n [\n ...(experiment.targeting?.pageRules ?? []),\n ...(experiment.goalPageRules ?? []),\n ].some((rule) =>\n Boolean(rule.trigger?.triggerJs?.trim()) ||\n Boolean(rule.advancedCondition?.code?.trim()),\n ) ||\n (experiment.targeting?.segmentRules ?? []).some((rule) =>\n (rule.rules?.conditions ?? []).some((condition) =>\n Boolean(condition.js?.code?.trim()),\n ),\n ),\n );\n}\n\nexport function evaluateTargetingGatesDetailed(\n targeting: Targeting | undefined,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n hostAgnosticIncludeOrigin?: string | string[];\n },\n): TargetingDiagnostics {\n if (!__DRIP_QA_BUILD__) {\n const aggregate = evaluateTargetingGates(targeting, ctx);\n return { ...aggregate, conditions: [] };\n }\n return evaluateTargetingGatesWithConditionDiagnostics(targeting, ctx);\n}\n\nexport function evaluateTargetingGates(\n targeting: Targeting | undefined,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n hostAgnosticIncludeOrigin?: string | string[];\n },\n): { matched: boolean; gates: ActivationGateDiagnostic[] } {\n const gates: ActivationGateDiagnostic[] = [];\n if (!targeting) {\n return {\n matched: true,\n gates: [\n { id: \"page\", label: \"Page check\", status: \"skipped\", reason: \"no_page_rules\" },\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n ],\n };\n }\n\n const urlRules = normalizeRuntimeUrlRules(targeting);\n const pageRules = targeting.pageRules ?? [];\n const pageHasRules = urlRules.length > 0 || pageRules.length > 0;\n const pageMatched = pageHasRules\n ? matchUrlRules(\n ctx.url,\n urlRules,\n ctx.hostAgnosticIncludeOrigin,\n ) && matchPageRules(pageRules, ctx)\n : true;\n gates.push({\n id: \"page\",\n label: \"Page check\",\n status: pageHasRules ? (pageMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: pageHasRules ? (pageMatched ? \"url_matched\" : \"url_mismatch\") : \"no_page_rules\",\n detail: pageHasRules ? { url: ctx.url, rules: urlRules.length, pageRules: pageRules.length } : undefined,\n });\n\n if (!pageMatched) {\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: \"skipped\",\n reason: \"page_mismatch\",\n detail: { skipped: true },\n });\n return { matched: false, gates };\n }\n\n let attributesMatched = true;\n const attributeRules = targeting.attributes ?? [];\n for (const rule of attributeRules) {\n if (!matchAttributeRule(ctx.attributes, rule)) {\n attributesMatched = false;\n break;\n }\n }\n\n const segmentRules = targeting.segmentRules ?? [];\n const segmentRefs = targeting.segments ?? [];\n const segmentsExpanded = segmentRefs.every((ref) =>\n segmentRules.some((rule) => rule.id === ref.id)\n );\n const segmentRulesMatched = segmentsExpanded && matchSegmentRules(segmentRules, ctx);\n const audienceHasRules = attributeRules.length > 0 || segmentRules.length > 0 || segmentRefs.length > 0;\n const audienceMatched = attributesMatched && segmentRulesMatched;\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: audienceHasRules ? (audienceMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: audienceHasRules\n ? (audienceMatched ? \"audience_matched\" : !segmentsExpanded ? \"segments_unexpanded\" : !attributesMatched ? \"attribute_mismatch\" : \"segment_mismatch\")\n : \"no_audience_rules\",\n detail: audienceHasRules ? { attributeRules: attributeRules.length, segmentRules: segmentRules.length } : undefined,\n });\n\n return {\n matched: pageMatched && audienceMatched,\n gates,\n };\n}\n", "export const WEEKDAYS = [\n \"monday\",\n \"tuesday\",\n \"wednesday\",\n \"thursday\",\n \"friday\",\n \"saturday\",\n \"sunday\",\n] as const;\n\nexport type Weekday = (typeof WEEKDAYS)[number];\n\nexport type WeekdaySchedule = {\n excludedDays: Weekday[];\n timezone: string;\n};\n\n// Keyed by `${logPrefix}:${timezone}` so each consumer surface warns once\n// for itself, matching the per-copy sets this module replaced.\nconst warnedInvalidTimezones = new Set<string>();\n\nfunction normalizeWeekdaySchedule(value: unknown): WeekdaySchedule | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n if (\n Object.keys(record).some(\n (key) => key !== \"excludedDays\" && key !== \"timezone\",\n )\n ) {\n return null;\n }\n if (!Array.isArray(record.excludedDays)) return null;\n if (\n !record.excludedDays.every(\n (day) =>\n typeof day === \"string\" &&\n (WEEKDAYS as readonly string[]).includes(day),\n )\n ) {\n return null;\n }\n const excludedDays = Array.from(new Set(record.excludedDays)) as Weekday[];\n if (excludedDays.length < 1 || excludedDays.length > 6) return null;\n if (typeof record.timezone !== \"string\") return null;\n const timezone = record.timezone.trim();\n if (!timezone) return null;\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone }).format();\n } catch {\n return null;\n }\n return { excludedDays, timezone };\n}\n\nfunction warningTimezone(value: unknown): string {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? String((value as { timezone?: unknown }).timezone ?? \"unknown\")\n : \"unknown\";\n}\n\nexport function isWeekdayExcluded(\n schedule: WeekdaySchedule | null | undefined,\n now: Date,\n): boolean {\n if (!schedule) return false;\n try {\n const weekday = new Intl.DateTimeFormat(\"en-US\", {\n weekday: \"long\",\n timeZone: schedule.timezone,\n })\n .format(now)\n .toLowerCase() as Weekday;\n return Array.isArray(schedule.excludedDays) &&\n schedule.excludedDays.includes(weekday);\n } catch {\n return false;\n }\n}\n\nexport function weekdayScheduleBlocksDelivery(\n schedule: unknown,\n now: Date,\n logPrefix: string,\n): boolean {\n if (schedule == null) return false;\n const normalized = normalizeWeekdaySchedule(schedule);\n if (!normalized) {\n const timezone = warningTimezone(schedule);\n const warnKey = `${logPrefix}:${timezone}`;\n if (!warnedInvalidTimezones.has(warnKey)) {\n warnedInvalidTimezones.add(warnKey);\n console.warn(\n `${logPrefix} Invalid weekday schedule (timezone \"${timezone}\" or malformed shape); delivery will fail open.`,\n );\n }\n return false;\n }\n return isWeekdayExcluded(normalized, now);\n}\n\nexport function resetWeekdayScheduleWarningsForTests(): void {\n warnedInvalidTimezones.clear();\n}\n", "import {\n weekdayScheduleBlocksDelivery as sharedWeekdayScheduleBlocksDelivery,\n} from \"@drip/shared-runtime/weekday-schedule\";\n\nexport {\n isWeekdayExcluded,\n resetWeekdayScheduleWarningsForTests,\n WEEKDAYS,\n} from \"@drip/shared-runtime/weekday-schedule\";\nexport type {\n Weekday,\n WeekdaySchedule,\n} from \"@drip/shared-runtime/weekday-schedule\";\n\nexport function weekdayScheduleBlocksDelivery(\n schedule: unknown,\n now: Date,\n): boolean {\n return sharedWeekdayScheduleBlocksDelivery(schedule, now, \"[drip]\");\n}\n", "/**\n * Feature flags \u2014 thin wrapper over experiment assignments.\n *\n * A feature flag is simply a two-variation experiment where:\n * - control = flag OFF\n * - variant = flag ON\n *\n * Usage:\n * import { evaluateFlag, defineFlagExperiment } from \"@drip-apex/sdk/flags\";\n *\n * const darkMode = defineFlagExperiment({\n * slug: \"dark-mode-rollout\",\n * name: \"Dark Mode Rollout\",\n * rolloutPercent: 25,\n * });\n *\n * const isEnabled = evaluateFlag(\"dark-mode-rollout\", [darkMode], { userId: \"user-123\" });\n */\n\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { defineExperiment } from \"./define\";\nimport type { Experiment, Assignment } from \"./types\";\nimport { getUserId, hashToFloat, variationHashToFloat } from \"./hash\";\nimport { buildTargetingAttributes, matchesTargeting } from \"./targeting\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\n\n// ---------------------------------------------------------------------------\n// evaluateFlag \u2014 check if a flag is ON for a given user\n// ---------------------------------------------------------------------------\n\nexport interface FlagContext {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n /** QA variation overrides use the same weekday bypass as assignment delivery. */\n forceMap?: Record<string, string>;\n}\n\n/**\n * Evaluate whether a feature flag is enabled.\n *\n * @param flagId - The experiment slug/id of the flag experiment.\n * @param experiments - Array of experiment configs to search (from init or defineExperiment).\n * @param context - Optional user context for targeting/bucketing.\n * @returns `true` if the user is bucketed into a non-control variation.\n */\nexport function evaluateFlag(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n): boolean {\n const assignment = evaluateFlagAssignment(flagId, experiments, context);\n return assignment !== null && !assignment.isControl;\n}\n\n/**\n * Evaluate a flag and return the full assignment (or null if flag is off / not found).\n */\nexport function evaluateFlagAssignment(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n): Assignment | null {\n const experiment = experiments.find((e) => e.id === flagId);\n if (!experiment) return null;\n\n const forcedVariationId = context?.forceMap?.[experiment.id];\n const forcedIndex = forcedVariationId\n ? experiment.variations.findIndex(\n (variation) => variation.id === forcedVariationId,\n )\n : -1;\n const forcedVariation =\n forcedIndex >= 0 ? experiment.variations[forcedIndex] : null;\n if (\n !forcedVariation &&\n weekdayScheduleBlocksDelivery(experiment.weekdaySchedule, new Date())\n ) {\n return null;\n }\n\n const url = context?.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url);\n\n if (!matchesTargeting(experiment.targeting, { url, attributes })) {\n return null;\n }\n\n const userId = getUserId(context?.userId);\n const hashValue = hashToFloat(experiment.id, userId);\n\n if (\n !forcedVariation &&\n !inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1)\n ) {\n return null;\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, userId);\n const weights = experiment.variations.map((v) => v.weight);\n const index = forcedVariation\n ? forcedIndex\n : chooseVariation(variationHashValue, weights);\n if (index < 0 || index >= experiment.variations.length) return null;\n\n const variation = forcedVariation ?? experiment.variations[index];\n\n return {\n experimentId: experiment.id,\n experimentName: undefined,\n variationId: variation.id,\n pageActive: true,\n index,\n mutations: variation.mutations ?? [],\n value: variation.value,\n featureFlag: experiment.featureFlag,\n kind: experiment.kind ?? (experiment.featureFlag ? \"feature_flag\" : \"experiment\"),\n css: variation.css,\n js: variation.js,\n resetJs: variation.resetJs,\n externalCssUrl: variation.externalCssUrl,\n externalJsUrl: variation.externalJsUrl,\n harnessSession: variation.harnessSession,\n isControl: Boolean(variation.isControl),\n hashValue: userId,\n };\n}\n\n/**\n * Evaluate a typed feature flag value.\n *\n * Returns the assigned variation value for boolean, string, number, or JSON\n * flags. If the visitor is not eligible, the flag is missing, or no assignment\n * can be made, the fallback is returned.\n */\nexport function evaluateFlagValue<T = unknown>(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n fallback?: T,\n): T | unknown {\n const assignment = evaluateFlagAssignment(flagId, experiments, context);\n if (!assignment) return fallback;\n return assignment.value === undefined ? fallback : assignment.value;\n}\n\n// ---------------------------------------------------------------------------\n// defineFlagExperiment \u2014 convenience for creating flag-style experiments\n// ---------------------------------------------------------------------------\n\nexport interface FlagDefinition {\n /** Unique slug for the flag. */\n slug: string;\n /** Human-readable name. */\n name: string;\n /** Percentage of traffic to enable the flag for (0\u2013100). Default: 0 (off). */\n rolloutPercent?: number;\n /** Targeting rules. */\n targeting?: Experiment[\"targeting\"];\n /** Value returned when the flag is disabled. Default: false. */\n offValue?: unknown;\n /** Value returned when the flag is enabled. Default: true. */\n onValue?: unknown;\n}\n\n/**\n * Create a flag-style experiment with two variations: control (OFF) and enabled (ON).\n */\nexport function defineFlagExperiment(def: FlagDefinition): Experiment & { slug: string } {\n const rollout = Math.max(0, Math.min(100, def.rolloutPercent ?? 0)) / 100;\n\n const flag = defineExperiment({\n slug: def.slug,\n name: def.name,\n trafficAllocation: 1,\n targeting: def.targeting,\n variations: [\n {\n id: \"control\",\n weight: 1 - rollout,\n mutations: [],\n isControl: true,\n value: def.offValue ?? false,\n },\n {\n id: \"enabled\",\n weight: rollout,\n mutations: [],\n value: def.onValue ?? true,\n },\n ],\n });\n\n return {\n ...flag,\n variations: flag.variations.map((variation) => ({ ...variation })),\n featureFlag: { key: def.slug },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["k1", "pattern", "matchSegmentConditionValues", "now", "weekdayScheduleBlocksDelivery", "now", "variation", "weekdayScheduleBlocksDelivery"]
|
|
7
|
+
}
|
package/dist/index.mjs
CHANGED
|
@@ -11,6 +11,18 @@ function fetchWithoutShopifyCartMutationNotification(...args) {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
// src/shopify-cart.ts
|
|
14
|
+
var APEX_CART_ATTRIBUTE_KEY_VALUES = [
|
|
15
|
+
"apex_assignments",
|
|
16
|
+
"apex_assignment_authorization",
|
|
17
|
+
"apex_experiment_id",
|
|
18
|
+
"apex_variation_id",
|
|
19
|
+
"apex_assignment_epoch",
|
|
20
|
+
"apex_visitor_id",
|
|
21
|
+
"apex_session_id"
|
|
22
|
+
];
|
|
23
|
+
var APEX_CART_ATTRIBUTE_KEYS = new Set(
|
|
24
|
+
APEX_CART_ATTRIBUTE_KEY_VALUES
|
|
25
|
+
);
|
|
14
26
|
function isShopifyStorefront() {
|
|
15
27
|
return typeof window !== "undefined" && !!window.Shopify;
|
|
16
28
|
}
|