@drip-apex/sdk 0.1.0 → 0.3.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.
Files changed (246) hide show
  1. package/README.md +5 -0
  2. package/dist/bundle-report.json +584 -226
  3. package/dist/define.cjs +123 -0
  4. package/dist/define.cjs.map +7 -0
  5. package/dist/define.mjs +102 -0
  6. package/dist/define.mjs.map +7 -0
  7. package/dist/drip.cjs +19283 -0
  8. package/dist/drip.cjs.map +7 -0
  9. package/dist/drip.debug.js +1 -1
  10. package/dist/drip.debug.js.map +1 -1
  11. package/dist/drip.heatmap.js +1 -1
  12. package/dist/drip.heatmap.js.map +1 -1
  13. package/dist/drip.js +1 -1
  14. package/dist/drip.js.map +1 -1
  15. package/dist/drip.live.js +1 -1
  16. package/dist/drip.live.js.map +1 -1
  17. package/dist/drip.mjs +19267 -0
  18. package/dist/drip.mjs.map +7 -0
  19. package/dist/drip.replay-recorder.js +2 -0
  20. package/dist/drip.replay-recorder.js.map +1 -0
  21. package/dist/editor.js +147 -142
  22. package/dist/editor.js.map +4 -4
  23. package/dist/flags.cjs +1788 -0
  24. package/dist/flags.cjs.map +7 -0
  25. package/dist/flags.mjs +1765 -0
  26. package/dist/flags.mjs.map +7 -0
  27. package/dist/index.mjs +12 -0
  28. package/dist/index.mjs.map +2 -2
  29. package/dist/metafiles/define.cjs.meta.json +28 -0
  30. package/dist/metafiles/define.mjs.meta.json +32 -0
  31. package/dist/metafiles/drip.cjs.meta.json +3193 -0
  32. package/dist/metafiles/drip.debug.meta.json +2859 -574
  33. package/dist/metafiles/drip.heatmap.meta.json +2732 -460
  34. package/dist/metafiles/drip.live.meta.json +2732 -460
  35. package/dist/metafiles/drip.meta.json +2859 -574
  36. package/dist/metafiles/drip.mjs.meta.json +3235 -0
  37. package/dist/metafiles/drip.replay-recorder.meta.json +82 -0
  38. package/dist/metafiles/editor.meta.json +67 -27
  39. package/dist/metafiles/flags.cjs.meta.json +220 -0
  40. package/dist/metafiles/flags.mjs.meta.json +225 -0
  41. package/dist/metafiles/index.meta.json +2717 -491
  42. package/dist/metafiles/index.mjs.meta.json +14 -4
  43. package/dist/react/index.js +16636 -13533
  44. package/dist/react/index.js.map +4 -4
  45. package/dist/sri.json +20 -15
  46. package/dist/types/activation-runtime.d.ts +91 -0
  47. package/dist/types/analytics-runtime.d.ts +166 -0
  48. package/dist/types/antiflicker.d.ts +9 -3
  49. package/dist/types/assignment-cookie-sync.d.ts +31 -0
  50. package/dist/types/assignment-runtime.d.ts +257 -0
  51. package/dist/types/assignment-store.d.ts +4 -8
  52. package/dist/types/bucket.d.ts +1 -2
  53. package/dist/types/compact-store.d.ts +1 -0
  54. package/dist/types/config-runtime.d.ts +313 -0
  55. package/dist/types/consent-evaluation.d.ts +28 -0
  56. package/dist/types/css.d.ts +5 -3
  57. package/dist/types/debug-loader.d.ts +2 -0
  58. package/dist/types/decide-assignments.d.ts +31 -0
  59. package/dist/types/delivery-timing.d.ts +8 -0
  60. package/dist/types/early-interaction-capture.d.ts +79 -0
  61. package/dist/types/early-reassert.d.ts +32 -0
  62. package/dist/types/edge-runtime.d.ts +11 -0
  63. package/dist/types/editor/api.d.ts +3 -0
  64. package/dist/types/editor/controller.d.ts +3 -1
  65. package/dist/types/editor/publication-result.d.ts +11 -0
  66. package/dist/types/editor/types.d.ts +2 -1
  67. package/dist/types/editor/view-kit.d.ts +1 -1
  68. package/dist/types/endpoint.d.ts +8 -0
  69. package/dist/types/exclusion-groups.d.ts +4 -7
  70. package/dist/types/flags.d.ts +2 -0
  71. package/dist/types/goal-eligibility.d.ts +4 -0
  72. package/dist/types/goals.d.ts +10 -1
  73. package/dist/types/guards.d.ts +7 -7
  74. package/dist/types/handover.d.ts +12 -1
  75. package/dist/types/hash.d.ts +8 -4
  76. package/dist/types/hydration.d.ts +2 -1
  77. package/dist/types/index.d.ts +24 -128
  78. package/dist/types/init-test-helpers.d.ts +48 -0
  79. package/dist/types/inline-bootstrap.d.ts +26 -0
  80. package/dist/types/js.d.ts +3 -1
  81. package/dist/types/money.d.ts +12 -0
  82. package/dist/types/mutate.d.ts +45 -6
  83. package/dist/types/performance.d.ts +2 -0
  84. package/dist/types/persistence-decoders.d.ts +12 -0
  85. package/dist/types/public-api.d.ts +209 -0
  86. package/dist/types/qa-assistant-state.d.ts +34 -0
  87. package/dist/types/react/index.d.ts +28 -3
  88. package/dist/types/reassert-sentinel.d.ts +6 -0
  89. package/dist/types/redirect.d.ts +48 -0
  90. package/dist/types/replay-recorder-entry.d.ts +1 -0
  91. package/dist/types/replay-signal-state.d.ts +6 -0
  92. package/dist/types/replay-signals.d.ts +13 -0
  93. package/dist/types/replay.d.ts +110 -0
  94. package/dist/types/router.d.ts +12 -2
  95. package/dist/types/runtime-state.d.ts +166 -0
  96. package/dist/types/sanitize.d.ts +1 -0
  97. package/dist/types/shadow.d.ts +3 -0
  98. package/dist/types/shopify-cart.d.ts +25 -1
  99. package/dist/types/storefront-vitals.d.ts +24 -0
  100. package/dist/types/targeting-diagnostics.d.ts +1 -0
  101. package/dist/types/targeting.d.ts +16 -2
  102. package/dist/types/track.d.ts +15 -1
  103. package/dist/types/types.d.ts +115 -9
  104. package/dist/types/wait.d.ts +14 -1
  105. package/dist/types/weekday-schedule.d.ts +3 -0
  106. package/package.json +17 -8
  107. package/src/activation-runtime.ts +2737 -0
  108. package/src/analytics-runtime.ts +2175 -0
  109. package/src/antiflicker.test.ts +216 -44
  110. package/src/antiflicker.ts +103 -28
  111. package/src/artifact-concurrency.test.ts +1091 -0
  112. package/src/assignment-cookie-sync.test.ts +202 -0
  113. package/src/assignment-cookie-sync.ts +189 -0
  114. package/src/assignment-runtime.ts +3204 -0
  115. package/src/assignment-store.test.ts +56 -0
  116. package/src/assignment-store.ts +7 -38
  117. package/src/bucket.ts +3 -18
  118. package/src/commerce-analytics-lifecycle.test.ts +75 -15
  119. package/src/commerce-config-lifecycle.test.ts +81 -1
  120. package/src/commerce-price-preserve.test.ts +133 -0
  121. package/src/commerce-price.test.ts +97 -0
  122. package/src/commerce-price.ts +74 -20
  123. package/src/commerce-shipping.test.ts +53 -0
  124. package/src/commerce-shipping.ts +5 -11
  125. package/src/compact-store.ts +15 -0
  126. package/src/config-fetch.test.ts +480 -9
  127. package/src/config-runtime.ts +2071 -0
  128. package/src/consent-evaluation-borlabs.test.ts +41 -0
  129. package/src/consent-evaluation-cookiescript.test.ts +50 -0
  130. package/src/consent-evaluation.ts +151 -0
  131. package/src/css.test.ts +30 -0
  132. package/src/css.ts +120 -6
  133. package/src/cwv.test.ts +60 -77
  134. package/src/debug-loader.test.ts +214 -0
  135. package/src/debug-loader.ts +41 -0
  136. package/src/decide-assignments.test.ts +196 -0
  137. package/src/decide-assignments.ts +204 -0
  138. package/src/delivery-timing.test.ts +104 -0
  139. package/src/delivery-timing.ts +89 -0
  140. package/src/early-interaction-capture.test.ts +451 -0
  141. package/src/early-interaction-capture.ts +230 -0
  142. package/src/early-reassert.test.ts +207 -0
  143. package/src/early-reassert.ts +152 -0
  144. package/src/edge-adoption.test.ts +435 -0
  145. package/src/edge-runtime.ts +30 -0
  146. package/src/editor/api.test.ts +109 -0
  147. package/src/editor/api.ts +34 -3
  148. package/src/editor/controller.test.ts +297 -14
  149. package/src/editor/controller.ts +69 -5
  150. package/src/editor/index.test.ts +2 -0
  151. package/src/editor/index.ts +1 -0
  152. package/src/editor/publication-result.ts +58 -0
  153. package/src/editor/types.ts +10 -1
  154. package/src/editor/view-kit.ts +2 -1
  155. package/src/editor/view.test.ts +108 -0
  156. package/src/editor/view.ts +49 -7
  157. package/src/endpoint.test.ts +15 -0
  158. package/src/endpoint.ts +10 -0
  159. package/src/exclusion-groups.ts +8 -18
  160. package/src/flags.test.ts +88 -1
  161. package/src/flags.ts +29 -29
  162. package/src/global-runtime-reconciler.test.ts +271 -0
  163. package/src/goal-eligibility.test.ts +29 -0
  164. package/src/goal-eligibility.ts +17 -0
  165. package/src/goals.test.ts +144 -1
  166. package/src/goals.ts +97 -18
  167. package/src/guards.test.ts +99 -1
  168. package/src/guards.ts +34 -15
  169. package/src/handover-cache-order.test.ts +6 -3
  170. package/src/handover.test.ts +154 -8
  171. package/src/handover.ts +122 -12
  172. package/src/hash.ts +29 -54
  173. package/src/holdout.test.ts +26 -0
  174. package/src/hydration.test.ts +73 -2
  175. package/src/hydration.ts +18 -9
  176. package/src/index.ts +130 -7287
  177. package/src/init-analytics.test.ts +1694 -0
  178. package/src/init-anti-flicker.test.ts +1211 -0
  179. package/src/init-cart-attributes.test.ts +2003 -0
  180. package/src/init-config-resolution.test.ts +999 -0
  181. package/src/init-consent.test.ts +971 -0
  182. package/src/init-empty.test.ts +11 -5406
  183. package/src/init-integrations.test.ts +846 -0
  184. package/src/init-page-activation.test.ts +5064 -0
  185. package/src/init-qa-loading.test.ts +740 -0
  186. package/src/init-redirects.test.ts +2156 -0
  187. package/src/init-test-helpers.ts +287 -0
  188. package/src/inline-bootstrap.test.ts +184 -0
  189. package/src/inline-bootstrap.ts +73 -0
  190. package/src/js.test.ts +51 -1
  191. package/src/js.ts +86 -2
  192. package/src/money.test.ts +55 -1
  193. package/src/money.ts +104 -2
  194. package/src/money.web-parity.contract.test.ts +85 -0
  195. package/src/mutate.test.ts +474 -10
  196. package/src/mutate.ts +739 -230
  197. package/src/page-trigger.test.ts +218 -8
  198. package/src/performance.ts +10 -0
  199. package/src/persistence-decoders.ts +18 -0
  200. package/src/public-api.ts +1828 -0
  201. package/src/qa-assistant-state.test.ts +249 -3
  202. package/src/qa-assistant-state.ts +146 -6
  203. package/src/qa-assistant-view.test.ts +220 -2
  204. package/src/qa-assistant-view.ts +102 -5
  205. package/src/react/index.test.tsx +37 -0
  206. package/src/react/index.tsx +19 -3
  207. package/src/reassert-sentinel.test.ts +155 -1
  208. package/src/reassert-sentinel.ts +168 -8
  209. package/src/redirect.test.ts +541 -0
  210. package/src/redirect.ts +572 -0
  211. package/src/replay-recorder-entry.ts +115 -0
  212. package/src/replay-signal-state.ts +100 -0
  213. package/src/replay-signals.test.ts +249 -0
  214. package/src/replay-signals.ts +151 -0
  215. package/src/replay.test.ts +764 -0
  216. package/src/replay.ts +514 -0
  217. package/src/router.test.ts +61 -2
  218. package/src/router.ts +50 -12
  219. package/src/runtime-state.ts +507 -0
  220. package/src/runtime.test.ts +174 -7
  221. package/src/runtime.ts +88 -14
  222. package/src/sanitize.test.ts +34 -0
  223. package/src/sanitize.ts +23 -12
  224. package/src/shadow.test.ts +187 -0
  225. package/src/shadow.ts +99 -0
  226. package/src/shopify-cart.test.ts +733 -23
  227. package/src/shopify-cart.ts +402 -49
  228. package/src/storefront-vitals.test.ts +217 -0
  229. package/src/storefront-vitals.ts +206 -0
  230. package/src/surface-signals.ts +6 -0
  231. package/src/targeting-conformance.test.ts +9 -0
  232. package/src/targeting-diagnostics.ts +38 -8
  233. package/src/targeting-parity-corpus.json +559 -0
  234. package/src/targeting-parity-corpus.test.ts +18 -0
  235. package/src/targeting.detailed.test.ts +105 -0
  236. package/src/targeting.test.ts +211 -0
  237. package/src/targeting.ts +88 -207
  238. package/src/track.test.ts +147 -0
  239. package/src/track.ts +125 -26
  240. package/src/types.ts +120 -13
  241. package/src/wait.test.ts +23 -0
  242. package/src/wait.ts +129 -13
  243. package/src/weekday-delivery.test.ts +56 -0
  244. package/src/weekday-schedule-parity-corpus.json +92 -0
  245. package/src/weekday-schedule.test.ts +69 -0
  246. package/src/weekday-schedule.ts +20 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["optional-stub:qa-toolbar", "optional-stub:qa-assistant", "optional-stub:devtools", "optional-stub:audit", "optional-stub:heatmap", "../src/semantic.ts", "../src/runtime.ts", "../src/runtime-state.ts", "../src/endpoint.ts", "../../event-schema/src/experiment-servability.ts", "../src/antiflicker.ts", "../src/compact-store.ts", "../src/persistence-decoders.ts", "../src/assignment-store.ts", "../src/assignment-cookie-sync.ts", "../../shared-runtime/src/weekday-schedule.ts", "../src/weekday-schedule.ts", "../src/consent-evaluation.ts", "../src/storefront-vitals.ts", "../../shared-runtime/src/bucketing.ts", "../src/edge-runtime.ts", "../src/hash.ts", "../src/guards.ts", "../src/exclusion-groups.ts", "../src/money.ts", "../src/commerce-price.ts", "optional-stub:debug", "../src/observer-mute.ts", "../src/dom-trigger.ts", "../src/handover.ts", "../src/js.ts", "../src/data-layer-normalize.ts", "../src/runtime-tools.ts", "../../event-schema/src/targeting-core.ts", "../src/signals.ts", "optional-stub:targeting-diagnostics", "../src/targeting.ts", "../src/redirect.ts", "../../event-schema/src/replay-contract.ts", "../src/replay-signal-state.ts", "../src/replay.ts", "../src/analytics.ts", "../src/track.ts", "../src/safe-regex.ts", "../src/early-interaction-capture.ts", "../src/cwv.ts", "../src/performance.ts", "../src/delivery-timing.ts", "../src/shopify-cart-events.ts", "../src/surface-signals.ts", "../src/commerce-shipping.ts", "../src/goal-eligibility.ts", "../src/pii-keys.ts", "../../event-schema/src/event-name.ts", "../src/goals.ts", "../src/exposure-signals.ts", "../src/decide-assignments.ts", "../src/css.ts", "../src/hideflicker.ts", "../src/sanitize.ts", "../src/shadow.ts", "../src/reassert-sentinel.ts", "../src/mutate.ts", "../src/shopify-cart.ts", "../src/commerce-gift.ts", "../src/wait.ts", "../src/bucketing-cleanup.ts", "../src/hydration.ts", "../src/early-reassert.ts", "../src/router.ts", "../src/prerequisites.ts", "../src/debug-loader.ts", "../src/editor-bootstrap.ts", "../src/define.ts", "../src/flags.ts", "../src/public-api.ts", "../src/activation-runtime.ts", "../src/assignment-runtime.ts", "../src/analytics-runtime.ts", "../src/config-runtime.ts", "../src/index.ts"],
4
+ "sourcesContent": ["export function mountQaToolbar() {}\nexport function unmountQaToolbar() {}", "export function mountQaAssistant() { return null; }", "export function isDevtoolsEnabled() { return false; }\nexport function logDevtoolsEvent() {}\nexport function mountDevtools() {}\nexport function unmountDevtools() {}", "export function runAuditIfRequested() {}", "export function startHeatmapCapture() { return { update() {}, stop() {} }; }", "import type { SemanticTrackingRule, SemanticTrackingSettings } from \"./types\";\n\ntype TrackFn = (type: string, data?: Record<string, unknown>) => void;\n\ntype Controller = {\n stop: () => void;\n};\n\ntype NormalizedRule = Required<\n Pick<\n SemanticTrackingRule,\n \"id\" | \"eventType\" | \"action\" | \"selector\" | \"labelSource\" | \"indexStrategy\" | \"oncePerSession\"\n >\n> &\n Omit<\n SemanticTrackingRule,\n \"id\" | \"eventType\" | \"action\" | \"selector\" | \"labelSource\" | \"indexStrategy\" | \"oncePerSession\"\n >;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction normalizeSampleRate(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value)\n ? clamp(value, 0, 1)\n : 0.25;\n}\n\nfunction sampledIn(sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n const key = \"drip_semantic_sample\";\n try {\n const existing = sessionStorage.getItem(key);\n if (existing === \"1\") return true;\n if (existing === \"0\") return false;\n const selected = Math.random() < sampleRate;\n sessionStorage.setItem(key, selected ? \"1\" : \"0\");\n return selected;\n } catch {\n return Math.random() < sampleRate;\n }\n}\n\nfunction cleanUrl(): string {\n return location.origin + location.pathname;\n}\n\nfunction normalizeRules(settings: SemanticTrackingSettings): NormalizedRule[] {\n const rules = Array.isArray(settings.rules) ? settings.rules : [];\n return rules\n .map((rule): NormalizedRule | null => {\n const id = rule.id?.trim();\n const eventType = rule.eventType?.trim();\n const selector = rule.selector?.trim();\n if (!id || !eventType || !selector) return null;\n return {\n ...rule,\n id,\n eventType,\n selector,\n action: rule.action === \"visibility\" ? \"visibility\" : \"click\",\n labelSource: rule.labelSource ?? \"text\",\n indexStrategy: rule.indexStrategy ?? \"dom_order\",\n oncePerSession: rule.oncePerSession !== false,\n };\n })\n .filter((rule): rule is NormalizedRule => Boolean(rule));\n}\n\nfunction pathMatches(rule: NormalizedRule): boolean {\n const pattern = rule.pathPattern?.trim();\n if (!pattern) return true;\n const path = `${location.pathname}${location.search}`;\n if (pattern.startsWith(\"regex:\")) {\n try {\n return new RegExp(pattern.slice(6)).test(path);\n } catch {\n return false;\n }\n }\n return path.includes(pattern);\n}\n\nfunction elementText(element: Element): string {\n const tag = element.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") {\n return (\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"title\") ||\n element.getAttribute(\"value\") ||\n \"\"\n ).replace(/\\s+/g, \" \").trim().slice(0, 120);\n }\n return (\n element.textContent ||\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"title\") ||\n element.getAttribute(\"alt\") ||\n \"\"\n ).replace(/\\s+/g, \" \").trim().slice(0, 120);\n}\n\nfunction labelFor(rule: NormalizedRule, element: Element): string {\n if (rule.labelSource === \"constant\") return rule.label || rule.elementRole || rule.id;\n if (rule.labelSource === \"attribute\" && rule.attribute) {\n return (element.getAttribute(rule.attribute) || rule.label || elementText(element)).slice(0, 180);\n }\n return (rule.label || elementText(element) || rule.elementRole || rule.id).slice(0, 180);\n}\n\nfunction productContext(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const canonical = document.querySelector<HTMLLinkElement>(\"link[rel='canonical']\")?.href;\n const productId = document.querySelector<HTMLElement>(\"[data-product-id]\")?.dataset.productId;\n const handle = canonical ? canonical.split(\"/products/\")[1]?.split(/[?#/]/)[0] : undefined;\n if (productId) out.product_id = productId;\n if (handle) out.product_handle = handle;\n return out;\n}\n\nfunction elementIndex(rule: NormalizedRule, element: Element, elements: Element[]): number | null {\n if (rule.indexStrategy === \"none\") return null;\n const index = elements.indexOf(element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction basePayload(rule: NormalizedRule, element: Element, elements: Element[]) {\n const rect = element.getBoundingClientRect();\n const index = elementIndex(rule, element, elements);\n return {\n semantic_rule_id: rule.id,\n semantic_event: rule.eventType,\n semantic_role: rule.elementRole ?? \"\",\n semantic_label: labelFor(rule, element),\n page_type: rule.pageType ?? \"\",\n element_index: index,\n element_tag: element.tagName.toLowerCase(),\n element_text: elementText(element),\n element_width: Math.round(rect.width),\n element_height: Math.round(rect.height),\n path: location.pathname,\n page_url: cleanUrl(),\n ...productContext(),\n };\n}\n\nfunction dedupeKey(rule: NormalizedRule, element: Element, elements: Element[]): string {\n const index = elementIndex(rule, element, elements) ?? 0;\n return `${rule.id}:${cleanUrl()}:${index}:${labelFor(rule, element)}`;\n}\n\nexport function startSemanticCapture(\n settings: SemanticTrackingSettings | undefined,\n track: TrackFn,\n): Controller | null {\n if (!settings?.enabled) return null;\n if (!sampledIn(normalizeSampleRate(settings.sampleRate))) return null;\n\n const rules = normalizeRules(settings).filter(pathMatches);\n if (!rules.length) return null;\n\n const maxEvents = Math.max(1, Math.min(500, Math.round(settings.maxEventsPerSession ?? 120)));\n const minVisibleMs = Math.max(100, Math.min(10_000, Math.round(settings.minVisibleMs ?? 700)));\n const threshold = Math.max(0.05, Math.min(1, settings.visibilityThreshold ?? 0.5));\n const seen = new Set<string>();\n const timers = new Map<Element, number>();\n let emitted = 0;\n\n function emit(rule: NormalizedRule, element: Element, elements: Element[], extra: Record<string, unknown> = {}) {\n if (emitted >= maxEvents) return;\n const key = dedupeKey(rule, element, elements);\n if (rule.oncePerSession && seen.has(key)) return;\n seen.add(key);\n emitted += 1;\n track(rule.eventType, { ...basePayload(rule, element, elements), ...extra });\n }\n\n const visibilityRules = rules.filter((rule) => rule.action === \"visibility\");\n const clickRules = rules.filter((rule) => rule.action === \"click\");\n const observers: IntersectionObserver[] = [];\n\n for (const rule of visibilityRules) {\n let elements: Element[] = [];\n try {\n elements = Array.from(document.querySelectorAll(rule.selector));\n } catch {\n continue;\n }\n if (!elements.length) continue;\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.intersectionRatio < threshold) continue;\n if (timers.has(entry.target)) continue;\n const timer = window.setTimeout(() => {\n timers.delete(entry.target);\n const rect = entry.target.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return;\n emit(rule, entry.target, elements, {\n visible_ms: minVisibleMs,\n visibility_pct: Math.round(entry.intersectionRatio * 100),\n });\n }, minVisibleMs);\n timers.set(entry.target, timer);\n }\n },\n { threshold: [threshold] },\n );\n elements.forEach((element) => observer.observe(element));\n observers.push(observer);\n }\n\n const onClick = (event: MouseEvent) => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n for (const rule of clickRules) {\n if (!pathMatches(rule)) continue;\n let matched: Element | null = null;\n try {\n matched = target.closest(rule.selector);\n } catch {\n continue;\n }\n if (!matched) continue;\n const elements = Array.from(document.querySelectorAll(rule.selector));\n emit(rule, matched, elements, {\n viewport_x: Math.round(event.clientX),\n viewport_y: Math.round(event.clientY),\n });\n }\n };\n\n document.addEventListener(\"click\", onClick, { capture: true, passive: true });\n\n return {\n stop() {\n document.removeEventListener(\"click\", onClick, { capture: true });\n observers.forEach((observer) => observer.disconnect());\n for (const timer of timers.values()) window.clearTimeout(timer);\n timers.clear();\n },\n };\n}\n", "import type {\n ActivationMode,\n Assignment,\n Experiment,\n InitConfig,\n PerfFeatureFlag,\n PlatformHint,\n RouterMode,\n} from \"./types\";\n\ntype UrlDiffNeeds = {\n path: boolean;\n search: boolean;\n hash: boolean;\n};\n\nexport type PerfFlagState = Record<PerfFeatureFlag, boolean>;\n\nconst PERF_FLAG_DEFAULTS: PerfFlagState = {\n perf_empty_project_v1: false,\n};\n\nfunction hasOwnEntries(value: unknown): boolean {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value) && Object.keys(value).length > 0);\n}\n\nfunction hasProjectCode(config: InitConfig): boolean {\n const projectCode = config.projectCode;\n return Boolean(\n projectCode?.enabled\n || projectCode?.css?.trim()\n || projectCode?.helperJs?.trim()\n || projectCode?.js?.trim(),\n );\n}\n\n/**\n * Browser-side validation for a server-compiled empty-project profile. The\n * browser may reject the profile, but never upgrades a full profile itself.\n */\nexport function canUseEmptyProjectProfile(\n config: InitConfig,\n experiments: Experiment[],\n platform?: PlatformHint,\n): boolean {\n if (config.runtimeProfile !== \"empty_project\") return false;\n if (!readPerfFlags(config).perf_empty_project_v1) return false;\n if (experiments.length > 0) return false;\n if ((config.signals?.length ?? 0) > 0) return false;\n if (hasOwnEntries(config.commerce)) return false;\n if ((config.dataLayerTriggers?.length ?? 0) > 0) return false;\n if ((config.externalTracking?.domains?.length ?? 0) > 0) return false;\n if (hasOwnEntries(config.exposureDestinations)) return false;\n if (hasProjectCode(config)) return false;\n if (config.semanticTracking?.enabled) return false;\n if (config.debug?.enabled) return false;\n if (config.runtimeFeatures && Object.entries(config.runtimeFeatures).some(([key, enabled]) => (\n key !== \"sdkVariant\" && enabled === true\n ))) return false;\n if (config.runtimeFeatures?.sdkVariant && config.runtimeFeatures.sdkVariant !== \"live\") return false;\n if (config.pageTrigger?.defaultMode && config.pageTrigger.defaultMode !== \"direct\") return false;\n if (config.routerMode && config.routerMode !== \"auto\" && config.routerMode !== \"none\") return false;\n if (config.spa && (\n config.spa.reinitOnly\n || config.spa.domChangeTrigger\n || config.spa.activationMode === \"manual\"\n || (config.spa.routerMode && config.spa.routerMode !== \"auto\" && config.spa.routerMode !== \"none\")\n )) return false;\n if (config.profile?.platform === \"spa\" || config.platformHint === \"spa\" || platform === \"spa\") return false;\n if (config.projectPrerequisites?.showVariationsRule?.trim()\n && config.projectPrerequisites.showVariationsRule.trim() !== \"return true;\") return false;\n if (config.projectPrerequisites?.startTrackingRule?.trim()\n && config.projectPrerequisites.startTrackingRule.trim() !== \"return true;\") return false;\n return true;\n}\n\nfunction hasNavigationApi(): boolean {\n const w = globalThis as Record<string, unknown>;\n const nav = w.navigation as { addEventListener?: unknown } | undefined;\n return Boolean(nav && typeof nav.addEventListener === \"function\");\n}\n\nfunction hasShopifyRuntime(): boolean {\n const w = globalThis as Record<string, unknown>;\n const shopify = w.Shopify as { analytics?: { publish?: unknown } } | undefined;\n return Boolean(shopify?.analytics && typeof shopify.analytics.publish === \"function\");\n}\n\nfunction hasShopwareRuntime(): boolean {\n const w = globalThis as Record<string, unknown>;\n if (w.PluginManager) return true;\n if (w.Shopware) return true;\n if (typeof document === \"undefined\") return false;\n return Boolean(\n document.querySelector(\"[data-shopware], [data-off-canvas-main-navigation], .cms-page, .is--ctl-index\"),\n );\n}\n\nfunction hasSpaMarkers(): boolean {\n if (typeof document === \"undefined\") return false;\n return Boolean(\n document.getElementById(\"__next\")\n || document.querySelector(\"[data-reactroot], [ng-version], [data-sveltekit], [data-v-app], [data-router-view]\"),\n );\n}\n\nexport function detectRuntimePlatform(): PlatformHint {\n if (hasShopifyRuntime()) return \"shopify\";\n if (hasShopwareRuntime()) return \"shopware\";\n if (hasSpaMarkers() || hasNavigationApi()) return \"spa\";\n return \"auto\";\n}\n\nexport function resolvePlatform(config: InitConfig): PlatformHint {\n if (config.platformHint && config.platformHint !== \"auto\") {\n return config.platformHint;\n }\n const profilePlatform = config.profile?.platform;\n if (profilePlatform && profilePlatform !== \"auto\") {\n return profilePlatform;\n }\n return detectRuntimePlatform();\n}\n\nexport function resolveRouterMode(config: InitConfig, platform: PlatformHint): RouterMode {\n if (config.spa?.reinitOnly) return \"none\";\n const requested = config.spa?.routerMode ?? config.routerMode ?? \"auto\";\n if (requested !== \"auto\") return requested;\n if (platform === \"shopify\" && !config.spa?.domChangeTrigger) return \"none\";\n return hasNavigationApi() ? \"navigation\" : \"history\";\n}\n\nexport function resolveActivationMode(config: InitConfig): ActivationMode {\n const requested = config.spa?.activationMode ?? config.activationMode ?? \"auto\";\n if (requested === \"manual\") return \"manual\";\n return \"observer\";\n}\n\nexport function readPerfFlags(config: InitConfig): PerfFlagState {\n const out = { ...PERF_FLAG_DEFAULTS };\n const configured = config.perfFlags ?? {};\n for (const key of Object.keys(out) as PerfFeatureFlag[]) {\n if (typeof configured[key] === \"boolean\") out[key] = configured[key]!;\n }\n return out;\n}\n\nfunction parseMaybeUrl(url: string): URL | null {\n try {\n return new URL(url, \"https://_\");\n } catch {\n return null;\n }\n}\n\nfunction readForceSignature(params: URLSearchParams): string {\n const canonical = params.get(\"drip_force\");\n if (canonical !== null) {\n return canonical.trim().toLowerCase() === \"clear\" ? \"__drip_force_clear__\" : canonical;\n }\n const experimentId =\n params.get(\"drip_experiment_id\") ??\n params.get(\"drip_experiment\") ??\n params.get(\"experiment_id\") ??\n params.get(\"experimentId\") ??\n params.get(\"expId\") ??\n \"\";\n const variationId =\n params.get(\"drip_variation_id\") ??\n params.get(\"drip_variation\") ??\n params.get(\"variation_id\") ??\n params.get(\"variationId\") ??\n params.get(\"varId\") ??\n \"\";\n return experimentId && variationId ? `${experimentId}:${variationId}` : \"\";\n}\n\nfunction markUrlDepsForPattern(\n deps: UrlDiffNeeds,\n pattern: string,\n type: \"regex\" | \"simple\" | undefined,\n): void {\n if (type === \"regex\") {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n return;\n }\n deps.path = true;\n if (pattern.includes(\"?\")) deps.search = true;\n if (pattern.includes(\"#\")) deps.hash = true;\n}\n\nfunction markUrlDepsForSignal(deps: UrlDiffNeeds, signal: string): void {\n if (signal === \"url.path\") deps.path = true;\n if (signal === \"url.query\") deps.search = true;\n if (signal === \"url.full\") {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n }\n}\n\nfunction jsMayReadUrl(code: string | undefined): boolean {\n // `document` is included because document.documentURI/baseURI expose the\n // full URL without mentioning `location` or `url`.\n return Boolean(code?.trim() && /\\b(?:location|url|document)\\b/i.test(code));\n}\n\nexport function computeUrlDiffNeeds(\n experiments: Experiment[],\n signals: InitConfig[\"signals\"] = [],\n): UrlDiffNeeds {\n const deps: UrlDiffNeeds = { path: false, search: false, hash: false };\n let hasUrlTargeting = false;\n for (const exp of experiments) {\n const rules = exp.targeting?.url;\n for (const rule of rules ?? []) {\n hasUrlTargeting = true;\n markUrlDepsForPattern(deps, rule.pattern, rule.type);\n if (deps.path && deps.search && deps.hash) return deps;\n }\n for (const rule of [\n ...(exp.targeting?.pageRules ?? []),\n ...(exp.goalPageRules ?? []),\n ]) {\n hasUrlTargeting = true;\n // Published rules without a recognized matcher still depend on the\n // current page. Never let an unknown shape suppress pathname rechecks.\n deps.path = true;\n for (const urlRule of [...(rule.includeRules ?? []), ...(rule.excludeRules ?? [])]) {\n markUrlDepsForPattern(deps, urlRule.pattern, urlRule.type);\n }\n if (\n jsMayReadUrl(rule.advancedCondition?.code)\n || jsMayReadUrl(rule.trigger?.triggerJs)\n ) {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n }\n if (deps.path && deps.search && deps.hash) return deps;\n }\n for (const rule of exp.targeting?.attributes ?? []) {\n markUrlDepsForSignal(deps, rule.attribute);\n if (rule.attribute.startsWith(\"url.\")) hasUrlTargeting = true;\n }\n for (const rule of exp.targeting?.segmentRules ?? []) {\n const conditions = [\n ...(rule.rules?.conditions ?? []),\n ...(rule.rules?.groups ?? []).flat(),\n ];\n for (const condition of conditions) {\n markUrlDepsForSignal(deps, condition.signal);\n if (condition.signal.startsWith(\"url.\")) hasUrlTargeting = true;\n if (jsMayReadUrl(condition.js?.code) || jsMayReadUrl(condition.js?.resetCode)) {\n hasUrlTargeting = true;\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n }\n }\n if (deps.path && deps.search && deps.hash) return deps;\n }\n for (const variation of exp.variations) {\n for (const block of variation.urlBlocks ?? []) {\n for (const rule of block.urlRules) {\n hasUrlTargeting = true;\n markUrlDepsForPattern(deps, rule.pattern, rule.type);\n if (deps.path && deps.search && deps.hash) return deps;\n }\n }\n }\n }\n\n for (const definition of signals ?? []) {\n const mode = definition.capture?.mode;\n if (mode === \"url_parameter\") {\n deps.search = true;\n }\n if (mode === \"dom_selector\" || mode === \"global\") {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n }\n if (deps.path && deps.search && deps.hash) return deps;\n }\n\n if (hasUrlTargeting && !deps.path && !deps.search && !deps.hash) deps.path = true;\n return deps;\n}\n\nexport function shouldReevaluateForUrlChange(\n previousUrl: string,\n nextUrl: string,\n deps: UrlDiffNeeds,\n): boolean {\n if (previousUrl === nextUrl) return false;\n const prev = parseMaybeUrl(previousUrl);\n const next = parseMaybeUrl(nextUrl);\n if (!prev || !next) return true;\n const prevForce = readForceSignature(prev.searchParams);\n const nextForce = readForceSignature(next.searchParams);\n if (prevForce !== nextForce) return true;\n if (deps.path && prev.pathname !== next.pathname) return true;\n if (deps.search && prev.search !== next.search) return true;\n if (deps.hash && prev.hash !== next.hash) return true;\n return false;\n}\n\nexport function assignmentSignature(assignments: Assignment[]): string {\n if (!assignments.length) return \"none\";\n return assignments\n .map((item) =>\n item.experimentId +\n \":\" +\n item.variationId +\n \":\" +\n (item.activeUrlBlockId ? `block:${item.activeUrlBlockId}` : \"flat\") +\n \":\" +\n (item.pageActive ? 1 : 0),\n )\n .sort()\n .join(\"|\");\n}\n\nexport function getBlankScreenMs(): number {\n try {\n if (typeof performance === \"undefined\") return 0;\n const timing = performance.timing;\n if (timing && timing.navigationStart > 0 && timing.domContentLoadedEventStart > 0) {\n return Math.max(0, timing.domContentLoadedEventStart - timing.navigationStart);\n }\n const nav = performance.getEntriesByType?.(\"navigation\")?.[0] as { domContentLoadedEventStart?: number } | undefined;\n if (nav && typeof nav.domContentLoadedEventStart === \"number\") {\n return Math.max(0, Math.round(nav.domContentLoadedEventStart));\n }\n } catch {\n // ignore perf API failures\n }\n return 0;\n}\n", "import { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";\n\n\nimport type {\n HeatmapController, SemanticController, UrlDiffNeeds, PendingPerfEvent, ConfigSource,\n ResolvedRuntimeConfig, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic,\n ShopifyAssignmentSyncDiagnostic,\n ExposureDestinationDiagnostic, PageRuleReconcileScope, RuntimeLoadDiagnostic, PageDetectorMode,\n} from \"./config-runtime\";\n\n// Shared runtime state. Owners: config, analytics, assignment, activation, and public API seams.\nexport type OrderIdentityPlatform =\n | \"shopify\"\n | \"shopware\"\n | \"woocommerce\"\n | \"centra\"\n | \"custom\";\n\nexport type SDKState = {\n config: InitConfig | null;\n userId: string | null;\n tracker: Tracker | null;\n assignments: Assignment[];\n pageActivation: Map<string, PageActivationRuntimeState>;\n stopObserver: (() => void) | null;\n stopDomObserver: (() => void) | null;\n stopHandover: (() => void) | null;\n heatmapController: HeatmapController | null;\n replayController: ReplayController | null;\n replayStartPromise: Promise<void> | null;\n replayGeneration: number;\n semanticController: SemanticController | null;\n forceMap: Record<string, string> | null;\n forcedUnavailable: Array<{\n experimentId: string;\n reason: \"archived\" | \"runtime_disabled\" | \"not_found\" | \"environment_mismatch\" | \"not_in_config\";\n }>;\n edgeDeviceAudienceUnsupported: Array<{\n experimentId: string;\n audienceName: string;\n }>;\n analyticsStarted: boolean;\n trackingStart: TrackingStart;\n trackingIdleTimeoutMs: number;\n consentRequired: boolean;\n consentGranted: boolean;\n consentModeEnabled: boolean;\n trackingPrerequisiteMet: boolean;\n variationPrerequisiteMet: boolean;\n activationDiagnostics: ActivationDiagnostics;\n trackingDisabledByDnt: boolean;\n holdout: boolean;\n analyticsTimeoutId: number | null;\n analyticsIdleId: number | null;\n qaMode: boolean;\n qaSessionId: string;\n screenshotMode: boolean;\n platform: PlatformHint;\n routerMode: RouterMode;\n activationMode: ActivationMode;\n perfFlags: PerfFlagState;\n urlDiffNeeds: UrlDiffNeeds;\n lastUrl: string;\n lastAssignmentSignature: string;\n wiredGoalKeys: Set<string>;\n wiredGoalUrl: string | null;\n pendingPerf: PendingPerfEvent | null;\n configSource: ConfigSource;\n runtimeConfig: ResolvedRuntimeConfig | null;\n pageTriggerMode: PageTriggerMode;\n stopSignalCaptures: (() => void) | null;\n stopSurfaceSignals: (() => void) | null;\n stopJsTriggerSignals: (() => void) | null;\n stopDataLayerTriggers: (() => void) | null;\n stopConsentListeners: (() => void) | null;\n stopShopifyCartMutationSync: (() => void) | null;\n lastRouteChange: RouteDiagnostic | null;\n lastDataLayerTrigger: DataLayerDiagnostic | null;\n observerErrors: {\n count: number;\n last?: { source: \"route\" | \"data_layer\" | \"dom\"; message: string; at: number };\n };\n deferredRouteReevaluationTimer: number | null;\n lastShopifyAssignmentSync: ShopifyAssignmentSyncDiagnostic | null;\n lastShopifyCartSync: ShopifySyncDiagnostic | null;\n shopifyCartToken: string | null;\n shopwareAttributionEnvelope: string | null;\n exposureDestinationDiagnostics: ExposureDestinationDiagnostic[];\n exposedAssignmentKeys: Set<string>;\n mutationPendingAssignmentKeys: Set<string>;\n contaminatedAssignmentKeys: Set<string>;\n authorizedPriceAssignmentKeys: Set<string> | null;\n authorizedShippingAssignmentKeys: Set<string> | null;\n authorizedOffersAssignmentKeys: Set<string> | null;\n initializingAssignments: boolean;\n pendingInitialApply: Promise<void> | null;\n queuedRecheck: {\n reason: \"url\" | \"dom\" | \"manual\" | \"prerequisite\";\n forceReapply: boolean;\n pageRuleScope?: PageRuleReconcileScope;\n } | null;\n redirectNavigationPending: boolean;\n routeAnalyticsGeneration: number;\n /** Re-entrancy guard and unwind-drain flag for `reevaluateAssignments`. */\n reconcileInProgress: boolean;\n reconcilePending: boolean;\n pendingDeliveryHealth: TrackEvent[];\n load: RuntimeLoadDiagnostic;\n orderIdentityInFlight: Set<string>;\n orderIdentityDetectionUrl: string;\n orderIdentityDetection: {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n } | null | undefined;\n carryImportedAssignmentKeys: Set<string>;\n};\n\nexport type QaAssistantRuntimeSnapshot = {\n config: InitConfig | null;\n assignments: Assignment[];\n activationDiagnostics: ActivationDiagnostics;\n pageActivation: PageActivationDiagnostic[];\n goalScopeUrl: string | null;\n forceMap: Record<string, string> | null;\n forcedUnavailable: Array<{\n experimentId: string;\n reason: \"archived\" | \"runtime_disabled\" | \"not_found\" | \"environment_mismatch\" | \"not_in_config\";\n }>;\n edgeDeviceAudienceUnsupported: Array<{\n experimentId: string;\n audienceName: string;\n }>;\n platform: PlatformHint;\n qaMode: boolean;\n orderIdentity: {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n } | null;\n};\n\nexport type PageActivationRuntimeState = {\n active: boolean;\n appliedKeys: Set<string>;\n /** Goal-scope state only; never participates in render transitions. */\n scopeOnly?: boolean;\n configuredMode?: PageDeactivationMode;\n lastTransitionMode?: PageDeactivationMode;\n isolationFallback?: \"whole_experiment\";\n isolationFallbackExperimentId?: string;\n triggerDetector?: PageDetectorMode;\n triggerPollAttempts?: number;\n triggerOutcome?: \"activated\" | \"condition_failed\" | \"window_expired\";\n triggerElapsedMs?: number;\n};\n\nexport type PageRulePollController = {\n intervalId: number;\n startedAt: number;\n};\n\nexport const runtimeSharedState = {\n runtimeBootedTooLateForAntiFlicker: null as boolean | null,\n stopEarlyReassert: null as (() => void) | null,\n earlyReassertTeardownTimer: null as ReturnType<typeof setTimeout> | null,\n storefrontVitalsContext: null as StorefrontVitalsContext | null,\n initialPredecidedByExperiment: null as Map<string, string> | null,\n shopifyCartSyncGeneration: 0,\n // Owners: config and activation seams.\n pageDetectorRules: new Map<PageDetectorMode, PageTargetingRule[]>(),\n pageDetectorLastUrls: new Map<string, string>(),\n pageRulePollControllers: new Map<string, PageRulePollController>(),\n // Owners: activation and public API seams.\n qaAssistantRuntimeListeners: new Set<() => void>(),\n clearingQaForceFromRoute: false,\n // Owners: analytics and assignment seams.\n attributionLedger: new Map<string, Assignment>(),\n};\n\n// Shared SDK lifecycle state. Owners: all runtime seams.\nexport const state: SDKState = {\n config: null,\n userId: null,\n tracker: null,\n assignments: [],\n pageActivation: new Map(),\n stopObserver: null,\n stopDomObserver: null,\n stopHandover: null,\n heatmapController: null,\n replayController: null,\n replayStartPromise: null,\n replayGeneration: 0,\n semanticController: null,\n forceMap: null,\n forcedUnavailable: [],\n edgeDeviceAudienceUnsupported: [],\n analyticsStarted: false,\n trackingStart: \"idle\",\n trackingIdleTimeoutMs: 2000,\n consentRequired: false,\n consentGranted: true,\n consentModeEnabled: false,\n trackingPrerequisiteMet: true,\n variationPrerequisiteMet: true,\n activationDiagnostics: {\n project: { gates: [] },\n experiments: [],\n },\n trackingDisabledByDnt: false,\n holdout: false,\n analyticsTimeoutId: null,\n analyticsIdleId: null,\n qaMode: false,\n qaSessionId: \"\",\n screenshotMode: false,\n platform: \"auto\",\n routerMode: \"history\",\n activationMode: \"observer\",\n perfFlags: readPerfFlags({}),\n urlDiffNeeds: { path: false, search: false, hash: false },\n lastUrl: \"\",\n lastAssignmentSignature: \"none\",\n wiredGoalKeys: new Set(),\n wiredGoalUrl: null,\n pendingPerf: null,\n configSource: \"none\",\n runtimeConfig: null,\n pageTriggerMode: \"direct\",\n stopSignalCaptures: null,\n stopSurfaceSignals: null,\n stopJsTriggerSignals: null,\n stopDataLayerTriggers: null,\n stopConsentListeners: null,\n stopShopifyCartMutationSync: null,\n lastRouteChange: null,\n lastDataLayerTrigger: null,\n observerErrors: { count: 0 },\n deferredRouteReevaluationTimer: null,\n lastShopifyAssignmentSync: null,\n lastShopifyCartSync: null,\n shopifyCartToken: null,\n shopwareAttributionEnvelope: null,\n exposureDestinationDiagnostics: [],\n exposedAssignmentKeys: new Set(),\n mutationPendingAssignmentKeys: new Set(),\n contaminatedAssignmentKeys: new Set(),\n authorizedPriceAssignmentKeys: null,\n authorizedShippingAssignmentKeys: null,\n authorizedOffersAssignmentKeys: null,\n initializingAssignments: false,\n pendingInitialApply: null,\n queuedRecheck: null,\n redirectNavigationPending: false,\n routeAnalyticsGeneration: 0,\n reconcileInProgress: false,\n reconcilePending: false,\n pendingDeliveryHealth: [],\n load: { stage: \"idle\", configFetchStatus: \"idle\" },\n orderIdentityInFlight: new Set(),\n orderIdentityDetectionUrl: \"\",\n orderIdentityDetection: undefined,\n carryImportedAssignmentKeys: new Set(),\n};\n", "/**\n * Normalize an SDK endpoint: strip trailing slashes and a trailing events path\n * so configured bare, /events, and /v1/events endpoints resolve to the base.\n * Single chokepoint \u2014 every SDK helper that derives a sibling route from\n * config.endpoint must go through this (events, handover, order-identity,\n * replay, shopify cart authorization).\n */\nexport function normalizeEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/+$/, \"\").replace(/\\/(?:v1\\/)?events$/, \"\");\n}\n", "export type ServableExperiment = {\n status?: string | null;\n runtime_disabled?: boolean | null;\n environment_key?: string | null;\n};\n\nexport type ExperimentServeContext = {\n qaMode: boolean;\n environment: string;\n};\n\n/** The single fail-closed answer to whether an experiment may serve. */\nexport function isExperimentServable(\n experiment: ServableExperiment | null | undefined,\n context: ExperimentServeContext,\n): boolean {\n if (!experiment || experiment.runtime_disabled === true) return false;\n\n const environment = context.environment.trim().toLowerCase() || \"production\";\n const experimentEnvironment = experiment.environment_key?.trim().toLowerCase();\n if (experimentEnvironment && experimentEnvironment !== environment) return false;\n\n if (experiment.status === \"running\") return true;\n return context.qaMode === true && (\n experiment.status === \"qa\" ||\n experiment.status === \"draft\" ||\n experiment.status === \"awaiting_client_approval\" ||\n experiment.status === \"changes_requested\" ||\n experiment.status === \"client_approved\" ||\n experiment.status === \"ready_to_launch\" ||\n experiment.status === \"paused\" ||\n experiment.status === \"completed\"\n );\n}\n\n/** Browser snippets embed this exact implementation instead of rewriting it. */\nexport function experimentServabilityPredicateSource(): string {\n return `function isExperimentServable(experiment,context){if(!experiment||experiment.runtime_disabled===true)return false;var environment=(context.environment.trim().toLowerCase()||\"production\");var experimentEnvironment=experiment.environment_key&&experiment.environment_key.trim().toLowerCase();if(experimentEnvironment&&experimentEnvironment!==environment)return false;if(experiment.status===\"running\")return true;return context.qaMode===true&&(experiment.status===\"qa\"||experiment.status===\"draft\"||experiment.status===\"awaiting_client_approval\"||experiment.status===\"changes_requested\"||experiment.status===\"client_approved\"||experiment.status===\"ready_to_launch\"||experiment.status===\"paused\"||experiment.status===\"completed\")}`;\n}\n", "import type { AntiFlickerMode } from \"./types\";\n\nconst STYLE_ID = \"drip-antiflicker\";\nconst DEFAULT_TIMEOUT_MS = 1200;\nconst PROGRESSIVE_REVEAL_RATIO = 0.8; // Start progressive reveal at 80% of timeout\nconst REVEAL_CLEANUP_MS = 80;\nconst MAX_NAVIGATION_AGE_MS = 2_000;\nconst MAX_POST_DOM_CONTENT_LOADED_MS = 250;\nconst PAINT_TIMING_EPSILON_MS = 50;\n\nconst FULL_PAGE_CSS = \"html { opacity: 0 !important; }\";\nconst FULL_PAGE_PROGRESSIVE_CSS =\n \"html { opacity: 0 !important; transition: opacity 0.05s ease-in !important; }\";\nconst FULL_PAGE_REVEAL_CSS =\n \"html { transition: opacity 0.05s ease-in !important; }\";\n\nlet progressiveRevealTimer: ReturnType<typeof setTimeout> | null = null;\nlet hardRevealTimer: ReturnType<typeof setTimeout> | null = null;\nlet cleanupTimer: ReturnType<typeof setTimeout> | null = null;\nlet antiFlickerOwnerDocument: Document | null = null;\nlet antiFlickerProgressiveCss = \"\";\nlet antiFlickerRevealCss = \"\";\n\nfunction activeDocument(): Document | null {\n if (typeof document === \"undefined\" || !document.documentElement) return null;\n return document;\n}\n\nfunction clearTimers(): void {\n if (progressiveRevealTimer !== null) {\n clearTimeout(progressiveRevealTimer);\n progressiveRevealTimer = null;\n }\n if (hardRevealTimer !== null) {\n clearTimeout(hardRevealTimer);\n hardRevealTimer = null;\n }\n if (cleanupTimer !== null) {\n clearTimeout(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction cleanupDocumentImmediately(ownerDocument: Document): void {\n ownerDocument.documentElement?.classList.remove(\"drip-af\", \"drip-af-reveal\");\n ownerDocument.getElementById(STYLE_ID)?.remove();\n if (antiFlickerOwnerDocument === ownerDocument) {\n antiFlickerOwnerDocument = null;\n antiFlickerProgressiveCss = \"\";\n antiFlickerRevealCss = \"\";\n }\n}\n\nexport function resolveAntiFlickerCss(\n mode: AntiFlickerMode = \"scoped\",\n scopedSelectors?: string[],\n customCss?: string,\n): string | null {\n if (mode === \"off\") return null;\n\n if (mode === \"custom\") {\n return customCss && customCss.trim() ? customCss : null;\n }\n\n if (mode === \"scoped\") {\n if (!scopedSelectors || scopedSelectors.length === 0) {\n return null;\n }\n\n const selectorList = scopedSelectors.join(\",\");\n return selectorList + \" { visibility: hidden !important; }\";\n }\n\n return FULL_PAGE_CSS;\n}\n\nfunction resolveAntiFlickerProgressiveCss(\n mode: AntiFlickerMode,\n scopedSelectors?: string[],\n): string {\n if (mode === \"scoped\" && scopedSelectors?.length) {\n return (\n scopedSelectors.join(\",\") +\n \" { visibility: visible !important; transition: visibility 0s, opacity 0.05s ease-in !important; }\"\n );\n }\n\n if (mode === \"full\") return FULL_PAGE_PROGRESSIVE_CSS;\n return \"\";\n}\n\nfunction resolveAntiFlickerRevealCss(\n mode: AntiFlickerMode,\n scopedSelectors?: string[],\n): string {\n if (mode === \"scoped\") {\n return resolveAntiFlickerProgressiveCss(mode, scopedSelectors);\n }\n\n if (mode === \"full\") return FULL_PAGE_REVEAL_CSS;\n return \"\";\n}\n\n/**\n * Apply anti-flicker hiding based on mode.\n * - \"scoped\": only hides elements matching provided selectors (preferred).\n * - \"full\": hides entire page with opacity:0 (legacy).\n * - \"off\": no-op.\n * Scoped mode is a no-op when no selectors are available.\n *\n * Progressive reveal: at 80% of timeout, scoped mode reveals its selectors.\n * Full mode stays hidden and only pre-arms its opacity transition.\n */\nexport function applyAntiFlicker(\n mode: AntiFlickerMode = \"scoped\",\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n scopedSelectors?: string[],\n customCss?: string,\n bootedTooLate = false,\n): boolean {\n if (bootedTooLate) return false;\n const ownerDocument = activeDocument();\n if (!ownerDocument) return false;\n const root = ownerDocument.documentElement;\n // Remove state left by older SDK embeds without ever adding root classes.\n root.classList.remove(\"drip-af\", \"drip-af-reveal\");\n const existingStyle = ownerDocument.getElementById(STYLE_ID);\n // A live barrier owns its current timers. During the short reveal cleanup\n // window, however, network config or re-init may need to arm a fresh barrier\n // immediately against the same document.\n if (existingStyle && cleanupTimer === null) return true;\n const css = resolveAntiFlickerCss(mode, scopedSelectors, customCss);\n if (!css) return false;\n clearTimers();\n if (antiFlickerOwnerDocument && antiFlickerOwnerDocument !== ownerDocument) {\n cleanupDocumentImmediately(antiFlickerOwnerDocument);\n }\n antiFlickerOwnerDocument = ownerDocument;\n antiFlickerProgressiveCss = resolveAntiFlickerProgressiveCss(mode, scopedSelectors);\n antiFlickerRevealCss = resolveAntiFlickerRevealCss(mode, scopedSelectors);\n\n const style = existingStyle ?? ownerDocument.createElement(\"style\");\n style.id = STYLE_ID;\n\n style.textContent = css;\n\n if (!style.isConnected) (ownerDocument.head || root).appendChild(style);\n\n // At 80%, scoped mode reveals while full mode only pre-arms its transition.\n const progressiveMs = Math.round(timeoutMs * PROGRESSIVE_REVEAL_RATIO);\n progressiveRevealTimer = setTimeout(() => {\n progressiveRevealTimer = null;\n style.textContent = antiFlickerProgressiveCss;\n }, progressiveMs);\n\n // Hard timeout: fully remove anti-flicker\n hardRevealTimer = setTimeout(() => {\n hardRevealTimer = null;\n removeAntiFlickerFrom(ownerDocument);\n }, timeoutMs);\n return true;\n}\n\n/**\n * Runtime-loaded SDKs must not introduce a hiding barrier after the browser\n * has likely painted. Inline edge bootstrap callers deliberately do not opt\n * into this guard because their barrier is installed synchronously pre-paint.\n */\nexport function bootedTooLateForAntiFlicker(): boolean {\n if (typeof performance === \"undefined\") return false;\n\n try {\n const now = performance.now();\n const paintEntries = performance.getEntriesByType?.(\"paint\") ?? [];\n if (paintEntries.some((entry) =>\n (entry.name === \"first-paint\" || entry.name === \"first-contentful-paint\")\n && entry.startTime <= now - PAINT_TIMING_EPSILON_MS\n )) return true;\n\n const navigation = performance.getEntriesByType?.(\"navigation\")?.[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (navigation) {\n if (now - navigation.startTime > MAX_NAVIGATION_AGE_MS) return true;\n return navigation.domContentLoadedEventEnd > 0\n && now - navigation.domContentLoadedEventEnd > MAX_POST_DOM_CONTENT_LOADED_MS;\n }\n\n const timing = performance.timing;\n if (!timing?.navigationStart) return false;\n const wallNow = Date.now();\n if (wallNow - timing.navigationStart > MAX_NAVIGATION_AGE_MS) return true;\n return timing.domContentLoadedEventEnd > 0\n && wallNow - timing.domContentLoadedEventEnd > MAX_POST_DOM_CONTENT_LOADED_MS;\n } catch {\n return false;\n }\n}\n\nfunction removeAntiFlickerFrom(ownerDocument: Document | null): void {\n clearTimers();\n if (!ownerDocument?.documentElement) return;\n const root = ownerDocument.documentElement;\n root.classList.remove(\"drip-af\", \"drip-af-reveal\");\n const el = ownerDocument.getElementById(STYLE_ID);\n if (el) el.textContent = antiFlickerRevealCss;\n // Remove the style after the existing transition cleanup window completes.\n cleanupTimer = setTimeout(() => {\n cleanupTimer = null;\n el?.remove();\n root.classList.remove(\"drip-af\", \"drip-af-reveal\");\n if (antiFlickerOwnerDocument === ownerDocument) {\n antiFlickerOwnerDocument = null;\n antiFlickerProgressiveCss = \"\";\n antiFlickerRevealCss = \"\";\n }\n }, REVEAL_CLEANUP_MS);\n}\n\nexport function removeAntiFlicker(): void {\n removeAntiFlickerFrom(antiFlickerOwnerDocument ?? activeDocument());\n}\n", "export function decodeCompactStore(raw: string | null, width: 2 | 3): Record<string, unknown[]> {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n const out: Record<string, unknown[]> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!Array.isArray(value) || value.length < width || typeof value[0] !== \"string\" || typeof value[1] !== \"number\" || (width === 3 && typeof value[2] !== \"number\")) continue;\n out[key] = value;\n }\n return out;\n } catch {\n return {};\n }\n}\n", "import { decodeCompactStore } from \"./compact-store\";\n\nexport type PersistedAssignmentRecord = { variationId: string; epoch: number; assignedAt: number };\nexport type PersistedGroupSelection = { experimentId: string; epoch: number };\nexport type CompactGroupSelections = Record<string, [string, number]>;\n\nexport function decodePersistedAssignments(local: string | null, cookie: string | null): Record<string, PersistedAssignmentRecord> {\n const compact = { ...decodeCompactStore(cookie, 3), ...decodeCompactStore(local, 3) };\n const out: Record<string, PersistedAssignmentRecord> = {};\n for (const [id, value] of Object.entries(compact)) out[id] = {\n variationId: value[0] as string, epoch: value[1] as number, assignedAt: value[2] as number,\n };\n return out;\n}\n\nexport function decodePersistedGroupSelections(local: string | null, cookie: string | null): CompactGroupSelections {\n return { ...decodeCompactStore(local, 2), ...decodeCompactStore(cookie, 2) } as CompactGroupSelections;\n}\n", "import type { Experiment, Variation } from \"./types\";\nimport { decodeCompactStore } from \"./compact-store\";\nimport { decodePersistedAssignments, type PersistedAssignmentRecord } from \"./persistence-decoders\";\nexport { decodePersistedAssignments, type PersistedAssignmentRecord } from \"./persistence-decoders\";\n\nconst STORAGE_KEY = \"drip_assignments_v1\"; // gitleaks:allow \u2014 public storage key name, not a credential\nconst COOKIE_NAME = \"drip_assignments_v1\";\nconst MAX_ENTRIES = 80;\nconst MAX_COOKIE_ENTRIES = 20;\nconst COOKIE_MAX_AGE_SECONDS = 365 * 24 * 60 * 60;\n\ntype CompactRecord = [string, number, number];\ntype CompactStore = Record<string, CompactRecord>;\n\nfunction assignmentEpoch(experiment: Experiment): number {\n return Number.isFinite(experiment.assignmentEpoch)\n ? Math.max(1, Math.floor(experiment.assignmentEpoch as number))\n : 1;\n}\n\nfunction readLocalStorage(): string | null {\n try {\n return globalThis.localStorage?.getItem(STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocalStorage(value: string): void {\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // Ignore storage failures; cookie fallback is best effort.\n }\n}\n\nfunction readCookie(): string | null {\n try {\n const cookie = globalThis.document?.cookie ?? \"\";\n const match = cookie.match(new RegExp(\"(^| )\" + COOKIE_NAME + \"=([^;]+)\"));\n return match ? decodeURIComponent(match[2]) : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCookie(value: string): void {\n try {\n if (!globalThis.document) return;\n globalThis.document.cookie =\n COOKIE_NAME +\n \"=\" +\n encodeURIComponent(value) +\n \"; Max-Age=\" +\n COOKIE_MAX_AGE_SECONDS +\n \"; Path=/; SameSite=Lax\";\n } catch {\n // Ignore cookie failures.\n }\n}\n\nfunction clearCookie(): void {\n try {\n if (!globalThis.document) return;\n globalThis.document.cookie =\n COOKIE_NAME + \"=; Max-Age=0; Path=/; SameSite=Lax\";\n } catch {\n // Ignore cookie failures.\n }\n}\n\nexport function decodeCompactAssignmentStore(raw: string | null): CompactStore {\n return decodeCompactStore(raw, 3) as CompactStore;\n}\n\nfunction serializeStore(store: CompactStore, maxEntries = MAX_ENTRIES): string {\n const entries = Object.entries(store)\n .sort(([, a], [, b]) => b[2] - a[2])\n .slice(0, maxEntries);\n // Object.fromEntries is ES2019; the SDK lib target predates it.\n const trimmed: CompactStore = {};\n for (const [experimentId, record] of entries) {\n trimmed[experimentId] = record;\n }\n return JSON.stringify(trimmed);\n}\n\nexport function readPersistedAssignments(): Record<string, PersistedAssignmentRecord> {\n return decodePersistedAssignments(readLocalStorage(), readCookie());\n}\n\nexport function writePersistedAssignments(\n records: Record<string, PersistedAssignmentRecord>,\n): void {\n const compact: CompactStore = {};\n for (const [experimentId, record] of Object.entries(records)) {\n compact[experimentId] = [record.variationId, record.epoch, record.assignedAt];\n }\n writeLocalStorage(serializeStore(compact, MAX_ENTRIES));\n writeCookie(serializeStore(compact, MAX_COOKIE_ENTRIES));\n}\n\nexport function clearPersistedAssignments(): void {\n try {\n globalThis.localStorage?.removeItem(STORAGE_KEY);\n } catch {\n // Ignore storage failures.\n }\n clearCookie();\n}\n\nexport function prunePersistedAssignments(\n experiments: Experiment[],\n records = readPersistedAssignments(),\n): Record<string, PersistedAssignmentRecord> {\n const allowed = new Set(experiments.map((experiment) => experiment.id));\n let changed = false;\n for (const experimentId of Object.keys(records)) {\n if (!allowed.has(experimentId)) {\n delete records[experimentId];\n changed = true;\n }\n }\n if (changed) writePersistedAssignments(records);\n return records;\n}\n\nexport function findPersistedVariation(\n experiment: Experiment,\n records = readPersistedAssignments(),\n): { variation: Variation; index: number; record: PersistedAssignmentRecord } | null {\n const record = records[experiment.id];\n if (!record) return null;\n if (record.epoch !== assignmentEpoch(experiment)) return null;\n const index = experiment.variations.findIndex(\n (variation) => variation.id === record.variationId,\n );\n if (index < 0) return null;\n return { variation: experiment.variations[index], index, record };\n}\n\nexport function persistAssignmentForExperiment(\n experiment: Experiment,\n variationId: string,\n assignedAt = Date.now(),\n): PersistedAssignmentRecord {\n const records = readPersistedAssignments();\n const record = {\n variationId,\n epoch: assignmentEpoch(experiment),\n assignedAt,\n };\n records[experiment.id] = record;\n writePersistedAssignments(records);\n return record;\n}\n\nexport function removePersistedAssignmentsForExperiments(\n experimentIds: Iterable<string>,\n): void {\n const records = readPersistedAssignments();\n let changed = false;\n for (const experimentId of experimentIds) {\n if (!(experimentId in records)) continue;\n delete records[experimentId];\n changed = true;\n }\n if (changed) writePersistedAssignments(records);\n}\n\nexport const __assignmentStoreInternals = {\n STORAGE_KEY,\n COOKIE_NAME,\n assignmentEpoch,\n parseStore: decodeCompactAssignmentStore,\n serializeStore,\n};\n", "export const ASSIGNMENT_SYNC_COOKIE_NAME = \"drip_assignment_sync_v1\";\nexport const ASSIGNMENT_SYNC_COOKIE_MAX_AGE_SECONDS = 7_200;\nexport const ASSIGNMENT_SYNC_COOKIE_MAX_BYTES = 3_800;\n\nexport type AssignmentSyncPayload = {\n visitorId: string | null;\n sessionId: string;\n cartToken?: string;\n qaMode: boolean;\n qaSessionId: string;\n cohort?: \"holdout\" | \"active\";\n holdoutConfigEpoch?: number;\n assignments: Array<{\n experimentId: string;\n variationId: string;\n assignmentEpoch?: number;\n }>;\n};\n\nexport type AssignmentSyncCookieWriteResult = {\n written: boolean;\n assignmentCount: number;\n truncatedAssignmentCount: number;\n encodedBytes: number;\n domain?: string;\n reason?: \"document_unavailable\" | \"visitor_id_missing\" | \"cookie_too_large\" | \"cookie_write_failed\";\n};\n\ntype CookieDocument = Pick<Document, \"cookie\">;\n\nfunction encodeStoredAssignmentAt(data: AssignmentSyncPayload, storedAt: number): string {\n return btoa(JSON.stringify({ storedAt, data }))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function encodeStoredAssignment(data: AssignmentSyncPayload): string {\n return encodeStoredAssignmentAt(data, Date.now());\n}\n\nfunction hasCookie(documentRef: CookieDocument, name: string, value: string): boolean {\n return documentRef.cookie\n .split(\";\")\n .some((part) => part.trim() === `${name}=${value}`);\n}\n\nfunction isIpv4(hostname: string): boolean {\n const parts = hostname.split(\".\");\n return parts.length === 4 && parts.every((part) => {\n if (!/^\\d{1,3}$/.test(part)) return false;\n const value = Number(part);\n return value >= 0 && value <= 255;\n });\n}\n\nfunction isIpHost(hostname: string): boolean {\n const unbracketed = hostname.replace(/^\\[|\\]$/g, \"\");\n return isIpv4(unbracketed) || unbracketed.includes(\":\");\n}\n\nfunction cookieAttributes(domain?: string): string {\n return `Path=/; SameSite=Lax; Secure${domain ? `; Domain=.${domain}` : \"\"}`;\n}\n\nexport function discoverRegistrableDomain(\n hostname: string,\n documentRef: CookieDocument,\n): string | undefined {\n const normalized = hostname.trim().replace(/\\.$/, \"\").toLowerCase();\n if (!normalized || normalized === \"localhost\" || normalized.endsWith(\".localhost\") || isIpHost(normalized)) {\n return undefined;\n }\n\n const labels = normalized.split(\".\").filter(Boolean);\n if (labels.length < 2) return undefined;\n\n const probeName = \"__drip_assignment_domain_probe\";\n const probeValue = Date.now().toString(36);\n for (let start = labels.length - 2; start >= 0; start -= 1) {\n const candidate = labels.slice(start).join(\".\");\n const attributes = cookieAttributes(candidate);\n try {\n documentRef.cookie = `${probeName}=${probeValue}; Max-Age=5; ${attributes}`;\n const accepted = hasCookie(documentRef, probeName, probeValue);\n documentRef.cookie = `${probeName}=; Max-Age=0; ${attributes}`;\n if (accepted) return candidate;\n } catch {\n // Try the next longer suffix when this candidate is not writable.\n }\n }\n return undefined;\n}\n\nexport function writeAssignmentSyncCookie(\n payload: AssignmentSyncPayload,\n): AssignmentSyncCookieWriteResult {\n const originalAssignmentCount = payload.assignments.length;\n if (typeof document === \"undefined\" || typeof location === \"undefined\") {\n return {\n written: false,\n assignmentCount: originalAssignmentCount,\n truncatedAssignmentCount: 0,\n encodedBytes: 0,\n reason: \"document_unavailable\",\n };\n }\n if (!payload.visitorId) {\n return {\n written: false,\n assignmentCount: originalAssignmentCount,\n truncatedAssignmentCount: 0,\n encodedBytes: 0,\n reason: \"visitor_id_missing\",\n };\n }\n\n try {\n const storedAt = Date.now();\n let assignments = payload.assignments.slice();\n let encoded = encodeStoredAssignmentAt({ ...payload, assignments }, storedAt);\n while (encoded.length > ASSIGNMENT_SYNC_COOKIE_MAX_BYTES && assignments.length > 0) {\n assignments = assignments.slice(1);\n encoded = encodeStoredAssignmentAt({ ...payload, assignments }, storedAt);\n }\n\n const truncatedAssignmentCount = originalAssignmentCount - assignments.length;\n if (encoded.length > ASSIGNMENT_SYNC_COOKIE_MAX_BYTES) {\n return {\n written: false,\n assignmentCount: assignments.length,\n truncatedAssignmentCount,\n encodedBytes: encoded.length,\n reason: \"cookie_too_large\",\n };\n }\n\n const domain = discoverRegistrableDomain(location.hostname, document);\n document.cookie = `${ASSIGNMENT_SYNC_COOKIE_NAME}=${encoded}; Max-Age=${ASSIGNMENT_SYNC_COOKIE_MAX_AGE_SECONDS}; ${cookieAttributes(domain)}`;\n if (!hasCookie(document, ASSIGNMENT_SYNC_COOKIE_NAME, encoded)) {\n return {\n written: false,\n assignmentCount: assignments.length,\n truncatedAssignmentCount,\n encodedBytes: encoded.length,\n reason: \"cookie_write_failed\",\n };\n }\n return {\n written: true,\n assignmentCount: assignments.length,\n truncatedAssignmentCount,\n encodedBytes: encoded.length,\n ...(domain ? { domain } : {}),\n };\n } catch {\n return {\n written: false,\n assignmentCount: originalAssignmentCount,\n truncatedAssignmentCount: 0,\n encodedBytes: 0,\n reason: \"cookie_write_failed\",\n };\n }\n}\n\nexport function clearAssignmentSyncCookie(): void {\n if (typeof document === \"undefined\" || typeof location === \"undefined\") return;\n try {\n // No `Secure` on the expiry: deletion matches name+domain+path only, and a\n // Secure-attributed write would be dropped on http origins, leaving the\n // cookie behind exactly where the purge matters.\n const expire = `${ASSIGNMENT_SYNC_COOKIE_NAME}=; Max-Age=0; Path=/; SameSite=Lax`;\n // Host-only first, then every candidate registrable-domain suffix. Deleting\n // with a Domain the cookie was never set on is a no-op, so sweeping all\n // suffixes removes the cookie without re-probing which one was used.\n document.cookie = expire;\n const normalized = location.hostname.trim().replace(/\\.$/, \"\").toLowerCase();\n if (!normalized || normalized === \"localhost\" || normalized.endsWith(\".localhost\") || isIpHost(normalized)) {\n return; // Host-only expiry is sufficient; the write path never sets Domain here.\n }\n const labels = normalized.split(\".\").filter(Boolean);\n for (let start = labels.length - 2; start >= 0; start -= 1) {\n document.cookie = `${expire}; Domain=.${labels.slice(start).join(\".\")}`;\n }\n } catch {\n // Best effort: consent purge must never throw.\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", "export type SynchronousConsentInput = {\n requireConsent?: boolean;\n hasConsent?: boolean;\n consentModeEnabled?: boolean;\n configuredConsentGranted?: boolean | null;\n consentCookieGranted: boolean;\n respectDoNotTrack?: boolean;\n doNotTrackValue?: string;\n};\n\nexport type ConsentProvider = \"custom\" | \"onetrust\" | \"usercentrics\" | \"cookiebot\" | \"ccm19\" | \"pandectes\" | \"cookiescript\" | \"borlabs\";\n\nexport function readPath(root: unknown, path?: string): unknown {\n let current = root as Record<string, unknown> | undefined;\n for (const part of (path ?? \"\").split(\".\").map((item) => item.trim()).filter(Boolean)) {\n if (!current || typeof current !== \"object\") return undefined;\n current = current[part] as Record<string, unknown> | undefined;\n }\n return current;\n}\n\nfunction tokenMatches(value: unknown, required: string): boolean {\n return value != null && String(value).trim().toLowerCase() === required.trim().toLowerCase();\n}\n\nexport function readConsentCookie(name: string): string {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|;)\\\\s*\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : \"\";\n } catch { return \"\"; }\n}\n\n/** The SDK's synchronous native-CMP readers, shared with the pre-SDK capture fragment. */\nexport function readConfiguredConsent(provider?: ConsentProvider, requiredGroup?: string, getter?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n if (provider === \"cookiescript\") return readCookieScriptConsent(requiredGroup);\n if (provider === \"borlabs\") return readBorlabsConsent(requiredGroup);\n if (provider === \"usercentrics\") {\n const uc = root.UC_UI ?? root.window?.UC_UI;\n if (typeof uc?.getServicesBaseInfo !== \"function\") return null;\n let services: unknown;\n try { services = uc.getServicesBaseInfo(); } catch { return null; }\n if (!Array.isArray(services)) return null;\n const required = requiredGroup?.trim() || \"Apex\";\n const service = services.find((item) => item && typeof item === \"object\" &&\n [\"name\", \"id\", \"serviceId\", \"templateId\", \"dataProcessor\", \"dataProcessorName\"]\n .some((key) => tokenMatches((item as Record<string, unknown>)[key], required))) as Record<string, any> | undefined;\n return service ? service.consent?.status === true || service.consentStatus === true || service.status === true : false;\n }\n if (provider === \"cookiebot\") {\n const consent = (root.Cookiebot ?? root.window?.Cookiebot)?.consent;\n if (!consent || typeof consent !== \"object\") return null;\n const aliases: Record<string, string> = { analytics: \"statistics\", stats: \"statistics\", statistic: \"statistics\", preference: \"preferences\" };\n const key = aliases[(requiredGroup?.trim() || \"statistics\").toLowerCase()] || (requiredGroup?.trim() || \"statistics\").toLowerCase();\n return typeof consent[key] === \"boolean\" ? consent[key] : false;\n }\n if (provider === \"ccm19\") {\n const embeddings = (root.CCM ?? root.window?.CCM)?.acceptedEmbeddings;\n if (!Array.isArray(embeddings)) return null;\n const required = requiredGroup?.trim() || \"Apex\";\n return embeddings.some((item) => item && typeof item === \"object\" &&\n (tokenMatches((item as any).name, required) || (item as any).id === required));\n }\n if (provider === \"pandectes\") {\n const purpose = (requiredGroup?.trim() || \"analytics\").toLowerCase();\n const method = ({ analytics: \"analyticsProcessingAllowed\", statistics: \"analyticsProcessingAllowed\", statistic: \"analyticsProcessingAllowed\", stats: \"analyticsProcessingAllowed\", marketing: \"marketingAllowed\", preferences: \"preferencesProcessingAllowed\", preference: \"preferencesProcessingAllowed\", sale_of_data: \"saleOfDataAllowed\", saleofdata: \"saleOfDataAllowed\", \"sale-of-data\": \"saleOfDataAllowed\", sale: \"saleOfDataAllowed\" } as Record<string, string>)[purpose];\n if (!method) return false;\n for (const source of [root.Pandectes ?? root.window?.Pandectes, root.Shopify?.customerPrivacy ?? root.window?.Shopify?.customerPrivacy]) {\n try { const value = source?.[method]?.(); if (typeof value === \"boolean\") return value; } catch {}\n }\n return null;\n }\n if (provider === \"onetrust\" || provider === \"custom\" || getter) {\n const raw = readPath(root, getter ?? \"OnetrustActiveGroups\");\n if (typeof raw === \"boolean\") return raw;\n if (raw == null) return null;\n const required = requiredGroup;\n if (!required) return raw != null && String(raw).trim() !== \"\";\n if (Array.isArray(raw)) return raw.map(String).includes(required);\n if (typeof raw === \"string\") return raw.split(\",\").map((item) => item.trim()).filter(Boolean).includes(required);\n return raw == null ? null : false;\n }\n return null;\n}\n\nexport function readBorlabsConsent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const borlabs = root.BorlabsCookie ?? root.window?.BorlabsCookie;\n if (!borlabs) return null;\n const required = requiredGroup?.trim() || \"statistics\";\n const consents = borlabs.Consents;\n try { if (typeof consents?.hasConsent === \"function\" && consents.hasConsent(required)) return true; } catch {}\n try { if (typeof consents?.hasConsentForServiceGroup === \"function\") return Boolean(consents.hasConsentForServiceGroup(required)); } catch {}\n try { if (typeof borlabs.checkCookieConsent === \"function\") return Boolean(borlabs.checkCookieConsent(required)); } catch {}\n return null;\n}\n\nexport function readCookieScriptConsent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const requested = (requiredGroup?.trim() || \"analytics\").toLowerCase();\n const aliases: Record<string, string> = {\n analytics: \"performance\", statistics: \"performance\", statistic: \"performance\", stats: \"performance\",\n marketing: \"targeting\", advertising: \"targeting\", ads: \"targeting\", functional: \"functionality\",\n preferences: \"functionality\", preference: \"functionality\", necessary: \"strict\", essential: \"strict\",\n };\n const required = aliases[requested] || requested;\n const instance = root.CookieScript?.instance\n ?? (root.window as Record<string, any> | undefined)?.CookieScript?.instance;\n let currentState: unknown;\n if (instance && typeof instance === \"object\" && typeof instance.currentState === \"function\") {\n try { currentState = instance.currentState(); } catch {}\n }\n if (!currentState || typeof currentState !== \"object\" || Array.isArray(currentState)) {\n try {\n currentState = JSON.parse(readConsentCookie(\"CookieScriptConsent\"));\n const categories = (currentState as Record<string, unknown>).categories;\n if (typeof categories === \"string\") (currentState as Record<string, unknown>).categories = JSON.parse(categories);\n } catch { return null; }\n }\n if (!currentState || typeof currentState !== \"object\" || Array.isArray(currentState)) return null;\n const consent = currentState as Record<string, unknown>;\n if (consent.action === \"reject\") return false;\n if (consent.action !== \"accept\") return null;\n const categories = consent.categories;\n if (!Array.isArray(categories)) return false;\n return categories.some((item) => String(item).toLowerCase() === required);\n}\n\nexport const CONSENT_REQUIRED = 1;\nexport const CONSENT_GRANTED = 2;\nexport const DNT_BLOCKED = 4;\nexport const STORAGE_ALLOWED = 8;\n\nexport function resolveSynchronousConsentGranted(input: SynchronousConsentInput & { provider?: ConsentProvider }): boolean {\n return Boolean(evaluateSynchronousConsentForProvider(input) & CONSENT_GRANTED);\n}\n\nexport function evaluateSynchronousConsentForProvider(input: SynchronousConsentInput & { provider?: ConsentProvider }): number {\n const configured = input.configuredConsentGranted\n ?? (input.provider === \"cookiescript\" ? false : null);\n return evaluateSynchronousConsent({ ...input, configuredConsentGranted: configured });\n}\n\n/** Pure synchronous consent/DNT bitmask shared by SDK init and the inline bootstrap. */\nexport function evaluateSynchronousConsent(input: SynchronousConsentInput): number {\n const required = input.requireConsent === true || typeof input.hasConsent === \"boolean\" || input.consentModeEnabled === true;\n const granted = !required || (typeof input.hasConsent === \"boolean\" ? input.hasConsent : input.configuredConsentGranted ?? input.consentCookieGranted);\n const value = (input.doNotTrackValue ?? \"\").toLowerCase();\n const dnt = input.respectDoNotTrack === true && (value === \"1\" || value === \"yes\");\n return (required ? CONSENT_REQUIRED : 0) | (granted ? CONSENT_GRANTED : 0) | (dnt ? DNT_BLOCKED : 0) | (granted && !dnt ? STORAGE_ALLOWED : 0);\n}\n", "export type StorefrontVitalsContext = {\n endpoint: string;\n proxyEventDelivery?: { enabled: boolean; path?: string };\n shopId: string;\n ingestShopId?: string;\n ingestSignature?: string;\n visitorId?: string;\n sampleRate?: number;\n experimentActive: boolean;\n sdkBootToInitMs?: number;\n getAntiFlickerInsertedToRevealMs?: () => number | undefined;\n sdkInitStartToAssignmentReadyMs?: number;\n};\n\ntype LayoutShift = PerformanceEntry & { value?: number; hadRecentInput?: boolean };\ntype EventTiming = PerformanceEntry & { duration?: number; interactionId?: number };\ntype LargestPaint = PerformanceEntry & { renderTime?: number; loadTime?: number };\n\nconst observers: Array<{ observer: PerformanceObserver; consume: (entries: PerformanceEntry[]) => void }> = [];\nlet cleanup: (() => void) | null = null;\nlet pageSampleDecision: boolean | undefined;\n\nfunction finite(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nexport type VitalRating = \"good\" | \"needs-improvement\" | \"poor\";\n\n// Google CWV thresholds (web.dev): the same buckets PageSpeed reports, so\n// dashboards and alerts can read a rating without re-deriving thresholds.\nconst RATING_THRESHOLDS: Record<string, [number, number]> = {\n lcp_ms: [2_500, 4_000],\n inp_ms: [200, 500],\n cls: [0.1, 0.25],\n ttfb_ms: [800, 1_800],\n};\n\nexport function rateVital(metric: keyof typeof RATING_THRESHOLDS, value: number | undefined): VitalRating | undefined {\n const thresholds = RATING_THRESHOLDS[metric];\n if (!thresholds || value === undefined) return undefined;\n return value <= thresholds[0] ? \"good\" : value <= thresholds[1] ? \"needs-improvement\" : \"poor\";\n}\n\nfunction navigationTtfb(): number | undefined {\n try {\n const navigation = performance.getEntriesByType(\"navigation\")[0] as PerformanceNavigationTiming | undefined;\n return finite(navigation?.responseStart);\n } catch {\n return undefined;\n }\n}\n\n/** Starts one dependency-free, observer-only storefront vitals sample. */\nexport function startStorefrontVitals(context: StorefrontVitalsContext, random = Math.random): void {\n stopStorefrontVitals();\n const rate = finite(context.sampleRate) ?? 0.1;\n if (pageSampleDecision === undefined) pageSampleDecision = rate > 0 && (rate >= 1 || random() < rate);\n if (!pageSampleDecision || !context.endpoint || !context.shopId || typeof document === \"undefined\") return;\n\n let flushed = false;\n let lcpMs: number | undefined;\n let cls = 0;\n let clsSupported = false;\n let clsWindow = 0;\n let clsWindowStart = 0;\n let clsLastShift = 0;\n const interactions = new Map<number, number>();\n\n const observe = (type: string, callback: (entries: PerformanceEntry[]) => void, options?: PerformanceObserverInit): boolean => {\n if (typeof PerformanceObserver === \"undefined\") return false;\n try {\n const observer = new PerformanceObserver((list) => callback(list.getEntries()));\n observer.observe(options ?? { type, buffered: true });\n observers.push({ observer, consume: callback });\n return true;\n } catch {\n // Unsupported entry types are expected on older browsers.\n return false;\n }\n };\n\n observe(\"largest-contentful-paint\", (entries) => {\n const last = entries[entries.length - 1] as LargestPaint | undefined;\n if (last) {\n // Cross-origin LCP resources can expose renderTime as zero. A real LCP\n // cannot occur at navigation start, so use the entry's effective time.\n lcpMs = (finite(last.renderTime) || undefined) ?? finite(last.loadTime) ?? finite(last.startTime);\n }\n });\n clsSupported = observe(\"layout-shift\", (entries) => {\n for (const raw of entries) {\n const entry = raw as LayoutShift;\n if (entry.hadRecentInput || finite(entry.value) === undefined) continue;\n if (entry.startTime - clsLastShift > 1_000 || entry.startTime - clsWindowStart > 5_000) {\n clsWindow = 0;\n clsWindowStart = entry.startTime;\n }\n clsWindow += entry.value!;\n clsLastShift = entry.startTime;\n cls = Math.max(cls, clsWindow);\n }\n });\n observe(\"event\", (entries) => {\n for (const raw of entries) {\n const entry = raw as EventTiming;\n const id = finite(entry.interactionId);\n const duration = finite(entry.duration);\n if (!id || duration === undefined) continue;\n // One interaction can produce multiple EventTiming entries. INP uses the\n // longest entry for that interaction, never a double-counted sum.\n interactions.set(id, Math.max(interactions.get(id) ?? 0, duration));\n }\n }, { type: \"event\", buffered: true, durationThreshold: 40 } as PerformanceObserverInit);\n\n const flush = () => {\n if (flushed) return;\n flushed = true;\n const ttfbMs = navigationTtfb();\n for (const { observer, consume } of observers.splice(0)) {\n try { consume(observer.takeRecords()); } catch {}\n observer.disconnect();\n }\n const interactionDurations = [...interactions.values()].sort((a, b) => b - a);\n // The CWV INP estimator ignores one extreme interaction per 50 observed\n // interactions, after first collapsing multiple EventTiming entries by ID.\n const inpMs = interactionDurations[Math.min(Math.floor(interactionDurations.length / 50), interactionDurations.length - 1)];\n const sample = {\n _shopId: context.ingestShopId ?? context.shopId,\n _signature: context.ingestSignature,\n shop_id: context.shopId,\n visitor_id: context.visitorId,\n url: location.origin + location.pathname,\n path: location.pathname,\n lcp_ms: lcpMs,\n inp_ms: inpMs,\n cls: clsSupported ? Math.round(cls * 100_000) / 100_000 : undefined,\n ttfb_navigation_start_to_response_start_ms: ttfbMs,\n lcp_rating: rateVital(\"lcp_ms\", lcpMs),\n inp_rating: rateVital(\"inp_ms\", inpMs),\n cls_rating: clsSupported ? rateVital(\"cls\", cls) : undefined,\n ttfb_rating: rateVital(\"ttfb_ms\", ttfbMs),\n experiment_active: context.experimentActive,\n sdk_boot_to_init_start_ms: context.sdkBootToInitMs,\n // Reveal can happen well after initialization (hydration/deferred holds),\n // so resolve this live rather than freezing an incomplete init snapshot.\n anti_flicker_inserted_to_reveal_ms: context.getAntiFlickerInsertedToRevealMs?.(),\n sdk_init_start_to_assignment_ready_ms: context.sdkInitStartToAssignmentReadyMs,\n timestamp: new Date().toISOString(),\n };\n const payload = JSON.stringify(sample);\n const endpoint = context.endpoint.replace(/\\/+$/, \"\") + \"/storefront-vitals\";\n const proxyEndpoint = context.proxyEventDelivery?.enabled === true && typeof location?.origin === \"string\"\n ? `${location.origin}/apps/apex/storefront-vitals`\n : null;\n const downgradedPayload = () => JSON.stringify({ ...sample, delivery_downgrade: \"proxy_failed\" });\n\n if (proxyEndpoint) {\n try {\n if (navigator.sendBeacon) {\n if (navigator.sendBeacon(proxyEndpoint, new Blob([payload], { type: \"text/plain\" }))) return;\n const directPayload = downgradedPayload();\n if (navigator.sendBeacon(endpoint, new Blob([directPayload], { type: \"text/plain\" }))) return;\n try { void fetch(endpoint, { method: \"POST\", body: directPayload, headers: { \"Content-Type\": \"text/plain\" }, keepalive: true }); } catch {}\n return;\n }\n } catch {\n const directPayload = downgradedPayload();\n try {\n if (navigator.sendBeacon?.(endpoint, new Blob([directPayload], { type: \"text/plain\" }))) return;\n } catch {}\n try { void fetch(endpoint, { method: \"POST\", body: directPayload, headers: { \"Content-Type\": \"text/plain\" }, keepalive: true }); } catch {}\n return;\n }\n void fetch(proxyEndpoint, {\n method: \"POST\", body: payload, headers: { \"Content-Type\": \"text/plain\" }, keepalive: true,\n }).then((response) => {\n if (!response.ok) throw new Error(`Proxy storefront vitals returned ${response.status}`);\n }).catch(() => fetch(endpoint, {\n method: \"POST\", body: downgradedPayload(), headers: { \"Content-Type\": \"text/plain\" }, keepalive: true,\n })).catch(() => undefined);\n return;\n }\n try {\n if (navigator.sendBeacon?.(endpoint, new Blob([payload], { type: \"text/plain\" }))) return;\n } catch {}\n try { void fetch(endpoint, { method: \"POST\", body: payload, headers: { \"Content-Type\": \"text/plain\" }, keepalive: true }); } catch {}\n };\n const onVisibility = () => { if (document.visibilityState === \"hidden\") flush(); };\n document.addEventListener(\"visibilitychange\", onVisibility);\n window.addEventListener(\"pagehide\", flush, { once: true });\n cleanup = () => {\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\"pagehide\", flush);\n };\n}\n\nexport function stopStorefrontVitals(): void {\n cleanup?.();\n cleanup = null;\n for (const { observer } of observers.splice(0)) observer.disconnect();\n}\n\nexport function resetStorefrontVitalsForTest(): void {\n stopStorefrontVitals();\n pageSampleDecision = undefined;\n}\n", "// 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", "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", "const BOT_RE = /bot|google|crawler|spider|robot|crawling|facebookexternalhit|bingpreview|slurp/i;\n\nexport function isBot(): boolean {\n return BOT_RE.test(navigator.userAgent);\n}\n\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport function isDuplicate(): boolean {\n if ((globalThis as Record<string, unknown>).__drip) return true;\n (globalThis as Record<string, unknown>).__drip = true;\n return false;\n}\n\nexport function isOptedOut(options?: { storageAllowed?: boolean }): boolean {\n const storageAllowed = options?.storageAllowed !== false;\n const param = new URLSearchParams(location.search).get(\"drip_optout\");\n if (param === \"true\") {\n if (storageAllowed) {\n try {\n localStorage.setItem(\"drip_optout\", \"1\");\n } catch {}\n }\n return true;\n }\n if (param === \"false\") {\n if (storageAllowed) {\n try {\n localStorage.removeItem(\"drip_optout\");\n } catch {}\n }\n return false;\n }\n if (!storageAllowed) return false;\n try {\n return localStorage.getItem(\"drip_optout\") === \"1\";\n } catch {\n return false;\n }\n}\n\nexport function isScreenshotMode(): boolean {\n const param = new URLSearchParams(location.search).get(\"drip_screenshot\");\n return param === \"1\" || param === \"true\";\n}\n\nconst FORCE_EXPERIMENT_PARAM_NAMES = [\n \"drip_experiment_id\",\n \"drip_experiment\",\n \"experiment_id\",\n \"experimentId\",\n \"expId\",\n];\n\nconst FORCE_VARIATION_PARAM_NAMES = [\n \"drip_variation_id\",\n \"drip_variation\",\n \"variation_id\",\n \"variationId\",\n \"varId\",\n];\n\nfunction readFirstParam(params: URLSearchParams, names: string[]): string | null {\n for (const name of names) {\n const value = params.get(name)?.trim();\n if (value) return value;\n }\n return null;\n}\n\nfunction parseForceParams(params: URLSearchParams): Record<string, string> | null {\n const param = params.get(\"drip_force\");\n if (param !== null) {\n if (param.trim().toLowerCase() === \"clear\") return null;\n return parseForceString(param);\n }\n\n const experimentId = readFirstParam(params, FORCE_EXPERIMENT_PARAM_NAMES);\n const variationId = readFirstParam(params, FORCE_VARIATION_PARAM_NAMES);\n if (experimentId && variationId) {\n return { [experimentId]: variationId };\n }\n return null;\n}\n\nexport function hasExplicitForceParam(): boolean {\n return parseForceParams(new URLSearchParams(location.search)) !== null;\n}\n\nexport function clearQaForceFromUrl(): boolean {\n const force = new URLSearchParams(location.search).get(\"drip_force\")?.trim().toLowerCase();\n if (force !== \"clear\") return false;\n exitQaMode();\n return true;\n}\n\nfunction isDebugQaParam(params: URLSearchParams): boolean {\n return (\n params.get(\"drip_debug\") === \"1\" ||\n params.get(\"apex_debug\") === \"1\" ||\n params.get(\"drip_devtools\") === \"1\"\n );\n}\n\nexport function parseForceParam(): Record<string, string> | null {\n // Check URL param first\n const params = new URLSearchParams(location.search);\n const map = parseForceParams(params);\n if (map) return map;\n // A present canonical parameter is authoritative even when empty, cleared,\n // or malformed. In particular, `?drip_force=` must not resurrect a stale\n // QA force from the cookie.\n if (params.has(\"drip_force\")) return null;\n\n // Fallback to the functional QA cookie.\n const cookie = readCookie(\"drip_qa_force\");\n if (cookie) {\n const map = parseForceString(cookie);\n if (map) return map;\n }\n\n return null;\n}\n\nfunction parseForceString(value: string): Record<string, string> | null {\n const map: Record<string, string> = {};\n for (const pair of value.split(\",\")) {\n const [expId, varId] = pair.split(\":\");\n if (expId && varId) map[expId] = varId;\n }\n return Object.keys(map).length ? map : null;\n}\n\n// ---------------------------------------------------------------------------\n// QA mode detection and cookie persistence\n// ---------------------------------------------------------------------------\n\nconst QA_COOKIE = \"drip_qa_force\";\nconst QA_SESSION_STORAGE_KEY = \"drip_qa_session\";\nconst QA_COOKIE_MAX_AGE = 1800; // 30 minutes\n\nexport function isQaMode(): boolean {\n if (isScreenshotMode()) return false;\n const params = new URLSearchParams(location.search);\n const param = params.get(\"drip_qa\");\n if (param === \"1\") return true;\n if (isDebugQaParam(params) && parseForceParams(params)) return true;\n if (params.has(\"drip_force\")) return false;\n return !!readCookie(QA_COOKIE);\n}\n\n/**\n * Persist the force map in a cookie so QA sessions survive navigation.\n * Cookie expires at most 30 minutes after the latest QA page load or assistant force.\n */\nexport function persistQaForce(forceMap: Record<string, string>): void {\n const value = Object.entries(forceMap)\n .map(([k, v]) => `${k}:${v}`)\n .join(\",\");\n writeCookie(QA_COOKIE, value, QA_COOKIE_MAX_AGE);\n}\n\n/** Persist an explicit URL force or renew an existing cookie-backed force. */\nexport function persistUrlQaForce(forceMap: Record<string, string>): void {\n if (hasExplicitForceParam() || readCookie(QA_COOKIE)) persistQaForce(forceMap);\n}\n\nfunction sanitizeQaSessionId(value: string | null): string | null {\n if (!value) return null;\n const trimmed = value.trim();\n return /^[a-zA-Z0-9_-]{3,120}$/.test(trimmed) ? trimmed : null;\n}\n\nexport function getQaSessionId(fallback: () => string, options?: { storageAllowed?: boolean }): string {\n const storageAllowed = options?.storageAllowed !== false;\n const param = sanitizeQaSessionId(\n new URLSearchParams(location.search).get(\"drip_qa_session\"),\n );\n if (param) {\n if (storageAllowed) {\n try {\n sessionStorage.setItem(QA_SESSION_STORAGE_KEY, param);\n } catch {}\n }\n return param;\n }\n\n if (!storageAllowed) return fallback();\n\n try {\n const stored = sanitizeQaSessionId(sessionStorage.getItem(QA_SESSION_STORAGE_KEY));\n if (stored) return stored;\n const generated = fallback();\n sessionStorage.setItem(QA_SESSION_STORAGE_KEY, generated);\n return generated;\n } catch {\n return fallback();\n }\n}\n\n/**\n * Exit QA mode: clear the force cookie and remove drip_qa/drip_force from URL.\n */\nexport function exitQaMode(): void {\n deleteCookie(QA_COOKIE);\n try {\n sessionStorage.removeItem(QA_SESSION_STORAGE_KEY);\n } catch {}\n // Remove QA params from URL without reload\n try {\n const url = new URL(location.href);\n url.searchParams.delete(\"drip_qa\");\n url.searchParams.delete(\"drip_force\");\n url.searchParams.delete(\"drip_experiment_id\");\n url.searchParams.delete(\"drip_experiment\");\n url.searchParams.delete(\"experiment_id\");\n url.searchParams.delete(\"experimentId\");\n url.searchParams.delete(\"expId\");\n url.searchParams.delete(\"drip_variation_id\");\n url.searchParams.delete(\"drip_variation\");\n url.searchParams.delete(\"variation_id\");\n url.searchParams.delete(\"variationId\");\n url.searchParams.delete(\"varId\");\n url.searchParams.delete(\"drip_qa_session\");\n url.searchParams.delete(\"drip_harness\");\n url.searchParams.delete(\"drip_debug\");\n url.searchParams.delete(\"apex_debug\");\n history.replaceState(null, \"\", url.toString());\n } catch {}\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers\n// ---------------------------------------------------------------------------\n\nexport function readCookie(name: string): string | null {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : null;\n } catch {\n return null;\n }\n}\n\nexport function writeCookie(name: string, value: string, maxAge: number): void {\n try {\n document.cookie = `${name}=${encodeURIComponent(value)};path=/;max-age=${maxAge};samesite=lax`;\n } catch {}\n}\n\nexport function deleteCookie(name: string): void {\n try {\n document.cookie = `${name}=;path=/;max-age=0;samesite=lax`;\n } catch {}\n}\n\n/** @internal \u2014 exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n parseForceString,\n parseForceParams,\n sanitizeQaSessionId,\n BOT_RE,\n};\n", "import type { Assignment, ExclusionGroupConfig } from \"./types\";\nimport { hashToFloat } from \"./hash\";\nimport { chooseVariation } from \"./bucket\";\nimport { deleteCookie, readCookie, writeCookie } from \"./guards\";\nimport { decodeCompactStore } from \"./compact-store\";\nimport { decodePersistedGroupSelections, type PersistedGroupSelection } from \"./persistence-decoders\";\nexport { decodePersistedGroupSelections, type PersistedGroupSelection } from \"./persistence-decoders\";\n\nconst STORAGE_KEY = \"drip_xgroups_v1\"; // gitleaks:allow \u2014 public storage key name, not a credential\nconst COOKIE_NAME = \"drip_xgroups_v1\";\nconst COOKIE_MAX_AGE_SECONDS = 365 * 24 * 60 * 60;\n\n/** A remembered group decision: which member won and at what group epoch. */\n/** Pluggable persistence so the runtime uses browser storage and tests use memory. */\nexport interface GroupStickyStore {\n read(groupId: string): PersistedGroupSelection | null;\n write(groupId: string, selection: PersistedGroupSelection): void;\n}\n\ntype CompactSelection = [string, number];\ntype CompactStore = Record<string, CompactSelection>;\n\nfunction normalizeEpoch(epoch: number | null | undefined): number {\n return Number.isFinite(epoch) ? Math.max(1, Math.floor(epoch as number)) : 1;\n}\n\nexport function decodeCompactGroupStore(raw: string | null): CompactStore {\n return decodeCompactStore(raw, 2) as CompactStore;\n}\n\nfunction readLocalStorage(): string | null {\n try {\n return globalThis.localStorage?.getItem(STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction readCompactStore(): CompactStore {\n return {\n ...decodeCompactGroupStore(readLocalStorage()),\n ...decodeCompactGroupStore(readCookie(COOKIE_NAME)),\n };\n}\n\nfunction writeCompactStore(store: CompactStore): void {\n const serialized = JSON.stringify(store);\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, serialized);\n } catch {\n // best-effort\n }\n writeCookie(COOKIE_NAME, serialized, COOKIE_MAX_AGE_SECONDS);\n}\n\n/** Browser-backed store (localStorage + cookie mirror) used by the live runtime. */\nexport const browserGroupStickyStore: GroupStickyStore = {\n read(groupId) {\n const record = readCompactStore()[groupId];\n return Array.isArray(record) &&\n typeof record[0] === \"string\" &&\n typeof record[1] === \"number\"\n ? { experimentId: record[0], epoch: record[1] }\n : null;\n },\n write(groupId, selection) {\n const store = readCompactStore();\n store[groupId] = [selection.experimentId, normalizeEpoch(selection.epoch)];\n writeCompactStore(store);\n },\n};\n\n/** Remove consent-gated group stickiness from both browser persistence planes. */\nexport function clearBrowserGroupStickyStore(): void {\n try {\n globalThis.localStorage?.removeItem(STORAGE_KEY);\n } catch {\n // best-effort\n }\n deleteCookie(COOKIE_NAME);\n}\n\n/** In-memory store for tests and non-persistent (QA / no-consent) contexts. */\nexport function createMemoryGroupStickyStore(): GroupStickyStore {\n const map = new Map<string, PersistedGroupSelection>();\n return {\n read: (groupId) => map.get(groupId) ?? null,\n write: (groupId, selection) =>\n void map.set(groupId, {\n experimentId: selection.experimentId,\n epoch: normalizeEpoch(selection.epoch),\n }),\n };\n}\n\nexport interface ExclusionGroupDecision {\n groupId: string;\n /** Eligible, non-forced members that overlapped for this visitor. */\n conflictingExperimentIds: string[];\n winnerExperimentId: string | null;\n suppressedExperimentIds: string[];\n /** True when the winner was carried over from a prior sticky selection. */\n sticky: boolean;\n}\n\nexport interface ResolveExclusionGroupsResult {\n assignments: Assignment[];\n decisions: ExclusionGroupDecision[];\n}\n\n/**\n * Second pass of the overlap-then-pick model.\n *\n * `assignments` are the pass-one winners (each experiment already evaluated its\n * own status, targeting, exposure, sticky assignment and variation split). Here\n * we detect members of the same exclusion group that BOTH became eligible for\n * this visitor (overlap) and keep exactly one \u2014 chosen by a group-deterministic\n * hash weighted by each conflicting member's share, re-normalized across only\n * the conflicting members. A previously assigned member stays sticky while it\n * remains eligible; if it drops out we reselect among the current conflicting\n * members. Forced (QA preview) members bypass exclusion entirely.\n */\nexport function resolveExclusionGroups(\n assignments: Assignment[],\n groups: ExclusionGroupConfig[] | undefined,\n ctx: {\n userId: string;\n forcedExperimentIds?: Iterable<string>;\n store?: GroupStickyStore;\n persist?: boolean;\n },\n): ResolveExclusionGroupsResult {\n const decisions: ExclusionGroupDecision[] = [];\n if (!groups || groups.length === 0) {\n return { assignments, decisions };\n }\n\n const persist = ctx.persist !== false;\n const forced = new Set(ctx.forcedExperimentIds ?? []);\n // Persistence-disabled contexts skip sticky reads and writes below, so they\n // cannot inherit a prior browser or injected winner.\n const store = ctx.store ?? browserGroupStickyStore;\n\n // experimentId -> its pass-one assignment (only eligible experiments appear).\n const assignedById = new Map<string, Assignment>();\n for (const assignment of assignments) {\n assignedById.set(assignment.experimentId, assignment);\n }\n\n const suppressed = new Set<string>();\n\n for (const group of groups) {\n if (\n !group?.id ||\n !Array.isArray(group.members) ||\n group.members.length === 0\n ) {\n continue;\n }\n const epoch = normalizeEpoch(group.epoch);\n const hasForcedAssignment = group.members.some(\n (member) =>\n assignedById.has(member.experimentId) &&\n forced.has(member.experimentId),\n );\n const persistGroupSelection = persist && !hasForcedAssignment;\n\n // Conflicting = eligible (assigned this pass) AND not forced for QA preview.\n const conflicting = group.members.filter(\n (member) =>\n assignedById.has(member.experimentId) &&\n !forced.has(member.experimentId),\n );\n\n if (conflicting.length <= 1) {\n // Zero or one eligible member \u2192 no exclusion decision. Remember a lone\n // positive-share member so it stays sticky if another member overlaps\n // later. A 0% member must never gain priority merely by appearing alone.\n if (\n conflicting.length === 1 &&\n conflicting[0].share > 0 &&\n persistGroupSelection\n ) {\n store.write(group.id, {\n experimentId: conflicting[0].experimentId,\n epoch,\n });\n }\n continue;\n }\n\n const conflictingIds = conflicting.map((member) => member.experimentId);\n\n // Sticky: keep the prior winner while it stays eligible at the current epoch.\n const prior = persistGroupSelection ? store.read(group.id) : null;\n let winnerId: string;\n let sticky = false;\n const priorMember = prior\n ? conflicting.find((member) => member.experimentId === prior.experimentId)\n : undefined;\n const hasPositiveWeight = conflicting.some((member) => member.share > 0);\n if (\n prior &&\n prior.epoch === epoch &&\n priorMember &&\n (priorMember.share > 0 || !hasPositiveWeight)\n ) {\n winnerId = prior.experimentId;\n sticky = true;\n } else {\n // Deterministic pick across only the conflicting members, weighted by share.\n const configuredWeights = conflicting.map((member) =>\n Number.isFinite(member.share) && member.share > 0 ? member.share : 0,\n );\n // A degenerate all-zero conflicting subset can happen after eligibility\n // filtering. Keep the decision fair and deterministic instead of letting\n // the generic bucket helper silently favor the first member.\n const weights = configuredWeights.some((weight) => weight > 0)\n ? configuredWeights\n : configuredWeights.map(() => 1);\n const hashValue = hashToFloat(`${group.id}:exclusion`, ctx.userId);\n const index = chooseVariation(hashValue, weights);\n winnerId =\n conflicting[Math.max(0, Math.min(index, conflicting.length - 1))]\n .experimentId;\n if (persistGroupSelection) {\n store.write(group.id, { experimentId: winnerId, epoch });\n }\n }\n\n const suppressedIds = conflictingIds.filter((id) => id !== winnerId);\n for (const id of suppressedIds) suppressed.add(id);\n\n decisions.push({\n groupId: group.id,\n conflictingExperimentIds: conflictingIds,\n winnerExperimentId: winnerId,\n suppressedExperimentIds: suppressedIds,\n sticky,\n });\n }\n\n if (suppressed.size === 0) {\n return { assignments, decisions };\n }\n\n return {\n assignments: assignments.filter(\n (assignment) => !suppressed.has(assignment.experimentId),\n ),\n decisions,\n };\n}\n\nexport const __exclusionGroupInternals = {\n STORAGE_KEY,\n COOKIE_NAME,\n parseStore: decodeCompactGroupStore,\n normalizeEpoch,\n};\n", "export type MoneyConvention = {\n decimal: \".\" | \",\";\n group: string;\n decimals: number;\n minorUnits: number;\n};\n\nexport type DisplayedMoney = {\n cents: number;\n convention: MoneyConvention;\n start: number;\n end: number;\n};\n\nexport type CurrencyToken = {\n symbol: string;\n cents: number;\n raw: string;\n};\n\n/** Extract marked displayed prices without treating ordinary numbers as money. */\nexport function extractCurrencyTokens(text: string): CurrencyToken[] {\n const tokens: CurrencyToken[] = [];\n const amount = String.raw`\\d(?:[\\d.,\\u00a0 ]*\\d)?`;\n const symbol = String.raw`[$\\u20ac\\u00a3\\u00a5\\u20b9]`;\n const pattern = new RegExp(\n String.raw`(?:(${symbol})\\s*(${amount})|(?:^|([^A-Z]))([A-Z]{3})\\s*(${amount})|(${amount})\\s*(${symbol}|[A-Z]{3}|kr)(?![A-Za-z]))`,\n \"g\",\n );\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) !== null) {\n const consumedPrefix = match[3] ?? \"\";\n const raw = match[0].slice(consumedPrefix.length);\n const marker = match[1] ?? match[4] ?? match[7];\n const displayedAmount = match[2] ?? match[5] ?? match[6];\n if (/^[A-Z]{3}$/.test(marker) && !ISO_4217_CURRENCY_CODE_SET.has(marker)) {\n continue;\n }\n const parsed = parseDisplayedCents(displayedAmount);\n if (parsed) tokens.push({\n symbol: marker,\n cents: parsed.cents,\n raw,\n });\n }\n return tokens;\n}\nexport const ISO_4217_CURRENCY_CODES =\n `AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HRK HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UYW UZS VES VND VUV WST XAF XCD XCG XDR XOF XPF XSU YER ZAR ZMW ZWG`.split(\n \" \",\n );\nconst ISO_4217_CURRENCY_CODE_SET = new Set(ISO_4217_CURRENCY_CODES);\n\n// Precision is a read-compatibility contract as well as a write-time concern.\n// Keep withdrawn codes that can exist on stored shops/experiments here even\n// though the assigned-code set above intentionally rejects them on new writes.\nconst ISO_4217_PRECISION_CODE_SET = new Set([\n ...ISO_4217_CURRENCY_CODES,\n \"CUC\",\n \"SLL\",\n \"ZWL\",\n]);\n\n/** Returns whether a code is currently active in ISO 4217. */\nexport function isIso4217CurrencyCode(currencyCode: string): boolean {\n return ISO_4217_CURRENCY_CODE_SET.has(currencyCode.trim().toUpperCase());\n}\n\nconst ZERO_DECIMAL_CURRENCIES = new Set(\n `BIF CLP DJF GNF ISK JPY KMF KRW PYG RWF UGX UYI VND VUV XAF XOF XPF`.split(\n \" \",\n ),\n);\nconst THREE_DECIMAL_CURRENCIES = new Set(\n `BHD IQD JOD KWD LYD OMR TND`.split(\" \"),\n);\n\n/** Authoritative ISO-4217 minor-unit exponent for editor-supported currencies. */\nexport function currencyExponent(currencyCode: string): number {\n if (!ISO_4217_PRECISION_CODE_SET.has(currencyCode)) {\n throw new RangeError(\n `Unknown ISO-4217 currency precision: ${currencyCode}`,\n );\n }\n if (ZERO_DECIMAL_CURRENCIES.has(currencyCode)) return 0;\n if (THREE_DECIMAL_CURRENCIES.has(currencyCode)) return 3;\n if (currencyCode === \"CLF\" || currencyCode === \"UYW\") return 4;\n return 2;\n}\nexport function parseDisplayedCents(text: string, minorUnits = 2): DisplayedMoney | null {\n const pattern = /\\d(?:[\\d.,\\u00a0 ]*\\d)?/g;\n const match = pattern.exec(text);\n if (!match || pattern.exec(text)) return null;\n const raw = match[0];\n const compact = raw.replace(/[ \\u00a0]/g, \"\");\n const separator = Math.max(compact.lastIndexOf(\".\"), compact.lastIndexOf(\",\"));\n const trailing = separator < 0 ? 0 : compact.length - separator - 1;\n const separatorCharacter = separator < 0 ? \"\" : compact[separator];\n const repeatedSeparator =\n separatorCharacter !== \"\" && compact.indexOf(separatorCharacter) !== separator;\n const hasOtherSeparator =\n separatorCharacter === \",\"\n ? compact.includes(\".\")\n : separatorCharacter === \".\" && compact.includes(\",\");\n // A lone comma before exactly three digits can be either a decimal mark or\n // a thousands separator in a three-decimal currency. Fail closed unless\n // another separator provides enough evidence to select one convention.\n if (\n minorUnits === 3 &&\n trailing === 3 &&\n separatorCharacter === \",\" &&\n !repeatedSeparator &&\n !hasOtherSeparator\n ) {\n return null;\n }\n // Scaled-currency themes can omit a zero fractional part. Preserve a\n // comma-separated three-digit group as a whole amount unless another\n // separator makes the fractional convention explicit.\n const groupedWhole =\n trailing === 3 &&\n minorUnits !== 2 &&\n !hasOtherSeparator &&\n (separatorCharacter === \",\" || repeatedSeparator);\n const decimals =\n trailing && trailing <= minorUnits && !groupedWhole ? trailing : 0;\n\n const visibleDecimal = decimals ? compact[separator] as \".\" | \",\" : null;\n const groupMatch = raw.slice(0, visibleDecimal ? raw.lastIndexOf(visibleDecimal) : raw.length).match(/[.,\\u00a0 ]/);\n const group = groupMatch?.[0] ?? \"\";\n // When the display has grouping but no decimals (for example `1.299`),\n // preserve the locale's opposite separator for a treatment that introduces\n // a fractional amount. Reusing the group separator would produce `1.149.95`.\n const decimal = visibleDecimal ?? (group === \".\" ? \",\" : \".\");\n const majorText = (decimals ? compact.slice(0, separator) : compact).replace(/[.,]/g, \"\");\n const fraction = decimals ? compact.slice(separator + 1) : \"\";\n const scale = 10 ** minorUnits;\n const cents = Number(majorText) * scale + Number((fraction + \"0\".repeat(minorUnits)).slice(0, minorUnits) || 0);\n return {\n cents,\n convention: { decimal, group, decimals, minorUnits },\n start: match.index,\n end: match.index + raw.length,\n };\n}\nexport function formatCentsLike(cents: number, convention: MoneyConvention): string {\n const scale = 10 ** convention.minorUnits;\n let major = String(Math.floor(cents / scale));\n if (convention.group) major = major.replace(/\\B(?=(\\d{3})+(?!\\d))/g, convention.group);\n const remainder = cents % scale;\n const decimals = convention.decimals || (remainder ? convention.minorUnits : 0);\n return decimals\n ? major + convention.decimal + String(remainder).padStart(convention.minorUnits, \"0\").slice(0, decimals)\n : major;\n}\n", "import type { Assignment, CommercePriceSettings } from \"./types\";\nimport {\n currencyExponent,\n formatCentsLike,\n parseDisplayedCents,\n} from \"./money\";\n\ntype PriceAssignmentAuthorization = (assignment: Assignment) => boolean;\n\nexport const COMMERCE_PRICE_SELECTORS =\n '.price,.price__regular,.price-item,.price-item--regular,.product__price,.product-price,[data-price],[itemprop=\"price\"]'.split(\n \",\",\n );\nexport const COMMERCE_PRICE_EXCLUSIONS =\n 's,del,.price__compare,.price-item--compare,[class*=\"compare-at\"]'.split(\",\");\n\ntype ShopifyWindow = Window & {\n Shopify?: { currency?: { active?: string } };\n ShopifyAnalytics?: {\n meta?: {\n page?: { pageType?: string; handle?: string };\n product?: {\n handle?: string;\n variants?: Array<{ id?: string | number; price?: string | number }>;\n };\n };\n };\n};\n\nlet observer: MutationObserver | null = null;\nlet rootObserver: MutationObserver | null = null;\nlet variantForm: HTMLFormElement | null = null;\nconst handleVariantFormEvent = () => guardedSwapPass();\nlet originals = new Map<Text, { original: string; applied: string }>();\nlet originalAriaLabels = new Map<\n Element,\n { original: string; applied: string }\n>();\nlet compareAtNodes: HTMLElement[] = [];\nlet hiddenCompareAtNodes = new Map<HTMLElement, string>();\nlet renderedDisplayAssignment: Assignment | null = null;\nlet exposureChanged: (() => void) | undefined;\nlet current: {\n settings: CommercePriceSettings;\n assignments: Assignment[];\n isCohortStampedOnCart: () => boolean | \"pending\";\n isAssignmentAuthorized: PriceAssignmentAuthorization;\n} | null = null;\nlet applying = false;\nlet metaRetryTimer: ReturnType<typeof setTimeout> | null = null;\nlet stampCheckTimer: ReturnType<typeof setTimeout> | null = null;\nlet stampCheckDeadline = 0;\nlet pendingActivation: {\n settings: CommercePriceSettings;\n assignments: Assignment[];\n isCohortStampedOnCart: () => boolean | \"pending\";\n deadline: number;\n onResolved?: () => void;\n isAssignmentAuthorized: PriceAssignmentAuthorization;\n} | null = null;\n\n/** Whether price teardown has state to restore, disconnect, or cancel. */\nexport function hasCommercePriceState(): boolean {\n return (\n observer !== null ||\n rootObserver !== null ||\n originals.size > 0 ||\n originalAriaLabels.size > 0 ||\n current !== null ||\n applying ||\n metaRetryTimer !== null ||\n stampCheckTimer !== null ||\n pendingActivation !== null\n );\n}\n\n/**\n * How long activation may wait for the cohort stamp to be confirmed. The tested\n * price is not shown until Shopify has accepted the signed cart attributes \u2014 a\n * shopper must never be shown a price we cannot prove Shopify will charge.\n */\nconst STAMP_CONFIRM_TIMEOUT_MS = 8000;\n\n/**\n * Shopify populates ShopifyAnalytics.meta.product AFTER the SDK boots (measured on a\n * live storefront: SDK at 43ms, meta.product still absent at 46ms). Activation must\n * therefore be retried instead of failing permanently, or the swap never runs on a\n * real store.\n */\nconst META_RETRY_INTERVAL_MS = 60;\nconst META_RETRY_WINDOW_MS = 5000;\n\nfunction shopifyProductMetaReady(): boolean {\n if (typeof window === \"undefined\") return false;\n const meta = (window as ShopifyWindow).ShopifyAnalytics?.meta;\n return Boolean(\n (window as ShopifyWindow).Shopify && Array.isArray(meta?.product?.variants),\n );\n}\n\nfunction cancelMetaRetry(): void {\n if (metaRetryTimer != null) clearTimeout(metaRetryTimer);\n metaRetryTimer = null;\n}\n\nfunction cancelStampCheck(): void {\n if (stampCheckTimer != null) clearTimeout(stampCheckTimer);\n stampCheckTimer = null;\n stampCheckDeadline = 0;\n}\n\nfunction scheduleStampCheck(): void {\n if (stampCheckTimer != null) return;\n if (stampCheckDeadline === 0)\n stampCheckDeadline = Date.now() + STAMP_CONFIRM_TIMEOUT_MS;\n stampCheckTimer = setTimeout(() => {\n stampCheckTimer = null;\n if (!current) return;\n const status = current.isCohortStampedOnCart();\n if (status === false) {\n // The cohort will never reach the cart: restore the published price.\n cleanupCommercePrice();\n return;\n }\n if (status === \"pending\") {\n if (Date.now() >= stampCheckDeadline) {\n // Unconfirmed for too long \u2014 fail closed rather than keep showing a price\n // the Cart Transform may not apply.\n cleanupCommercePrice();\n return;\n }\n scheduleStampCheck();\n }\n }, 25);\n}\n\nfunction activeExperiments(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n) {\n if (typeof window === \"undefined\") return [];\n const w = window as ShopifyWindow;\n const meta = w.ShopifyAnalytics?.meta;\n if (\n !w.Shopify ||\n meta?.page?.pageType !== \"product\" ||\n !Array.isArray(meta.product?.variants)\n )\n return [];\n const currency = w.Shopify.currency?.active;\n if (typeof currency !== \"string\") return [];\n let minorUnits: number;\n try {\n minorUnits = currencyExponent(currency);\n } catch {\n return [];\n }\n const pageVariantIds = new Set(\n meta.product.variants\n .filter((variant) => variant.id != null)\n .map((variant) => String(variant.id)),\n );\n const active = [];\n for (const experiment of settings.experiments) {\n const assignment = assignments.find(\n (item) => item.experimentId === experiment.experiment_id,\n );\n const adjustments = assignment\n ? experiment.variants[assignment.variationId]\n : undefined;\n const targetsCurrentProduct = adjustments?.some((adjustment) => {\n const variantId = adjustment.variant_gid.split(\"/\").pop();\n return variantId != null && pageVariantIds.has(variantId);\n });\n const epochMatches =\n experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment?.assignmentEpoch;\n if (\n assignment &&\n isAssignmentAuthorized(assignment) &&\n epochMatches &&\n !assignment.isControl &&\n currency === experiment.currency &&\n adjustments &&\n targetsCurrentProduct\n ) {\n active.push({ experiment, assignment, currency, minorUnits });\n }\n }\n return active;\n}\n\nfunction hasActiveChargedPrice(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization,\n): boolean {\n const active = activeExperiments(\n settings,\n assignments,\n isAssignmentAuthorized,\n );\n if (active.length > 0)\n return active.some(({ experiment, assignment }) =>\n experiment.variants[assignment.variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ),\n );\n // Before metadata or authorization arrives, retain the strict charged-arm\n // barrier so activation can be revisited when the cart proof lands.\n return settings.experiments.some((experiment) => {\n const assignment = assignments.find(\n (candidate) =>\n candidate.experimentId === experiment.experiment_id &&\n !candidate.isControl,\n );\n return Boolean(\n assignment &&\n (experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment.assignmentEpoch) &&\n experiment.variants[assignment.variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ),\n );\n });\n}\n\n/**\n * True when a price treatment is assigned AND the page either is eligible now or could\n * still become eligible (Shopify has not published product metadata yet). The reveal\n * barrier uses this so a metadata-late PDP cannot flash the ORIGINAL price before the\n * swap lands. The anti-flicker timeout still caps how long content can stay hidden.\n */\nexport function isCommercePriceWorkPending(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): boolean {\n if (!settings) return false;\n if (isCommercePriceActive(settings, assignments, isAssignmentAuthorized))\n return true;\n if (shopifyProductMetaReady()) return false;\n return settings.experiments.some((experiment) =>\n assignments.some(\n (assignment) =>\n assignment.experimentId === experiment.experiment_id &&\n isAssignmentAuthorized(assignment) &&\n !assignment.isControl &&\n (experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment.assignmentEpoch),\n ),\n );\n}\n\nexport function isCommercePriceActive(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): boolean {\n try {\n return Boolean(\n settings &&\n activeExperiments(settings, assignments, isAssignmentAuthorized).length,\n );\n } catch {\n return false;\n }\n}\n\nfunction isStrictlyLowerPrice(candidate: string, current: string): boolean {\n return Number(candidate) < Number(current);\n}\n\nfunction treatmentUnits(value: string, minorUnits: number): number | null {\n const match = value.match(/^(\\d+)(?:\\.(\\d+))?$/);\n if (!match) return null;\n const fraction = match[2] ?? \"\";\n const discarded = fraction.slice(minorUnits);\n if (/[^0]/.test(discarded)) return null;\n const units = Number(\n match[1] + (fraction + \"0\".repeat(minorUnits)).slice(0, minorUnits),\n );\n return Number.isSafeInteger(units) ? units : null;\n}\n\nfunction shopifyStoredMinorUnits(\n value: number,\n minorUnits: number,\n shopifyStoredScale: number,\n): number | null {\n if (\n !Number.isFinite(value) ||\n value < 0 ||\n !Number.isSafeInteger(minorUnits) ||\n minorUnits < 0 ||\n !Number.isSafeInteger(shopifyStoredScale) ||\n shopifyStoredScale <= 0\n ) {\n return null;\n }\n const match = /^(\\d+)(?:\\.(\\d+))?(?:e([+-]?\\d+))?$/i.exec(value.toString());\n if (!match) return null;\n const fraction = match[2] ?? \"\";\n const exponent = Number(match[3] ?? 0);\n if (!Number.isSafeInteger(exponent)) return null;\n const digits = `${match[1]}${fraction}`;\n const decimalScale = fraction.length - exponent;\n const scaleDelta = minorUnits - decimalScale;\n let scaledDigits: string;\n if (scaleDelta >= 0) {\n scaledDigits = digits + \"0\".repeat(scaleDelta);\n } else {\n const discardedLength = -scaleDelta;\n if (discardedLength > digits.length) {\n if (/[^0]/.test(digits)) return null;\n scaledDigits = \"0\";\n } else {\n const discarded = digits.slice(digits.length - discardedLength);\n if (/[^0]/.test(discarded)) return null;\n scaledDigits = digits.slice(0, digits.length - discardedLength) || \"0\";\n }\n }\n const scaled = Number(scaledDigits);\n if (!Number.isSafeInteger(scaled) || scaled % shopifyStoredScale !== 0) {\n return null;\n }\n return scaled / shopifyStoredScale;\n}\n\nfunction replaceNumericText(\n value: string,\n targets: Map<number, number>,\n minorUnits: number,\n): string | null {\n const parsed = parseDisplayedCents(value, minorUnits);\n if (!parsed) return null;\n const replacement = targets.get(parsed.cents);\n if (replacement == null || Number.isNaN(replacement)) return null;\n return (\n value.slice(0, parsed.start) +\n formatCentsLike(replacement, parsed.convention) +\n value.slice(parsed.end)\n );\n}\n\nfunction applyAccessibleLabel(\n node: Text,\n container: Element,\n targets: Map<number, number>,\n minorUnits: number,\n): void {\n const labelled = node.parentElement?.closest(\"[aria-label]\");\n if (!labelled || !container.contains(labelled)) return;\n const label = labelled.getAttribute(\"aria-label\");\n if (label == null) return;\n const replacement = replaceNumericText(label, targets, minorUnits);\n if (replacement == null || replacement === label) return;\n const previous = originalAriaLabels.get(labelled);\n originalAriaLabels.set(labelled, {\n original:\n previous && label === previous.applied ? previous.original : label,\n applied: replacement,\n });\n labelled.setAttribute(\"aria-label\", replacement);\n}\n\nfunction guardedSwapPass(): void {\n try {\n swapPass();\n } catch {\n cleanupCommercePrice();\n }\n}\n\nfunction productHandleFromUrl(value: string): string | null {\n try {\n const path = new URL(value, location.href).pathname;\n const match = path.match(/\\/products\\/([^/]+)/i);\n return match?.[1] ? decodeURIComponent(match[1]).toLowerCase() : null;\n } catch {\n return null;\n }\n}\n\nfunction currentProductHandle(): string | null {\n const meta = (window as ShopifyWindow).ShopifyAnalytics?.meta;\n const metadataHandle = meta?.page?.handle ?? meta?.product?.handle;\n if (typeof metadataHandle === \"string\" && metadataHandle.trim()) {\n return metadataHandle.trim().toLowerCase();\n }\n const canonical = document.querySelector<HTMLLinkElement>(\n 'link[rel=\"canonical\"][href]',\n );\n return canonical ? productHandleFromUrl(canonical.href) : null;\n}\n\nfunction isElementLinkedToDifferentProduct(\n node: Element,\n currentHandle: string | null,\n): boolean {\n const wrappingAnchor = node.closest<HTMLAnchorElement>(\n 'a[href*=\"/products/\"]',\n );\n const labelledContainer = node.closest(\n \"li,article,[data-product-id],[class*='product-card'],[class*='product-item'],[class*='card']\",\n );\n const siblingContainer =\n node.parentElement && node.parentElement !== document.body\n ? node.parentElement\n : null;\n const container = labelledContainer ?? siblingContainer;\n const productAnchors = container\n ? Array.from(\n container.querySelectorAll<HTMLAnchorElement>('a[href*=\"/products/\"]'),\n ).filter(\n (candidate) =>\n labelledContainer != null || candidate.parentElement === container,\n )\n : [];\n const linkedHandles = new Set(\n productAnchors\n .map((candidate) => productHandleFromUrl(candidate.href))\n .filter((handle): handle is string => handle != null),\n );\n // A descendant link is ownership evidence only inside the nearest explicit\n // product/card container (or the price's direct parent for sibling labels),\n // and only when that container identifies one product. A recommendation\n // elsewhere under a broad PDP ancestor must not claim the main price.\n const anchor =\n wrappingAnchor ??\n (linkedHandles.size === 1 ? (productAnchors[0] ?? null) : null);\n if (!anchor) return false;\n const linkedHandle = productHandleFromUrl(anchor.href);\n if (!linkedHandle) return false;\n // If current-product identity is unavailable, fail open only for unlinked\n // candidates: rewriting any product-linked price could corrupt another item.\n return currentHandle == null || linkedHandle !== currentHandle;\n}\n\nfunction isLinkedToDifferentProduct(\n node: Text,\n currentHandle: string | null,\n): boolean {\n return node.parentElement\n ? isElementLinkedToDifferentProduct(node.parentElement, currentHandle)\n : currentHandle == null;\n}\n\nfunction currentVariantId(\n variants: Array<{ id?: string | number; price?: string | number }>,\n): string | null {\n const currentHandle = currentProductHandle();\n const productForm = Array.from(\n document.querySelectorAll<HTMLFormElement>('form[action*=\"/cart/add\"]'),\n ).find((form) => !isElementLinkedToDifferentProduct(form, currentHandle));\n const selected = productForm?.querySelector<\n HTMLInputElement | HTMLSelectElement\n >(\n \"[name=id][type=radio]:checked,select[name=id],input[name=id]:not([type=radio])\",\n )?.value;\n if (selected && variants.some((variant) => String(variant.id) === selected))\n return selected;\n const urlVariant = new URL(location.href).searchParams.get(\"variant\");\n if (\n urlVariant &&\n variants.some((variant) => String(variant.id) === urlVariant)\n )\n return urlVariant;\n return variants.length === 1 && variants[0]?.id != null\n ? String(variants[0].id)\n : null;\n}\n\nfunction swapPass(): void {\n if (!current || applying) return;\n const stampStatus = hasActiveChargedPrice(\n current.settings,\n current.assignments,\n current.isAssignmentAuthorized,\n )\n ? current.isCohortStampedOnCart()\n : true;\n if (stampStatus === false) {\n cleanupCommercePrice();\n return;\n }\n if (stampStatus === \"pending\") scheduleStampCheck();\n applying = true;\n try {\n const active = activeExperiments(\n current.settings,\n current.assignments,\n current.isAssignmentAuthorized,\n );\n const variants = (window as ShopifyWindow).ShopifyAnalytics?.meta?.product\n ?.variants;\n if (!active.length || !Array.isArray(variants)) return;\n const minorUnits = active[0]!.minorUnits;\n // ShopifyAnalytics uses Shopify's fixed two-decimal stored scale. This\n // scale is independent of the display currency's ISO-4217 exponent.\n const shopifyStoredScale = 100;\n const published = new Map<string, number>();\n for (const variant of variants) {\n const price = Number(variant.price);\n if (variant.id != null && Number.isFinite(price) && price >= 0)\n published.set(String(variant.id), price);\n }\n const selectedByVariant = new Map<string, string>();\n for (const candidate of active) {\n for (const adjustment of candidate.experiment.variants[\n candidate.assignment.variationId\n ]) {\n if (typeof adjustment.fixedPricePerUnit !== \"string\") continue;\n const id = adjustment.variant_gid.split(\"/\").pop();\n if (!id || !published.has(id)) continue;\n const selected = selectedByVariant.get(id);\n if (\n selected == null ||\n isStrictlyLowerPrice(adjustment.fixedPricePerUnit, selected)\n ) {\n selectedByVariant.set(id, adjustment.fixedPricePerUnit);\n }\n }\n }\n const compareByVariant = new Map<\n string,\n {\n compare: { mode: \"set\"; amount: string } | { mode: \"clear\" };\n assignment: Assignment;\n }\n >();\n // Launch-side conflict screening rejects concurrent price tests on one\n // variant, but the projection can still briefly carry both. Deterministic\n // tie-break instead of last-iterated-wins: process in experiment-id order\n // and keep the FIRST adjustment per variant, so every shopper session\n // resolves the same collision identically.\n const compareCandidates = [...active].sort((left, right) =>\n left.experiment.experiment_id < right.experiment.experiment_id ? -1 : 1,\n );\n for (const candidate of compareCandidates) {\n for (const adjustment of candidate.experiment.variants[\n candidate.assignment.variationId\n ]) {\n const id = adjustment.variant_gid.split(\"/\").pop();\n if (\n id &&\n published.has(id) &&\n adjustment.compareAt &&\n !compareByVariant.has(id)\n ) {\n compareByVariant.set(id, {\n compare: adjustment.compareAt,\n assignment: candidate.assignment,\n });\n }\n }\n }\n const targets = new Map<number, number>();\n // The Function records every colliding experiment but charges the lowest\n // authorized match. Keep every assignment exposure-eligible while using\n // that same winner solely for the shopper-facing display.\n for (const [id, fixedPricePerUnit] of selectedByVariant) {\n const source = published.get(id);\n const treatmentDisplayAmount = treatmentUnits(\n fixedPricePerUnit,\n minorUnits,\n );\n const sourceDisplayAmount = source == null\n ? null\n : shopifyStoredMinorUnits(source, minorUnits, shopifyStoredScale);\n // The display plane must mirror the Cart Transform's decrease-only\n // invariant. Invalid, equal, or higher treatment prices fail closed.\n if (\n sourceDisplayAmount == null ||\n treatmentDisplayAmount == null ||\n treatmentDisplayAmount >= sourceDisplayAmount\n )\n continue;\n const existing = targets.get(sourceDisplayAmount);\n targets.set(\n sourceDisplayAmount,\n existing == null || existing === treatmentDisplayAmount\n ? treatmentDisplayAmount\n : NaN,\n );\n }\n // Compare-at framing must describe a real discount. Reject malformed,\n // equal, or lower reference prices instead of hiding the theme's native\n // framing and manufacturing a false sale signal.\n for (const [id, { compare }] of compareByVariant) {\n if (compare.mode !== \"set\") continue;\n const source = published.get(id);\n const compareAmount = treatmentUnits(compare.amount, minorUnits);\n const sourceAmount = source == null\n ? null\n : shopifyStoredMinorUnits(source, minorUnits, shopifyStoredScale);\n const displayedAmount =\n sourceAmount == null ? null : targets.get(sourceAmount) || sourceAmount;\n if (\n compareAmount == null ||\n displayedAmount == null ||\n compareAmount <= displayedAmount\n ) {\n compareByVariant.delete(id);\n }\n }\n // A later DOM/variant pass can invalidate previously rendered framing.\n // Continue through reconciliation when display eligibility was previously\n // granted so stale treatment UI and exposure state are both withdrawn.\n if (\n !targets.size &&\n !compareByVariant.size &&\n renderedDisplayAssignment === null\n )\n return;\n\n const productHandle = currentProductHandle();\n const exclusion = COMMERCE_PRICE_EXCLUSIONS.join(\",\");\n const containers = Array.from(\n document.querySelectorAll(COMMERCE_PRICE_SELECTORS.join(\",\")),\n );\n const selectedVariantId = currentVariantId(variants);\n const selectedCompare = selectedVariantId\n ? compareByVariant.get(selectedVariantId)\n : undefined;\n const compare = selectedCompare?.compare;\n let nextRenderedDisplayAssignment: Assignment | null = null;\n compareAtNodes = compareAtNodes.filter((node) => node.isConnected);\n const removeInjectedFraming = () => {\n for (const node of compareAtNodes) node.remove();\n compareAtNodes = [];\n };\n const removeApexCompareAt = () => {\n removeInjectedFraming();\n for (const [node, display] of hiddenCompareAtNodes)\n node.style.display = display;\n hiddenCompareAtNodes = new Map();\n };\n if (compare) {\n const existingCompareNodes = new Set<HTMLElement>();\n for (const container of containers) {\n if (isElementLinkedToDifferentProduct(container, productHandle))\n continue;\n const scope = container.parentElement ?? container;\n for (const existing of Array.from(\n scope.querySelectorAll<HTMLElement>(exclusion),\n )) {\n if (existing.hasAttribute(\"data-apex-compare-at\")) continue;\n if (isElementLinkedToDifferentProduct(existing, productHandle))\n continue;\n existingCompareNodes.add(existing);\n }\n }\n for (const existing of existingCompareNodes) {\n if (!hiddenCompareAtNodes.has(existing))\n hiddenCompareAtNodes.set(existing, existing.style.display);\n existing.style.display = \"none\";\n }\n if (compare.mode === \"set\") {\n const amount = treatmentUnits(compare.amount, minorUnits);\n const source = selectedVariantId\n ? published.get(selectedVariantId)\n : undefined;\n const sourceDisplayAmount = source == null\n ? null\n : shopifyStoredMinorUnits(source, minorUnits, shopifyStoredScale);\n // The current price is read from Shopify and is never replaced for a\n // compare-at-only arm. Only add merchant-authored reference framing.\n if (amount != null && sourceDisplayAmount != null) {\n const eligible = containers.filter(\n (container) =>\n !isElementLinkedToDifferentProduct(container, productHandle),\n );\n // Prefer a LEAF price node: an outer wrapper's textContent bundles\n // regular/sale/compare labels, and cloning it into the injected <s>\n // renders duplicated or garbled prices.\n const selector = COMMERCE_PRICE_SELECTORS.join(\",\");\n const leaves = eligible.filter(\n (container) => !container.querySelector(selector),\n );\n for (const container of leaves.length > 0 ? leaves : eligible) {\n let node =\n container.parentElement?.querySelector<HTMLElement>(\n \"[data-apex-compare-at]\",\n ) ?? null;\n if (!node) {\n node = document.createElement(\"s\");\n node.dataset.apexCompareAt = \"true\";\n node.className = \"apex-compare-at\";\n container.parentElement?.insertBefore(node, container);\n compareAtNodes.push(node);\n }\n const currentText = container.textContent ?? \"\";\n const parsedCurrent = parseDisplayedCents(currentText, minorUnits);\n // A node whose text still holds several amounts is not safe to\n // clone-and-replace; format only the configured amount using the\n // leaf's convention.\n const singleAmount = parsedCurrent\n ? parseDisplayedCents(\n currentText.slice(0, parsedCurrent.start) +\n currentText.slice(parsedCurrent.end),\n minorUnits,\n ) === null\n : false;\n const nextText = singleAmount\n ? (replaceNumericText(\n currentText,\n new Map([[sourceDisplayAmount, amount]]),\n minorUnits,\n ) ??\n (parsedCurrent\n ? currentText.slice(0, parsedCurrent.start) +\n formatCentsLike(amount, parsedCurrent.convention) +\n currentText.slice(parsedCurrent.end)\n : compare.amount))\n : parsedCurrent\n ? formatCentsLike(amount, parsedCurrent.convention)\n : compare.amount;\n if (node.textContent !== nextText) node.textContent = nextText;\n }\n if (compareAtNodes.some((node) => node.isConnected)) {\n nextRenderedDisplayAssignment = selectedCompare!.assignment;\n }\n if (eligible.length === 0) removeApexCompareAt();\n } else removeApexCompareAt();\n }\n // A clear arm's treatment IS the hidden native strikethrough: remove\n // only injected framing and keep the natives hidden until the\n // assignment ends or the variant's mode changes.\n if (compare.mode === \"clear\") {\n removeInjectedFraming();\n if (hiddenCompareAtNodes.size > 0) {\n nextRenderedDisplayAssignment = selectedCompare!.assignment;\n }\n }\n } else {\n removeApexCompareAt();\n }\n for (const container of containers) {\n if (container.matches(exclusion) || container.closest(exclusion))\n continue;\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let node: Text | null;\n while ((node = walker.nextNode() as Text | null)) {\n if (node.parentElement?.closest(exclusion)) continue;\n if (isLinkedToDifferentProduct(node, productHandle)) continue;\n const replacement = replaceNumericText(node.data, targets, minorUnits);\n if (replacement == null || replacement === node.data) continue;\n applyAccessibleLabel(node, container, targets, minorUnits);\n const previous = originals.get(node);\n originals.set(node, {\n original:\n previous && node.data === previous.applied\n ? previous.original\n : node.data,\n applied: replacement,\n });\n node.data = replacement;\n }\n }\n observer?.disconnect();\n rootObserver?.disconnect();\n observer = new MutationObserver(guardedSwapPass);\n containers.forEach((container) =>\n observer!.observe(container, {\n childList: true,\n characterData: true,\n subtree: true,\n }),\n );\n rootObserver = new MutationObserver((records) => {\n const selector = COMMERCE_PRICE_SELECTORS.join(\",\");\n if (\n records.some((record) =>\n Array.from(record.addedNodes).some(\n (node) =>\n node instanceof Element &&\n (node.matches(selector) || Boolean(node.querySelector(selector))),\n ),\n )\n )\n guardedSwapPass();\n });\n rootObserver.observe(document.body, { childList: true, subtree: true });\n const eligibilityChanged =\n nextRenderedDisplayAssignment !== renderedDisplayAssignment;\n renderedDisplayAssignment = nextRenderedDisplayAssignment;\n if (eligibilityChanged) exposureChanged?.();\n const nextVariantForm =\n Array.from(\n document.querySelectorAll<HTMLFormElement>('form[action*=\"/cart/add\"]'),\n ).find(\n (form) => !isElementLinkedToDifferentProduct(form, productHandle),\n ) ?? null;\n if (variantForm !== nextVariantForm) {\n variantForm?.removeEventListener(\"change\", handleVariantFormEvent);\n variantForm?.removeEventListener(\"input\", handleVariantFormEvent);\n variantForm = nextVariantForm;\n variantForm?.addEventListener(\"change\", handleVariantFormEvent);\n variantForm?.addEventListener(\"input\", handleVariantFormEvent);\n }\n } finally {\n applying = false;\n }\n}\n\nfunction activateCommercePrice(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isCohortStampedOnCart: () => boolean | \"pending\",\n deadline: number,\n onResolved?: () => void,\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): void {\n const stampStatus = hasActiveChargedPrice(\n settings,\n assignments,\n isAssignmentAuthorized,\n )\n ? isCohortStampedOnCart()\n : true;\n if (stampStatus === \"pending\") {\n if (stampCheckDeadline === 0) {\n stampCheckDeadline = Date.now() + STAMP_CONFIRM_TIMEOUT_MS;\n }\n if (Date.now() >= stampCheckDeadline) {\n cancelStampCheck();\n const resolve = pendingActivation?.onResolved ?? onResolved;\n if (pendingActivation) pendingActivation.onResolved = undefined;\n resolve?.();\n return;\n }\n if (stampCheckTimer == null) {\n stampCheckTimer = setTimeout(() => {\n stampCheckTimer = null;\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n );\n }, 25);\n }\n return;\n }\n cancelStampCheck();\n if (stampStatus === false) {\n pendingActivation = null;\n // No cohort on the cart: the Function cannot charge the tested price, so the\n // published price must stay on screen. Resolve the reveal barrier immediately.\n cancelMetaRetry();\n onResolved?.();\n return;\n }\n if (!isCommercePriceActive(settings, assignments, isAssignmentAuthorized)) {\n // Retry only while the page could still BECOME eligible \u2014 i.e. Shopify has not\n // published product metadata yet. Every other inactive reason (control cohort,\n // currency mismatch, non-product page) is final and must not spin.\n if (!shopifyProductMetaReady() && Date.now() < deadline) {\n metaRetryTimer = setTimeout(\n () =>\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n ),\n META_RETRY_INTERVAL_MS,\n );\n return;\n }\n // Activation is final and inactive \u2014 release the reveal barrier.\n cancelMetaRetry();\n pendingActivation = null;\n onResolved?.();\n return;\n }\n cancelMetaRetry();\n pendingActivation = null;\n current = {\n settings,\n assignments,\n isCohortStampedOnCart,\n isAssignmentAuthorized,\n };\n try {\n swapPass();\n } catch {\n cleanupCommercePrice();\n }\n // The swap has landed (or failed and restored): content may be revealed.\n onResolved?.();\n}\n\nexport function applyCommercePrice(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isCohortStampedOnCart: () => boolean | \"pending\" = () => false,\n onResolved?: () => void,\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): void {\n cleanupCommercePrice();\n if (!settings) {\n onResolved?.();\n return;\n }\n const deadline = Date.now() + META_RETRY_WINDOW_MS;\n pendingActivation = {\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n };\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n );\n}\n\n/** Revisit a timed-out activation when the in-flight Shopify cart write lands. */\nexport function notifyCommerceCartStampConfirmed(): void {\n if (!pendingActivation) return;\n const activation = pendingActivation;\n activation.deadline = Math.max(\n activation.deadline,\n Date.now() + META_RETRY_WINDOW_MS,\n );\n activateCommercePrice(\n activation.settings,\n activation.assignments,\n activation.isCohortStampedOnCart,\n activation.deadline,\n activation.onResolved,\n activation.isAssignmentAuthorized,\n );\n}\n\n/** Whether a display-only price assignment has produced shopper-visible framing. */\nexport function isCommercePriceExposureEligible(\n settings: CommercePriceSettings | undefined,\n assignment: Assignment,\n): boolean {\n const adjustments = settings?.experiments.find(\n (experiment) => experiment.experiment_id === assignment.experimentId,\n )?.variants[assignment.variationId];\n return Boolean(\n assignment.isControl ||\n !adjustments?.some((adjustment) => adjustment.compareAt) ||\n adjustments.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ) ||\n renderedDisplayAssignment === assignment,\n );\n}\n\nexport const setCommercePriceExposureListener = (listener: () => void) => {\n exposureChanged = listener;\n};\n\nexport function cleanupCommercePrice(): void {\n observer?.disconnect();\n observer = null;\n rootObserver?.disconnect();\n rootObserver = null;\n variantForm?.removeEventListener(\"change\", handleVariantFormEvent);\n variantForm?.removeEventListener(\"input\", handleVariantFormEvent);\n variantForm = null;\n for (const [node, value] of originals) node.data = value.original;\n originals = new Map();\n for (const [element, value] of originalAriaLabels)\n element.setAttribute(\"aria-label\", value.original);\n originalAriaLabels = new Map();\n for (const node of compareAtNodes) node.remove();\n compareAtNodes = [];\n for (const [node, display] of hiddenCompareAtNodes)\n node.style.display = display;\n hiddenCompareAtNodes = new Map();\n renderedDisplayAssignment = null;\n current = null;\n pendingActivation = null;\n applying = false;\n cancelMetaRetry();\n cancelStampCheck();\n}\n", "export function configureDebug() {}\nexport function debugLog() {}\nexport function debugWarn() {}\nexport function debugGroup() {}\nexport function debugGroupEnd() {}\nexport function isDebugEnabled() { return false; }", "const observers = new Map<MutationObserver, MutationCallback | undefined>();\nlet muteDepth = 0;\n\nexport function registerMutedObserver(\n observer: MutationObserver,\n callback?: MutationCallback,\n): void {\n observers.set(observer, callback);\n}\n\nexport function unregisterMutedObserver(observer: MutationObserver): void {\n observers.delete(observer);\n}\n\nexport function runMuted<T>(fn: () => T): T {\n if (muteDepth === 0) {\n // Deliver records queued BEFORE the muted write to their handlers: a\n // real storefront change in the same task must not be discarded along\n // with the SDK's own write records when the queue drains below.\n for (const [observer, callback] of observers) {\n try {\n const pending = observer.takeRecords();\n if (pending.length && callback) callback(pending, observer);\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n muteDepth += 1;\n try {\n return fn();\n } finally {\n muteDepth -= 1;\n if (muteDepth === 0) {\n for (const observer of observers.keys()) {\n try {\n observer.takeRecords();\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n }\n}\n\n", "import { registerMutedObserver, unregisterMutedObserver } from \"./observer-mute\";\n\ntype DomChangeObserver = () => void;\n\nconst QA_ASSISTANT_HOST_SELECTOR = \"#\" + [\"drip\", \"qa\", \"assistant\", \"host\"].join(\"-\");\nconst APEX_HOST_SELECTOR = [\"#drip-qa-toolbar\", QA_ASSISTANT_HOST_SELECTOR, \"#drip-devtools-host\"].join(\",\");\n\nfunction isApexNode(node: Node): boolean {\n if (!(node instanceof Element)) return false;\n const id = node.getAttribute(\"id\") || \"\";\n return id.startsWith(\"drip-\") || node.closest?.(APEX_HOST_SELECTOR) != null;\n}\n\nexport function observeDomChanges(\n observer: DomChangeObserver,\n debounceMs = 250,\n): () => void {\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) {\n return () => {};\n }\n\n let timer: number | null = null;\n const schedule = () => {\n if (timer !== null) window.clearTimeout(timer);\n timer = window.setTimeout(() => {\n timer = null;\n observer();\n }, debounceMs);\n };\n\n const onRecords: MutationCallback = (mutations) => {\n const relevant = mutations.some((mutation) => {\n if (mutation.type === \"attributes\") {\n return mutation.target instanceof Element && !isApexNode(mutation.target);\n }\n return Array.from(mutation.addedNodes).some((node) => !isApexNode(node));\n });\n if (relevant) schedule();\n };\n const mutationObserver = new MutationObserver(onRecords);\n\n registerMutedObserver(mutationObserver, onRecords);\n mutationObserver.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\", \"aria-hidden\"],\n });\n\n return () => {\n if (timer !== null) window.clearTimeout(timer);\n mutationObserver.disconnect();\n unregisterMutedObserver(mutationObserver);\n };\n}\n", "import type { Assignment, ExternalTrackingSettings } from \"./types\";\n\nexport type HandoverData = {\n visitorId?: string;\n forceMap?: Record<string, string>;\n redirectAttribution?: {\n experimentId: string;\n variationId: string;\n destinationUrl: string;\n issuedAt: number;\n token: string;\n };\n};\n\nconst DEFAULT_HANDOVER_TTL_SECONDS = 120;\nconst DEFAULT_HANDOVER_MINT_TIMEOUT_MS = 250;\n\nfunction paramName(settings?: ExternalTrackingSettings): string {\n return settings?.handoverQueryParam || \"drip_bucket\";\n}\n\nfunction ttlSeconds(settings?: ExternalTrackingSettings): number {\n const ttl = Number(settings?.handoverTtlSeconds ?? DEFAULT_HANDOVER_TTL_SECONDS);\n return Number.isFinite(ttl) ? Math.max(30, Math.min(600, Math.floor(ttl))) : DEFAULT_HANDOVER_TTL_SECONDS;\n}\n\nexport function handoverMintTimeoutMs(settings?: ExternalTrackingSettings): number {\n const timeout = Number(settings?.handoverMintTimeoutMs ?? DEFAULT_HANDOVER_MINT_TIMEOUT_MS);\n return Number.isFinite(timeout) ? Math.max(50, Math.min(2000, Math.floor(timeout))) : DEFAULT_HANDOVER_MINT_TIMEOUT_MS;\n}\n\nfunction enabledDomains(settings?: ExternalTrackingSettings): string[] {\n return (settings?.domains ?? [])\n .map((domain) => domain.trim().replace(/^https?:\\/\\//i, \"\").replace(/\\/.*$/, \"\").toLowerCase())\n .filter(Boolean);\n}\n\nfunction encodePayload(value: unknown): string {\n const json = JSON.stringify(value);\n const bytes = new TextEncoder().encode(json);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction decodePayloadRecord(value: string): Record<string, unknown> {\n const payloadPart = value.includes(\".\") ? value.split(\".\")[0] : value;\n const normalized = payloadPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n let json: string;\n try {\n json = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n // Preserve compatibility with v2 payloads emitted before UTF-8 encoding.\n json = binary;\n }\n return JSON.parse(json) as Record<string, unknown>;\n}\n\ntype VerifiedHandoverPayload = Record<string, unknown>;\n\nfunction decodeVerifiedPayload(parsed: VerifiedHandoverPayload, shopId: string): HandoverData | null {\n try {\n const exp = typeof parsed.exp === \"number\" ? parsed.exp : 0;\n if (!exp || Math.floor(Date.now() / 1000) > exp || parsed.shop !== shopId) return null;\n const visitorId = typeof parsed.visitorId === \"string\" ? parsed.visitorId : undefined;\n const visitorIdV2 = typeof parsed.vid === \"string\" ? parsed.vid : undefined;\n const forceMap: Record<string, string> = {};\n const assignments = Array.isArray(parsed.assignments)\n ? parsed.assignments\n : Array.isArray(parsed.asg)\n ? parsed.asg\n : [];\n if (Array.isArray(assignments)) {\n for (const item of assignments) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n if (typeof record.experimentId === \"string\" && typeof record.variationId === \"string\") {\n forceMap[record.experimentId] = record.variationId;\n } else if (typeof record.e === \"string\" && typeof record.x === \"string\") {\n forceMap[record.e] = record.x;\n }\n }\n }\n const rawAttribution = parsed.ra;\n const redirectAttribution = rawAttribution && typeof rawAttribution === \"object\"\n && typeof (rawAttribution as Record<string, unknown>).e === \"string\"\n && typeof (rawAttribution as Record<string, unknown>).v === \"string\"\n && typeof (rawAttribution as Record<string, unknown>).d === \"string\"\n && typeof (rawAttribution as Record<string, unknown>).iat === \"number\"\n && typeof (rawAttribution as Record<string, unknown>).t === \"string\"\n ? {\n experimentId: (rawAttribution as Record<string, unknown>).e as string,\n variationId: (rawAttribution as Record<string, unknown>).v as string,\n destinationUrl: (rawAttribution as Record<string, unknown>).d as string,\n issuedAt: (rawAttribution as Record<string, unknown>).iat as number,\n token: (rawAttribution as Record<string, unknown>).t as string,\n }\n : undefined;\n return { visitorId: visitorIdV2 ?? visitorId, forceMap, redirectAttribution };\n } catch {\n return null;\n }\n}\n\nfunction decodePayload(value: string): HandoverData | null {\n try {\n const parsed = decodePayloadRecord(value);\n if (parsed.v === 2) {\n const exp = typeof parsed.exp === \"number\" ? parsed.exp : 0;\n if (!exp || Math.floor(Date.now() / 1000) > exp) return null;\n }\n const visitorId = typeof parsed.visitorId === \"string\" ? parsed.visitorId : undefined;\n const visitorIdV2 = typeof parsed.vid === \"string\" ? parsed.vid : undefined;\n const forceMap: Record<string, string> = {};\n const assignments = Array.isArray(parsed.assignments)\n ? parsed.assignments\n : Array.isArray(parsed.asg)\n ? parsed.asg\n : [];\n for (const item of assignments) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n if (typeof record.experimentId === \"string\" && typeof record.variationId === \"string\") {\n forceMap[record.experimentId] = record.variationId;\n } else if (typeof record.e === \"string\" && typeof record.x === \"string\") {\n forceMap[record.e] = record.x;\n }\n }\n // Redirect attribution (`ra`) is bearer-backed evidence and is trusted only\n // after Worker verification in decodeVerifiedPayload. This unverified\n // compatibility reader intentionally ignores it.\n return { visitorId: visitorIdV2 ?? visitorId, forceMap };\n } catch {\n return null;\n }\n}\n\n/** Decode a handover token carried by another runtime transport. */\nexport function readBucketingHandoverPayload(value: string): HandoverData | null {\n return decodePayload(value);\n}\n\nexport function bucketingHandoverExpiresAtMs(value: string): number | null {\n try {\n const parsed = decodePayloadRecord(value);\n return typeof parsed.exp === \"number\" ? parsed.exp * 1000 : null;\n } catch {\n return null;\n }\n}\n\nfunction hostMatches(hostname: string, domains: string[]): boolean {\n const normalized = hostname.toLowerCase();\n return domains.some((domain) => normalized === domain || normalized.endsWith(`.${domain}`));\n}\n\nfunction appendHandover(url: URL, settings: ExternalTrackingSettings | undefined, payload: string): string {\n url.searchParams.set(paramName(settings), payload);\n return url.toString();\n}\n\nfunction closestLink(target: EventTarget | null): HTMLAnchorElement | null {\n const candidate = target as\n | {\n closest?: (selector: string) => Element | null;\n parentElement?: { closest?: (selector: string) => Element | null };\n }\n | null;\n if (!candidate) return null;\n const direct = typeof candidate.closest === \"function\"\n ? candidate.closest(\"a[href]\")\n : null;\n if (direct) return direct as HTMLAnchorElement;\n const fromParent = typeof candidate.parentElement?.closest === \"function\"\n ? candidate.parentElement.closest(\"a[href]\")\n : null;\n return fromParent as HTMLAnchorElement | null;\n}\n\nfunction resumeLinkNavigation(link: HTMLAnchorElement): void {\n const target = link.getAttribute(\"target\");\n if (\n target\n && target.toLowerCase() !== \"_self\"\n && typeof globalThis.open === \"function\"\n ) {\n globalThis.open(link.href, target);\n return;\n }\n // A synthetic click is the only general way to reproduce the download\n // attribute, but it would re-dispatch merchant handlers. Direct navigation\n // still honors server-provided Content-Disposition downloads.\n globalThis.location?.assign(link.href);\n}\n\nfunction submissionAction(\n form: HTMLFormElement,\n submitter: HTMLElement | null,\n): string {\n const submitterAction = submitter?.getAttribute(\"formaction\");\n if (submitterAction != null) {\n return submitterAction || globalThis.location?.href || \"\";\n }\n return form.getAttribute(\"action\") || globalThis.location?.href || \"\";\n}\n\nexport async function readBucketingHandover(\n settings: ExternalTrackingSettings | undefined,\n shopId: string,\n verifyToken: (token: string) => Promise<unknown>,\n): Promise<HandoverData | null> {\n if (!globalThis.location || !enabledDomains(settings).length || !shopId) return null;\n const value = new URL(globalThis.location.href).searchParams.get(paramName(settings));\n if (!value) return null;\n return verifyBucketingHandoverToken(value, shopId, verifyToken);\n}\n\nexport async function verifyBucketingHandoverToken(\n value: string,\n shopId: string,\n verifyToken: (token: string) => Promise<unknown>,\n): Promise<HandoverData | null> {\n if (!value || !shopId) return null;\n try {\n const verified = await verifyToken(value);\n return verified && typeof verified === \"object\"\n ? decodeVerifiedPayload(verified as VerifiedHandoverPayload, shopId)\n : null;\n } catch {\n return null;\n }\n}\n\nexport function hasBucketingHandover(settings?: ExternalTrackingSettings): boolean {\n if (!globalThis.location || !enabledDomains(settings).length) return false;\n return Boolean(new URL(globalThis.location.href).searchParams.get(paramName(settings)));\n}\n\nexport function createBucketingHandoverPayload(\n visitorId: string,\n assignments: Array<Pick<Assignment, \"experimentId\" | \"variationId\">>,\n settings?: ExternalTrackingSettings,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n return encodePayload({\n v: 2,\n iat,\n exp: iat + ttlSeconds(settings),\n vid: visitorId,\n asg: assignments.map((assignment) => ({\n e: assignment.experimentId,\n x: assignment.variationId,\n })),\n });\n}\n\nfunction bucketingHandoverCacheKey(encodedPayload: string): string | null {\n try {\n const parsed = decodePayloadRecord(encodedPayload);\n if (typeof parsed.vid !== \"string\" || !Array.isArray(parsed.asg)) return null;\n const assignments: Array<{ e: string; x: string }> = [];\n for (const assignment of parsed.asg) {\n if (!assignment || typeof assignment !== \"object\") return null;\n const record = assignment as Record<string, unknown>;\n if (typeof record.e !== \"string\" || typeof record.x !== \"string\") return null;\n assignments.push({ e: record.e, x: record.x });\n }\n return JSON.stringify({ vid: parsed.vid, asg: assignments });\n } catch {\n return null;\n }\n}\n\nexport function installBucketingHandover(\n settings: ExternalTrackingSettings | undefined,\n getPayload: () => string | null,\n mintPayload?: () => Promise<string | null>,\n): () => void {\n const domains = enabledDomains(settings);\n if (!domains.length || !globalThis.document) return () => {};\n let cachedSignedPayload: string | null = null;\n let cachedBaseKey: string | null = null;\n let cachedSignedPayloadExp = 0;\n let mintInFlight: Promise<string | null> | null = null;\n const mint = () => {\n if (!mintPayload) return null;\n const basePayload = getPayload();\n if (!basePayload) return null;\n const baseKey = bucketingHandoverCacheKey(basePayload);\n if (!mintInFlight) {\n mintInFlight = mintPayload()\n .then((payload) => {\n cachedSignedPayload = payload;\n cachedBaseKey = payload ? baseKey : null;\n cachedSignedPayloadExp = payload\n ? Math.floor((bucketingHandoverExpiresAtMs(payload) ?? 0) / 1000)\n : 0;\n return payload;\n })\n .catch(() => null)\n .finally(() => {\n mintInFlight = null;\n });\n }\n return mintInFlight;\n };\n\n const bestPayload = (): string | null => {\n const basePayload = getPayload();\n const baseKey = basePayload ? bucketingHandoverCacheKey(basePayload) : null;\n const now = Math.floor(Date.now() / 1000);\n if (\n cachedSignedPayload\n && cachedBaseKey !== null\n && cachedBaseKey === baseKey\n && cachedSignedPayloadExp > now\n ) {\n return cachedSignedPayload;\n }\n // A raw payload is only minting input. Destinations reject it by design,\n // so never put it on a navigation when signing is unavailable or pending.\n return null;\n };\n\n const rewriteUrl = (rawUrl: string | null | undefined): string | null => {\n if (!rawUrl) return null;\n try {\n const url = new URL(rawUrl, globalThis.location?.href);\n if (!hostMatches(url.hostname, domains)) return null;\n const payload = bestPayload();\n if (!payload) return null;\n return appendHandover(url, settings, payload);\n } catch {\n return null;\n }\n };\n\n const isHandoverTarget = (rawUrl: string | null | undefined): boolean => {\n if (!rawUrl) return false;\n try {\n return hostMatches(new URL(rawUrl, globalThis.location?.href).hostname, domains);\n } catch {\n return false;\n }\n };\n\n const handleLinkEvent = (event: Event) => {\n const link = closestLink(event.target);\n if (!link) return;\n if (!isHandoverTarget(link.getAttribute(\"href\"))) return;\n const pending = mint();\n const rewrite = () => {\n const next = rewriteUrl(link.getAttribute(\"href\"));\n if (next) link.href = next;\n };\n if (event.type === \"click\" && pending && !bestPayload()) {\n event.preventDefault();\n void pending.then(() => {\n rewrite();\n resumeLinkNavigation(link);\n });\n return;\n }\n void pending?.then(rewrite);\n rewrite();\n };\n\n const resubmitting = new WeakSet<HTMLFormElement>();\n const handleSubmit = (event: Event) => {\n const form = event.target as HTMLFormElement | null;\n if (!form || form.tagName !== \"FORM\") return;\n if (resubmitting.delete(form)) return;\n const submitter = (event as SubmitEvent).submitter ?? null;\n const rawAction = submissionAction(form, submitter);\n if (!isHandoverTarget(rawAction)) return;\n const pending = mint();\n if (!pending) return;\n event.preventDefault();\n void pending.then(() => {\n const payload = bestPayload();\n const action = rewriteUrl(rawAction);\n if (payload && action) {\n if (submitter?.hasAttribute(\"formaction\")) {\n submitter.setAttribute(\"formaction\", action);\n } else {\n form.action = action;\n }\n const name = paramName(settings);\n let input = form.querySelector(`input[name=\"${name}\"]`) as HTMLInputElement | null;\n if (!input) {\n input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n form.appendChild(input);\n }\n input.value = payload;\n }\n resubmitting.add(form);\n if (submitter) {\n form.requestSubmit(submitter);\n } else {\n form.requestSubmit();\n }\n });\n };\n\n document.addEventListener(\"click\", handleLinkEvent, true);\n document.addEventListener(\"submit\", handleSubmit, true);\n return () => {\n document.removeEventListener(\"click\", handleLinkEvent, true);\n document.removeEventListener(\"submit\", handleSubmit, true);\n };\n}\n", "import type { CustomJsPolicy } from \"./types\";\n\nlet activePolicy: CustomJsPolicy = \"hybrid\";\nconst EXTERNAL_JS_CLASS = \"drip-external-js\";\ntype ExternalJsJournalEntry = {\n seq: number;\n artifactId: string;\n epoch: number;\n owners: Set<string>;\n target: Element;\n state: \"applied\" | \"invalidated\";\n};\nconst externalJsJournal: ExternalJsJournalEntry[] = [];\nlet externalJsSequence = 0;\n\nfunction recordExternalJs(\n element: Element,\n artifactId: string,\n ownerKeys: readonly string[],\n epoch: number,\n): void {\n const existing = externalJsJournal.find(\n (entry) => entry.target === element && entry.artifactId === artifactId,\n );\n if (existing) {\n ownerKeys.forEach((ownerKey) => existing.owners.add(ownerKey));\n existing.state = \"applied\";\n existing.epoch = epoch;\n return;\n }\n externalJsJournal.push({\n seq: ++externalJsSequence,\n artifactId,\n epoch,\n owners: new Set(ownerKeys),\n target: element,\n state: \"applied\",\n });\n}\n\nfunction forgetExternalJs(element: Element): void {\n for (let index = externalJsJournal.length - 1; index >= 0; index -= 1) {\n if (externalJsJournal[index].target === element) externalJsJournal.splice(index, 1);\n }\n}\n\nexport function setJsPolicy(policy: CustomJsPolicy): void {\n activePolicy = policy;\n}\n\nexport function isStrictJsPolicy(): boolean {\n return activePolicy === \"strict\";\n}\n\nexport function execJs(code: string, sourceLabel?: string): void {\n if (isStrictJsPolicy()) {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] Custom JS blocked by strict policy for \" + (sourceLabel || \"unknown\"));\n }\n return;\n }\n\n try {\n const suffix = sourceLabel ? \"\\n//# sourceURL=drip-\" + sourceLabel + \".js\" : \"\";\n new Function(code + suffix)();\n } catch (e) {\n if (typeof console !== \"undefined\") {\n console.error(\"[drip] JS error in \" + (sourceLabel || \"unknown\") + \":\", e);\n }\n }\n}\n\nexport function loadExternalJs(\n url: string,\n sourceLabel: string,\n ownerKeys: readonly string[] = [],\n artifactId = \"js:external:\" + sourceLabel,\n epoch = 0,\n): Promise<void> {\n if (activePolicy === \"strict\") {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] External JS blocked by strict policy for \" + sourceLabel);\n }\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const id = \"drip-external-js-\" + sourceLabel;\n const previous = document.getElementById(id);\n if (previous && previous.getAttribute(\"src\") === url) {\n recordExternalJs(previous, artifactId, ownerKeys, epoch);\n resolve();\n return;\n }\n if (previous) {\n forgetExternalJs(previous);\n previous.remove();\n }\n\n const script = document.createElement(\"script\");\n script.id = id;\n script.className = EXTERNAL_JS_CLASS;\n script.src = url;\n script.async = false;\n recordExternalJs(script, artifactId, ownerKeys, epoch);\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load JS artifact: \" + url));\n (document.head || document.documentElement).appendChild(script);\n });\n}\n\nexport function removeExternalJsForOwner(ownerKey: string, artifactId?: string): void {\n const removed = new Set<Element>();\n for (let index = externalJsJournal.length - 1; index >= 0; index -= 1) {\n const entry = externalJsJournal[index];\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.owners.delete(ownerKey) || entry.owners.size > 0) continue;\n removed.add(entry.target);\n externalJsJournal.splice(index, 1);\n }\n for (const element of removed) {\n if (!externalJsJournal.some((entry) => entry.target === element)) element.remove();\n }\n}\n\nexport function addExternalJsOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (existingOwnerKeys.size === 0 || ownerKeys.length === 0) return;\n for (const entry of externalJsJournal) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (\n !Array.from(existingOwnerKeys).some((ownerKey) =>\n entry.owners.has(ownerKey)\n )\n ) continue;\n ownerKeys.forEach((ownerKey) => entry.owners.add(ownerKey));\n }\n}\n\nexport function removeAllExternalJs(): void {\n document.querySelectorAll(\".\" + EXTERNAL_JS_CLASS).forEach((el) => el.remove());\n externalJsJournal.length = 0;\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", "export function evaluateTargetingGatesWithConditionDiagnostics() { return { matched: true, gates: [], conditions: [] }; }", "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", "import type { Assignment, Experiment } from \"./types\";\nimport { persistAssignmentForExperiment } from \"./assignment-store\";\nimport {\n evalUrlRule,\n matchUrlRules,\n normalizeRuntimeUrlRules,\n} from \"./targeting\";\nimport {\n bucketingHandoverExpiresAtMs,\n createBucketingHandoverPayload,\n verifyBucketingHandoverToken,\n} from \"./handover\";\nimport type { ExternalTrackingSettings } from \"./types\";\n\nexport const REDIRECT_ASSIGNMENT_PARAM = \"_apex_assignment\";\nexport const REDIRECT_ASSIGNMENT_PENDING_KEY = \"drip_redirect_assignment_pending_v1\";\nconst MAX_PENDING_REDIRECT_CARRY_TTL_MS = 10 * 60 * 1000;\ntype RedirectCarry = {\n e: string;\n v: string;\n epoch: number;\n handover: string;\n exposureSent: boolean;\n destinationPath?: string;\n};\n\nexport type ParsedRedirectCarry = {\n experimentId: string;\n variationId: string;\n assignmentEpoch: number;\n handoverToken: string;\n expiresAt: number;\n exposureSent: boolean;\n destinationPath?: string;\n};\n\nexport type VerifiedRedirectCarry = ParsedRedirectCarry & {\n visitorId: string;\n attributionToken?: string;\n attributionDestinationUrl?: string;\n attributionIssuedAt?: number;\n};\n\nexport type ImportedRedirectCarry = {\n experiment: Experiment;\n variationId: string;\n visitorId: string;\n exposureSent: boolean;\n attributionToken?: string;\n attributionDestinationUrl?: string;\n attributionIssuedAt?: number;\n};\n\nconst REDIRECT_ATTRIBUTION_COOKIE = \"drip_ra\";\nconst REDIRECT_ATTRIBUTION_TTL_MS = 30_000;\n\nfunction canonicalRedirectAttributionDestination(value: string): string {\n const parsed = new URL(value);\n parsed.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n const normalizedPathname = parsed.pathname.replace(/\\/$/, \"\") || \"/\";\n const pairs: Array<[string, string]> = [];\n parsed.searchParams.forEach((queryValue, key) => pairs.push([key, queryValue]));\n const compareCodePoints = (left: string, right: string): number =>\n left < right ? -1 : left > right ? 1 : 0;\n pairs.sort(([leftKey, leftValue], [rightKey, rightValue]) =>\n compareCodePoints(leftKey, rightKey) || compareCodePoints(leftValue, rightValue));\n const normalized = new URL(parsed.origin + normalizedPathname);\n for (const [key, queryValue] of pairs) normalized.searchParams.append(key, queryValue);\n return normalized.toString();\n}\n\nfunction normalizedEpoch(value: number | undefined): number {\n return Math.max(1, Number.isSafeInteger(value) ? value! : 1);\n}\n\nconst generatedRedirectCarryValues = new Set<string>();\n\nfunction normalizeRedirectPath(pathname: string): string {\n return pathname.replace(/\\/+$/, \"\") || \"/\";\n}\n\nexport function hasGeneratedRedirectAssignmentCarry(destination: URL): boolean {\n const carry = destination.searchParams.get(REDIRECT_ASSIGNMENT_PARAM);\n return carry !== null && generatedRedirectCarryValues.has(carry);\n}\n\nexport function buildRedirectDestination(currentHref: string, redirectUrl: string,\n assignment: Pick<Assignment, \"experimentId\" | \"variationId\" | \"assignmentEpoch\">,\n visitorId = \"\",\n handoverSettings?: ExternalTrackingSettings,\n includeAssignmentCarry = true,\n exposureSent = false): URL | null {\n try {\n const current = new URL(currentHref);\n const destination = new URL(redirectUrl, current);\n if (!/https?:/.test(destination.protocol)) return null;\n const destinationKeys = new Set<string>();\n destination.searchParams.forEach((_value, key) => destinationKeys.add(key));\n current.searchParams.forEach((value, key) => {\n if (!destinationKeys.has(key) && key !== REDIRECT_ASSIGNMENT_PARAM) destination.searchParams.append(key, value);\n });\n if (!destination.hash && current.hash) destination.hash = current.hash;\n // Browser storage is origin-scoped, including protocol and port.\n if (current.origin !== destination.origin && includeAssignmentCarry) {\n if (destination.searchParams.has(REDIRECT_ASSIGNMENT_PARAM)) {\n console.warn(\n `[drip] Redirect destination already uses reserved ${REDIRECT_ASSIGNMENT_PARAM}; preserving the merchant-authored value and omitting assignment carry.`,\n );\n return destination;\n }\n const carry: RedirectCarry = {\n e: assignment.experimentId,\n v: assignment.variationId,\n epoch: normalizedEpoch(assignment.assignmentEpoch),\n handover: createBucketingHandoverPayload(visitorId, [assignment], handoverSettings),\n exposureSent,\n destinationPath: destination.pathname,\n };\n destination.searchParams.set(REDIRECT_ASSIGNMENT_PARAM, JSON.stringify(carry));\n generatedRedirectCarryValues.add(JSON.stringify(carry));\n }\n return destination;\n } catch { return null; }\n}\n\nexport function markRedirectAssignmentCarryExposed(destination: URL): void {\n try {\n if (!hasGeneratedRedirectAssignmentCarry(destination)) return;\n const value = destination.searchParams.get(REDIRECT_ASSIGNMENT_PARAM);\n if (!value) return;\n const carry = JSON.parse(value) as Partial<RedirectCarry>;\n if (\n typeof carry.e !== \"string\" ||\n typeof carry.v !== \"string\" ||\n !Number.isSafeInteger(carry.epoch) ||\n typeof carry.handover !== \"string\"\n ) return;\n const nextValue = JSON.stringify({ ...carry, exposureSent: true });\n generatedRedirectCarryValues.delete(value);\n generatedRedirectCarryValues.add(nextValue);\n destination.searchParams.set(REDIRECT_ASSIGNMENT_PARAM, nextValue);\n } catch {}\n}\n\nexport function finalizeRedirectAssignmentCarryHandover(\n destination: URL,\n verifiedToken: string | null,\n): void {\n try {\n if (!hasGeneratedRedirectAssignmentCarry(destination)) return;\n const value = destination.searchParams.get(REDIRECT_ASSIGNMENT_PARAM);\n if (!value || !verifiedToken) {\n if (value) generatedRedirectCarryValues.delete(value);\n destination.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n return;\n }\n const carry = JSON.parse(value) as Partial<RedirectCarry>;\n if (\n typeof carry.e !== \"string\" ||\n typeof carry.v !== \"string\" ||\n !Number.isSafeInteger(carry.epoch) ||\n typeof carry.handover !== \"string\"\n ) {\n generatedRedirectCarryValues.delete(value);\n destination.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n return;\n }\n const nextValue = JSON.stringify({ ...carry, handover: verifiedToken });\n generatedRedirectCarryValues.delete(value);\n generatedRedirectCarryValues.add(nextValue);\n destination.searchParams.set(REDIRECT_ASSIGNMENT_PARAM, nextValue);\n } catch {\n const value = destination.searchParams.get(REDIRECT_ASSIGNMENT_PARAM);\n if (value) generatedRedirectCarryValues.delete(value);\n destination.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n }\n}\n\nexport function isRedirectLoop(currentHref: string, destination: URL): boolean {\n try {\n const current = new URL(currentHref);\n current.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n const compared = new URL(destination.href);\n compared.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n return current.origin === compared.origin && normalizeRedirectPath(current.pathname) === normalizeRedirectPath(compared.pathname) &&\n current.search === compared.search && current.hash === compared.hash;\n } catch { return true; }\n}\n\nfunction destinationMatchesSourceRules(\n sourceHref: string,\n destination: URL,\n sourceRules: ReturnType<typeof normalizeRuntimeUrlRules>,\n storeOrigin?: string | string[],\n): boolean {\n try {\n if (storeOrigin) {\n return matchUrlRules(destination.href, sourceRules, storeOrigin);\n }\n const source = new URL(sourceHref);\n if (source.origin === destination.origin) {\n return matchUrlRules(destination.href, sourceRules);\n }\n\n const probe = new URL(destination.href);\n probe.hostname = \"apex-host-probe.invalid\";\n const matchingHostIncludes = sourceRules.filter(\n (rule) =>\n rule.include !== false &&\n evalUrlRule(destination.href, rule) &&\n !evalUrlRule(probe.href, rule),\n );\n const destinationRules = [\n ...matchingHostIncludes,\n ...sourceRules.filter((rule) => rule.include === false),\n ];\n return (\n matchingHostIncludes.length > 0 &&\n matchUrlRules(destination.href, destinationRules)\n );\n } catch {\n return matchUrlRules(destination.href, sourceRules);\n }\n}\n\nfunction redirectPlanForCandidate(\n experiment: Experiment | undefined,\n assignment: Assignment,\n currentHref: string,\n visitorId: string,\n handoverSettings?: ExternalTrackingSettings,\n includeAssignmentCarry = true,\n storeOrigin?: string | string[],\n): { destination: URL; assignment: Assignment } | null {\n if (\n experiment?.experimentType !== \"redirect\" ||\n assignment.isControl ||\n !assignment.redirectUrl\n ) {\n return null;\n }\n\n const sourceRules = normalizeRuntimeUrlRules(experiment.targeting);\n if (!sourceRules.some((rule) => rule.include !== false)) return null;\n if (!matchUrlRules(currentHref, sourceRules, storeOrigin)) return null;\n\n const destination = buildRedirectDestination(\n currentHref,\n assignment.redirectUrl,\n assignment,\n visitorId,\n handoverSettings,\n includeAssignmentCarry,\n false,\n );\n if (\n !destination ||\n isRedirectLoop(currentHref, destination) ||\n destinationMatchesSourceRules(\n currentHref,\n destination,\n sourceRules,\n storeOrigin,\n )\n ) {\n return null;\n }\n\n return { destination, assignment };\n}\n\nexport function filterUnsafeRedirectAssignments(\n experiments: Experiment[],\n assignments: Assignment[],\n currentHref: string,\n visitorId = \"\",\n handoverSettings?: ExternalTrackingSettings,\n preserveAssignment?: (assignment: Assignment) => boolean,\n storeOrigin?: string | string[],\n): Assignment[] {\n const experimentsById = new Map(\n experiments.map((experiment) => [experiment.id, experiment]),\n );\n return assignments.filter((assignment) => {\n if (preserveAssignment?.(assignment)) return true;\n const experiment = experimentsById.get(assignment.experimentId);\n if (experiment?.experimentType !== \"redirect\" || assignment.isControl) {\n return true;\n }\n if (assignment.redirectUrl) {\n const destination = buildRedirectDestination(\n currentHref,\n assignment.redirectUrl,\n assignment,\n visitorId,\n handoverSettings,\n );\n // A sticky redirect treatment remains an active, exposable assignment\n // after arrival. This classification must survive reloads, when the\n // one-init carry-import marker no longer exists.\n if (destination && isRedirectLoop(currentHref, destination)) return true;\n }\n return Boolean(\n redirectPlanForCandidate(\n experiment,\n assignment,\n currentHref,\n visitorId,\n handoverSettings,\n true,\n storeOrigin,\n ),\n );\n });\n}\n\nexport function redirectPlanForAssignment(experiments: Experiment[], assignments: Assignment[], currentHref: string,\n visitorId = \"\", handoverSettings?: ExternalTrackingSettings,\n includeAssignmentCarry = true,\n storeOrigin?: string | string[]): { destination: URL; assignment: Assignment } | null {\n for (const assignment of assignments) {\n const experiment = experiments.find((candidate) => candidate.id === assignment.experimentId);\n const plan = redirectPlanForCandidate(\n experiment,\n assignment,\n currentHref,\n visitorId,\n handoverSettings,\n includeAssignmentCarry,\n storeOrigin,\n );\n if (plan) return plan;\n }\n return null;\n}\n\nexport function redirectForAssignment(experiments: Experiment[], assignments: Assignment[], currentHref: string,\n visitorId = \"\", handoverSettings?: ExternalTrackingSettings,\n includeAssignmentCarry = true,\n storeOrigin?: string | string[]): URL | null {\n return redirectPlanForAssignment(\n experiments,\n assignments,\n currentHref,\n visitorId,\n handoverSettings,\n includeAssignmentCarry,\n storeOrigin,\n )?.destination ?? null;\n}\n\nexport function parseRedirectAssignmentCarry(href: string): ParsedRedirectCarry | null {\n try {\n const current = new URL(href);\n const value = current.searchParams.get(REDIRECT_ASSIGNMENT_PARAM);\n if (!value) return null;\n const carry = JSON.parse(value) as Partial<RedirectCarry>;\n if (typeof carry.e !== \"string\" || typeof carry.v !== \"string\" || !Number.isSafeInteger(carry.epoch) || typeof carry.handover !== \"string\") return null;\n if (carry.destinationPath !== undefined && (\n typeof carry.destinationPath !== \"string\" ||\n normalizeRedirectPath(carry.destinationPath) !== normalizeRedirectPath(current.pathname)\n )) return null;\n const expiresAt = bucketingHandoverExpiresAtMs(carry.handover);\n if (\n expiresAt === null ||\n expiresAt <= Date.now()\n ) return null;\n return {\n experimentId: carry.e,\n variationId: carry.v,\n assignmentEpoch: normalizedEpoch(carry.epoch),\n handoverToken: carry.handover,\n expiresAt,\n // Carries emitted by pre-fix SDKs always implied that the source had\n // exposed the assignment. Explicit false is the new gated-source case.\n exposureSent: carry.exposureSent !== false,\n destinationPath: carry.destinationPath,\n };\n } catch { return null; }\n}\n\nexport function persistPendingRedirectAssignmentCarry(\n carry: ParsedRedirectCarry | null,\n): void {\n if (!carry) return;\n try {\n const expiresAt = Math.min(\n carry.expiresAt,\n Date.now() + MAX_PENDING_REDIRECT_CARRY_TTL_MS,\n );\n if (expiresAt <= Date.now()) {\n sessionStorage.removeItem(REDIRECT_ASSIGNMENT_PENDING_KEY);\n return;\n }\n sessionStorage.setItem(\n REDIRECT_ASSIGNMENT_PENDING_KEY,\n JSON.stringify({ ...carry, expiresAt }),\n );\n } catch {}\n}\n\nexport function readPendingRedirectAssignmentCarry(): ParsedRedirectCarry | null {\n try {\n const raw = sessionStorage.getItem(REDIRECT_ASSIGNMENT_PENDING_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<ParsedRedirectCarry>;\n const now = Date.now();\n if (\n typeof parsed.experimentId !== \"string\" ||\n typeof parsed.variationId !== \"string\" ||\n !Number.isSafeInteger(parsed.assignmentEpoch) ||\n typeof parsed.handoverToken !== \"string\" ||\n !parsed.handoverToken ||\n (parsed.exposureSent !== undefined && typeof parsed.exposureSent !== \"boolean\") ||\n typeof parsed.expiresAt !== \"number\" ||\n (parsed.destinationPath !== undefined && typeof parsed.destinationPath !== \"string\") ||\n !Number.isFinite(parsed.expiresAt) ||\n parsed.expiresAt <= now ||\n parsed.expiresAt > now + MAX_PENDING_REDIRECT_CARRY_TTL_MS\n ) {\n sessionStorage.removeItem(REDIRECT_ASSIGNMENT_PENDING_KEY);\n return null;\n }\n return {\n experimentId: parsed.experimentId,\n variationId: parsed.variationId,\n assignmentEpoch: normalizedEpoch(parsed.assignmentEpoch),\n handoverToken: parsed.handoverToken,\n expiresAt: parsed.expiresAt,\n exposureSent: parsed.exposureSent !== false,\n destinationPath: parsed.destinationPath,\n };\n } catch {\n try { sessionStorage.removeItem(REDIRECT_ASSIGNMENT_PENDING_KEY); } catch {}\n return null;\n }\n}\n\nexport function clearPendingRedirectAssignmentCarry(): void {\n try {\n sessionStorage.removeItem(REDIRECT_ASSIGNMENT_PENDING_KEY);\n } catch {}\n}\n\nexport async function verifyRedirectAssignmentCarry(\n carry: ParsedRedirectCarry | null,\n shopId: string,\n verifyToken: (token: string) => Promise<unknown>,\n): Promise<VerifiedRedirectCarry | null> {\n if (!carry || carry.expiresAt <= Date.now()) return null;\n const handover = await verifyBucketingHandoverToken(\n carry.handoverToken,\n shopId,\n verifyToken,\n );\n if (\n !handover?.visitorId ||\n handover.forceMap?.[carry.experimentId] !== carry.variationId\n ) {\n return null;\n }\n const attribution = handover.redirectAttribution;\n const matchingAttribution = attribution\n && attribution.experimentId === carry.experimentId\n && attribution.variationId === carry.variationId\n ? attribution\n : undefined;\n return {\n ...carry,\n visitorId: handover.visitorId,\n attributionToken: matchingAttribution?.token,\n attributionDestinationUrl: matchingAttribution?.destinationUrl,\n attributionIssuedAt: matchingAttribution?.issuedAt,\n };\n}\n\nexport function validateRedirectAssignmentCarry(\n experiments: Experiment[],\n carry: VerifiedRedirectCarry | null,\n href?: string,\n): ImportedRedirectCarry | null {\n if (!carry) return null;\n let currentUrl: URL | undefined;\n if (href) {\n try {\n currentUrl = new URL(href);\n if (carry.destinationPath !== undefined && (\n normalizeRedirectPath(currentUrl.pathname) !== normalizeRedirectPath(carry.destinationPath)\n )) return null;\n } catch {\n return null;\n }\n }\n const experiment = experiments.find((candidate) =>\n candidate.id === carry.experimentId &&\n candidate.experimentType === \"redirect\" &&\n candidate.variations.some((variation) => variation.id === carry.variationId));\n if (!experiment || normalizedEpoch(experiment.assignmentEpoch) !== carry.assignmentEpoch) return null;\n if (currentUrl) {\n const variation = experiment.variations.find((candidate) => candidate.id === carry.variationId);\n if (!variation?.redirectUrl) return null;\n try {\n const destination = new URL(variation.redirectUrl, currentUrl);\n const redirectIsAbsolute = (() => {\n try {\n new URL(variation.redirectUrl!);\n return true;\n } catch {\n return false;\n }\n })();\n if (\n normalizeRedirectPath(destination.pathname) !== normalizeRedirectPath(currentUrl.pathname) ||\n (redirectIsAbsolute && destination.host !== currentUrl.host)\n ) return null;\n } catch {\n return null;\n }\n }\n return {\n experiment,\n variationId: carry.variationId,\n visitorId: carry.visitorId,\n exposureSent: carry.exposureSent,\n attributionToken: carry.attributionToken,\n attributionDestinationUrl: carry.attributionDestinationUrl,\n attributionIssuedAt: carry.attributionIssuedAt,\n };\n}\n\nexport async function readRedirectAssignmentCarry(\n experiments: Experiment[],\n href: string,\n shopId: string,\n verifyToken: (token: string) => Promise<unknown>,\n): Promise<ImportedRedirectCarry | null> {\n const verifiedCarry = await verifyRedirectAssignmentCarry(\n parseRedirectAssignmentCarry(href),\n shopId,\n verifyToken,\n );\n return validateRedirectAssignmentCarry(experiments, verifiedCarry, href);\n}\n\nexport function importRedirectAssignmentCarry(\n carry: ImportedRedirectCarry,\n href: string,\n persistAttribution = true,\n): void {\n persistAssignmentForExperiment(carry.experiment, carry.variationId);\n try {\n if (!persistAttribution) return;\n if (!carry.attributionToken || !carry.attributionDestinationUrl || !carry.attributionIssuedAt) return;\n if (\n canonicalRedirectAttributionDestination(href)\n !== canonicalRedirectAttributionDestination(carry.attributionDestinationUrl)\n ) return;\n const remainingSeconds = Math.floor(\n (carry.attributionIssuedAt + REDIRECT_ATTRIBUTION_TTL_MS - Date.now()) / 1000,\n );\n if (remainingSeconds <= 0) return;\n globalThis.document.cookie = `${REDIRECT_ATTRIBUTION_COOKIE}=${encodeURIComponent(carry.attributionToken)}; Max-Age=${remainingSeconds}; Path=/; SameSite=Lax`;\n } catch {}\n}\n\nexport function stripRedirectAssignmentCarry(href: string): void {\n try {\n const cleaned = new URL(href);\n cleaned.searchParams.delete(REDIRECT_ASSIGNMENT_PARAM);\n try { globalThis.history?.replaceState(globalThis.history.state, \"\", cleaned.href); } catch {}\n } catch {}\n}\n", "export const REPLAY_CONTRACT_VERSION = 1;\nexport const REPLAY_MAX_PAYLOAD_B64_CHARS = 1_000_000;\nexport const REPLAY_MAX_BLOCKS = 400;\n", "import type { ReplaySignals } from \"./replay\";\n\nexport const REPLAY_MAX_CLICK_SIGNALS = 100;\nexport const REPLAY_MAX_NAV_SIGNALS = 50;\nexport const REPLAY_MAX_ERROR_SIGNALS = 20;\nexport const REPLAY_MAX_FORM_SIGNALS = 20;\n\nconst MAX_SELECTOR_LENGTH = 500;\nconst MAX_URL_LENGTH = 2_000;\nconst MAX_ERROR_LENGTH = 200;\nconst MAX_MUTATION_LATENCY_MS = 3_000;\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction normalizeClicks(value: unknown): ReplaySignals[\"clicks\"] {\n if (!Array.isArray(value)) return [];\n const normalized: ReplaySignals[\"clicks\"] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const candidate = item as Record<string, unknown>;\n if (!finiteNumber(candidate.ts) || !finiteNumber(candidate.x) || !finiteNumber(candidate.y)) continue;\n if (typeof candidate.selector !== \"string\") continue;\n const selector = candidate.selector.trim();\n if (!selector || selector.length > MAX_SELECTOR_LENGTH) continue;\n const mutMs = candidate.mut_ms;\n if (mutMs !== undefined && (!finiteNumber(mutMs) || mutMs < 0 || mutMs > MAX_MUTATION_LATENCY_MS)) continue;\n normalized.push({\n ts: candidate.ts,\n selector,\n x: Math.round(candidate.x),\n y: Math.round(candidate.y),\n ...(mutMs === undefined ? {} : { mut_ms: mutMs }),\n });\n if (normalized.length >= REPLAY_MAX_CLICK_SIGNALS) break;\n }\n return normalized;\n}\n\nfunction normalizeNav(value: unknown): ReplaySignals[\"nav\"] {\n if (!Array.isArray(value)) return [];\n const normalized: ReplaySignals[\"nav\"] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const candidate = item as Record<string, unknown>;\n if (!finiteNumber(candidate.ts) || typeof candidate.url !== \"string\") continue;\n const url = candidate.url.trim();\n if (!url || url.length > MAX_URL_LENGTH) continue;\n normalized.push({ ts: candidate.ts, url });\n if (normalized.length >= REPLAY_MAX_NAV_SIGNALS) break;\n }\n return normalized;\n}\n\nfunction normalizeErrors(value: unknown): ReplaySignals[\"errors\"] {\n if (!Array.isArray(value)) return [];\n const normalized: ReplaySignals[\"errors\"] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const candidate = item as Record<string, unknown>;\n if (!finiteNumber(candidate.ts) || typeof candidate.message !== \"string\") continue;\n const message = candidate.message.trim();\n if (!message) continue;\n normalized.push({ ts: candidate.ts, message: message.slice(0, MAX_ERROR_LENGTH) });\n if (normalized.length >= REPLAY_MAX_ERROR_SIGNALS) break;\n }\n return normalized;\n}\n\nfunction normalizeForms(value: unknown): ReplaySignals[\"form_focus\"] {\n if (!Array.isArray(value)) return [];\n const selectors = new Set<string>();\n const normalized: ReplaySignals[\"form_focus\"] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const candidate = item as Record<string, unknown>;\n if (!finiteNumber(candidate.ts) || typeof candidate.selector !== \"string\") continue;\n const selector = candidate.selector.trim();\n if (!selector || selector.length > MAX_SELECTOR_LENGTH || selectors.has(selector)) continue;\n selectors.add(selector);\n normalized.push({ ts: candidate.ts, selector });\n if (normalized.length >= REPLAY_MAX_FORM_SIGNALS) break;\n }\n return normalized;\n}\n\nexport function normalizeReplaySignalState(value: Partial<Record<keyof ReplaySignals, unknown>> | undefined): ReplaySignals {\n const scrollMaxPct = finiteNumber(value?.scroll_max_pct)\n ? Math.max(0, Math.min(100, value.scroll_max_pct))\n : 0;\n return {\n clicks: normalizeClicks(value?.clicks),\n nav: normalizeNav(value?.nav),\n errors: normalizeErrors(value?.errors),\n form_focus: normalizeForms(value?.form_focus),\n form_submit: normalizeForms(value?.form_submit),\n scroll_max_pct: scrollMaxPct,\n };\n}\n", "import { normalizeEndpoint } from \"./endpoint\";\nimport {\n REPLAY_CONTRACT_VERSION,\n REPLAY_MAX_BLOCKS,\n REPLAY_MAX_PAYLOAD_B64_CHARS,\n} from \"@drip/event-schema/replay-contract\";\nimport type { Assignment, Experiment } from \"./types\";\nimport { normalizeReplaySignalState } from \"./replay-signal-state\";\n\nexport const REPLAY_RECORDER_FILENAME = \"drip.replay-recorder.js\";\nexport const REPLAY_FLUSH_INTERVAL_MS = 10_000;\nexport const REPLAY_UNCOMPRESSED_BLOCK_BYTES = 512 * 1024;\nexport const REPLAY_MAX_DURATION_MS = 15 * 60 * 1000;\nexport const REPLAY_MAX_COMPRESSED_BYTES = 4 * 1024 * 1024;\nexport const REPLAY_SAMPLE_KEY_PREFIX = \"drip_rp:\";\nexport const REPLAY_PROGRESS_KEY_PREFIX = \"drip_replay_progress:\";\n\nconst REPLAY_SCRIPT_ID = \"drip-replay-recorder\";\n// Shopify and common hosted checkout paths stay excluded until a later unit\n// adds an explicit checkout policy.\nexport const REPLAY_EXCLUDED_CHECKOUT_PATHS = [\n \"/checkout\",\n \"/checkouts/\",\n \"/cart/checkout\",\n] as const;\n\nexport type ReplayAssignment = {\n experiment_id: string;\n variation_id: string;\n};\n\ntype ReplayEvent = {\n type?: number;\n timestamp?: number;\n data?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type ReplayRecorderEmission = {\n event?: ReplayEvent;\n};\n\nexport type ReplayRecorderApi = {\n start: (options: {\n emit: (emission: ReplayRecorderEmission) => void;\n signalState?: ReplaySignals;\n }) => () => void;\n compress: (bytes: Uint8Array) => Promise<Uint8Array>;\n compressSync: (bytes: Uint8Array) => Uint8Array;\n takeSignals: () => ReplaySignals;\n version: string;\n};\n\ntype ReplayClickSignal = {\n ts: number;\n selector: string;\n x: number;\n y: number;\n mut_ms?: number;\n};\n\nexport type ReplaySignals = {\n clicks: ReplayClickSignal[];\n nav: Array<{ ts: number; url: string }>;\n errors: Array<{ ts: number; message: string }>;\n form_focus: Array<{ ts: number; selector: string }>;\n form_submit: Array<{ ts: number; selector: string }>;\n scroll_max_pct: number;\n};\n\nexport type ReplayEnvelope = {\n contract: 1;\n shop_id: string;\n visitor_id: string;\n session_id: string;\n seq: number;\n first_ts: number;\n last_ts: number;\n event_count: number;\n url: string;\n environment: string;\n qa_mode: 0 | 1;\n qa_session_id?: string;\n sdk_version: string;\n assignments: ReplayAssignment[];\n codec: \"deflate\";\n payload_b64: string;\n signals: ReplaySignals;\n};\n\nexport type ReplayController = {\n stop: (discard?: boolean) => void;\n isStopped: () => boolean;\n update: (assignments: Assignment[], experiments: Experiment[]) => void;\n};\n\ntype ReplayControllerOptions = {\n assignments: Assignment[];\n experiments: Experiment[];\n recorderUrl: string;\n endpoint: string;\n shopId: string;\n visitorId: string;\n sessionId: string;\n environment: string;\n qaMode: boolean;\n qaSessionId?: string;\n sdkVersion: string;\n ingestSignature?: string;\n isTrackingBlocked: () => boolean;\n loadRecorder?: (url: string) => Promise<ReplayRecorderApi>;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function normalizeReplaySampleRate(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value)\n ? clamp(value, 0, 1)\n : 0.05;\n}\n\nfunction replaySampleKey(assignment: Assignment): string {\n return `${REPLAY_SAMPLE_KEY_PREFIX}${assignment.experimentId}:${assignment.variationId}`;\n}\n\nfunction sampledIn(assignment: Assignment, sampleRate: number): boolean {\n try {\n const key = replaySampleKey(assignment);\n const existing = sessionStorage.getItem(key);\n if (existing === \"1\") return true;\n if (existing === \"0\") return false;\n const selected = sampleRate >= 1\n ? true\n : sampleRate <= 0\n ? false\n : Math.random() < sampleRate;\n sessionStorage.setItem(key, selected ? \"1\" : \"0\");\n return selected;\n } catch {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return Math.random() < sampleRate;\n }\n}\n\nexport function resolveReplayAssignments(\n assignments: Assignment[],\n experiments: Experiment[],\n): ReplayAssignment[] {\n const experimentsById = new Map(experiments.map((experiment) => [experiment.id, experiment]));\n return assignments.flatMap((assignment) => {\n const capture = experimentsById.get(assignment.experimentId)?.replayCapture;\n if (!capture?.enabled) return [];\n if (!sampledIn(assignment, normalizeReplaySampleRate(capture.sampleRate))) return [];\n return [{\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n }];\n });\n}\n\nexport function isReplayCheckoutPath(pathname: string): boolean {\n const path = pathname.toLowerCase();\n return REPLAY_EXCLUDED_CHECKOUT_PATHS.some((excluded) =>\n excluded.endsWith(\"/\") ? path.startsWith(excluded) : path === excluded || path.startsWith(`${excluded}/`),\n );\n}\n\nexport function resolveReplayRecorderUrl(input: {\n configuredUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n}): string | null {\n if (input.configuredUrl) {\n try {\n const configuredUrl = new URL(input.configuredUrl);\n if (configuredUrl.protocol === \"http:\" || configuredUrl.protocol === \"https:\") {\n return configuredUrl.toString();\n }\n } catch {}\n }\n if (!input.scriptSrc) return null;\n try {\n const scriptUrl = new URL(input.scriptSrc, input.pageUrl);\n if (/^\\/sdk\\/[^/]+\\/[^/]+\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, REPLAY_RECORDER_FILENAME);\n } else if (/^\\/drip(?:\\.[A-Za-z0-9_-]+)*\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, REPLAY_RECORDER_FILENAME);\n } else {\n return null;\n }\n scriptUrl.search = \"\";\n scriptUrl.hash = \"\";\n return scriptUrl.toString();\n } catch {\n return null;\n }\n}\n\ntype ReplayRecorderGlobal = typeof globalThis & {\n __dripReplayRecorder?: ReplayRecorderApi;\n};\n\nexport function loadReplayRecorder(\n recorderUrl: string,\n documentLike: Document = document,\n): Promise<ReplayRecorderApi> {\n const existingApi = (globalThis as ReplayRecorderGlobal).__dripReplayRecorder;\n if (existingApi?.start) return Promise.resolve(existingApi);\n\n return new Promise((resolve, reject) => {\n documentLike.getElementById(REPLAY_SCRIPT_ID)?.remove();\n const script = documentLike.createElement(\"script\");\n script.id = REPLAY_SCRIPT_ID;\n script.src = recorderUrl;\n script.async = true;\n script.crossOrigin = \"anonymous\";\n script.onload = () => {\n const api = (globalThis as ReplayRecorderGlobal).__dripReplayRecorder;\n if (!api || typeof api.start !== \"function\") {\n script.remove();\n reject(new Error(\"Replay recorder did not expose a start function\"));\n return;\n }\n resolve(api);\n };\n script.onerror = () => {\n script.remove();\n reject(new Error(\"Replay recorder failed to load\"));\n };\n (documentLike.head || documentLike.documentElement).appendChild(script);\n });\n}\n\nfunction eventTimestamp(event: ReplayEvent | undefined, fallback: number): number {\n return typeof event?.timestamp === \"number\" && Number.isFinite(event.timestamp)\n ? event.timestamp\n : fallback;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += 32_768) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 32_768));\n }\n return btoa(binary);\n}\n\nfunction replayEndpoint(endpoint: string): string {\n return normalizeEndpoint(endpoint) + \"/replay-blocks\";\n}\n\ntype BufferedReplayBlock = {\n seq: number;\n events: ReplayEvent[];\n signals: ReplaySignals;\n url: string;\n assignments: ReplayAssignment[];\n};\n\ntype ReplayProgress = ReplaySignals & {\n nextSeq: number;\n totalCompressedBytes: number;\n elapsedMs: number;\n terminal: boolean;\n};\n\nfunction finiteNonnegativeInteger(value: unknown): number {\n return Number.isFinite(value) && (value as number) >= 0 ? Math.floor(value as number) : 0;\n}\n\nfunction readReplayProgress(key: string): ReplayProgress {\n let stored: Record<string, unknown> = {};\n try {\n const parsed = JSON.parse(sessionStorage.getItem(key) ?? \"{}\");\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n stored = parsed as Record<string, unknown>;\n }\n } catch {}\n const signalState = normalizeReplaySignalState(stored);\n return {\n nextSeq: finiteNonnegativeInteger(stored.nextSeq),\n totalCompressedBytes: finiteNonnegativeInteger(stored.totalCompressedBytes),\n elapsedMs: finiteNonnegativeInteger(stored.elapsedMs),\n terminal: stored.terminal === true,\n ...signalState,\n };\n}\n\nexport async function startReplayCapture(\n options: ReplayControllerOptions,\n): Promise<ReplayController | null> {\n if (options.isTrackingBlocked()) return null;\n if (typeof location === \"undefined\" || isReplayCheckoutPath(location.pathname)) return null;\n let activeAssignments = resolveReplayAssignments(options.assignments, options.experiments);\n if (activeAssignments.length === 0) return null;\n\n const progressKey = `${REPLAY_PROGRESS_KEY_PREFIX}${options.sessionId}`;\n const progress = readReplayProgress(progressKey);\n const writeProgress = () => {\n try { sessionStorage.setItem(progressKey, JSON.stringify(progress)); } catch {}\n };\n if (\n progress.terminal\n || progress.nextSeq >= REPLAY_MAX_BLOCKS\n || progress.totalCompressedBytes >= REPLAY_MAX_COMPRESSED_BYTES\n || progress.elapsedMs >= REPLAY_MAX_DURATION_MS\n ) {\n progress.terminal = true;\n writeProgress();\n return null;\n }\n\n const recorder = await (options.loadRecorder ?? loadReplayRecorder)(options.recorderUrl);\n if (options.isTrackingBlocked() || isReplayCheckoutPath(location.pathname)) return null;\n\n const encoder = new TextEncoder();\n let bufferedEvents: ReplayEvent[] = [];\n let bufferedBytes = 2;\n let bufferedUrl = location.href.slice(0, 2_000);\n let stopped = false;\n let discarded = false;\n let flushChain = Promise.resolve();\n const pageStartedAt = Date.now();\n const elapsedBeforePage = progress.elapsedMs;\n\n const persistProgress = (terminal = progress.terminal) => {\n progress.elapsedMs = Math.min(\n REPLAY_MAX_DURATION_MS,\n elapsedBeforePage + Math.max(0, Date.now() - pageStartedAt),\n );\n progress.terminal = terminal;\n writeProgress();\n };\n\n const postBlock = async (block: BufferedReplayBlock, sync: boolean) => {\n if (discarded) return;\n if (options.isTrackingBlocked()) {\n stop(true);\n return;\n }\n const raw = encoder.encode(JSON.stringify(block.events));\n const compressed = sync ? recorder.compressSync(raw) : await recorder.compress(raw);\n if (discarded) return;\n if (options.isTrackingBlocked()) {\n stop(true);\n return;\n }\n const payloadB64 = bytesToBase64(compressed);\n if (payloadB64.length > REPLAY_MAX_PAYLOAD_B64_CHARS) {\n stop(true);\n return;\n }\n if (progress.totalCompressedBytes + compressed.length > REPLAY_MAX_COMPRESSED_BYTES) {\n stopForBudget();\n return;\n }\n progress.totalCompressedBytes += compressed.length;\n persistProgress();\n const firstTs = eventTimestamp(block.events[0], Date.now());\n const lastTs = eventTimestamp(block.events[block.events.length - 1], firstTs);\n const envelope: ReplayEnvelope = {\n contract: REPLAY_CONTRACT_VERSION,\n shop_id: options.shopId,\n visitor_id: options.visitorId,\n session_id: options.sessionId,\n seq: block.seq,\n first_ts: firstTs,\n last_ts: lastTs,\n event_count: block.events.length,\n url: block.url,\n environment: options.environment,\n qa_mode: options.qaMode ? 1 : 0,\n ...(options.qaMode && options.qaSessionId ? { qa_session_id: options.qaSessionId } : {}),\n sdk_version: options.sdkVersion,\n assignments: block.assignments,\n codec: \"deflate\",\n payload_b64: payloadB64,\n signals: block.signals,\n };\n const body = JSON.stringify(envelope);\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (options.shopId) headers[\"X-Drip-Shop\"] = options.shopId;\n if (options.ingestSignature) headers[\"X-Drip-Signature\"] = options.ingestSignature;\n try {\n await fetch(replayEndpoint(options.endpoint), {\n method: \"POST\",\n headers,\n body,\n keepalive: sync && encoder.encode(body).length < 60_000,\n });\n } catch {}\n if (progress.totalCompressedBytes >= REPLAY_MAX_COMPRESSED_BYTES) stop();\n };\n\n const takeBlock = (): BufferedReplayBlock | null => {\n if (!bufferedEvents.length || progress.nextSeq >= REPLAY_MAX_BLOCKS) return null;\n const signals = recorder.takeSignals();\n const block = {\n seq: progress.nextSeq,\n events: bufferedEvents,\n signals,\n url: bufferedUrl,\n assignments: [...activeAssignments],\n };\n progress.nextSeq += 1;\n Object.assign(progress, normalizeReplaySignalState(signals));\n persistProgress();\n bufferedEvents = [];\n bufferedBytes = 2;\n bufferedUrl = location.href.slice(0, 2_000);\n return block;\n };\n\n const flush = (sync = false) => {\n const block = takeBlock();\n if (!block) {\n if (progress.nextSeq >= REPLAY_MAX_BLOCKS) stop();\n return;\n }\n if (sync) {\n void postBlock(block, true);\n } else {\n flushChain = flushChain\n .then(() => postBlock(block, false))\n .catch(() => undefined);\n }\n if (progress.nextSeq >= REPLAY_MAX_BLOCKS) stop();\n };\n\n const onEmission = (emission: ReplayRecorderEmission) => {\n if (stopped || discarded || !emission.event) return;\n if (options.isTrackingBlocked() || isReplayCheckoutPath(location.pathname)) {\n stop(true);\n return;\n }\n if (!bufferedEvents.length) bufferedUrl = location.href.slice(0, 2_000);\n bufferedBytes += encoder.encode(JSON.stringify(emission.event)).length\n + (bufferedEvents.length ? 1 : 0);\n bufferedEvents.push(emission.event);\n if (bufferedBytes >= REPLAY_UNCOMPRESSED_BLOCK_BYTES) flush();\n };\n\n let stopRecorder = recorder.start({\n emit: onEmission,\n signalState: normalizeReplaySignalState(progress),\n });\n Object.assign(progress, normalizeReplaySignalState(recorder.takeSignals()));\n persistProgress();\n const interval = window.setInterval(() => flush(), REPLAY_FLUSH_INTERVAL_MS);\n const duration = window.setTimeout(() => {\n flush();\n stop();\n }, REPLAY_MAX_DURATION_MS - progress.elapsedMs);\n const onPageLifecycle = () => {\n persistProgress();\n flush(true);\n };\n const onVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") {\n persistProgress();\n flush(true);\n }\n };\n window.addEventListener(\"pagehide\", onPageLifecycle);\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n function stopCapture(discard: boolean, terminal: boolean): void {\n if (discard) {\n discarded = true;\n bufferedEvents = [];\n bufferedBytes = 2;\n }\n if (stopped) return;\n stopped = true;\n if (!discard || terminal) persistProgress(terminal);\n window.clearInterval(interval);\n window.clearTimeout(duration);\n window.removeEventListener(\"pagehide\", onPageLifecycle);\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n stopRecorder();\n stopRecorder = () => {};\n }\n\n function stopForBudget(): void {\n stopCapture(true, true);\n }\n\n function stop(discard = false): void {\n stopCapture(discard, discard ? progress.terminal : true);\n }\n\n return {\n stop,\n isStopped: () => stopped,\n update(assignments, experiments) {\n if (options.isTrackingBlocked()) {\n stop(true);\n return;\n }\n const known = new Set(activeAssignments.map((assignment) =>\n `${assignment.experiment_id}:${assignment.variation_id}`));\n for (const assignment of resolveReplayAssignments(assignments, experiments)) {\n const key = `${assignment.experiment_id}:${assignment.variation_id}`;\n if (!known.has(key)) {\n known.add(key);\n activeAssignments.push(assignment);\n }\n }\n },\n };\n}\n", "/**\n * analytics.ts \u2014 Automatic pageview and engagement tracking.\n *\n * Fires two event types through the existing track() pipeline:\n * - \"pageview\" on every page load / SPA navigation\n * - \"page_exit\" on navigation away / tab close (with duration + scroll depth)\n */\n\ntype TrackFn = (type: string, data?: Record<string, unknown>) => void;\n\nlet pageEnteredAt = 0;\nlet maxScrollDepth = 0;\nlet scrollCleanup: (() => void) | null = null;\nlet referrer = \"\";\nlet utmParams: Record<string, string> = {};\nlet initialized = false;\n\n/** Parse UTM params from URL. Persist in sessionStorage so they stick across the session. */\nfunction captureUtm(): Record<string, string> {\n const KEY = \"drip_utm\";\n try {\n const stored = sessionStorage.getItem(KEY);\n if (stored) return JSON.parse(stored);\n } catch {}\n const params = new URLSearchParams(location.search);\n const utms: Record<string, string> = {};\n for (const k of [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ]) {\n const v = params.get(k);\n if (v) utms[k] = v;\n }\n if (Object.keys(utms).length) {\n try {\n sessionStorage.setItem(KEY, JSON.stringify(utms));\n } catch {}\n }\n return utms;\n}\n\n/** Capture and normalise the referring domain. */\nfunction captureReferrer(): string {\n const ref = document.referrer;\n if (!ref) return \"(direct)\";\n try {\n const host = new URL(ref).hostname;\n if (host === location.hostname) return \"(internal)\";\n return host;\n } catch {\n return \"(direct)\";\n }\n}\n\n/** Track max scroll depth as 0-100 percentage. Returns cleanup fn. */\nfunction startScrollTracking(): () => void {\n const handler = () => {\n // The snippet can execute in <head> before <body> exists.\n if (!document.body) return;\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n );\n const viewportHeight = window.innerHeight;\n if (docHeight <= viewportHeight) {\n maxScrollDepth = 100;\n return;\n }\n const pct = Math.round(((window.scrollY + viewportHeight) / docHeight) * 100);\n if (pct > maxScrollDepth) maxScrollDepth = pct;\n };\n window.addEventListener(\"scroll\", handler, { passive: true });\n let domReady: (() => void) | null = null;\n if (document.body) {\n handler();\n } else {\n domReady = () => handler();\n document.addEventListener(\"DOMContentLoaded\", domReady, { once: true });\n }\n return () => {\n window.removeEventListener(\"scroll\", handler);\n // A page exit before DOM readiness must not leave the deferred\n // measurement alive to contaminate the next page's scroll depth.\n if (domReady) document.removeEventListener(\"DOMContentLoaded\", domReady);\n };\n}\n\n/** Clean URL: origin + pathname only (strips query params). */\nexport function cleanUrl(): string {\n return location.origin + location.pathname;\n}\n\n/** Called on every page load / SPA navigation. */\nexport function onPageEnter(trackFn: TrackFn): void {\n pageEnteredAt = Date.now();\n maxScrollDepth = 0;\n\n // Capture referrer + UTMs once per session\n if (!initialized) {\n referrer = captureReferrer();\n utmParams = captureUtm();\n initialized = true;\n }\n\n // Start scroll tracking\n if (scrollCleanup) {\n scrollCleanup();\n scrollCleanup = null;\n }\n scrollCleanup = startScrollTracking();\n\n // Fire pageview\n const data: Record<string, unknown> = {\n referrer,\n path: location.pathname,\n title: document.title,\n };\n // Merge UTMs into event data (only non-empty values)\n for (const [k, v] of Object.entries(utmParams)) {\n if (v) data[k] = v;\n }\n trackFn(\"pageview\", data);\n}\n\n/** Called on SPA navigation away / page unload. */\nexport function onPageExit(trackFn: TrackFn): void {\n if (!pageEnteredAt) return;\n const duration = Math.round((Date.now() - pageEnteredAt) / 1000);\n\n if (scrollCleanup) {\n scrollCleanup();\n scrollCleanup = null;\n }\n\n trackFn(\"page_exit\", {\n duration,\n scroll_depth: maxScrollDepth,\n path: location.pathname,\n });\n\n pageEnteredAt = 0;\n maxScrollDepth = 0;\n}\n", "import { cleanUrl, onPageExit } from \"./analytics\";\nimport { lifetimeIdentityStorage } from \"./hash\";\nimport { TrackEvent } from \"./types\";\n\ntype TrackerOptions = {\n endpoint: string;\n proxyEventDelivery?: { enabled: boolean; path?: string };\n assetFallback?: boolean;\n shopId?: string;\n ingestShopId?: string;\n ingestSignature?: string;\n visitorId?: string;\n flushIntervalMs?: number;\n maxBatchSize?: number;\n /** Returns the active experiment/variation at unload time for page_exit attribution. */\n getActiveAssignment?: () => { experimentId: string; variationId: string } | null;\n /** Builds global and experiment-scoped page-exit events without flushing during unload. */\n buildPageExitEvents?: (type: string, data?: Record<string, unknown>) => TrackEvent[];\n /** When true, all events are tagged as QA traffic. */\n qaMode?: boolean;\n /** Unique QA session identifier for grouping QA events. */\n qaSessionId?: string;\n /** Active Apex environment stamped onto every outgoing event. */\n environment?: string;\n /** Global cohort stamped on every event while program holdout is enabled. */\n cohort?: \"holdout\" | \"active\";\n /** Reporting epoch of the configuration that produced the global cohort. */\n holdoutConfigEpoch?: number;\n};\n\nexport function getOrCreateSessionId(): string {\n try {\n const existing = sessionStorage.getItem(\"drip_sid\");\n if (existing) return existing;\n const id = Math.random().toString(36).slice(2) + Date.now().toString(36);\n sessionStorage.setItem(\"drip_sid\", id);\n return id;\n } catch {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n }\n}\n\nconst RECOVERY_KEY = \"drip_events\";\nconst VISITOR_SESSIONS_KEY = \"drip_visitor_sessions_v1\";\n\nfunction carriesVisitorSessions(type: string): boolean {\n return /^(experiment_viewed|personalization_rendered|goal|conversion|pageview)$/.test(type);\n}\n\n// Enough remembered session ids that parallel tabs (each with its own\n// per-tab session) cannot ping-pong the counter upward on reloads.\nconst VISITOR_SESSIONS_REMEMBERED = 8;\n\nfunction visitorSessionCount(sessionId: string): number | undefined {\n try {\n // Respect the configured storage policy: without a lifetime store\n // (sessionStorage/memory/cookie modes) a cross-session count would lie\n // (\"new\" every session), so the field is simply not stamped.\n const store = lifetimeIdentityStorage();\n if (!store) return undefined;\n const raw = store.getItem(VISITOR_SESSIONS_KEY);\n let stored: { count?: unknown; lastSessionId?: unknown; recentSessionIds?: unknown } | undefined;\n try {\n stored = JSON.parse(raw || \"0\");\n } catch {\n // Malformed state is equivalent to a missing counter and recovers at one.\n }\n const storedRecent = stored?.recentSessionIds;\n const storedLast = stored?.lastSessionId;\n const recent: string[] = Array.isArray(storedRecent)\n ? (storedRecent as unknown[]).filter(\n (id): id is string => typeof id === \"string\",\n )\n : typeof storedLast === \"string\"\n ? [storedLast]\n : [];\n const storedCount = stored?.count;\n const count =\n Number.isInteger(storedCount) && Number(storedCount) > 0 && recent.length > 0\n ? Number(storedCount)\n : 0;\n if (count && recent.includes(sessionId)) return count;\n const next = count + 1;\n store.setItem(\n VISITOR_SESSIONS_KEY,\n JSON.stringify({\n count: next,\n recentSessionIds: [sessionId, ...recent].slice(0, VISITOR_SESSIONS_REMEMBERED),\n }),\n );\n // sessionStorage is per-tab, so parallel tabs mint separate sessions.\n // This deliberately follows the SDK's existing session model; clearing\n // browser storage restarts the lifetime counter at one.\n return next;\n } catch {\n return undefined;\n }\n}\n\nexport function createEventId(): string {\n const cryptoApi = globalThis.crypto as Crypto | undefined;\n if (typeof cryptoApi?.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n return [\n Date.now().toString(36),\n Math.random().toString(36).slice(2),\n Math.random().toString(36).slice(2),\n ].join(\"-\");\n}\n\nexport class Tracker {\n private endpoint: string;\n private proxyEndpoint: string | null;\n private shopId: string;\n private ingestShopId: string;\n private ingestSignature: string;\n private visitorId: string;\n private sessionId: string;\n private visitorSessions: number | undefined;\n private flushIntervalMs: number;\n private maxBatchSize: number;\n private queue: TrackEvent[] = [];\n private activeBatch: TrackEvent[] | null = null;\n private timer: number | null = null;\n private flushInFlight = false;\n private flushPromise: Promise<void> | null = null;\n private nextFlushAt = 0;\n private backoffMs = 0;\n private readonly maxQueueSize = 2000;\n private getActiveAssignment: (() => { experimentId: string; variationId: string } | null) | null;\n private buildPageExitEvents: ((type: string, data?: Record<string, unknown>) => TrackEvent[]) | null;\n private qaMode: boolean;\n private qaSessionId: string;\n private environment: string;\n private cohort: \"holdout\" | \"active\" | undefined;\n private holdoutConfigEpoch: number | undefined;\n private assetFallback: boolean;\n private pagehideHandler: ((event?: PageTransitionEvent) => void) | null = null;\n private beforeUnloadHandler: (() => void) | null = null;\n private pageshowHandler: (() => void) | null = null;\n private beforeUnloadResetTimer: number | null = null;\n private visibilityHandler: (() => void) | null = null;\n private pageLifecycleFlushed = false;\n private pageTeardownStarted = false;\n\n constructor(options: TrackerOptions) {\n this.endpoint = options.endpoint;\n this.proxyEndpoint = resolveProxyEventEndpoint(options.proxyEventDelivery);\n this.shopId = options.shopId ?? \"\";\n this.ingestShopId = options.ingestShopId ?? options.shopId ?? \"\";\n this.ingestSignature = options.ingestSignature ?? \"\";\n this.visitorId = options.visitorId ?? \"\";\n this.sessionId = getOrCreateSessionId();\n this.visitorSessions = visitorSessionCount(this.sessionId);\n this.flushIntervalMs = options.flushIntervalMs ?? 5000;\n this.maxBatchSize = options.maxBatchSize ?? 20;\n this.getActiveAssignment = options.getActiveAssignment ?? null;\n this.buildPageExitEvents = options.buildPageExitEvents ?? null;\n this.qaMode = options.qaMode ?? false;\n this.qaSessionId = options.qaSessionId ?? \"\";\n this.environment = options.environment || \"production\";\n this.cohort = options.cohort;\n this.holdoutConfigEpoch =\n Number.isSafeInteger(options.holdoutConfigEpoch) &&\n (options.holdoutConfigEpoch ?? 0) > 0\n ? options.holdoutConfigEpoch\n : undefined;\n this.assetFallback = options.assetFallback === true;\n }\n\n\n\n /** Public accessor for the session ID (used by the Shopify pixel bridge). */\n getSessionId(): string {\n return this.sessionId;\n }\n\n start(): void {\n if (this.timer !== null) return;\n this.recoverEvents();\n this.timer = window.setInterval(() => this.flush(), this.flushIntervalMs);\n this.listenUnload();\n }\n\n stop(): void {\n if (this.timer !== null) {\n window.clearInterval(this.timer);\n this.timer = null;\n }\n if (this.pagehideHandler) window.removeEventListener(\"pagehide\", this.pagehideHandler);\n if (this.beforeUnloadHandler) window.removeEventListener(\"beforeunload\", this.beforeUnloadHandler);\n if (this.pageshowHandler) window.removeEventListener(\"pageshow\", this.pageshowHandler);\n if (this.beforeUnloadResetTimer !== null) window.clearTimeout(this.beforeUnloadResetTimer);\n this.pagehideHandler = null;\n this.beforeUnloadHandler = null;\n this.pageshowHandler = null;\n this.beforeUnloadResetTimer = null;\n if (this.visibilityHandler && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = null;\n }\n }\n\n track(event: TrackEvent): void {\n const enriched = this.enrichEvent(event);\n this.queue.push(enriched);\n // Prevent unbounded growth during outages (Black Friday spikes, offline, ad blockers).\n if (this.queue.length > this.maxQueueSize) {\n this.queue.splice(0, this.queue.length - this.maxQueueSize);\n }\n if (this.queue.length >= this.maxBatchSize) {\n void this.flush();\n }\n }\n\n private enrichEvent(event: TrackEvent): TrackEvent {\n const systemData: Record<string, unknown> = {};\n if (this.assetFallback) systemData.asset_fallback = true;\n if (this.cohort) {\n systemData.cohort = this.cohort;\n if (this.holdoutConfigEpoch) {\n systemData.holdout_config_epoch = this.holdoutConfigEpoch;\n }\n }\n if (\n this.visitorSessions &&\n carriesVisitorSessions(event.type) &&\n !(\"visitor_sessions\" in (event.data ?? {}))\n ) {\n systemData.visitor_sessions = this.visitorSessions;\n }\n const enriched: TrackEvent = {\n ...event,\n ...(Object.keys(systemData).length > 0\n ? {\n // Worker sanitization retains the first 80 insertion-ordered\n // properties. Insert trusted SDK fields before merchant data, then\n // re-stamp them so user input cannot override their values without\n // moving their insertion position behind the cap.\n data: { ...systemData, ...event.data, ...systemData },\n }\n : {}),\n event_id:\n typeof event.event_id === \"string\" && event.event_id.trim()\n ? event.event_id\n : createEventId(),\n shopId: event.shopId ?? this.shopId,\n visitorId: event.visitorId ?? this.visitorId,\n sessionId: event.sessionId ?? this.sessionId,\n url: event.url ?? (typeof location !== \"undefined\" ? location.href : \"\"),\n ts: event.ts ?? Date.now(),\n environment: this.environment,\n };\n if (this.qaMode) {\n enriched.qa_mode = true;\n if (this.qaSessionId) enriched.qa_session_id = this.qaSessionId;\n }\n return enriched;\n }\n\n private scheduleBackoff(ms: number): void {\n const jitter = Math.floor(Math.random() * 250);\n this.backoffMs = Math.max(this.backoffMs, ms);\n this.nextFlushAt = Date.now() + this.backoffMs + jitter;\n }\n\n private resetBackoff(): void {\n this.backoffMs = 0;\n this.nextFlushAt = 0;\n }\n\n private parseRetryAfterSeconds(value: string | null): number | null {\n if (!value) return null;\n const n = Number.parseInt(value, 10);\n if (Number.isFinite(n) && n > 0) return n;\n return null;\n }\n\n async flush(): Promise<void> {\n if (this.flushPromise) return this.flushPromise;\n if (!this.queue.length || !this.endpoint) return;\n if (this.nextFlushAt && Date.now() < this.nextFlushAt) return;\n\n const flushPromise = this.drainQueue();\n this.flushPromise = flushPromise;\n try {\n await flushPromise;\n } finally {\n if (this.flushPromise === flushPromise) {\n this.flushPromise = null;\n }\n }\n }\n\n private async drainQueue(): Promise<void> {\n try {\n this.flushInFlight = true;\n while (this.queue.length && this.endpoint) {\n if (this.nextFlushAt && Date.now() < this.nextFlushAt) return;\n\n // Never send unbounded payloads. Worker rejects >200 events; keep batches small.\n const batch = this.queue.splice(0, this.maxBatchSize);\n this.activeBatch = batch;\n if (!batch.length) return;\n const payload = this.buildPayload(batch);\n let res: Response;\n if (this.proxyEndpoint) {\n try {\n res = await fetch(this.proxyEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: payload,\n keepalive: true,\n });\n } catch {\n res = new Response(null, { status: 503 });\n }\n if (!res.ok) {\n res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: this.buildPayload(batch, \"proxy_failed\"),\n keepalive: true,\n });\n }\n } else res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: payload,\n keepalive: true,\n });\n if (res.ok) {\n this.removeRecovery(batch);\n this.activeBatch = null;\n this.resetBackoff();\n continue;\n }\n\n // Re-queue on any non-2xx response.\n this.queue.unshift(...batch);\n this.activeBatch = null;\n if (this.pageTeardownStarted) this.saveRecovery(batch);\n\n if (res.status === 429) {\n const retryAfter = this.parseRetryAfterSeconds(res.headers.get(\"Retry-After\"));\n const waitMs = retryAfter ? retryAfter * 1000 : 5_000;\n this.scheduleBackoff(waitMs);\n return;\n }\n\n if (res.status === 401 || res.status === 403) {\n // Likely expired/invalid signature. Keep events in memory/sessionStorage and retry rarely.\n this.scheduleBackoff(5 * 60_000);\n return;\n }\n\n if (res.status >= 500) {\n // Exponential backoff up to 60s.\n const next = this.backoffMs ? Math.min(60_000, this.backoffMs * 2) : 1_000;\n this.scheduleBackoff(next);\n return;\n }\n\n // For other 4xx (e.g. bad payload), don't spin. Retry slowly.\n this.scheduleBackoff(30_000);\n return;\n }\n } catch {\n // Network failure (offline, blocked, transient). Requeue and back off.\n if (this.activeBatch?.length) {\n this.queue.unshift(...this.activeBatch);\n if (this.pageTeardownStarted) this.saveRecovery(this.activeBatch);\n this.activeBatch = null;\n }\n const next = this.backoffMs ? Math.min(60_000, this.backoffMs * 2) : 1_000;\n this.scheduleBackoff(next);\n } finally {\n this.flushInFlight = false;\n }\n }\n\n private buildPayload(batch: TrackEvent[], deliveryDowngrade?: string): string {\n const events = deliveryDowngrade\n ? batch.map((event) => ({ ...event, data: { ...event.data, delivery_downgrade: deliveryDowngrade } }))\n : batch;\n const body: Record<string, unknown> = { events };\n // Include auth in payload body so sendBeacon (which can't set headers) works.\n if (this.ingestShopId) body._shopId = this.ingestShopId;\n if (this.ingestSignature) body._signature = this.ingestSignature;\n return JSON.stringify(body);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (this.ingestShopId) headers[\"X-Drip-Shop\"] = this.ingestShopId;\n if (this.ingestSignature) headers[\"X-Drip-Signature\"] = this.ingestSignature;\n return headers;\n }\n\n private recoveryEventKey(event: TrackEvent): string | null {\n const eventId = typeof event.event_id === \"string\" ? event.event_id.trim() : \"\";\n if (!eventId) return null;\n return JSON.stringify([\n eventId,\n event.type,\n event.experimentId ?? null,\n event.variationId ?? null,\n event.environment || \"production\",\n ]);\n }\n\n private readRecovery(): TrackEvent[] {\n try {\n const raw = sessionStorage.getItem(RECOVERY_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed as TrackEvent[] : [];\n } catch {\n return [];\n }\n }\n\n private saveRecovery(events: TrackEvent[]): void {\n if (!events.length) return;\n const merged = [...this.readRecovery(), ...events];\n const keyed = new Map<string, TrackEvent>();\n const unkeyed: TrackEvent[] = [];\n for (const event of merged) {\n const key = this.recoveryEventKey(event);\n if (key) keyed.set(key, event);\n else unkeyed.push(event);\n }\n const bounded = [...keyed.values(), ...unkeyed].slice(-this.maxQueueSize);\n try {\n sessionStorage.setItem(RECOVERY_KEY, JSON.stringify(bounded));\n } catch {}\n }\n\n private removeRecovery(events: TrackEvent[]): void {\n const deliveredKeys = new Set(\n events\n .map((event) => this.recoveryEventKey(event))\n .filter((key): key is string => key !== null),\n );\n if (deliveredKeys.size === 0) return;\n try {\n const remaining = this.readRecovery().filter((event) => {\n const key = this.recoveryEventKey(event);\n return key === null || !deliveredKeys.has(key);\n });\n if (remaining.length) sessionStorage.setItem(RECOVERY_KEY, JSON.stringify(remaining));\n else sessionStorage.removeItem(RECOVERY_KEY);\n } catch {}\n }\n\n private queuePageExitEvents(): void {\n const assignment = this.getActiveAssignment?.() ?? null;\n onPageExit((type, data) => {\n const events = this.buildPageExitEvents\n ? this.buildPageExitEvents(type, data)\n : [{\n type,\n data,\n experimentId: assignment?.experimentId,\n variationId: assignment?.variationId,\n url: cleanUrl(),\n }];\n this.queue.push(...events.map((event) => this.enrichEvent(event)));\n });\n }\n\n private flushForPageLifecycle(terminal = false): void {\n const alreadyFlushed = this.pageLifecycleFlushed;\n if (terminal) this.pageTeardownStarted = true;\n if (alreadyFlushed && (!terminal || this.queue.length === 0)) return;\n if (!alreadyFlushed) {\n this.pageLifecycleFlushed = true;\n this.queuePageExitEvents();\n }\n // drainQueue already handed activeBatch to a keepalive fetch. Sending that\n // same batch again with beacon creates a guaranteed overlap when both\n // requests reach the Worker. If the active request later fails, drainQueue\n // persists its stable event IDs because the page has entered teardown.\n const lifecycleEvents = this.queue.splice(0);\n if (!lifecycleEvents.length) return;\n if (!this.endpoint) {\n this.saveRecovery(lifecycleEvents);\n return;\n }\n\n while (lifecycleEvents.length) {\n const batch = lifecycleEvents.splice(0, this.maxBatchSize);\n let payload = this.buildPayload(batch);\n let queued = false;\n\n if (this.proxyEndpoint) {\n try {\n const nav = typeof navigator !== \"undefined\" ? navigator : undefined;\n if (typeof nav?.sendBeacon === \"function\") {\n queued = nav.sendBeacon(\n this.proxyEndpoint,\n new Blob([payload], { type: \"text/plain\" }),\n );\n }\n } catch {\n queued = false;\n }\n if (queued) continue;\n // Fall through to the established direct unload lane with an explicit\n // downgrade marker when the same-origin proxy beacon cannot be queued.\n payload = this.buildPayload(batch, \"proxy_failed\");\n }\n\n try {\n const nav = typeof navigator !== \"undefined\" ? navigator : undefined;\n if (typeof nav?.sendBeacon === \"function\") {\n queued = nav.sendBeacon(\n this.endpoint,\n new Blob([payload], { type: \"text/plain\" }),\n );\n }\n } catch {\n queued = false;\n }\n\n if (queued) continue;\n\n try {\n void fetch(this.endpoint, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: payload,\n keepalive: true,\n })\n .then((response) => {\n if (!response.ok) this.saveRecovery(batch);\n })\n .catch(() => {\n this.saveRecovery(batch);\n });\n } catch {\n this.saveRecovery(batch);\n }\n }\n }\n\n private recoverEvents(): void {\n try {\n const events = this.readRecovery().map((event) => ({\n ...event,\n environment: event.environment || this.environment,\n }));\n if (events.length) {\n sessionStorage.removeItem(RECOVERY_KEY);\n this.queue.unshift(...events);\n }\n } catch {}\n }\n\n private resetPageLifecycle(): void {\n this.pageLifecycleFlushed = false;\n this.pageTeardownStarted = false;\n this.beforeUnloadResetTimer = null;\n }\n\n private listenUnload(): void {\n if (this.pagehideHandler) return;\n const onPagehide = (event?: PageTransitionEvent) => {\n this.flushForPageLifecycle(event?.persisted !== true);\n };\n const onBeforeUnload = () => {\n this.flushForPageLifecycle(true);\n // A beforeunload prompt can be canceled. A real navigation prevents this\n // task from running (and pagehide confirms terminal teardown); a live tab\n // clears the provisional terminal state before later retries.\n if (this.beforeUnloadResetTimer === null && typeof window.setTimeout === \"function\") {\n this.beforeUnloadResetTimer = window.setTimeout(() => this.resetPageLifecycle(), 0);\n }\n };\n const onPageShow = () => this.resetPageLifecycle();\n this.pagehideHandler = onPagehide;\n this.beforeUnloadHandler = onBeforeUnload;\n this.pageshowHandler = onPageShow;\n window.addEventListener(\"pagehide\", onPagehide);\n window.addEventListener(\"beforeunload\", onBeforeUnload);\n window.addEventListener(\"pageshow\", onPageShow);\n if (typeof document !== \"undefined\") {\n const onVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") this.flushForPageLifecycle();\n else this.resetPageLifecycle();\n };\n this.visibilityHandler = onVisibilityChange;\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n }\n}\n\nfunction resolveProxyEventEndpoint(config: TrackerOptions[\"proxyEventDelivery\"]): string | null {\n if (!config?.enabled || typeof location === \"undefined\") return null;\n const host = location.hostname.toLowerCase();\n if (\n host === \"app.drip-apex.com\"\n || host === \"app-staging.drip-apex.com\"\n || host === \"commerce.drip-apex.com\"\n || host === \"preview.drip-apex.com\"\n || host.endsWith(\".workers.dev\")\n ) return null;\n const configuredPath = config.path?.trim();\n const path = configuredPath && configuredPath.startsWith(\"/\") && !configuredPath.startsWith(\"//\")\n ? configuredPath\n : \"/apps/apex/events\";\n try {\n return new URL(path, location.origin).toString();\n } catch {\n return null;\n }\n}\n", "/**\n * Safe wrapper around RegExp construction and testing.\n * Prevents crashes from invalid patterns and guards against\n * extremely long patterns that could cause ReDoS.\n */\n\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) regexCache.delete(oldest);\n }\n regexCache.set(pattern, compiled);\n}\n\nexport function safeRegexTest(pattern: string, input: string): boolean {\n if (!pattern || pattern.length > MAX_PATTERN_LENGTH) return false;\n\n if (regexCache.has(pattern)) {\n const cached = regexCache.get(pattern);\n return cached ? cached.test(input) : false;\n }\n\n try {\n const compiled = new RegExp(pattern);\n cacheRegex(pattern, compiled);\n return compiled.test(input);\n } catch {\n cacheRegex(pattern, null);\n return false;\n }\n}\n", "import { isExperimentServable } from \"@drip/event-schema/experiment-servability\";\nimport { CONSENT_GRANTED, CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsentForProvider, readConfiguredConsent } from \"./consent-evaluation\";\nimport { isOptedOut } from \"./guards\";\nimport { getOrCreateSessionId } from \"./track\";\nimport type { Assignment, DataProtectionSettings, Experiment, Goal } from \"./types\";\nimport { safeRegexTest } from \"./safe-regex\";\nimport { buildTargetingAttributes, matchedPageRuleIds } from \"./targeting\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\n\nexport const EARLY_INTERACTION_STORAGE_KEY = \"drip_early_interactions_v1\";\nexport const EARLY_INTERACTION_TTL_MS = 15 * 60 * 1000;\nconst EARLY_INTERACTION_MAX_ENTRIES = 50;\nconst PAIRED_ACTION_WINDOW_MS = 1000;\ntype StorageMode = NonNullable<DataProtectionSettings[\"storageMode\"]>;\ntype ConsentState = \"allowed\" | \"denied\" | \"unknown\";\n\nexport type EarlyInteractionEntry = {\n goalId: string; experimentId: string; variationId: string; assignmentEpoch: number;\n kind: \"click\" | \"submit\"; data: Record<string, unknown>; timestamp: number;\n sessionId: string; pageUrl: string; configRevision: number;\n};\ntype EarlyCaptureState = { entries: EarlyInteractionEntry[]; stop: () => void; storageMode: StorageMode };\ndeclare global {\n var __dripEarlyInteractions: EarlyCaptureState | undefined;\n var __dripHasConsent: boolean | undefined;\n var __dripInstallEarlyInteractionCapture: typeof installEarlyInteractionCapture | undefined;\n var __dripPredecided: { decision?: Array<[string, string]> } | undefined;\n var __dripEarlyQ: Array<{ kind: \"click\" | \"submit\"; target: Element; timestamp: number; id: number; pageUrl: string; consentAllowed: boolean }> | undefined;\n var __dripEarlyStop: (() => void) | undefined;\n}\n\nexport function drainBootstrapEarlyInteractions(input: ConsentConfig & {\n assignments: Assignment[];\n experiments: Experiment[];\n activePageIds?: ReadonlySet<string>;\n qaMode?: boolean;\n environment?: string;\n now?: number;\n consume: (goalId: string, assignment: Assignment, timestamp: number, kind: \"click\" | \"submit\", pageUrl: string) => void;\n}): void {\n const queued = globalThis.__dripEarlyQ;\n globalThis.__dripEarlyStop?.();\n globalThis.__dripEarlyStop = undefined;\n globalThis.__dripEarlyQ = [];\n if (!Array.isArray(queued) || queued.length === 0) return;\n const liveConsentAllowed = !isOptedOut() && consentState(input) === \"allowed\";\n const experiments = new Map(input.experiments.map((experiment) => [experiment.id, experiment]));\n const now = input.now ?? Date.now();\n const seen = new Set<number>();\n const lastActions = new Map<string, { kind: \"click\" | \"submit\"; timestamp: number; form: Element | null }>();\n for (const entry of queued) {\n if (!entry || entry.consentAllowed !== true || !liveConsentAllowed || seen.has(entry.id) || !Number.isFinite(entry.timestamp) || now - entry.timestamp > EARLY_INTERACTION_TTL_MS || entry.timestamp > now || !(entry.target instanceof Element)) continue;\n seen.add(entry.id);\n for (const assignment of input.assignments) {\n const experiment = experiments.get(assignment.experimentId);\n if (!experiment || !isExperimentServable(experiment, { qaMode: input.qaMode === true, environment: input.environment || \"production\" })) continue;\n const clickTimeAttributes = buildTargetingAttributes({}, entry.pageUrl, { persistSignals: false });\n const clickTimePageIds = matchedPageRuleIds(\n [...(experiment.targeting?.pageRules ?? []), ...(experiment.goalPageRules ?? [])],\n { url: entry.pageUrl, attributes: clickTimeAttributes },\n );\n for (const goal of experiment.goals ?? []) {\n if ((goal.type !== \"click\" && String(goal.type) !== \"submit\") || !goal.selector) continue;\n if (!goalIsActiveForBootstrap(goal, clickTimePageIds, entry.pageUrl)) continue;\n const matched = matchingElement(entry.target, goal, entry.kind);\n if (matched) {\n const actionKey = `${assignment.experimentId}:${goal.id}`;\n const prior = lastActions.get(actionKey);\n const form = logicalForm(matched);\n if (prior && prior.kind !== entry.kind && entry.timestamp - prior.timestamp <= PAIRED_ACTION_WINDOW_MS && form && prior.form === form) continue;\n lastActions.set(actionKey, { kind: entry.kind, timestamp: entry.timestamp, form });\n input.consume(goal.id, assignment, entry.timestamp, entry.kind, entry.pageUrl);\n }\n }\n }\n }\n}\n\nfunction logicalForm(matched: Element): HTMLFormElement | null {\n return matched.closest(\"form\") ??\n (matched as HTMLButtonElement | HTMLInputElement).form ?? null;\n}\n\nfunction goalIsActiveForBootstrap(goal: Goal, activePageIds: ReadonlySet<string>, pageUrl: string): boolean {\n if (goal.pageId) return activePageIds.has(goal.pageId);\n return !goal.urlPattern || safeRegexTest(goal.urlPattern, pageUrl);\n}\n\nfunction readCookie(name: string): string {\n try { const match = (document.cookie || \"\").match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`)); return match ? decodeURIComponent(match[1]) : \"\"; }\n catch { return \"\"; }\n}\nfunction consentState(config: ConsentConfig): ConsentState {\n const configured = readConfiguredConsent(config.consentProvider, config.consentRequiredGroup, config.consentGetter);\n const explicit = typeof globalThis.__dripHasConsent === \"boolean\" ? globalThis.__dripHasConsent : undefined;\n const cookie = readCookie(\"drip_consent\");\n const nav = globalThis.navigator as Navigator & { msDoNotTrack?: string } | undefined;\n const bits = evaluateSynchronousConsentForProvider({\n requireConsent: config.requireConsent, hasConsent: explicit, consentModeEnabled: config.consentModeEnabled,\n provider: config.consentProvider, configuredConsentGranted: configured, consentCookieGranted: cookie === \"1\",\n respectDoNotTrack: config.respectDoNotTrack,\n doNotTrackValue: nav?.doNotTrack ?? nav?.msDoNotTrack ?? (globalThis as any).doNotTrack ?? \"\",\n });\n if (bits & DNT_BLOCKED) return \"denied\";\n if (!(bits & CONSENT_REQUIRED)) return \"allowed\";\n if (bits & CONSENT_GRANTED) return \"allowed\";\n if (explicit === false || configured === false || cookie === \"0\") return \"denied\";\n return \"unknown\";\n}\nfunction getStorage(mode: StorageMode): Storage | null {\n try { return mode === \"sessionStorage\" ? globalThis.sessionStorage ?? null : mode === \"localStorage\" ? globalThis.localStorage ?? null : null; }\n catch { return null; }\n}\nfunction readPersisted(mode: StorageMode): EarlyInteractionEntry[] {\n try { const raw = mode === \"cookie\" ? readCookie(EARLY_INTERACTION_STORAGE_KEY) : getStorage(mode)?.getItem(EARLY_INTERACTION_STORAGE_KEY) ?? \"\"; const parsed = JSON.parse(raw || \"[]\"); return Array.isArray(parsed) ? parsed : []; }\n catch { return []; }\n}\nfunction persist(mode: StorageMode, entries: EarlyInteractionEntry[]): void {\n const bounded = entries.slice(-EARLY_INTERACTION_MAX_ENTRIES); let value = JSON.stringify(bounded);\n if (mode === \"cookie\") while (encodeURIComponent(value).length > 3500 && bounded.length) { bounded.shift(); value = JSON.stringify(bounded); }\n try { if (mode === \"cookie\") document.cookie = `${EARLY_INTERACTION_STORAGE_KEY}=${encodeURIComponent(value)}; Path=/; SameSite=Lax; Max-Age=900`; else if (mode !== \"memory\") getStorage(mode)?.setItem(EARLY_INTERACTION_STORAGE_KEY, value); } catch {}\n}\nexport function clearEarlyInteractions(mode?: StorageMode): void {\n for (const candidate of mode ? [mode] : ([\"localStorage\", \"sessionStorage\", \"cookie\", \"memory\"] as StorageMode[])) {\n try { if (candidate === \"cookie\") document.cookie = `${EARLY_INTERACTION_STORAGE_KEY}=; Path=/; SameSite=Lax; Max-Age=0`; else if (candidate !== \"memory\") getStorage(candidate)?.removeItem(EARLY_INTERACTION_STORAGE_KEY); } catch {}\n }\n if (globalThis.__dripEarlyInteractions) globalThis.__dripEarlyInteractions.entries.length = 0;\n}\nfunction matchingElement(target: Element, goal: Goal, kind: \"click\" | \"submit\"): Element | null {\n if (!goal.selector) return null;\n try {\n if (kind === \"submit\") {\n const form = target instanceof HTMLFormElement ? target : target.closest(\"form\");\n if (!form) return null;\n if (form.matches(goal.selector)) return form;\n const descendant = form.querySelector(goal.selector);\n if (descendant) return descendant;\n // Form-associated controls may live outside the form (`form=\"id\"`).\n return Array.from(document.querySelectorAll(goal.selector)).find((element) =>\n (element instanceof HTMLButtonElement || element instanceof HTMLInputElement) && element.form === form\n ) ?? null;\n }\n const match = target.closest(goal.selector); return match && (!goal.textMatch || (match.textContent || \"\").trim().toLowerCase().includes(goal.textMatch.trim().toLowerCase())) ? match : null;\n } catch { return null; }\n}\ntype ConsentConfig = { requireConsent?: boolean; consentModeEnabled?: boolean; consentProvider?: \"custom\" | \"onetrust\" | \"usercentrics\" | \"cookiebot\" | \"ccm19\" | \"pandectes\" | \"cookiescript\" | \"borlabs\"; consentRequiredGroup?: string; consentGetter?: string; respectDoNotTrack?: boolean };\nexport type EarlyCaptureConfig = ConsentConfig & { experiments: Experiment[]; assignments: Pick<Assignment, \"experimentId\" | \"variationId\" | \"assignmentEpoch\">[]; attributes?: Record<string, unknown>; configRevision: number; pageUrl: string; storageMode?: StorageMode; forcedExperimentIds?: string[]; now?: number };\nconst CONSENT_EVENTS = [\"OneTrustGroupsUpdated\", \"OptanonConsentChanged\", \"CookiebotOnConsentReady\", \"CookiebotOnAccept\", \"CookiebotOnDecline\", \"CookieConsentDeclaration\", \"UC_UI_CMP_EVENT\", \"ccm19EmbeddingAccepted\", \"ccm19WidgetClosed\", \"ccm19WidgetLoaded\", \"PandectesInitialized\", \"visitorConsentCollected\", \"CookieScriptLoaded\", \"CookieScriptAccept\", \"CookieScriptAcceptAll\", \"CookieScriptReject\", \"CookieScriptClose\"];\n\nexport function installEarlyInteractionCapture(config: EarlyCaptureConfig): void {\n globalThis.__dripEarlyInteractions?.stop();\n const mode = config.storageMode ?? \"localStorage\";\n if (!Number.isSafeInteger(config.configRevision) || isOptedOut()) { clearEarlyInteractions(); return; }\n const entries = readPersisted(mode);\n let armed = false;\n const sessionId = getOrCreateSessionId();\n const assignmentMap = new Map(config.assignments.map((a) => [a.experimentId, a]));\n const forcedExperimentIds = new Set(config.forcedExperimentIds ?? []);\n const targetingAttributes = buildTargetingAttributes(\n config.attributes ?? {},\n config.pageUrl,\n { persistSignals: false },\n );\n const activePageIds = matchedPageRuleIds(\n config.experiments.flatMap((experiment) => [...(experiment.targeting?.pageRules ?? []), ...(experiment.goalPageRules ?? [])]),\n { url: config.pageUrl, attributes: targetingAttributes },\n );\n const goals = config.experiments.flatMap((experiment) => {\n if (\n !forcedExperimentIds.has(experiment.id) &&\n weekdayScheduleBlocksDelivery(\n experiment.weekdaySchedule,\n new Date(config.now ?? Date.now()),\n )\n ) return [];\n const assignment = assignmentMap.get(experiment.id);\n if (!assignment || !Number.isSafeInteger(assignment.assignmentEpoch) || (assignment.assignmentEpoch ?? 0) < 1) return [];\n return (experiment.goals ?? []).filter((goal) => {\n if ((goal.type !== \"click\" && String(goal.type) !== \"submit\") || !goal.selector) return false;\n if (goal.pageId) return activePageIds.has(goal.pageId);\n return !goal.urlPattern || safeRegexTest(goal.urlPattern, config.pageUrl);\n }).map((goal) => ({ goal, assignment }));\n });\n const lastActions = new Map<string, { at: number; kind: \"click\" | \"submit\"; form: Element | null }>();\n const capture = (event: Event, kind: \"click\" | \"submit\") => {\n if (isOptedOut()) { stop(); clearEarlyInteractions(mode); return; }\n const consent = consentState(config); if (consent !== \"allowed\") { if (consent === \"denied\") clearEarlyInteractions(mode); return; }\n const target = event.target; if (!(target instanceof Element)) return;\n for (const { goal, assignment } of goals) {\n const matched = matchingElement(target, goal, kind); if (!matched) continue;\n const form = logicalForm(matched); const key = `${goal.id}:${assignment.experimentId}`;\n const prior = lastActions.get(key);\n if (prior && prior.kind !== kind && Date.now() - prior.at <= PAIRED_ACTION_WINDOW_MS && form && prior.form === form) continue;\n lastActions.set(key, { at: Date.now(), kind, form });\n entries.push({ goalId: goal.id, experimentId: assignment.experimentId, variationId: assignment.variationId, assignmentEpoch: assignment.assignmentEpoch!, kind, data: { early_interaction: true }, timestamp: Date.now(), sessionId, pageUrl: config.pageUrl.slice(0, 2048), configRevision: config.configRevision });\n }\n if (entries.length > EARLY_INTERACTION_MAX_ENTRIES) entries.splice(0, entries.length - EARLY_INTERACTION_MAX_ENTRIES); persist(mode, entries);\n };\n const click = (event: Event) => capture(event, \"click\"); const submit = (event: Event) => capture(event, \"submit\");\n const arm = () => { if (armed) return; armed = true; document.addEventListener(\"click\", click, true); document.addEventListener(\"submit\", submit, true); };\n const disarm = () => { if (!armed) return; armed = false; document.removeEventListener(\"click\", click, true); document.removeEventListener(\"submit\", submit, true); };\n const consentChange = () => { const consent = consentState(config); if (consent === \"allowed\") arm(); else { disarm(); if (consent === \"denied\") clearEarlyInteractions(mode); } };\n const stop = () => { disarm(); CONSENT_EVENTS.forEach((event) => window.removeEventListener(event, consentChange)); };\n CONSENT_EVENTS.forEach((event) => window.addEventListener(event, consentChange)); consentChange();\n globalThis.__dripEarlyInteractions = { entries, storageMode: mode, stop };\n}\n\nexport function drainEarlyInteractions(input: ConsentConfig & { qaMode?: boolean; environment?: string; configRevision: number | undefined; sessionId: string; storageMode?: StorageMode; experiments: Experiment[]; now?: number; forcedExperimentIds?: string[]; consume: (entry: EarlyInteractionEntry) => void }): void {\n const mode = input.storageMode ?? globalThis.__dripEarlyInteractions?.storageMode ?? \"localStorage\";\n globalThis.__dripEarlyInteractions?.stop();\n if (isOptedOut() || consentState(input) !== \"allowed\") { clearEarlyInteractions(mode); return; }\n const entries = [...readPersisted(mode), ...(globalThis.__dripEarlyInteractions?.entries ?? [])]; clearEarlyInteractions(mode);\n const now = input.now ?? Date.now(); const seen = new Set<string>();\n const forcedExperimentIds = new Set(input.forcedExperimentIds ?? []);\n const experiments = new Map(input.experiments.filter((experiment) =>\n isExperimentServable(experiment, { qaMode: input.qaMode === true, environment: input.environment || \"production\" }) &&\n (\n forcedExperimentIds.has(experiment.id) ||\n !weekdayScheduleBlocksDelivery(experiment.weekdaySchedule, new Date(now))\n )\n ).map((experiment) => [experiment.id, experiment]));\n for (const entry of entries) {\n const identity = JSON.stringify(entry); if (seen.has(identity)) continue; seen.add(identity);\n if (!entry || typeof entry !== \"object\" || !Number.isFinite(entry.timestamp) || now - entry.timestamp > EARLY_INTERACTION_TTL_MS || entry.timestamp > now) continue;\n if (entry.sessionId !== input.sessionId || entry.configRevision !== input.configRevision) continue;\n const experiment = experiments.get(entry.experimentId);\n if (!experiment || experiment.assignmentEpoch !== entry.assignmentEpoch || !experiment.variations.some((variation) => variation.id === entry.variationId) || !(experiment.goals ?? []).some((goal) => goal.id === entry.goalId)) continue;\n try { input.consume(entry); } catch {}\n }\n}\n", "type LayoutShiftEntry = PerformanceEntry & {\n value?: number;\n hadRecentInput?: boolean;\n};\n\ntype CwvMetrics = {\n cls_total: number;\n cls_after_reveal: number;\n};\n\ntype Measurement = {\n observer: PerformanceObserver;\n revealAt: number | null;\n disconnectTimer: ReturnType<typeof setTimeout> | null;\n total: number;\n afterReveal: number;\n promise: Promise<CwvMetrics | null>;\n resolve: (metrics: CwvMetrics | null) => void;\n finalized: boolean;\n};\n\nlet current: Measurement | null = null;\nlet lastMetrics: CwvMetrics = { cls_total: 0, cls_after_reveal: 0 };\nlet lastCompletion: Promise<CwvMetrics | null> = Promise.resolve(null);\nlet measurementStarted = false;\n\nfunction snapshot(measurement: Measurement): CwvMetrics {\n return {\n cls_total: Math.round(measurement.total * 100_000) / 100_000,\n cls_after_reveal: Math.round(measurement.afterReveal * 100_000) / 100_000,\n };\n}\n\nfunction consume(measurement: Measurement, entries: PerformanceEntry[]): void {\n for (const rawEntry of entries) {\n const entry = rawEntry as LayoutShiftEntry;\n if (entry.hadRecentInput || typeof entry.value !== \"number\") continue;\n measurement.total += entry.value;\n if (measurement.revealAt !== null && entry.startTime > measurement.revealAt) {\n measurement.afterReveal += entry.value;\n }\n }\n}\n\nfunction finish(measurement = current): void {\n if (!measurement || measurement.finalized) return;\n measurement.finalized = true;\n if (measurement.disconnectTimer !== null) {\n clearTimeout(measurement.disconnectTimer);\n measurement.disconnectTimer = null;\n }\n try {\n consume(measurement, measurement.observer.takeRecords());\n } catch {}\n measurement.observer.disconnect();\n const metrics = snapshot(measurement);\n lastMetrics = metrics;\n measurement.resolve(metrics);\n if (current === measurement) current = null;\n}\n\nexport function startCwvMeasurement(disabled?: boolean): void {\n finish(current);\n lastMetrics = { cls_total: 0, cls_after_reveal: 0 };\n\n if (disabled || typeof PerformanceObserver === \"undefined\") {\n lastCompletion = Promise.resolve(null);\n return;\n }\n try {\n let resolve!: (metrics: CwvMetrics | null) => void;\n const promise = new Promise<CwvMetrics | null>((done) => { resolve = done; });\n let measurement!: Measurement;\n const observer = new PerformanceObserver((list) => {\n if (!measurement.finalized) consume(measurement, list.getEntries());\n });\n measurement = {\n observer,\n revealAt: null,\n disconnectTimer: null,\n total: 0,\n afterReveal: 0,\n promise,\n resolve,\n finalized: false,\n };\n current = measurement;\n lastCompletion = promise;\n // Buffered entries belong to the initial document only. Replaying them\n // into later SPA route observers would mix prior-route CLS into the new\n // route's telemetry window.\n observer.observe({ type: \"layout-shift\", buffered: !measurementStarted });\n measurementStarted = true;\n // Empty-project and non-visual routes may not call markCwvReveal(). Bound\n // every route measurement anyway so finalized telemetry is guaranteed.\n measurement.disconnectTimer = setTimeout(() => finish(measurement), 5_000);\n } catch {\n current?.observer.disconnect();\n current?.resolve(null);\n current = null;\n lastCompletion = Promise.resolve(null);\n }\n}\n\nexport function markCwvReveal(): void {\n if (!current || current.revealAt !== null) return;\n current.revealAt = typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : 0;\n if (current.disconnectTimer !== null) clearTimeout(current.disconnectTimer);\n const measurement = current;\n measurement.disconnectTimer = setTimeout(() => finish(measurement), 5_000);\n}\n\nexport function getCwvMetrics(): CwvMetrics {\n return current ? snapshot(current) : lastMetrics;\n}\n\nexport function waitForCwvMetrics(): Promise<CwvMetrics | null> {\n return current?.promise ?? lastCompletion;\n}\n\nexport function resetCwvMeasurement(): void {\n finish(current);\n current = null;\n measurementStarted = false;\n lastMetrics = { cls_total: 0, cls_after_reveal: 0 };\n lastCompletion = Promise.resolve(null);\n}\n", "export function roundPerformance(value: number, precision = 1): number {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n}\n\nexport function navigationEntry(): PerformanceNavigationTiming | undefined {\n return performance.getEntriesByType?.(\"navigation\")?.[0] as\n | PerformanceNavigationTiming\n | undefined;\n}\n", "import { navigationEntry, roundPerformance } from \"./performance\";\n\nexport type DeliveryTiming = {\n snippet_fetch_ms: number;\n snippet_transfer_size: number;\n sdk_bundle_fetch_ms: number;\n sdk_bundle_transfer_size: number;\n time_to_sdk_ready_ms?: number;\n};\n\nfunction duration(entry: PerformanceResourceTiming): number {\n const value = Number.isFinite(entry.responseEnd) && Number.isFinite(entry.startTime)\n ? entry.responseEnd - entry.startTime\n : entry.duration;\n return Number.isFinite(value) ? roundPerformance(Math.max(0, value)) : 0;\n}\n\nfunction transferSize(entry: PerformanceResourceTiming): number {\n const size = entry.transferSize === undefined ? entry.encodedBodySize : entry.transferSize;\n return Number.isFinite(size) ? Math.max(0, Math.round(size)) : 0;\n}\n\nfunction pathname(value: string): string {\n try {\n return new URL(value, typeof location !== \"undefined\" ? location.href : \"https://apex.invalid\").pathname;\n } catch {\n return value.split(/[?#]/, 1)[0] ?? \"\";\n }\n}\n\nfunction navigationStartEpoch(navigation?: PerformanceNavigationTiming): number | null {\n const startTime = navigation && Number.isFinite(navigation.startTime) && navigation.startTime >= 0\n ? navigation.startTime\n : 0;\n let origin = performance.timeOrigin;\n try { if (!(origin > 0)) origin = performance.timing?.navigationStart; } catch {}\n if (!(origin > 0) && typeof performance.now === \"function\") origin = Date.now() - performance.now();\n return Number.isFinite(origin) && origin > 0 ? origin + startTime : null;\n}\n\nfunction timeToSdkReady(sdkInitStartedAt: number | undefined, navigationStart: number | null): number | undefined {\n if (navigationStart === null || !Number.isFinite(sdkInitStartedAt)) return undefined;\n const delta = sdkInitStartedAt! - navigationStart;\n if (!Number.isFinite(delta) || delta < 0 || delta > 5 * 60_000) return undefined;\n return roundPerformance(delta);\n}\n\nexport function collectDeliveryTiming(\n sdkInitStartedAt: number | undefined,\n sdkScriptSrc?: string,\n): DeliveryTiming {\n const empty: DeliveryTiming = {\n snippet_fetch_ms: 0,\n snippet_transfer_size: 0,\n sdk_bundle_fetch_ms: 0,\n sdk_bundle_transfer_size: 0,\n };\n if (typeof performance === \"undefined\") return empty;\n\n try {\n const resources = (performance.getEntriesByType?.(\"resource\") ?? []) as PerformanceResourceTiming[];\n const navigation = navigationEntry();\n const scriptPath = sdkScriptSrc ? pathname(sdkScriptSrc) : \"\";\n let snippet: PerformanceResourceTiming | undefined;\n let bundle: PerformanceResourceTiming | undefined;\n for (const entry of resources) {\n const entryPath = pathname(entry.name);\n if (/^\\/s\\/[^/]+\\.js$/i.test(entryPath)) {\n if (!snippet || entry.startTime > snippet.startTime) snippet = entry;\n } else if (\n /\\/sdk\\/[^/]+\\/drip\\.(?:live|debug|heatmap)\\.js$/i.test(entryPath)\n || Boolean(scriptPath && entryPath === scriptPath && /\\/drip\\.[^/]+\\.js$/i.test(entryPath))\n ) {\n if (!bundle || entry.startTime > bundle.startTime) bundle = entry;\n }\n }\n const navigationStart = navigationStartEpoch(navigation);\n const readyTiming = timeToSdkReady(sdkInitStartedAt, navigationStart);\n return {\n snippet_fetch_ms: snippet ? duration(snippet) : 0,\n snippet_transfer_size: snippet ? transferSize(snippet) : 0,\n sdk_bundle_fetch_ms: bundle ? duration(bundle) : 0,\n sdk_bundle_transfer_size: bundle ? transferSize(bundle) : 0,\n ...(readyTiming === undefined ? {} : { time_to_sdk_ready_ms: readyTiming }),\n };\n } catch {\n return empty;\n }\n}\n", "export type ShopifyCartMutationHandler = () => void;\n\nconst handlers = new Set<ShopifyCartMutationHandler>();\nlet originalFetch: typeof window.fetch | null = null;\nlet wrappedFetch: typeof window.fetch | null = null;\nlet suppressNotifications = 0;\nlet formListenerInstalled = false;\n\nfunction requestUrl(input: RequestInfo | URL): URL | null {\n try {\n const value = typeof input === \"string\" || input instanceof URL\n ? String(input)\n : input.url;\n return new URL(value, location.href);\n } catch {\n return null;\n }\n}\n\nfunction isShopifyCartMutation(input: RequestInfo | URL): boolean {\n const url = requestUrl(input);\n if (!url || url.origin !== location.origin) return false;\n const configuredRoot = (window as Window & {\n Shopify?: { routes?: { root?: string } };\n }).Shopify?.routes?.root;\n let root = \"\";\n if (typeof configuredRoot === \"string\") {\n try {\n const parsed = new URL(configuredRoot, location.origin);\n if (parsed.origin === location.origin && !parsed.search && !parsed.hash) {\n root = parsed.pathname.replace(/\\/$/, \"\");\n }\n } catch {\n root = \"\";\n }\n }\n const path = url.pathname.replace(/\\/$/, \"\");\n return [\"add\", \"change\", \"update\", \"clear\"].some(\n (action) => path === `${root}/cart/${action}` || path === `${root}/cart/${action}.js`,\n );\n}\n\nfunction notifyHandlers(): void {\n for (const handler of handlers) {\n try {\n handler();\n } catch {\n // Cart observers must never affect the storefront's own mutation flow.\n }\n }\n}\n\nfunction handleFormSubmit(event: Event): void {\n const form = event.target;\n if (!(form instanceof HTMLFormElement) || !isShopifyCartMutation(form.action)) return;\n queueMicrotask(notifyHandlers);\n}\n\nfunction install(): void {\n if (originalFetch || typeof window.fetch !== \"function\") return;\n originalFetch = window.fetch;\n const nativeFetch = originalFetch.bind(window);\n wrappedFetch = function(...args: Parameters<typeof fetch>) {\n const shouldNotify = suppressNotifications === 0 && isShopifyCartMutation(args[0]);\n const result = nativeFetch(...args);\n if (shouldNotify) {\n result.then((response) => {\n if (response.ok) notifyHandlers();\n }, () => {\n // Observe without changing or consuming the caller's rejection.\n });\n }\n return result;\n };\n window.fetch = wrappedFetch;\n document.addEventListener(\"submit\", handleFormSubmit, true);\n formListenerInstalled = true;\n}\n\nfunction uninstall(): void {\n if (formListenerInstalled) {\n document.removeEventListener(\"submit\", handleFormSubmit, true);\n formListenerInstalled = false;\n }\n if (originalFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n wrappedFetch = null;\n originalFetch = null;\n}\n\nexport function onShopifyCartMutation(handler: ShopifyCartMutationHandler): () => void {\n handlers.add(handler);\n install();\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) uninstall();\n };\n}\n\n/**\n * Use for Apex's own cart-attribute write so it does not recursively look like\n * a shopper/theme mutation to subscribers of the shared fetch wrapper.\n */\nexport function fetchWithoutShopifyCartMutationNotification(\n ...args: Parameters<typeof fetch>\n): ReturnType<typeof fetch> {\n suppressNotifications += 1;\n try {\n const activeFetch = typeof window.fetch === \"function\"\n ? window.fetch\n : globalThis.fetch;\n return activeFetch.call(window, ...args);\n } finally {\n suppressNotifications -= 1;\n }\n}\n", "import { clearRuntimeSignal, setRuntimeSignal } from \"./signals\";\n\nexport const CART_DRAWER_OPEN_SIGNAL = \"surface.cart_drawer.open\";\n\nconst BODY_OPEN_PATTERN =\n /\\b(cart|mini-cart|side-cart|cart-drawer|drawer)[-_ ]?(open|opened|active|visible|shown)\\b|\\b(open|active|visible|shown)[-_ ]?(cart|mini-cart|side-cart|cart-drawer|drawer)\\b/i;\n\nexport const CART_DRAWER_SELECTORS = [\n \"cart-drawer\",\n \"mini-cart\",\n \"side-cart\",\n \"[data-cart-drawer]\",\n \"[data-cart-drawer-open]\",\n \"[data-side-cart]\",\n \"[data-mini-cart]\",\n \"[data-state='open'][class*='cart' i]\",\n \"[data-state='open'][id*='cart' i]\",\n \"[aria-hidden='false'][class*='cart' i][class*='drawer' i]\",\n \"[aria-hidden='false'][id*='cart' i][id*='drawer' i]\",\n \"[class*='cart-drawer' i]\",\n \"[class*='mini-cart' i]\",\n \"[class*='side-cart' i]\",\n \"[id*='cart-drawer' i]\",\n \"[id*='mini-cart' i]\",\n \"[id*='side-cart' i]\",\n];\n\nexport function findCartDrawerContainer(\n root: ParentNode = document,\n): Element | null {\n if (typeof document === \"undefined\") return null;\n for (const selector of CART_DRAWER_SELECTORS) {\n const element = root.querySelector(selector);\n if (element) return element;\n }\n return null;\n}\n\nfunction classNameOf(element: Element): string {\n const value = element.getAttribute(\"class\");\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction hasOpenHint(element: Element): boolean {\n const classes = classNameOf(element);\n const state = element.getAttribute(\"data-state\") ?? \"\";\n return (\n element.hasAttribute(\"open\") ||\n element.getAttribute(\"aria-hidden\") === \"false\" ||\n element.getAttribute(\"aria-expanded\") === \"true\" ||\n /^(open|opened|active|visible|shown)$/i.test(state) ||\n /\\b(is-|has-)?(open|opened|active|visible|shown)\\b/i.test(classes)\n );\n}\n\nfunction isExplicitlyClosed(element: Element): boolean {\n const classes = classNameOf(element);\n return (\n element.hasAttribute(\"hidden\") ||\n element.getAttribute(\"aria-hidden\") === \"true\" ||\n element.getAttribute(\"data-state\") === \"closed\" ||\n /\\b(is-)?(closed|closing|hidden)\\b/i.test(classes)\n );\n}\n\nfunction isRendered(element: Element): boolean {\n if (typeof window === \"undefined\") return false;\n const node = element as HTMLElement;\n const style = window.getComputedStyle ? window.getComputedStyle(node) : null;\n if (\n style &&\n (style.display === \"none\" ||\n style.visibility === \"hidden\" ||\n style.opacity === \"0\" ||\n style.pointerEvents === \"none\")\n ) {\n return false;\n }\n const rect = node.getBoundingClientRect?.();\n return Boolean(rect && rect.width > 0 && rect.height > 0);\n}\n\nexport function detectCartDrawerOpen(root: ParentNode = document): boolean {\n if (typeof document === \"undefined\") return false;\n const bodyClasses = document.body ? classNameOf(document.body) : \"\";\n if (BODY_OPEN_PATTERN.test(bodyClasses)) return true;\n\n for (const selector of CART_DRAWER_SELECTORS) {\n const candidates = Array.from(root.querySelectorAll(selector));\n for (const element of candidates) {\n if (isExplicitlyClosed(element)) continue;\n if (!hasOpenHint(element)) continue;\n if (isRendered(element)) return true;\n }\n }\n\n return false;\n}\n\nexport function installCartDrawerOpenListener(\n onChange: (open: boolean) => void,\n): () => void {\n if (\n typeof document === \"undefined\" ||\n typeof window === \"undefined\" ||\n typeof MutationObserver === \"undefined\" ||\n !document.documentElement\n ) {\n return () => {};\n }\n\n let current = detectCartDrawerOpen();\n\n let stopped = false;\n let timeoutId: number | null = null;\n const check = () => {\n timeoutId = null;\n const next = detectCartDrawerOpen();\n if (next === current) return;\n current = next;\n onChange(next);\n };\n const schedule = () => {\n // A mutation record may already be queued when stop() disconnects the\n // observer. Do not let that stale callback re-arm the check timer.\n if (stopped) return;\n if (timeoutId !== null) return;\n timeoutId = window.setTimeout(check, 80);\n };\n\n const observer = new MutationObserver(schedule);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\n \"aria-expanded\",\n \"aria-hidden\",\n \"class\",\n \"data-state\",\n \"hidden\",\n \"open\",\n \"style\",\n ],\n childList: true,\n subtree: true,\n });\n\n document.addEventListener(\"click\", schedule, true);\n document.addEventListener(\"keyup\", schedule, true);\n\n return () => {\n stopped = true;\n observer.disconnect();\n document.removeEventListener(\"click\", schedule, true);\n document.removeEventListener(\"keyup\", schedule, true);\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n };\n}\n\nexport function installSurfaceSignals(onChange: () => void): () => void {\n const current = detectCartDrawerOpen();\n setRuntimeSignal(CART_DRAWER_OPEN_SIGNAL, current);\n const stop = installCartDrawerOpenListener((open) => {\n setRuntimeSignal(CART_DRAWER_OPEN_SIGNAL, open);\n onChange();\n });\n return () => {\n stop();\n clearRuntimeSignal(CART_DRAWER_OPEN_SIGNAL);\n };\n}\n", "import type { Assignment, CommerceShippingSettings } from \"./types\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n findCartDrawerContainer,\n installCartDrawerOpenListener,\n} from \"./surface-signals\";\nimport { currencyExponent } from \"./money\";\n\ntype ShopifyWindow = Window & {\n Shopify?: {\n currency?: { active?: string };\n routes?: { root?: string };\n };\n};\n\ntype ActiveShipping = {\n experimentId: string;\n currency: string;\n variant: CommerceShippingSettings[\"experiments\"][number][\"variants\"][string];\n eligibilityTarget: { productGids: string[]; variantGids: string[] };\n renderEnabled: boolean;\n thresholdCents: number | null;\n minorUnits: number;\n};\n\nlet current: ActiveShipping | null = null;\nlet stopCartMutationListener: (() => void) | null = null;\nlet stopDrawerListener: (() => void) | null = null;\nlet placementObserver: MutationObserver | null = null;\nlet placementCheckTimer: number | null = null;\n\nfunction removeRenderedElement(): void {\n element?.remove();\n element = null;\n}\nlet element: HTMLElement | null = null;\nlet lastSubtotal: number | null = null;\nlet refreshSequence = 0;\nlet cartAbortController: AbortController | null = null;\nconst cartEligibility = new Map<string, boolean>();\n\nexport function isShippingCartEligible(experimentId: string): boolean {\n // Fail closed: until a cart read proves the target is absent, an enforced\n // experiment stays charge-affecting \u2014 an unevaluated (e.g. unsigned-plane)\n // experiment must not silently downgrade to advisory stamping.\n return cartEligibility.get(experimentId) ?? true;\n}\n\ntype ShippingVariantLike = {\n treatment: string;\n threshold: string | null;\n target?: { productGids: string[]; variantGids: string[] };\n};\n\n/** Shared exposure classification for the sync loop and the exposure fence.\n * Treatments prove eligibility on their OWN target; controls mirror the\n * treatment set \u2014 any-targeted for scope (an unscoped sibling keeps the\n * control universal), every-bound for currency (a thresholdless percent\n * sibling keeps the control cross-currency eligible). */\nexport function classifyShippingExposure(\n variants: Record<string, ShippingVariantLike>,\n isControl: boolean,\n ownVariant: ShippingVariantLike | undefined,\n): {\n eligibilityTarget: { productGids: string[]; variantGids: string[] };\n needsTargetProof: boolean;\n isCurrencyBound: boolean;\n} {\n const empty = { productGids: [] as string[], variantGids: [] as string[] };\n const scoped = (candidate: ShippingVariantLike | undefined) =>\n (candidate?.target?.productGids.length ?? 0) > 0 ||\n (candidate?.target?.variantGids.length ?? 0) > 0;\n const bound = (candidate: ShippingVariantLike | undefined) =>\n candidate != null &&\n candidate.treatment !== \"none\" &&\n (candidate.threshold !== null || candidate.treatment !== \"percent_off\");\n const treatments = Object.values(variants).filter(\n (candidate) => candidate.treatment !== \"none\",\n );\n if (!isControl) {\n return {\n eligibilityTarget: ownVariant?.target ?? empty,\n needsTargetProof: scoped(ownVariant),\n isCurrencyBound: bound(ownVariant),\n };\n }\n const hasUnscopedTreatment = treatments.some((candidate) => !scoped(candidate));\n return {\n eligibilityTarget: hasUnscopedTreatment\n ? empty\n : treatments.reduce(\n (target, candidate) => ({\n productGids: [...target.productGids, ...(candidate.target?.productGids ?? [])],\n variantGids: [...target.variantGids, ...(candidate.target?.variantGids ?? [])],\n }),\n empty,\n ),\n needsTargetProof: treatments.some(scoped),\n isCurrencyBound: treatments.length > 0 && treatments.every(bound),\n };\n}\n\n/** True only after shipping setup or a successful cart read proves eligibility. */\nexport function isShippingCartEligibilityConfirmed(\n experimentId: string,\n): boolean {\n return cartEligibility.get(experimentId) === true;\n}\n\nfunction currencyMinorUnits(currency: string): number | null {\n try {\n return currencyExponent(currency);\n } catch {\n return null;\n }\n}\n\nfunction thresholdCents(value: string, minorUnits: number): number | null {\n const fractionPattern =\n minorUnits === 0 ? \"\" : `(?:\\\\.(\\\\d{1,${minorUnits}}))?`;\n const match = new RegExp(`^(\\\\d+)${fractionPattern}$`).exec(value);\n if (!match) return null;\n const cents = Number(match[1] + (match[2] ?? \"\").padEnd(minorUnits, \"0\"));\n return Number.isSafeInteger(cents) && cents > 0 ? cents : null;\n}\n\nfunction shopifyRoot(): string {\n const root = (window as ShopifyWindow).Shopify?.routes?.root;\n if (typeof root !== \"string\") return \"/\";\n try {\n const parsed = new URL(root, location.origin);\n if (parsed.origin !== location.origin || parsed.search || parsed.hash)\n return \"/\";\n return parsed.pathname.endsWith(\"/\")\n ? parsed.pathname\n : `${parsed.pathname}/`;\n } catch {\n return \"/\";\n }\n}\n\nfunction cartPath(resource: string): string {\n return `${shopifyRoot()}${resource}`;\n}\n\nfunction activeShipping(\n settings: CommerceShippingSettings,\n assignments: Assignment[],\n): ActiveShipping | null {\n if (typeof window === \"undefined\") return null;\n const shopify = (window as ShopifyWindow).Shopify;\n if (!shopify) return null;\n const currency = shopify.currency?.active;\n if (typeof currency !== \"string\" || !/^[A-Z]{3}$/.test(currency)) return null;\n const minorUnits = currencyMinorUnits(currency);\n if (minorUnits === null) return null;\n const candidates: ActiveShipping[] = [];\n for (const experiment of settings.experiments) {\n const assignment = assignments.find(\n (item) => item.experimentId === experiment.experiment_id,\n );\n const variant = assignment\n ? experiment.variants[assignment.variationId]\n : undefined;\n const exposure = classifyShippingExposure(\n experiment.variants,\n Boolean(assignment?.isControl),\n variant,\n );\n const eligibilityTarget = exposure.eligibilityTarget;\n const isExperimentTargeted = exposure.needsTargetProof;\n const isCurrencyBound = exposure.isCurrencyBound;\n if (\n !variant ||\n (experiment.assignment_epoch != null &&\n experiment.assignment_epoch !== assignment?.assignmentEpoch) ||\n (isCurrencyBound && currency !== experiment.currency) ||\n // Controls stay as eligibility candidates (renderEnabled excludes them\n // from the banner): an untargeted threshold control must confirm cart\n // currency the same way its treatment sibling would, or it never exposes.\n (variant.treatment === \"none\" && !assignment?.isControl)\n ) {\n continue;\n }\n const threshold =\n variant.threshold === null\n ? null\n : thresholdCents(variant.threshold, minorUnits);\n if (variant.threshold !== null && threshold === null) continue;\n // Controls use the treatment union for symmetric eligibility; treatments\n // use only their own arm's target.\n cartEligibility.set(\n experiment.experiment_id,\n false,\n );\n candidates.push({\n experimentId: experiment.experiment_id,\n currency,\n variant,\n eligibilityTarget,\n renderEnabled: !assignment?.isControl && variant.treatment !== \"none\",\n thresholdCents: threshold,\n minorUnits,\n });\n }\n return candidates.length === 1 ? candidates[0] : null;\n}\n\nfunction money(cents: number, currency: string, minorUnits: number): string {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency,\n }).format(cents / 10 ** minorUnits);\n}\n\nfunction resolveCopy(\n template: string,\n subtotal: number,\n active: ActiveShipping,\n): string {\n return template\n .split(\"{remaining}\")\n .join(\n money(\n Math.max(0, (active.thresholdCents ?? 0) - subtotal),\n active.currency,\n active.minorUnits,\n ),\n )\n .split(\"{threshold}\")\n .join(\n money(active.thresholdCents ?? 0, active.currency, active.minorUnits),\n );\n}\n\nfunction render(subtotal: number, active: ActiveShipping): boolean {\n removeRenderedElement();\n const reached =\n active.thresholdCents !== null && subtotal >= active.thresholdCents;\n const copy = resolveCopy(\n active.thresholdCents === null\n ? active.variant.bannerCopy\n : reached\n ? active.variant.reachedCopy\n : active.variant.progressCopy,\n subtotal,\n active,\n );\n if (!copy.trim()) return false;\n\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.apexShipping = \"\";\n wrapper.setAttribute(\"role\", \"status\");\n wrapper.setAttribute(\"aria-live\", \"polite\");\n wrapper.setAttribute(\"aria-atomic\", \"true\");\n wrapper.style.cssText =\n \"box-sizing:border-box;padding:10px 12px;background:#f4f4f0;color:#1a1a1a;font:500 13px/1.4 system-ui,sans-serif;z-index:2147483646\";\n const line = document.createElement(\"div\");\n line.textContent = copy;\n wrapper.appendChild(line);\n if (\n active.variant.treatment === \"progress_bar\" &&\n active.thresholdCents !== null\n ) {\n const track = document.createElement(\"div\");\n const progress = Math.min(\n 100,\n Math.max(0, (subtotal / active.thresholdCents) * 100),\n );\n track.setAttribute(\"role\", \"progressbar\");\n track.setAttribute(\"aria-label\", \"Free shipping progress\");\n track.setAttribute(\"aria-valuemin\", \"0\");\n track.setAttribute(\"aria-valuemax\", \"100\");\n track.setAttribute(\"aria-valuenow\", String(Math.round(progress)));\n track.style.cssText =\n \"height:6px;margin-top:8px;overflow:hidden;border-radius:999px;background:#d9d9d2\";\n const fill = document.createElement(\"div\");\n fill.style.cssText = `height:100%;width:${progress}%;border-radius:inherit;background:#1a1a1a`;\n track.appendChild(fill);\n wrapper.appendChild(track);\n }\n const drawer = findCartDrawerContainer();\n if (drawer) {\n drawer.prepend(wrapper);\n } else {\n wrapper.style.position = \"fixed\";\n wrapper.style.inset = \"0 0 auto\";\n document.body.prepend(wrapper);\n }\n element = wrapper;\n return true;\n}\n\nfunction cartMatchesTarget(\n items: unknown,\n target: { productGids: string[]; variantGids: string[] },\n): boolean {\n if (target.productGids.length === 0 && target.variantGids.length === 0)\n return true;\n if (!Array.isArray(items)) return false;\n const products = new Set(target.productGids);\n const variants = new Set(target.variantGids);\n return items.some((item) => {\n if (!item || typeof item !== \"object\") return false;\n const line = item as { product_id?: unknown; variant_id?: unknown };\n const product =\n typeof line.product_id === \"number\" || typeof line.product_id === \"string\"\n ? `gid://shopify/Product/${line.product_id}`\n : null;\n const variant =\n typeof line.variant_id === \"number\" || typeof line.variant_id === \"string\"\n ? `gid://shopify/ProductVariant/${line.variant_id}`\n : null;\n return (\n (product !== null && products.has(product)) ||\n (variant !== null && variants.has(variant))\n );\n });\n}\n\nasync function refreshCart(\n active: ActiveShipping,\n onEligibilityConfirmed?: () => void,\n): Promise<void> {\n const sequence = ++refreshSequence;\n cartAbortController?.abort();\n const controller =\n typeof AbortController === \"function\" ? new AbortController() : null;\n cartAbortController = controller;\n const timeout = controller\n ? window.setTimeout(() => controller.abort(), 5_000)\n : null;\n lastSubtotal = null;\n element?.remove();\n element = null;\n try {\n const response = await window.fetch(cartPath(\"cart.js\"), {\n headers: { Accept: \"application/json\" },\n ...(controller ? { signal: controller.signal } : {}),\n });\n if (!response.ok) return;\n const cart = (await response.json()) as {\n currency?: unknown;\n items_subtotal_price?: unknown;\n items?: unknown;\n };\n const subtotal = cart.items_subtotal_price;\n const targetEligible = cartMatchesTarget(\n cart.items,\n active.eligibilityTarget,\n );\n if (sequence !== refreshSequence || current !== active) return;\n const currencyEligible = cart.currency === active.currency;\n cartEligibility.set(active.experimentId, targetEligible && currencyEligible);\n if (!targetEligible || !currencyEligible) {\n lastSubtotal = null;\n removeRenderedElement();\n }\n if (\n !currencyEligible ||\n typeof subtotal !== \"number\" ||\n !Number.isSafeInteger(subtotal) ||\n subtotal < 0 ||\n !targetEligible\n )\n return;\n lastSubtotal = subtotal;\n onEligibilityConfirmed?.();\n if (active.renderEnabled) render(subtotal, active);\n } catch {\n // Shipping messaging is additive; storefront cart behavior must never fail with it.\n } finally {\n if (timeout !== null) window.clearTimeout(timeout);\n if (cartAbortController === controller) cartAbortController = null;\n }\n}\n\nfunction installPlacementObserver(active: ActiveShipping): void {\n placementObserver = new MutationObserver(() => {\n // A mutation record may already be queued when teardown disconnects the\n // observer. Do not let that stale callback re-arm placement work.\n if (current !== active) return;\n if (placementCheckTimer !== null) return;\n placementCheckTimer = window.setTimeout(() => {\n placementCheckTimer = null;\n if (\n current !== active ||\n lastSubtotal === null ||\n cartEligibility.get(active.experimentId) !== true\n )\n return;\n const parent = findCartDrawerContainer() ?? document.body;\n if (!element?.isConnected || element.parentElement !== parent) {\n render(lastSubtotal, active);\n }\n }, 80);\n });\n placementObserver.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n}\n\nexport function applyCommerceShipping(\n settings: CommerceShippingSettings | undefined,\n assignments: Assignment[],\n onEligibilityConfirmed?: () => void,\n): void {\n cleanupCommerceShipping();\n if (!settings) return;\n const active = activeShipping(settings, assignments);\n if (!active) return;\n current = active;\n stopCartMutationListener = onShopifyCartMutation(() => {\n if (current === active) void refreshCart(active, onEligibilityConfirmed);\n });\n installPlacementObserver(active);\n stopDrawerListener = installCartDrawerOpenListener((open) => {\n if (open) void refreshCart(active, onEligibilityConfirmed);\n });\n void refreshCart(active, onEligibilityConfirmed);\n}\n\nexport function cleanupCommerceShipping(): void {\n refreshSequence += 1;\n cartAbortController?.abort();\n cartAbortController = null;\n current = null;\n cartEligibility.clear();\n lastSubtotal = null;\n element?.remove();\n element = null;\n stopDrawerListener?.();\n stopDrawerListener = null;\n placementObserver?.disconnect();\n placementObserver = null;\n if (placementCheckTimer !== null) window.clearTimeout(placementCheckTimer);\n placementCheckTimer = null;\n stopCartMutationListener?.();\n stopCartMutationListener = null;\n}\n", "import { safeRegexTest } from \"./safe-regex\";\n\n// The single decision for whether a goal is active on a page (APX-102 arms):\n// a goal carrying a pageId is decided entirely by Page activation and its\n// url_pattern is never consulted; otherwise an empty pattern matches every\n// URL and a non-empty pattern is a full-href regex test (no slash escaping,\n// no path fallback \u2014 deliberately NOT the experiment URL-targeting matcher).\n// The SDK runtime and the CLI both consume this function; the edge engine\n// inlines the same two arms (packages/worker/src/edge-engine `goalActive`).\nexport function goalIsEligible(\n goal: { pageId?: string | null; urlPattern?: string | null },\n pageActiveIds: ReadonlySet<string>,\n href: string,\n): boolean {\n if (goal.pageId) return pageActiveIds.has(goal.pageId);\n return !goal.urlPattern || safeRegexTest(goal.urlPattern, href);\n}\n", "const PII_KEY_TOKENS = new Set([\n \"email\", \"mail\", \"phone\", \"tel\", \"mobile\", \"fax\",\n \"address\", \"street\", \"zip\", \"postal\", \"postcode\",\n \"firstname\", \"lastname\", \"fullname\", \"surname\", \"username\", \"name\",\n \"birth\", \"birthday\", \"birthdate\", \"dob\", \"gender\",\n \"ssn\", \"vat\", \"iban\", \"bic\", \"card\", \"cvv\", \"cvc\",\n \"password\", \"passwd\", \"secret\", \"token\", \"auth\", \"session\",\n \"ip\", \"latitude\", \"longitude\", \"lat\", \"lng\", \"lon\",\n]);\n\nexport function containsPiiToken(key: string): boolean {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .some((token) => PII_KEY_TOKENS.has(token));\n}\n", "export const EVENT_TYPE_PATTERN = /^[a-zA-Z0-9_.:-]{1,120}$/;\n\n/** Whether a name is already safe to send as an Apex wire event type. */\nexport function isValidEventName(name: string): boolean {\n return EVENT_TYPE_PATTERN.test(name);\n}\n\n// Wire event types with read-path semantics (funnel aliases, exposure and\n// revenue vocabulary). A customer name that only becomes one of these through\n// normalization must not be ingested as the native event.\nexport const RESERVED_EVENT_TYPES = new Set([\n \"goal\",\n \"conversion\",\n \"add_to_cart\",\n \"checkout_started\",\n \"checkout_completed\",\n \"purchase\",\n \"pageview\",\n \"page_exit\",\n \"experiment_viewed\",\n \"experiment_pageview\",\n \"experiment_page_exit\",\n \"personalization_rendered\",\n \"funnel_step\",\n \"variant_served\",\n \"experiment_view\",\n \"exposure\",\n \"product_viewed\",\n \"product_added_to_cart\",\n \"product_removed_from_cart\",\n \"collection_viewed\",\n \"cart_viewed\",\n \"search_submitted\",\n \"alert_displayed\",\n \"checkout_contact_info_submitted\",\n \"checkout_address_info_submitted\",\n \"checkout_shipping_info_submitted\",\n \"payment_info_submitted\",\n \"ui_extension_errored\",\n \"delivery_health\",\n]);\n\nexport function normalizeEventName(name: string): string {\n if (EVENT_TYPE_PATTERN.test(name)) return name;\n\n const normalized = name\n .trim()\n .replace(/[\u00E4\u00C4]/g, (character) => character === \"\u00E4\" ? \"ae\" : \"Ae\")\n .replace(/[\u00F6\u00D6]/g, (character) => character === \"\u00F6\" ? \"oe\" : \"Oe\")\n .replace(/[\u00FC\u00DC]/g, (character) => character === \"\u00FC\" ? \"ue\" : \"Ue\")\n .replace(/\u00DF/g, \"ss\")\n .replace(/\u1E9E/g, \"SS\")\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-zA-Z0-9_.:-]/g, \"_\")\n .slice(0, 120);\n\n if (!normalized) return \"custom_event\";\n // Only normalized-from-invalid names are guarded; an integration that sends\n // a reserved name verbatim passes the early return above unchanged.\n if (RESERVED_EVENT_TYPES.has(normalized)) {\n return `custom_${normalized}`.slice(0, 120);\n }\n return normalized;\n}\n", "import { Goal, Assignment, CaptureRule } from \"./types\";\nimport { safeRegexTest } from \"./safe-regex\";\nimport { goalIsEligible } from \"./goal-eligibility\";\nimport { containsPiiToken } from \"./pii-keys\";\nimport { isStrictJsPolicy } from \"./js\";\nimport { normalizeEventName } from \"@drip/event-schema/event-name\";\n\ntype GoalCallback = (\n goalId: string,\n assignment: Assignment,\n data?: Record<string, unknown>,\n) => void;\n\nconst STORAGE_KEY = \"drip_goals\";\nlet onGoal: GoalCallback | null = null;\nlet clickListener: ((e: Event) => void) | null = null;\nlet activeClickGoals: { goal: Goal; assignment: Assignment }[] = [];\n\nfunction goalIsActiveOnPage(goal: Goal, pageActiveIds: ReadonlySet<string>): boolean {\n return goalIsEligible(goal, pageActiveIds, location.href);\n}\n\nfunction getFiredGoals(): Record<string, string[]> {\n try {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || \"{}\");\n } catch {\n return {};\n }\n}\n\nfunction markFired(goalId: string, variationId: string): void {\n const fired = getFiredGoals();\n const list = fired[goalId] || [];\n if (!list.includes(variationId)) {\n list.push(variationId);\n fired[goalId] = list;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fired));\n } catch {}\n }\n}\n\nfunction alreadyFired(goalId: string, variationId: string): boolean {\n const fired = getFiredGoals();\n return (fired[goalId] || []).includes(variationId);\n}\n\nfunction fireGoal(\n goal: Goal,\n assignment: Assignment,\n data?: Record<string, unknown>,\n): void {\n if (goal.countOnce && alreadyFired(goal.id, assignment.variationId)) return;\n if (goal.countOnce) markFired(goal.id, assignment.variationId);\n if (onGoal) onGoal(goal.id, assignment, data);\n}\n\n/**\n * Extract captured values from a matched element based on capture rules.\n * Values are sent as event properties alongside the goal event.\n */\nfunction extractCapturedValues(\n el: Element,\n capture?: CaptureRule[],\n): Record<string, unknown> {\n if (!capture?.length) return {};\n const data: Record<string, unknown> = {};\n for (const rule of capture) {\n if (isStrictJsPolicy() && (containsPiiToken(rule.property) ||\n (rule.attribute && containsPiiToken(rule.attribute)))) continue;\n if (rule.source === \"attribute\" && rule.attribute) {\n data[rule.property] = el.getAttribute(rule.attribute);\n } else if (rule.source === \"textContent\") {\n data[rule.property] = (el.textContent || \"\").trim().slice(0, 500);\n } else if (rule.source === \"dataset\" && rule.attribute) {\n // Convert \"data-product-id\" \u2192 \"productId\" for dataset access\n const key = rule.attribute\n .replace(/^data-/, \"\")\n .replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n data[rule.property] = (el as HTMLElement).dataset?.[key] ?? null;\n }\n }\n return data;\n}\n\nfunction textMatches(el: Element, text: string): boolean {\n return (el.textContent || \"\")\n .trim()\n .toLowerCase()\n .includes(text.trim().toLowerCase());\n}\n\nfunction findByText(start: Element, text: string): Element | null {\n let el: Element | null = start;\n const needle = text.trim().toLowerCase();\n while (el && el !== document.documentElement) {\n if ((el.textContent || \"\").trim().toLowerCase().includes(needle)) return el;\n el = parentAcrossShadowBoundary(el);\n }\n return null;\n}\n\nfunction parentAcrossShadowBoundary(element: Element): Element | null {\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n return typeof ShadowRoot === \"function\" && root instanceof ShadowRoot ? root.host : null;\n}\n\nfunction closestAcrossShadowBoundary(start: Element, selector: string): Element | null {\n let element: Element | null = start;\n while (element) {\n const matched = element.closest(selector);\n if (matched) return matched;\n const root = element.getRootNode();\n element = typeof ShadowRoot === \"function\" && root instanceof ShadowRoot ? root.host : null;\n }\n return null;\n}\n\nfunction handleClick(e: Event): void {\n const composedTarget = e.composedPath?.()[0];\n let resolved: Element | null = null;\n if (typeof Element === \"function\" && composedTarget instanceof Element) {\n resolved = composedTarget;\n } else if (typeof Node === \"function\" && composedTarget instanceof Node) {\n // A composed path can start at a Text node; its parent is the real\n // shadow-internal element, while e.target is only the retargeted host.\n resolved = composedTarget.parentElement;\n }\n const target = (resolved ?? e.target) as Element;\n if (!target?.closest) return;\n for (const entry of activeClickGoals) {\n const { selector, textMatch } = entry.goal;\n if (!selector && !textMatch) continue;\n\n let matched: Element | null = null;\n\n if (selector) {\n matched = closestAcrossShadowBoundary(target, selector);\n if (!matched) continue;\n // If textMatch is also set, verify the text\n if (textMatch && !textMatches(matched, textMatch)) continue;\n } else if (textMatch) {\n // No CSS selector \u2014 walk up from target checking text\n matched = findByText(target, textMatch);\n if (!matched) continue;\n }\n\n const captured = extractCapturedValues(matched!, entry.goal.capture);\n fireGoal(entry.goal, entry.assignment, captured);\n }\n}\n\nfunction collectActiveGoals(\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n pageActiveIds: ReadonlySet<string>,\n): { goal: Goal; assignment: Assignment }[] {\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n const active: { goal: Goal; assignment: Assignment }[] = [];\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n for (const goal of exp.goals) {\n if (!goalIsActiveOnPage(goal, pageActiveIds)) continue;\n active.push({ goal, assignment });\n }\n }\n return active;\n}\n\n/**\n * Identity of the goal wiring the given inputs would produce. The runtime\n * diffs this set to decide whether a re-wire is needed, so wiring stays\n * idempotent across repeated reconciliation passes.\n */\nexport function goalWiringKeys(\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n pageActiveIds: ReadonlySet<string> = new Set(),\n): Set<string> {\n return new Set(\n collectActiveGoals(assignments, experiments, pageActiveIds).map(\n ({ goal, assignment }) =>\n [\n assignment.experimentId,\n assignment.variationId,\n goal.id,\n goal.pageId ?? \"\",\n goal.type,\n goal.selector ?? \"\",\n goal.textMatch ?? \"\",\n ].join(\"\\u0000\"),\n ),\n );\n}\n\nexport function setupGoals(\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n callback: GoalCallback,\n pageActiveIds: ReadonlySet<string> = new Set(),\n): void {\n onGoal = callback;\n activeClickGoals = [];\n\n if (clickListener) {\n document.removeEventListener(\"click\", clickListener, true);\n clickListener = null;\n }\n\n let hasClickGoals = false;\n\n for (const { goal, assignment } of collectActiveGoals(\n assignments,\n experiments,\n pageActiveIds,\n )) {\n if (goal.type === \"click\" && (goal.selector || goal.textMatch)) {\n activeClickGoals.push({ goal, assignment });\n hasClickGoals = true;\n }\n if (goal.type === \"pageview\") {\n fireGoal(goal, assignment);\n }\n }\n\n if (hasClickGoals) {\n clickListener = handleClick;\n document.addEventListener(\"click\", clickListener, true);\n }\n}\n\nexport function triggerGoal(\n goalId: string,\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n data?: Record<string, unknown>,\n): void {\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n const goal = exp.goals.find((g) => g.id === goalId);\n if (goal) fireGoal(goal, assignment, data);\n }\n}\n\nexport function triggerGoalsForEvent(\n eventName: string,\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n data?: Record<string, unknown>,\n): void {\n if (!eventName) return;\n const normalizedEventName = normalizeEventName(eventName);\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n for (const goal of exp.goals) {\n if (\n goal.type === \"custom\" &&\n goal.eventName &&\n normalizeEventName(goal.eventName) === normalizedEventName\n ) {\n fireGoal(goal, assignment, data);\n }\n }\n }\n}\n\nexport function cleanupGoals(): void {\n activeClickGoals = [];\n if (clickListener) {\n document.removeEventListener(\"click\", clickListener, true);\n clickListener = null;\n }\n}\n", "import type { RuntimeSignalDefinition } from \"./types\";\nimport { containsPiiToken } from \"./pii-keys\";\n\ntype ExposureSignalValue = string | number | boolean;\n\nconst BUILT_IN_SIGNALS: Array<[source: string, output: string]> = [\n [\"traffic.source\", \"traffic_source\"],\n [\"visitor.returning\", \"visitor_returning\"],\n [\"shopify.page_type\", \"page_type\"],\n [\"shopify.product_type\", \"product_type\"],\n [\"cart.item_count\", \"cart_item_count\"],\n [\"navigator.language\", \"language\"],\n];\n\nconst BUILT_IN_OUTPUT_KEYS = new Set(BUILT_IN_SIGNALS.map(([, output]) => output));\nconst MAX_KEYS = 24;\nconst MAX_JSON_CHARS = 2000;\nconst MAX_STRING_CHARS = 120;\nconst EXCLUDED_CUSTOM_KEYS = new Set([\n \"cookie.value\",\n \"referrer\",\n \"search.last_query\",\n \"shopify.customer_tag\",\n]);\nconst EXCLUDED_CUSTOM_PREFIXES = [\n \"url.\",\n \"utm.\",\n \"device.\",\n \"geo.\",\n \"recently_viewed.\",\n];\n\n// Custom signal keys are merchant-defined, so key-syntax validation alone\n// cannot stop PII-shaped signals (customer.email, phone, \u2026) from reaching\n// analytics. Any key containing one of these tokens is never attached to\n// exposure events, regardless of merchant configuration.\nfunction normalizeValue(value: unknown): ExposureSignalValue | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, MAX_STRING_CHARS) : undefined;\n }\n return undefined;\n}\n\nfunction outputKeyForCustomSignal(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nfunction collidesWithBuiltInPrefix(key: string): boolean {\n if (!key) return true;\n for (const builtInKey of BUILT_IN_OUTPUT_KEYS) {\n if (key === builtInKey || key.startsWith(`${builtInKey}_`)) return true;\n }\n return false;\n}\n\nfunction isExcludedCustomSignalKey(key: string): boolean {\n const normalized = key.trim().toLowerCase();\n if (EXCLUDED_CUSTOM_KEYS.has(normalized)) return true;\n if (EXCLUDED_CUSTOM_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return true;\n }\n return containsPiiToken(key);\n}\n\nfunction compactToLimits(values: Record<string, ExposureSignalValue>): Record<string, ExposureSignalValue> | null {\n const keys = Object.keys(values).sort();\n while (keys.length > MAX_KEYS) {\n const key = keys.pop();\n if (key) delete values[key];\n }\n\n while (keys.length > 0 && JSON.stringify(values).length > MAX_JSON_CHARS) {\n const key = keys.pop();\n if (key) delete values[key];\n }\n\n if (Object.keys(values).length === 0) return null;\n return Object.fromEntries(\n Object.keys(values).sort().map((key) => [key, values[key]]),\n ) as Record<string, ExposureSignalValue>;\n}\n\nexport function buildExposureSignalContext(input: {\n attributes: Record<string, unknown>;\n customSignals?: RuntimeSignalDefinition[];\n}): Record<string, ExposureSignalValue> | null {\n const values: Record<string, ExposureSignalValue> = {};\n\n for (const [sourceKey, outputKey] of BUILT_IN_SIGNALS) {\n const value = normalizeValue(input.attributes[sourceKey]);\n if (value !== undefined) values[outputKey] = value;\n }\n\n for (const signal of input.customSignals ?? []) {\n if (!signal.key) continue;\n if (isExcludedCustomSignalKey(signal.key)) continue;\n if (![\"string\", \"number\", \"boolean\"].includes(signal.valueType ?? \"string\")) continue;\n const outputKey = outputKeyForCustomSignal(signal.key);\n if (collidesWithBuiltInPrefix(outputKey)) continue;\n if (Object.prototype.hasOwnProperty.call(values, outputKey)) continue;\n const value = normalizeValue(input.attributes[signal.key]);\n if (value !== undefined) values[outputKey] = value;\n }\n\n return compactToLimits(values);\n}\n", "import { matchUrlRules } from \"./targeting\";\nimport type { PersistedAssignmentRecord } from \"./assignment-store\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { hashToFloat, variationHashToFloat } from \"./hash\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport type {\n Assignment,\n ExclusionGroupConfig,\n Experiment,\n Variation,\n} from \"./types\";\n\nexport type StoredGroupSelection = {\n experimentId: string;\n epoch: number;\n};\n\nexport interface DecideAssignmentsInput {\n experiments: Experiment[];\n visitorId: string;\n storedAssignments?: Record<string, PersistedAssignmentRecord>;\n storedGroupSelections?: Record<string, StoredGroupSelection>;\n exclusionGroups?: ExclusionGroupConfig[];\n holdout?: { enabled?: boolean; percentage?: number };\n /** Supplied by the caller so the decision boundary never reads the clock. */\n now: number;\n /** Reserved for the Stage 2 bootstrap's already-targeted payload contract. */\n url?: string;\n}\n\nfunction epoch(value: number | null | undefined): number {\n return Number.isFinite(value) ? Math.max(1, Math.floor(value as number)) : 1;\n}\n\nexport function buildAssignment(\n experiment: Experiment,\n variation: Variation,\n index: number,\n hashValue: string,\n url?: string,\n): Assignment {\n const block = !variation.isControl && url\n ? variation.urlBlocks?.find((candidate) => matchUrlRules(url, candidate.urlRules))\n : undefined;\n return {\n experimentId: experiment.id,\n experimentName: experiment.name,\n variationId: variation.id,\n pageActive: true,\n activeUrlBlockId: block?.id,\n index,\n mutations: block ? block.mutations : variation.mutations,\n value: variation.value,\n featureFlag: experiment.featureFlag,\n personalization: experiment.personalization,\n kind: experiment.kind ?? (experiment.personalization\n ? \"personalization\"\n : experiment.featureFlag\n ? \"feature_flag\"\n : \"experiment\"),\n experimentCss: experiment.css,\n experimentJs: experiment.js,\n experimentResetJs: experiment.resetJs,\n css: block ? block.css : variation.css,\n js: block ? block.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 redirectUrl: variation.redirectUrl,\n artifactSource: variation.artifactSource,\n hashValue,\n assignmentEpoch: epoch(experiment.assignmentEpoch),\n };\n}\n\nfunction decideVariationIndex(\n experiment: Experiment,\n visitorId: string,\n storedAssignments: Record<string, PersistedAssignmentRecord>,\n): number {\n if (!experiment.variations.length) return -1;\n\n const stored = storedAssignments[experiment.id];\n if (stored && stored.epoch === epoch(experiment.assignmentEpoch)) {\n const index = experiment.variations.findIndex(\n (variation) => variation.id === stored.variationId,\n );\n if (index >= 0) {\n return index;\n }\n }\n\n const hashValue = hashToFloat(experiment.id, visitorId);\n const allocation = experiment.trafficAllocation ?? 1;\n if (!inTrafficAllocation(hashValue, allocation)) return -1;\n const variationHashValue = allocation >= 1\n ? hashValue\n : variationHashToFloat(experiment.id, visitorId);\n const index = chooseVariation(\n variationHashValue,\n experiment.variations.map((variation) => variation.weight),\n );\n return index < experiment.variations.length ? index : -1;\n}\n\nfunction heldOut(input: DecideAssignmentsInput): boolean {\n const percentage = input.holdout?.percentage;\n return input.holdout?.enabled === true && typeof percentage === \"number\" &&\n percentage > 0 && percentage <= 10 &&\n hashToFloat(\"apex:global-holdout:v1\", input.visitorId) < percentage / 100;\n}\n\n/** Worker bootstrap entrypoint after its literal status and weekday filters. */\nexport function decideVariationIdsPregated(\n input: DecideAssignmentsInput,\n): Array<[string, string]> {\n if (heldOut(input)) return [];\n const out: Array<[string, string]> = [];\n for (const experiment of input.experiments) {\n const index = decideVariationIndex(experiment, input.visitorId, input.storedAssignments ?? {});\n if (index >= 0) out.push([experiment.id, experiment.variations[index].id]);\n }\n return out;\n}\n\n/** Compact projection of the same production bucketing decision for pre-paint handoff. */\nexport function decideVariationIds(input: DecideAssignmentsInput): Array<[string, string]> {\n return decideVariationIdsPregated({\n ...input,\n experiments: input.experiments.filter((experiment) =>\n !weekdayScheduleBlocksDelivery(experiment.weekdaySchedule, new Date(input.now))\n ),\n });\n}\n\nfunction applyExclusionGroups(\n assignments: Assignment[],\n groups: ExclusionGroupConfig[],\n visitorId: string,\n storedSelections: Record<string, StoredGroupSelection>,\n): Assignment[] {\n const assignedIds = new Set(assignments.map((assignment) => assignment.experimentId));\n const suppressed = new Set<string>();\n for (const group of groups) {\n if (!group?.id || !Array.isArray(group.members)) continue;\n const conflicting = group.members.filter((member) => assignedIds.has(member.experimentId));\n if (conflicting.length <= 1) continue;\n const prior = storedSelections[group.id];\n const priorMember = prior\n ? conflicting.find((member) => member.experimentId === prior.experimentId)\n : undefined;\n const hasPositiveWeight = conflicting.some((member) => member.share > 0);\n let winnerId: string;\n if (\n prior &&\n prior.epoch === epoch(group.epoch) &&\n priorMember &&\n (priorMember.share > 0 || !hasPositiveWeight)\n ) {\n winnerId = prior.experimentId;\n } else {\n const configured = conflicting.map((member) =>\n Number.isFinite(member.share) && member.share > 0 ? member.share : 0\n );\n const weights = configured.some((weight) => weight > 0)\n ? configured\n : configured.map(() => 1);\n const index = chooseVariation(\n hashToFloat(`${group.id}:exclusion`, visitorId),\n weights,\n );\n winnerId = conflicting[Math.max(0, Math.min(index, conflicting.length - 1))].experimentId;\n }\n for (const member of conflicting) {\n if (member.experimentId !== winnerId) suppressed.add(member.experimentId);\n }\n }\n return assignments.filter((assignment) => !suppressed.has(assignment.experimentId));\n}\n\n/**\n * Pure assignment boundary for the SDK and the future inline bootstrap.\n * The caller owns targeting, storage reads/writes, time, and exposure effects.\n */\nexport function decideAssignments(input: DecideAssignmentsInput): Assignment[] {\n if (heldOut(input)) return [];\n\n const assignments: Assignment[] = [];\n for (const experiment of input.experiments) {\n if (weekdayScheduleBlocksDelivery(experiment.weekdaySchedule, new Date(input.now))) {\n continue;\n }\n const index = decideVariationIndex(experiment, input.visitorId, input.storedAssignments ?? {});\n if (index >= 0) assignments.push(buildAssignment(experiment, experiment.variations[index], index, input.visitorId, input.url));\n }\n return applyExclusionGroups(\n assignments,\n input.exclusionGroups ?? [],\n input.visitorId,\n input.storedGroupSelections ?? {},\n );\n}\n", "const CSS_CLASS = \"drip-css\";\nconst CSS_LINK_CLASS = \"drip-css-link\";\ntype CssJournalEntry = {\n seq: number;\n artifactId: string;\n epoch: number;\n owners: Set<string>;\n target: Element;\n state: \"applied\" | \"invalidated\";\n};\nconst cssJournal: CssJournalEntry[] = [];\nlet cssSequence = 0;\n\nfunction recordArtifact(\n element: Element,\n artifactId: string,\n ownerKeys: readonly string[],\n epoch: number,\n): void {\n const existing = cssJournal.find(\n (entry) => entry.target === element && entry.artifactId === artifactId,\n );\n if (existing) {\n ownerKeys.forEach((ownerKey) => existing.owners.add(ownerKey));\n existing.state = \"applied\";\n existing.epoch = epoch;\n return;\n }\n cssJournal.push({\n seq: ++cssSequence,\n artifactId,\n epoch,\n owners: new Set(ownerKeys),\n target: element,\n state: \"applied\",\n });\n}\n\nfunction forgetElement(element: Element): void {\n for (let index = cssJournal.length - 1; index >= 0; index -= 1) {\n if (cssJournal[index].target === element) cssJournal.splice(index, 1);\n }\n}\n\nexport function injectCss(\n css: string,\n experimentId: string,\n variationId: string,\n ownerKeys: readonly string[] = [],\n artifactId = \"css:\" + experimentId + \":\" + variationId,\n epoch = 0,\n): void {\n const id = \"drip-css-\" + experimentId + \"-\" + variationId;\n const existing = document.getElementById(id);\n if (existing && existing.textContent === css) {\n recordArtifact(existing, artifactId, ownerKeys, epoch);\n return;\n }\n if (existing) {\n forgetElement(existing);\n existing.textContent = css;\n recordArtifact(existing, artifactId, ownerKeys, epoch);\n return;\n }\n const style = document.createElement(\"style\");\n style.id = id;\n style.className = CSS_CLASS;\n style.textContent = css;\n recordArtifact(style, artifactId, ownerKeys, epoch);\n (document.head || document.documentElement).appendChild(style);\n}\n\nexport function injectExperimentCss(\n css: string,\n experimentId: string,\n ownerKeys: readonly string[] = [],\n artifactId = \"css:experiment:\" + experimentId,\n epoch = 0,\n): void {\n const id = \"drip-css-exp-\" + experimentId;\n let style = document.getElementById(id) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = id;\n style.className = CSS_CLASS;\n (document.head || document.documentElement).appendChild(style);\n }\n if (style.textContent !== css) forgetElement(style);\n style.textContent = css;\n recordArtifact(style, artifactId, ownerKeys, epoch);\n}\n\nexport function removeCss(experimentId: string, variationId: string): void {\n const el = document.getElementById(\"drip-css-\" + experimentId + \"-\" + variationId);\n if (el) {\n forgetElement(el);\n el.remove();\n }\n}\n\nexport function injectExternalCss(\n url: string,\n experimentId: string,\n variationId: string,\n ownerKeys: readonly string[] = [],\n artifactId = \"css:external:\" + experimentId + \":\" + variationId,\n epoch = 0,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const id = \"drip-css-link-\" + experimentId + \"-\" + variationId;\n const previous = document.getElementById(id);\n if (previous && previous.getAttribute(\"href\") === url) {\n recordArtifact(previous, artifactId, ownerKeys, epoch);\n resolve();\n return;\n }\n if (previous) {\n forgetElement(previous);\n previous.remove();\n }\n const link = document.createElement(\"link\");\n link.id = id;\n link.className = CSS_LINK_CLASS;\n link.rel = \"stylesheet\";\n link.href = url;\n recordArtifact(link, artifactId, ownerKeys, epoch);\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(\"Failed to load CSS artifact: \" + url));\n (document.head || document.documentElement).appendChild(link);\n });\n}\n\nexport function removeCssForOwner(ownerKey: string, artifactId?: string): void {\n const removed = new Set<Element>();\n for (let index = cssJournal.length - 1; index >= 0; index -= 1) {\n const entry = cssJournal[index];\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.owners.delete(ownerKey) || entry.owners.size > 0) continue;\n removed.add(entry.target);\n cssJournal.splice(index, 1);\n }\n for (const element of removed) {\n if (!cssJournal.some((entry) => entry.target === element)) element.remove();\n }\n}\n\nexport function addCssOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (existingOwnerKeys.size === 0 || ownerKeys.length === 0) return;\n for (const entry of cssJournal) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (\n !Array.from(existingOwnerKeys).some((ownerKey) =>\n entry.owners.has(ownerKey)\n )\n ) continue;\n ownerKeys.forEach((ownerKey) => entry.owners.add(ownerKey));\n }\n}\n\nexport function removeAllCss(): void {\n document.querySelectorAll(\".\" + CSS_CLASS).forEach((el) => el.remove());\n document.querySelectorAll(\".\" + CSS_LINK_CLASS).forEach((el) => el.remove());\n cssJournal.length = 0;\n}\n", "/**\n * Anti-flicker reveal module.\n *\n * The Worker's /s/<shopId>.js snippet injects\n * <style id=\"drip-hide\">\u2026</style> as early as possible.\n * In optimized mode this style is selector-scoped and only falls back\n * to full-page hiding when scoped selectors are unavailable.\n *\n * This module provides revealAll() which the SDK calls once all mutations\n * have been applied, making the page visible with the correct variant.\n * A snippet safety timeout guarantees the page is always revealed even if\n * the SDK encounters an error.\n */\n\nconst STYLE_ID = \"drip-hide\";\n\n/** Remove the anti-flicker style injected by the snippet */\nexport function revealAll(): void {\n const el = document.getElementById(STYLE_ID);\n if (el) el.remove();\n}\n", "const URL_ATTRIBUTES = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"]);\nconst SAFE_DATA_URL_MEDIA_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\",\n]);\n\nexport function isSafeMutationAttribute(name: string, value: string | null): boolean {\n const normalizedName = name.trim().toLowerCase();\n if (!normalizedName) return false;\n if (value === null) return true;\n if (normalizedName.startsWith(\"on\") || normalizedName === \"srcdoc\") return false;\n if (!URL_ATTRIBUTES.has(normalizedName)) return true;\n const normalizedValue = value.replace(/[\\u0000-\\u0020]+/g, \"\").toLowerCase();\n if (normalizedValue.startsWith(\"javascript:\")) return false;\n if (!normalizedValue.startsWith(\"data:\")) return true;\n const mediaType = normalizedValue.slice(5).split(/[;,]/, 1)[0];\n return SAFE_DATA_URL_MEDIA_TYPES.has(mediaType);\n}\n\n/**\n * Lightweight HTML sanitizer using the browser's DOMParser.\n * Strips <script> tags, on* event handlers, and javascript: URLs.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n\n // Remove all <script> elements\n for (const script of Array.from(doc.querySelectorAll(\"script\"))) {\n script.remove();\n }\n\n // Walk every element to strip dangerous attributes\n for (const el of Array.from(doc.body.querySelectorAll(\"*\"))) {\n for (const attr of Array.from(el.attributes)) {\n if (!isSafeMutationAttribute(attr.name, attr.value)) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n return doc.body.innerHTML;\n}\n", "type ShadowHost = Element & { shadowRoot: ShadowRoot };\n\nconst hosts = new Set<ShadowHost>();\nconst rootObservers = new Map<ShadowRoot, MutationObserver>();\nconst listeners = new Set<(records: MutationRecord[], root: ShadowRoot) => void>();\nlet initialized = false;\n\nfunction registerSubtree(root: ParentNode): void {\n const candidates: Element[] = [];\n if (typeof Element === \"function\" && root instanceof Element) candidates.push(root);\n root.querySelectorAll?.(\"*\")?.forEach((element) => candidates.push(element));\n for (const element of candidates) {\n if (!element.shadowRoot) continue;\n const host = element as ShadowHost;\n if (!hosts.has(host)) {\n hosts.add(host);\n observeRoot(host.shadowRoot);\n }\n registerSubtree(host.shadowRoot);\n }\n}\n\nfunction observeRoot(root: ShadowRoot): void {\n if (typeof MutationObserver === \"undefined\" || rootObservers.has(root)) return;\n const rootObserver = new MutationObserver((records) => {\n for (const record of records) {\n record.addedNodes.forEach((node) => {\n if (typeof Element === \"function\" && node instanceof Element) registerSubtree(node);\n });\n }\n listeners.forEach((listener) => listener(records, root));\n });\n rootObserver.observe(root, { attributes: true, characterData: true, childList: true, subtree: true });\n rootObservers.set(root, rootObserver);\n}\n\nfunction pruneHosts(): void {\n for (const host of hosts) {\n if (!host.isConnected) {\n rootObservers.get(host.shadowRoot)?.disconnect();\n rootObservers.delete(host.shadowRoot);\n hosts.delete(host);\n }\n }\n}\n\nfunction initializeShadowDomSupport(): void {\n if (initialized || typeof document === \"undefined\") return;\n initialized = true;\n registerSubtree(document);\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) return;\n const documentObserver = new MutationObserver((records) => {\n pruneHosts();\n for (const record of records) {\n record.addedNodes.forEach((node) => {\n if (typeof Element === \"function\" && node instanceof Element) registerSubtree(node);\n });\n }\n });\n documentObserver.observe(document.documentElement, { childList: true, subtree: true });\n}\n\nfunction hostsInDocumentOrder(): ShadowHost[] {\n return Array.from(hosts).sort((a, b) => {\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_DISCONNECTED) return 0;\n return position & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n\nexport function queryAllDeep(selector: string): Element[] {\n const documentMatches = Array.from(document.querySelectorAll(selector));\n if (documentMatches.length > 0) return documentMatches;\n initializeShadowDomSupport();\n pruneHosts();\n // Re-walk the document on every miss: attachShadow on an already-inserted\n // element produces no mutation record, so the observers cannot see it.\n registerSubtree(document);\n if (hosts.size === 0) return documentMatches;\n\n const matches: Element[] = [];\n for (const host of hostsInDocumentOrder()) {\n host.shadowRoot.querySelectorAll(selector).forEach((el) => matches.push(el));\n }\n return matches;\n}\n\nexport function shadowRootFor(element: Element): ShadowRoot | null {\n if (typeof element.getRootNode !== \"function\") return null;\n const root = element.getRootNode();\n return typeof ShadowRoot === \"function\" && root instanceof ShadowRoot ? root : null;\n}\n\nexport function onShadowMutations(\n listener: (records: MutationRecord[], root: ShadowRoot) => void,\n): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n", "import type { Mutation } from \"./types\";\nimport { matchesOriginalInnerHtmlSnapshot, normalizeCssPropertyName } from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { onShadowMutations, shadowRootFor } from \"./shadow\";\n\ntype Entry = {\n el: Element;\n mutation: Mutation;\n artifactId?: string;\n journalSeq?: number;\n ownerKeys: Set<string>;\n requiresOwner: boolean;\n experimentId?: string;\n variationId?: string;\n appliedAt: number;\n apply: (element: Element, mutation: Mutation) => void;\n times: number[];\n stopped: boolean;\n shadowRoot?: ShadowRoot;\n shadowIndex?: number;\n appliedNodes?: ChildNode[];\n appliedStyles?: Array<[string, string]>;\n};\n\ntype TreatedRoot = {\n entries: Entry[];\n observer: MutationObserver;\n};\n\n// For html treatments, remember the nodes the treatment put in place and\n// attribute subtree changes: a framework hydration revert either replaces\n// them wholesale or restores the pre-treatment original content in place\n// (React/Vue reconciliation), while variant-owned widget activity (a\n// carousel adding slides, a countdown updating text, variation JS appending\n// state) evolves the applied content into something the original never had.\n// Wholesale replaces reassert at any time; in-place full restores reassert\n// within the hydration window; everything else is treated as variant-owned.\n// Partial in-place patches that do not restore the full original are not\n// separable from widget writes \u2014 sites that hit that corner integrate via\n// the drip:hydrated event / hold() API.\nconst IN_PLACE_REVERT_WINDOW_MS = 10_000;\n\nfunction captureAppliedNodes(entry: Entry): void {\n if (entry.mutation.action === \"html\") {\n entry.appliedNodes = Array.from(entry.el.childNodes);\n } else if (entry.mutation.action === \"style\" || entry.mutation.action === \"setStyle\") {\n const style = (entry.el as HTMLElement).style;\n entry.appliedStyles = Object.keys(entry.mutation.styles ?? {}).map((name) => [\n name = normalizeCssPropertyName(name),\n style.getPropertyValue(name),\n ]);\n }\n}\n\nfunction variantContentSurvives(entry: Entry, needsDeepCheck: boolean): boolean {\n const surviving = (entry.appliedNodes ?? []).some(\n (node) => node.isConnected && entry.el.contains(node),\n );\n if (!surviving) return false;\n if (Date.now() - entry.appliedAt > IN_PLACE_REVERT_WINDOW_MS) return true;\n if (!needsDeepCheck) return true;\n // Any captured pre-state counts as a revert target: the server original,\n // or \u2014 with stacked html treatments \u2014 an earlier treatment's content.\n return !matchesOriginalInnerHtmlSnapshot(entry.el, entry.el.innerHTML);\n}\n\nconst pending = new Set<Entry>();\nconst deepChecks = new Set<Entry>();\nconst roots = new Map<Element, TreatedRoot>();\nlet frame: number | null = null;\nlet stopShadowListener: (() => void) | null = null;\n\nfunction perf(): Record<string, unknown> | null {\n if (typeof window === \"undefined\") return null;\n const target = window as Window & { __dripPerf?: Record<string, unknown> };\n return target.__dripPerf = target.__dripPerf ?? {};\n}\n\nfunction matches(entry: Entry, record: MutationRecord): boolean {\n if (!entry.el.isConnected) return false;\n const action = entry.mutation.action;\n if (action === \"style\" || action === \"setStyle\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || record.attributeName !== \"style\") return false;\n const style = (entry.el as HTMLElement).style;\n return entry.appliedStyles!.some(\n ([name, value]) => style.getPropertyValue(name) !== value,\n );\n }\n if (action === \"attribute\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || !record.attributeName) return false;\n const expected = record.attributeName === entry.mutation.attribute?.name\n ? entry.mutation.attribute.value\n : entry.mutation.attributes?.[record.attributeName];\n return expected !== undefined && entry.el.getAttribute(record.attributeName) !== expected;\n }\n if (action === \"html\") return true;\n return record.type !== \"attributes\" && entry.el.textContent !== entry.mutation.text;\n}\n\nfunction markPending(entry: Entry): void {\n pending.add(entry);\n if (entry.mutation.action === \"html\") deepChecks.add(entry);\n}\n\nfunction schedule(): void {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n const now = Date.now();\n for (const entry of pending) {\n if (entry.stopped || (entry.requiresOwner && entry.ownerKeys.size === 0)) continue;\n entry.times = entry.times.filter((at) => now - at < 10_000);\n if (entry.times.length === 12) {\n entry.stopped = true;\n const metrics = perf();\n if (metrics) metrics.reassert_loop_detected = true;\n continue;\n }\n if (entry.mutation.action === \"html\" && variantContentSurvives(entry, deepChecks.has(entry))) {\n // The change came from inside the still-applied treatment; erasing\n // it would destroy legitimate widget state. Track the evolved\n // subtree instead of reasserting the original static HTML.\n captureAppliedNodes(entry);\n continue;\n }\n entry.times.push(now);\n runMuted(() => entry.apply(entry.el, entry.mutation));\n captureAppliedNodes(entry);\n const metrics = perf();\n if (metrics) metrics.reapply_count = (Number(metrics.reapply_count) || 0) + 1;\n if (entry.mutation.action === \"html\") {\n document.dispatchEvent(new CustomEvent(\"drip:mutation-reapplied\", { detail: {\n experimentId: entry.experimentId,\n variationId: entry.variationId,\n selector: entry.mutation.selector,\n action: entry.mutation.action,\n } }));\n }\n }\n pending.clear();\n deepChecks.clear();\n });\n}\n\nfunction canResurrectViaShadow(treated: TreatedRoot): boolean {\n return treated.entries.some(\n (entry) => !entry.stopped && entry.shadowRoot !== undefined && entry.shadowRoot.host.isConnected,\n );\n}\n\nfunction observe(element: Element): void {\n if (typeof MutationObserver === \"undefined\" || roots.has(element)) return;\n for (const [treatedRoot, treated] of roots) {\n if (treatedRoot.isConnected) continue;\n // A disconnected root whose entries live in a still-connected shadow root\n // stays registered: the shadow listener re-locates those entries on a\n // later widget re-render, and this sweep would otherwise drop a sibling\n // entry whose replacement was not findable in the same mutation batch.\n if (canResurrectViaShadow(treated)) continue;\n treated.observer.disconnect();\n unregisterMutedObserver(treated.observer);\n roots.delete(treatedRoot);\n }\n const entries: Entry[] = [];\n const onRecords: MutationCallback = (records) => {\n for (const record of records) {\n for (const entry of entries) {\n if (!entry.stopped && matches(entry, record)) markPending(entry);\n }\n }\n if (pending.size) schedule();\n };\n const observer = new MutationObserver(onRecords);\n roots.set(element, { entries, observer });\n registerMutedObserver(observer, onRecords);\n observer.observe(element, { attributes: true, characterData: true, childList: true, subtree: true });\n}\n\nfunction ensureShadowObserver(): void {\n stopShadowListener ??= onShadowMutations((_records, root) => {\n for (const [rootElement, treated] of Array.from(roots.entries())) {\n for (const entry of Array.from(treated.entries)) {\n if (entry.stopped || entry.shadowRoot !== root || entry.el.isConnected) continue;\n try {\n const candidates = Array.from(root.querySelectorAll(entry.mutation.selector));\n const replacement = candidates[entry.shadowIndex ?? 0];\n if (!replacement || replacement === entry.el) continue;\n // Migrate the entry to the replacement's root (mirrors\n // replayReassertSentinelEntry): an entry left keyed under the\n // disconnected element is purged by the next observe() sweep.\n const index = treated.entries.indexOf(entry);\n if (index >= 0) removeEntry(treated.entries, index);\n if (treated.entries.length === 0) {\n treated.observer.disconnect();\n unregisterMutedObserver(treated.observer);\n roots.delete(rootElement);\n }\n observe(replacement);\n entry.el = replacement;\n entry.shadowIndex = candidates.indexOf(replacement);\n roots.get(replacement)?.entries.push(entry);\n markPending(entry);\n } catch {}\n }\n }\n if (pending.size) schedule();\n });\n}\n\nexport function trackAppliedMutation(\n element: Element,\n mutation: Mutation,\n context: {\n experimentId?: string;\n variationId?: string;\n journalSeq?: number;\n artifactId?: string;\n ownerKeys?: readonly string[];\n },\n apply: (element: Element, mutation: Mutation) => void,\n): void {\n if (mutation.action === \"remove\" || mutation.action === \"insertBefore\" || mutation.action === \"insertAfter\") return;\n observe(element);\n const entries = roots.get(element)?.entries;\n if (!entries) return;\n const shadowRoot = shadowRootFor(element);\n if (shadowRoot) ensureShadowObserver();\n const existing = entries.find((entry) => context.journalSeq !== undefined\n ? entry.journalSeq === context.journalSeq\n : entry.mutation === mutation);\n if (existing) {\n context.ownerKeys?.forEach((ownerKey) => existing.ownerKeys.add(ownerKey));\n Object.assign(existing, {\n experimentId: context.experimentId,\n variationId: context.variationId,\n journalSeq: context.journalSeq,\n artifactId: context.artifactId,\n appliedAt: Date.now(),\n apply,\n });\n captureAppliedNodes(existing);\n } else {\n const entry: Entry = {\n el: element,\n mutation,\n experimentId: context.experimentId,\n variationId: context.variationId,\n journalSeq: context.journalSeq,\n artifactId: context.artifactId,\n ownerKeys: new Set(context.ownerKeys ?? []),\n requiresOwner: context.ownerKeys !== undefined,\n appliedAt: Date.now(),\n apply,\n times: [],\n stopped: false,\n shadowRoot: shadowRoot ?? undefined,\n shadowIndex: shadowRoot\n ? Array.from(shadowRoot.querySelectorAll(mutation.selector)).indexOf(element)\n : undefined,\n };\n captureAppliedNodes(entry);\n entries.push(entry);\n }\n}\n\nfunction removeEntry(entries: Entry[], index: number): void {\n const [entry] = entries.splice(index, 1);\n pending.delete(entry);\n deepChecks.delete(entry);\n}\n\nexport function addReassertSentinelOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (!existingOwnerKeys.size || !ownerKeys.length) return;\n for (const { entries } of roots.values()) {\n for (const entry of entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!Array.from(existingOwnerKeys).some((ownerKey) => entry.ownerKeys.has(ownerKey))) continue;\n ownerKeys.forEach((ownerKey) => entry.ownerKeys.add(ownerKey));\n }\n }\n}\n\nexport function resetReassertSentinelForOwner(\n ownerKey: string,\n artifactId?: string,\n): void {\n for (const [element, root] of Array.from(roots.entries())) {\n for (let index = root.entries.length - 1; index >= 0; index -= 1) {\n const entry = root.entries[index];\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.ownerKeys.delete(ownerKey)) continue;\n if (entry.requiresOwner && entry.ownerKeys.size === 0) removeEntry(root.entries, index);\n }\n if (root.entries.length) continue;\n root.observer.disconnect();\n unregisterMutedObserver(root.observer);\n roots.delete(element);\n }\n if (roots.size === 0 && frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n pending.clear();\n deepChecks.clear();\n }\n}\n\nexport function replayReassertSentinelEntry(\n journalSeq: number,\n element: Element,\n): void {\n for (const [currentElement, root] of Array.from(roots.entries())) {\n const index = root.entries.findIndex((entry) => entry.journalSeq === journalSeq);\n if (index < 0) continue;\n const entry = root.entries[index];\n if (entry.el === element) {\n entry.appliedAt = Date.now();\n captureAppliedNodes(entry);\n return;\n }\n removeEntry(root.entries, index);\n if (root.entries.length === 0) {\n root.observer.disconnect();\n unregisterMutedObserver(root.observer);\n roots.delete(currentElement);\n }\n observe(element);\n entry.el = element;\n entry.appliedAt = Date.now();\n entry.times = [];\n entry.stopped = false;\n captureAppliedNodes(entry);\n roots.get(element)?.entries.push(entry);\n return;\n }\n}\n\nexport function resetReassertSentinel(): void {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n pending.clear();\n deepChecks.clear();\n for (const { observer } of roots.values()) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n roots.clear();\n}\n", "import { Mutation, MutationAction } from \"./types\";\nimport { isSafeMutationAttribute, sanitizeHtml } from \"./sanitize\";\nimport { runMuted } from \"./observer-mute\";\nimport {\n addReassertSentinelOwners,\n replayReassertSentinelEntry,\n resetReassertSentinel,\n resetReassertSentinelForOwner,\n} from \"./reassert-sentinel\";\nimport { extractCurrencyTokens, type CurrencyToken } from \"./money\";\nimport { queryAllDeep } from \"./shadow\";\n\nexport type ApplyOptions = {\n root?: Document | HTMLElement;\n artifactId?: string;\n epoch?: number;\n ownerKeys?: readonly string[];\n onApplied?: (mutation: Mutation, element: Element, index: number, journalSeq?: number) => void;\n onMiss?: (mutation: Mutation, index: number) => void;\n preservePrices?: boolean;\n priceTestExempt?: boolean;\n onPricePreservationViolation?: (input: {\n mutation: Mutation;\n selector: string;\n originalPriceTokens: CurrencyToken[];\n }) => void;\n};\n\nconst INSERT_ATTR = \"data-drip-inserted\";\n\ntype ElementReference = { deref: () => Element | undefined };\n\ntype ElementBaseline = {\n attributeValues: Map<string, string | null>;\n contentTouched: boolean;\n innerHTML?: string;\n textContent?: string | null;\n styleAttributeTouched: boolean;\n styleAttributeValue: string | null;\n styleValues: Map<string, { value: string; priority: string }>;\n parent: Node | null;\n nextSibling: Node | null;\n};\n\nexport type MutationJournalEntry = {\n seq: number;\n artifactId: string;\n owners: Set<string>;\n target: { selector: string; index: number; el: ElementReference };\n mutation: Mutation;\n epoch: number;\n kind: \"mutation\" | \"insert\" | \"adopt-insert\";\n insertKey?: string;\n nodes?: Node[];\n state: \"applied\" | \"invalidated\";\n};\n\ntype MutationJournal = {\n entries: MutationJournalEntry[];\n baselines: WeakMap<Element, ElementBaseline>;\n fallbackArtifactId: string;\n};\n\nlet journalSequence = 0;\nlet applicationContextSequence = 0;\n// Sequence order is the treatment order. A rollback restores one baseline,\n// removes dead entries, and replays every surviving entry in this order.\nconst mutationJournal: MutationJournal = {\n entries: [],\n baselines: new WeakMap(),\n fallbackArtifactId: \"runtime\",\n};\n\n// Reassertion bypasses the normal application chokepoint, so remember mutation\n// objects rejected by the price guard and never replay them later.\nconst priceRejectedMutations = new WeakSet<Mutation>();\n\nexport { isSafeMutationAttribute } from \"./sanitize\";\n\nfunction sanitizeMutationHtml(html: string): string {\n return sanitizeHtml(html);\n}\n\nexport function normalizeCssPropertyName(name: string): string {\n // Prefer CSS syntax (kebab-case) because it works with:\n // - HTMLElement.style.setProperty(...)\n // - inline style rewriting at the edge worker\n // But accept common JS-style camelCase keys for developer ergonomics.\n if (!name) return name;\n if (name.startsWith(\"--\")) return name; // custom properties\n if (name.includes(\"-\")) return name; // already kebab-case\n\n let out = name.replace(/[A-Z]/g, (m) => \"-\" + m.toLowerCase());\n // Special-case msTransform -> -ms-transform\n if (out.startsWith(\"ms-\")) out = \"-\" + out;\n return out;\n}\n\nexport function getMutationKey(mutation: Mutation, index: number): string {\n return (\n mutation.action +\n \":\" +\n index +\n \":\" +\n (mutation.selector || \"\") +\n \":\" +\n (mutation.html || mutation.text || \"\")\n );\n}\n\nexport function isInsertAction(action: MutationAction): boolean {\n return action === \"insertBefore\" || action === \"insertAfter\";\n}\n\nfunction elementReference(element: Element): ElementReference {\n const WeakRefClass = (globalThis as typeof globalThis & {\n WeakRef?: new (value: Element) => ElementReference;\n }).WeakRef;\n return WeakRefClass ? new WeakRefClass(element) : { deref: () => element };\n}\n\nfunction mutationAttributeNames(mutation: Mutation): string[] {\n const names = new Set<string>();\n if (mutation.attribute) names.add(mutation.attribute.name);\n Object.keys(mutation.attributes ?? {}).forEach((name) => names.add(name));\n return Array.from(names);\n}\n\nfunction canonicalAttributeName(element: Element, name: string): string {\n const namespace = element.namespaceURI;\n return namespace === null || namespace === \"http://www.w3.org/1999/xhtml\"\n ? name.trim().toLowerCase()\n : name;\n}\n\nfunction isContentMutation(mutation: Mutation): boolean {\n return mutation.action === \"html\" || mutation.action === \"text\" || mutation.action === \"setText\";\n}\n\nfunction mutationStyleNames(mutation: Mutation): string[] {\n if (mutation.action !== \"style\" && mutation.action !== \"setStyle\") return [];\n return Object.keys(mutation.styles ?? {}).map(normalizeCssPropertyName);\n}\n\nfunction captureElementBaseline(\n journal: MutationJournal,\n element: Element,\n mutation: Mutation,\n): ElementBaseline {\n let baseline = journal.baselines.get(element);\n if (!baseline) {\n baseline = {\n attributeValues: new Map(),\n contentTouched: false,\n styleAttributeTouched: false,\n styleAttributeValue: null,\n styleValues: new Map(),\n parent: element.parentNode,\n nextSibling: element.nextSibling,\n };\n journal.baselines.set(element, baseline);\n }\n\n const attributeNames = mutationAttributeNames(mutation)\n .map((name) => canonicalAttributeName(element, name));\n const styleNames = mutationStyleNames(mutation);\n let capturedStyleAliasNow = false;\n if ((!baseline.styleAttributeTouched) &&\n (styleNames.length > 0 || attributeNames.includes(\"style\"))) {\n baseline.styleAttributeValue = element.getAttribute(\"style\");\n baseline.styleAttributeTouched = true;\n capturedStyleAliasNow = true;\n }\n for (const name of attributeNames) {\n if (!baseline.attributeValues.has(name)) {\n baseline.attributeValues.set(\n name,\n name === \"style\" && baseline.styleAttributeTouched\n ? baseline.styleAttributeValue\n : element.getAttribute(name),\n );\n }\n }\n if (styleNames.length > 0) {\n let originalStyle: CSSStyleDeclaration;\n if (capturedStyleAliasNow) {\n // This CSSOM is still pristine: the current style mutation has not run.\n // It also keeps non-DOM Element mocks useful when their attribute and\n // CSSStyleDeclaration views are not wired together like a browser's.\n originalStyle = (element as HTMLElement).style;\n } else if (baseline.styleAttributeTouched) {\n const originalStyleElement = document.createElement(\"div\");\n const originalStyleAttribute = baseline.styleAttributeValue;\n if (originalStyleAttribute !== null && originalStyleAttribute !== undefined) {\n originalStyleElement.setAttribute(\"style\", originalStyleAttribute);\n }\n originalStyle = originalStyleElement.style;\n } else {\n originalStyle = (element as HTMLElement).style;\n }\n for (const name of styleNames) {\n if (!baseline.styleValues.has(name)) {\n baseline.styleValues.set(name, {\n value: originalStyle.getPropertyValue(name),\n priority: originalStyle.getPropertyPriority(name),\n });\n }\n }\n }\n if (\n !baseline.contentTouched &&\n isContentMutation(mutation)\n ) {\n if (typeof element.innerHTML === \"string\") baseline.innerHTML = element.innerHTML;\n baseline.textContent = element.textContent;\n baseline.contentTouched = true;\n }\n return baseline;\n}\n\ntype BaselineRestoreScope = {\n attributes: Set<string>;\n content: boolean;\n position: boolean;\n styles: Set<string>;\n};\n\nfunction restoreScopeForEntry(\n scope: BaselineRestoreScope,\n element: Element,\n entry: MutationJournalEntry,\n): void {\n if (entry.kind !== \"mutation\") return;\n scope.position = true;\n if (isContentMutation(entry.mutation)) scope.content = true;\n mutationAttributeNames(entry.mutation)\n .forEach((name) => scope.attributes.add(canonicalAttributeName(element, name)));\n mutationStyleNames(entry.mutation).forEach((name) => scope.styles.add(name));\n}\n\nfunction restoreElementBaseline(\n element: Element,\n baseline: ElementBaseline,\n scope: BaselineRestoreScope,\n): void {\n if (scope.position && baseline.parent && !element.parentNode) {\n try {\n baseline.parent.insertBefore(element, baseline.nextSibling);\n } catch {\n baseline.parent.appendChild(element);\n }\n }\n if (scope.content && baseline.contentTouched) {\n if (baseline.innerHTML !== undefined) element.innerHTML = baseline.innerHTML;\n else if (baseline.textContent !== undefined) element.textContent = baseline.textContent;\n }\n const style = (element as HTMLElement).style;\n for (const name of scope.styles) {\n const valueAndPriority = baseline.styleValues.get(name);\n if (!valueAndPriority) continue;\n const { value, priority } = valueAndPriority;\n if (value) style.setProperty(name, value, priority);\n else style.removeProperty(name);\n }\n // Restore attributes after CSSOM properties so a tracked `style` attribute\n // preserves its pristine spelling as well as its pristine declarations.\n for (const name of scope.attributes) {\n if (!baseline.attributeValues.has(name)) continue;\n const value = baseline.attributeValues.get(name);\n if (value === null) element.removeAttribute(name);\n else if (value !== undefined) element.setAttribute(name, value);\n }\n}\n\nfunction artifactIdentity(\n journal: MutationJournal,\n ownerKeys: readonly string[],\n artifactId?: string,\n): string {\n return artifactId ?? ownerKeys[0] ?? journal.fallbackArtifactId;\n}\n\nfunction appendJournalEntry(\n journal: MutationJournal,\n mutation: Mutation,\n element: Element,\n targetIndex: number,\n ownerKeys: readonly string[],\n artifactId: string | undefined,\n kind: MutationJournalEntry[\"kind\"],\n epoch: number,\n insertKey?: string,\n nodes?: Node[],\n): MutationJournalEntry {\n const entry: MutationJournalEntry = {\n seq: ++journalSequence,\n artifactId: artifactIdentity(journal, ownerKeys, artifactId),\n owners: new Set(ownerKeys),\n target: {\n selector: mutation.selector,\n index: targetIndex,\n el: elementReference(element),\n },\n mutation,\n epoch,\n kind,\n insertKey,\n nodes,\n state: \"applied\",\n };\n journal.entries.push(entry);\n return entry;\n}\n\nexport function applyToElement(mutation: Mutation, element: Element): void {\n switch (mutation.action) {\n case \"html\":\n if (typeof mutation.html === \"string\") element.innerHTML = sanitizeMutationHtml(mutation.html);\n break;\n case \"text\":\n case \"setText\":\n if (typeof mutation.text === \"string\") element.textContent = mutation.text;\n break;\n case \"attribute\":\n if (mutation.attribute) {\n if (isSafeMutationAttribute(mutation.attribute.name, mutation.attribute.value)) {\n if (mutation.attribute.value === null) {\n element.removeAttribute(mutation.attribute.name);\n } else {\n element.setAttribute(mutation.attribute.name, mutation.attribute.value);\n }\n }\n }\n if (mutation.attributes) {\n for (const [name, value] of Object.entries(mutation.attributes)) {\n if (!isSafeMutationAttribute(name, value)) continue;\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n }\n }\n break;\n case \"style\":\n case \"setStyle\":\n if (mutation.styles) {\n for (const [name, value] of Object.entries(mutation.styles)) {\n (element as HTMLElement).style.setProperty(\n normalizeCssPropertyName(name),\n value,\n );\n }\n }\n break;\n case \"remove\":\n element.remove();\n break;\n case \"insertBefore\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"beforebegin\", sanitizeMutationHtml(mutation.html));\n }\n break;\n case \"insertAfter\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"afterend\", sanitizeMutationHtml(mutation.html));\n }\n break;\n }\n}\n\nexport function isInsertDuplicate(element: Element, key: string): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).some(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nexport function markInserted(el: Element, key: string): void {\n (el as HTMLElement).setAttribute(INSERT_ATTR, key);\n}\n\nfunction collectInsertedNodes(mutation: Mutation, element: Element): Node[] {\n const parent = element.parentNode;\n if (!parent || typeof mutation.html !== \"string\") return [];\n const previousSibling = element.previousSibling;\n const nextSibling = element.nextSibling;\n applyToElement(mutation, element);\n const nodes: Node[] = [];\n let current = mutation.action === \"insertBefore\"\n ? (previousSibling ? previousSibling.nextSibling : parent.firstChild)\n : element.nextSibling;\n const boundary = mutation.action === \"insertBefore\" ? element : nextSibling;\n while (current && current !== boundary) {\n nodes.push(current);\n current = current.nextSibling;\n }\n return nodes;\n}\n\nfunction insertedElements(nodes: readonly Node[]): Element[] {\n return nodes.filter((node): node is Element => node instanceof Element);\n}\n\nfunction adoptedInsertNodes(\n journal: MutationJournal,\n element: Element,\n key: string,\n): Node[] {\n for (let index = journal.entries.length - 1; index >= 0; index -= 1) {\n const entry = journal.entries[index];\n if (\n entry.insertKey === key &&\n entry.target.el.deref() === element &&\n entry.nodes?.some((node) => node.parentNode)\n ) {\n return entry.nodes;\n }\n }\n const parent = element.parentElement;\n if (!parent) return [];\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).filter(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nfunction applyTrackedMutationWithJournal(\n mutation: Mutation,\n element: Element,\n journal: MutationJournal,\n key?: string,\n ownerKeys: readonly string[] = [],\n artifactId?: string,\n targetIndex = 0,\n epoch = 0,\n): { inserted: Element | null; entry?: MutationJournalEntry } {\n return runMuted(() => {\n captureElementBaseline(journal, element, mutation);\n if (isInsertAction(mutation.action)) {\n const nodes = collectInsertedNodes(mutation, element);\n const elements = insertedElements(nodes);\n if (key) elements.forEach((inserted) => markInserted(inserted, key));\n if (!nodes.length) return { inserted: null };\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"insert\",\n epoch,\n key,\n nodes,\n );\n return { inserted: elements[0] ?? null, entry };\n }\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"mutation\",\n epoch,\n );\n applyToElement(mutation, element);\n return { inserted: null, entry };\n });\n}\n\nexport function applyTrackedMutation(\n mutation: Mutation,\n element: Element,\n key?: string,\n ownerKeys: readonly string[] = [],\n artifactId?: string,\n onJournal?: (entry: MutationJournalEntry) => void,\n epoch = 0,\n): Element | null {\n let targetIndex = 0;\n try {\n targetIndex = queryAllDeep(mutation.selector).indexOf(element);\n if (targetIndex < 0) targetIndex = 0;\n } catch {}\n if (key && isInsertAction(mutation.action) && isInsertDuplicate(element, key)) {\n const nodes = adoptedInsertNodes(mutationJournal, element, key);\n const entry = appendJournalEntry(\n mutationJournal,\n mutation,\n element,\n targetIndex,\n ownerKeys,\n artifactId,\n \"adopt-insert\",\n epoch,\n key,\n nodes,\n );\n onJournal?.(entry);\n return insertedElements(nodes)[0] ?? null;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n mutationJournal,\n key,\n ownerKeys,\n artifactId,\n targetIndex,\n epoch,\n );\n if (result.entry) onJournal?.(result.entry);\n return result.inserted;\n}\n\n/** Reject a just-applied guarded mutation without disturbing earlier treatments. */\nexport function rejectTrackedMutation(\n entry: MutationJournalEntry | undefined,\n element: Element,\n innerHTML: string,\n): void {\n runMuted(() => { element.innerHTML = innerHTML; });\n if (!entry) return;\n priceRejectedMutations.add(entry.mutation);\n entry.state = \"invalidated\";\n mutationJournal.entries = mutationJournal.entries.filter((candidate) => candidate !== entry);\n // Fail closed at mutation level: a price-violating mutation is suppressed on\n // every element, so already-applied sibling targets roll back instead of\n // drifting outside reassert coverage.\n const doomed = new Set(\n mutationJournal.entries.filter((candidate) => candidate.mutation === entry.mutation),\n );\n for (const candidate of doomed) candidate.state = \"invalidated\";\n if (doomed.size > 0) rollbackJournalEntries(mutationJournal, doomed);\n}\n\n// The sentinel treats the baseline and earlier journal values as framework\n// restore targets. Other content can be variant-owned widget state.\nexport function matchesOriginalInnerHtmlSnapshot(element: Element, current: string): boolean {\n if (mutationJournal.baselines.get(element)?.innerHTML === current) return true;\n for (const entry of mutationJournal.entries) {\n if (entry.target.el.deref() !== element || entry.mutation.action !== \"html\") continue;\n if (typeof entry.mutation.html === \"string\" && sanitizeMutationHtml(entry.mutation.html) === current) {\n return true;\n }\n }\n return false;\n}\n\nfunction applyPriceGuardedMutation(\n mutation: Mutation,\n element: Element,\n journal: MutationJournal,\n key: string,\n options: ApplyOptions,\n index: number,\n targetIndex: number,\n): void {\n const guardedPrices = extractCurrencyTokens(element.textContent ?? \"\");\n const guardedSnapshot = guardedPrices.length > 0 ? element.innerHTML : null;\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n if (guardedSnapshot !== null) {\n const remaining = extractCurrencyTokens(element.textContent ?? \"\");\n const preserved = guardedPrices.every((token) =>\n remaining.some((candidate) =>\n candidate.symbol === token.symbol && candidate.cents === token.cents));\n if (!preserved) {\n rejectTrackedMutation(result.entry, element, guardedSnapshot);\n options.onPricePreservationViolation?.({\n mutation,\n selector: mutation.selector,\n originalPriceTokens: guardedPrices,\n });\n return;\n }\n }\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n}\n\nfunction applyMutationsWithJournal(\n mutations: Mutation[],\n options: ApplyOptions,\n journal: MutationJournal,\n): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n let elements: Element[];\n try {\n elements = root === document\n ? queryAllDeep(mutation.selector)\n : Array.from(root.querySelectorAll(mutation.selector));\n } catch {\n options.onMiss?.(mutation, index);\n return;\n }\n if (elements.length === 0) {\n options.onMiss?.(mutation, index);\n return;\n }\n elements.forEach((element, targetIndex) => {\n const key = getMutationKey(mutation, index);\n if (isInsertAction(mutation.action)) {\n if (isInsertDuplicate(element, key)) {\n const entry = appendJournalEntry(\n journal,\n mutation,\n element,\n targetIndex,\n options.ownerKeys ?? [],\n options.artifactId,\n \"adopt-insert\",\n options.epoch ?? 0,\n key,\n adoptedInsertNodes(journal, element, key),\n );\n options.onApplied?.(mutation, element, index, entry.seq);\n return;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n return;\n }\n // Content changes are guarded; hiding or styling a price element can be\n // a legitimate compare-at-price treatment and is intentionally allowed.\n const priceBearingContent = mutation.action === \"html\"\n || mutation.action === \"text\"\n || mutation.action === \"setText\";\n if (options.preservePrices && !options.priceTestExempt && priceBearingContent) {\n applyPriceGuardedMutation(mutation, element, journal, key, options, index, targetIndex);\n return;\n }\n const result = applyTrackedMutationWithJournal(\n mutation,\n element,\n journal,\n key,\n options.ownerKeys,\n options.artifactId,\n targetIndex,\n options.epoch ?? 0,\n );\n options.onApplied?.(mutation, element, index, result.entry?.seq);\n });\n });\n}\n\nexport function applyMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n applyMutationsWithJournal(mutations, options, mutationJournal);\n}\n\nexport function reassertNonStructuralMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n if (\n isInsertAction(mutation.action)\n || mutation.action === \"remove\"\n || priceRejectedMutations.has(mutation)\n ) return;\n const elements = root === document\n ? queryAllDeep(mutation.selector)\n : Array.from(root.querySelectorAll(mutation.selector));\n elements.forEach((element) => {\n runMuted(() => applyToElement(mutation, element));\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nfunction resolveJournalTarget(\n journal: MutationJournal,\n entry: MutationJournalEntry,\n): Element | undefined {\n const current = entry.target.el.deref();\n if (current && (entry.mutation.action === \"remove\" || current.isConnected !== false)) {\n return current;\n }\n try {\n const replacement = queryAllDeep(entry.target.selector)[entry.target.index];\n if (replacement) {\n captureElementBaseline(journal, replacement, entry.mutation);\n entry.target.el = elementReference(replacement);\n return replacement;\n }\n } catch {}\n return current;\n}\n\nfunction replayInsertEntry(\n journal: MutationJournal,\n entry: MutationJournalEntry,\n element: Element,\n): void {\n const key = entry.insertKey;\n if (key && isInsertDuplicate(element, key)) {\n entry.nodes = adoptedInsertNodes(journal, element, key);\n entry.kind = \"adopt-insert\";\n entry.state = \"applied\";\n return;\n }\n const nodes = collectInsertedNodes(entry.mutation, element);\n if (key) insertedElements(nodes).forEach((inserted) => markInserted(inserted, key));\n entry.nodes = nodes;\n entry.kind = \"insert\";\n entry.state = \"applied\";\n}\n\nfunction replayTouchedTargets(\n journal: MutationJournal,\n touched: Set<Element>,\n restoreScopes: Map<Element, BaselineRestoreScope>,\n): void {\n for (const [element, scope] of restoreScopes) {\n const baseline = journal.baselines.get(element);\n if (baseline) restoreElementBaseline(element, baseline, scope);\n }\n for (const entry of journal.entries) {\n const element = resolveJournalTarget(journal, entry);\n if (!element || !touched.has(element)) continue;\n if (entry.kind === \"insert\" || entry.kind === \"adopt-insert\") {\n replayInsertEntry(journal, entry, element);\n } else {\n applyToElement(entry.mutation, element);\n entry.state = \"applied\";\n replayReassertSentinelEntry(entry.seq, element);\n }\n }\n}\n\nfunction addRestoreScope(\n scopes: Map<Element, BaselineRestoreScope>,\n element: Element,\n entry: MutationJournalEntry,\n): void {\n let scope = scopes.get(element);\n if (!scope) {\n scope = { attributes: new Set(), content: false, position: false, styles: new Set() };\n scopes.set(element, scope);\n }\n restoreScopeForEntry(scope, element, entry);\n}\n\nfunction pruneElementBaseline(journal: MutationJournal, element: Element): void {\n const baseline = journal.baselines.get(element);\n if (!baseline) return;\n const remaining = journal.entries.filter((entry) => entry.target.el.deref() === element);\n if (remaining.length === 0) {\n journal.baselines.delete(element);\n return;\n }\n const contentNeeded = remaining.some((entry) =>\n entry.kind === \"mutation\" && isContentMutation(entry.mutation));\n if (!contentNeeded) {\n baseline.contentTouched = false;\n delete baseline.innerHTML;\n delete baseline.textContent;\n }\n const attributeNames = new Set(remaining.flatMap((entry) =>\n entry.kind === \"mutation\"\n ? mutationAttributeNames(entry.mutation).map((name) => canonicalAttributeName(element, name))\n : []));\n for (const name of baseline.attributeValues.keys()) {\n if (!attributeNames.has(name)) baseline.attributeValues.delete(name);\n }\n const styleNames = new Set(remaining.flatMap((entry) =>\n entry.kind === \"mutation\" ? mutationStyleNames(entry.mutation) : []));\n for (const name of baseline.styleValues.keys()) {\n if (!styleNames.has(name)) baseline.styleValues.delete(name);\n }\n if (!attributeNames.has(\"style\") && styleNames.size === 0) {\n baseline.styleAttributeTouched = false;\n baseline.styleAttributeValue = null;\n }\n}\n\nfunction rollbackJournalEntries(\n journal: MutationJournal,\n doomed: Set<MutationJournalEntry>,\n options: { preserveReplacementTargets?: boolean } = {},\n): void {\n if (doomed.size === 0) return;\n const touched = new Set<Element>();\n const restoreScopes = new Map<Element, BaselineRestoreScope>();\n for (const entry of doomed) {\n // A teardown owns the exact node Apex mutated, not a later framework node\n // that happens to match the same selector/index. SPA frameworks commonly\n // replace route subtrees before reInit() reconciles Page activation. Using\n // resolveJournalTarget() here would adopt that replacement and restore the\n // old route's baseline into it (innerHTML/textContent included), detaching\n // the framework's listeners. When the selector now resolves to a different\n // node, the disconnected target has been retired and needs no rollback.\n const element = options.preserveReplacementTargets\n ? entry.target.el.deref()\n : resolveJournalTarget(journal, entry);\n let supersededByFrameworkNode = false;\n if (options.preserveReplacementTargets && element?.isConnected === false) {\n try {\n const current = document.querySelectorAll(entry.target.selector)[entry.target.index];\n supersededByFrameworkNode = Boolean(current && current !== element);\n } catch {}\n }\n if (element && !supersededByFrameworkNode) {\n touched.add(element);\n addRestoreScope(restoreScopes, element, entry);\n }\n }\n for (let index = journal.entries.length - 1; index >= 0; index -= 1) {\n if (doomed.has(journal.entries[index])) journal.entries.splice(index, 1);\n }\n runMuted(() => {\n for (const entry of doomed) {\n for (const node of entry.nodes ?? []) {\n const survives = journal.entries.some((candidate) => candidate.nodes?.includes(node));\n if (!survives) node.parentNode?.removeChild(node);\n }\n }\n replayTouchedTargets(journal, touched, restoreScopes);\n });\n touched.forEach((element) => pruneElementBaseline(journal, element));\n}\n\nfunction resetJournal(journal: MutationJournal): void {\n const doomed = new Set(journal.entries);\n rollbackJournalEntries(journal, doomed);\n journal.baselines = new WeakMap();\n}\n\nexport function resetAppliedMutations(): void {\n resetReassertSentinel();\n resetJournal(mutationJournal);\n}\n\nexport function resetAppliedMutationsForOwner(\n ownerKey: string,\n artifactId?: string,\n options: { preserveReplacementTargets?: boolean } = {},\n): void {\n const doomed = new Set<MutationJournalEntry>();\n for (const entry of mutationJournal.entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.owners.delete(ownerKey)) continue;\n if (entry.owners.size === 0) doomed.add(entry);\n }\n resetReassertSentinelForOwner(ownerKey, artifactId);\n rollbackJournalEntries(mutationJournal, doomed, options);\n}\n\nexport function addAppliedMutationOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (existingOwnerKeys.size === 0 || ownerKeys.length === 0) return;\n for (const entry of mutationJournal.entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (\n !Array.from(existingOwnerKeys).some((ownerKey) =>\n entry.owners.has(ownerKey)\n )\n ) continue;\n ownerKeys.forEach((ownerKey) => entry.owners.add(ownerKey));\n }\n addReassertSentinelOwners(existingOwnerKeys, ownerKeys, artifactId);\n}\n\nexport function invalidateArtifact(artifactId: string): void {\n mutationJournal.entries.forEach((entry) => {\n if (entry.artifactId === artifactId) entry.state = \"invalidated\";\n });\n}\n\nexport function replayArtifact(artifactId: string): void {\n const selected = mutationJournal.entries.filter((entry) => entry.artifactId === artifactId);\n if (!selected.length) return;\n const touched = new Set<Element>();\n const restoreScopes = new Map<Element, BaselineRestoreScope>();\n for (const entry of selected) {\n entry.state = \"invalidated\";\n const element = resolveJournalTarget(mutationJournal, entry);\n if (element) {\n touched.add(element);\n addRestoreScope(restoreScopes, element, entry);\n }\n }\n runMuted(() => replayTouchedTargets(mutationJournal, touched, restoreScopes));\n}\n\nexport function replayForOwner(ownerKey: string): void {\n const artifactIds = new Set(\n mutationJournal.entries\n .filter((entry) => entry.owners.has(ownerKey))\n .map((entry) => entry.artifactId),\n );\n artifactIds.forEach(replayArtifact);\n}\n\nexport type MutationApplicationContext = {\n apply: (mutations: Mutation[], options?: ApplyOptions) => void;\n rollback: () => void;\n readonly snapshotCount: number;\n};\n\n/**\n * Owns only the journal entries created through this context. Rollback\n * restores its baseline without touching shopper assignment entries.\n */\nexport function createMutationApplicationContext(): MutationApplicationContext {\n const journal: MutationJournal = {\n entries: [],\n baselines: new WeakMap(),\n fallbackArtifactId: \"context-\" + ++applicationContextSequence,\n };\n return {\n apply(mutations, options = {}) {\n applyMutationsWithJournal(mutations, options, journal);\n },\n rollback() {\n resetJournal(journal);\n },\n get snapshotCount() {\n return journal.entries.length;\n },\n };\n}\n\n/** @internal \u2014 exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n baselineAttributeNames(element: Element): string[] {\n return Array.from(mutationJournal.baselines.get(element)?.attributeValues.keys() ?? []);\n },\n normalizeCssPropertyName,\n};\n\nexport function observeSpaNavigation(onChange: () => void): () => void {\n let lastUrl = location.href;\n const notify = () => {\n if (lastUrl !== location.href) {\n lastUrl = location.href;\n onChange();\n }\n };\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notify();\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n window.addEventListener(\"popstate\", notify);\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", notify);\n };\n}\n", "import { fetchWithoutShopifyCartMutationNotification } from \"./shopify-cart-events\";\nimport { normalizeEndpoint } from \"./endpoint\";\n\nconst CART_ATTRIBUTE_SYNC_KEY = \"drip_cart_attr\";\nconst CART_ATTRIBUTE_WRITE_CIRCUIT_BREAK_KEY = \"drip_cart_attr_write_405\";\nconst CART_WRITE_TIMEOUT_MS = 10_000;\n\nexport type CartAssignment = {\n experimentId: string;\n variationId: string;\n assignmentEpoch?: number;\n commercePriceOnly?: boolean;\n pageActive?: boolean;\n};\n\nexport type CartAttributeSyncInput = {\n assignments: CartAssignment[];\n /** Allows an explicit empty control stamp to clear prior treatment attributes. */\n controlStamp?: boolean;\n /** Writes only storefront identity without disturbing existing treatment attributes. */\n identityOnly?: boolean;\n requiredAssignments?: CartAssignment[];\n visitorId: string;\n sessionId: string;\n shopId?: string;\n endpoint?: string;\n ingestSignature?: string;\n url?: string;\n environment?: string;\n platform?: string;\n onAttributionEnvelope?: (envelope: string) => void;\n cartToken?: string;\n offersAuthorizationRevision?: number;\n offersExperimentIds?: string[];\n shippingAuthorizationRevision?: number;\n shippingExperimentIds?: string[];\n priceAuthorizationRevision?: number;\n priceExperimentIds?: string[];\n adoptOffersAssignments?: (assignments: CartAssignment[]) => boolean;\n /** Pre-write feasibility check; must not apply anything. */\n canAdoptOffersAssignments?: (assignments: CartAssignment[]) => boolean;\n /** Headless capture hook: stage a validated offers adoption for {@link confirmCartAttributesWritten}. */\n stageOffersAdoptionAssignments?: (assignments: CartAssignment[]) => void;\n adoptPriceAssignments?: (assignments: CartAssignment[]) => boolean;\n authorizePriceDisplayAssignments?: (assignments: CartAssignment[]) => void;\n authorizeShippingDisplayAssignments?: (assignments: CartAssignment[]) => void;\n authorizeOffersDisplayAssignments?: (assignments: CartAssignment[]) => void;\n /** Receives the normalized Shopify cart token already observed by this sync. */\n onCartToken?: (cartToken: string) => void;\n /** Receives the parsed /cart/update.js response body after a successful stamp write. */\n onCartSnapshot?: (cart: unknown) => void;\n exclusionGroupSelections?: Array<{\n groupId: string;\n experimentId: string;\n epoch: number;\n }>;\n};\n\nexport type CartAttributeEntry = { key: string; value: string };\nexport type CartMetafieldInput = {\n key: string;\n type: string;\n value: string;\n};\n\nexport type CartMetafieldKeyInput = Pick<CartMetafieldInput, \"key\">;\n\nconst APEX_CART_ATTRIBUTE_KEY_VALUES = [\n \"apex_assignments\",\n \"apex_assignment_authorization\",\n \"apex_experiment_id\",\n \"apex_variation_id\",\n \"apex_assignment_epoch\",\n \"apex_visitor_id\",\n \"apex_session_id\",\n] as const;\n\ntype ApexCartAttributeKey = (typeof APEX_CART_ATTRIBUTE_KEY_VALUES)[number];\n\n/** Every Shopify cart attribute key owned and replaced by Apex. */\nexport const APEX_CART_ATTRIBUTE_KEYS: ReadonlySet<string> = new Set(\n APEX_CART_ATTRIBUTE_KEY_VALUES,\n);\n\n/** Normalize Shopify metafield namespaces accepted by the Apex cart mirror. */\nexport function normalizeCartMetafieldNamespace(namespace?: string): string {\n const requestedNamespace = namespace?.trim();\n return requestedNamespace && /^[A-Za-z0-9_-]{2,255}$/.test(requestedNamespace)\n ? requestedNamespace\n : \"apex\";\n}\n\n/** Return every Apex cart-metafield key missing from the supplied mirror. */\nexport function getCartMetafieldStaleKeys(\n currentMetafields: readonly CartMetafieldKeyInput[],\n namespace = \"apex\",\n): string[] {\n const normalizedNamespace = normalizeCartMetafieldNamespace(namespace);\n const currentKeys = new Set(currentMetafields.map(({ key }) => key));\n return APEX_CART_ATTRIBUTE_KEY_VALUES\n .map((key) => `${normalizedNamespace}.${key}`)\n .filter((key) => !currentKeys.has(key));\n}\n\nfunction apexCartAttributeEntry(\n key: ApexCartAttributeKey,\n value: string,\n): CartAttributeEntry {\n return { key, value };\n}\n\nexport type CartAttributeSyncResult = {\n status: \"sent\" | \"skipped\" | \"failed\";\n reason?: string;\n};\n\nexport type CartAttributeSyncOptions = {\n /** Re-write after a real cart mutation even if this assignment was stamped earlier. */\n force?: boolean;\n};\n\nconst inFlightBySignature = new Map<string, {\n generation: number;\n promise: Promise<CartAttributeSyncResult>;\n}>();\nconst validatedAuthorizationSignatures = new Set<string>();\nlet authorizedAssignmentsBySignature: {\n price: Map<string, CartAssignment[]>;\n shipping: Map<string, CartAssignment[]>;\n offers: Map<string, CartAssignment[]>;\n} | null = null;\nlet latestSyncGeneration = 0;\nlet pendingCartAttributeWrite: {\n generation: number;\n submit: (signal: AbortSignal | undefined) => Promise<Response>;\n resolve: (outcome: CartAttributeWriteOutcome) => void;\n} | null = null;\ntype CartAttributeWriterState =\n | { status: \"idle\" }\n | {\n status: \"in-flight\";\n generation: number;\n controller: AbortController | null;\n abortReason: \"cart_write_aborted\" | \"cart_write_timeout\" | null;\n };\nlet cartAttributeWriterState: CartAttributeWriterState = { status: \"idle\" };\nlet cartAttributeWriteCircuitBrokenInMemory = false;\n\n/** Prevent an obsolete authorization response or pending request from reaching the cart. */\nexport function invalidateShopifyCartAttributeSync(): void {\n latestSyncGeneration += 1;\n pendingCartAttributeWrite?.resolve({ status: \"superseded\" });\n pendingCartAttributeWrite = null;\n if (cartAttributeWriterState.status === \"in-flight\") {\n cartAttributeWriterState.abortReason = \"cart_write_aborted\";\n cartAttributeWriterState.controller?.abort();\n }\n}\n\nfunction ensureAuthorizedAssignmentCache() {\n return authorizedAssignmentsBySignature ??= {\n price: new Map<string, CartAssignment[]>(),\n shipping: new Map<string, CartAssignment[]>(),\n offers: new Map<string, CartAssignment[]>(),\n };\n}\n\nfunction requiresCommerceAuthorization(input: CartAttributeSyncInput): boolean {\n return !!input.requiredAssignments?.length\n || input.offersAuthorizationRevision != null\n || input.shippingAuthorizationRevision != null\n || input.priceAuthorizationRevision != null;\n}\n\nfunction hasActivePriceAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.priceAuthorizationRevision != null && !!input.priceExperimentIds?.length;\n}\n\nfunction hasActiveOffersAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.offersAuthorizationRevision != null && !!input.offersExperimentIds?.length;\n}\n\nfunction offersExperimentIds(input: CartAttributeSyncInput): Set<string> {\n return new Set(input.offersExperimentIds ?? []);\n}\n\nfunction shippingExperimentIds(input: CartAttributeSyncInput): Set<string> {\n if (input.shippingExperimentIds?.length) return new Set(input.shippingExperimentIds);\n const priceExperimentIds = new Set(input.priceExperimentIds ?? []);\n return new Set(\n input.requiredAssignments\n ?.filter((assignment) => !priceExperimentIds.has(assignment.experimentId))\n .map((assignment) => assignment.experimentId) ?? [],\n );\n}\n\nfunction hasActiveShippingAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.shippingAuthorizationRevision != null && shippingExperimentIds(input).size > 0;\n}\n\n// Clearing a stale grant is privilege-REDUCING, so shipping- and offers-only\n// shops may clear without a signed token; the price plane always needs one.\nfunction isUnsignedCommerceClearCandidate(input: CartAttributeSyncInput): boolean {\n return input.priceAuthorizationRevision == null &&\n (input.shippingAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null) &&\n !input.requiredAssignments?.length;\n}\n\nexport function cannotRequestRequiredCommerceAuthorization(\n input: CartAttributeSyncInput,\n): boolean {\n return (\n !!input.assignments[0] ||\n input.shippingAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null ||\n hasActivePriceAuthorizationPlane(input)\n )\n && requiresCommerceAuthorization(input)\n && (!input.shopId || !input.endpoint || !input.ingestSignature);\n}\n\nexport function isShopifyStorefront(): boolean {\n return typeof window !== \"undefined\" && !!(window as unknown as { Shopify?: unknown }).Shopify;\n}\n\nfunction readStampedSignature(): string | null {\n try {\n return sessionStorage.getItem(CART_ATTRIBUTE_SYNC_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeStampedSignature(signature: string): void {\n try {\n sessionStorage.setItem(CART_ATTRIBUTE_SYNC_KEY, signature);\n } catch {\n // Storage can be unavailable in strict privacy modes; the cart write is still best-effort.\n }\n}\n\nfunction cartAttributeWriteCircuitBroken(): boolean {\n if (cartAttributeWriteCircuitBrokenInMemory) return true;\n try {\n cartAttributeWriteCircuitBrokenInMemory =\n sessionStorage.getItem(CART_ATTRIBUTE_WRITE_CIRCUIT_BREAK_KEY) === \"1\";\n return cartAttributeWriteCircuitBrokenInMemory;\n } catch {\n return false;\n }\n}\n\nfunction breakCartAttributeWriteCircuit(): void {\n cartAttributeWriteCircuitBrokenInMemory = true;\n try {\n sessionStorage.setItem(CART_ATTRIBUTE_WRITE_CIRCUIT_BREAK_KEY, \"1\");\n } catch {\n // Storage persistence is best-effort; the module-level breaker remains active.\n }\n}\n\nfunction normalizeTargetingUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n try {\n // The Worker evaluates targeting through URL with the same fallback base.\n // Persist that effective value so equivalent URL spellings share a cache\n // entry while a meaningful SPA route change requests a fresh price pin.\n return new URL(trimmed, \"https://_\").href;\n } catch {\n // The Worker still receives invalid-but-non-empty strings and fails their\n // URL targeting closed, so retain the trimmed value as part of the key.\n return trimmed;\n }\n}\n\nfunction syncSignature(input: CartAttributeSyncInput): string {\n return JSON.stringify({\n ...(input.controlStamp\n ? { mode: \"control\" }\n : input.identityOnly\n ? { mode: \"identity\" }\n : {}),\n assignments: input.assignments\n .map((assignment) => [\n assignment.experimentId,\n assignment.variationId,\n assignment.assignmentEpoch ?? null,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n requiredAssignments: input.requiredAssignments\n ?.map((assignment) => [\n assignment.experimentId,\n assignment.variationId,\n assignment.assignmentEpoch ?? null,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n visitorId: input.visitorId,\n sessionId: input.sessionId,\n url: requiresCommerceAuthorization(input)\n ? normalizeTargetingUrl(input.url)\n : undefined,\n cartToken: normalizeCartToken(input.cartToken),\n ...(input.offersAuthorizationRevision != null || input.offersExperimentIds?.length\n ? {\n offersAuthorizationRevision: input.offersAuthorizationRevision ?? null,\n offersExperimentIds: input.offersExperimentIds?.slice().sort(),\n }\n : {}),\n shippingAuthorizationRevision: input.shippingAuthorizationRevision ?? null,\n shippingExperimentIds: input.shippingExperimentIds?.slice().sort(),\n priceAuthorizationRevision: input.priceAuthorizationRevision ?? null,\n exclusionGroupSelections: input.exclusionGroupSelections\n ?.map((selection) => [\n selection.groupId,\n selection.experimentId,\n selection.epoch,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n });\n}\n\n/** Validated locale-aware storefront root (\"/fr/\" on localized markets, \"/\" otherwise). */\nexport function shopifyRoutesRoot(): string {\n const configuredRoot = (window as Window & {\n Shopify?: { routes?: { root?: string } };\n }).Shopify?.routes?.root;\n if (typeof configuredRoot !== \"string\") return \"/\";\n try {\n const storefrontOrigin = window.location?.origin;\n if (!storefrontOrigin) return \"/\";\n const parsed = new URL(configuredRoot, storefrontOrigin);\n if (parsed.origin !== storefrontOrigin || parsed.search || parsed.hash) return \"/\";\n return parsed.pathname.endsWith(\"/\") ? parsed.pathname : `${parsed.pathname}/`;\n } catch {\n return \"/\";\n }\n}\n\nexport function shopifyCartPath(): string {\n return `${shopifyRoutesRoot()}cart.js`;\n}\n\nfunction normalizeCartToken(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const withoutQuery = value.trim().split(\"?\", 1)[0] ?? \"\";\n const token = withoutQuery.startsWith(\"gid://shopify/Cart/\")\n ? withoutQuery.slice(\"gid://shopify/Cart/\".length)\n : withoutQuery;\n return token.length > 0 && token.length <= 4096 ? token : null;\n}\n\nfunction normalizeProofCartToken(value: unknown): string | null {\n return typeof value === \"string\" && normalizeCartToken(value) ? value.trim() : null;\n}\n\nfunction observeCartToken(\n input: CartAttributeSyncInput,\n value: unknown,\n): string | null {\n const proofToken = normalizeProofCartToken(value);\n const cartToken = normalizeCartToken(proofToken);\n if (cartToken) {\n try {\n input.onCartToken?.(cartToken);\n } catch {\n // Cart-token observers must not affect cart authorization or writes.\n }\n }\n return proofToken;\n}\n\nasync function resolveChargeAuthorizationCartToken(\n input: CartAttributeSyncInput,\n): Promise<string | null> {\n const supplied = observeCartToken(input, input.cartToken);\n if (supplied) return supplied;\n if (\n input.priceAuthorizationRevision == null &&\n input.offersAuthorizationRevision == null\n ) return null;\n if (!isShopifyStorefront()) return null;\n try {\n const response = await fetchWithoutShopifyCartMutationNotification(shopifyCartPath(), {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n cache: \"no-store\",\n });\n if (!response.ok) return null;\n return observeCartToken(input, ((await response.json()) as { token?: unknown }).token);\n } catch {\n return null;\n }\n}\n\nexport function syncShopifyCartAttributes(\n input: CartAttributeSyncInput,\n options: CartAttributeSyncOptions = {},\n): Promise<CartAttributeSyncResult> {\n try {\n // An empty visitor ID is the fail-closed sentinel for the identity-free\n // consent-pending input built by index.ts.\n const armOnly = input.assignments.length > 0 && !input.visitorId;\n if (!isShopifyStorefront()) return Promise.resolve({ status: \"skipped\", reason: \"not_shopify\" });\n if (typeof fetch !== \"function\") return Promise.resolve({ status: \"skipped\", reason: \"fetch_missing\" });\n if (cartAttributeWriteCircuitBroken()) {\n return Promise.resolve({ status: \"skipped\", reason: \"cart_update_405_circuit_break\" });\n }\n if (\n !input.assignments[0] &&\n !input.controlStamp &&\n !input.identityOnly &&\n !requiresCommerceAuthorization(input)\n ) {\n return Promise.resolve({ status: \"skipped\", reason: \"no_assignments\" });\n }\n if (cannotRequestRequiredCommerceAuthorization(input)) {\n return Promise.resolve({ status: \"failed\", reason: \"authorization_failed\" });\n }\n\n const signature = syncSignature(input);\n const existingInFlight = inFlightBySignature.get(signature);\n if (existingInFlight) {\n if (!options.force && existingInFlight.generation === latestSyncGeneration) {\n return existingInFlight.promise;\n }\n if (!options.force) {\n // A -> B -> A must not attach the final A to the first A. B may write\n // after that request, so enqueue a fresh A once the original settles.\n const continuationGeneration = latestSyncGeneration;\n return existingInFlight.promise.then(() =>\n continuationGeneration === latestSyncGeneration\n ? syncShopifyCartAttributes(input, options)\n : { status: \"skipped\", reason: \"superseded\" },\n );\n }\n // A forced sync follows a real cart mutation, so cart identity may have\n // changed underneath the pending request. Invalidate it immediately;\n // ordinary overlaps still share the existing request.\n latestSyncGeneration += 1;\n const continuationGeneration = latestSyncGeneration;\n return existingInFlight.promise.then(() =>\n continuationGeneration === latestSyncGeneration\n ? syncShopifyCartAttributes(input, options)\n : { status: \"skipped\", reason: \"superseded\" },\n );\n }\n const generation = ++latestSyncGeneration;\n const requiresCurrentAssignmentProof = requiresCommerceAuthorization(input);\n if (\n !options.force &&\n !armOnly &&\n readStampedSignature() === signature &&\n (!requiresCurrentAssignmentProof || validatedAuthorizationSignatures.has(signature))\n ) {\n if (hasActivePriceAuthorizationPlane(input)) {\n input.authorizePriceDisplayAssignments?.(\n authorizedAssignmentsBySignature?.price.get(signature) ?? [],\n );\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n input.authorizeShippingDisplayAssignments?.(\n authorizedAssignmentsBySignature?.shipping.get(signature) ?? [],\n );\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n input.authorizeOffersDisplayAssignments?.(\n authorizedAssignmentsBySignature?.offers.get(signature) ?? [],\n );\n }\n return Promise.resolve({ status: \"sent\", reason: \"already_stamped\" });\n }\n\n if (requiresCurrentAssignmentProof) validatedAuthorizationSignatures.delete(signature);\n let authorizedSignature = signature;\n const pending = requestCommerceAuthorization(input, generation)\n .then(async ({\n completed,\n cartWriteAllowed,\n token,\n assignments,\n offersAdoptionAssignments,\n }): Promise<{\n response: Response | null;\n authorizationCompleted: boolean;\n writeCircuitBroken: boolean;\n authorizedSignature: string;\n authorizedPriceAssignments: CartAssignment[];\n authorizedShippingAssignments: CartAssignment[];\n authorizedOffersAssignments: CartAssignment[];\n offersAdoptionAssignments?: CartAssignment[];\n writeOutcome: CartAttributeWriteOutcome;\n }> => {\n if (generation !== latestSyncGeneration) {\n return {\n response: null,\n authorizationCompleted: completed,\n writeCircuitBroken: false,\n authorizedSignature,\n authorizedPriceAssignments: [],\n authorizedShippingAssignments: [],\n authorizedOffersAssignments: [],\n writeOutcome: { status: \"superseded\" },\n };\n }\n if (!cartWriteAllowed) {\n return {\n response: null,\n authorizationCompleted: false,\n writeCircuitBroken: false,\n authorizedSignature,\n authorizedPriceAssignments: [],\n authorizedShippingAssignments: [],\n authorizedOffersAssignments: [],\n writeOutcome: { status: \"failed\", reason: \"authorization_failed\" },\n };\n }\n const authorizedInput = { ...input, assignments };\n authorizedSignature = syncSignature(authorizedInput);\n const authorizedPriceAssignments = hasActivePriceAuthorizationPlane(input)\n ? parseSignedPriceAuthorizationAssignments(\n token,\n new Set(input.priceExperimentIds ?? []),\n ) ?? []\n : [];\n const authorizedShippingAssignments = hasActiveShippingAuthorizationPlane(input)\n ? parseSignedShippingAuthorizationAssignments(\n token,\n shippingExperimentIds(input),\n ) ?? []\n : [];\n const authorizedOffersAssignments = hasActiveOffersAuthorizationPlane(input)\n ? parseSignedOffersAuthorizationAssignments(\n token,\n offersExperimentIds(input),\n ) ?? []\n : [];\n const attributes = Object.fromEntries(\n buildCartAttributeEntries(authorizedInput, token).map((entry) => [entry.key, entry.value]),\n );\n if (cartAttributeWriteCircuitBroken()) {\n return {\n response: null,\n authorizationCompleted: completed,\n writeCircuitBroken: true,\n authorizedSignature,\n authorizedPriceAssignments,\n authorizedShippingAssignments,\n authorizedOffersAssignments,\n offersAdoptionAssignments,\n writeOutcome: { status: \"failed\", reason: \"cart_update_405_circuit_break\" },\n };\n }\n const writeOutcome = await submitNewestCartAttributeWrite(generation, (signal) =>\n fetchWithoutShopifyCartMutationNotification(\"/cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes }),\n keepalive: true,\n signal,\n })\n );\n const response = writeOutcome.status === \"sent\" ? writeOutcome.response : null;\n if (response?.status === 405) breakCartAttributeWriteCircuit();\n return {\n response,\n authorizationCompleted: completed,\n writeCircuitBroken: false,\n authorizedSignature,\n authorizedPriceAssignments,\n authorizedShippingAssignments,\n authorizedOffersAssignments,\n offersAdoptionAssignments,\n writeOutcome,\n };\n })\n .then(({\n response,\n authorizationCompleted,\n writeCircuitBroken,\n authorizedSignature: completedSignature,\n authorizedPriceAssignments,\n authorizedShippingAssignments,\n authorizedOffersAssignments,\n offersAdoptionAssignments,\n writeOutcome,\n }) => {\n if (writeOutcome.status === \"superseded\") {\n return { status: \"skipped\", reason: \"superseded\" } as const;\n }\n if (writeCircuitBroken) {\n return { status: \"skipped\", reason: \"cart_update_405_circuit_break\" } as const;\n }\n if (writeOutcome.status === \"aborted\" || writeOutcome.status === \"timeout\") {\n return { status: \"failed\", reason: writeOutcome.reason } as const;\n }\n if (writeOutcome.status === \"failed\") {\n return { status: \"failed\", reason: writeOutcome.reason } as const;\n }\n if (!authorizationCompleted) {\n return { status: \"failed\", reason: \"authorization_failed\" } as const;\n }\n if (!response) {\n return { status: \"failed\", reason: \"cart_update_missing\" } as const;\n }\n if (!response.ok) {\n return { status: \"failed\", reason: `cart_update_${response.status}` } as const;\n }\n if (generation === latestSyncGeneration) {\n // The stamp is on the cart; only now may the adopted offer arm reach\n // display/persist/tracking. On failure, skip the signature records so\n // the next sync re-reconciles instead of treating this cart as done.\n if (\n offersAdoptionAssignments &&\n !input.adoptOffersAssignments?.(offersAdoptionAssignments)\n ) {\n return { status: \"failed\", reason: \"offers_adoption_failed\" } as const;\n }\n if (input.onCartSnapshot || input.onCartToken) {\n // The stamp-write response body is the full updated cart \u2014 a free\n // snapshot consumers use to rediscover Apex-managed lines without\n // an extra request (best-effort; never blocks the sync result).\n // Handed out only for the accepted generation AND after a required\n // adoption succeeded: reconciling against local assignments the\n // stamped envelope does not authorize could retain or insert a\n // gift the Function will not discount.\n void response.clone().json()\n .then((cart) => {\n observeCartToken(input, (cart as { token?: unknown })?.token);\n input.onCartSnapshot?.(cart);\n })\n .catch(() => {});\n }\n if (!armOnly) writeStampedSignature(completedSignature);\n if (requiresCurrentAssignmentProof) {\n validatedAuthorizationSignatures.clear();\n validatedAuthorizationSignatures.add(completedSignature);\n }\n if (hasActivePriceAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().price;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedPriceAssignments,\n );\n input.authorizePriceDisplayAssignments?.(authorizedPriceAssignments);\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().shipping;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedShippingAssignments,\n );\n input.authorizeShippingDisplayAssignments?.(authorizedShippingAssignments);\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().offers;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedOffersAssignments,\n );\n input.authorizeOffersDisplayAssignments?.(authorizedOffersAssignments);\n }\n }\n return { status: \"sent\" } as const;\n })\n .catch((error) => ({\n status: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n }) as const)\n .finally(() => {\n if (inFlightBySignature.get(signature)?.promise === pending) {\n inFlightBySignature.delete(signature);\n }\n });\n inFlightBySignature.set(signature, { generation, promise: pending });\n return pending;\n } catch {\n // Shopify cart attribution must never block or break assignment rendering.\n return Promise.resolve({ status: \"failed\", reason: \"sync_exception\" });\n }\n}\n\nfunction submitNewestCartAttributeWrite(\n generation: number,\n submit: (signal: AbortSignal | undefined) => Promise<Response>,\n): Promise<CartAttributeWriteOutcome> {\n const outcome = new Promise<CartAttributeWriteOutcome>((resolve) => {\n const requested = { generation, submit, resolve };\n if (!pendingCartAttributeWrite || generation >= pendingCartAttributeWrite.generation) {\n pendingCartAttributeWrite?.resolve({ status: \"superseded\" });\n pendingCartAttributeWrite = requested;\n } else {\n resolve({ status: \"superseded\" });\n }\n });\n if (cartAttributeWriterState.status === \"idle\") drainCartAttributeWrites();\n return outcome;\n}\n\nfunction drainCartAttributeWrites(): void {\n if (cartAttributeWriterState.status !== \"idle\") return;\n const requested = pendingCartAttributeWrite;\n pendingCartAttributeWrite = null;\n if (!requested) return;\n if (requested.generation !== latestSyncGeneration) {\n requested.resolve({ status: \"superseded\" });\n drainCartAttributeWrites();\n return;\n }\n\n const controller = typeof AbortController === \"undefined\" ? null : new AbortController();\n const inFlight: Extract<CartAttributeWriterState, { status: \"in-flight\" }> = {\n status: \"in-flight\",\n generation: requested.generation,\n controller,\n abortReason: null,\n };\n cartAttributeWriterState = inFlight;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n inFlight.abortReason = \"cart_write_timeout\";\n controller?.abort();\n reject(new Error(\"cart_write_timeout\"));\n }, CART_WRITE_TIMEOUT_MS);\n controller?.signal.addEventListener(\"abort\", () => {\n reject(new Error(inFlight.abortReason ?? \"cart_write_aborted\"));\n }, { once: true });\n });\n\n Promise.race([requested.submit(controller?.signal), deadline])\n .then((response) => {\n requested.resolve(requested.generation === latestSyncGeneration\n ? { status: \"sent\", response }\n : { status: \"superseded\" });\n })\n .catch((error: unknown) => {\n if (inFlight.abortReason === \"cart_write_aborted\") {\n requested.resolve({ status: \"aborted\", reason: \"cart_write_aborted\" });\n } else if (inFlight.abortReason === \"cart_write_timeout\") {\n requested.resolve({ status: \"timeout\", reason: \"cart_write_timeout\" });\n } else {\n requested.resolve({\n status: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n })\n .finally(() => {\n if (timeout !== undefined) clearTimeout(timeout);\n // Publish idle and consume the pending slot synchronously. An enqueue can\n // therefore observe either this in-flight state or an idle writer that it\n // starts itself, never an unowned pending request.\n cartAttributeWriterState = { status: \"idle\" };\n drainCartAttributeWrites();\n });\n}\n\ntype CartAttributeWriteOutcome =\n | { status: \"sent\"; response: Response }\n | { status: \"superseded\" }\n | { status: \"aborted\"; reason: \"cart_write_aborted\" }\n | { status: \"timeout\"; reason: \"cart_write_timeout\" }\n | { status: \"failed\"; reason: string };\n\nexport async function mintShopwareAttributionEnvelope(input: CartAttributeSyncInput): Promise<void> {\n await requestCommerceAuthorization({ ...input, platform: \"shopware\" });\n}\n\nasync function requestCommerceAuthorization(\n input: CartAttributeSyncInput,\n generation?: number,\n): Promise<{\n completed: boolean;\n cartWriteAllowed: boolean;\n token: string | null;\n assignments: CartAssignment[];\n /** Adoption validated pre-write; the caller applies it only after the cart write is confirmed. */\n offersAdoptionAssignments?: CartAssignment[];\n}> {\n // Page-inactive assignments remain attribution state. Keep them visible\n // while reconciling the Worker's cart pin so the same arm does not look\n // like a new commerce-only assignment that needs adoption.\n let authorizedAssignments = input.assignments;\n const priceWriteRequiresProof = hasActivePriceAuthorizationPlane(input);\n const offersWriteRequiresProof = hasActiveOffersAuthorizationPlane(input);\n const configuredOffersExperimentIds = offersExperimentIds(input);\n const enforceOffersPlaneProof = input.offersAuthorizationRevision != null;\n let requiredOffersAssignments = enforceOffersPlaneProof\n ? input.requiredAssignments?.filter((assignment) =>\n configuredOffersExperimentIds.has(assignment.experimentId)\n ) ?? []\n : [];\n const configuredShippingExperimentIds = shippingExperimentIds(input);\n const enforceShippingPlaneProof = input.shippingAuthorizationRevision != null &&\n (!!input.shippingExperimentIds?.length || hasActivePriceAuthorizationPlane(input));\n const requiredShippingAssignments = enforceShippingPlaneProof\n ? input.requiredAssignments?.filter((assignment) =>\n configuredShippingExperimentIds.has(assignment.experimentId)\n ) ?? []\n : [];\n let hasAuthoritativePriceProof = false;\n if (\n !input.assignments[0] &&\n input.shippingAuthorizationRevision == null &&\n input.offersAuthorizationRevision == null &&\n !hasActivePriceAuthorizationPlane(input)\n ) {\n return {\n completed: true,\n cartWriteAllowed: true,\n token: null,\n assignments: input.assignments,\n };\n }\n if (!input.shopId || !input.endpoint || !input.ingestSignature) {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: true,\n token: null,\n assignments: input.assignments,\n };\n }\n const endpoint = normalizeEndpoint(input.endpoint);\n try {\n const cartToken = await resolveChargeAuthorizationCartToken(input);\n if (\n (input.priceAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null) &&\n !cartToken\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n const requestedExperimentIds = [...new Set([\n ...authorizedAssignments.map((assignment) => assignment.experimentId),\n ...(hasActivePriceAuthorizationPlane(input) ? input.priceExperimentIds ?? [] : []),\n ...(hasActiveOffersAuthorizationPlane(input) ? input.offersExperimentIds ?? [] : []),\n ])];\n const response = await fetch(`${endpoint}/v1/assign`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": input.shopId,\n \"X-Drip-Signature\": input.ingestSignature,\n },\n body: JSON.stringify({\n shop_id: input.shopId,\n user_id: input.visitorId,\n url: input.url,\n environment: input.environment,\n platform: input.platform,\n ...(cartToken\n ? {\n cart_token: cartToken,\n // Ask the authenticated Worker to persist its signed decision in\n // the Function-owned cart plane before the client fallback runs.\n persist_function_handoff: true,\n }\n : {}),\n experiments: requestedExperimentIds,\n exclusion_group_selections: input.exclusionGroupSelections?.map((selection) => ({\n group_id: selection.groupId,\n experiment_id: selection.experimentId,\n epoch: selection.epoch,\n })),\n }),\n keepalive: true,\n });\n if (!response.ok) {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof &&\n !isUnsignedCommerceClearCandidate(input),\n token: null,\n assignments: input.assignments,\n };\n }\n const payload = (await response.json()) as {\n assignments?: unknown;\n commerce_authorization?: unknown;\n handoff_persisted?: boolean;\n handoff_stale_risk?: boolean;\n attribution_envelope?: unknown;\n };\n if (typeof payload.attribution_envelope === \"string\" && payload.attribution_envelope.length <= 4096) {\n input.onAttributionEnvelope?.(payload.attribution_envelope);\n }\n const token =\n typeof payload.commerce_authorization === \"string\" &&\n payload.commerce_authorization\n ? payload.commerce_authorization\n : null;\n if (\n !input.assignments[0] &&\n isUnsignedCommerceClearCandidate(input) &&\n // With configured offer experiments, a nonempty response is the\n // cart-pinned offer arm returning under a new identity/off-target page \u2014\n // it must flow to the offers proof/adoption path below, not be rejected\n // as a failed stale-clear. Empty-response teardown clears are unaffected.\n !input.offersExperimentIds?.length &&\n (!Array.isArray(payload.assignments) || payload.assignments.length !== 0)\n ) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n let requiredAssignments = input.requiredAssignments;\n let resolvedPriceAssignments: ReturnType<\n typeof resolveAuthoritativePriceAssignments\n > = null;\n let resolvedOffersAssignments: ReturnType<\n typeof resolveAuthoritativeOffersAssignments\n > = null;\n if (input.priceAuthorizationRevision != null) {\n const priceExperimentIds = new Set(input.priceExperimentIds ?? []);\n const evaluatedPriceExperimentIds = parseEvaluatedPriceExperimentIds(\n token,\n priceExperimentIds,\n );\n if (!evaluatedPriceExperimentIds) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n if (priceExperimentIds.size > 0) {\n resolvedPriceAssignments = resolveAuthoritativePriceAssignments(\n payload.assignments,\n authorizedAssignments,\n evaluatedPriceExperimentIds,\n );\n if (!resolvedPriceAssignments) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n authorizedAssignments = resolvedPriceAssignments.assignments;\n requiredAssignments = input.requiredAssignments?.flatMap((required) => {\n if (!priceExperimentIds.has(required.experimentId)) return [required];\n // A browser-only price experiment outside the Worker's evaluated set\n // cannot be signed. Keep its local assignment/cart attribution, but do\n // not demand impossible price proof: display eligibility is separately\n // restricted to assignments actually present in the signed price plane.\n if (!evaluatedPriceExperimentIds.has(required.experimentId)) return [];\n const authoritative = resolvedPriceAssignments?.priceAssignments.find(\n (assignment) => assignment.experimentId === required.experimentId,\n );\n return authoritative ? [authoritative] : [];\n });\n }\n const requiredPriceAssignments = requiredAssignments?.filter((assignment) =>\n priceExperimentIds.has(assignment.experimentId)\n ) ?? [];\n const requiresNonPriceAssignment = requiredAssignments?.some((assignment) =>\n !priceExperimentIds.has(assignment.experimentId)\n );\n const pricePlane = parsePriceAuthorizationPlane(token);\n hasAuthoritativePriceProof =\n resolvedPriceAssignments?.priceAssignments.length === 0\n ? hasSignedEmptyPriceAuthorizationEnvelope(token)\n : !!pricePlane && hasSignedAssignmentProof(\n pricePlane.a,\n resolvedPriceAssignments?.priceAssignments ?? [],\n );\n // Round 17 permits an unsigned successful response to clear shipping proof\n // because removing a shipping grant is privilege-reducing. Price differs:\n // replacing a signed price pin changes what checkout charges, so an active\n // price plane must have a signed assignment or signed-empty envelope before\n // any combined cart-attribute write can touch the existing pin.\n if (\n (priceWriteRequiresProof && !hasAuthoritativePriceProof) ||\n (requiredPriceAssignments.length > 0 &&\n (!pricePlane || !hasSignedAssignmentProof(pricePlane.a, requiredPriceAssignments))) ||\n (resolvedPriceAssignments?.adoptionRequired &&\n !hasAuthoritativePriceProof) ||\n (!token && requiresNonPriceAssignment)\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n } else if (requiresCommerceAuthorization(input) && !token) {\n const isLegitimateEmptyShippingResponse =\n isUnsignedCommerceClearCandidate(input) &&\n Array.isArray(payload.assignments) &&\n (!!input.assignments[0] || payload.assignments.length === 0);\n if (!isLegitimateEmptyShippingResponse) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n // Clearing a stale shipping discount grant is privilege-reducing and needs no\n // signature; unlike conferring a grant, the successful parsed response is enough.\n }\n if (enforceOffersPlaneProof && configuredOffersExperimentIds.size > 0) {\n resolvedOffersAssignments = resolveAuthoritativeOffersAssignments(\n payload.assignments,\n authorizedAssignments,\n configuredOffersExperimentIds,\n );\n if (!resolvedOffersAssignments) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n authorizedAssignments = resolvedOffersAssignments.assignments;\n requiredOffersAssignments = resolvedOffersAssignments.offersAssignments;\n requiredAssignments = requiredAssignments?.flatMap((required) => {\n if (!configuredOffersExperimentIds.has(required.experimentId)) return [required];\n const authoritative = resolvedOffersAssignments?.offersAssignments.find(\n (assignment) => assignment.experimentId === required.experimentId,\n );\n return authoritative ? [authoritative] : [];\n });\n }\n if (requiredOffersAssignments.length > 0) {\n const offersPlane = parseAuthorizationPlane(token, \"offers\");\n const hasOffersProof = !!offersPlane && hasSignedAssignmentProof(\n offersPlane.a,\n requiredOffersAssignments,\n );\n if (!hasOffersProof) {\n if (!priceWriteRequiresProof || !hasAuthoritativePriceProof) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n const configuredPriceExperimentIds = new Set(input.priceExperimentIds ?? []);\n authorizedAssignments = authorizedAssignments.filter((assignment) =>\n !configuredOffersExperimentIds.has(assignment.experimentId) ||\n configuredPriceExperimentIds.has(assignment.experimentId)\n );\n }\n }\n if (requiredShippingAssignments.length > 0) {\n const shippingPlane = parseAuthorizationPlane(token, \"shipping\");\n const hasShippingProof = !!shippingPlane && hasSignedAssignmentProof(\n shippingPlane.a,\n requiredShippingAssignments,\n );\n if (!hasShippingProof) {\n if (!priceWriteRequiresProof || !hasAuthoritativePriceProof) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n // A proven price plane may proceed independently. Remove shipping-only\n // assignments from the stamp; assignments shared with price remain because\n // checkout validates each plane from its own signature.\n const configuredPriceExperimentIds = new Set(input.priceExperimentIds ?? []);\n authorizedAssignments = authorizedAssignments.filter((assignment) =>\n !configuredShippingExperimentIds.has(assignment.experimentId) ||\n configuredPriceExperimentIds.has(assignment.experimentId)\n );\n }\n }\n if (!hasRequiredAssignmentProof(payload.assignments, requiredAssignments)) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n if (\n resolvedPriceAssignments?.adoptionRequired &&\n ((generation !== undefined && generation !== latestSyncGeneration) ||\n !input.adoptPriceAssignments?.(\n authorizedAssignments.filter((assignment) =>\n input.priceExperimentIds?.includes(assignment.experimentId)\n ),\n ))\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n let offersAdoptionAssignments: CartAssignment[] | undefined;\n if (resolvedOffersAssignments?.adoptionRequired) {\n const adoptable = authorizedAssignments.filter((assignment) =>\n configuredOffersExperimentIds.has(assignment.experimentId)\n );\n // Only validate feasibility here. Applying the adoption (DOM, persist,\n // tracking) before the cart write is confirmed would let the shopper see\n // and record a treatment Shopify never stamped an authorization for \u2014\n // the caller applies it post-write (theme) or post-confirm (headless).\n if (\n (generation !== undefined && generation !== latestSyncGeneration) ||\n !input.canAdoptOffersAssignments?.(adoptable)\n ) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n offersAdoptionAssignments = adoptable;\n }\n return {\n completed: true,\n cartWriteAllowed: true,\n token,\n assignments: authorizedAssignments,\n offersAdoptionAssignments,\n };\n } catch {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof &&\n !isUnsignedCommerceClearCandidate(input),\n token: null,\n assignments: input.assignments,\n };\n }\n}\n\nfunction hasSignedEmptyPriceAuthorizationEnvelope(token: string | null): boolean {\n if (!token) return false;\n try {\n const envelope = JSON.parse(token) as Record<string, unknown> | null;\n if (\n !envelope ||\n typeof envelope !== \"object\" ||\n envelope.v !== 2 ||\n !envelope.p ||\n typeof envelope.p !== \"object\"\n ) return false;\n const price = (envelope.p as Record<string, unknown>).price;\n if (!price || typeof price !== \"object\") return false;\n const plane = price as Record<string, unknown>;\n return plane.v === 1 &&\n Number.isSafeInteger(plane.r) && (plane.r as number) > 0 &&\n typeof plane.c === \"string\" && /^[a-f0-9]{64}$/.test(plane.c) &&\n typeof plane.x === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(plane.x) &&\n Array.isArray(plane.a) && plane.a.length === 0 &&\n typeof plane.cartHash === \"string\" && /^[a-f0-9]{64}$/.test(plane.cartHash) &&\n typeof plane.s === \"string\" && /^[a-f0-9]{64}$/.test(plane.s);\n } catch {\n return false;\n }\n}\n\nfunction parsePriceAuthorizationPlane(\n token: string | null,\n): Record<string, unknown> | null {\n if (!token) return null;\n try {\n const candidate = JSON.parse(token) as Record<string, unknown> | null;\n if (!candidate || typeof candidate !== \"object\") return null;\n if (\n candidate.v === 1 &&\n typeof candidate.cartHash === \"string\" &&\n candidate.cartHash\n ) {\n return candidate;\n }\n if (candidate.v !== 2 || !candidate.p || typeof candidate.p !== \"object\") return null;\n const price = (candidate.p as Record<string, unknown>).price;\n return price && typeof price === \"object\"\n ? price as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parseAuthorizationPlane(\n token: string | null,\n plane: \"shipping\" | \"offers\",\n): Record<string, unknown> | null {\n if (!token) return null;\n try {\n const candidate = JSON.parse(token) as Record<string, unknown> | null;\n if (candidate?.v !== 2 || !candidate.p || typeof candidate.p !== \"object\") return null;\n const value = (candidate.p as Record<string, unknown>)[plane];\n return value && typeof value === \"object\"\n ? value as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parseSignedPriceAuthorizationAssignments(\n token: string | null,\n configuredPriceExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const pricePlane = parsePriceAuthorizationPlane(token);\n if (!pricePlane || !Array.isArray(pricePlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of pricePlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredPriceExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseSignedShippingAuthorizationAssignments(\n token: string | null,\n configuredShippingExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const shippingPlane = parseAuthorizationPlane(token, \"shipping\");\n if (!shippingPlane || !Array.isArray(shippingPlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of shippingPlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredShippingExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseSignedOffersAuthorizationAssignments(\n token: string | null,\n configuredOffersExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const offersPlane = parseAuthorizationPlane(token, \"offers\");\n if (!offersPlane || !Array.isArray(offersPlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of offersPlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredOffersExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseEvaluatedPriceExperimentIds(\n token: string | null,\n configuredPriceExperimentIds: ReadonlySet<string>,\n): Set<string> | null {\n const rolloutFallback = () => new Set(configuredPriceExperimentIds);\n if (!token) return rolloutFallback();\n try {\n const envelope = JSON.parse(token) as Record<string, unknown> | null;\n if (!envelope || typeof envelope !== \"object\" || envelope.v !== 2) {\n return rolloutFallback();\n }\n if (!Object.prototype.hasOwnProperty.call(envelope, \"e\")) {\n // Rollout ordering matters: deploy the Worker before this SDK. Until every\n // response declares `e`, an older V2 envelope must retain round-14 behavior\n // and treat every configured price experiment as evaluated.\n return rolloutFallback();\n }\n if (!Array.isArray(envelope.e)) return null;\n const evaluated = new Set<string>();\n for (const experimentId of envelope.e) {\n if (\n typeof experimentId !== \"string\" ||\n !experimentId ||\n !configuredPriceExperimentIds.has(experimentId) ||\n evaluated.has(experimentId)\n ) return null;\n evaluated.add(experimentId);\n }\n return evaluated;\n } catch {\n return rolloutFallback();\n }\n}\n\nfunction hasSignedAssignmentProof(\n signedAssignments: unknown,\n requiredAssignments: NonNullable<CartAttributeSyncInput[\"requiredAssignments\"]>,\n): boolean {\n if (!Array.isArray(signedAssignments)) return false;\n return requiredAssignments.every((required) =>\n signedAssignments.some((candidate) => {\n if (!candidate || typeof candidate !== \"object\") return false;\n const assignment = candidate as Record<string, unknown>;\n return assignment.e === required.experimentId &&\n assignment.v === required.variationId &&\n assignment.ep === required.assignmentEpoch;\n })\n );\n}\n\nfunction parseResponsePriceAssignments(\n responseAssignments: unknown,\n priceExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n if (!Array.isArray(responseAssignments)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of responseAssignments) {\n if (!candidate || typeof candidate !== \"object\") continue;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.experiment_id !== \"string\" ||\n !priceExperimentIds.has(assignment.experiment_id)\n ) {\n continue;\n }\n if (\n seen.has(assignment.experiment_id) ||\n typeof assignment.variation_id !== \"string\" ||\n !assignment.variation_id ||\n !Number.isSafeInteger(assignment.assignment_epoch) ||\n (assignment.assignment_epoch as number) < 1\n ) return null;\n seen.add(assignment.experiment_id);\n assignments.push({\n experimentId: assignment.experiment_id,\n variationId: assignment.variation_id,\n assignmentEpoch: assignment.assignment_epoch as number,\n ...(assignment.commerce_price_only === true ? { commercePriceOnly: true } : {}),\n });\n }\n return assignments;\n}\n\nfunction resolveAuthoritativePriceAssignments(\n responseAssignments: unknown,\n localAssignments: CartAttributeSyncInput[\"assignments\"],\n evaluatedPriceExperimentIds: ReadonlySet<string>,\n): {\n assignments: CartAssignment[];\n priceAssignments: CartAssignment[];\n adoptionRequired: boolean;\n} | null {\n const priceAssignments = parseResponsePriceAssignments(\n responseAssignments,\n evaluatedPriceExperimentIds,\n );\n if (!priceAssignments) return null;\n const localPriceAssignments = localAssignments.filter((assignment) =>\n evaluatedPriceExperimentIds.has(assignment.experimentId)\n );\n const authoritativeByExperimentId = new Map(\n priceAssignments.map((assignment) => [assignment.experimentId, assignment]),\n );\n const adoptionRequired = localPriceAssignments.some(\n (assignment) => assignment.pageActive !== false &&\n !authoritativeByExperimentId.has(assignment.experimentId),\n ) || priceAssignments.some((assignment) => {\n const local = localPriceAssignments.find(\n (candidate) => candidate.experimentId === assignment.experimentId,\n );\n return local?.variationId !== assignment.variationId ||\n local.assignmentEpoch !== assignment.assignmentEpoch ||\n (local?.pageActive !== false &&\n local.commercePriceOnly !== assignment.commercePriceOnly);\n });\n const remainingPriceAssignments = new Map(authoritativeByExperimentId);\n const assignments = localAssignments.map((assignment) => {\n if (!evaluatedPriceExperimentIds.has(assignment.experimentId)) return assignment;\n const authoritative = remainingPriceAssignments.get(assignment.experimentId);\n if (!authoritative) return assignment.pageActive === false ? assignment : null;\n remainingPriceAssignments.delete(assignment.experimentId);\n return assignment.pageActive === undefined\n ? authoritative\n : { ...authoritative, pageActive: assignment.pageActive };\n }).filter((assignment): assignment is CartAssignment => assignment !== null);\n for (const assignment of priceAssignments) {\n if (remainingPriceAssignments.has(assignment.experimentId)) {\n assignments.push(assignment);\n remainingPriceAssignments.delete(assignment.experimentId);\n }\n }\n return { assignments, priceAssignments, adoptionRequired };\n}\n\nfunction resolveAuthoritativeOffersAssignments(\n responseAssignments: unknown,\n localAssignments: CartAttributeSyncInput[\"assignments\"],\n configuredOffersExperimentIds: ReadonlySet<string>,\n): {\n assignments: CartAssignment[];\n offersAssignments: CartAssignment[];\n adoptionRequired: boolean;\n} | null {\n const offersAssignments = parseResponsePriceAssignments(\n responseAssignments,\n configuredOffersExperimentIds,\n );\n if (!offersAssignments) return null;\n const resolved = resolveAuthoritativePriceAssignments(\n responseAssignments,\n localAssignments,\n configuredOffersExperimentIds,\n );\n return resolved && {\n assignments: resolved.assignments,\n offersAssignments,\n adoptionRequired: resolved.adoptionRequired,\n };\n}\n\nexport async function buildSignedCartAttributeEntries(\n input: CartAttributeSyncInput,\n): Promise<CartAttributeEntry[]> {\n const generation = ++latestSyncGeneration;\n const authorization = await requestCommerceAuthorization(input, generation);\n if (generation !== latestSyncGeneration || !authorization.completed) return [];\n if (authorization.offersAdoptionAssignments) {\n // Headless integrators own the cart write; hand the validated adoption to\n // the caller so it applies only after confirmCartAttributesWritten.\n input.stageOffersAdoptionAssignments?.(authorization.offersAdoptionAssignments);\n }\n if (hasActivePriceAuthorizationPlane(input)) {\n const authorizedPriceAssignments = parseSignedPriceAuthorizationAssignments(\n authorization.token,\n new Set(input.priceExperimentIds ?? []),\n );\n if (!authorizedPriceAssignments) return [];\n input.authorizePriceDisplayAssignments?.(authorizedPriceAssignments);\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n const authorizedShippingAssignments = parseSignedShippingAuthorizationAssignments(\n authorization.token,\n shippingExperimentIds(input),\n ) ?? [];\n input.authorizeShippingDisplayAssignments?.(authorizedShippingAssignments);\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n const authorizedOffersAssignments = parseSignedOffersAuthorizationAssignments(\n authorization.token,\n offersExperimentIds(input),\n ) ?? [];\n input.authorizeOffersDisplayAssignments?.(authorizedOffersAssignments);\n }\n return buildCartAttributeEntries(\n { ...input, assignments: authorization.assignments },\n authorization.token,\n );\n}\n\nfunction hasRequiredAssignmentProof(\n responseAssignments: unknown,\n requiredAssignments: CartAttributeSyncInput[\"requiredAssignments\"],\n): boolean {\n if (!requiredAssignments?.length) return true;\n if (!Array.isArray(responseAssignments)) return false;\n\n return requiredAssignments.every((required) => {\n if (!Number.isInteger(required.assignmentEpoch) || (required.assignmentEpoch ?? 0) < 1) {\n return false;\n }\n return responseAssignments.some((candidate) => {\n if (!candidate || typeof candidate !== \"object\") return false;\n const assignment = candidate as Record<string, unknown>;\n return assignment.experiment_id === required.experimentId\n && assignment.variation_id === required.variationId\n && assignment.assignment_epoch === required.assignmentEpoch;\n });\n });\n}\n\nexport function buildCartAttributeEntries(\n input: CartAttributeSyncInput,\n commerceAuthorization: string | null = null,\n): CartAttributeEntry[] {\n // An empty visitor ID marks the identity-free consent-pending stamp. Empty\n // named keys actively replace identity left by an earlier consented visit.\n if (input.assignments.length > 0 && !input.visitorId) {\n return [\n apexCartAttributeEntry(\n \"apex_assignments\",\n JSON.stringify(input.assignments.map((assignment) => ({\n e: assignment.experimentId,\n v: assignment.variationId,\n ep: assignment.assignmentEpoch,\n }))),\n ),\n apexCartAttributeEntry(\"apex_assignment_authorization\", \"\"),\n apexCartAttributeEntry(\"apex_experiment_id\", \"\"),\n apexCartAttributeEntry(\"apex_variation_id\", \"\"),\n apexCartAttributeEntry(\"apex_assignment_epoch\", \"\"),\n apexCartAttributeEntry(\"apex_visitor_id\", \"\"),\n apexCartAttributeEntry(\"apex_session_id\", \"\"),\n ];\n }\n if (input.identityOnly) {\n return [apexCartAttributeEntry(\"apex_visitor_id\", input.visitorId)];\n }\n const primaryAssignment = input.assignments[0];\n const entries: CartAttributeEntry[] = [\n apexCartAttributeEntry(\n \"apex_assignments\",\n JSON.stringify(\n input.assignments.map((assignment) => ({\n e: assignment.experimentId,\n v: assignment.variationId,\n ep: assignment.assignmentEpoch,\n })),\n ),\n ),\n apexCartAttributeEntry(\"apex_assignment_authorization\", commerceAuthorization ?? \"\"),\n ];\n if (!primaryAssignment) {\n return [\n ...entries,\n apexCartAttributeEntry(\"apex_experiment_id\", \"\"),\n apexCartAttributeEntry(\"apex_variation_id\", \"\"),\n apexCartAttributeEntry(\"apex_assignment_epoch\", \"\"),\n apexCartAttributeEntry(\"apex_visitor_id\", input.visitorId),\n apexCartAttributeEntry(\"apex_session_id\", input.sessionId),\n ];\n }\n return [\n ...entries,\n apexCartAttributeEntry(\"apex_experiment_id\", primaryAssignment.experimentId),\n apexCartAttributeEntry(\"apex_variation_id\", primaryAssignment.variationId),\n apexCartAttributeEntry(\n \"apex_assignment_epoch\",\n String(primaryAssignment.assignmentEpoch ?? \"\"),\n ),\n apexCartAttributeEntry(\"apex_visitor_id\", input.visitorId),\n apexCartAttributeEntry(\"apex_session_id\", input.sessionId),\n ];\n}\n\n/** Build a Storefront API cart-metafield mirror of the canonical attribution stamp. */\nexport function buildCartMetafieldInputs(\n input: CartAttributeSyncInput,\n namespace = \"apex\",\n): CartMetafieldInput[] {\n const normalizedNamespace = normalizeCartMetafieldNamespace(namespace);\n return buildCartAttributeEntries(input)\n .filter(({ value }) => value !== \"\")\n .map(({ key, value }) => ({\n key: `${normalizedNamespace}.${key}`,\n type: key === \"apex_assignments\" ? \"json\" : \"single_line_text_field\",\n value,\n }));\n}\n", "import { fetchWithoutShopifyCartMutationNotification } from \"./shopify-cart-events\";\nimport {\n isShopifyStorefront,\n shopifyCartPath,\n shopifyRoutesRoot,\n type CartAssignment,\n} from \"./shopify-cart\";\nimport type { CommerceOffersSettings } from \"./types\";\n\nconst MARKER = \"_apex_gwp\";\nconst DECLINE_PREFIX = \"drip_gwp_declined:\";\nconst INSERTED_PREFIX = \"drip_gwp_inserted:\";\n\ntype CartLine = {\n key?: unknown;\n quantity?: unknown;\n variant_id?: unknown;\n final_line_price?: unknown;\n line_price?: unknown;\n properties?: unknown;\n};\ntype ShopifyCart = { token?: unknown; currency?: unknown; items?: unknown };\n\n// Record value when the cart's identity is unknown \u2014 matches any cart.\nconst ANY_CART = \"*\";\n\nexport type GiftSyncOptions = {\n /** Per-arm proof from the CURRENT stamped offers plane. Insertion requires\n * it: config membership alone can cover an assignment whose offers proof\n * was refused (e.g. shared price+offers experiment with price-only proof),\n * and the Function would charge that \"gift\" at full price. */\n isArmProven?: (assignment: CartAssignment) => boolean;\n /** A cart mutation invalidates the once-per-page teardown check. */\n recheckTeardown?: boolean;\n /** Fail-closed reconciliation after a FAILED stamp sync: privilege-reducing\n * cleanup only (threshold/currency/orphan removals, quantity normalization)\n * \u2014 never insert, because no fresh proof exists for a new line. */\n suppressInsertion?: boolean;\n};\n\nlet inFlight: Promise<void> | null = null;\nlet queuedArgs: {\n settings: CommerceOffersSettings | undefined;\n assignments: CartAssignment[];\n options: GiftSyncOptions | undefined;\n generation: number;\n} | null = null;\n// In-memory fallback when localStorage is unavailable (strict privacy modes).\nconst insertedThisSession = new Map<string, string>();\nconst selectedGiftOptions = new Map<string, { gid: string; tierThreshold: string; pending?: boolean }>();\nconst dispatchedChoices = new Set<string>();\n// The choice tier currently applicable per experiment \u2014 selections bind to\n// THIS tier, not to whichever prompts were dispatched earlier in the session.\nconst activeChoiceTier = new Map<string, string>();\n// Bumped whenever new sync arguments are accepted: an in-flight pass built\n// on older arguments must not repopulate tier liveness after the clear.\nlet choiceTierGeneration = 0;\nlet latestArgs: { settings: CommerceOffersSettings | undefined; assignments: CartAssignment[]; options?: GiftSyncOptions } | null = null;\n\ntype GiftTier = { threshold: string; gift_variant_gid: string; gift_choice_variant_gids?: string[] };\nexport type PendingGiftChoice = {\n experimentId: string;\n threshold: string;\n options: string[];\n};\nfunction giftTiers(variant: Record<string, unknown>): GiftTier[] | null {\n const raw = Array.isArray(variant.tiers) && variant.tiers.length > 0\n ? variant.tiers\n : [{ threshold: variant.threshold, gift_variant_gid: variant.gift_variant_gid }];\n const tiers: GiftTier[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null;\n const tier = item as Record<string, unknown>;\n if (typeof tier.threshold !== \"string\" || !/^\\d+$/.test(tier.threshold) ||\n typeof tier.gift_variant_gid !== \"string\" ||\n // Malformed fixed-tier GIDs would reach choice dispatch with a null\n // giftId and abort reconciliation mid-run; money-path config fails\n // closed at parse time instead.\n numericVariantId(tier.gift_variant_gid) === null) return null;\n const choices = tier.gift_choice_variant_gids;\n if (choices !== undefined && (!Array.isArray(choices) || choices.length < 2 || choices.length > 4 ||\n !choices.every((gid) => typeof gid === \"string\" && numericVariantId(gid) !== null))) return null;\n tiers.push({ threshold: tier.threshold, gift_variant_gid: tier.gift_variant_gid,\n ...(choices ? { gift_choice_variant_gids: choices as string[] } : {}) });\n }\n if (tiers.length < 1 || tiers.length > 3 || tiers.some((tier, index) =>\n !Number.isSafeInteger(Number(tier.threshold)) ||\n (index > 0 && Number(tier.threshold) <= Number(tiers[index - 1].threshold)))) return null;\n return tiers;\n}\n\nfunction declined(experimentId: string): boolean {\n try { return sessionStorage.getItem(`${DECLINE_PREFIX}${experimentId}`) === \"1\"; } catch { return false; }\n}\n\nfunction recordDecline(experimentId: string): void {\n try { sessionStorage.setItem(`${DECLINE_PREFIX}${experimentId}`, \"1\"); } catch { /* best effort */ }\n}\n\n// Insertion state persists in LOCAL storage: the Shopify cart itself is\n// durable across browser sessions, so the record of \"Apex added this line\"\n// must outlive the session too \u2014 otherwise a shopper returning after the\n// offer stopped would keep a no-longer-discounted gift (teardown cleanup\n// could not know to look), and a manual removal in a fresh session would\n// read as \"never inserted\" and re-add the gift. The record VALUE is the cart\n// token the insertion happened on, so a normal cart transition (checkout\n// emptied the old cart) is not misread as a manual decline on the new one.\n// This is charge-correctness state (experiment id + cart token), like the\n// cart attribute stamp, not analytics. Decline flags stay session-scoped.\nfunction insertionRecord(experimentId: string): string | null {\n try {\n return localStorage.getItem(`${INSERTED_PREFIX}${experimentId}`)\n ?? insertedThisSession.get(experimentId) ?? null;\n } catch { return insertedThisSession.get(experimentId) ?? null; }\n}\n\nfunction recordCart(record: string): string {\n if (!record.startsWith(\"{\")) return record;\n try { const parsed = JSON.parse(record) as { cart?: unknown }; return typeof parsed.cart === \"string\" ? parsed.cart : record; } catch { return record; }\n}\nfunction recordVariantGid(record: string): string | null {\n if (!record.startsWith(\"{\")) return null;\n try {\n const parsed = JSON.parse(record) as { variantGid?: unknown };\n return typeof parsed.variantGid === \"string\" ? parsed.variantGid : null;\n } catch { return null; }\n}\nfunction recordTierThreshold(record: string): string | null {\n if (!record.startsWith(\"{\")) return null;\n try {\n const parsed = JSON.parse(record) as { tierThreshold?: unknown };\n return typeof parsed.tierThreshold === \"string\" ? parsed.tierThreshold : null;\n } catch { return null; }\n}\nfunction insertionMatchesCart(record: string, cartToken: string | null): boolean {\n const token = recordCart(record);\n return token === ANY_CART || cartToken == null || token === cartToken;\n}\n\nfunction recordInserted(experimentId: string, cartToken: string | null, variantGid?: string, tierThreshold?: string): void {\n const token = cartToken ?? ANY_CART;\n const value = variantGid || tierThreshold ? JSON.stringify({ cart: token, variantGid, tierThreshold }) : token;\n insertedThisSession.set(experimentId, value);\n try { localStorage.setItem(`${INSERTED_PREFIX}${experimentId}`, value); } catch { /* best effort */ }\n // The durable record landing IS the settle point for a pending selection \u2014\n // waiting for another reconciliation pass leaves a last-pass add pending\n // forever and re-opens the cross-tab revert.\n const selection = selectedGiftOptions.get(experimentId);\n if (selection?.pending && selection.gid === variantGid) {\n selectedGiftOptions.set(experimentId, {\n gid: selection.gid,\n tierThreshold: selection.tierThreshold,\n });\n }\n}\n\nfunction clearInserted(experimentId: string): void {\n insertedThisSession.delete(experimentId);\n try { localStorage.removeItem(`${INSERTED_PREFIX}${experimentId}`); } catch { /* best effort */ }\n}\n\nfunction clearDispatchedChoices(experimentId: string): void {\n dispatchedChoices.forEach((key) => {\n if (key.startsWith(`${experimentId}:`)) dispatchedChoices.delete(key);\n });\n}\n\nfunction listInsertionRecords(): string[] {\n const ids = new Set<string>(insertedThisSession.keys());\n try {\n for (let i = 0; i < localStorage.length; i += 1) {\n const key = localStorage.key(i);\n if (key?.startsWith(INSERTED_PREFIX)) ids.add(key.slice(INSERTED_PREFIX.length));\n }\n } catch { /* fall through */ }\n return [...ids];\n}\n\nfunction hasInsertionRecords(): boolean {\n return listInsertionRecords().length > 0;\n}\n\n// The teardown read (offers plane tombstoned to an empty experiments list)\n// runs once per PAGE LOAD \u2014 not per session \u2014 so a login/customer-account\n// cart merge that lands a marked line on a later page is still discovered;\n// in-page cart mutations reset the flag via the tombstone observer.\nlet teardownChecked = false;\n\nfunction markTeardownChecked(): void {\n teardownChecked = true;\n}\n\nfunction numericVariantId(gid: string): number | null {\n const match = /^gid:\\/\\/shopify\\/ProductVariant\\/(\\d+)$/.exec(gid);\n if (!match) return null;\n const id = Number(match[1]);\n return Number.isSafeInteger(id) && id > 0 ? id : null;\n}\n\nfunction marker(line: CartLine): string | null {\n if (!line.properties || typeof line.properties !== \"object\" || Array.isArray(line.properties)) return null;\n const value = (line.properties as Record<string, unknown>)[MARKER];\n return typeof value === \"string\" ? value : null;\n}\n\nfunction lineVariantId(line: CartLine): string | null {\n if (typeof line.variant_id === \"number\" && Number.isSafeInteger(line.variant_id)) return String(line.variant_id);\n if (typeof line.variant_id === \"string\" && /^\\d+$/.test(line.variant_id)) return line.variant_id;\n return null;\n}\n\nfunction lineAmount(line: CartLine): number | null {\n // The offer Function compares each non-gift line's cost.subtotalAmount \u2014\n // the PRE-line-discount amount. Ajax `line_price` is that same basis;\n // `final_line_price` is post-discount and would disagree on discounted\n // carts, removing a gift the Function still authorizes.\n const value = line.line_price;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : null;\n}\n\nasync function mutate(path: string, body: unknown): Promise<boolean> {\n // Never throws: a network-level rejection mid-pass must not discard the\n // pass's accumulated mutation state (earlier successful removals still\n // warrant the fixpoint retry and the cart-changed signal).\n try {\n const response = await fetchWithoutShopifyCartMutationNotification(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/** Returns true when this pass mutated the cart (caller re-runs to a fixpoint). */\nasync function run(\n settings: CommerceOffersSettings | undefined,\n assignments: CartAssignment[],\n options: GiftSyncOptions | undefined,\n generation: number,\n): Promise<boolean> {\n if (!isShopifyStorefront() || typeof fetch !== \"function\") return false;\n let response: Response;\n try {\n response = await fetchWithoutShopifyCartMutationNotification(shopifyCartPath(), {\n method: \"GET\", headers: { Accept: \"application/json\" }, cache: \"no-store\",\n });\n } catch { return false; }\n if (!response.ok) return false;\n const cart = await response.json() as ShopifyCart;\n if (!Array.isArray(cart.items) || typeof cart.currency !== \"string\") return false;\n let cartMutated = false;\n const lines = cart.items.filter((item): item is CartLine => !!item && typeof item === \"object\");\n const cartToken = typeof cart.token === \"string\" && cart.token ? cart.token : null;\n const assigned = new Map(assignments.map((item) => [item.experimentId, item.variationId]));\n // Charge-only pins authorize the cart stamp for an off-target page but are\n // deliberately excluded from DOM, persistence, and exposure \u2014 inserting a\n // physical gift for them would give away inventory the shopper was never\n // shown. They still count as ACTIVE for removal/keep decisions.\n const chargeOnlyExperimentIds = new Set(\n assignments.filter((item) => item.commercePriceOnly).map((item) => item.experimentId),\n );\n const experiments = settings?.experiments ?? [];\n // Only experiments covered by the signed offers authorization may INSERT:\n // without it the Function cannot discount the added line, so the \"gift\"\n // would be charged at full price. Removal/maintenance stays unrestricted.\n const authorizedOfferExperimentIds = new Set(\n settings?.authorization?.experimentIds ?? [],\n );\n const root = shopifyRoutesRoot();\n const changePath = `${root}cart/change.js`;\n // Tracks gift variants inserted within THIS run: two parallel GWP tests\n // configured with the same gift variant must share one line (the Function\n // consolidates both candidates onto the first matching line), or the\n // second marked line would be charged at full price.\n const insertedVariantIdsThisRun = new Set<string>();\n // Tracks lines removed within THIS run so presence checks against the\n // immutable snapshot do not see a line that is already gone \u2014 otherwise a\n // still-qualifying experiment sharing the removed gift's variant would\n // silently skip its own insertion.\n const removedLineKeys = new Set<string>();\n const removeLine = async (line: CartLine): Promise<boolean> => {\n if (typeof line.key !== \"string\") return false;\n if (!(await mutate(changePath, { id: line.key, quantity: 0 }))) return false;\n removedLineKeys.add(line.key);\n cartMutated = true;\n return true;\n };\n const linePresent = (line: CartLine): boolean =>\n typeof line.key === \"string\" ? !removedLineKeys.has(line.key) : true;\n\n // Orphan cleanup first: a marked line whose experiment left the offers\n // projection (stopped, archived, kill-switched), whose assignment is gone,\n // or whose assigned variant no longer describes a GWP offer (relaunched\n // under a different offer type) will never be authorized by the discount\n // Function again \u2014 the shopper would be charged full price for it. Remove\n // it before any insertion logic; keep the insertion record when removal\n // fails so the next sync retries instead of abandoning the line.\n const activeGiftExperiments = new Set(\n experiments\n .filter((experiment) => {\n const variationId = assigned.get(experiment.experiment_id);\n const variant = variationId ? experiment.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") return false;\n // With arm proof available, an assignment absent from the CURRENT\n // stamped offers plane is not active: the Function will not discount\n // its line, so keeping it would charge the shopper.\n if (options?.isArmProven) {\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (!assignment || !options.isArmProven(assignment)) return false;\n }\n if (\"control\" in variant && variant.control === true) return true;\n return \"offer_type\" in variant && variant.offer_type === \"gwp_threshold\"\n && giftTiers(variant as Record<string, unknown>) !== null;\n })\n .map((experiment) => experiment.experiment_id),\n );\n for (const line of lines) {\n const mark = marker(line);\n if (mark == null || activeGiftExperiments.has(mark)) continue;\n // Seed the durable record BEFORE attempting removal: if the mutation\n // fails transiently, the record keeps later syncs (and later sessions)\n // retrying even after this session's tombstone read is throttled.\n recordInserted(mark, cartToken);\n if (await removeLine(line)) clearInserted(mark);\n }\n // A record whose experiment is inactive AND whose line is already gone\n // (checkout consumed the cart, or the shopper removed it before teardown)\n // has nothing left to reconcile \u2014 clear it, or it would trigger a cart\n // read on every later apply and misread a relaunch as a manual decline.\n for (const experimentId of listInsertionRecords()) {\n if (activeGiftExperiments.has(experimentId)) continue;\n if (lines.some((line) => marker(line) === experimentId && linePresent(line))) continue;\n clearInserted(experimentId);\n }\n // Throttle only once the cart has actually been read this session; failed\n // orphan removals keep their seeded records, which bypass the throttle.\n if (settings && experiments.length === 0) markTeardownChecked();\n\n for (const experiment of experiments) {\n // Not live until this pass proves the choice prompt eligible: every\n // early exit (unassigned, control, currency mismatch, unproven arm,\n // suppression, decline) leaves the tier cleared so a delayed\n // selectGiftOption callback cannot bind to a phantom prompt.\n activeChoiceTier.delete(experiment.experiment_id);\n const variationId = assigned.get(experiment.experiment_id);\n if (!variationId) continue;\n const variant = experiment.variants[variationId];\n if (!variant || typeof variant !== \"object\") continue;\n // ALL marked lines for this experiment: concurrent tabs during a\n // relaunch can leave several (e.g. old and new gift variants), and the\n // Function discounts at most one unit of the current variant.\n const managedLines = () => lines.filter(\n (line) => marker(line) === experiment.experiment_id && linePresent(line),\n );\n // Removes every managed line; true when none that could be removed\n // remains (lines without a usable key were never removable and follow\n // the historical clear-anyway behavior).\n const removeAllManaged = async (): Promise<boolean> => {\n let allRemoved = true;\n for (const line of managedLines()) {\n if (typeof line.key !== \"string\") continue;\n if (!(await removeLine(line))) {\n allRemoved = false;\n // A failed REQUIRED removal (below-threshold, control, currency)\n // is unresolved work: the Function no longer discounts the line,\n // so force another fixpoint pass to retry within this\n // reconciliation instead of waiting for an unrelated cart event.\n cartMutated = true;\n }\n }\n return allRemoved;\n };\n if (\"control\" in variant && variant.control === true) {\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n if (!(\"offer_type\" in variant) || variant.offer_type !== \"gwp_threshold\") continue;\n const tiers = giftTiers(variant as Record<string, unknown>);\n if (!tiers) continue;\n if (cart.currency.toUpperCase() !== experiment.currency.toUpperCase()) {\n // The Function refuses cross-currency carts, so a market/currency switch\n // strands an existing managed line at full price \u2014 fail closed by\n // removing it, not just by skipping insertion. Not a decline: the gift\n // may re-insert if the shopper switches back.\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n const allGiftIds = new Set(tiers.flatMap((tier) => tier.gift_choice_variant_gids ?? [tier.gift_variant_gid])\n .map(numericVariantId).filter((id): id is number => id !== null).map(String));\n let subtotal = 0;\n let valid = true;\n for (const line of lines) {\n if (!linePresent(line) || allGiftIds.has(lineVariantId(line) ?? \"\")) continue;\n const amount = lineAmount(line);\n if (amount == null || !Number.isSafeInteger(subtotal + amount)) { valid = false; break; }\n subtotal += amount;\n }\n const applicableTier = valid ? tiers.reduce<GiftTier | null>((chosen, tier) => {\n const threshold = Number(tier.threshold);\n return Number.isSafeInteger(threshold) && threshold >= 0 && subtotal >= threshold ? tier : chosen;\n }, null) : null;\n if (!valid || tiers.some((tier) => !Number.isSafeInteger(Number(tier.threshold)))) {\n // Fail closed: an unrepresentable threshold means the Function cannot\n // legitimately discount this gift \u2014 an Apex-managed line left from an\n // earlier (lower) threshold would charge full price. Remove every\n // managed line for this experiment before skipping it.\n for (const line of managedLines()) {\n if (typeof line.key !== \"string\") continue;\n await removeLine(line);\n }\n continue;\n }\n if (!applicableTier) {\n clearDispatchedChoices(experiment.experiment_id);\n activeChoiceTier.delete(experiment.experiment_id);\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n const choiceGids = applicableTier.gift_choice_variant_gids;\n // Every applicable-tier transition re-arms the chooser: keys that do not\n // belong to the CURRENT tier (including all keys while a fixed tier\n // applies) are stale. Only the current batch may mutate dedup state.\n if (generation === choiceTierGeneration) {\n const currentKey = choiceGids\n ? `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids.join(\",\")}`\n : null;\n dispatchedChoices.forEach((key) => {\n if (key.startsWith(`${experiment.experiment_id}:`) && key !== currentKey) {\n dispatchedChoices.delete(key);\n }\n });\n }\n const markChoicePromptLive = () => {\n if (\n choiceGids &&\n !options?.suppressInsertion &&\n authorizedOfferExperimentIds.has(experiment.experiment_id) &&\n !declined(experiment.experiment_id)\n ) {\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (\n (!options?.isArmProven || (assignment && options.isArmProven(assignment))) &&\n generation === choiceTierGeneration\n ) {\n activeChoiceTier.set(experiment.experiment_id, applicableTier.threshold);\n }\n }\n };\n const extendedRecord = Array.isArray((variant as Record<string, unknown>).tiers);\n const persistedRecord = insertionRecord(experiment.experiment_id);\n const persistedGid = persistedRecord && insertionMatchesCart(persistedRecord, cartToken)\n ? recordVariantGid(persistedRecord)\n : null;\n // A recorded tier that DIFFERS from the applicable tier is a stale\n // lower-tier gift: entering a choice tier must present the choice. An\n // ABSENT tier (snapshot-seeded cross-device record, legacy plain-token\n // record) has no provenance: recover it only while the applicable tier\n // is the LOWEST choice tier containing that gid \u2014 once the subtotal has\n // crossed into a higher choice tier sharing the GID, the new tier's\n // prompt must not be suppressed by a tierless record.\n const lowestChoiceTierThresholdFor = (gid: string | null | undefined) =>\n gid == null\n ? undefined\n : tiers.find((tier) => tier.gift_choice_variant_gids?.includes(gid))?.threshold;\n const persistedTierThreshold =\n persistedRecord === null ? null : recordTierThreshold(persistedRecord);\n const tierlessRecoveryAllowed = (gid: string | null | undefined) =>\n lowestChoiceTierThresholdFor(gid) === applicableTier.threshold;\n // In-memory selections are tier-bound: a choice made for another tier\n // (tier crossing, or a selectGiftOption call while a different tier\n // applied) must not suppress the new tier's choice prompt.\n const inMemorySelection = selectedGiftOptions.get(experiment.experiment_id);\n let inMemoryGid = inMemorySelection?.tierThreshold === applicableTier.threshold\n ? inMemorySelection.gid\n : undefined;\n const markedCurrentTierGid = choiceGids?.find((gid) => {\n const variantId = numericVariantId(gid);\n return variantId !== null && lines.some((line) =>\n linePresent(line) && marker(line) === experiment.experiment_id &&\n lineVariantId(line) === String(variantId));\n });\n const persistedChoiceIsCurrentTier = persistedRecord !== null &&\n (persistedTierThreshold === applicableTier.threshold ||\n (persistedTierThreshold === null &&\n tierlessRecoveryAllowed(persistedGid ?? markedCurrentTierGid)));\n // Cross-tab arbitration: the durable record is the source of truth once\n // this tab's own selection has been persisted. A PENDING selection (made\n // here, not yet recorded) still wins \u2014 clobbering the user's fresh click\n // with an older record would be worse. Once our record lands (gids\n // match), pending clears; a later differing durable record means another\n // tab chose \u2014 drop the stale local selection instead of reverting theirs.\n if (inMemorySelection && inMemoryGid) {\n const persistedCurrentTierGid =\n persistedChoiceIsCurrentTier && choiceGids?.includes(persistedGid ?? \"\")\n ? persistedGid\n : null;\n if (inMemorySelection.pending && persistedCurrentTierGid === inMemoryGid) {\n selectedGiftOptions.set(experiment.experiment_id, {\n gid: inMemorySelection.gid,\n tierThreshold: inMemorySelection.tierThreshold,\n });\n } else if (\n !inMemorySelection.pending &&\n persistedCurrentTierGid &&\n persistedCurrentTierGid !== inMemoryGid\n ) {\n selectedGiftOptions.delete(experiment.experiment_id);\n inMemoryGid = undefined;\n }\n }\n const selectedGid = choiceGids?.includes(inMemoryGid ?? \"\")\n ? inMemoryGid\n : persistedChoiceIsCurrentTier && choiceGids?.includes(persistedGid ?? \"\") ? persistedGid!\n : persistedChoiceIsCurrentTier ? markedCurrentTierGid : undefined;\n if (selectedGid) {\n const priorPending =\n selectedGiftOptions.get(experiment.experiment_id)?.gid === selectedGid &&\n selectedGiftOptions.get(experiment.experiment_id)?.pending === true;\n selectedGiftOptions.set(experiment.experiment_id, {\n gid: selectedGid,\n tierThreshold: applicableTier.threshold,\n ...(priorPending ? { pending: true } : {}),\n });\n }\n const desiredGid = choiceGids ? selectedGid : applicableTier.gift_variant_gid;\n const giftId = desiredGid ? numericVariantId(desiredGid) : null;\n const allowedCurrentIds = new Set((choiceGids ?? [applicableTier.gift_variant_gid])\n .map(numericVariantId).filter((id): id is number => id !== null).map(String));\n // Keep at most ONE line carrying the current gift variant; every other\n // marked line (stale variant after a relaunch, or a concurrent-tab\n // duplicate) is removed \u2014 the Function will not discount it. Removal\n // failures skip the experiment: falling through could misread the\n // shopper's cart as a manual decline.\n let managed: CartLine | undefined;\n let staleRemovalFailed = false;\n let removedStaleForExperiment = false;\n for (const line of managedLines()) {\n if (!managed && giftId !== null && lineVariantId(line) === String(giftId)) {\n managed = line;\n continue;\n }\n if (typeof line.key !== \"string\") continue;\n if (await removeLine(line)) removedStaleForExperiment = true;\n else staleRemovalFailed = true;\n }\n // Any failed stale removal is unresolved work: force another fixpoint\n // pass so the retry happens now, not at the next unrelated cart event \u2014\n // the Function discounts at most the one current-variant unit.\n if (staleRemovalFailed) cartMutated = true;\n if (staleRemovalFailed && !managed) continue;\n if (!managed && removedStaleForExperiment) {\n // OUR stale-variant removal, not a shopper decline of the new gift:\n // clear the record so the decline logic below cannot misread it and\n // the current gift may insert.\n clearInserted(experiment.experiment_id);\n }\n if (managed && lines.some((line) =>\n line !== managed && linePresent(line) && marker(line) !== experiment.experiment_id &&\n allowedCurrentIds.has(lineVariantId(line) ?? \"\"))) {\n // The Function picks one allowed option by cart-line id, not by Apex's\n // marker. If a shopper or another experiment added an allowed option,\n // our marked gift could therefore become a full-price line. Relinquish\n // Apex's line and let that other option satisfy the tier.\n if (typeof managed.key === \"string\" && await removeLine(managed)) {\n clearInserted(experiment.experiment_id);\n } else {\n cartMutated = true;\n }\n continue;\n }\n if (!desiredGid || giftId === null) {\n clearInserted(experiment.experiment_id);\n markChoicePromptLive();\n if (!options?.suppressInsertion && authorizedOfferExperimentIds.has(experiment.experiment_id) && !declined(experiment.experiment_id)) {\n const assignment = assignments.find((candidate) => candidate.experimentId === experiment.experiment_id);\n if (!options?.isArmProven || (assignment && options.isArmProven(assignment))) {\n const eventKey = `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids!.join(\",\")}`;\n // Only the current batch may dispatch or record dedup state: a\n // stale batch consuming the key would mute the queued batch's\n // valid prompt while its own event points at dead liveness.\n if (generation === choiceTierGeneration) {\n if (!dispatchedChoices.has(eventKey) && typeof window !== \"undefined\") {\n dispatchedChoices.add(eventKey);\n // Detail carries a COPY: chooser code mutating the array must\n // not corrupt the server-authored Function configuration that\n // selectGiftOption validates against.\n emitChoicePrompt({ experimentId: experiment.experiment_id, threshold: applicableTier.threshold, options: [...choiceGids!] });\n }\n }\n }\n }\n continue;\n }\n if (managed) {\n markChoicePromptLive();\n if (options?.suppressInsertion) {\n // Fail-closed pass after a failed stamp refresh: keep the line only\n // when durable evidence ties it to THIS cart \u2014 after a cart-identity\n // change (customer-cart merge) the old proof does not cover the new\n // cart and the Function will not discount the line.\n const record = insertionRecord(experiment.experiment_id);\n if (!record || !insertionMatchesCart(record, cartToken)) {\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n } else {\n // A correctly marked line is always Apex-inserted (shoppers cannot\n // set our line property), so seed the insertion record when a fresh\n // session discovers one \u2014 a later disappearance must count as a\n // manual decline.\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n }\n // The Function only zeroes a single unit; extra units on the managed\n // line would be charged, so normalize a shopper/theme increment to one.\n if (\n typeof managed.key === \"string\" &&\n typeof managed.quantity === \"number\" &&\n managed.quantity !== 1\n ) {\n // An off-model quantity always warrants another fixpoint pass \u2014 even\n // when this normalize fails, the re-read retries within the run\n // instead of leaving an extra charged unit until the next mutation.\n cartMutated = true;\n await mutate(changePath, { id: managed.key, quantity: 1 });\n }\n continue;\n }\n // Off-target charge-only pins never insert, and their line's absence on\n // this page is not decline evidence \u2014 the targeted page owns both calls.\n if (chargeOnlyExperimentIds.has(experiment.experiment_id)) {\n // But when WE removed this experiment's shared gift line in this run,\n // clear the co-owner evidence now: removedByUsThisRun does not survive\n // the pass, and a later targeted page would misread the absent line as\n // a shopper decline and never reinsert the still-eligible gift.\n if (\n insertionRecord(experiment.experiment_id) != null &&\n lines.some(\n (line) => !linePresent(line) && allowedCurrentIds.has(lineVariantId(line) ?? \"\"),\n )\n ) {\n clearInserted(experiment.experiment_id);\n }\n continue;\n }\n // A shopper-owned copy of the gift satisfies the offer without giving\n // Apex ownership of it \u2014 as does a copy just inserted for a parallel\n // GWP test with the same gift variant (the Function consolidates both\n // experiments' candidates onto that one line). This MUST precede the\n // decline logic: a co-owner's record with the shared line still present\n // is not a removal.\n const satisfyingLine = lines.find(\n (line) => linePresent(line) && allowedCurrentIds.has(lineVariantId(line) ?? \"\"),\n );\n const insertedAllowedId = [...insertedVariantIdsThisRun].find((id) => allowedCurrentIds.has(id));\n if (satisfyingLine || insertedAllowedId) {\n markChoicePromptLive();\n // Sharing an APEX-INSERTED line makes this experiment a co-owner:\n // record insertion state so the shopper's later removal declines every\n // experiment the line represents, not just the one in its marker.\n // Unmarked shopper-owned copies stay unrecorded \u2014 removing one's own\n // purchase is not a gift decline.\n if (\n insertedAllowedId ||\n (satisfyingLine && marker(satisfyingLine) != null)\n ) {\n const satisfyingGid = satisfyingLine\n ? choiceGids?.find((gid) => String(numericVariantId(gid)) === lineVariantId(satisfyingLine))\n : choiceGids?.find((gid) => String(numericVariantId(gid)) === insertedAllowedId);\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? satisfyingGid ?? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n }\n continue;\n }\n const record = insertionRecord(experiment.experiment_id);\n if (record != null) {\n clearInserted(experiment.experiment_id);\n // Only a missing line on the SAME cart the gift was inserted on is a\n // manual decline. A new cart (checkout consumed the old one) starts\n // clean, and a shared line WE removed this run (its owner entered\n // control or lost eligibility) lets a still-qualifying co-owner take\n // ownership instead of being marked declined.\n const removedByUsThisRun = lines.some(\n (line) => !linePresent(line) && lineVariantId(line) === String(giftId),\n );\n if (!removedByUsThisRun && insertionMatchesCart(record, cartToken)) {\n recordDecline(experiment.experiment_id);\n continue;\n }\n }\n if (declined(experiment.experiment_id)) continue;\n if (options?.suppressInsertion) continue;\n if (!authorizedOfferExperimentIds.has(experiment.experiment_id)) continue;\n if (options?.isArmProven) {\n const localAssignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (!localAssignment || !options.isArmProven(localAssignment)) continue;\n }\n const addResponse = await fetchWithoutShopifyCartMutationNotification(`${root}cart/add.js`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n items: [{ id: giftId, quantity: 1, properties: { [MARKER]: experiment.experiment_id } }],\n }),\n }).catch(() => null);\n if (!addResponse?.ok) {\n // A failed add for an explicit CHOICE dead-ends the shopper: the\n // pending selection would keep retrying the same variant while the\n // cleared tier liveness rejects any new selectGiftOption call. Drop\n // the failed selection and re-arm the prompt so another option can\n // be chosen.\n const failedSelection = selectedGiftOptions.get(experiment.experiment_id);\n if (choiceGids && failedSelection?.gid === desiredGid) {\n selectedGiftOptions.delete(experiment.experiment_id);\n clearDispatchedChoices(experiment.experiment_id);\n // Re-arm immediately: the pass-start tier clear plus a failed add\n // with no cart mutation means no follow-up pass runs, so the chooser\n // would stay dead (selection ignored, no pending prompts) until an\n // unrelated reconciliation. Restore tier liveness and re-dispatch so\n // an alternative option can be chosen right away.\n markChoicePromptLive();\n if (generation === choiceTierGeneration && typeof window !== \"undefined\") {\n const retryKey = `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids.join(\",\")}`;\n if (!dispatchedChoices.has(retryKey)) {\n dispatchedChoices.add(retryKey);\n emitChoicePrompt({ experimentId: experiment.experiment_id, threshold: applicableTier.threshold, options: [...choiceGids] });\n }\n }\n }\n continue;\n }\n if (addResponse?.ok) {\n cartMutated = true;\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n insertedVariantIdsThisRun.add(String(giftId));\n // Concurrent tabs can both add; Shopify consolidates identical\n // variant+property lines by bumping quantity while the Function only\n // discounts one unit. Verify from the add response and normalize.\n try {\n const body = await addResponse.json() as { items?: unknown };\n const addedLine = Array.isArray(body.items)\n ? body.items.find((item): item is CartLine =>\n !!item && typeof item === \"object\" &&\n marker(item as CartLine) === experiment.experiment_id)\n : undefined;\n if (\n addedLine && typeof addedLine.key === \"string\" &&\n typeof addedLine.quantity === \"number\" && addedLine.quantity > 1\n ) {\n // Detected consolidation always forces a follow-up fixpoint pass:\n // even if this normalize fails, the re-read sees quantity > 1 on\n // the managed line and retries rather than leaving a charged unit.\n cartMutated = true;\n await mutate(changePath, { id: addedLine.key, quantity: 1 });\n }\n } catch { /* best effort */ }\n }\n }\n return cartMutated;\n}\n\n/**\n * Seed durable insertion records from any cart snapshot that passes through\n * the SDK (e.g. the /cart/update.js stamp-write response). Marked lines can\n * only originate from Apex, so seeing one IS the insertion evidence \u2014 this is\n * how a fresh device or a cleared-storage session over a persistent (or\n * customer-synced) cart rediscovers gifts it must reconcile or tear down.\n * Returns true when a marked line was found.\n */\nexport function noteCartSnapshotForGifts(cart: unknown): boolean {\n const snapshot = cart as { token?: unknown; items?: unknown } | null;\n if (!Array.isArray(snapshot?.items)) return false;\n const cartToken = typeof snapshot.token === \"string\" && snapshot.token ? snapshot.token : null;\n let found = false;\n for (const item of snapshot.items) {\n if (!item || typeof item !== \"object\") continue;\n const mark = marker(item as CartLine);\n if (mark == null) continue;\n const variantId = lineVariantId(item as CartLine);\n // A snapshot write must not erase tier ownership an in-flow record\n // already carries: overwriting a tier-bound choice with a variant-only\n // record would let a later tier crossing adopt it without re-prompting.\n const existing = insertionRecord(mark);\n const existingTier = existing && insertionMatchesCart(existing, cartToken)\n ? recordTierThreshold(existing)\n : null;\n recordInserted(mark, cartToken, variantId\n ? `gid://shopify/ProductVariant/${variantId}`\n : undefined, existingTier ?? undefined);\n found = true;\n }\n return found;\n}\n\nexport function syncGiftWithPurchase(\n settings: CommerceOffersSettings | undefined,\n assignments: CartAssignment[],\n options?: GiftSyncOptions,\n): Promise<void> {\n latestArgs = { settings, assignments, options };\n installChoiceRequestListener();\n // Liveness derives from the PREVIOUS eligibility state until the async\n // reconciliation below re-proves it; clear synchronously and advance the\n // generation so neither a chooser callback nor an in-flight pass built on\n // the old arguments can resurrect a stale proven tier.\n choiceTierGeneration += 1;\n const batchGeneration = choiceTierGeneration;\n activeChoiceTier.clear();\n if (options?.recheckTeardown) teardownChecked = false;\n if (!settings?.experiments.length && !hasInsertionRecords()) {\n // No offers plane at all: nothing to reconcile (shops that never ran\n // offers have no tombstone). A present-but-empty plane is the teardown\n // tombstone \u2014 read the cart once per page load (reset on cart mutations)\n // so an orphaned gift is discovered even when local insertion records\n // are gone (cleared storage, another device over a customer-synced cart).\n if (!settings || teardownChecked) return Promise.resolve();\n }\n if (inFlight) {\n // The active run may have read the cart before the mutation that\n // triggered this call \u2014 queue one trailing run (latest args win) instead\n // of dropping the reconciliation.\n queuedArgs = { settings, assignments, options, generation: batchGeneration };\n return inFlight;\n }\n // Any pass that mutates the cart re-reads and re-verifies its decisions\n // (bounded): the cart may have changed between the read and the mutation\n // (e.g. the subtotal dropped below threshold before the gift add landed),\n // and shared-line decisions must be order-independent across experiments.\n const runToFixpoint = async (\n nextSettings: CommerceOffersSettings | undefined,\n nextAssignments: CartAssignment[],\n nextOptions: GiftSyncOptions | undefined,\n // Fixed per argument batch: a later batch bumps the global counter, and\n // every remaining pass of THIS batch must keep failing the liveness\n // check rather than re-reading the now-current generation.\n generation: number,\n ) => {\n let anyMutated = false;\n for (let pass = 0; pass < 3; pass += 1) {\n const mutated = await run(nextSettings, nextAssignments, nextOptions, generation).catch(() => false);\n if (mutated) anyMutated = true;\n if (!mutated) break;\n }\n if (anyMutated && typeof window !== \"undefined\") {\n // Our mutations suppress the SDK's own cart observer, so themes whose\n // drawers render from their original add/change responses would show a\n // stale cart. Publish a documented signal for themes/integrators to\n // re-render from /cart.js (checkout charges are correct regardless \u2014\n // the backend cart is authoritative; this is display freshness).\n try {\n window.dispatchEvent(\n new CustomEvent(\"apex:cart:changed\", { detail: { source: \"gwp_gift\" } }),\n );\n } catch { /* best effort */ }\n }\n };\n const pending = (async () => {\n await runToFixpoint(settings, assignments, options, batchGeneration);\n while (queuedArgs) {\n const next = queuedArgs;\n queuedArgs = null;\n await runToFixpoint(next.settings, next.assignments, next.options, next.generation);\n }\n if (choiceReplayRequested) getPendingGiftChoices().forEach(emitChoicePrompt);\n choiceReplayRequested = false;\n })().finally(() => {\n if (inFlight === pending) inFlight = null;\n if (!inFlight && queuedArgs) {\n const next = queuedArgs;\n queuedArgs = null;\n void syncGiftWithPurchase(next.settings, next.assignments, next.options);\n }\n });\n inFlight = pending;\n return pending;\n}\n\n/** Selects an option previously offered by `apex:gwp:choice`. The next\n * reconciliation validates the current signed arm/tier before mutating. */\nexport function selectGiftOption(experimentId: string, variantGid: string): Promise<void> {\n if (!latestArgs || numericVariantId(variantGid) === null) return Promise.resolve();\n const experiment = latestArgs.settings?.experiments.find((item) => item.experiment_id === experimentId);\n const variationId = latestArgs.assignments.find((item) => item.experimentId === experimentId)?.variationId;\n const variant = variationId ? experiment?.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") return Promise.resolve();\n const tiers = giftTiers(variant as Record<string, unknown>);\n const containingTiers = tiers?.filter((tier) =>\n tier.gift_choice_variant_gids?.includes(variantGid)) ?? [];\n // The same GID can be a valid choice in several tiers: bind the selection\n // to the tier that is applicable right now (tracked each reconciliation\n // pass), so answering the live prompt records the live tier \u2014 dispatched\n // keys from earlier tier crossings must not decide this.\n const applicableThreshold = activeChoiceTier.get(experimentId);\n // No live choice tier (shopper dropped below threshold, or moved to a\n // fixed tier) \u2192 a delayed chooser callback must be ignored, not recorded\n // against a tier that is no longer prompting.\n const owningTier = containingTiers.find(\n (tier) => tier.threshold === applicableThreshold,\n );\n if (!owningTier) return Promise.resolve();\n selectedGiftOptions.set(experimentId, {\n gid: variantGid,\n tierThreshold: owningTier.threshold,\n pending: true,\n });\n clearDispatchedChoices(experimentId);\n return syncGiftWithPurchase(latestArgs.settings, latestArgs.assignments, latestArgs.options);\n}\n\nfunction emitChoicePrompt(detail: PendingGiftChoice): void {\n dispatchEvent(new CustomEvent(\"apex:gwp:choice\", { detail }));\n}\n\n// Documented replay contract: dispatching apex:gwp:choice:request makes the\n// SDK re-emit apex:gwp:choice for every live, unanswered prompt, so choosers\n// mounted after the initial dispatch can recover it. Registered lazily from\n// the sync path so importing this module (e.g. via the @drip-apex/sdk/chooser\n// entry) stays free of runtime side effects.\nlet choiceRequestListenerInstalled = false;\nlet choiceReplayRequested = false;\nfunction installChoiceRequestListener(): void {\n if (choiceRequestListenerInstalled || typeof window === \"undefined\") return;\n choiceRequestListenerInstalled = true;\n window.addEventListener(\"apex:gwp:choice:request\", () => {\n if (inFlight) choiceReplayRequested = true;\n getPendingGiftChoices().forEach(emitChoicePrompt);\n });\n}\n\n/** Returns live, unanswered gift-choice prompts. This replayable query lets a\n * chooser mounted after `apex:gwp:choice` was dispatched discover the same\n * prompt; pass an experiment id to restrict the result. Returned option\n * arrays are copies and may be safely modified by caller code. */\nexport function getPendingGiftChoices(experimentId?: string): PendingGiftChoice[] {\n if (!latestArgs) return [];\n const prompts: PendingGiftChoice[] = [];\n for (const [activeExperimentId, threshold] of activeChoiceTier) {\n if (experimentId !== undefined && activeExperimentId !== experimentId) continue;\n const selected = selectedGiftOptions.get(activeExperimentId);\n if (selected?.tierThreshold === threshold) continue;\n const experiment = latestArgs.settings?.experiments.find(\n (item) => item.experiment_id === activeExperimentId,\n );\n const variationId = latestArgs.assignments.find(\n (item) => item.experimentId === activeExperimentId,\n )?.variationId;\n const variant = variationId ? experiment?.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") continue;\n const tier = giftTiers(variant as Record<string, unknown>)?.find(\n (candidate) => candidate.threshold === threshold,\n );\n if (!tier?.gift_choice_variant_gids) continue;\n prompts.push({\n experimentId: activeExperimentId,\n threshold,\n options: [...tier.gift_choice_variant_gids],\n });\n }\n return prompts;\n}\n\nexport const __giftManagerInternals = {\n reset() {\n inFlight = null;\n queuedArgs = null;\n insertedThisSession.clear();\n selectedGiftOptions.clear();\n activeChoiceTier.clear();\n dispatchedChoices.clear();\n latestArgs = null;\n teardownChecked = false;\n },\n};\n", "import { Mutation } from \"./types\";\nimport { applyTrackedMutation, getMutationKey, rejectTrackedMutation } from \"./mutate\";\nimport type { MutationJournalEntry } from \"./mutate\";\nimport { extractCurrencyTokens, type CurrencyToken } from \"./money\";\nimport { onShadowMutations, queryAllDeep } from \"./shadow\";\n\ntype WaitEntry = {\n seq: number;\n artifactId: string;\n epoch: number;\n selector: string;\n callback: (el: Element) => void;\n handled: WeakSet<Element>;\n matched: boolean;\n expiresAt: number;\n onMiss?: () => void;\n ownerKeys: Set<string>;\n requiresOwner: boolean;\n state: \"applied\" | \"invalidated\";\n};\n\nconst entries: WaitEntry[] = [];\nlet observer: MutationObserver | null = null;\nlet pending = false;\nconst pendingRoots = new Set<ParentNode>();\nconst DEFAULT_WAIT_TTL_MS = 30_000;\nlet expiryTimer: ReturnType<typeof setTimeout> | null = null;\nlet waitSequence = 0;\nlet stopShadowListener: (() => void) | null = null;\n\nfunction isElement(node: Node): node is Element {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n\nfunction hasQuerySelectorAll(node: ParentNode): node is ParentNode & { querySelectorAll: (selectors: string) => NodeListOf<Element> } {\n return typeof (node as ParentNode & { querySelectorAll?: unknown }).querySelectorAll === \"function\";\n}\n\nfunction applyToEntry(entry: WaitEntry, element: Element): void {\n if (entry.expiresAt <= Date.now()) return;\n if (entry.requiresOwner && entry.ownerKeys.size === 0) return;\n if (entry.handled.has(element)) return;\n entry.handled.add(element);\n entry.matched = true;\n entry.callback(element);\n}\n\nfunction clearExpiryTimer(): void {\n if (expiryTimer !== null) {\n clearTimeout(expiryTimer);\n expiryTimer = null;\n }\n}\n\nfunction scheduleExpiryPrune(): void {\n clearExpiryTimer();\n if (entries.length === 0) return;\n const nextExpiry = Math.min(...entries.map((entry) => entry.expiresAt));\n const delay = Math.max(1, nextExpiry - Date.now() + 1);\n expiryTimer = setTimeout(() => {\n expiryTimer = null;\n pruneExpiredEntries();\n }, delay);\n}\n\nfunction pruneExpiredEntries(): void {\n const ts = Date.now();\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n if (entries[i].expiresAt <= ts) {\n const [expired] = entries.splice(i, 1);\n if (!expired.matched) {\n try {\n expired.onMiss?.();\n } catch {}\n }\n }\n }\n if (entries.length === 0 && observer) {\n observer.disconnect();\n observer = null;\n pending = false;\n pendingRoots.clear();\n clearExpiryTimer();\n stopShadowListener?.();\n stopShadowListener = null;\n } else {\n scheduleExpiryPrune();\n }\n}\n\nfunction buildSelectorMap(): Map<string, WaitEntry[]> {\n pruneExpiredEntries();\n const selectorMap = new Map<string, WaitEntry[]>();\n for (const entry of entries) {\n const group = selectorMap.get(entry.selector);\n if (group) {\n group.push(entry);\n } else {\n selectorMap.set(entry.selector, [entry]);\n }\n }\n return selectorMap;\n}\n\nfunction runSelectorOnRoot(selector: string, root: ParentNode): Element[] {\n const matched: Element[] = [];\n try {\n if (isElement(root) && root.matches(selector)) {\n matched.push(root);\n }\n if (hasQuerySelectorAll(root)) {\n root.querySelectorAll(selector).forEach((el) => matched.push(el));\n }\n } catch {\n return [];\n }\n return matched;\n}\n\nconst debouncedCheck = () => {\n if (pending) return;\n pending = true;\n queueMicrotask(() => {\n pending = false;\n flushChecks();\n });\n};\n\nfunction checkAllEntries(): void {\n const selectorMap = buildSelectorMap();\n for (const [selector, selectorEntries] of selectorMap) {\n try {\n const elements = queryAllDeep(selector);\n elements.forEach((el) => {\n selectorEntries.forEach((entry) => applyToEntry(entry, el));\n });\n } catch {}\n }\n pruneExpiredEntries();\n}\n\nfunction checkPendingRoots(): void {\n if (pendingRoots.size === 0) return;\n const roots = Array.from(pendingRoots);\n pendingRoots.clear();\n\n const selectorMap = buildSelectorMap();\n for (const [selector, selectorEntries] of selectorMap) {\n for (const root of roots) {\n const matches = runSelectorOnRoot(selector, root);\n for (const element of matches) {\n selectorEntries.forEach((entry) => applyToEntry(entry, element));\n }\n }\n }\n pruneExpiredEntries();\n}\n\nfunction flushChecks(): void {\n if (entries.length === 0) return;\n if (pendingRoots.size > 0) {\n checkPendingRoots();\n return;\n }\n checkAllEntries();\n}\n\nfunction ensureObserver(): void {\n if (observer) return;\n observer = new MutationObserver((records) => {\n for (const record of records) {\n if (record.type === \"childList\") {\n record.addedNodes.forEach((node) => {\n if (isElement(node)) {\n pendingRoots.add(node);\n } else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n pendingRoots.add(node as DocumentFragment);\n }\n });\n } else if (record.type === \"attributes\" && isElement(record.target)) {\n pendingRoots.add(record.target);\n } else if (record.type === \"characterData\" && record.target.parentElement) {\n pendingRoots.add(record.target.parentElement);\n }\n }\n if (pendingRoots.size > 0) debouncedCheck();\n });\n observer.observe(document.documentElement, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n stopShadowListener ??= onShadowMutations((records) => {\n for (const record of records) {\n if (record.type === \"childList\") {\n record.addedNodes.forEach((node) => pendingRoots.add(node as ParentNode));\n } else {\n pendingRoots.add(record.target as ParentNode);\n }\n }\n if (pendingRoots.size > 0) debouncedCheck();\n });\n}\n\nexport function waitForElement(\n selector: string,\n callback: (el: Element) => void,\n options: {\n ttlMs?: number;\n onMiss?: () => void;\n ownerKeys?: readonly string[];\n ownerKeysSet?: Set<string>;\n artifactId?: string;\n epoch?: number;\n } = {},\n): void {\n const handled = new WeakSet<Element>();\n let matched = false;\n try {\n const existing = queryAllDeep(selector);\n existing.forEach((el) => {\n handled.add(el);\n matched = true;\n callback(el);\n });\n } catch {\n options.onMiss?.();\n return;\n }\n const ttlMs = Math.max(1_000, Math.min(options.ttlMs ?? DEFAULT_WAIT_TTL_MS, 120_000));\n entries.push({\n seq: ++waitSequence,\n artifactId: options.artifactId ?? options.ownerKeys?.[0] ?? \"wait:\" + selector,\n epoch: options.epoch ?? 0,\n selector,\n callback,\n handled,\n matched,\n expiresAt: Date.now() + ttlMs,\n onMiss: options.onMiss,\n ownerKeys: options.ownerKeysSet ?? new Set(options.ownerKeys ?? []),\n requiresOwner:\n options.ownerKeysSet !== undefined || (options.ownerKeys?.length ?? 0) > 0,\n state: \"applied\",\n });\n scheduleExpiryPrune();\n ensureObserver();\n}\n\nexport function applyMutationWithWait(\n mutation: Mutation,\n index: number,\n onApplied?: ((mutation: Mutation, element: Element, index: number, journalSeq?: number) => void) | null,\n onMiss?: ((mutation: Mutation, index: number) => void) | null,\n ownerKeys: readonly string[] = [],\n artifactId?: string,\n epoch = 0,\n pricePreservation?: {\n enabled: boolean;\n onViolation: (input: { selector: string; originalPriceTokens: CurrencyToken[] }) => void;\n },\n): void {\n const mutableOwnerKeys = new Set(ownerKeys);\n const key = getMutationKey(mutation, index);\n let resolved = false;\n waitForElement(mutation.selector, (element) => {\n if (resolved) return;\n const originalPrices = pricePreservation?.enabled &&\n (mutation.action === \"html\" || mutation.action === \"text\" || mutation.action === \"setText\")\n ? extractCurrencyTokens(element.textContent ?? \"\")\n : [];\n const originalHtml = originalPrices.length > 0 ? element.innerHTML : null;\n let journalSeq: number | undefined;\n let journalEntry: MutationJournalEntry | undefined;\n applyTrackedMutation(\n mutation,\n element,\n key,\n Array.from(mutableOwnerKeys),\n artifactId,\n (entry) => { journalSeq = entry.seq; journalEntry = entry; },\n epoch,\n );\n if (originalHtml !== null) {\n const remaining = extractCurrencyTokens(element.textContent ?? \"\");\n const preserved = originalPrices.every((token) => remaining.some((candidate) =>\n candidate.symbol === token.symbol && candidate.cents === token.cents));\n if (!preserved) {\n rejectTrackedMutation(journalEntry, element, originalHtml);\n pricePreservation?.onViolation({ selector: mutation.selector, originalPriceTokens: originalPrices });\n resolved = true;\n onMiss?.(mutation, index);\n return;\n }\n }\n onApplied?.(mutation, element, index, journalSeq);\n }, {\n onMiss: () => onMiss?.(mutation, index),\n ownerKeysSet: mutableOwnerKeys,\n artifactId,\n epoch,\n });\n}\n\nexport function addWaitEntryOwners(\n existingOwnerKeys: ReadonlySet<string>,\n ownerKeys: readonly string[],\n artifactId?: string,\n): void {\n if (existingOwnerKeys.size === 0 || ownerKeys.length === 0) return;\n for (const entry of entries) {\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (\n !Array.from(existingOwnerKeys).some((ownerKey) =>\n entry.ownerKeys.has(ownerKey)\n )\n ) continue;\n ownerKeys.forEach((ownerKey) => entry.ownerKeys.add(ownerKey));\n }\n}\n\nexport function resetWaitEntriesForOwner(\n ownerKey: string,\n artifactId?: string,\n): void {\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n if (artifactId !== undefined && entry.artifactId !== artifactId) continue;\n if (!entry.ownerKeys.has(ownerKey)) continue;\n entry.ownerKeys.delete(ownerKey);\n if (entry.ownerKeys.size === 0) entries.splice(i, 1);\n }\n if (entries.length > 0) {\n scheduleExpiryPrune();\n return;\n }\n pending = false;\n pendingRoots.clear();\n observer?.disconnect();\n observer = null;\n clearExpiryTimer();\n}\n\nexport function resetWaitEntries(): void {\n entries.length = 0;\n pending = false;\n pendingRoots.clear();\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n clearExpiryTimer();\n}\n", "import type { Experiment } from \"./types\";\n\nconst GOALS_KEY = \"drip_goals\";\nconst CONFIG_CACHE_PREFIX = \"drip_cfg:\";\n\nfunction readJsonRecord(key: string): Record<string, unknown> | null {\n try {\n const storage = globalThis.localStorage;\n if (!storage) return null;\n const raw = storage.getItem(key);\n return raw ? JSON.parse(raw) as Record<string, unknown> : null;\n } catch {\n return null;\n }\n}\n\nfunction cleanupGoalStorage(experiments: Experiment[]): void {\n const stored = readJsonRecord(GOALS_KEY);\n if (!stored) return;\n\n const activeGoalIds = new Set<string>();\n const activeVariationIds = new Set<string>();\n for (const experiment of experiments) {\n for (const goal of experiment.goals ?? []) activeGoalIds.add(goal.id);\n for (const variation of experiment.variations ?? []) activeVariationIds.add(variation.id);\n }\n\n const next: Record<string, string[]> = {};\n for (const [goalId, variationIds] of Object.entries(stored)) {\n if (!activeGoalIds.has(goalId) || !Array.isArray(variationIds)) continue;\n const kept = variationIds.filter((variationId) => (\n typeof variationId === \"string\" && activeVariationIds.has(variationId)\n ));\n if (kept.length) next[goalId] = kept;\n }\n\n try {\n const storage = globalThis.localStorage;\n if (!storage) return;\n if (Object.keys(next).length) storage.setItem(GOALS_KEY, JSON.stringify(next));\n else storage.removeItem(GOALS_KEY);\n } catch {\n // ignore storage failures\n }\n}\n\nfunction cleanupConfigCache(currentShopId?: string, retentionDays = 180): void {\n if (!currentShopId) return;\n const cutoffMs = Date.now() - Math.max(1, retentionDays) * 864e5;\n try {\n const storage = globalThis.localStorage;\n if (!storage) return;\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (!key?.startsWith(CONFIG_CACHE_PREFIX)) continue;\n if (key.startsWith(CONFIG_CACHE_PREFIX + currentShopId + \":\")) continue;\n const parsed = readJsonRecord(key);\n const fetchedAt = typeof parsed?.fetchedAt === \"number\" ? parsed.fetchedAt : 0;\n if (!fetchedAt || fetchedAt < cutoffMs) storage.removeItem(key);\n }\n } catch {\n // ignore storage failures\n }\n}\n\nexport function cleanupBucketingStorage(\n experiments: Experiment[],\n options?: { shopId?: string; retentionDays?: number },\n): void {\n cleanupGoalStorage(experiments);\n cleanupConfigCache(options?.shopId, options?.retentionDays ?? 180);\n}\n", "import { registerMutedObserver, unregisterMutedObserver } from \"./observer-mute\";\nimport { isCommercePriceWorkPending } from \"./commerce-price\";\nimport type { Assignment, CommercePriceSettings } from \"./types\";\n\nlet holds = 0;\nlet hydratedAt = 0;\nconst signals = new Set<() => void>();\n\nfunction perf(): Record<string, unknown> | null {\n if (typeof window === \"undefined\") return null;\n const target = window as Window & { __dripPerf?: Record<string, unknown> };\n return target.__dripPerf = target.__dripPerf ?? {};\n}\n\nfunction stampOnce(metrics: Record<string, unknown>, name: string, value: unknown): void {\n if (!(name in metrics)) metrics[name] = value;\n}\n\nexport function detectSsrFramework(): \"nuxt\" | \"next\" | \"server-rendered\" | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const runtime = window as Window & { __NUXT__?: unknown; __NEXT_DATA__?: unknown; __next_f?: unknown };\n if (runtime.__NUXT__ !== undefined || document.querySelector(\"#__nuxt\")) return \"nuxt\";\n if (\n runtime.__NEXT_DATA__ !== undefined ||\n runtime.__next_f !== undefined ||\n document.querySelector(\"#__next\") ||\n document.querySelector('script[src*=\"/_next/static/\"]')\n ) return \"next\";\n return document.querySelector(\"[data-server-rendered]\") ? \"server-rendered\" : null;\n}\n\nexport function holdMutations(): number {\n return ++holds;\n}\n\nexport function releaseMutations(): number {\n holds = Math.max(0, holds - 1);\n if (!holds) signals.forEach((signal) => signal());\n return holds;\n}\n\nexport function hasMutationHold(): boolean {\n return holds > 0;\n}\n\nexport function signalHydrated(): void {\n hydratedAt ||= Date.now();\n signals.forEach((signal) => signal());\n}\n\nexport function awaitHydration(\n timeoutMs: number,\n options: { waitForHydration?: boolean; recordMetrics?: boolean } = {},\n outerStarted = Date.now(),\n): Promise<void> {\n const started = outerStarted;\n const boundedTimeoutMs = Number.isFinite(timeoutMs)\n ? Math.max(0, Math.min(10_000, timeoutMs))\n : 3_000;\n if (\n boundedTimeoutMs > 0 &&\n options.waitForHydration !== false &&\n !hydratedAt &&\n typeof document !== \"undefined\" &&\n document.readyState === \"loading\" &&\n detectSsrFramework() === null\n ) {\n // Head installs run before the SSR root markers (#__next, #__nuxt,\n // data-server-rendered) are parsed; deciding \"no hydration\" now would\n // silently skip after_hydration exactly where it matters. Re-detect\n // once the DOM is available \u2014 racing the same hard timeout so a\n // delayed DOMContentLoaded can never hold the gate past the budget.\n return new Promise((resolve) => {\n let settled = false;\n const proceed = () => {\n if (settled) return;\n settled = true;\n clearTimeout(fallback);\n document.removeEventListener(\"DOMContentLoaded\", proceed);\n signals.delete(proceed);\n const remaining = Math.max(0, boundedTimeoutMs - (Date.now() - started));\n void awaitHydration(remaining, options, started).then(resolve);\n };\n document.addEventListener(\"DOMContentLoaded\", proceed, { once: true });\n // A framework can call drip.hydrated() before the parser reaches the\n // root marker/DOMContentLoaded. Let that explicit signal re-enter the\n // normal gate immediately instead of waiting for the hard deadline.\n signals.add(proceed);\n const fallback = setTimeout(proceed, boundedTimeoutMs);\n });\n }\n const frameworkDetected = detectSsrFramework() !== null;\n const explicitHydrationWait = options.waitForHydration === true;\n const needsHydration =\n options.waitForHydration !== false &&\n !hydratedAt &&\n (explicitHydrationWait || frameworkDetected);\n if (!needsHydration && !holds) return Promise.resolve();\n\n return new Promise((resolve) => {\n let hydrationDone = !needsHydration;\n let settled = false;\n let observer: MutationObserver | null = null;\n let frame = 0;\n let quietFrames = 0;\n let lastMutation = Date.now();\n\n const finish = (timedOut = false) => {\n if (settled) return;\n settled = true;\n const hydrationTimeout = timedOut && !hydrationDone;\n const holdTimeout = timedOut && holds > 0;\n if (hydrationTimeout) hydratedAt = Date.now();\n if (holdTimeout) {\n holds = 0;\n console.warn(\"[drip] Mutation hold timed out; applying fail-open\");\n }\n const metrics = options.recordMetrics === false ? undefined : perf();\n if (metrics) {\n if (needsHydration || hydratedAt) stampOnce(metrics, \"hydration_detected_at\", hydratedAt || Date.now());\n stampOnce(metrics, \"apply_delayed_ms\", Math.max(0, Date.now() - started));\n if (hydrationTimeout) stampOnce(metrics, \"hydration_timeout\", true);\n if (holdTimeout) stampOnce(metrics, \"hold_timeout\", true);\n }\n signals.delete(check);\n clearTimeout(timer);\n if (frame) cancelAnimationFrame(frame);\n if (observer) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n resolve();\n };\n\n function check() {\n if (hydratedAt) hydrationDone = true;\n if (hydrationDone && !holds) finish();\n }\n\n const onFrame = () => {\n quietFrames = Date.now() - lastMutation >= 50 ? quietFrames + 1 : 0;\n if (quietFrames === 2) {\n hydratedAt = Date.now();\n hydrationDone = true;\n check();\n } else if (!settled) frame = requestAnimationFrame(onFrame);\n };\n\n const beginQuiet = () => {\n if (!needsHydration || hydrationDone || settled) return;\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) {\n hydrationDone = true;\n check();\n return;\n }\n // requestAnimationFrame is available in supported browsers, but not in\n // every DOM-like host. Keep the explicit-signal/hard-timeout exits active\n // rather than throwing when the quiet detector cannot be scheduled.\n if (typeof requestAnimationFrame === \"undefined\") return;\n const onRecords: MutationCallback = () => {\n lastMutation = Date.now();\n quietFrames = 0;\n };\n observer = new MutationObserver(onRecords);\n registerMutedObserver(observer, onRecords);\n observer.observe(document.documentElement, { attributes: true, characterData: true, childList: true, subtree: true });\n frame = requestAnimationFrame(onFrame);\n };\n\n signals.add(check);\n const timer = setTimeout(() => finish(true), boundedTimeoutMs);\n if (needsHydration) {\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", beginQuiet, { once: true });\n else beginQuiet();\n }\n check();\n });\n}\n\nexport function resetHydrationState(): void {\n holds = 0;\n hydratedAt = 0;\n signals.forEach((signal) => signal());\n}\n\n// The anti-flicker reveal happens inside applyAssignments(), so deferring the\n// apply (hydration wait / pre-init hold) is only justified when the assignment\n// set carries visual work to coordinate. Untreated visitors \u2014 traffic-excluded\n// or control/no-mutation assignments \u2014 must apply and reveal immediately.\nexport function assignmentsHaveVisualWork(\n assignments: Assignment[],\n priceSettings?: CommercePriceSettings,\n): boolean {\n return (\n assignments.some(\n (assignment) =>\n assignment.mutations.length > 0 ||\n Boolean(\n assignment.css ||\n assignment.js ||\n assignment.externalCssUrl ||\n assignment.externalJsUrl ||\n assignment.experimentCss ||\n assignment.experimentJs,\n ),\n ) || isCommercePriceWorkPending(priceSettings, assignments)\n );\n}\n\nif (typeof document !== \"undefined\" && typeof document.addEventListener === \"function\") {\n document.addEventListener(\"drip:hydrated\", signalHydrated);\n}\n", "import type { Assignment } from \"./types\";\n\nexport type EarlyReassertDiagnostics = {\n early_apply_at?: number;\n reasserts_count?: number;\n revert_loops_detected?: number;\n};\n\nexport function assignmentsHaveStructuralMutations(assignments: Assignment[]): boolean {\n return assignments.some((assignment) => assignment.mutations.some((mutation) =>\n mutation.action === \"remove\" || mutation.action?.startsWith(\"insert\")));\n}\n\nexport function assignmentsHaveCustomJs(assignments: Assignment[]): boolean {\n return assignments.some((assignment) =>\n Boolean(\n assignment.js?.trim()\n || assignment.experimentJs?.trim()\n || assignment.externalJsUrl,\n ));\n}\n\nconst DEFAULT_CAP = 24;\nconst LOOP_FRAME_LIMIT = 6;\n\nexport function shouldUseEarlyReassert(input: {\n applyTiming?: string;\n hasTrustedPredecision: boolean;\n consentGranted: boolean;\n dntBlocked: boolean;\n configSource: string;\n}): boolean {\n return input.applyTiming === \"early_reassert\"\n && input.configSource === \"inline\"\n && input.hasTrustedPredecision\n && input.consentGranted\n && !input.dntBlocked;\n}\n\n/**\n * Watches only treatment selectors and batches hydration repairs into the next\n * animation frame. The observer is deliberately SDK-side: the inline decision\n * bootstrap remains a small, synchronous decision-only artifact.\n *\n * The watcher never captures an assignment array. It resolves the live applied\n * set through `resolveAssignments` at fire time, so a page teardown that drops\n * the artifacts stops it by construction rather than through a\n * `stopEarlyReassert()` call nobody makes.\n */\nexport function installEarlyReassert(input: {\n resolveAssignments: () => Assignment[];\n reapply: (assignments: Assignment[]) => void;\n diagnostics: EarlyReassertDiagnostics;\n timeoutMs?: number;\n cap?: number;\n}): () => void {\n if (typeof document === \"undefined\" || typeof MutationObserver === \"undefined\") return () => {};\n const resolveWatchSet = (): { assignments: Assignment[]; selectors: string[] } => {\n const assignments = input.resolveAssignments();\n return {\n assignments,\n selectors: assignments.flatMap((assignment) =>\n assignment.mutations.map((mutation) => mutation.selector)),\n };\n };\n let hasObservedWatchSet = resolveWatchSet().selectors.length > 0;\n\n const cap = Math.max(1, input.cap ?? DEFAULT_CAP);\n let stopped = false;\n let armed = false;\n let frame: number | ReturnType<typeof setTimeout> | null = null;\n let consecutiveFrames = 0;\n let lastFrameAt = 0;\n const matchesTreatment = (node: Node, selectors: string[]): boolean => {\n const element = node instanceof Element ? node : node.parentElement;\n if (!element) return false;\n return selectors.some((selector) => {\n try { return element.matches(selector) || Boolean(element.closest(selector)); }\n catch { return false; }\n });\n };\n const cancelFrame = () => {\n if (frame === null) return;\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(frame as number);\n else clearTimeout(frame as ReturnType<typeof setTimeout>);\n frame = null;\n };\n const stop = () => {\n if (stopped) return;\n stopped = true;\n observer.disconnect();\n cancelFrame();\n clearTimeout(timeout);\n };\n const run = (timestamp: number) => {\n frame = null;\n if (stopped) return;\n // A selector this watcher armed for can still churn after its page was torn\n // down. Resolve first: with no live artifact left there is nothing to\n // repair, and re-applying would leave an unrevertable treatment behind.\n const live = resolveWatchSet();\n if (!live.selectors.length) {\n if (hasObservedWatchSet) stop();\n return;\n }\n hasObservedWatchSet = true;\n const count = input.diagnostics.reasserts_count ?? 0;\n if (count >= cap) {\n input.diagnostics.revert_loops_detected = (input.diagnostics.revert_loops_detected ?? 0) + 1;\n stop();\n return;\n }\n consecutiveFrames = timestamp - lastFrameAt < 34 ? consecutiveFrames + 1 : 1;\n lastFrameAt = timestamp;\n if (consecutiveFrames > LOOP_FRAME_LIMIT) {\n input.diagnostics.revert_loops_detected = (input.diagnostics.revert_loops_detected ?? 0) + 1;\n stop();\n return;\n }\n input.diagnostics.reasserts_count = count + 1;\n input.reapply(live.assignments);\n // The repair itself mutates the same nodes. Drop those synchronous records\n // so only a later framework revert schedules another frame.\n observer.takeRecords();\n };\n const schedule = () => {\n if (stopped || frame !== null) return;\n if (typeof requestAnimationFrame === \"function\") frame = requestAnimationFrame(run);\n else frame = setTimeout(() => run(Date.now()), 16);\n };\n const observer = new MutationObserver((records) => {\n if (!armed) return;\n const live = resolveWatchSet();\n if (!live.selectors.length) {\n if (hasObservedWatchSet) stop();\n return;\n }\n hasObservedWatchSet = true;\n if (records.some((record) => matchesTreatment(record.target, live.selectors) || Array.from(record.addedNodes).some((node) => {\n if (matchesTreatment(node, live.selectors)) return true;\n if (!(node instanceof Element)) return false;\n return live.selectors.some((selector) => {\n try { return Boolean(node.querySelector(selector)); }\n catch { return false; }\n });\n }))) schedule();\n });\n observer.observe(document.documentElement, { subtree: true, childList: true, attributes: true, characterData: true });\n queueMicrotask(() => { observer.takeRecords(); armed = true; });\n const timeout = setTimeout(stop, Math.max(250, input.timeoutMs ?? 8_000));\n return stop;\n}\n", "import { RouterMode } from \"./types\";\n\nexport type RouteChangeEvent = {\n previousUrl: string;\n nextUrl: string;\n reason: \"pushState\" | \"replaceState\" | \"popstate\" | \"hashchange\" | \"navigation\" | \"polling\";\n};\n\ntype RouteObserver = (event: RouteChangeEvent) => void;\n\nexport function notifyIfChanged(\n lastUrlRef: { value: string },\n reason: RouteChangeEvent[\"reason\"],\n observer: RouteObserver,\n onObserverError?: (error: unknown) => void,\n): void {\n const next = location.href;\n if (next === lastUrlRef.value) return;\n const previous = lastUrlRef.value;\n lastUrlRef.value = next;\n try {\n observer({ previousUrl: previous, nextUrl: next, reason });\n } catch (error) {\n onObserverError?.(error);\n }\n}\n\nexport const PAGE_URL_POLL_INTERVAL_MS = 250;\n\nexport function observePollingChanges(\n observer: RouteObserver,\n intervalMs = PAGE_URL_POLL_INTERVAL_MS,\n lastUrlRef: { value: string } = { value: location.href },\n onObserverError?: (error: unknown) => void,\n): () => void {\n const timer = window.setInterval(\n () => notifyIfChanged(lastUrlRef, \"polling\", observer, onObserverError),\n intervalMs,\n );\n return () => window.clearInterval(timer);\n}\n\nfunction observeHistoryChanges(\n observer: RouteObserver,\n lastUrlRef: { value: string },\n onObserverError?: (error: unknown) => void,\n): () => void {\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notifyIfChanged(lastUrlRef, method, observer, onObserverError);\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n const popHandler = () => notifyIfChanged(lastUrlRef, \"popstate\", observer, onObserverError);\n const hashHandler = () => notifyIfChanged(lastUrlRef, \"hashchange\", observer, onObserverError);\n\n window.addEventListener(\"popstate\", popHandler);\n window.addEventListener(\"hashchange\", hashHandler);\n\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", popHandler);\n window.removeEventListener(\"hashchange\", hashHandler);\n };\n}\n\nfunction observeNavigationApi(\n observer: RouteObserver,\n lastUrlRef: { value: string },\n onObserverError?: (error: unknown) => void,\n): () => void {\n const w = globalThis as Record<string, unknown>;\n const navigation = w.navigation as {\n addEventListener?: (type: string, listener: () => void) => void;\n removeEventListener?: (type: string, listener: () => void) => void;\n } | undefined;\n if (!navigation || typeof navigation.addEventListener !== \"function\") {\n return () => {};\n }\n\n const listener = () => notifyIfChanged(lastUrlRef, \"navigation\", observer, onObserverError);\n navigation.addEventListener(\"navigate\", listener);\n\n return () => {\n if (typeof navigation.removeEventListener === \"function\") {\n navigation.removeEventListener(\"navigate\", listener);\n }\n };\n}\n\nexport function observeRouteChanges(\n mode: RouterMode,\n observer: RouteObserver,\n options: { pollingIntervalMs?: number; onObserverError?: (error: unknown) => void } = {},\n): () => void {\n if (mode === \"none\") return () => {};\n\n const lastUrlRef = { value: location.href };\n const cleanups: Array<() => void> = [];\n\n if (mode === \"navigation\") {\n cleanups.push(observeNavigationApi(observer, lastUrlRef, options.onObserverError));\n }\n\n if (mode === \"history\" || mode === \"navigation\" || mode === \"polling\") {\n cleanups.push(observeHistoryChanges(observer, lastUrlRef, options.onObserverError));\n }\n\n if (mode === \"polling\" || options.pollingIntervalMs !== undefined) {\n cleanups.push(observePollingChanges(\n observer,\n options.pollingIntervalMs ?? PAGE_URL_POLL_INTERVAL_MS,\n lastUrlRef,\n options.onObserverError,\n ));\n }\n\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n", "import { debugWarn } from \"./debug\";\nimport type { InitConfig } from \"./types\";\n\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\n\ntype PrerequisiteContext = {\n type: \"show_variations\" | \"start_tracking\";\n url: string;\n attributes: Record<string, unknown>;\n userId: string | null;\n consentRequired: boolean;\n consentGranted: boolean;\n};\n\nfunction getWindowValue(key: string): unknown {\n const w = globalThis as Record<string, unknown>;\n return w[key] ?? (w.__drip as Record<string, unknown> | undefined)?.[key];\n}\n\nfunction buildRuleApi(context: PrerequisiteContext) {\n return {\n get(key: string): unknown {\n if (key === \"trackingConsentEnabled\") {\n return !context.consentRequired || context.consentGranted;\n }\n if (key === \"consentGranted\") return context.consentGranted;\n if (key === \"url\") return context.url;\n if (key === \"userId\") return context.userId;\n return getWindowValue(key);\n },\n context,\n };\n}\n\nfunction normalizeSimpleRule(code: string): string {\n return code.trim().replace(/\\s+/g, \" \").replace(/;+$/, \"\");\n}\n\nfunction evaluateKnownRule(code: string, context: PrerequisiteContext): boolean | null {\n const normalized = normalizeSimpleRule(code);\n if (normalized === \"return true\") return true;\n if (normalized === \"return false\") return false;\n if (normalized === \"return context.consentGranted\") return context.consentGranted;\n if (normalized === \"return !context.consentRequired || context.consentGranted\") {\n return !context.consentRequired || context.consentGranted;\n }\n\n const getterMatch = normalized.match(/^return\\s+(?:drip|Drip)\\.get\\(['\"]([a-zA-Z0-9_.-]+)['\"]\\)$/);\n if (getterMatch) {\n const api = buildRuleApi(context);\n return api.get(getterMatch[1]) === true;\n }\n\n return null;\n}\n\nexport function evaluateProjectPrerequisite(\n rule: string | undefined,\n context: PrerequisiteContext,\n fallback: boolean,\n): boolean {\n const code = (rule ?? \"\").trim();\n if (!code) return fallback;\n const knownResult = evaluateKnownRule(code, context);\n if (knownResult != null) return knownResult;\n try {\n const api = buildRuleApi(context);\n const fn = new Function(\"context\", \"drip\", \"Drip\", code);\n const result = fn.call(globalThis, context, api, api);\n return result === true;\n } catch (err) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"prerequisite\", `${context.type} rule failed; failing closed`, {\n error: err instanceof Error ? err.message : String(err),\n });\n return false;\n }\n}\n\nexport function buildPrerequisiteContext(\n config: InitConfig,\n userId: string | null,\n consentRequired: boolean,\n consentGranted: boolean,\n type: PrerequisiteContext[\"type\"],\n): PrerequisiteContext {\n return {\n type,\n url: config.url ?? location.href,\n attributes: config.attributes ?? {},\n userId,\n consentRequired,\n consentGranted,\n };\n}\n", "import type { DebugSettings } from \"./types\";\n\nexport function loadDebugBuild(\n settings: DebugSettings | undefined,\n snippetUrl: string | undefined,\n onFallback?: () => void,\n): boolean {\n const expiresAt = settings?.expiresAt ? Date.parse(settings.expiresAt) : null;\n if (!settings?.enabled || !snippetUrl\n || settings.restrictMode === \"off\"\n || expiresAt !== null && (!Number.isFinite(expiresAt) || expiresAt <= Date.now())) return false;\n try {\n const value = new URLSearchParams(location.search).get(settings.queryParam || \"drip_debug\");\n const tokenRequired = settings.tokenRequired === true || Boolean(settings.token);\n if (!tokenRequired && (value == \"0\" || value == \"false\")) return false;\n const queryOptIn = tokenRequired ? value !== null : value == \"1\" || value == \"true\";\n if (!queryOptIn && !(settings.persist && (localStorage as any).drip_debug == \"1\")) return false;\n const handoff = (document as any).__dripDL;\n if (handoff === \"failed\") return false;\n if (handoff) {\n return new URL(snippetUrl, location.href).searchParams.get(\"drip_sdk_variant\") !== \"debug\";\n }\n const currentScript = document.currentScript;\n const nonce = currentScript && (currentScript.nonce || currentScript.getAttribute(\"nonce\")) || \"\";\n const script = document.createElement(\"script\");\n const debugUrl = new URL(snippetUrl, location.href);\n debugUrl.searchParams.set(\"drip_sdk_variant\", \"debug\");\n if (value !== null) debugUrl.searchParams.set(\"drip_debug_token\", value);\n script.src = debugUrl.toString();\n script.nonce = nonce;\n script.onerror = () => {\n if ((document as any).__dripDL !== script) return;\n (document as any).__dripDL = \"failed\";\n onFallback?.();\n };\n (document as any).__dripDL = document.head.appendChild(script);\n return true;\n } catch {\n return false;\n }\n}\n", "export const EDITOR_FRAGMENT_KEY = \"apex-editor\";\nexport const EDITOR_BUNDLE_FILENAME = \"editor.js\";\nexport const EDITOR_DEVICE_FRAME_NAME = \"apex-editor-device-preview\";\nconst EDITOR_SCRIPT_ID = \"drip-editor-bundle\";\nconst EDITOR_LOAD_TIMEOUT_MS = 10_000;\n\nexport type EditorLaunchHint = {\n token: string;\n sid: string;\n apiOrigin: string;\n};\n\ntype LocationLike = Pick<Location, \"hash\" | \"href\">;\ntype HistoryLike = Pick<History, \"replaceState\" | \"state\">;\n\nexport type EditorBundleApi = {\n start: (launch: EditorLaunchHint) => boolean | Promise<boolean>;\n};\n\ntype EditorGlobal = typeof globalThis & {\n ApexEditor?: EditorBundleApi;\n};\n\nlet editorState: \"idle\" | \"starting\" | \"active\" = \"idle\";\n\nexport function isEditorDevicePreview(windowLike: Pick<Window, \"name\"> = window): boolean {\n return windowLike.name === EDITOR_DEVICE_FRAME_NAME;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n try {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\nfunction normalizeApiOrigin(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null;\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n return url.origin;\n } catch {\n return null;\n }\n}\n\nexport function decodeEditorLaunchToken(token: string): Omit<EditorLaunchHint, \"token\"> | null {\n const encodedPayload = token.split(\".\", 1)[0];\n if (!encodedPayload) return null;\n const decoded = decodeBase64Url(encodedPayload);\n if (!decoded) return null;\n try {\n const payload = JSON.parse(decoded) as Record<string, unknown>;\n const sid = typeof payload.sid === \"string\" ? payload.sid.trim() : \"\";\n const apiOrigin = normalizeApiOrigin(payload.apiOrigin ?? payload.api_origin);\n if (payload.aud !== \"apex-editor-exchange\" || !sid || !apiOrigin) return null;\n return { sid, apiOrigin };\n } catch {\n return null;\n }\n}\n\nexport function consumeEditorLaunchFragment(\n locationLike: LocationLike = location,\n historyLike: HistoryLike = history,\n): EditorLaunchHint | null {\n if (!locationLike.hash || locationLike.hash.length < 2) return null;\n const params = new URLSearchParams(locationLike.hash.slice(1));\n const encodedToken = params.get(EDITOR_FRAGMENT_KEY);\n if (!encodedToken) return null;\n\n const token = encodedToken.trim();\n const hint = decodeEditorLaunchToken(token);\n params.delete(EDITOR_FRAGMENT_KEY);\n\n try {\n const cleanUrl = new URL(locationLike.href);\n const remainingHash = params.toString();\n cleanUrl.hash = remainingHash ? `#${remainingHash}` : \"\";\n historyLike.replaceState(historyLike.state ?? null, \"\", cleanUrl.toString());\n } catch {\n return null;\n }\n\n return hint ? { token, ...hint } : null;\n}\n\nexport function resolveEditorBundleUrl(input: {\n configuredUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n}): string | null {\n const baseUrl = input.scriptSrc || input.pageUrl;\n if (input.configuredUrl) {\n try {\n const url = new URL(input.configuredUrl, baseUrl);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.toString() : null;\n } catch {\n return null;\n }\n }\n if (!input.scriptSrc) return null;\n try {\n const scriptUrl = new URL(input.scriptSrc, input.pageUrl);\n if (/^\\/sdk\\/[^/]+\\/[^/]+\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else if (/\\/drip(?:\\.live|\\.heatmap|\\.debug)?\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else {\n scriptUrl.pathname = `/${EDITOR_BUNDLE_FILENAME}`;\n }\n scriptUrl.search = \"\";\n scriptUrl.hash = \"\";\n return scriptUrl.toString();\n } catch {\n return null;\n }\n}\n\nexport function loadEditorBundle(\n bundleUrl: string,\n documentLike: Document = document,\n timeoutMs = EDITOR_LOAD_TIMEOUT_MS,\n): Promise<EditorBundleApi> {\n return new Promise((resolve, reject) => {\n const existing = documentLike.getElementById(EDITOR_SCRIPT_ID);\n existing?.remove();\n\n const script = documentLike.createElement(\"script\");\n script.id = EDITOR_SCRIPT_ID;\n script.src = bundleUrl;\n script.async = true;\n script.crossOrigin = \"anonymous\";\n\n const timeout = setTimeout(() => {\n script.remove();\n reject(new Error(\"Editor bundle load timed out\"));\n }, timeoutMs);\n const finish = (error?: Error) => {\n clearTimeout(timeout);\n if (error) {\n script.remove();\n reject(error);\n return;\n }\n const editorGlobal = globalThis as EditorGlobal;\n const api = editorGlobal.ApexEditor;\n try {\n editorGlobal.ApexEditor = undefined;\n } catch {}\n if (!api || typeof api.start !== \"function\") {\n reject(new Error(\"Editor bundle did not expose a start function\"));\n return;\n }\n resolve(api);\n };\n script.onload = () => finish();\n script.onerror = () => finish(new Error(\"Editor bundle failed to load\"));\n (documentLike.head || documentLike.documentElement).appendChild(script);\n });\n}\n\nexport function interceptEditorLaunch(input: {\n configuredBundleUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n onBeforeLoad?: () => void;\n onFailure: () => void;\n loadBundle?: (url: string) => Promise<EditorBundleApi>;\n locationLike?: LocationLike;\n historyLike?: HistoryLike;\n}): boolean {\n if (editorState !== \"idle\") return true;\n const launch = consumeEditorLaunchFragment(input.locationLike, input.historyLike);\n if (!launch) return false;\n\n editorState = \"starting\";\n input.onBeforeLoad?.();\n const bundleUrl = resolveEditorBundleUrl({\n configuredUrl: input.configuredBundleUrl,\n scriptSrc: input.scriptSrc,\n pageUrl: input.pageUrl,\n });\n const fail = () => {\n editorState = \"idle\";\n input.onFailure();\n };\n if (!bundleUrl) {\n Promise.resolve().then(fail);\n return true;\n }\n\n const loader = input.loadBundle ?? ((url: string) => loadEditorBundle(url));\n loader(bundleUrl)\n .then((api) => api.start(launch))\n .then((active) => {\n if (active) editorState = \"active\";\n else fail();\n })\n .catch(fail);\n return true;\n}\n\nexport const __test = {\n getState: () => editorState,\n resetState: () => {\n editorState = \"idle\";\n },\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", "/**\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", "declare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nimport { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { applyRuntimeAntiFlicker, SDK_SCRIPT_SRC, HeatmapController, SemanticController, FetchAttemptInfo, FetchRetryOptions, DEFAULT_CONFIG_FETCH_TIMEOUT_MS, DEFAULT_CONFIG_FETCH_SLOW_MS, CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, CONFIG_FETCH_MAX_WAIT_MS, CACHED_REDIRECT_HIDE_TIMEOUT_MS, createFetchTimeoutError, fetchWithTimeout, fetchWithRetry, CONFIG_CACHE_KEY_PREFIX, DEFAULT_CONFIG_CACHE_TTL_MS, DEFAULT_ANTI_FLICKER_TIMEOUT_MS, DEFAULT_TRACKING_IDLE_TIMEOUT_MS, DEFAULT_EXECUTION_MODE, DEFAULT_TRACKING_START, DEFAULT_JS_POLICY, PAGE_RULE_POLL_WINDOW_MS, PAGE_RULE_POLL_INTERVAL_MS, CONSENT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS, IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES, SESSION_STORAGE_KEY, collectScopedSelectors, ResolvedRuntimeConfig, UrlDiffNeeds, ConfigSource, PendingPerfEvent, InitPhaseKey, InitPerfContext, MAX_PERF_DURATION_MS, monotonicNow, boundedPerfDuration, createInitPerfContext, BootstrapPredecision, bootstrapPredecision, addInitPhase, DeliveryHealthStatus, DeliveryHealthTracker, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic, ExposureDestinationDiagnostic, RuntimeLoadDiagnostic, DripPerfWindow, normalizeNumber, resolveRuntimeConfig, resolvePageTriggerMode, resolveDomPageTrigger, dtLog, traceName, traceStep, traceGate, browserDoNotTrackValue, trackingBlocked, storefrontVitalsGateOpen, syncStorefrontVitals, doNotTrackEnabled, storageAllowed, readWindowPath, configuredConsentGranted, syncConfiguredConsent, CUSTOM_CONSENT_POLL_INTERVAL_MS, CUSTOM_CONSENT_POLL_MAX_MS, MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS, MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS, MANUAL_CALLBACK_TRIGGER_MAX_RERUNS, EVENT_DRIVEN_CONSENT_PROVIDERS, shouldPollConfiguredConsent, installConsentChangeListeners, resolveConsentRequired, resolveConsentGranted, persistentStorageAllowed, coerceSignalValue, captureUrlSignals, installClickSignalCaptures, captureEventPropertySignals, setCapturedSignal, setPublicSignal, getPublicSignals, normalizePageApiName, pageTriggerSignal, triggerPage, readElementCaptureValue, captureDomAndGlobalSignals, consentAwareDataProtection, writeConsentCookie, readConsentCookie, clearConsentStorage, applyConsentStorageMode, runWhenDomReady, applyProjectCode, resetProjectCode, runProjectStartupCode, collectJsTriggerConditions, collectPageTriggerRules, PageDetectorMode, PageRuleReconcileScope, collectPageDetectorRules, experimentsForGlobalRouteReevaluation, conditionUsesActivateTrigger, buildJsTriggerContext, runJsTriggerReset, normalizeActivationValue, installActivateJsTrigger, installPageTriggerRule, installJsTriggerObserver, notifyQaAssistantRuntimeListeners, HarnessManifest, harnessPollTimer, harnessPollKey, harnessVisibilityInstalled, activeHarnessAssignment, stopHarnessPolling, applyHarnessManifest, pollHarnessManifest, startHarnessPolling, getEventsEndpoint, mintBucketingHandoverPayload, verifyBucketingHandoverToken, clearScheduledAnalyticsStart, normalizeDataLayerTriggers, applyDataLayerMappings, readNumericPath, readStringPath, RESERVED_DATA_LAYER_REVENUE_KEYS, PendingDataLayerEvent, MAX_PENDING_DATA_LAYER_EVENTS, pendingDataLayerEvents, processedDataLayerEntries, isDataLayerEntryObject, markDataLayerEntryProcessed, trackDataLayerRevenue, trackDataLayerEvent, enqueuePendingDataLayerEvent, drainPendingDataLayerEvents, finishInitializingAssignments, handleDataLayerEvent, recordObserverError } from \"./config-runtime\";\nimport { scheduleDeferredRouteReevaluation, installDataLayerTriggers, experimentsUseSurfaceSignals, rememberExposureDestination, clarityUpgradeSent, clarityTagKey, pushExposureToQueue, emitExposureDestinations, ensureTrackerStarted, exposureAssignmentKey, priceAssignmentAuthorizationKey, isPriceDisplayAssignmentAuthorized, isShippingDisplayAssignmentAuthorized, isOffersDisplayAssignmentAuthorized, giftSyncOptions, assignmentHasRenderableArtifacts, authorizeOffersDisplayAndRender, revokeOffersDisplayAuthorization, exposureEligibleAssignments, isShippingExposureCartEligible, trackViewedAssignmentsAfterShippingEligibility, EMPTY_TARGETING_ATTRIBUTES, TargetingEvaluationPass, activeTargetingEvaluationPass, createTargetingEvaluationPass, targetingAttributesForPass, trackViewedAssignments, sameStringSet, setupGoalTracking, setupHeatmapTracking, cleanupHeatmapTracking, setupReplayTracking, cleanupReplayTracking, setupSemanticTracking, cleanupSemanticTracking, buildExperimentBehaviorEvents, buildPageExitEvents, analyticsTrack, syncLoadDiagnosticsToPerf, updateLoadDiagnostics, resetLoadDiagnostics, queuePerfEvent, RuntimeInstallClaim, RUNTIME_INSTALL_CLAIM_KEY, RUNTIME_INSTALL_CONFLICT_KEY, telemetryLabel, readRuntimeInstallClaim, rememberRuntimeInstallClaim, claimInstallConflictEmission, sdkAttributionData, sendRuntimeEventNow, sendRuntimePerfNow, readDripPerf, markDripPerf, numberPerf, coexistencePerfFields, buildPerfEvent, flushPendingPerf, orderIdentityEndpoint, ORDER_EXPOSURE_STORAGE_KEY, ORDER_EXPOSURE_MAX_ENTRIES, ORDER_EXPOSURE_TTL_MS, StoredOrderExposure, pruneStoredOrderExposures, readStoredOrderExposures, writeStoredOrderExposures, clearIdentityContextCookie, recentIdentityContextExposures, buildIdentityContextCookieValue, generateSessionId, getIdentityContextSessionId, writeIdentityContextCookie, isOffTargetPersistedAssignment, restoreRecordedExposureDedup, rememberOrderExposure, mergedOrderIdentityAssignments, cleanOrderIdentityText, resolveOrderIdentityPlatform, detectOrderIdentity, orderIdentityDedupeKey, scheduleOrderIdentityBeacon, deliveryStatus, queueDeliveryHealthEvent, flushPendingDeliveryHealth, startAnalyticsStage, scheduleAnalyticsStart, startAnalyticsIfReady, getConfigCacheKey, storageAvailable, getConfigCacheTtlMs, configuredStoreOrigins, readCachedExperiments, hashConfigPayload, writeCachedExperiments, withRuntimeSettings, serializeForceMap, getHashId } from \"./analytics-runtime\";\nimport { PersistedAssignmentMap, GLOBAL_PAGE_PREFIX, appliedAssignmentsByKey, ArtifactId, invalidatedArtifactIds, artifactEpochs, applyPassEpoch, artifactEpochCurrent, PageActivationTransition, normalizePageDeactivationMode, effectiveDeactivationMode, includedPageRules, currentPageMatchContext, pageActivationDiagnosticRows, reconcilePageActivation, cancelPageRulePoll, cancelAllPageRulePolls, pageRulePollSettings, deactivationModeForTriggeredRule, reconcileTriggeredPageMatch, startPageRulePoll, firePageDetector, activePageIds, experimentHasActivePage, syncAssignmentPageActive, assignmentPageIds, stableArtifactJson, artifactContentHash, baseArtifactApplicationKey, artifactApplicationKey, artifactIdFromApplicationKey, assignmentRuntimeKeys, artifactOwnerId, redirectCarryAssignmentKey, shouldPreserveOffTargetRedirectAssignment, isAssignmentArtifactInactive, renderable, exposable, attributable, recordAttributableAssignments, artifactRenderableAssignments, activeRenderableAssignments, chargeAffectingAssignments, loadPersistedAssignments, buildPersistedAssignmentResult, withAssignmentEpochData, usesStickyAssignmentPersistence, persistActiveExperimentAssignments, experimentDiagnostic, evaluateExperimentDetailed, evaluateExperiment, stoppedPersonalizationDiagnostic, enforcePersonalizationStopAfterMatch, excludedByGroupDiagnostic, keptByGroupDiagnostic, applyExclusionAndPersonalization, evaluate, evaluateWithDiagnostics, evaluateEdgeRuntimeAssignments, resolveCombinedEdgeEvaluation, escapeDeliveryRegex, matchSimpleDeliveryPattern, matchRegexDeliveryPattern, matchesDeliveryUrlRules, expandCriticalMutation, buildCriticalPathAssignments, runPostRevealReassert, schedulePostRevealReassert, revealExperimentContent, applyAssignmentCode, recordAppliedAssignment, appliedOwnerKeysForAssignment, applyAssignments, reassertAssignmentMutations, TeardownPage, TeardownRuntimeOptions, TeardownSelection, runAssignmentResetJs, pendingCommercePriceResolve, resolveCommercePricePending, unwireGoals, goalWiringEligible, reconcileGoals, reconcileHarnessPolling, reconcileCommercePrice, reconcileCommerceShipping, reconcileCartSync, syncGlobalRuntimes, configuredPageDeactivationModes, allAppliedPagesWithModes, rollbackArtifactOwner, unregisterArtifactOwner, executeTeardownTransaction, teardownTransaction, teardownArtifactsTransaction, DesiredArtifact, LiveArtifact, ArtifactReconcileResult, desiredArtifactSet, liveArtifactInventory, removeArtifactOwner, registerDesiredOwners, replayDesiredArtifacts, invalidateLiveArtifactsForReplay, reconcileArtifacts } from \"./assignment-runtime\";\nimport { generateQaSessionId, SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS, shopifyAssignmentSyncTimers, CommerceOnlyAdoptionState, commercePriceAdoptionState, ensureCommercePriceAdoptionState, currentCommercePriceContext, withCommercePriceAssignments, clearShopifyAssignmentSyncTimers, adoptAuthoritativePriceAssignments, OffersAdoptionPlan, planAuthoritativeOffersAdoption, canAdoptAuthoritativeOffersAssignments, adoptAuthoritativeOffersAssignments, sdkCartMintAllowed, buildSdkCartMintInput, buildScopedCartAttributeSyncInput, buildActiveCartAttributeSyncInput, sdkCartMintSync, syncSdkCartMint, removeSdkCartMintTrigger, onSdkCartMintClick, installSdkCartMintTrigger, HeadlessCartAuthorizationState, headlessCartAuthorizationState, ensureHeadlessCartAuthorizationState, hasChargeAffectingCommerceAssignment, hasActiveAuthorizationPlane, hasActivePriceAuthorizationPlane, hasActiveShippingAuthorizationPlane, hasActiveOffersAuthorizationPlane, hasActiveCommerceAuthorizationPlane, requiresCommerceCohortPin, getChargeAffectingCommerceExperimentIds, isCohortStampedOnCart, syncActiveAssignmentToShopifyCart, configureChargeCorrectnessCartSync, holdoutConfigEpoch, publishAssignmentsToShopify, scheduleShopifyAssignmentSync, variationsAllowed, updateProjectActivationDiagnostics, trackingAllowed, experimentById, targetingLifecycleMode, preservePersistentAssignments, stopAnalyticsStage, canMintVerifiedRedirectCarry, planRedirectAssignment, navigateForRedirectAssignment, RECONCILE_MAX_DRAINS, reevaluateAssignments, reevaluateAssignmentsPass, reapplyQaAssistantForceMap, reconcileForcedUnavailable, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, clearQaForceFromCurrentUrl, initWithExperiments } from \"./activation-runtime\";\n\n\nexport function loadQaToolbar(experiments: Experiment[]): void {\n if (!FEATURE_QA) return;\n try {\n import(\"./qa-toolbar\").then(({ mountQaToolbar }) => {\n mountQaToolbar({\n experiments,\n assignments: state.assignments,\n forceMap: state.forceMap,\n qaSessionId: state.qaSessionId,\n onSwitchVariation: (experimentId: string, variationId: string) => {\n if (!state.forceMap) state.forceMap = {};\n state.forceMap[experimentId] = variationId;\n persistQaForce(state.forceMap);\n // Re-evaluate with new force map\n if (state.config) {\n const exps = state.config.experiments ?? [];\n teardownTransaction(allAppliedPagesWithModes());\n const evaluation = evaluateWithDiagnostics(exps, {\n url: location.href,\n attributes: state.config.attributes ?? {},\n userId: state.userId!,\n persistSignals: persistentStorageAllowed(),\n storeOrigin: configuredStoreOrigins(state.config),\n exclusionGroups: state.config.exclusionGroups,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n }\n },\n onExitQa: () => {\n exitQaMode();\n location.reload();\n },\n onReloadLatest: () => {\n const assignment = activeHarnessAssignment(state.assignments);\n if (assignment?.harnessSession?.manifestUrl) {\n pollHarnessManifest(assignment.harnessSession.manifestUrl);\n }\n },\n onExitHarness: () => {\n const url = new URL(location.href);\n url.searchParams.delete(\"drip_harness\");\n history.replaceState(null, \"\", url.toString());\n location.reload();\n },\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"QA toolbar mounted\");\n }).catch(() => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"qa\", \"QA toolbar module not available\");\n });\n } catch {\n // Dynamic import not supported \u2014 skip toolbar\n }\n}\n\nexport function loadQaAssistant(onUnavailable?: () => void): void {\n if (!FEATURE_QA) {\n onUnavailable?.();\n return;\n }\n try {\n import(\"./qa-assistant\")\n .then(({ mountQaAssistant }) => {\n const view = mountQaAssistant();\n if (!view) onUnavailable?.();\n })\n .catch(() => onUnavailable?.());\n } catch {\n // Dynamic import not supported \u2014 fall back to the legacy toolbar.\n onUnavailable?.();\n }\n}\n\nexport function loadDevtoolsIfEnabled(experiments: Experiment[]): void {\n if (!FEATURE_DEVTOOLS || state.screenshotMode || !persistentStorageAllowed()) return;\n try {\n import(\"./devtools\").then(({ isDevtoolsEnabled }) => {\n if (isDevtoolsEnabled()) loadDevtools(experiments);\n }).catch(() => {});\n } catch {\n // Dynamic import not supported.\n }\n}\n\nexport function loadDevtools(experiments: Experiment[]): void {\n if (!FEATURE_DEVTOOLS) return;\n try {\n import(\"./devtools\").then(({ mountDevtools }) => {\n mountDevtools({\n experiments,\n assignments: state.assignments,\n diagnostics: getDiagnostics(),\n forceMap: state.forceMap,\n onForceVariation: (experimentId: string, variationId: string) => {\n if (!state.forceMap) state.forceMap = {};\n state.forceMap[experimentId] = variationId;\n // Re-evaluate with new force map\n if (state.config) {\n const exps = state.config.experiments ?? [];\n teardownTransaction(allAppliedPagesWithModes());\n const evaluation = evaluateWithDiagnostics(exps, {\n url: location.href,\n attributes: state.config.attributes ?? {},\n userId: state.userId!,\n persistSignals: persistentStorageAllowed(),\n storeOrigin: configuredStoreOrigins(state.config),\n exclusionGroups: state.config.exclusionGroups,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n // Re-mount devtools with updated state\n import(\"./devtools\").then(({ mountDevtools: remount }) => {\n remount({\n experiments: exps,\n assignments: state.assignments,\n diagnostics: getDiagnostics(),\n forceMap: state.forceMap,\n onForceVariation: () => {}, // Will be replaced on next full load\n });\n }).catch(() => {});\n }\n },\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", \"Devtools overlay mounted\");\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", \"Devtools overlay mounted\");\n }).catch(() => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"init\", \"Devtools module not available\");\n });\n } catch {\n // Dynamic import not supported \u2014 skip devtools\n }\n}\n\nexport function init(config: InitConfig): Assignment[] {\n installGlobalApi();\n markDripPerf(\"sdk_init_start\");\n runtimeSharedState.runtimeBootedTooLateForAntiFlicker ??= bootedTooLateForAntiFlicker();\n if (\n (config.runtimeFeatures?.sdkVariant === \"live\" || config.runtimeFeatures?.sdkVariant === \"heatmap\")\n && loadDebugBuild(config.debug, config.snippetUrl ?? SDK_SCRIPT_SRC, () => init(config))\n ) return [];\n // `drip_force=clear` is an escape hatch and must run before cookie-backed QA\n // detection so a poisoned reference tab cannot silently re-enter QA mode.\n clearQaForceFromCurrentUrl();\n // Remove redirect carry from the visible URL before any guard can return.\n // Keep the original URL in memory so the normal init path can still validate\n // and import the carry after consent and runtime guards have passed.\n const initialPageUrl =\n typeof location !== \"undefined\" ? location.href : undefined;\n if (initialPageUrl) stripRedirectAssignmentCarry(initialPageUrl);\n\n if (typeof window !== \"undefined\" && isEditorDevicePreview(window)) {\n revealAll();\n removeAntiFlicker();\n return [];\n }\n if (interceptEditorLaunch({\n configuredBundleUrl: config.editorBundleUrl,\n scriptSrc: SDK_SCRIPT_SRC,\n pageUrl: typeof location !== \"undefined\" ? location.href : undefined,\n onBeforeLoad: () => {\n revealAll();\n removeAntiFlicker();\n },\n onFailure: () => {\n init(config);\n },\n })) {\n return [];\n }\n\n const perfContext = createInitPerfContext();\n const earlyConsentRequired = resolveConsentRequired(config);\n const earlyConsentGranted = resolveConsentGranted(config, earlyConsentRequired);\n const earlyTrackingDisabledByDnt = doNotTrackEnabled(config);\n const earlyStorageAllowed = storageAllowed(earlyConsentRequired, earlyConsentGranted, earlyTrackingDisabledByDnt);\n configureIdentityStorage(earlyStorageAllowed ? config.dataProtection : { ...(config.dataProtection ?? {}), storageMode: \"memory\" });\n const earlyUserId = config.userId ?? null;\n configureDebug(config.debug, earlyUserId, { storageAllowed: earlyStorageAllowed });\n // Guards\n if (isDuplicate()) {\n state.consentRequired = earlyConsentRequired;\n state.consentGranted = earlyConsentGranted;\n state.trackingDisabledByDnt = earlyTrackingDisabledByDnt;\n state.screenshotMode = isScreenshotMode();\n const firstInstall = readRuntimeInstallClaim();\n const attemptedInstallSurface = telemetryLabel(config.installSurface, \"direct_script\");\n if (\n firstInstall\n && firstInstall.installSurface !== attemptedInstallSurface\n && claimInstallConflictEmission()\n ) {\n sendRuntimeEventNow(config, \"sdk_install_conflict\", {\n first_install_surface: firstInstall.installSurface,\n attempted_install_surface: attemptedInstallSurface,\n }, earlyUserId);\n }\n return [];\n }\n rememberRuntimeInstallClaim(config);\n if (isBot()) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: bot detected\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: bot detected\"); return []; }\n if (!config.spa?.allowIframes && isIframe()) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: iframe detected\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: iframe detected\"); return []; }\n if (isOptedOut({ storageAllowed: earlyStorageAllowed })) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: opted out\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: opted out\"); return []; }\n\n resetLoadDiagnostics(\"boot\");\n const runtimeConfig = resolveRuntimeConfig(config);\n addInitPhase(perfContext, \"guard_resolve_ms\", perfContext.startedAt);\n\n if (config.geo?.country) {\n setRuntimeSignal(\"geo.country\", config.geo.country, \"edge\");\n }\n\n // In edge-only mode, the client SDK should not evaluate or mutate.\n if (runtimeConfig.executionMode === \"edge\") {\n if (!edgeRuntimeActive() && typeof console !== \"undefined\") {\n console.warn(\"[drip] executionMode='edge' but no edge runtime detected; skipping client init\");\n }\n return [];\n }\n\n // Only a committed re-init resets the session attribution ledger. A guarded\n // no-op init (bot, iframe, duplicate, edge) must not wipe labels the session\n // already earned.\n runtimeSharedState.attributionLedger.clear();\n\n // Parse once before the visible URL is cleaned. A cached config may predate\n // the redirect experiment or its assignment epoch, so the parsed carry must\n // remain available to the authoritative network refresh.\n const urlRedirectCarry = initialPageUrl\n ? parseRedirectAssignmentCarry(initialPageUrl)\n : null;\n if (earlyStorageAllowed) {\n persistPendingRedirectAssignmentCarry(urlRedirectCarry);\n } else {\n clearPendingRedirectAssignmentCarry();\n }\n const parsedRedirectCarry = urlRedirectCarry\n ?? (earlyStorageAllowed ? readPendingRedirectAssignmentCarry() : null);\n const verifiedRedirectCarryPromise =\n parsedRedirectCarry && config.shopId && config.endpoint\n ? verifyRedirectAssignmentCarry(\n parsedRedirectCarry,\n config.shopId,\n (token) => verifyBucketingHandoverToken(config, token),\n )\n : Promise.resolve(null);\n\n // If experiments are provided inline, use them directly. An empty array is a\n // valid published project state and still needs analytics for install checks.\n if (Array.isArray(config.experiments)) {\n if (\n (parsedRedirectCarry && config.shopId && config.endpoint) ||\n (config.shopId && hasBucketingHandover(config.externalTracking))\n ) {\n const handoverPromise = config.shopId\n ? readBucketingHandover(\n config.externalTracking,\n config.shopId,\n (token) => verifyBucketingHandoverToken(config, token),\n )\n : Promise.resolve(null);\n void Promise.all([\n verifiedRedirectCarryPromise,\n handoverPromise,\n ]).then(([verifiedRedirectCarry, handover]) => {\n initWithExperiments(\n config,\n config.experiments!,\n \"inline\",\n perfContext,\n verifiedRedirectCarry,\n handover,\n );\n });\n return [];\n }\n const assignments = initWithExperiments(\n config,\n config.experiments,\n \"inline\",\n perfContext,\n );\n return assignments;\n }\n\n // If shopId is provided, fetch experiments from the API\n if (config.shopId && config.endpoint) {\n state.consentRequired = earlyConsentRequired;\n state.consentGranted = earlyConsentGranted;\n state.trackingDisabledByDnt = earlyTrackingDisabledByDnt;\n const forceMap = parseForceParam();\n const qaMode = isQaMode();\n const screenshotMode = isScreenshotMode();\n const serializedForceMap = serializeForceMap(forceMap);\n const environmentKey = config.environments?.activeKey || \"production\";\n const configUrl = new URL(normalizeEndpoint(config.endpoint) + \"/config\");\n configUrl.searchParams.set(\"shopId\", config.shopId);\n if (environmentKey !== \"production\") {\n configUrl.searchParams.set(\"env\", environmentKey);\n }\n const qaRequested = qaMode || screenshotMode;\n if (qaRequested) {\n configUrl.searchParams.set(\"drip_qa\", \"1\");\n if (serializedForceMap) {\n configUrl.searchParams.set(\"drip_force\", serializedForceMap);\n const harnessToken = new URLSearchParams(location.search).get(\"drip_harness\");\n if (harnessToken) {\n configUrl.searchParams.set(\"drip_harness\", harnessToken);\n }\n }\n }\n // QA responses are request-scoped and can contain diagnostics omitted from\n // the ordinary cached config, so interactive QA always fetches fresh data.\n const useConfigCache = earlyStorageAllowed && config.configCache !== false && !qaRequested;\n const cacheTtlMs = getConfigCacheTtlMs(config);\n const cached = useConfigCache\n ? readCachedExperiments(config.shopId, cacheTtlMs, environmentKey)\n : null;\n let navigateDeferredCachedRedirect: (() => boolean) | null = null;\n const handoverPromise = readBucketingHandover(\n config.externalTracking,\n config.shopId,\n (token) => verifyBucketingHandoverToken(config, token),\n );\n\n if (cached) {\n updateLoadDiagnostics({\n stage: \"config_cache_hit\",\n configFetchStatus: \"idle\",\n });\n const cachedConfig = cached.runtime\n ? withRuntimeSettings(config, cached.runtime, cached.profile)\n : { ...config, profile: cached.profile ?? config.profile };\n if (cached.geo?.country && !config.geo?.country) {\n setRuntimeSignal(\"geo.country\", cached.geo.country, \"edge\");\n }\n // Cached applies used to be effectively instant, making flicker cover\n // pointless \u2014 but under after_hydration (or a pre-init hold) the apply\n // is deferred, so the configured anti-flicker must stay on or repeat\n // visitors see the original DOM until the gate resolves.\n const cachedApplyDeferred =\n cachedConfig.spa?.applyTiming === \"after_hydration\" || hasMutationHold();\n const initCachedConfig = (\n verifiedHandover: Awaited<ReturnType<typeof readBucketingHandover>>,\n ) => {\n initWithExperiments(\n {\n ...cachedConfig,\n storeOrigin: cached.storeOrigin ?? cachedConfig.storeOrigin,\n storeOrigins: cached.storeOrigins ?? cachedConfig.storeOrigins,\n antiFlickerMode: cachedApplyDeferred ? cachedConfig.antiFlickerMode : \"off\",\n exclusionGroups: cached.exclusionGroups,\n signals: cached.signals ?? config.signals,\n commerce: cached.commerce,\n geo: cached.geo ?? cachedConfig.geo,\n holdout_v1_enabled: cached.holdout?.[0],\n holdout_pct: cached.holdout?.[1],\n holdout_config_updated_at: cached.holdout?.[2],\n },\n cached.experiments,\n \"cache\",\n perfContext,\n cachedVerifiedRedirectCarry,\n verifiedHandover,\n );\n const cachedRuntimeConfig = state.config;\n const cachedRuntimeExperiments =\n cachedRuntimeConfig?.experiments ?? cached.experiments;\n if (!cachedRuntimeConfig) return;\n const cachedRedirectPlan = planRedirectAssignment(\n cachedRuntimeConfig,\n cachedRuntimeExperiments,\n state.assignments,\n );\n if (!cachedRedirectPlan) return;\n // Cached init deliberately defers redirects until the authoritative\n // refresh confirms them. Hold a full-page SDK guard for that bounded\n // wait so the snippet's independent safety timeout cannot paint the\n // source page before confirmation. Explicitly replace any shorter\n // cached-init guard: applyAntiFlicker otherwise preserves its live\n // timer rather than extending it.\n removeAntiFlicker();\n applyRuntimeAntiFlicker(\n \"full\",\n CACHED_REDIRECT_HIDE_TIMEOUT_MS,\n );\n navigateDeferredCachedRedirect = () => {\n if (\n state.config !== cachedRuntimeConfig ||\n state.configSource !== \"cache\"\n ) {\n return false;\n }\n return navigateForRedirectAssignment(\n cachedRuntimeConfig,\n cachedRuntimeExperiments,\n state.assignments,\n );\n };\n };\n let cachedVerifiedRedirectCarry: VerifiedRedirectCarry | null = null;\n if (parsedRedirectCarry && config.shopId && config.endpoint) {\n void Promise.all([\n verifiedRedirectCarryPromise,\n handoverPromise,\n ]).then(([verifiedRedirectCarry, verifiedHandover]) => {\n cachedVerifiedRedirectCarry = verifiedRedirectCarry;\n initCachedConfig(verifiedHandover);\n });\n } else if (hasBucketingHandover(config.externalTracking)) {\n void handoverPromise.then(initCachedConfig);\n } else {\n initCachedConfig(null);\n }\n }\n\n // Always apply anti-flicker during async fetch to prevent FOUC. Forced QA\n // fetches may not have scoped selectors until the fresh config arrives, so\n // use a QA-only full-page guard instead of letting the page paint stale UI.\n const asyncFetchAntiFlickerIntended = !cached && runtimeConfig.antiFlickerMode !== \"off\";\n if (asyncFetchAntiFlickerIntended) {\n const asyncFetchAntiFlickerMode =\n runtimeConfig.antiFlickerMode === \"scoped\" && (qaMode || screenshotMode) && serializedForceMap\n ? \"full\"\n : runtimeConfig.antiFlickerMode;\n applyRuntimeAntiFlicker(\n asyncFetchAntiFlickerMode,\n runtimeConfig.antiFlickerTimeoutMs,\n undefined,\n runtimeConfig.antiFlickerCustomCss,\n );\n }\n\n const configFetchStartedAt = Date.now();\n if (!cached) perfContext.includesConfigFetch = true;\n const antiFlickerFetchBudgetMs = asyncFetchAntiFlickerIntended\n ? Math.max(runtimeConfig.antiFlickerTimeoutMs, 300)\n : null;\n const hardRevealDeadline = antiFlickerFetchBudgetMs !== null\n ? configFetchStartedAt + antiFlickerFetchBudgetMs\n : null;\n updateLoadDiagnostics({\n stage: \"config_fetch_started\",\n configFetchStartedAt,\n configFetchAttempts: 0,\n configFetchStatus: \"loading\",\n });\n\n fetchWithRetry(configUrl.toString(), CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, {\n timeoutMs: DEFAULT_CONFIG_FETCH_TIMEOUT_MS,\n firstAttemptTimeoutMs: antiFlickerFetchBudgetMs !== null\n ? Math.min(DEFAULT_CONFIG_FETCH_TIMEOUT_MS, antiFlickerFetchBudgetMs)\n : DEFAULT_CONFIG_FETCH_TIMEOUT_MS,\n slowMs: DEFAULT_CONFIG_FETCH_SLOW_MS,\n onAttemptStart: (attempt) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_attempt\",\n configFetchStartedAt,\n configFetchAttempts: attempt,\n configFetchStatus: attempt === 1 ? \"loading\" : state.load.configFetchStatus,\n });\n },\n onSlow: ({ attempt, elapsedMs }) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_slow\",\n configFetchStartedAt,\n configFetchAttempts: attempt,\n configFetchMs: Date.now() - configFetchStartedAt,\n configFetchStatus: \"slow\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"init\", `Config fetch attempt ${attempt} is slow after ${elapsedMs}ms`);\n },\n onAttemptEnd: (info) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_attempt_complete\",\n configFetchStartedAt,\n configFetchAttempts: info.attempt,\n configFetchMs: Date.now() - configFetchStartedAt,\n configFetchStatus: info.timedOut ? \"timeout\" : state.load.configFetchStatus,\n configFetchStatusCode: info.status,\n configFetchError: info.error,\n });\n },\n })\n .then((res) => {\n if (!res.ok) throw new Error(\"Failed to fetch config: \" + res.status);\n return res.json();\n })\n .then(async (data: {\n experiments?: Experiment[];\n storeOrigin?: string;\n storeOrigins?: string[];\n exclusionGroups?: ExclusionGroupConfig[];\n profile?: InitConfig[\"profile\"];\n runtime?: unknown;\n signals?: RuntimeSignalDefinition[];\n commerce?: InitConfig[\"commerce\"];\n qa_warnings?: InitConfig[\"qa_warnings\"];\n holdout_v1_enabled?: boolean;\n holdout_pct?: number;\n holdout_config_updated_at?: string | null;\n geo?: { country?: string };\n }) => {\n const [verifiedRedirectCarry, verifiedHandover] = await Promise.all([\n verifiedRedirectCarryPromise,\n handoverPromise,\n ]);\n const configFetchCompletedAt = Date.now();\n updateLoadDiagnostics({\n stage: \"config_fetch_complete\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: configFetchCompletedAt - configFetchStartedAt,\n configFetchStatus: \"ok\",\n });\n const experiments = data.experiments ?? [];\n const storeOrigin =\n typeof data.storeOrigin === \"string\"\n ? data.storeOrigin\n : config.storeOrigin;\n const storeOrigins = Array.isArray(data.storeOrigins)\n ? data.storeOrigins.filter(\n (origin): origin is string => typeof origin === \"string\",\n )\n : config.storeOrigins;\n const exclusionGroups = Array.isArray(data.exclusionGroups)\n ? data.exclusionGroups\n : undefined;\n const profile = data.profile;\n const runtime = data.runtime;\n const signals = Array.isArray(data.signals) ? data.signals : config.signals;\n // Omission is authoritative: it represents an empty commerce plane and\n // must clear any cached/active treatment rather than inherit init input.\n const commerce = data.commerce;\n const geo = data.geo;\n const countryChanged = Boolean(\n geo?.country && getStoredSignals({ markVisitorSeen: false })[\"geo.country\"] !== geo.country,\n );\n if (geo?.country) setRuntimeSignal(\"geo.country\", geo.country, \"edge\");\n const configWithRuntime = {\n ...withRuntimeSettings(config, runtime, profile),\n storeOrigin,\n storeOrigins,\n exclusionGroups,\n signals,\n commerce,\n qa_warnings: data.qa_warnings,\n holdout_v1_enabled: data.holdout_v1_enabled,\n holdout_pct: data.holdout_pct,\n holdout_config_updated_at: data.holdout_config_updated_at,\n };\n const runtimeConsentRequired = resolveConsentRequired(configWithRuntime);\n const runtimeStorageAllowed = storageAllowed(\n runtimeConsentRequired,\n resolveConsentGranted(configWithRuntime, runtimeConsentRequired),\n doNotTrackEnabled(configWithRuntime),\n );\n if (useConfigCache && runtimeStorageAllowed) {\n writeCachedExperiments(\n config.shopId!,\n experiments,\n storeOrigin,\n storeOrigins,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n data.holdout_v1_enabled,\n data.holdout_pct,\n data.holdout_config_updated_at,\n geo,\n environmentKey,\n );\n }\n const incomingHash = hashConfigPayload(\n experiments,\n storeOrigin,\n storeOrigins,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n data.holdout_v1_enabled,\n data.holdout_pct,\n data.holdout_config_updated_at,\n );\n const cacheUnchanged = cached && cached.hash && cached.hash === incomingHash && !countryChanged;\n if (cacheUnchanged && !verifiedHandover) {\n // The cached apply may still be gated behind hydration; revealing\n // now would undo the anti-flicker kept for exactly that window.\n // The gated applyAssignments() reveals when it runs.\n const navigated = navigateDeferredCachedRedirect?.() ?? false;\n if (!state.pendingInitialApply && !navigated) removeAntiFlicker();\n return;\n }\n const lateConfigPolicy = ((qaMode || screenshotMode) && serializedForceMap)\n ? \"apply\"\n : config.lateConfigPolicy ?? \"skip\";\n const arrivedAfterReveal = hardRevealDeadline !== null && configFetchCompletedAt > hardRevealDeadline;\n if (arrivedAfterReveal && lateConfigPolicy === \"skip\") {\n const elapsedMs = configFetchCompletedAt - configFetchStartedAt;\n updateLoadDiagnostics({\n stage: \"late_config_skip\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: elapsedMs,\n configFetchStatus: \"ok\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", \"late_config_skip\", { elapsedMs });\n removeAntiFlicker();\n return;\n }\n // Remove the initial barrier before re-init. Preserve the configured\n // mode so fetched non-commerce mutations get the same scoped hiding as\n // inline mutations; commerce modules can add selectors to that scope.\n removeAntiFlicker();\n initWithExperiments(\n configWithRuntime,\n experiments,\n \"network\",\n cached ? createInitPerfContext() : perfContext,\n verifiedRedirectCarry,\n verifiedHandover,\n );\n })\n .catch((err) => {\n const configFetchCompletedAt = Date.now();\n const error = err instanceof Error ? err.message : String(err);\n updateLoadDiagnostics({\n stage: \"config_fetch_failed\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: configFetchCompletedAt - configFetchStartedAt,\n configFetchStatus: state.load.configFetchStatus === \"timeout\" ? \"timeout\" : \"failed\",\n configFetchError: error,\n });\n if (typeof console !== \"undefined\") {\n console.error(\"[drip] Failed to fetch experiments:\", err);\n }\n sendRuntimePerfNow(config, {\n perf_event_kind: \"init\",\n assignment_ready_ms: 0,\n // domContentLoadedEventStart - navigationStart. Keep the old alias\n // for one release while Tinybird consumers move to the clear name.\n dom_content_loaded_ms: getBlankScreenMs(),\n blank_screen_ms: getBlankScreenMs(),\n ...collectDeliveryTiming(numberPerf(readDripPerf(), \"sdk_init_start\"), SDK_SCRIPT_SRC),\n sdk_variant: telemetryLabel(config.runtimeFeatures?.sdkVariant, \"live\"),\n platform: resolvePlatform(config),\n config_source: cached ? \"cache\" : \"none\",\n config_fetch_status: state.load.configFetchStatus,\n config_fetch_ms: state.load.configFetchMs,\n config_fetch_attempts: state.load.configFetchAttempts,\n config_fetch_error: error,\n activation_mode: resolveActivationMode(config),\n delivery_state: typeof config.deliveryState === \"string\" ? config.deliveryState : undefined,\n script_cache_source: typeof config.scriptCacheSource === \"string\" ? config.scriptCacheSource : undefined,\n }, earlyUserId);\n // A cached treatment can still be waiting behind hydration. Keep its\n // barrier on fetch failure; the gated apply reveals when it completes.\n const navigated = navigateDeferredCachedRedirect?.() ?? false;\n if (!state.pendingInitialApply && !navigated) removeAntiFlicker();\n });\n\n return []; // Assignments will be applied async\n }\n\n // No experiments and no shopId \u2013 just initialize tracker\n const assignments = initWithExperiments(\n config,\n [],\n \"none\",\n perfContext,\n );\n return assignments;\n}\n\nexport function trackEvent(\n type: string,\n data?: Record<string, unknown>,\n experimentId?: string,\n variationId?: string,\n eventId?: string,\n forceUnassigned = false,\n timestamp?: number,\n): void {\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // A held SPA route still has the previous route's assignments in state.\n // Replay every event after the gate, even when the tracker is already\n // running, so attribution and goal evaluation use the refreshed route.\n void state.pendingInitialApply.then(() => {\n trackEvent(type, data, experimentId, variationId, eventId, forceUnassigned, timestamp);\n });\n return;\n }\n captureEventPropertySignals(type, data);\n startAnalyticsIfReady();\n if (!state.tracker) {\n return;\n }\n const activeAssignment = forceUnassigned\n ? undefined\n : state.assignments.find(exposable) ?? state.assignments.find(attributable);\n const resolvedExperimentId = forceUnassigned ? undefined : experimentId ?? activeAssignment?.experimentId;\n const resolvedVariationId = forceUnassigned ? undefined : variationId ?? activeAssignment?.variationId;\n // Empty types keep their existing quarantine path; normalizing them would\n // silently invent a \"custom_event\" the customer never sent.\n const wireType =\n EVENT_TYPE_PATTERN.test(type) || !type.trim() ? type : normalizeEventName(type);\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"track\", `${type}`, { experimentId: resolvedExperimentId, variationId: resolvedVariationId, data });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", `${type}`, { experimentId: resolvedExperimentId, variationId: resolvedVariationId, ...data });\n const event: TrackEvent = {\n type: wireType,\n data: withAssignmentEpochData(data, resolvedExperimentId, resolvedVariationId),\n url: cleanUrl(),\n experimentId: resolvedExperimentId,\n variationId: resolvedVariationId,\n event_id: eventId,\n ts: timestamp,\n };\n state.tracker.track(event);\n if (wireType !== \"goal\" && state.config) {\n triggerGoalsForEvent(\n wireType,\n state.assignments.filter(attributable),\n state.config.experiments ?? [],\n data,\n );\n }\n}\n\nexport function track(\n type: string,\n data?: Record<string, unknown>,\n experimentId?: string,\n variationId?: string,\n): void {\n trackEvent(type, data, experimentId, variationId);\n}\n\nexport function funnelStepStorageKey(stepName: string): string {\n const path =\n typeof location !== \"undefined\"\n ? `${location.origin ?? \"\"}${location.pathname ?? \"\"}`\n : \"unknown\";\n return `drip:funnel_step:${path}:${stepName}`.slice(0, 240);\n}\n\nexport function shouldTrackFunnelStep(stepName: string, oncePerSession: boolean): boolean {\n if (!oncePerSession || typeof sessionStorage === \"undefined\") return true;\n const key = funnelStepStorageKey(stepName);\n try {\n if (sessionStorage.getItem(key) === \"1\") return false;\n sessionStorage.setItem(key, \"1\");\n } catch {\n return true;\n }\n return true;\n}\n\n/**\n * Track a virtual funnel step that has no reliable browser event by default,\n * such as a postcode form submit, embedded quiz step, or third-party handoff.\n */\nexport function trackStep(name: string, data?: Record<string, unknown>): void {\n const stepName = name.trim().slice(0, 160);\n if (!stepName) return;\n if (state.screenshotMode || trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // Virtual funnel steps can fire from data layers before the hydration\n // gate creates the tracker. Replay after apply so the step is preserved\n // and attributed to the refreshed assignment set.\n void state.pendingInitialApply.then(() => {\n trackStep(stepName, data);\n });\n return;\n }\n if (!state.tracker) return;\n const oncePerSession = data?.oncePerSession !== false;\n if (!shouldTrackFunnelStep(stepName, oncePerSession)) return;\n const payload = { ...(data ?? {}) };\n delete payload.oncePerSession;\n track(\"funnel_step\", {\n ...payload,\n source: \"virtual_step\",\n step_name: stepName,\n path: typeof location !== \"undefined\" ? location.pathname : undefined,\n });\n}\n\nexport function trackGoal(goalId: string, data?: Record<string, unknown>): void {\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (!state.config) return;\n if (state.pendingInitialApply) {\n // Goal wiring is installed after the gated initial apply; firing now\n // would be a silent no-op. Replay once the gate opens, like track().\n void state.pendingInitialApply.then(() => {\n trackGoal(goalId, data);\n });\n return;\n }\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"goal\", `Triggering goal: ${goalId}`, data);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"goal\", `Goal: ${goalId}`, data as Record<string, unknown> | undefined);\n triggerGoal(\n goalId,\n state.assignments.filter(attributable),\n state.config.experiments ?? [],\n data,\n );\n}\n\nexport function setConsent(granted: boolean): void {\n state.consentGranted = Boolean(granted);\n writeConsentCookie(state.consentGranted);\n if (!state.consentGranted) {\n clearEarlyInteractions();\n }\n\n if (!state.config) {\n if (!state.consentGranted) clearConsentStorage();\n return;\n }\n applyConsentStorageMode();\n recheckPrerequisites();\n // Stop live capture before the purge so discard teardown cannot restore replay progress.\n if (!state.consentGranted) clearConsentStorage();\n if (state.consentGranted) {\n removeSdkCartMintTrigger();\n syncActiveAssignmentToShopifyCart();\n scheduleShopifyAssignmentSync();\n }\n}\n\nexport function hold(): number {\n return holdMutations();\n}\n\nexport function release(): number {\n return releaseMutations();\n}\n\nexport function hydrated(): void {\n signalHydrated();\n}\n\nexport function recheckPrerequisites(): void {\n if (!state.config) return;\n const experiments = state.config.experiments ?? [];\n const emptyProjectFastPath = state.config.runtimeProfile === \"empty_project\"\n && state.perfFlags.perf_empty_project_v1;\n state.trackingPrerequisiteMet = emptyProjectFastPath || trackingAllowed(state.config);\n syncStorefrontVitals();\n if (!emptyProjectFastPath) updateProjectActivationDiagnostics(state.config);\n reevaluateAssignments(\"prerequisite\");\n\n if (trackingBlocked() || !state.trackingPrerequisiteMet) {\n stopAnalyticsStage();\n return;\n }\n\n if (state.trackingStart === \"idle\") {\n scheduleAnalyticsStart(state.config, experiments);\n } else {\n startAnalyticsStage(state.config, experiments);\n }\n}\n\nexport function reInit(forceReapply = false): Assignment[] {\n if (!runtimeSharedState.clearingQaForceFromRoute) {\n runtimeSharedState.clearingQaForceFromRoute = true;\n try {\n if (clearQaForceFromUrl()) {\n location.reload();\n return state.assignments;\n }\n } finally {\n runtimeSharedState.clearingQaForceFromRoute = false;\n }\n }\n const assignments = reevaluateAssignments(\"manual\", forceReapply);\n state.orderIdentityDetectionUrl = \"\";\n state.orderIdentityDetection = undefined;\n if (state.config) scheduleOrderIdentityBeacon(state.config);\n return assignments;\n}\n\n/**\n * Track a revenue/purchase event. Convenience method that fires a \"purchase\" event\n * with revenue data for all active experiments.\n *\n * Usage: drip.trackRevenue(49.99) or drip.trackRevenue(49.99, { orderId: \"123\", currency: \"EUR\" })\n */\nexport type RevenueEventData = Record<string, unknown> & { currency?: string };\n\nexport function normalizeRevenueCurrency(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const currency = value.trim().toUpperCase();\n return /^[A-Z]{3}$/.test(currency) ? currency : undefined;\n}\n\nexport function trackRevenue(revenue: number, data?: RevenueEventData): void {\n if (typeof revenue !== \"number\" || !Number.isFinite(revenue) || revenue < 0) {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] trackRevenue ignored invalid revenue; expected a finite, non-negative number\");\n }\n return;\n }\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // Initial and route hydration gates defer tracker creation/assignment\n // refresh. Replay purchases after the gate so early checkout data-layer\n // events are not dropped or attributed to stale assignments.\n void state.pendingInitialApply.then(() => {\n trackRevenue(revenue, data);\n });\n return;\n }\n if (!state.tracker) return;\n const eventData: Record<string, unknown> = { ...data, revenue };\n if (data && \"currency\" in data) {\n const currency = normalizeRevenueCurrency(data.currency);\n if (currency) {\n eventData.currency = currency;\n } else {\n delete eventData.currency;\n eventData.currency_raw = data.currency;\n eventData.money_error = \"invalid_currency\";\n }\n }\n // A purchase is one semantic event even though attribution fans it out to\n // every active assignment. Sharing its ID lets program-level analytics\n // collapse the fanout while assignment-scoped analytics retains each copy.\n const eventId = createEventId();\n // Fire for each clean, delivery-resolved experiment assignment. Preserve\n // the purchase as an unassigned shop-level event while mutation delivery is\n // pending rather than attaching it to a variant that may still roll back.\n const attributableAssignments = state.assignments.filter(attributable);\n if (attributableAssignments.length === 0) {\n // Keep purchases that occurred while a real assignment was suppressed,\n // plus both holdout-v1 cohorts, at shop scope. A visitor with no assignment\n // under ordinary non-holdout bucketing remains silent as before.\n if (state.assignments.length > 0 || state.config?.holdout_v1_enabled === true) {\n trackEvent(\"goal\", { ...eventData, goalId: \"__revenue__\" }, undefined, undefined, eventId, true);\n }\n return;\n }\n for (const a of attributableAssignments) {\n trackEvent(\"goal\", { ...eventData, goalId: \"__revenue__\" }, a.experimentId, a.variationId, eventId);\n }\n}\n\nexport function flush(): Promise<void> {\n if (state.screenshotMode) return Promise.resolve();\n const pendingApply = state.pendingInitialApply;\n if (pendingApply) {\n // Deferred public tracking callbacks are registered before the caller's\n // flush(). Wait for the gate, then recurse so every replayed event has\n // entered the tracker queue before the returned promise resolves.\n return pendingApply.then(() => flush());\n }\n startAnalyticsIfReady();\n return state.tracker ? state.tracker.flush() : Promise.resolve();\n}\n\nexport function getAssignments(): Assignment[] {\n return state.assignments;\n}\n\nexport function buildCurrentCartAttributes(scopedInput: CartAttributeSyncInput | null): CartAttributeEntry[] {\n if (scopedInput) {\n return buildCartAttributeEntries(scopedInput)\n .filter(({ key }) => key === \"apex_assignments\");\n }\n const input = buildSdkCartMintInput()\n ?? buildActiveCartAttributeSyncInput();\n return input ? buildCartAttributeEntries(input) : [];\n}\n\nexport function getCartAttributes(): CartAttributeEntry[] {\n return buildCurrentCartAttributes(buildScopedCartAttributeSyncInput());\n}\n\nexport function getCartMetafields(options?: { namespace?: string }): CartMetafieldInput[] {\n const input = buildActiveCartAttributeSyncInput();\n if (!input) return [];\n const namespace = normalizeCartMetafieldNamespace(options?.namespace);\n return buildCartMetafieldInputs(input, namespace);\n}\n\n/** Return cart-metafield keys that must be deleted to clear the previous mirror. */\nexport function getCartMetafieldStaleKeys(options?: { namespace?: string }): string[] {\n const namespace = normalizeCartMetafieldNamespace(options?.namespace);\n return collectCartMetafieldStaleKeys(getCartMetafields({ namespace }), namespace);\n}\n\n/** Replace entries supplied by the fresh Apex stamp while preserving valid cart attributes. */\nexport function mergeCartAttributes(existing: unknown): CartAttributeEntry[] {\n const scopedInput = buildScopedCartAttributeSyncInput();\n const scopedActive = scopedInput !== null;\n const fresh = buildCurrentCartAttributes(scopedInput);\n const freshKeys = new Set(fresh.map((entry) => entry.key));\n const replacedKeys = sdkCartMintAllowed() || scopedActive\n ? APEX_CART_ATTRIBUTE_KEYS\n : freshKeys;\n const preserved: CartAttributeEntry[] = [];\n\n for (const entry of Array.isArray(existing) ? existing : []) {\n if (!entry || typeof entry !== \"object\") continue;\n const { key, value } = entry as { key?: unknown; value?: unknown };\n if (typeof key !== \"string\" || typeof value !== \"string\" || replacedKeys.has(key)) continue;\n preserved.push({ key, value });\n }\n\n return [...preserved, ...fresh];\n}\n\nexport function normalizedHeadlessCartToken(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const withoutQuery = value.trim().split(\"?\", 1)[0] ?? \"\";\n const token = withoutQuery.startsWith(\"gid://shopify/Cart/\")\n ? withoutQuery.slice(\"gid://shopify/Cart/\".length)\n : withoutQuery;\n return token.length > 0 && token.length <= 4096 ? token : null;\n}\n\n/**\n * Build cart attributes for a headless Shopify Storefront API cart.\n *\n * Integrator contract: pass the cart's full Storefront Cart GID (including its\n * `?key=` secret), write every returned entry to that same cart, and verify the\n * Storefront API mutation succeeded with no `userErrors`. Only then call\n * {@link confirmCartAttributesWritten} with the same Cart GID. Returning signed\n * attributes does not authorize treatment display or exposure by itself. An\n * empty result is fail-closed and must not be replaced with unsigned attributes.\n * Theme storefronts use the SDK-managed `/cart/update.js` path and do not call\n * either headless API.\n */\nexport async function getSignedCartAttributes(\n cartToken?: string,\n): Promise<CartAttributeEntry[]> {\n const requiresCohortPin = requiresCommerceCohortPin();\n const input = buildActiveCartAttributeSyncInput(requiresCohortPin);\n if (!input) return [];\n const headless = ensureHeadlessCartAuthorizationState();\n const generation = ++headless.generation;\n // A public headless write takes ownership from any SDK-managed theme sync\n // that was still resolving when the integrator selected this cart.\n runtimeSharedState.shopifyCartSyncGeneration += 1;\n headless.confirmationPending = requiresCohortPin;\n headless.pending = null;\n if (requiresCohortPin) {\n state.authorizedPriceAssignmentKeys?.clear();\n state.authorizedShippingAssignmentKeys?.clear();\n // A headless generation for a (possibly different) cart revokes the\n // previous cart's offer grant and retires its rendered treatment \u2014 cart\n // B was never stamped, so keeping cart A's offer DOM would show an offer\n // Shopify will not charge if B's authorization or write fails.\n revokeOffersDisplayAuthorization();\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"pending\",\n assignmentCount: state.assignments.length,\n };\n cleanupCommercePrice();\n cleanupCommerceShipping();\n }\n let priceAssignments: CartAssignment[] = [];\n let shippingAssignments: CartAssignment[] = [];\n let offersAssignments: CartAssignment[] = [];\n let offersAdoptionAssignments: CartAssignment[] | null = null;\n const entries = await buildSignedCartAttributeEntries({\n ...input,\n cartToken,\n authorizePriceDisplayAssignments: (assignments) => {\n priceAssignments = assignments;\n },\n authorizeShippingDisplayAssignments: (assignments) => {\n shippingAssignments = assignments;\n },\n authorizeOffersDisplayAssignments: (assignments) => {\n offersAssignments = assignments;\n },\n stageOffersAdoptionAssignments: (assignments) => {\n offersAdoptionAssignments = assignments;\n },\n });\n if (generation !== headless.generation) return [];\n const normalizedCartToken = normalizedHeadlessCartToken(cartToken);\n if (entries.length === 0 && requiresCohortPin) {\n headless.confirmationPending = false;\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"failed\",\n reason: \"authorization_failed\",\n assignmentCount: state.assignments.length,\n };\n // Reconcile from the render plane instead of a hand-picked list; the cart\n // step is skipped because this runs inside the cart-authorization path.\n syncGlobalRuntimes({ skipCartSync: true });\n return [];\n }\n if (entries.length > 0 && requiresCohortPin && normalizedCartToken) {\n headless.pending = {\n generation,\n cartToken: normalizedCartToken,\n priceAssignments,\n shippingAssignments,\n offersAssignments,\n offersAdoptionAssignments,\n };\n // Authorization/adoption may rebuild commerce render state while the proof\n // request resolves; keep the generated-but-unacknowledged state published.\n // Reconcile from the render plane instead of a hand-picked list; the cart\n // step is skipped because this runs inside the cart-authorization path.\n syncGlobalRuntimes({ skipCartSync: true });\n }\n return entries;\n}\n\n/**\n * Acknowledge that the latest signed headless cart attributes were persisted.\n *\n * Call this only after the Storefront API cart-attributes mutation succeeded\n * and returned no `userErrors`. The Cart GID must match the one passed to the\n * latest {@link getSignedCartAttributes} call. Stale-generation, mismatched,\n * or repeated acknowledgements are no-ops and cannot grant or change display\n * and exposure authorization. When a staged offer adoption can no longer\n * apply, the acknowledgement is rejected (`false`) with retryable pending\n * state and no authorization is granted.\n *\n * @returns `true` only when the latest matching acknowledgement was accepted.\n */\nexport function confirmCartAttributesWritten(cartToken?: string): boolean {\n const normalizedCartToken = normalizedHeadlessCartToken(cartToken);\n const headless = headlessCartAuthorizationState;\n const pending = headless?.pending;\n if (\n !normalizedCartToken ||\n !headless ||\n !pending ||\n pending.generation !== headless.generation ||\n pending.cartToken !== normalizedCartToken\n ) return false;\n\n // The integrator has confirmed the stamped cart write \u2014 only now may a\n // staged offers adoption reach display, persistence, and tracking. When the\n // adoption can no longer apply (config changed between generation and\n // acknowledgement), keep the pending state retryable, withhold every\n // authorization grant, and tell the integrator the acknowledgement was NOT\n // accepted so stale local assignments cannot be exposed as confirmed.\n if (\n pending.offersAdoptionAssignments &&\n !adoptAuthoritativeOffersAssignments(pending.offersAdoptionAssignments)\n ) {\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"failed\",\n reason: \"offers_adoption_failed\",\n assignmentCount: state.assignments.length,\n };\n return false;\n }\n headless.pending = null;\n headless.confirmationPending = false;\n state.authorizedPriceAssignmentKeys = new Set(\n pending.priceAssignments.map(priceAssignmentAuthorizationKey),\n );\n state.authorizedShippingAssignmentKeys = new Set(\n pending.shippingAssignments.map(priceAssignmentAuthorizationKey),\n );\n // Same render path as the theme flow: withheld offer companion DOM must\n // appear once the integrator's write is acknowledged, or exposure could\n // record a treatment whose DOM never rendered while Shopify charges it.\n authorizeOffersDisplayAndRender(pending.offersAssignments);\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"sent\",\n assignmentCount: state.assignments.length,\n };\n // Same rule as the authorization path: the acknowledged write republishes\n // the render plane, never a page-independent assignment list.\n syncGlobalRuntimes({ skipCartSync: true });\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n return true;\n}\n\nexport function getExperiments(): Experiment[] {\n return state.config?.experiments ?? [];\n}\n\nexport function getGoals(): Goal[] {\n const seen = new Set<string>();\n const goals: Goal[] = [];\n for (const experiment of getExperiments()) {\n for (const goal of experiment.goals ?? []) {\n if (seen.has(goal.id)) continue;\n seen.add(goal.id);\n goals.push(goal);\n }\n }\n return goals;\n}\n\nexport function getActiveExperimentIds(): Record<string, string> {\n const ids: Record<string, string> = {};\n for (const assignment of state.assignments) {\n ids[assignment.experimentId] = assignment.variationId;\n }\n return ids;\n}\n\nexport function getRuntimeValue(key: string): unknown {\n switch (key) {\n case \"tools\":\n return getRuntimeTools();\n case \"experiments\":\n return getExperiments();\n case \"goals\":\n return getGoals();\n case \"assignments\":\n return getAssignments();\n case \"activeAssignments\":\n return getAssignments();\n case \"activeExperimentIds\":\n return getActiveExperimentIds();\n case \"orderAttribution\":\n // Same consent chokepoint as the order-identity beacon: while tracking\n // is blocked, no identity or assignments leave the SDK on any surface.\n if (state.screenshotMode || trackingBlocked()) {\n return { visitorId: \"\", assignments: [] };\n }\n return {\n visitorId: state.userId ?? \"\",\n assignments: mergedOrderIdentityAssignments(),\n ...(state.shopwareAttributionEnvelope ? { envelope: state.shopwareAttributionEnvelope } : {}),\n };\n case \"signals\":\n return getPublicSignals({ markVisitorSeen: false });\n case \"diagnostics\":\n return getDiagnostics();\n case \"data\":\n return {\n initialized: Boolean(state.config),\n shopId: state.config?.shopId ?? null,\n experimentsLoaded: state.config?.experiments?.length ?? 0,\n };\n default:\n return undefined;\n }\n}\n\nexport function getRuntimeTools(): ApexRuntimeTools {\n return createApexRuntimeTools({\n document: typeof document !== \"undefined\" ? document : undefined,\n window: typeof window !== \"undefined\" ? window : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n track,\n trackGoal,\n signal: setPublicSignal,\n reInit,\n get: getRuntimeValue,\n });\n}\n\nexport function buildFlagContext(\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n) {\n const url = context?.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n return {\n url,\n attributes: buildTargetingAttributes(\n { ...(state.config?.attributes ?? {}), ...(context?.attributes ?? {}) },\n url,\n { persistSignals: persistentStorageAllowed() },\n ),\n userId: context?.userId ?? state.userId ?? undefined,\n forceMap: state.forceMap ?? undefined,\n };\n}\n\nexport function evaluateFlag(\n flagId: string,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): boolean {\n return evaluateFlagFromExperiments(flagId, getExperiments(), buildFlagContext(context));\n}\n\nexport function evaluateFlagAssignment(\n flagId: string,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): Assignment | null {\n return evaluateFlagAssignmentFromExperiments(\n flagId,\n getExperiments(),\n buildFlagContext(context),\n );\n}\n\nexport function evaluateFlagValue<T = unknown>(\n flagId: string,\n fallback?: T,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): T | unknown {\n return evaluateFlagValueFromExperiments(\n flagId,\n getExperiments(),\n buildFlagContext(context),\n fallback,\n );\n}\n\nexport function getDiagnostics(): SdkDiagnostics {\n const config = state.config;\n const runtimeConfig = state.runtimeConfig;\n const storageMode = config?.dataProtection?.storageMode ?? \"localStorage\";\n const signalDiagnostics = getSignalDiagnostics({ markVisitorSeen: persistentStorageAllowed() });\n const diagnostics: SdkDiagnostics = {\n mode: \"public\",\n initialized: Boolean(config),\n shopId: config?.shopId ?? null,\n userIdPresent: Boolean(state.userId),\n assignments: state.assignments.map((assignment) => {\n const kind =\n assignment.kind ??\n (assignment.personalization\n ? \"personalization\"\n : assignment.featureFlag\n ? \"feature_flag\"\n : \"experiment\");\n return {\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n kind,\n isControl: assignment.isControl,\n mutationCount: assignment.mutations.length,\n featureFlagKey: assignment.featureFlag?.key,\n personalizationKey: assignment.personalization?.key,\n personalizationRuleId: assignment.personalization?.ruleId,\n personalizationExperienceId: assignment.personalization?.experienceId,\n personalizationSurface: assignment.personalization?.surface,\n personalizationTemplateKey: assignment.personalization?.templateKey,\n personalizationPriority: assignment.personalization?.priority,\n personalizationStopAfterMatch: assignment.personalization?.stopAfterMatch,\n value: assignment.value,\n };\n }),\n pageActivation: pageActivationDiagnosticRows({\n includePageNames: isDebugEnabled(),\n }),\n experimentsLoaded: config?.experiments?.length ?? 0,\n analyticsStarted: state.analyticsStarted,\n trackerStarted: Boolean(state.tracker),\n activation: state.activationDiagnostics,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n screenshotMode: state.screenshotMode,\n configSource: state.configSource,\n load: { ...state.load },\n platform: state.platform,\n routerMode: state.routerMode,\n activationMode: state.activationMode,\n storage: {\n mode: storageMode,\n localStorageAvailable: storageAvailable(\"localStorage\"),\n sessionStorageAvailable: storageAvailable(\"sessionStorage\"),\n cookiesEnabled: typeof navigator !== \"undefined\" ? navigator.cookieEnabled !== false : false,\n },\n runtime: {\n antiFlickerMode: runtimeConfig?.antiFlickerMode,\n antiFlickerTimeoutMs: runtimeConfig?.antiFlickerTimeoutMs,\n trackingStart: runtimeConfig?.trackingStart,\n pageTriggerMode: state.pageTriggerMode,\n customJsPolicy: runtimeConfig?.customJsPolicy,\n externalHandoverDomains: config?.externalTracking?.domains ?? [],\n handoverQueryParam: config?.externalTracking?.handoverQueryParam ?? \"drip_bucket\",\n handoverMintTimeoutMs: config?.externalTracking?.handoverMintTimeoutMs,\n runtimeDisabled: config?.runtimeControl?.disabled === true,\n runtimeDisabledAt: config?.runtimeControl?.disabledAt,\n },\n spa: {\n lastUrl: state.lastUrl,\n lastRouteChange: state.lastRouteChange ?? undefined,\n lastDataLayerTrigger: state.lastDataLayerTrigger ?? undefined,\n observerErrors: state.observerErrors,\n lastShopifyAssignmentSync: state.lastShopifyAssignmentSync ?? undefined,\n lastShopifyCartSync: state.lastShopifyCartSync ?? undefined,\n },\n signals: {\n values: signalDiagnostics.values,\n sources: signalDiagnostics.sources,\n },\n integrations: {\n exposureDestinations: state.exposureDestinationDiagnostics,\n },\n };\n\n if (isDebugEnabled()) {\n diagnostics.mode = \"debug\";\n diagnostics.trackingBlocked = trackingBlocked();\n diagnostics.trackingDisabledByDnt = state.trackingDisabledByDnt;\n diagnostics.trackingPrerequisiteMet = state.trackingPrerequisiteMet;\n diagnostics.consentRequired = state.consentRequired;\n diagnostics.consentGranted = state.consentGranted;\n diagnostics.consentModeEnabled = state.consentModeEnabled;\n }\n\n return diagnostics;\n}\n\nexport // --- Command queue ---\ntype QueueCommand =\n | { type: \"trackGoal\"; goalId: string; data?: Record<string, unknown> }\n | { type: \"trackRevenue\"; revenue: number; data?: RevenueEventData }\n | { type: \"track\"; event: string; data?: Record<string, unknown> }\n | { type: \"step\"; name: string; data?: Record<string, unknown> }\n | { type: \"signal\"; key: string; value: unknown; ttlDays?: number }\n | { type: \"triggerPage\"; apiName: string; active?: unknown }\n | { type: \"rememberProduct\"; product: Parameters<typeof rememberProduct>[0]; ttlDays?: number }\n | { type: \"setCart\"; itemCount?: number; productIds?: string[]; ttlDays?: number }\n | { type: \"setSearch\"; query: string; ttlDays?: number }\n | { type: \"setConsent\"; granted: boolean }\n | { type: \"hold\" }\n | { type: \"release\" }\n | { type: \"hydrated\" }\n | { type: \"reInit\"; force?: boolean }\n | { type: \"recheckPrerequisites\" }\n | { type: \"init\"; config: InitConfig };\n\nexport function processCommand(cmd: QueueCommand): void {\n switch (cmd.type) {\n case \"init\":\n init(cmd.config);\n break;\n case \"track\":\n track(cmd.event, cmd.data);\n break;\n case \"step\":\n trackStep(cmd.name, cmd.data);\n break;\n case \"trackGoal\":\n trackGoal(cmd.goalId, cmd.data);\n break;\n case \"trackRevenue\":\n trackRevenue(cmd.revenue, cmd.data);\n break;\n case \"signal\":\n setPublicSignal(cmd.key, cmd.value, cmd.ttlDays);\n break;\n case \"triggerPage\":\n triggerPage(cmd.apiName, cmd.active);\n break;\n case \"rememberProduct\":\n rememberProduct(cmd.product, cmd.ttlDays);\n break;\n case \"setCart\":\n setCartSignals({ itemCount: cmd.itemCount, productIds: cmd.productIds }, cmd.ttlDays);\n break;\n case \"setSearch\":\n setSearchSignal(cmd.query, cmd.ttlDays);\n break;\n case \"setConsent\":\n setConsent(cmd.granted);\n break;\n case \"hold\":\n hold();\n break;\n case \"release\":\n release();\n break;\n case \"hydrated\":\n hydrated();\n break;\n case \"reInit\":\n reInit(cmd.force === true);\n break;\n case \"recheckPrerequisites\":\n recheckPrerequisites();\n break;\n }\n}\n\nexport function processQueue(): void {\n const w = globalThis as Record<string, unknown>;\n const pending = w.drip;\n if (Array.isArray(pending)) {\n for (const cmd of pending) {\n processCommand(cmd as QueueCommand);\n }\n }\n installGlobalApi();\n}\n\nexport let installedGlobalApi: ReturnType<typeof createGlobalApi> | undefined;\n\nexport function createGlobalApi() {\n return Object.assign((command: string) => {\n if (command === \"hold\") return hold();\n if (command === \"release\") return release();\n if (command === \"hydrated\") return hydrated();\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"api\", `Unknown command: ${command}`);\n }, {\n init,\n track,\n step: trackStep,\n trackGoal,\n trackRevenue,\n setConsent,\n hold,\n release,\n hydrated,\n reInit,\n recheckPrerequisites,\n flush,\n evaluate,\n evaluateFlag,\n evaluateFlagAssignment,\n evaluateFlagValue,\n signal: setPublicSignal,\n triggerPage,\n rememberProduct,\n setCart: setCartSignals,\n setSearch: setSearchSignal,\n getSignals: getPublicSignals,\n getAssignments,\n getCartAttributes,\n getCartMetafields,\n getCartMetafieldStaleKeys,\n mergeCartAttributes,\n getSignedCartAttributes,\n confirmCartAttributesWritten,\n getExperiments,\n getTools: getRuntimeTools,\n get: getRuntimeValue,\n getDiagnostics,\n getPendingGiftChoices,\n selectGiftOption,\n push(cmd: QueueCommand) {\n processCommand(cmd);\n },\n });\n}\n\nexport function installGlobalApi(): void {\n const w = globalThis as Record<string, unknown>;\n if (installedGlobalApi !== undefined && w.drip === installedGlobalApi) {\n w.Apex = installedGlobalApi;\n w.apexTools = getRuntimeTools();\n return;\n }\n const api = installedGlobalApi ??= createGlobalApi();\n w.drip = api;\n w.Apex = api;\n w.apexTools = getRuntimeTools();\n}\n\n", "declare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nimport { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport {\n writeAssignmentSyncCookie,\n type AssignmentSyncPayload,\n} from \"./assignment-cookie-sync\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n mintShopwareAttributionEnvelope,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { applyRuntimeAntiFlicker, SDK_SCRIPT_SRC, HeatmapController, SemanticController, FetchAttemptInfo, FetchRetryOptions, DEFAULT_CONFIG_FETCH_TIMEOUT_MS, DEFAULT_CONFIG_FETCH_SLOW_MS, CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, CONFIG_FETCH_MAX_WAIT_MS, CACHED_REDIRECT_HIDE_TIMEOUT_MS, createFetchTimeoutError, fetchWithTimeout, fetchWithRetry, CONFIG_CACHE_KEY_PREFIX, DEFAULT_CONFIG_CACHE_TTL_MS, DEFAULT_ANTI_FLICKER_TIMEOUT_MS, DEFAULT_TRACKING_IDLE_TIMEOUT_MS, DEFAULT_EXECUTION_MODE, DEFAULT_TRACKING_START, DEFAULT_JS_POLICY, PAGE_RULE_POLL_WINDOW_MS, PAGE_RULE_POLL_INTERVAL_MS, CONSENT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS, IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES, SESSION_STORAGE_KEY, collectScopedSelectors, ResolvedRuntimeConfig, UrlDiffNeeds, ConfigSource, PendingPerfEvent, InitPhaseKey, InitPerfContext, MAX_PERF_DURATION_MS, monotonicNow, boundedPerfDuration, createInitPerfContext, BootstrapPredecision, bootstrapPredecision, addInitPhase, DeliveryHealthStatus, DeliveryHealthTracker, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic, ExposureDestinationDiagnostic, RuntimeLoadDiagnostic, DripPerfWindow, normalizeNumber, resolveRuntimeConfig, resolvePageTriggerMode, resolveDomPageTrigger, dtLog, traceName, traceStep, traceGate, browserDoNotTrackValue, trackingBlocked, storefrontVitalsGateOpen, syncStorefrontVitals, doNotTrackEnabled, storageAllowed, readWindowPath, configuredConsentGranted, syncConfiguredConsent, CUSTOM_CONSENT_POLL_INTERVAL_MS, CUSTOM_CONSENT_POLL_MAX_MS, MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS, MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS, MANUAL_CALLBACK_TRIGGER_MAX_RERUNS, EVENT_DRIVEN_CONSENT_PROVIDERS, shouldPollConfiguredConsent, installConsentChangeListeners, resolveConsentRequired, resolveConsentGranted, persistentStorageAllowed, coerceSignalValue, captureUrlSignals, installClickSignalCaptures, captureEventPropertySignals, setCapturedSignal, setPublicSignal, getPublicSignals, normalizePageApiName, pageTriggerSignal, triggerPage, readElementCaptureValue, captureDomAndGlobalSignals, consentAwareDataProtection, writeConsentCookie, readConsentCookie, clearConsentStorage, applyConsentStorageMode, runWhenDomReady, applyProjectCode, resetProjectCode, runProjectStartupCode, collectJsTriggerConditions, collectPageTriggerRules, PageDetectorMode, PageRuleReconcileScope, collectPageDetectorRules, experimentsForGlobalRouteReevaluation, conditionUsesActivateTrigger, buildJsTriggerContext, runJsTriggerReset, normalizeActivationValue, installActivateJsTrigger, installPageTriggerRule, installJsTriggerObserver, notifyQaAssistantRuntimeListeners, HarnessManifest, harnessPollTimer, harnessPollKey, harnessVisibilityInstalled, activeHarnessAssignment, stopHarnessPolling, applyHarnessManifest, pollHarnessManifest, startHarnessPolling, getEventsEndpoint, mintBucketingHandoverPayload, verifyBucketingHandoverToken, clearScheduledAnalyticsStart, normalizeDataLayerTriggers, applyDataLayerMappings, readNumericPath, readStringPath, RESERVED_DATA_LAYER_REVENUE_KEYS, PendingDataLayerEvent, MAX_PENDING_DATA_LAYER_EVENTS, pendingDataLayerEvents, processedDataLayerEntries, isDataLayerEntryObject, markDataLayerEntryProcessed, trackDataLayerRevenue, trackDataLayerEvent, enqueuePendingDataLayerEvent, drainPendingDataLayerEvents, finishInitializingAssignments, handleDataLayerEvent, recordObserverError } from \"./config-runtime\";\nimport { scheduleDeferredRouteReevaluation, installDataLayerTriggers, experimentsUseSurfaceSignals, rememberExposureDestination, clarityUpgradeSent, clarityTagKey, pushExposureToQueue, emitExposureDestinations, ensureTrackerStarted, exposureAssignmentKey, priceAssignmentAuthorizationKey, isPriceDisplayAssignmentAuthorized, isShippingDisplayAssignmentAuthorized, isOffersDisplayAssignmentAuthorized, giftSyncOptions, assignmentHasRenderableArtifacts, authorizeOffersDisplayAndRender, revokeOffersDisplayAuthorization, exposureEligibleAssignments, isShippingExposureCartEligible, trackViewedAssignmentsAfterShippingEligibility, EMPTY_TARGETING_ATTRIBUTES, TargetingEvaluationPass, activeTargetingEvaluationPass, createTargetingEvaluationPass, targetingAttributesForPass, trackViewedAssignments, sameStringSet, setupGoalTracking, setupHeatmapTracking, cleanupHeatmapTracking, setupReplayTracking, cleanupReplayTracking, setupSemanticTracking, cleanupSemanticTracking, buildExperimentBehaviorEvents, buildPageExitEvents, analyticsTrack, syncLoadDiagnosticsToPerf, updateLoadDiagnostics, resetLoadDiagnostics, queuePerfEvent, RuntimeInstallClaim, RUNTIME_INSTALL_CLAIM_KEY, RUNTIME_INSTALL_CONFLICT_KEY, telemetryLabel, readRuntimeInstallClaim, rememberRuntimeInstallClaim, claimInstallConflictEmission, sdkAttributionData, sendRuntimeEventNow, sendRuntimePerfNow, readDripPerf, markDripPerf, numberPerf, coexistencePerfFields, buildPerfEvent, flushPendingPerf, orderIdentityEndpoint, ORDER_EXPOSURE_STORAGE_KEY, ORDER_EXPOSURE_MAX_ENTRIES, ORDER_EXPOSURE_TTL_MS, StoredOrderExposure, pruneStoredOrderExposures, readStoredOrderExposures, writeStoredOrderExposures, clearIdentityContextCookie, recentIdentityContextExposures, buildIdentityContextCookieValue, generateSessionId, getIdentityContextSessionId, writeIdentityContextCookie, isOffTargetPersistedAssignment, restoreRecordedExposureDedup, rememberOrderExposure, mergedOrderIdentityAssignments, cleanOrderIdentityText, resolveOrderIdentityPlatform, detectOrderIdentity, orderIdentityDedupeKey, scheduleOrderIdentityBeacon, deliveryStatus, queueDeliveryHealthEvent, flushPendingDeliveryHealth, startAnalyticsStage, scheduleAnalyticsStart, startAnalyticsIfReady, getConfigCacheKey, storageAvailable, getConfigCacheTtlMs, configuredStoreOrigins, readCachedExperiments, hashConfigPayload, writeCachedExperiments, withRuntimeSettings, serializeForceMap, getHashId } from \"./analytics-runtime\";\nimport { attributionLedgerAssignments, PersistedAssignmentMap, GLOBAL_PAGE_PREFIX, appliedAssignmentsByKey, ArtifactId, invalidatedArtifactIds, artifactEpochs, applyPassEpoch, artifactEpochCurrent, PageActivationTransition, normalizePageDeactivationMode, effectiveDeactivationMode, includedPageRules, currentPageMatchContext, pageActivationDiagnosticRows, reconcilePageActivation, cancelPageRulePoll, cancelAllPageRulePolls, pageRulePollSettings, deactivationModeForTriggeredRule, reconcileTriggeredPageMatch, startPageRulePoll, firePageDetector, activePageIds, experimentHasActivePage, syncAssignmentPageActive, assignmentPageIds, stableArtifactJson, artifactContentHash, baseArtifactApplicationKey, artifactApplicationKey, artifactIdFromApplicationKey, assignmentRuntimeKeys, artifactOwnerId, redirectCarryAssignmentKey, shouldPreserveOffTargetRedirectAssignment, isAssignmentArtifactInactive, renderable, exposable, attributable, recordAttributableAssignments, artifactRenderableAssignments, activeRenderableAssignments, chargeAffectingAssignments, loadPersistedAssignments, buildPersistedAssignmentResult, withAssignmentEpochData, usesStickyAssignmentPersistence, persistActiveExperimentAssignments, experimentDiagnostic, evaluateExperimentDetailed, evaluateExperiment, stoppedPersonalizationDiagnostic, enforcePersonalizationStopAfterMatch, excludedByGroupDiagnostic, keptByGroupDiagnostic, applyExclusionAndPersonalization, evaluate, evaluateWithDiagnostics, evaluateEdgeRuntimeAssignments, resolveCombinedEdgeEvaluation, escapeDeliveryRegex, matchSimpleDeliveryPattern, matchRegexDeliveryPattern, matchesDeliveryUrlRules, expandCriticalMutation, buildCriticalPathAssignments, runPostRevealReassert, schedulePostRevealReassert, revealExperimentContent, applyAssignmentCode, recordAppliedAssignment, appliedOwnerKeysForAssignment, applyAssignments, reassertAssignmentMutations, TeardownPage, TeardownRuntimeOptions, TeardownSelection, runAssignmentResetJs, pendingCommercePriceResolve, resolveCommercePricePending, unwireGoals, goalWiringEligible, reconcileGoals, reconcileHarnessPolling, reconcileCommercePrice, reconcileCommerceShipping, reconcileCartSync, syncGlobalRuntimes, configuredPageDeactivationModes, allAppliedPagesWithModes, rollbackArtifactOwner, unregisterArtifactOwner, executeTeardownTransaction, teardownTransaction, teardownArtifactsTransaction, DesiredArtifact, LiveArtifact, ArtifactReconcileResult, desiredArtifactSet, liveArtifactInventory, removeArtifactOwner, registerDesiredOwners, replayDesiredArtifacts, invalidateLiveArtifactsForReplay, reconcileArtifacts } from \"./assignment-runtime\";\nimport { loadQaToolbar, loadQaAssistant, loadDevtoolsIfEnabled, loadDevtools, init, trackEvent, track, funnelStepStorageKey, shouldTrackFunnelStep, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, RevenueEventData, normalizeRevenueCurrency, trackRevenue, flush, getAssignments, buildCurrentCartAttributes, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, normalizedHeadlessCartToken, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getGoals, getActiveExperimentIds, getRuntimeValue, getRuntimeTools, buildFlagContext, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics, QueueCommand, processCommand, processQueue, installedGlobalApi, createGlobalApi, installGlobalApi } from \"./public-api\";\n\n\nexport function generateQaSessionId(): string {\n return \"qa_\" + Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport const SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS = [0, 250, 1000, 2500];\nexport let shopifyAssignmentSyncTimers: number[] = [];\n\nexport type CommerceOnlyAdoptionState = {\n applying: boolean;\n assignments: Assignment[];\n context: string | null;\n};\n\nexport let commercePriceAdoptionState: CommerceOnlyAdoptionState | null = null;\n\nexport function ensureCommercePriceAdoptionState(): CommerceOnlyAdoptionState {\n return commercePriceAdoptionState ??= {\n applying: false,\n assignments: [],\n context: null,\n };\n}\n\nexport function currentCommercePriceContext(): string | null {\n return state.config && state.userId\n ? `${state.config.shopId}\\u0000${state.userId}`\n : null;\n}\n\nexport function withCommercePriceAssignments(assignments = state.assignments): Assignment[] {\n const adoption = commercePriceAdoptionState;\n if (\n !adoption?.assignments.length ||\n adoption.context !== currentCommercePriceContext()\n ) return assignments;\n const activeExperimentIds = new Set(assignments.map((assignment) => assignment.experimentId));\n const configuredPriceExperimentIds = new Set(\n state.config?.commerce?.price?.authorization?.experimentIds ?? [],\n );\n const configuredOffersExperimentIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const experiments = new Map(\n (state.config?.experiments ?? []).map((experiment) => [experiment.id, experiment]),\n );\n const validCommerceOnly = adoption.assignments.filter((assignment) => {\n if (activeExperimentIds.has(assignment.experimentId)) return false;\n if (\n !configuredPriceExperimentIds.has(assignment.experimentId) &&\n !configuredOffersExperimentIds.has(assignment.experimentId)\n ) return false;\n const experiment = experiments.get(assignment.experimentId);\n return !!experiment &&\n __assignmentStoreInternals.assignmentEpoch(experiment) === assignment.assignmentEpoch &&\n experiment.variations.some((variation) => variation.id === assignment.variationId);\n });\n return validCommerceOnly.length ? [...assignments, ...validCommerceOnly] : assignments;\n}\n\nexport function clearShopifyAssignmentSyncTimers(): void {\n for (const timer of shopifyAssignmentSyncTimers) {\n window.clearTimeout(timer);\n }\n shopifyAssignmentSyncTimers = [];\n}\n\nexport function adoptAuthoritativePriceAssignments(assignments: CartAssignment[]): boolean {\n const config = state.config;\n const price = config?.commerce?.price;\n if (!config || !price || !state.userId) return false;\n const configuredPriceExperimentIds = new Set(\n price.authorization?.experimentIds ?? [],\n );\n if (configuredPriceExperimentIds.size === 0) return false;\n const replacements = new Map<string, Assignment>();\n const nextCommercePriceOnlyAssignments: Assignment[] = [];\n const seenAuthoritativeExperimentIds = new Set<string>();\n for (const authoritative of assignments) {\n if (\n seenAuthoritativeExperimentIds.has(authoritative.experimentId) ||\n !configuredPriceExperimentIds.has(authoritative.experimentId) ||\n !price.experiments.some(\n (experiment) => experiment.experiment_id === authoritative.experimentId,\n )\n ) return false;\n seenAuthoritativeExperimentIds.add(authoritative.experimentId);\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n const variationIndex = experiment?.variations.findIndex(\n (variation) => variation.id === authoritative.variationId,\n ) ?? -1;\n if (!experiment || variationIndex < 0) return false;\n if (\n authoritative.assignmentEpoch !==\n __assignmentStoreInternals.assignmentEpoch(experiment)\n ) return false;\n const existingAssignment = state.assignments.find(\n (assignment) => assignment.experimentId === authoritative.experimentId,\n );\n const replacement = buildAssignment(\n experiment,\n experiment.variations[variationIndex],\n variationIndex,\n existingAssignment?.hashValue ?? state.userId,\n typeof location !== \"undefined\" ? location.href : undefined,\n );\n replacement.pageActive = experimentHasActivePage(experiment);\n if (authoritative.commercePriceOnly) {\n nextCommercePriceOnlyAssignments.push(replacement);\n // A cart-only arm can still replace an existing off-target attribution\n // assignment. Keep one shared copy in runtime state so revenue and\n // custom attribution survive while the adoption list marks its cart role.\n if (existingAssignment) {\n replacements.set(authoritative.experimentId, replacement);\n }\n } else {\n replacements.set(authoritative.experimentId, replacement);\n }\n }\n\n const nextAssignments = state.assignments\n .filter((assignment) => !configuredPriceExperimentIds.has(assignment.experimentId));\n for (const authoritative of assignments) {\n const replacement = replacements.get(authoritative.experimentId);\n if (replacement) nextAssignments.push(replacement);\n }\n\n const previousAssignments = state.assignments;\n const adoption = ensureCommercePriceAdoptionState();\n const previousCommercePriceOnlyAssignments = adoption.assignments;\n const previousCommercePriceOnlyContext = adoption.context;\n try {\n teardownTransaction(allAppliedPagesWithModes(), { skipCartSync: true });\n state.assignments = nextAssignments;\n adoption.assignments = [\n ...previousCommercePriceOnlyAssignments.filter(\n (assignment) => !configuredPriceExperimentIds.has(assignment.experimentId),\n ),\n ...nextCommercePriceOnlyAssignments,\n ];\n adoption.context = currentCommercePriceContext();\n adoption.applying = true;\n applyAssignments(nextAssignments, state.activationMode);\n if (assignments.length === 0) cleanupCommercePrice();\n state.lastAssignmentSignature = assignmentSignature(nextAssignments);\n if (persistentStorageAllowed() && !state.qaMode) {\n removePersistedAssignmentsForExperiments(configuredPriceExperimentIds);\n for (const authoritative of assignments) {\n if (!replacements.has(authoritative.experimentId)) continue;\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n if (experiment) {\n persistAssignmentForExperiment(experiment, authoritative.variationId);\n }\n }\n }\n if (state.analyticsStarted && !trackingBlocked() && state.trackingPrerequisiteMet) {\n setupGoalTracking(config.experiments ?? []);\n setupHeatmapTracking(nextAssignments, config.experiments ?? []);\n setupReplayTracking(nextAssignments, config.experiments ?? []);\n scheduleShopifyAssignmentSync();\n }\n notifyQaAssistantRuntimeListeners();\n return true;\n } catch {\n state.assignments = previousAssignments;\n adoption.assignments = previousCommercePriceOnlyAssignments;\n adoption.context = previousCommercePriceOnlyContext;\n return false;\n } finally {\n adoption.applying = false;\n }\n}\n\nexport type OffersAdoptionPlan = {\n configuredOffersExperimentIds: Set<string>;\n replacements: Map<string, Assignment>;\n nextCommercePriceOnlyAssignments: Assignment[];\n};\n\nexport // Pure validation/planning \u2014 must not mutate any runtime state, because the\n// cart-sync path runs it BEFORE the cart write to prove the arm is adoptable\n// while the actual adoption is deferred until the write is confirmed.\nfunction planAuthoritativeOffersAdoption(\n assignments: CartAssignment[],\n): OffersAdoptionPlan | null {\n const config = state.config;\n const offers = config?.commerce?.offers;\n if (!config || !offers || !state.userId) return null;\n const configuredOffersExperimentIds = new Set(\n offers.authorization?.experimentIds ?? [],\n );\n if (configuredOffersExperimentIds.size === 0) return null;\n const replacements = new Map<string, Assignment>();\n const nextCommercePriceOnlyAssignments: Assignment[] = [];\n const seenAuthoritativeExperimentIds = new Set<string>();\n for (const authoritative of assignments) {\n if (\n seenAuthoritativeExperimentIds.has(authoritative.experimentId) ||\n !configuredOffersExperimentIds.has(authoritative.experimentId)\n ) return null;\n seenAuthoritativeExperimentIds.add(authoritative.experimentId);\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n const variationIndex = experiment?.variations.findIndex(\n (variation) => variation.id === authoritative.variationId,\n ) ?? -1;\n if (!experiment || variationIndex < 0) return null;\n if (\n authoritative.assignmentEpoch !==\n __assignmentStoreInternals.assignmentEpoch(experiment)\n ) return null;\n const existingAssignment = state.assignments.find(\n (assignment) => assignment.experimentId === authoritative.experimentId,\n );\n const replacement = buildAssignment(\n experiment,\n experiment.variations[variationIndex],\n variationIndex,\n existingAssignment?.hashValue ?? state.userId,\n typeof location !== \"undefined\" ? location.href : undefined,\n );\n replacement.pageActive = experimentHasActivePage(experiment);\n if (authoritative.commercePriceOnly) {\n nextCommercePriceOnlyAssignments.push(replacement);\n if (existingAssignment) {\n replacements.set(authoritative.experimentId, replacement);\n }\n } else {\n replacements.set(authoritative.experimentId, replacement);\n }\n }\n return { configuredOffersExperimentIds, replacements, nextCommercePriceOnlyAssignments };\n}\n\nexport function canAdoptAuthoritativeOffersAssignments(assignments: CartAssignment[]): boolean {\n return planAuthoritativeOffersAdoption(assignments) !== null;\n}\n\nexport function adoptAuthoritativeOffersAssignments(assignments: CartAssignment[]): boolean {\n const config = state.config;\n const plan = planAuthoritativeOffersAdoption(assignments);\n if (!config || !plan) return false;\n const {\n configuredOffersExperimentIds,\n replacements,\n nextCommercePriceOnlyAssignments,\n } = plan;\n\n const nextAssignments = state.assignments.filter(\n (assignment) => !configuredOffersExperimentIds.has(assignment.experimentId),\n );\n for (const authoritative of assignments) {\n const replacement = replacements.get(authoritative.experimentId);\n if (replacement) nextAssignments.push(replacement);\n }\n const previousAssignments = state.assignments;\n const adoption = ensureCommercePriceAdoptionState();\n const previousCommercePriceOnlyAssignments = adoption.assignments;\n const previousCommercePriceOnlyContext = adoption.context;\n try {\n teardownTransaction(allAppliedPagesWithModes(), { skipCartSync: true });\n state.assignments = nextAssignments;\n adoption.assignments = [\n ...previousCommercePriceOnlyAssignments.filter(\n (assignment) => !configuredOffersExperimentIds.has(assignment.experimentId),\n ),\n ...nextCommercePriceOnlyAssignments,\n ];\n adoption.context = currentCommercePriceContext();\n adoption.applying = true;\n applyAssignments(nextAssignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(nextAssignments);\n if (persistentStorageAllowed() && !state.qaMode) {\n removePersistedAssignmentsForExperiments(configuredOffersExperimentIds);\n for (const authoritative of assignments) {\n if (!replacements.has(authoritative.experimentId)) continue;\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n if (experiment) persistAssignmentForExperiment(experiment, authoritative.variationId);\n }\n }\n if (state.analyticsStarted && !trackingBlocked() && state.trackingPrerequisiteMet) {\n setupGoalTracking(config.experiments ?? []);\n setupHeatmapTracking(nextAssignments, config.experiments ?? []);\n setupReplayTracking(nextAssignments, config.experiments ?? []);\n scheduleShopifyAssignmentSync();\n }\n notifyQaAssistantRuntimeListeners();\n return true;\n } catch {\n state.assignments = previousAssignments;\n adoption.assignments = previousCommercePriceOnlyAssignments;\n adoption.context = previousCommercePriceOnlyContext;\n return false;\n } finally {\n adoption.applying = false;\n }\n}\n\nexport function sdkCartMintAllowed(): boolean {\n // The union keeps the original \"something to mint\" contract for every\n // consumer (click trigger, merge key-replacement) now that deactivated\n // session assignments still mint through the attribution ledger.\n const assignments = [\n ...state.assignments.filter(attributable),\n ...attributionLedgerAssignments(),\n ];\n return (\n state.config?.cartAttributeWrite !== \"external\" &&\n state.config?.cartAttributeScope === \"all\" &&\n !!assignments[0] &&\n trackingBlocked() !== state.trackingDisabledByDnt\n );\n}\n\nexport function buildSdkCartMintInput(): CartAttributeSyncInput | null {\n const assignments = [\n ...state.assignments.filter(attributable),\n ...attributionLedgerAssignments(),\n ];\n if (!sdkCartMintAllowed() || !assignments[0]) return null;\n return {\n assignments,\n // Empty identity values make the Shopify merge clear prior consented identity.\n visitorId: \"\",\n sessionId: \"\",\n };\n}\n\nexport function buildScopedCartAttributeSyncInput(): CartAttributeSyncInput | null {\n const assignments = [\n ...state.assignments.filter(attributable),\n ...attributionLedgerAssignments(),\n ];\n if (\n state.config?.cartAttributeWrite !== \"external\" ||\n state.config?.cartAttributeScope !== \"all\" ||\n !state.consentRequired ||\n state.consentGranted ||\n state.trackingDisabledByDnt ||\n !assignments[0]\n ) return null;\n return {\n assignments,\n visitorId: \"\",\n sessionId: \"\",\n };\n}\n\nexport function buildActiveCartAttributeSyncInput(functionalCartWrite = false): CartAttributeSyncInput | null {\n if (!functionalCartWrite && (trackingBlocked() || !state.trackingPrerequisiteMet)) return null;\n const controlStamp = state.holdout && state.assignments.length === 0;\n const identityOnly = state.config?.holdout_v1_enabled === true\n && !state.holdout\n && state.assignments.length === 0\n && !hasActiveCommerceAuthorizationPlane();\n if (\n (\n !state.assignments.length &&\n !hasActiveCommerceAuthorizationPlane() &&\n !controlStamp &&\n !identityOnly\n ) ||\n !state.userId\n ) return null;\n\n const activeCartAssignments = withCommercePriceAssignments(state.assignments).filter(attributable);\n const chargeAffectingExperimentIds = getChargeAffectingCommerceExperimentIds(\n activeCartAssignments.filter(renderable),\n );\n const adoption = commercePriceAdoptionState;\n const assignments = activeCartAssignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n pageActive: assignment.pageActive,\n assignmentEpoch:\n !assignment.kind || assignment.kind === \"experiment\"\n ? assignment.assignmentEpoch\n : undefined,\n ...(adoption?.context === currentCommercePriceContext() &&\n adoption.assignments.includes(assignment)\n ? { commercePriceOnly: true }\n : {}),\n }));\n const assignedExperimentIds = new Set(\n assignments.map((assignment) => assignment.experimentId),\n );\n const exclusionGroupSelections = state.config?.exclusionGroups\n ?.map((group) => {\n const winner = group.members.find((member) =>\n assignedExperimentIds.has(member.experimentId)\n );\n return winner\n ? {\n groupId: group.id,\n experimentId: winner.experimentId,\n epoch: Number.isFinite(group.epoch)\n ? Math.max(1, Math.floor(group.epoch ?? 1))\n : 1,\n }\n : null;\n })\n .filter((selection): selection is NonNullable<typeof selection> =>\n selection !== null\n );\n\n return {\n assignments,\n controlStamp: controlStamp || undefined,\n identityOnly: identityOnly || undefined,\n requiredAssignments: chargeAffectingExperimentIds.size > 0\n ? assignments.filter((assignment) =>\n chargeAffectingExperimentIds.has(assignment.experimentId))\n : undefined,\n visitorId: state.userId,\n sessionId: state.tracker?.getSessionId() ?? \"\",\n shopId: state.config?.ingestShopId ?? state.config?.shopId,\n endpoint: state.config?.endpoint,\n ingestSignature: state.config?.ingestSignature,\n url: typeof location !== \"undefined\" ? location.href : undefined,\n environment: state.config?.environments?.activeKey,\n platform: state.platform,\n onAttributionEnvelope: (envelope) => {\n state.shopwareAttributionEnvelope = envelope;\n if (typeof document !== \"undefined\") {\n document.dispatchEvent(new CustomEvent(\"apex:attribution-envelope\"));\n }\n },\n offersAuthorizationRevision:\n state.config?.commerce?.offers?.authorization?.revision,\n offersExperimentIds:\n state.config?.commerce?.offers?.authorization?.experimentIds,\n shippingAuthorizationRevision:\n state.config?.commerce?.shipping?.authorization?.revision,\n shippingExperimentIds:\n state.config?.commerce?.shipping?.authorization?.experimentIds,\n priceAuthorizationRevision:\n state.config?.commerce?.price?.authorization?.revision,\n priceExperimentIds:\n state.config?.commerce?.price?.authorization?.experimentIds,\n onCartToken: (cartToken) => {\n if (state.shopifyCartToken === cartToken) return;\n state.shopifyCartToken = cartToken;\n if (state.analyticsStarted) publishAssignmentsToShopify();\n },\n ...(state.config?.commerce?.offers?.authorization?.experimentIds?.length\n ? {\n adoptOffersAssignments: adoptAuthoritativeOffersAssignments,\n canAdoptOffersAssignments: canAdoptAuthoritativeOffersAssignments,\n authorizeOffersDisplayAssignments: authorizeOffersDisplayAndRender,\n }\n : {}),\n // Every stamped cart write returns the full cart; marked GWP lines seen\n // there seed durable insertion records so a fresh device or cleared\n // storage over a persistent/customer-synced cart still reconciles gifts.\n onCartSnapshot: (cart: unknown) => {\n if (noteCartSnapshotForGifts(cart)) {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(state.assignments).filter(attributable),\n giftSyncOptions(),\n );\n }\n },\n ...(hasActivePriceAuthorizationPlane()\n ? {\n adoptPriceAssignments: adoptAuthoritativePriceAssignments,\n authorizePriceDisplayAssignments: (authorizedAssignments: CartAssignment[]) => {\n state.authorizedPriceAssignmentKeys = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n },\n }\n : {}),\n ...(hasActiveShippingAuthorizationPlane()\n ? {\n authorizeShippingDisplayAssignments: (authorizedAssignments: CartAssignment[]) => {\n state.authorizedShippingAssignmentKeys = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n },\n }\n : {}),\n exclusionGroupSelections:\n exclusionGroupSelections?.length ? exclusionGroupSelections : undefined,\n };\n}\n\nexport let sdkCartMintSync: ReturnType<typeof syncShopifyCartAttributes> | null = null;\n\nexport function syncSdkCartMint(): void {\n const input = !sdkCartMintSync && buildSdkCartMintInput();\n if (!input) return;\n const pending = sdkCartMintSync = syncShopifyCartAttributes(input);\n const finish = () => {\n if (sdkCartMintSync !== pending) return;\n sdkCartMintSync = null;\n if (!trackingBlocked()) syncActiveAssignmentToShopifyCart();\n };\n void pending.then(finish, finish);\n}\n\nexport /**\n * Mint on the first capture-phase click while Shopify identifies a product page.\n * Capture starts the empty-cart write before an add-to-cart bubble handler runs.\n */\nconst removeSdkCartMintTrigger = () =>\n document.removeEventListener(\"click\", onSdkCartMintClick, true);\n\nexport function onSdkCartMintClick(): void {\n if (!sdkCartMintAllowed() || readShopifySignal(\"shopify.page_type\") !== \"product\") return;\n removeSdkCartMintTrigger();\n syncSdkCartMint();\n}\n\nexport function installSdkCartMintTrigger(): void {\n removeSdkCartMintTrigger();\n if (!sdkCartMintAllowed()) return;\n document.addEventListener(\"click\", onSdkCartMintClick, { capture: true, passive: true });\n}\n\nexport type HeadlessCartAuthorizationState = {\n generation: number;\n confirmationPending: boolean;\n pending: {\n generation: number;\n cartToken: string;\n priceAssignments: CartAssignment[];\n shippingAssignments: CartAssignment[];\n offersAssignments: CartAssignment[];\n offersAdoptionAssignments: CartAssignment[] | null;\n } | null;\n};\n\nexport let headlessCartAuthorizationState: HeadlessCartAuthorizationState | null = null;\n\nexport function ensureHeadlessCartAuthorizationState(): HeadlessCartAuthorizationState {\n return headlessCartAuthorizationState ??= {\n generation: 0,\n confirmationPending: false,\n pending: null,\n };\n}\n\nexport function hasChargeAffectingCommerceAssignment(assignments = state.assignments): boolean {\n return getChargeAffectingCommerceExperimentIds(assignments).size > 0;\n}\n\nexport function hasActiveAuthorizationPlane(plane: \"price\" | \"shipping\" | \"offers\"): boolean {\n const authorization = state.config?.commerce?.[plane]?.authorization;\n return authorization?.version === 1\n && Number.isSafeInteger(authorization.revision)\n && authorization.revision > 0\n && Array.isArray(authorization.experimentIds)\n && authorization.experimentIds.length > 0;\n}\n\nexport const hasActivePriceAuthorizationPlane = () => hasActiveAuthorizationPlane(\"price\");\nexport const hasActiveShippingAuthorizationPlane = () => hasActiveAuthorizationPlane(\"shipping\");\nexport const hasActiveOffersAuthorizationPlane = () => hasActiveAuthorizationPlane(\"offers\");\n\nexport function hasActiveCommerceAuthorizationPlane(): boolean {\n if (hasActivePriceAuthorizationPlane() || hasActiveOffersAuthorizationPlane()) return true;\n const authorization = state.config?.commerce?.shipping?.authorization;\n return authorization?.version === 1\n && Number.isSafeInteger(authorization.revision)\n && authorization.revision > 0\n && Array.isArray(authorization.experimentIds)\n && authorization.experimentIds.length > 0;\n}\n\nexport function requiresCommerceCohortPin(assignments = state.assignments): boolean {\n return hasActivePriceAuthorizationPlane()\n || hasActiveOffersAuthorizationPlane()\n || hasChargeAffectingCommerceAssignment(withCommercePriceAssignments(assignments).filter(attributable));\n}\n\nexport function getChargeAffectingCommerceExperimentIds(\n assignments = state.assignments,\n): Set<string> {\n const active = new Map(\n assignments\n .filter((assignment) => !assignment.isControl)\n .map((assignment) => [assignment.experimentId, assignment.variationId]),\n );\n const chargeAffecting = new Set<string>();\n state.config?.commerce?.price?.experiments.forEach((experiment) => {\n const variationId = active.get(experiment.experiment_id);\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (variationId != null\n && (experiment.assignment_epoch == null\n || experiment.assignment_epoch === assignment?.assignmentEpoch)\n && experiment.variants[variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n )) {\n chargeAffecting.add(experiment.experiment_id);\n }\n });\n\n const offerExperimentIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n for (const experimentId of offerExperimentIds) {\n if (active.has(experimentId)) chargeAffecting.add(experimentId);\n }\n\n const shipping = state.config?.commerce?.shipping;\n const enforcedExperimentIds = new Set(shipping?.authorization?.experimentIds ?? []);\n shipping?.experiments.forEach((experiment) => {\n const variationId = active.get(experiment.experiment_id);\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n const variant = variationId == null ? undefined : experiment.variants[variationId];\n if (enforcedExperimentIds.has(experiment.experiment_id)\n && (experiment.assignment_epoch == null\n || experiment.assignment_epoch === assignment?.assignmentEpoch)\n && variant?.treatment !== \"none\"\n && isShippingCartEligible(experiment.experiment_id)) {\n chargeAffecting.add(experiment.experiment_id);\n }\n });\n return chargeAffecting;\n}\n\nexport function isCohortStampedOnCart(): boolean | \"pending\" {\n if (headlessCartAuthorizationState?.confirmationPending) return false;\n if (state.lastShopifyCartSync?.status === \"pending\") return \"pending\";\n return state.lastShopifyCartSync?.status === \"sent\";\n}\n\nexport function syncActiveAssignmentToShopifyCart(options: {\n chargeCorrectness?: boolean;\n force?: boolean;\n holdoutCartClear?: boolean;\n} = {}): void {\n if (state.platform === \"shopware\") {\n if (!trackingBlocked()) {\n const shopwareInput = buildActiveCartAttributeSyncInput();\n if (shopwareInput) void mintShopwareAttributionEnvelope(shopwareInput);\n }\n return;\n }\n if (state.config?.cartAttributeWrite === \"external\") {\n runtimeSharedState.shopifyCartSyncGeneration += 1;\n invalidateShopifyCartAttributeSync();\n return;\n }\n if (!trackingBlocked() && sdkCartMintSync) return;\n const chargeCorrectness = options.chargeCorrectness === true\n && requiresCommerceCohortPin();\n const holdoutCartClear = options.holdoutCartClear === true\n && state.holdout\n && state.config?.holdout_v1_enabled === true\n && state.assignments.length === 0;\n const functionalCartWrite = chargeCorrectness || holdoutCartClear;\n if (!functionalCartWrite && (trackingBlocked() || !state.trackingPrerequisiteMet)) return;\n const input = buildActiveCartAttributeSyncInput(functionalCartWrite);\n if (!input) return;\n const generation = ++runtimeSharedState.shopifyCartSyncGeneration;\n const authorizationUnavailable = cannotRequestRequiredCommerceAuthorization(input);\n if (hasActivePriceAuthorizationPlane()) {\n state.authorizedPriceAssignmentKeys?.clear();\n }\n if (hasActiveShippingAuthorizationPlane()) {\n state.authorizedShippingAssignmentKeys?.clear();\n }\n // Offers display keys are deliberately NOT cleared at sync start: their\n // renderer is applyAssignments itself, which triggers this sync \u2014 clearing\n // here would revoke the authorization the re-apply is acting on. Applied\n // DOM cannot be un-rendered by a key clear anyway; the keys are replaced\n // wholesale by each completed authorization (exposure stays deduped).\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: authorizationUnavailable ? \"failed\" : \"pending\",\n reason: authorizationUnavailable ? \"authorization_failed\" : undefined,\n assignmentCount: state.assignments.length,\n };\n void syncShopifyCartAttributes(input, { force: options.force }).then((result) => {\n if (generation !== runtimeSharedState.shopifyCartSyncGeneration) return;\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: result.status,\n reason: result.reason,\n assignmentCount: state.assignments.length,\n };\n if (result.status === \"failed\") {\n // Fail-closed: the stamp refresh failed, so the Function may already\n // refuse lines this cart still carries (e.g. the shopper dropped below\n // the GWP threshold right before the failed sync). Run privilege-\n // reducing gift cleanup \u2014 removals and normalization only, no inserts.\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(state.assignments).filter(attributable),\n giftSyncOptions({ suppressInsertion: true }),\n );\n }\n if (result.status === \"sent\") {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(state.assignments).filter(attributable),\n giftSyncOptions(),\n );\n notifyCommerceCartStampConfirmed();\n // Render plane, not the raw assignment list: a deactivated page's\n // shipping treatment must not come back on a cart-stamp callback.\n reconcileCommerceShipping();\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n } else if (hasActivePriceAuthorizationPlane()) {\n cleanupCommercePrice();\n }\n });\n}\n\nexport function configureChargeCorrectnessCartSync(assignments: Assignment[]): void {\n state.stopShopifyCartMutationSync?.();\n state.stopShopifyCartMutationSync = null;\n if (!requiresCommerceCohortPin(assignments)) {\n // Commerce planes exist but none is charge-affecting anymore, so the\n // sync (and its post-\"sent\" gift pass) will not run; still give the gift\n // manager its teardown-cleanup chance for an earlier insertion, and keep\n // it subscribed to cart mutations \u2014 a login/customer-account cart merge\n // can land an Apex-marked line long after the once-per-page check.\n if (state.config?.commerce?.offers) {\n state.stopShopifyCartMutationSync = onShopifyCartMutation(() => {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(state.assignments).filter(attributable),\n giftSyncOptions({ recheckTeardown: true }),\n );\n });\n }\n void syncGiftWithPurchase(state.config?.commerce?.offers, withCommercePriceAssignments(state.assignments).filter(attributable));\n return;\n }\n\n state.stopShopifyCartMutationSync = onShopifyCartMutation(() => {\n syncActiveAssignmentToShopifyCart({ chargeCorrectness: true, force: true });\n });\n if (commercePriceAdoptionState?.applying) return;\n // This narrow consent/DNT exemption is charge-correctness, not analytics:\n // the first-party cart attribute contains only assignment ids/epoch and must\n // exist whenever a commerce treatment can change what the shopper is charged.\n syncActiveAssignmentToShopifyCart({ chargeCorrectness: true });\n}\n\nexport function holdoutConfigEpoch(config: InitConfig | null | undefined): number | undefined {\n const raw = config?.holdout_config_updated_at;\n const epoch = typeof raw === \"string\" ? Date.parse(raw) : Number.NaN;\n return Number.isSafeInteger(epoch) && epoch > 0 ? epoch : undefined;\n}\n\nfunction buildShopifyAssignmentSyncPayload(\n assignments: AssignmentSyncPayload[\"assignments\"],\n): AssignmentSyncPayload {\n return {\n visitorId: state.userId,\n sessionId: state.tracker?.getSessionId() ?? \"\",\n ...(state.shopifyCartToken ? { cartToken: state.shopifyCartToken } : {}),\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n cohort: state.config?.holdout_v1_enabled === true\n ? (state.holdout ? \"holdout\" : \"active\")\n : undefined,\n holdoutConfigEpoch: holdoutConfigEpoch(state.config),\n assignments,\n };\n}\n\nexport /**\n * Publish current experiment assignments to Shopify's analytics bus.\n * The Drip Web Pixel subscribes to this custom event to attribute\n * Shopify standard events (checkout, add_to_cart, etc.) to experiments.\n *\n * No-op on non-Shopify stores \u2014 guarded by the Shopify global check.\n */\nfunction publishAssignmentsToShopify(): void {\n if (trackingBlocked() || !state.trackingPrerequisiteMet) {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"skipped\",\n reason: \"tracking_blocked\",\n assignmentCount: state.assignments.length,\n };\n return;\n }\n try {\n const assignments = state.assignments.filter(attributable).map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n assignmentEpoch:\n !assignment.kind || assignment.kind === \"experiment\"\n ? assignment.assignmentEpoch\n : undefined,\n }));\n const payload = buildShopifyAssignmentSyncPayload(assignments);\n const publish = (window as any).Shopify?.analytics?.publish;\n if (typeof publish !== \"function\") {\n if (state.config?.assignmentCookieSync === false) {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"skipped\",\n reason: \"assignment_cookie_sync_disabled\",\n assignmentCount: state.assignments.length,\n };\n return;\n }\n const cookieResult = writeAssignmentSyncCookie(payload);\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: cookieResult.written ? \"cookie_fallback\" : \"skipped\",\n reason: cookieResult.written ? undefined : cookieResult.reason ?? \"shopify_publish_missing\",\n assignmentCount: state.assignments.length,\n truncatedAssignmentCount: cookieResult.truncatedAssignmentCount,\n };\n return;\n }\n\n publish(\"drip_assignment_sync\", payload);\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"sent\",\n assignmentCount: state.assignments.length,\n };\n } catch (error) {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n assignmentCount: state.assignments.length,\n };\n }\n}\n\nexport function scheduleShopifyAssignmentSync(): void {\n clearShopifyAssignmentSyncTimers();\n if (state.config?.runtimeProfile === \"empty_project\" && state.perfFlags.perf_empty_project_v1) {\n return;\n }\n for (const delay of SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS) {\n if (delay <= 0) {\n publishAssignmentsToShopify();\n continue;\n }\n shopifyAssignmentSyncTimers.push(\n window.setTimeout(publishAssignmentsToShopify, delay),\n );\n }\n}\n\nexport function variationsAllowed(config: InitConfig): boolean {\n return evaluateProjectPrerequisite(\n config.projectPrerequisites?.showVariationsRule,\n buildPrerequisiteContext(\n config,\n state.userId,\n state.consentRequired,\n state.consentGranted,\n \"show_variations\",\n ),\n true,\n );\n}\n\nexport function updateProjectActivationDiagnostics(config: InitConfig): void {\n const variationGate: ActivationGateDiagnostic = {\n id: \"environment\",\n label: \"Project variation gate\",\n status: state.variationPrerequisiteMet ? \"passed\" : \"failed\",\n reason: state.variationPrerequisiteMet ? \"show_variations_allowed\" : \"show_variations_blocked\",\n };\n const trackingGate: ActivationGateDiagnostic = {\n id: \"tracking\",\n label: \"Tracking gate\",\n status: trackingBlocked() || !state.trackingPrerequisiteMet ? \"failed\" : \"passed\",\n reason: trackingBlocked()\n ? \"consent_or_dnt_blocked\"\n : state.trackingPrerequisiteMet\n ? \"start_tracking_allowed\"\n : \"start_tracking_blocked\",\n };\n const goalsGate: ActivationGateDiagnostic = {\n id: \"goals\",\n label: \"Goal listeners\",\n status: state.analyticsStarted ? \"passed\" : \"skipped\",\n reason: state.analyticsStarted ? \"listeners_active\" : \"tracking_not_started\",\n detail: { goals: (config.experiments ?? []).reduce((count, experiment) => count + (experiment.goals?.length ?? 0), 0) },\n };\n state.activationDiagnostics.project = { gates: [variationGate, trackingGate, goalsGate] };\n}\n\nexport function trackingAllowed(config: InitConfig): boolean {\n return evaluateProjectPrerequisite(\n config.projectPrerequisites?.startTrackingRule,\n buildPrerequisiteContext(\n config,\n state.userId,\n state.consentRequired,\n state.consentGranted,\n \"start_tracking\",\n ),\n true,\n );\n}\n\nexport function experimentById(experiments: Experiment[]): Map<string, Experiment> {\n return new Map(experiments.map((experiment) => [experiment.id, experiment]));\n}\n\nexport function targetingLifecycleMode(\n experiment: Experiment | undefined,\n): \"reset\" | \"deactivate\" | \"force_reset\" | \"persistent\" {\n const mode = experiment?.targeting?.lifecycle?.mode;\n return mode === \"reset\" ||\n mode === \"deactivate\" ||\n mode === \"force_reset\" ||\n mode === \"persistent\"\n ? mode\n : \"reset\";\n}\n\nexport function preservePersistentAssignments(\n previous: Assignment[],\n next: Assignment[],\n experiments: Experiment[],\n): Assignment[] {\n if (!previous.length) return next;\n const experimentsById = experimentById(experiments);\n const nextExperimentIds = new Set(next.map((assignment) => assignment.experimentId));\n const persistent = previous.filter(\n (assignment) => {\n if (nextExperimentIds.has(assignment.experimentId)) return false;\n const experiment = experimentsById.get(assignment.experimentId);\n if (!experiment) return false;\n return targetingLifecycleMode(experiment) === \"persistent\" ||\n includedPageRules(experiment).some(\n (rule) =>\n effectiveDeactivationMode(experiment, rule) === \"persistent\",\n );\n },\n );\n return persistent.length ? [...next, ...persistent] : next;\n}\n\nexport function stopAnalyticsStage(): void {\n clearScheduledAnalyticsStart();\n clearShopifyAssignmentSyncTimers();\n state.pendingPerf = null;\n state.pendingDeliveryHealth = [];\n unwireGoals();\n cleanupHeatmapTracking();\n cleanupReplayTracking();\n cleanupSemanticTracking();\n if (state.tracker) {\n state.tracker.stop();\n state.tracker = null;\n }\n state.analyticsStarted = false;\n state.exposedAssignmentKeys.clear();\n if (state.config && state.config.runtimeProfile !== \"empty_project\") {\n updateProjectActivationDiagnostics(state.config);\n }\n}\n\nexport function canMintVerifiedRedirectCarry(config: InitConfig): boolean {\n return Boolean(\n config.shopId &&\n config.endpoint &&\n config.ingestSignature &&\n config.externalTracking?.signed !== false,\n );\n}\n\nexport function planRedirectAssignment(\n config: InitConfig,\n experiments: Experiment[],\n assignments: Assignment[],\n): ReturnType<typeof redirectPlanForAssignment> {\n if (state.holdout) return null;\n return !state.qaMode && !state.screenshotMode\n ? redirectPlanForAssignment(\n experiments,\n assignments,\n location.href,\n state.userId ?? \"\",\n config.externalTracking,\n // Match the external-link handover chokepoint: consent-pending (and DNT)\n // redirects still navigate, but cannot link attribution across origins.\n // The destination intentionally mints an independent identity.\n persistentStorageAllowed() && canMintVerifiedRedirectCarry(config),\n configuredStoreOrigins(config),\n )\n : null;\n}\n\nexport function navigateForRedirectAssignment(\n config: InitConfig,\n experiments: Experiment[],\n assignments: Assignment[],\n): boolean {\n const redirectPlan = planRedirectAssignment(config, experiments, assignments);\n if (!redirectPlan) return false;\n\n state.redirectNavigationPending = true;\n // A fresh network config can replace a cached visual config while the\n // cached after-hydration apply is still pending. Redirect navigation has no\n // DOM apply to wait for, so detach that stale gate before emitting the\n // redirect exposure; otherwise both analytics startup and track() queue\n // behind a promise that cannot settle before location.replace unloads us.\n state.pendingInitialApply = null;\n if (state.analyticsStarted) {\n // A DOM/manual/prerequisite recheck can discover the redirect after this\n // pageload already exposed the assignment. Keep the pageload dedupe key:\n // track only when it has not yet been recorded, and never contaminate the\n // arm with a second exposure immediately before navigation.\n trackViewedAssignments(config, [redirectPlan.assignment]);\n } else {\n startAnalyticsStage(config, experiments, [redirectPlan.assignment]);\n }\n // Start the keepalive request before navigation. The redirect assignment is\n // now in the tracker queue and must not wait for the normal batch interval,\n // because location.replace may tear down this document immediately.\n void state.tracker?.flush();\n if (\n state.exposedAssignmentKeys.has(\n exposureAssignmentKey(redirectPlan.assignment),\n )\n ) {\n markRedirectAssignmentCarryExposed(redirectPlan.destination);\n }\n const canMintVerifiedCarry = canMintVerifiedRedirectCarry(config);\n if (\n canMintVerifiedCarry &&\n hasGeneratedRedirectAssignmentCarry(redirectPlan.destination)\n ) {\n void mintBucketingHandoverPayload(\n config,\n state.userId ?? \"\",\n [redirectPlan.assignment],\n ).then((verifiedToken) => {\n finalizeRedirectAssignmentCarryHandover(\n redirectPlan.destination,\n verifiedToken,\n );\n location.replace(redirectPlan.destination.href);\n });\n return true;\n }\n location.replace(redirectPlan.destination.href);\n return true;\n}\n\nexport /** Bounds the unwind drain below; a stuck reset-JS/pushState pair must not livelock. */\nconst RECONCILE_MAX_DRAINS = 3;\n\nexport /**\n * Serialize reconciliation. A nested pass \u2014 merchant reset JS calling\n * `history.pushState` (the router notifies synchronously), or `drip.reevaluate()`\n * from variation JS \u2014 would read a page mid-teardown and let the outer pass\n * delete artifacts the nested pass just applied. A nested call only records\n * that another pass is due. The outer pass drains it on unwind and re-derives\n * URL, targeting, and page activation from live state, so a nested navigation\n * still lands; the drain runs the outer pass's own reason and force flag.\n */\nfunction reevaluateAssignments(\n reason: \"url\" | \"dom\" | \"manual\" | \"prerequisite\",\n forceReapply = false,\n skipHoldGate = false,\n pageRuleScope?: PageRuleReconcileScope,\n): Assignment[] {\n if (state.reconcileInProgress) {\n state.reconcilePending = true;\n return state.assignments;\n }\n for (let drain = 0; drain < RECONCILE_MAX_DRAINS; drain += 1) {\n state.reconcilePending = false;\n state.reconcileInProgress = true;\n try {\n // Every pass path leaves its result in state.assignments.\n reevaluateAssignmentsPass(\n reason,\n forceReapply,\n skipHoldGate,\n pageRuleScope,\n );\n } finally {\n state.reconcileInProgress = false;\n }\n if (!state.reconcilePending) break;\n }\n if (state.reconcilePending) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"eval\", \"Reconcile drain limit reached; dropped a queued re-evaluation\");\n }\n state.reconcilePending = false;\n return state.assignments;\n}\n\nexport function reevaluateAssignmentsPass(\n reason: \"url\" | \"dom\" | \"manual\" | \"prerequisite\",\n forceReapply: boolean,\n skipHoldGate: boolean,\n pageRuleScope?: PageRuleReconcileScope,\n): Assignment[] {\n if (!state.config || !state.userId) return state.assignments;\n if (state.pendingInitialApply) {\n // The initial apply is gated behind hydration (after_hydration / a\n // pre-init hold). Running a recheck now \u2014 e.g. setConsent() before\n // hydration settles \u2014 would apply mutations outside the gate; queue ONE\n // coalesced recheck until the gate opens (mutation storms during a\n // multi-second hydration window must not each schedule a full scan).\n if (state.queuedRecheck) {\n state.queuedRecheck.reason = reason;\n state.queuedRecheck.forceReapply =\n state.queuedRecheck.forceReapply || forceReapply;\n if (state.queuedRecheck.pageRuleScope && pageRuleScope) {\n state.queuedRecheck.pageRuleScope = {\n triggeredPageIds: new Set([\n ...state.queuedRecheck.pageRuleScope.triggeredPageIds,\n ...pageRuleScope.triggeredPageIds,\n ]),\n includeImmediate:\n state.queuedRecheck.pageRuleScope.includeImmediate ||\n pageRuleScope.includeImmediate,\n };\n } else {\n // A queued global pass must remain global.\n state.queuedRecheck.pageRuleScope = undefined;\n }\n } else {\n state.queuedRecheck = {\n reason,\n forceReapply,\n pageRuleScope: pageRuleScope\n ? {\n triggeredPageIds: new Set(pageRuleScope.triggeredPageIds),\n includeImmediate: pageRuleScope.includeImmediate,\n }\n : undefined,\n };\n void state.pendingInitialApply.then(() => {\n const queued = state.queuedRecheck;\n state.queuedRecheck = null;\n if (queued) {\n reevaluateAssignments(\n queued.reason,\n queued.forceReapply,\n false,\n queued.pageRuleScope,\n );\n }\n });\n }\n return state.assignments;\n }\n if (!skipHoldGate && hasMutationHold()) {\n // A framework hold (drip.hold()) during an SPA route hydration defers\n // recheck applies exactly like the initial one. The gate fails open at\n // the hydration timeout; skipHoldGate prevents re-gating after that.\n const gate: Promise<void> = awaitHydration(\n state.config.spa?.hydrationTimeoutMs ?? 3_000,\n { waitForHydration: false },\n ).then(() => {\n if (state.pendingInitialApply === gate) state.pendingInitialApply = null;\n reevaluateAssignments(\n reason,\n forceReapply,\n true,\n pageRuleScope,\n );\n });\n state.pendingInitialApply = gate;\n return state.assignments;\n }\n if (state.config.runtimeProfile === \"empty_project\" && state.perfFlags.perf_empty_project_v1) {\n state.assignments = [];\n state.variationPrerequisiteMet = true;\n state.activationDiagnostics = { project: { gates: [] }, experiments: [] };\n state.lastAssignmentSignature = \"none\";\n reconcileArtifacts(new Map());\n return state.assignments;\n }\n const exps = state.config.experiments ?? [];\n\n captureUrlSignals(state.config);\n captureDomAndGlobalSignals(state.config);\n state.variationPrerequisiteMet = variationsAllowed(state.config);\n updateProjectActivationDiagnostics(state.config);\n if (!state.variationPrerequisiteMet) {\n state.assignments = [];\n state.activationDiagnostics.experiments = [];\n state.lastAssignmentSignature = \"none\";\n reconcileArtifacts(new Map());\n revealAll();\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `Variations blocked by project prerequisite (${reason})`);\n notifyQaAssistantRuntimeListeners();\n return state.assignments;\n }\n\n const evaluationUrl = location.href;\n const targetingSourceAttributes = state.config.attributes ??\n EMPTY_TARGETING_ATTRIBUTES;\n const targetingPass = createTargetingEvaluationPass(\n targetingSourceAttributes,\n evaluationUrl,\n persistentStorageAllowed(),\n );\n const previousRuntimeKeys = assignmentRuntimeKeys(state.assignments);\n const pageActivation = reconcilePageActivation(exps, evaluationUrl, {\n targetingPass,\n pageRuleScope,\n });\n const teardownPages = pageActivation.transitions\n .filter((transition) => transition.teardown)\n .map((transition) => ({ pageId: transition.pageId, mode: transition.mode }));\n if (teardownPages.length > 0) {\n teardownTransaction(teardownPages, { goalUrl: evaluationUrl });\n }\n state.pageActivation = pageActivation.next;\n pageActivation.pollRules.forEach((rule) => startPageRulePoll(rule));\n syncAssignmentPageActive(state.assignments, exps);\n const edgeEligibility = state.config.userId == null && edgeRuntimeActive()\n ? evaluateWithDiagnostics(exps, {\n url: evaluationUrl,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: persistentStorageAllowed(),\n storeOrigin: configuredStoreOrigins(state.config),\n targetingPass,\n })\n : null;\n const edgeEvaluation = edgeEligibility\n ? evaluateEdgeRuntimeAssignments(\n exps,\n {\n url: evaluationUrl,\n attributes: targetingAttributesForPass(\n targetingPass,\n targetingSourceAttributes,\n evaluationUrl,\n persistentStorageAllowed(),\n ),\n userId: state.userId,\n },\n edgeEligibility.assignments,\n edgeEligibility.diagnostics,\n )\n : null;\n const fallbackExperiments = edgeEvaluation\n ? edgeEvaluation.experimentIds.size > 0\n ? exps.filter((experiment) => !edgeEvaluation.experimentIds.has(experiment.id))\n : []\n : exps;\n const fallbackEvaluation = evaluateWithDiagnostics(fallbackExperiments, {\n url: evaluationUrl,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: persistentStorageAllowed(),\n storeOrigin: configuredStoreOrigins(state.config),\n exclusionGroups: state.config.exclusionGroups,\n targetingPass,\n });\n const evaluation = edgeEvaluation\n ? resolveCombinedEdgeEvaluation(\n edgeEvaluation.assignments,\n fallbackEvaluation.assignments,\n [...edgeEvaluation.diagnostics, ...fallbackEvaluation.diagnostics],\n {\n userId: state.userId,\n exclusionGroups: state.config.exclusionGroups,\n },\n )\n : fallbackEvaluation;\n const preserved = preservePersistentAssignments(\n edgeEvaluation\n ? state.assignments.filter(\n (assignment) => !edgeEvaluation.experimentIds.has(assignment.experimentId),\n )\n : state.assignments,\n evaluation.assignments,\n exps,\n );\n // A persistent targeting lifecycle may reintroduce a prior assignment after\n // pass two. Re-run the group plane so that cannot resurrect a group loser.\n const updated = syncAssignmentPageActive(filterUnsafeRedirectAssignments(\n exps,\n applyExclusionAndPersonalization(preserved, {\n userId: state.userId,\n exclusionGroups: state.config.exclusionGroups,\n }).assignments,\n evaluationUrl,\n state.userId,\n state.config.externalTracking,\n shouldPreserveOffTargetRedirectAssignment,\n configuredStoreOrigins(state.config),\n ), exps);\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n const nextSignature = assignmentSignature(updated);\n const signatureChanged = nextSignature !== state.lastAssignmentSignature;\n state.lastAssignmentSignature = nextSignature;\n state.assignments = updated;\n recordAttributableAssignments(updated);\n if (forceReapply) invalidateLiveArtifactsForReplay();\n const artifactResult = reconcileArtifacts(\n desiredArtifactSet(updated),\n evaluationUrl,\n );\n reassertAssignmentMutations(updated);\n const runtimeAssignmentsChanged = !sameStringSet(\n previousRuntimeKeys,\n assignmentRuntimeKeys(updated),\n );\n if (runtimeAssignmentsChanged) installSdkCartMintTrigger();\n if (\n runtimeAssignmentsChanged &&\n state.analyticsStarted &&\n !trackingBlocked() &&\n state.trackingPrerequisiteMet\n ) {\n setupHeatmapTracking(state.assignments, exps);\n setupReplayTracking(state.assignments, exps);\n syncActiveAssignmentToShopifyCart();\n scheduleShopifyAssignmentSync();\n if (reason !== \"url\") {\n trackViewedAssignments(state.config, undefined, targetingPass);\n }\n }\n\n if (navigateForRedirectAssignment(state.config, exps, state.assignments)) {\n notifyQaAssistantRuntimeListeners();\n return state.assignments;\n }\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `Re-evaluated assignments (${reason})`, {\n artifactResult,\n count: state.assignments.length,\n signatureChanged,\n });\n notifyQaAssistantRuntimeListeners();\n return state.assignments;\n}\n\nexport function reapplyQaAssistantForceMap(): void {\n if (!state.config || !state.userId) {\n try {\n location.reload();\n } catch {}\n return;\n }\n reconcileForcedUnavailable(state.config);\n reevaluateAssignments(\"manual\", true);\n notifyQaAssistantRuntimeListeners();\n}\n\nexport function reconcileForcedUnavailable(config: InitConfig): void {\n if (!state.qaMode) {\n state.forcedUnavailable = [];\n state.edgeDeviceAudienceUnsupported = [];\n return;\n }\n const loadedExperimentIds = new Set((config.experiments ?? []).map((experiment) => experiment.id));\n const warningsByExperimentId = new Map(\n (config.qa_warnings ?? [])\n .filter((warning) => warning.code === \"forced_experiment_unavailable\")\n .flatMap((warning) => warning.reason ? [[warning.experiment_id, warning.reason] as const] : []),\n );\n state.forcedUnavailable = Object.keys(state.forceMap ?? {}).flatMap((experimentId) =>\n loadedExperimentIds.has(experimentId)\n ? []\n : [{\n experimentId,\n reason: warningsByExperimentId.get(experimentId) ?? \"not_in_config\" as const,\n }],\n );\n state.edgeDeviceAudienceUnsupported = (config.qa_warnings ?? []).flatMap((warning) =>\n warning.code === \"edge_device_audience_unsupported\" && warning.audience_name\n ? [{ experimentId: warning.experiment_id, audienceName: warning.audience_name }]\n : [],\n );\n}\n\nexport function __getQaAssistantRuntimeSnapshot(): QaAssistantRuntimeSnapshot {\n return {\n config: state.config,\n assignments: state.assignments.slice(),\n activationDiagnostics: {\n project: { gates: state.activationDiagnostics.project.gates.slice() },\n experiments: state.activationDiagnostics.experiments.slice(),\n },\n pageActivation: pageActivationDiagnosticRows({ includePageNames: true }),\n goalScopeUrl: state.wiredGoalUrl,\n forceMap: state.forceMap ? { ...state.forceMap } : null,\n forcedUnavailable: state.forcedUnavailable.map((entry) => ({ ...entry })),\n edgeDeviceAudienceUnsupported: state.edgeDeviceAudienceUnsupported.map((entry) => ({ ...entry })),\n platform: state.platform,\n qaMode: state.qaMode,\n orderIdentity: detectOrderIdentity(),\n };\n}\n\nexport function __subscribeQaAssistantRuntime(listener: () => void): () => void {\n runtimeSharedState.qaAssistantRuntimeListeners.add(listener);\n return () => {\n runtimeSharedState.qaAssistantRuntimeListeners.delete(listener);\n };\n}\n\nexport function __forceQaAssistantVariation(experimentId: string, variationId: string): void {\n if (!experimentId || !variationId) return;\n state.forceMap = { ...(state.forceMap ?? {}), [experimentId]: variationId };\n persistQaForce(state.forceMap);\n reapplyQaAssistantForceMap();\n}\n\nexport function __resetQaAssistantForce(experimentId?: string): void {\n if (!experimentId) {\n state.forceMap = null;\n } else if (state.forceMap) {\n const next = { ...state.forceMap };\n delete next[experimentId];\n state.forceMap = Object.keys(next).length ? next : null;\n }\n persistQaForce(state.forceMap ?? {});\n reapplyQaAssistantForceMap();\n}\n\nexport function clearQaForceFromCurrentUrl(): boolean {\n if (!clearQaForceFromUrl()) return false;\n state.forceMap = null;\n state.qaMode = false;\n state.qaSessionId = \"\";\n if (state.config && state.userId) reapplyQaAssistantForceMap();\n return true;\n}\n\nexport function initWithExperiments(\n config: InitConfig,\n initialExperiments: Experiment[],\n configSource: ConfigSource = \"inline\",\n perfContext: InitPerfContext = createInitPerfContext(),\n parsedRedirectCarry: VerifiedRedirectCarry | null = null,\n verifiedHandover: Awaited<ReturnType<typeof readBucketingHandover>> = null,\n): Assignment[] {\n removeSdkCartMintTrigger();\n if (runtimeSharedState.earlyReassertTeardownTimer) clearTimeout(runtimeSharedState.earlyReassertTeardownTimer);\n runtimeSharedState.stopEarlyReassert?.();\n runtimeSharedState.stopEarlyReassert = null;\n let experiments = initialExperiments;\n const previousConfigSource = state.configSource;\n const runtimeResolveStartedAt = monotonicNow();\n const runtimeConfig = resolveRuntimeConfig(config);\n const afMode = runtimeConfig.antiFlickerMode;\n const afTimeout = runtimeConfig.antiFlickerTimeoutMs;\n const trackStart = runtimeConfig.trackingStart;\n const idleTimeout = runtimeConfig.trackingIdleTimeoutMs;\n const jsPolicy = runtimeConfig.customJsPolicy;\n const platform = resolvePlatform(config);\n const perfFlags = readPerfFlags(config);\n const emptyProjectProfileCandidate = canUseEmptyProjectProfile(config, experiments, platform);\n const activationMode = resolveActivationMode(config);\n const pageTriggerMode = resolvePageTriggerMode(config);\n const detectorRules = collectPageDetectorRules(experiments);\n const hasHistoryPageRules = (detectorRules.get(\"history\")?.length ?? 0) > 0;\n const hasPollingPageRules = (detectorRules.get(\"polling\")?.length ?? 0) > 0;\n const hasDomPageRules = (detectorRules.get(\"dom\")?.length ?? 0) > 0;\n const baseRouterMode = resolveRouterMode(config, platform);\n const historyForcedRouterMode =\n (pageTriggerMode === \"url_change\" || hasHistoryPageRules) &&\n baseRouterMode === \"none\"\n ? \"history\"\n : baseRouterMode;\n const routerMode = hasPollingPageRules &&\n (historyForcedRouterMode === \"none\" || historyForcedRouterMode === \"history\")\n ? \"polling\"\n : historyForcedRouterMode;\n const manualInitialTrigger = config.spa?.reinitOnly === true || pageTriggerMode === \"manual\";\n const shopDomPageTrigger = resolveDomPageTrigger(config, pageTriggerMode);\n const domPageTrigger = shopDomPageTrigger || hasDomPageRules;\n const urlDiffNeeds = computeUrlDiffNeeds(\n experimentsForGlobalRouteReevaluation(experiments),\n config.signals,\n );\n addInitPhase(perfContext, \"runtime_setup_ms\", runtimeResolveStartedAt);\n const assignmentStartedAt = monotonicNow();\n const initStartedAt = Date.now();\n updateLoadDiagnostics({\n stage: \"init_started\",\n startedAt: initStartedAt,\n configFetchStatus: configSource === \"network\" ? state.load.configFetchStatus : state.load.configFetchStatus ?? \"idle\",\n });\n const consentIdentityStartedAt = monotonicNow();\n const initialConsentRequired = resolveConsentRequired(config);\n const initialConsentGranted = resolveConsentGranted(config, initialConsentRequired);\n const initialTrackingDisabledByDnt = doNotTrackEnabled(config);\n const initialStorageAllowed = storageAllowed(\n initialConsentRequired,\n initialConsentGranted,\n initialTrackingDisabledByDnt,\n );\n // Only the exact baked inline payload may consume the handoff. Cache and\n // network refreshes are authoritative re-evaluations (kill-switch path).\n const predecided = configSource === \"inline\"\n ? bootstrapPredecision(config, perfContext)\n : null;\n state.consentRequired = initialConsentRequired;\n state.consentGranted = initialConsentGranted;\n state.consentModeEnabled = config.consentMode?.enabled === true;\n state.trackingDisabledByDnt = initialTrackingDisabledByDnt;\n configureIdentityStorage(initialStorageAllowed ? config.dataProtection : { ...(config.dataProtection ?? {}), storageMode: \"memory\" });\n if (!initialStorageAllowed) {\n clearEarlyInteractions();\n clearConsentStorage();\n }\n const redirectCarry = emptyProjectProfileCandidate || !initialStorageAllowed || config.userId\n ? null\n : validateRedirectAssignmentCarry(\n experiments,\n parsedRedirectCarry,\n typeof location !== \"undefined\" ? location.href : undefined,\n );\n if (redirectCarry) {\n adoptUserId(redirectCarry.visitorId);\n clearPendingRedirectAssignmentCarry();\n }\n const handover = emptyProjectProfileCandidate ? null : verifiedHandover;\n if (initialStorageAllowed && handover?.visitorId && !config.userId && !redirectCarry) {\n adoptUserId(handover.visitorId);\n }\n const predecidedIdentityHint = config.userId == null\n ? predecided?.visitorId\n : undefined;\n const identityHint = config.userId ?? predecidedIdentityHint;\n const resolvedUserId = initialStorageAllowed\n ? getUserId(identityHint)\n : getEphemeralUserId(identityHint);\n if (initialStorageAllowed && predecidedIdentityHint) {\n adoptUserId(resolvedUserId);\n }\n if (predecided && resolvedUserId !== predecided.visitorId) perfContext.predecisionMismatches += 1;\n\n // This gate is intentionally synchronous and precedes both applyProjectCode\n // and assignment evaluation below. That ordering lets a cached config which\n // already carries holdout settings prevent cached project/variation code\n // without waiting for the network refresh. Operational sessions must always\n // retain the complete experiment runtime; QA includes preview sessions.\n state.qaMode = isQaMode();\n state.screenshotMode = isScreenshotMode();\n state.holdout = !state.qaMode && !state.screenshotMode && isHoldoutVisitor(config, resolvedUserId);\n if (state.holdout) experiments = applyHoldoutGate(config, resolvedUserId, experiments);\n if (\n configSource === \"network\" &&\n previousConfigSource === \"cache\" &&\n state.holdout\n ) {\n // Cached direct/headless installs render before the network response. If\n // the authoritative config moves this visitor into holdout, retire every\n // cached treatment before replacing the assignment set.\n resetProjectCode();\n }\n\n configureDebug(config.debug, resolvedUserId, { storageAllowed: initialStorageAllowed });\n addInitPhase(perfContext, \"consent_identity_ms\", consentIdentityStartedAt);\n\n const runtimeSetupStartedAt = monotonicNow();\n __DRIP_FEATURE_DEVTOOLS__ && debugGroup(\"init\");\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", `Initializing with ${experiments.length} experiment(s)`, {\n executionMode: runtimeConfig.executionMode,\n antiFlicker: afMode,\n trackingStart: trackStart,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n configSource,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated snippet runtime\", {\n revision: config.delivery?.revision,\n sdkVariant: config.runtimeFeatures?.sdkVariant,\n configSource,\n deliveryState: config.delivery?.deliveryState ?? config.deliveryState,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated project\", {\n shopId: config.shopId,\n executionMode: runtimeConfig.executionMode,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", `Init: ${experiments.length} experiment(s)`, {\n executionMode: runtimeConfig.executionMode,\n antiFlicker: afMode,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n configSource,\n });\n\n // Apply custom JS policy\n setJsPolicy(jsPolicy);\n if (!emptyProjectProfileCandidate && !state.holdout) applyProjectCode(config);\n\n const urlForceMap = parseForceParam();\n const handoverForceMap = handover?.forceMap && Object.keys(handover.forceMap).length > 0\n ? handover.forceMap\n : null;\n state.forceMap = handoverForceMap || urlForceMap\n ? { ...(handoverForceMap ?? {}), ...(urlForceMap ?? {}) }\n : null;\n\n // QA and screenshot sessions retain the full runtime even if the published\n // project is otherwise empty.\n const emptyProjectFastPath = emptyProjectProfileCandidate\n && !state.qaMode\n && !state.screenshotMode;\n const resolvedConfig = {\n ...config,\n experiments,\n ...(state.holdout ? { commerce: undefined } : {}),\n runtimeProfile: emptyProjectFastPath ? \"empty_project\" : \"full\",\n };\n if (\n resolvedConfig.cartAttributeWrite === \"external\" &&\n state.config?.cartAttributeWrite !== \"external\"\n ) {\n runtimeSharedState.shopifyCartSyncGeneration += 1;\n invalidateShopifyCartAttributeSync();\n }\n if (state.config?.shopId && state.config.shopId !== resolvedConfig.shopId) {\n state.shopifyCartToken = null;\n state.shopwareAttributionEnvelope = null;\n }\n // A network refresh may remove the cached price plane while its display or\n // cart authorization is still live. The empty-project/lazy path deliberately\n // skips applyCommercePrice, so teardown must happen before replacing config.\n const priorPriceSyncPending = hasActivePriceAuthorizationPlane()\n && state.lastShopifyCartSync?.status === \"pending\";\n if (\n !resolvedConfig.commerce?.price &&\n (hasCommercePriceState() || priorPriceSyncPending)\n ) {\n runtimeSharedState.shopifyCartSyncGeneration += 1;\n invalidateShopifyCartAttributeSync();\n cleanupCommercePrice();\n }\n state.config = resolvedConfig;\n reconcileForcedUnavailable(state.config);\n if (state.userId && state.userId !== resolvedUserId) {\n // The envelope is signed for the previous visitor; a rotated identity must\n // never sync a stale envelope before the next assign response replaces it.\n state.shopwareAttributionEnvelope = null;\n }\n state.userId = resolvedUserId;\n state.trackingStart = trackStart;\n state.trackingIdleTimeoutMs = idleTimeout;\n state.consentRequired = initialConsentRequired;\n state.consentGranted = initialConsentGranted;\n state.consentModeEnabled = config.consentMode?.enabled === true;\n state.trackingDisabledByDnt = initialTrackingDisabledByDnt;\n state.variationPrerequisiteMet = emptyProjectFastPath || variationsAllowed(resolvedConfig);\n state.trackingPrerequisiteMet = emptyProjectFastPath || trackingAllowed(resolvedConfig);\n state.analyticsStarted = false;\n state.exposedAssignmentKeys.clear();\n // Cache-to-network init is a delivery refresh, not proof that an equivalent\n // assignment became healthy. Preserve its fail-closed state until the new\n // assignment set is known, then prune keys for assignments no longer held.\n state.authorizedPriceAssignmentKeys = null;\n state.authorizedShippingAssignmentKeys = null;\n state.authorizedOffersAssignmentKeys = null;\n state.redirectNavigationPending = false;\n if (headlessCartAuthorizationState) {\n headlessCartAuthorizationState.generation += 1;\n headlessCartAuthorizationState.confirmationPending = false;\n headlessCartAuthorizationState.pending = null;\n }\n state.platform = platform;\n state.routerMode = routerMode;\n state.activationMode = activationMode;\n state.perfFlags = perfFlags;\n state.urlDiffNeeds = urlDiffNeeds;\n state.configSource = configSource;\n state.runtimeConfig = runtimeConfig;\n state.pageTriggerMode = pageTriggerMode;\n pendingDataLayerEvents.length = 0;\n state.initializingAssignments = true;\n const url = config.url ?? location.href;\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated page\", {\n url,\n experiments: experiments.length,\n signals: resolvedConfig.signals?.length ?? 0,\n });\n\n // QA session persistence\n if (state.qaMode) {\n state.qaSessionId = getQaSessionId(generateQaSessionId, { storageAllowed: persistentStorageAllowed() });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"QA mode active\", { forceMap: state.forceMap, sessionId: state.qaSessionId });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"qa\", \"QA mode active\", { sessionId: state.qaSessionId });\n if (state.forceMap) {\n // This functional first-party merchant-QA cookie is written only after an explicit\n // QA URL open and deliberately bypasses the consent gate.\n persistUrlQaForce(state.forceMap);\n }\n } else {\n state.qaSessionId = \"\";\n }\n if (state.screenshotMode) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"Screenshot mode active\");\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"qa\", \"Screenshot mode active\");\n }\n\n // Cleanup previous init\n if (state.stopObserver) {\n state.stopObserver();\n state.stopObserver = null;\n }\n if (state.deferredRouteReevaluationTimer !== null) {\n window.clearTimeout(state.deferredRouteReevaluationTimer);\n state.deferredRouteReevaluationTimer = null;\n }\n if (state.stopDomObserver) {\n state.stopDomObserver();\n state.stopDomObserver = null;\n }\n cancelAllPageRulePolls();\n runtimeSharedState.pageDetectorLastUrls.clear();\n runtimeSharedState.pageDetectorRules = detectorRules;\n if (state.stopHandover) {\n state.stopHandover();\n state.stopHandover = null;\n }\n if (state.stopSignalCaptures) {\n state.stopSignalCaptures();\n state.stopSignalCaptures = null;\n }\n if (state.stopSurfaceSignals) {\n state.stopSurfaceSignals();\n state.stopSurfaceSignals = null;\n }\n if (state.stopJsTriggerSignals) {\n state.stopJsTriggerSignals();\n state.stopJsTriggerSignals = null;\n }\n if (state.stopDataLayerTriggers) {\n state.stopDataLayerTriggers();\n state.stopDataLayerTriggers = null;\n }\n if (state.stopConsentListeners) {\n state.stopConsentListeners();\n state.stopConsentListeners = null;\n }\n // Keep an in-flight consent-pending write attached across cache-to-network re-init.\n // Its completion schedules the current consented stamp after the older write.\n state.stopShopifyCartMutationSync?.();\n state.stopShopifyCartMutationSync = null;\n clearScheduledAnalyticsStart();\n unwireGoals();\n cleanupHeatmapTracking();\n cleanupReplayTracking();\n cleanupSemanticTracking();\n if (state.tracker) {\n state.tracker.stop();\n state.tracker = null;\n }\n state.pendingDeliveryHealth = [];\n // The authorized empty-project profile has no visual treatment to measure;\n // reset any prior route measurement without constructing an observer.\n startCwvMeasurement(emptyProjectFastPath);\n\n state.stopConsentListeners = installConsentChangeListeners(resolvedConfig);\n if (!emptyProjectFastPath) {\n captureUrlSignals(resolvedConfig);\n captureDomAndGlobalSignals(resolvedConfig);\n state.stopSignalCaptures = installClickSignalCaptures(resolvedConfig);\n state.stopSurfaceSignals = experimentsUseSurfaceSignals(experiments)\n ? installSurfaceSignals(() => {\n captureDomAndGlobalSignals(resolvedConfig);\n reevaluateAssignments(\"dom\");\n })\n : null;\n state.stopJsTriggerSignals = installJsTriggerObserver(\n experiments,\n () => {\n reevaluateAssignments(\"dom\");\n },\n manualInitialTrigger,\n );\n state.stopDataLayerTriggers = installDataLayerTriggers(resolvedConfig);\n }\n\n // Evaluate and apply. For generated snippets, use the compact critical path\n // plan first, then fall back to the general evaluator for complex/noncritical\n // experiments that were not safely precompiled.\n if (emptyProjectFastPath) {\n state.activationDiagnostics = { project: { gates: [] }, experiments: [] };\n } else {\n updateProjectActivationDiagnostics(resolvedConfig);\n for (const gate of state.activationDiagnostics.project.gates) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Project ${gate.label} is ${gate.status}`, {\n reason: gate.reason,\n ...(gate.detail && typeof gate.detail === \"object\" ? { detail: gate.detail } : {}),\n });\n }\n }\n addInitPhase(perfContext, \"runtime_setup_ms\", runtimeSetupStartedAt);\n const targetingAssignmentStartedAt = monotonicNow();\n state.carryImportedAssignmentKeys.clear();\n if (redirectCarry && persistentStorageAllowed() && !state.qaMode && !state.screenshotMode) {\n importRedirectAssignmentCarry(redirectCarry, location.href, !edgeRuntimeActive());\n state.carryImportedAssignmentKeys.add(\n redirectCarryAssignmentKey(\n redirectCarry.experiment.id,\n redirectCarry.variationId,\n Math.max(\n 1,\n Number.isSafeInteger(redirectCarry.experiment.assignmentEpoch)\n ? redirectCarry.experiment.assignmentEpoch!\n : 1,\n ),\n ),\n );\n }\n const persistedAssignments = emptyProjectFastPath\n ? undefined\n : loadPersistedAssignments(experiments);\n let initialTargetingPass =\n !emptyProjectFastPath && !manualInitialTrigger && state.variationPrerequisiteMet\n ? createTargetingEvaluationPass(\n resolvedConfig.attributes ?? EMPTY_TARGETING_ATTRIBUTES,\n url,\n persistentStorageAllowed(),\n )\n : undefined;\n const pageActivation = reconcilePageActivation(experiments, url, {\n previous: state.pageActivation,\n persistedAssignments,\n targetingPass: initialTargetingPass,\n });\n const teardownPages = pageActivation.transitions\n .filter((transition) => transition.teardown)\n .map((transition) => ({ pageId: transition.pageId, mode: transition.mode }));\n if (teardownPages.length > 0) {\n teardownTransaction(teardownPages, { goalUrl: url });\n }\n state.pageActivation = pageActivation.next;\n pageActivation.pollRules.forEach((rule) => startPageRulePoll(rule));\n if (emptyProjectFastPath) {\n state.assignments = [];\n } else if (!manualInitialTrigger && state.variationPrerequisiteMet) {\n const targetingSourceAttributes = resolvedConfig.attributes ??\n EMPTY_TARGETING_ATTRIBUTES;\n const targetingPass = initialTargetingPass ?? createTargetingEvaluationPass(\n targetingSourceAttributes,\n url,\n persistentStorageAllowed(),\n );\n initialTargetingPass = targetingPass;\n const attributes = targetingAttributesForPass(\n targetingPass,\n targetingSourceAttributes,\n url,\n persistentStorageAllowed(),\n );\n const usablePredecision = predecided && predecided.visitorId === state.userId\n ? predecided\n : null;\n const edgeEligibility = config.userId == null && edgeRuntimeActive()\n ? evaluateWithDiagnostics(experiments, {\n url,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: false,\n storeOrigin: configuredStoreOrigins(resolvedConfig),\n persistedAssignments,\n targetingPass,\n })\n : null;\n const edgeEvaluation = edgeEligibility\n ? evaluateEdgeRuntimeAssignments(\n experiments,\n {\n url,\n attributes,\n userId: state.userId,\n },\n edgeEligibility.assignments,\n edgeEligibility.diagnostics,\n )\n : null;\n // Targeting runs before the real SDK exclusion resolver. The bootstrap\n // deliberately hands over unfiltered per-experiment decisions.\n if (state.holdout) {\n runtimeSharedState.initialPredecidedByExperiment = null;\n state.assignments = [];\n state.activationDiagnostics.experiments = [];\n } else if (edgeEvaluation || usablePredecision) {\n const fallbackExperiments = edgeEvaluation\n ? edgeEvaluation.experimentIds.size > 0\n ? experiments.filter((experiment) => !edgeEvaluation.experimentIds.has(experiment.id))\n : []\n : experiments;\n if (usablePredecision) {\n runtimeSharedState.initialPredecidedByExperiment = new Map(usablePredecision.decision);\n }\n try {\n const fallback = evaluateWithDiagnostics(fallbackExperiments, {\n url,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: false,\n targetingPass,\n storeOrigin: configuredStoreOrigins(resolvedConfig),\n persistedAssignments,\n exclusionGroups: config.exclusionGroups,\n storedGroupSelections: usablePredecision?.groups,\n holdout: usablePredecision\n ? { enabled: config.holdout_v1_enabled, percentage: config.holdout_pct }\n : undefined,\n });\n if (edgeEvaluation) {\n const combined = resolveCombinedEdgeEvaluation(\n edgeEvaluation.assignments,\n fallback.assignments,\n [...edgeEvaluation.diagnostics, ...fallback.diagnostics],\n {\n userId: state.userId,\n exclusionGroups: config.exclusionGroups,\n },\n );\n state.assignments = combined.assignments;\n state.activationDiagnostics.experiments = combined.diagnostics;\n } else {\n state.assignments = fallback.assignments;\n state.activationDiagnostics.experiments = fallback.diagnostics;\n }\n } finally {\n runtimeSharedState.initialPredecidedByExperiment = null;\n }\n } else if (config.exclusionGroups?.length) {\n const evaluation = evaluateWithDiagnostics(experiments, {\n url,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: false,\n storeOrigin: configuredStoreOrigins(resolvedConfig),\n exclusionGroups: config.exclusionGroups,\n persistedAssignments,\n targetingPass,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n } else {\n const critical = buildCriticalPathAssignments(\n experiments,\n config.delivery?.criticalMutationPlan,\n { url, attributes, userId: state.userId },\n );\n const fallbackExperiments = critical.plannedExperimentIds.size\n ? experiments.filter(\n (experiment) =>\n !critical.plannedExperimentIds.has(experiment.id) ||\n !critical.assignments.some(\n (assignment) => assignment.experimentId === experiment.id,\n ),\n )\n : experiments;\n const fallback = evaluateWithDiagnostics(fallbackExperiments, {\n url,\n attributes: targetingSourceAttributes,\n userId: state.userId,\n persistSignals: false,\n storeOrigin: configuredStoreOrigins(resolvedConfig),\n persistedAssignments,\n targetingPass,\n });\n state.assignments = [\n ...critical.assignments,\n ...fallback.assignments,\n ];\n const fallbackDiagnosticIds = new Set(\n fallback.diagnostics.map((diagnostic) => diagnostic.experimentId),\n );\n state.activationDiagnostics.experiments = [\n ...critical.skippedDiagnostics.filter(\n (diagnostic) => !fallbackDiagnosticIds.has(diagnostic.experimentId),\n ),\n ...fallback.diagnostics,\n ];\n for (const assignment of critical.assignments) {\n const experiment = experiments.find((candidate) => candidate.id === assignment.experimentId);\n if (!experiment) continue;\n state.activationDiagnostics.experiments.unshift(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"passed\", reason: \"precompiled_delivery_match\" },\n // Critical-plan invariant: only campaigns without non-URL\n // targeting are precompiled \u2014 the truthful audience result is\n // \"all visitors\", same as the skip-path diagnostics.\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n { id: \"traffic\", label: \"Traffic allocation\", status: \"passed\", reason: \"included\" },\n { id: \"assignment\", label: \"Variation assignment\", status: \"passed\", reason: \"precompiled_assignment\" },\n ],\n assignment,\n \"precompiled_assignment\",\n ));\n }\n }\n } else {\n state.assignments = [];\n state.activationDiagnostics.experiments = manualInitialTrigger\n ? experiments.map((experiment) => experimentDiagnostic(\n experiment,\n [{ id: \"activation\", label: \"Page trigger\", status: \"skipped\", reason: \"manual_initial_trigger\" }],\n null,\n \"manual_initial_trigger\",\n ))\n : [];\n }\n if (state.assignments.length > 1) {\n const filteredInitial = enforcePersonalizationStopAfterMatch(\n state.assignments,\n state.activationDiagnostics.experiments,\n );\n state.assignments = filteredInitial.assignments;\n state.activationDiagnostics.experiments = filteredInitial.diagnostics ?? state.activationDiagnostics.experiments;\n }\n state.assignments = filterUnsafeRedirectAssignments(\n experiments,\n state.assignments,\n location.href,\n state.userId ?? \"\",\n resolvedConfig.externalTracking,\n shouldPreserveOffTargetRedirectAssignment,\n configuredStoreOrigins(resolvedConfig),\n );\n const currentExposureKeys = new Set(state.assignments.map(exposureAssignmentKey));\n for (const key of state.mutationPendingAssignmentKeys) {\n if (!currentExposureKeys.has(key)) state.mutationPendingAssignmentKeys.delete(key);\n }\n for (const key of state.contaminatedAssignmentKeys) {\n if (!currentExposureKeys.has(key)) state.contaminatedAssignmentKeys.delete(key);\n }\n syncAssignmentPageActive(state.assignments, experiments);\n recordAttributableAssignments(state.assignments);\n if (redirectCarry?.exposureSent) {\n const importedAssignment = state.assignments.find((assignment) =>\n assignment.experimentId === redirectCarry.experiment.id && assignment.variationId === redirectCarry.variationId);\n if (importedAssignment) state.exposedAssignmentKeys.add(exposureAssignmentKey(importedAssignment));\n }\n if (!emptyProjectFastPath && afMode !== \"off\") {\n const scopedSelectors = afMode === \"scoped\"\n ? collectScopedSelectors(experiments, resolvedConfig, state.assignments)\n : undefined;\n applyRuntimeAntiFlicker(afMode, afTimeout, scopedSelectors, runtimeConfig.antiFlickerCustomCss);\n }\n // Assignment persistence belongs to bucketing, not tracking. In particular,\n // a redirect must carry a durable assignment even when the source page's\n // tracking prerequisite keeps analytics and exposure collection closed.\n if (!emptyProjectFastPath) {\n persistActiveExperimentAssignments(experiments);\n }\n if (\n configSource !== \"cache\" &&\n navigateForRedirectAssignment(\n resolvedConfig,\n experiments,\n state.assignments,\n )\n ) {\n addInitPhase(perfContext, \"targeting_assignment_ms\", targetingAssignmentStartedAt);\n finishInitializingAssignments();\n return state.assignments;\n }\n addInitPhase(perfContext, \"targeting_assignment_ms\", targetingAssignmentStartedAt);\n const mutationFinalizeStartedAt = monotonicNow();\n const applyOrReconcileInitialArtifacts = (goalUrl: string): void => {\n if (appliedAssignmentsByKey.size === 0) {\n applyAssignments(state.assignments, state.activationMode, { goalUrl });\n return;\n }\n reconcileArtifacts(desiredArtifactSet(state.assignments), goalUrl);\n reassertAssignmentMutations(state.assignments);\n };\n let initialApplyPromise: Promise<void> | null = null;\n if (!emptyProjectFastPath) {\n const earlyReassertEligible = shouldUseEarlyReassert({\n applyTiming: resolvedConfig.spa?.applyTiming,\n configSource,\n hasTrustedPredecision: predecided !== null && resolvedUserId === predecided.visitorId,\n consentGranted: initialConsentGranted,\n dntBlocked: initialTrackingDisabledByDnt,\n });\n const earlyReassertAssignments = artifactRenderableAssignments(state.assignments);\n // Structural operations cannot be safely reasserted without duplicating\n // inserts or losing their original snapshots. Custom JS is never\n // reassert-safe because replaying it can repeat arbitrary side effects.\n // Route the whole assignment set through the hydration-delayed path.\n const deferStructuralEarlyReassert = earlyReassertEligible && (\n assignmentsHaveStructuralMutations(earlyReassertAssignments)\n || assignmentsHaveCustomJs(earlyReassertAssignments)\n );\n const forcedPreviewSession = (state.qaMode || state.screenshotMode) && state.forceMap !== null;\n const waitForHydration = resolvedConfig.spa?.applyTiming === \"after_hydration\"\n || deferStructuralEarlyReassert\n || (forcedPreviewSession && resolvedConfig.spa?.applyTiming === \"early_reassert\");\n const earlyReassert = earlyReassertEligible && !deferStructuralEarlyReassert;\n const deferForVisualWork = assignmentsHaveVisualWork(\n earlyReassertAssignments,\n resolvedConfig.commerce?.price,\n );\n if ((waitForHydration || hasMutationHold()) && deferForVisualWork) {\n const scheduledConfig = resolvedConfig;\n const scheduledUrl = location.href;\n initialApplyPromise = awaitHydration(\n resolvedConfig.spa?.hydrationTimeoutMs ?? 3_000,\n { waitForHydration },\n ).then(() => {\n // A re-init (e.g. cached config superseded by the network config)\n // replaces the pending gate; a stale promise must not clear the\n // newer one and open the hydration gate early for rechecks.\n if (state.pendingInitialApply === initialApplyPromise) {\n state.pendingInitialApply = null;\n }\n if (state.config !== scheduledConfig) return;\n if (location.href !== scheduledUrl) {\n // The shopper navigated before the gate opened: applying the\n // original route's assignments would flash the previous page's\n // treatment. Re-evaluate for the current URL directly (forcing\n // apply + reveal even when nothing was queued or the signature is\n // unchanged), then run startup JS to preserve the ordering.\n reevaluateAssignments(\"url\", true, true);\n runProjectStartupCode(scheduledConfig);\n return;\n }\n applyOrReconcileInitialArtifacts(scheduledUrl);\n // Preserve the immediate-mode ordering contract: project startup JS\n // runs after assignment mutations, so it can read the variant DOM.\n runProjectStartupCode(scheduledConfig);\n });\n state.pendingInitialApply = initialApplyPromise;\n } else {\n // Immediate apply supersedes any gate left by a previous init.\n state.pendingInitialApply = null;\n if (earlyReassert && deferForVisualWork) {\n const diagnostics = readDripPerf();\n diagnostics.early_apply_at = Date.now();\n diagnostics.reasserts_count = 0;\n diagnostics.revert_loops_detected = 0;\n // The watcher never captures an assignment array: it resolves the live\n // render plane on every fire, so a page teardown \u2014 which clears\n // `pageActive` and drops the artifacts \u2014 silences it by construction.\n const stop = installEarlyReassert({\n diagnostics,\n reapply: reassertAssignmentMutations,\n resolveAssignments: () =>\n activeRenderableAssignments().filter(isOffersDisplayAssignmentAuthorized),\n timeoutMs: Math.max(3_000, resolvedConfig.spa?.hydrationTimeoutMs ?? 3_000),\n });\n runtimeSharedState.stopEarlyReassert = stop;\n void awaitHydration(resolvedConfig.spa?.hydrationTimeoutMs ?? 3_000, {\n waitForHydration: true,\n // The variant was already applied synchronously. This second gate\n // only controls watcher teardown and is not an apply delay.\n recordMetrics: false,\n })\n .catch(() => debugWarn(\"hydration\", \"wait failed\"))\n .finally(() => {\n if (runtimeSharedState.stopEarlyReassert !== stop) return;\n runtimeSharedState.earlyReassertTeardownTimer = setTimeout(stop, 250);\n });\n }\n applyOrReconcileInitialArtifacts(url);\n runProjectStartupCode(resolvedConfig);\n }\n if (persistentStorageAllowed() && config.bucketingCleanup?.enabled !== false) {\n cleanupBucketingStorage(experiments, {\n shopId: config.shopId,\n retentionDays: config.bucketingCleanup?.retentionDays,\n });\n }\n state.stopHandover = installBucketingHandover(config.externalTracking, () => (\n persistentStorageAllowed() && state.userId && state.assignments.length\n ? createBucketingHandoverPayload(state.userId, state.assignments, config.externalTracking)\n : null\n ), () => (\n persistentStorageAllowed() && state.userId && state.assignments.length\n ? mintBucketingHandoverPayload(config, state.userId, state.assignments)\n : Promise.resolve(null)\n ));\n } else {\n // A cached visual config can leave a hydration promise pending when the\n // authoritative network response resolves to the empty fast path. The\n // stale promise is config-guarded, so detach it immediately instead of\n // delaying install/pageview analytics until its timeout.\n state.pendingInitialApply = null;\n if (appliedAssignmentsByKey.size > 0) reconcileArtifacts(new Map(), url);\n }\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n installSdkCartMintTrigger();\n state.lastUrl = location.href;\n addInitPhase(perfContext, \"mutation_finalize_ms\", mutationFinalizeStartedAt);\n const assignmentReadyMonotonicAt = monotonicNow();\n const assignmentReadyMs = boundedPerfDuration(assignmentReadyMonotonicAt - assignmentStartedAt);\n const initTotalMs = boundedPerfDuration(assignmentReadyMonotonicAt - perfContext.startedAt);\n const assignmentReadyAt = Date.now();\n updateLoadDiagnostics({\n stage: \"assignments_ready\",\n assignmentReadyAt,\n assignmentReadyMs,\n });\n queuePerfEvent(buildPerfEvent(resolvedConfig, {\n eventKind: \"init\",\n assignmentReadyMs,\n initTotalMs,\n phases: { ...perfContext.phases },\n includesConfigFetch: perfContext.includesConfigFetch,\n predecisionMismatches: perfContext.predecisionMismatches,\n blankScreenMs: getBlankScreenMs(),\n assignmentReadyAt,\n }));\n const storefrontPerf = readDripPerf();\n const scriptExecStart = numberPerf(storefrontPerf, \"script_exec_start\");\n runtimeSharedState.storefrontVitalsContext = {\n endpoint: resolvedConfig.endpoint ? normalizeEndpoint(resolvedConfig.endpoint) : \"\",\n proxyEventDelivery: resolvedConfig.proxyEventDelivery,\n shopId: resolvedConfig.shopId ?? \"\",\n ingestShopId: resolvedConfig.ingestShopId,\n ingestSignature: resolvedConfig.ingestSignature,\n visitorId: state.userId ?? undefined,\n sampleRate: resolvedConfig.storefrontVitalsSampleRate,\n experimentActive: state.assignments.some(exposable),\n sdkBootToInitMs: scriptExecStart === undefined\n ? undefined\n : Math.max(0, assignmentReadyAt - initTotalMs - scriptExecStart),\n getAntiFlickerInsertedToRevealMs: () => {\n const livePerf = readDripPerf();\n const insertedAt = numberPerf(livePerf, \"anti_flicker_inserted_at\");\n if (insertedAt === undefined) return undefined;\n const liveRevealAt = numberPerf(livePerf, \"reveal_at\") ?? Date.now();\n return Math.max(0, liveRevealAt - insertedAt);\n },\n sdkInitStartToAssignmentReadyMs: initTotalMs,\n };\n syncStorefrontVitals();\n writeIdentityContextCookie();\n\n const beginTracking = () => {\n if (state.config !== resolvedConfig) return;\n finishInitializingAssignments();\n if (!state.trackingPrerequisiteMet) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"track\", \"Tracking blocked by project prerequisite\");\n } else if (trackStart === \"idle\") {\n scheduleAnalyticsStart(\n resolvedConfig,\n experiments,\n initialApplyPromise ? undefined : initialTargetingPass,\n );\n } else {\n startAnalyticsStage(\n resolvedConfig,\n experiments,\n undefined,\n initialApplyPromise ? undefined : initialTargetingPass,\n );\n }\n // This callback is queued behind initialApplyPromise below, so Shopify\n // never receives assignment attribution before the treatment is visible.\n scheduleShopifyAssignmentSync();\n };\n if (initialApplyPromise) void initialApplyPromise.then(beginTracking);\n else beginTracking();\n\n if (FEATURE_AUDIT) {\n import(\"./audit\").then(({ runAuditIfRequested }) => {\n runAuditIfRequested(resolvedConfig, {\n configSource: state.configSource,\n trackerStarted: Boolean(state.tracker),\n platform: state.platform,\n });\n }).catch(() => {});\n }\n\n // Route observer (SPA fast path)\n if (\n !emptyProjectFastPath &&\n (pageTriggerMode !== \"manual\" || hasHistoryPageRules || hasPollingPageRules)\n ) {\n state.stopObserver = observeRouteChanges(state.routerMode, ({ previousUrl, nextUrl, reason }) => {\n if (runtimeSharedState.clearingQaForceFromRoute) return;\n // A live runtime has already derived holdout, persistence, and tracker\n // state from QA mode. Strip the sentinel first, then reload so every\n // construction-time decision is rebuilt outside QA mode. Returning is\n // also essential: exitQaMode() uses replaceState, which this observer\n // wraps synchronously, and the outer callback must not continue with\n // its stale pre-strip URL.\n runtimeSharedState.clearingQaForceFromRoute = true;\n try {\n if (clearQaForceFromUrl()) {\n location.reload();\n return;\n }\n } finally {\n runtimeSharedState.clearingQaForceFromRoute = false;\n }\n if (!state.config || !state.userId) return;\n cancelAllPageRulePolls();\n const detector = reason === \"polling\" ? \"polling\" : \"history\";\n const triggeredPageIds = firePageDetector(detector, nextUrl);\n const routeAnalyticsGeneration = ++state.routeAnalyticsGeneration;\n // Finalize the prior route and start a fresh CLS window so SPA events\n // never reuse the first route's reveal boundary or shift totals.\n startCwvMeasurement();\n\n // Fire page_exit for the page we're leaving\n if (!state.screenshotMode && state.analyticsStarted) {\n onPageExit(analyticsTrack);\n }\n const exps = state.config.experiments ?? [];\n const routeStartedAt = Date.now();\n const immediatePageRulesNeedReevaluation =\n state.pageTriggerMode === \"url_change\" ||\n shouldReevaluateForUrlChange(previousUrl, nextUrl, state.urlDiffNeeds);\n const shouldReevaluate = triggeredPageIds.size > 0 ||\n immediatePageRulesNeedReevaluation;\n state.lastRouteChange = {\n previousUrl,\n nextUrl,\n reason,\n at: Date.now(),\n reEvaluated: shouldReevaluate,\n };\n\n if (shouldReevaluate) {\n reevaluateAssignments(\"url\", false, false, {\n triggeredPageIds,\n includeImmediate: immediatePageRulesNeedReevaluation,\n });\n if (state.redirectNavigationPending) return;\n }\n if (reason !== \"polling\") scheduleDeferredRouteReevaluation();\n if (!state.pendingInitialApply) {\n // Routes with no visual re-apply still need a route-local reveal\n // boundary; applyAssignments() marks it for gated/visual routes.\n markCwvReveal();\n }\n\n state.lastUrl = nextUrl;\n state.trackingPrerequisiteMet = trackingAllowed(state.config);\n syncStorefrontVitals();\n updateProjectActivationDiagnostics(state.config);\n const assignmentReadyAt = Date.now();\n queuePerfEvent(buildPerfEvent(state.config, {\n eventKind: \"route_change\",\n assignmentReadyMs: assignmentReadyAt - routeStartedAt,\n blankScreenMs: 0,\n assignmentReadyAt,\n }));\n\n const runRouteAnalytics = () => {\n if (routeAnalyticsGeneration !== state.routeAnalyticsGeneration) return;\n if (!state.config) return;\n // Re-publish only after a held route recheck has refreshed assignments.\n // The pixel can load after the SDK, so rebroadcast briefly instead of\n // relying on one event.\n scheduleShopifyAssignmentSync();\n if (state.analyticsStarted && !state.trackingPrerequisiteMet) {\n stopAnalyticsStage();\n } else if (state.analyticsStarted) {\n flushPendingPerf();\n state.exposedAssignmentKeys.clear();\n trackViewedAssignments(state.config);\n setupGoalTracking(exps, nextUrl);\n setupHeatmapTracking(state.assignments, exps);\n setupReplayTracking(state.assignments, exps);\n onPageEnter(analyticsTrack);\n } else if (!state.screenshotMode && !trackingBlocked() && state.trackingPrerequisiteMet) {\n if (state.trackingStart === \"idle\") {\n scheduleAnalyticsStart(state.config, exps);\n } else {\n startAnalyticsStage(state.config, exps);\n }\n }\n };\n if (state.pendingInitialApply) {\n // The URL recheck queued behind a hold/hydration gate; running the\n // route analytics now would expose and wire goals for the previous\n // route's stale assignments. The queued recheck registered first,\n // so assignments are fresh by the time this runs.\n void state.pendingInitialApply.then(runRouteAnalytics);\n } else {\n runRouteAnalytics();\n }\n }, {\n ...(hasPollingPageRules\n ? {\n pollingIntervalMs: normalizeNumber(\n config.pageTrigger?.urlPollIntervalMs,\n PAGE_URL_POLL_INTERVAL_MS,\n ),\n }\n : {}),\n onObserverError: (error) => recordObserverError(\"route\", error),\n });\n }\n\n if (\n !emptyProjectFastPath &&\n domPageTrigger &&\n (!manualInitialTrigger || hasDomPageRules)\n ) {\n state.stopDomObserver = observeDomChanges(() => {\n try {\n const triggeredPageIds = firePageDetector(\"dom\", location.href);\n if (shopDomPageTrigger || triggeredPageIds.size > 0) {\n reevaluateAssignments(\"dom\", false, false, {\n triggeredPageIds,\n includeImmediate: shopDomPageTrigger,\n });\n }\n } catch (error) {\n recordObserverError(\"dom\", error);\n }\n }, config.spa?.debounceMs ?? 250);\n }\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", `${state.assignments.length} assignment(s) active`, state.assignments.map(a => ({\n experiment: a.experimentId,\n variation: a.variationId,\n isControl: a.isControl,\n })));\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Execution cycle complete\", {\n assignments: state.assignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n isControl: assignment.isControl,\n })),\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugGroupEnd();\n\n // Lazy-load QA toolbar when in QA mode. Screenshot captures use QA forcing\n // without any visible Apex UI in the captured page.\n if (FEATURE_QA && state.qaMode && !state.screenshotMode) {\n // The QA Assistant replaces the legacy toolbar; if its module is stubbed\n // or fails to load, fall back to the toolbar/devtools path so QA mode\n // never goes dark.\n loadQaAssistant(() => {\n loadQaToolbar(experiments);\n loadDevtoolsIfEnabled(experiments);\n });\n }\n notifyQaAssistantRuntimeListeners();\n\n // Lazy-load devtools overlay when enabled\n if (!state.qaMode) {\n loadDevtoolsIfEnabled(experiments);\n }\n\n // Dispatch initialized event\n document.dispatchEvent(new CustomEvent(\"drip_initialized\"));\n\n return state.assignments;\n}\n\n", "declare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nimport { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport { isExperimentServable } from \"@drip/event-schema/experiment-servability\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { applyRuntimeAntiFlicker, SDK_SCRIPT_SRC, HeatmapController, SemanticController, FetchAttemptInfo, FetchRetryOptions, DEFAULT_CONFIG_FETCH_TIMEOUT_MS, DEFAULT_CONFIG_FETCH_SLOW_MS, CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, CONFIG_FETCH_MAX_WAIT_MS, CACHED_REDIRECT_HIDE_TIMEOUT_MS, createFetchTimeoutError, fetchWithTimeout, fetchWithRetry, CONFIG_CACHE_KEY_PREFIX, DEFAULT_CONFIG_CACHE_TTL_MS, DEFAULT_ANTI_FLICKER_TIMEOUT_MS, DEFAULT_TRACKING_IDLE_TIMEOUT_MS, DEFAULT_EXECUTION_MODE, DEFAULT_TRACKING_START, DEFAULT_JS_POLICY, PAGE_RULE_POLL_WINDOW_MS, PAGE_RULE_POLL_INTERVAL_MS, CONSENT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS, IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES, SESSION_STORAGE_KEY, collectScopedSelectors, ResolvedRuntimeConfig, UrlDiffNeeds, ConfigSource, PendingPerfEvent, InitPhaseKey, InitPerfContext, MAX_PERF_DURATION_MS, monotonicNow, boundedPerfDuration, createInitPerfContext, BootstrapPredecision, bootstrapPredecision, addInitPhase, DeliveryHealthStatus, DeliveryHealthTracker, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic, ExposureDestinationDiagnostic, RuntimeLoadDiagnostic, DripPerfWindow, normalizeNumber, resolveRuntimeConfig, resolvePageTriggerMode, resolveDomPageTrigger, dtLog, traceName, traceStep, traceGate, browserDoNotTrackValue, trackingBlocked, storefrontVitalsGateOpen, syncStorefrontVitals, doNotTrackEnabled, storageAllowed, readWindowPath, configuredConsentGranted, syncConfiguredConsent, CUSTOM_CONSENT_POLL_INTERVAL_MS, CUSTOM_CONSENT_POLL_MAX_MS, MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS, MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS, MANUAL_CALLBACK_TRIGGER_MAX_RERUNS, EVENT_DRIVEN_CONSENT_PROVIDERS, shouldPollConfiguredConsent, installConsentChangeListeners, resolveConsentRequired, resolveConsentGranted, persistentStorageAllowed, coerceSignalValue, captureUrlSignals, installClickSignalCaptures, captureEventPropertySignals, setCapturedSignal, setPublicSignal, getPublicSignals, normalizePageApiName, pageTriggerSignal, triggerPage, readElementCaptureValue, captureDomAndGlobalSignals, consentAwareDataProtection, writeConsentCookie, readConsentCookie, clearConsentStorage, applyConsentStorageMode, runWhenDomReady, applyProjectCode, resetProjectCode, runProjectStartupCode, collectJsTriggerConditions, collectPageTriggerRules, PageDetectorMode, PageRuleReconcileScope, collectPageDetectorRules, experimentsForGlobalRouteReevaluation, conditionUsesActivateTrigger, buildJsTriggerContext, runJsTriggerReset, normalizeActivationValue, installActivateJsTrigger, installPageTriggerRule, installJsTriggerObserver, notifyQaAssistantRuntimeListeners, HarnessManifest, harnessPollTimer, harnessPollKey, harnessVisibilityInstalled, activeHarnessAssignment, stopHarnessPolling, applyHarnessManifest, pollHarnessManifest, startHarnessPolling, getEventsEndpoint, mintBucketingHandoverPayload, verifyBucketingHandoverToken, clearScheduledAnalyticsStart, normalizeDataLayerTriggers, applyDataLayerMappings, readNumericPath, readStringPath, RESERVED_DATA_LAYER_REVENUE_KEYS, PendingDataLayerEvent, MAX_PENDING_DATA_LAYER_EVENTS, pendingDataLayerEvents, processedDataLayerEntries, isDataLayerEntryObject, markDataLayerEntryProcessed, trackDataLayerRevenue, trackDataLayerEvent, enqueuePendingDataLayerEvent, drainPendingDataLayerEvents, finishInitializingAssignments, handleDataLayerEvent, recordObserverError } from \"./config-runtime\";\nimport { scheduleDeferredRouteReevaluation, installDataLayerTriggers, experimentsUseSurfaceSignals, rememberExposureDestination, clarityUpgradeSent, clarityTagKey, pushExposureToQueue, emitExposureDestinations, ensureTrackerStarted, exposureAssignmentKey, priceAssignmentAuthorizationKey, isPriceDisplayAssignmentAuthorized, isShippingDisplayAssignmentAuthorized, isOffersDisplayAssignmentAuthorized, giftSyncOptions, assignmentHasRenderableArtifacts, authorizeOffersDisplayAndRender, revokeOffersDisplayAuthorization, exposureEligibleAssignments, isShippingExposureCartEligible, trackViewedAssignmentsAfterShippingEligibility, EMPTY_TARGETING_ATTRIBUTES, TargetingEvaluationPass, activeTargetingEvaluationPass, createTargetingEvaluationPass, targetingAttributesForPass, trackViewedAssignments, sameStringSet, setupGoalTracking, setupHeatmapTracking, cleanupHeatmapTracking, setupReplayTracking, cleanupReplayTracking, setupSemanticTracking, cleanupSemanticTracking, buildExperimentBehaviorEvents, buildPageExitEvents, analyticsTrack, syncLoadDiagnosticsToPerf, updateLoadDiagnostics, resetLoadDiagnostics, queuePerfEvent, RuntimeInstallClaim, RUNTIME_INSTALL_CLAIM_KEY, RUNTIME_INSTALL_CONFLICT_KEY, telemetryLabel, readRuntimeInstallClaim, rememberRuntimeInstallClaim, claimInstallConflictEmission, sdkAttributionData, sendRuntimeEventNow, sendRuntimePerfNow, readDripPerf, markDripPerf, numberPerf, coexistencePerfFields, buildPerfEvent, flushPendingPerf, orderIdentityEndpoint, ORDER_EXPOSURE_STORAGE_KEY, ORDER_EXPOSURE_MAX_ENTRIES, ORDER_EXPOSURE_TTL_MS, StoredOrderExposure, pruneStoredOrderExposures, readStoredOrderExposures, writeStoredOrderExposures, clearIdentityContextCookie, recentIdentityContextExposures, buildIdentityContextCookieValue, generateSessionId, getIdentityContextSessionId, writeIdentityContextCookie, isOffTargetPersistedAssignment, restoreRecordedExposureDedup, rememberOrderExposure, mergedOrderIdentityAssignments, cleanOrderIdentityText, resolveOrderIdentityPlatform, detectOrderIdentity, orderIdentityDedupeKey, scheduleOrderIdentityBeacon, deliveryStatus, queueDeliveryHealthEvent, flushPendingDeliveryHealth, startAnalyticsStage, scheduleAnalyticsStart, startAnalyticsIfReady, getConfigCacheKey, storageAvailable, getConfigCacheTtlMs, configuredStoreOrigins, readCachedExperiments, hashConfigPayload, writeCachedExperiments, withRuntimeSettings, serializeForceMap, getHashId } from \"./analytics-runtime\";\nimport { generateQaSessionId, SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS, shopifyAssignmentSyncTimers, CommerceOnlyAdoptionState, commercePriceAdoptionState, ensureCommercePriceAdoptionState, currentCommercePriceContext, withCommercePriceAssignments, clearShopifyAssignmentSyncTimers, adoptAuthoritativePriceAssignments, OffersAdoptionPlan, planAuthoritativeOffersAdoption, canAdoptAuthoritativeOffersAssignments, adoptAuthoritativeOffersAssignments, sdkCartMintAllowed, buildSdkCartMintInput, buildScopedCartAttributeSyncInput, buildActiveCartAttributeSyncInput, sdkCartMintSync, syncSdkCartMint, removeSdkCartMintTrigger, onSdkCartMintClick, installSdkCartMintTrigger, HeadlessCartAuthorizationState, headlessCartAuthorizationState, ensureHeadlessCartAuthorizationState, hasChargeAffectingCommerceAssignment, hasActiveAuthorizationPlane, hasActivePriceAuthorizationPlane, hasActiveShippingAuthorizationPlane, hasActiveOffersAuthorizationPlane, hasActiveCommerceAuthorizationPlane, requiresCommerceCohortPin, getChargeAffectingCommerceExperimentIds, isCohortStampedOnCart, syncActiveAssignmentToShopifyCart, configureChargeCorrectnessCartSync, holdoutConfigEpoch, publishAssignmentsToShopify, scheduleShopifyAssignmentSync, variationsAllowed, updateProjectActivationDiagnostics, trackingAllowed, experimentById, targetingLifecycleMode, preservePersistentAssignments, stopAnalyticsStage, canMintVerifiedRedirectCarry, planRedirectAssignment, navigateForRedirectAssignment, RECONCILE_MAX_DRAINS, reevaluateAssignments, reevaluateAssignmentsPass, reapplyQaAssistantForceMap, reconcileForcedUnavailable, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, clearQaForceFromCurrentUrl, initWithExperiments } from \"./activation-runtime\";\nimport { loadQaToolbar, loadQaAssistant, loadDevtoolsIfEnabled, loadDevtools, init, trackEvent, track, funnelStepStorageKey, shouldTrackFunnelStep, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, RevenueEventData, normalizeRevenueCurrency, trackRevenue, flush, getAssignments, buildCurrentCartAttributes, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, normalizedHeadlessCartToken, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getGoals, getActiveExperimentIds, getRuntimeValue, getRuntimeTools, buildFlagContext, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics, QueueCommand, processCommand, processQueue, installedGlobalApi, createGlobalApi, installGlobalApi } from \"./public-api\";\n\n\nexport type PersistedAssignmentMap = ReturnType<typeof prunePersistedAssignments>;\nexport const GLOBAL_PAGE_PREFIX = \"\\u0001experiment:\";\nexport const appliedAssignmentsByKey = new Map<string, Assignment>();\nexport type ArtifactId = string & { readonly __artifactId: unique symbol };\nexport const invalidatedArtifactIds = new Set<ArtifactId>();\nexport /**\n * Per-artifact epochs, keyed exactly like `appliedAssignmentsByKey`: the apply\n * pass that last wrote each artifact. A deferred continuation in\n * `applyAssignmentCode` revalidates its own artifact keys against its pass\n * epoch at resume, so a page-scoped reapply invalidates only the artifacts it\n * rewrote \u2014 an unrelated page's pending external CSS/JS continuation survives.\n * Teardown deletes the entry, and pass epochs only ever increase, so a\n * torn-down artifact that is applied again never revives a stale continuation.\n */\nconst artifactEpochs = new Map<string, number>();\nexport let applyPassEpoch = 0;\n\nexport /** A continuation is current while any artifact it applied still holds its pass epoch. */\nfunction artifactEpochCurrent(\n ownerKeys: readonly string[],\n epoch: number,\n): boolean {\n return ownerKeys.some((ownerKey) => artifactEpochs.get(ownerKey) === epoch);\n}\n\nexport type PageActivationTransition = {\n pageId: string;\n mode: PageDeactivationMode;\n previousActive: boolean;\n active: boolean;\n teardown: boolean;\n reapply: boolean;\n};\n\nexport function normalizePageDeactivationMode(\n rule: PageTargetingRule,\n): PageDeactivationMode {\n const mode = rule.trigger?.deactivationMode;\n if (mode === \"reset\" || mode === \"deactivate\" || mode === \"persistent\") return mode;\n if (mode === \"force-reset\") return \"force_reset\";\n return rule.disabled || rule.trigger?.disabled ? \"deactivate\" : \"reset\";\n}\n\nexport function effectiveDeactivationMode(\n experiment: Experiment,\n rule: PageTargetingRule,\n): PageDeactivationMode {\n if (\n rule.trigger &&\n Object.prototype.hasOwnProperty.call(rule.trigger, \"deactivationMode\")\n ) {\n return normalizePageDeactivationMode(rule);\n }\n // Legacy experiments can still store an explicit experiment mode. Keep it\n // only until every affected Page has a mode and cached configs have expired.\n return targetingLifecycleMode(experiment);\n}\n\nexport function includedPageRules(experiment: Experiment | undefined): PageTargetingRule[] {\n return (experiment?.targeting?.pageRules ?? []).filter(\n (rule) => rule.include !== false && Boolean(rule.id),\n );\n}\n\nexport // Page activation must evaluate against the same URL the assignment pass uses:\n// the InitConfig override at init time, the live URL on re-evaluation.\nfunction currentPageMatchContext(\n url: string,\n targetingPass?: TargetingEvaluationPass,\n): {\n url: string;\n attributes: Record<string, unknown>;\n} {\n const sourceAttributes = state.config?.attributes ?? EMPTY_TARGETING_ATTRIBUTES;\n return {\n url,\n attributes: targetingAttributesForPass(\n targetingPass,\n sourceAttributes,\n url,\n persistentStorageAllowed(),\n ),\n };\n}\n\nexport function pageActivationDiagnosticRows(\n options: { includePageNames?: boolean } = {},\n): PageActivationDiagnostic[] {\n const names = new Map<string, string>();\n const alwaysEmbeddedPageIds = new Set<string>();\n for (const experiment of state.config?.experiments ?? []) {\n for (const rule of experiment.targeting?.pageRules ?? []) {\n if (rule.id && rule.name) names.set(rule.id, rule.name);\n if (rule.id && rule.trigger?.alwaysEmbedInSnippet === true) {\n alwaysEmbeddedPageIds.add(rule.id);\n }\n }\n }\n return Array.from(state.pageActivation.entries())\n .filter(([pageId]) => !pageId.startsWith(GLOBAL_PAGE_PREFIX))\n .map(([pageId, pageState]) => ({\n pageId,\n ...(options.includePageNames && names.get(pageId)\n ? { pageName: names.get(pageId) }\n : {}),\n active: pageState.active,\n appliedArtifactCount: pageState.appliedKeys.size,\n ...(alwaysEmbeddedPageIds.has(pageId)\n ? { alwaysEmbedInSnippet: true }\n : {}),\n ...(pageState.lastTransitionMode\n ? { lastTransitionMode: pageState.lastTransitionMode }\n : {}),\n ...(pageState.isolationFallback\n ? { isolationFallback: pageState.isolationFallback }\n : {}),\n ...(pageState.isolationFallbackExperimentId\n ? {\n isolationFallbackExperimentId:\n pageState.isolationFallbackExperimentId,\n }\n : {}),\n ...(pageState.triggerDetector\n ? { triggerDetector: pageState.triggerDetector }\n : {}),\n ...(pageState.triggerPollAttempts !== undefined\n ? { triggerPollAttempts: pageState.triggerPollAttempts }\n : {}),\n ...(pageState.triggerOutcome\n ? { triggerOutcome: pageState.triggerOutcome }\n : {}),\n ...(pageState.triggerElapsedMs !== undefined\n ? { triggerElapsedMs: pageState.triggerElapsedMs }\n : {}),\n }))\n .sort((left, right) => left.pageId.localeCompare(right.pageId));\n}\n\nexport function reconcilePageActivation(\n experiments: Experiment[],\n url: string,\n options: {\n previous?: ReadonlyMap<string, PageActivationRuntimeState>;\n persistedAssignments?: PersistedAssignmentMap;\n targetingPass?: TargetingEvaluationPass;\n pageRuleScope?: PageRuleReconcileScope;\n } = {},\n): {\n transitions: PageActivationTransition[];\n next: Map<string, PageActivationRuntimeState>;\n pollRules: PageTargetingRule[];\n} {\n const context = currentPageMatchContext(url, options.targetingPass);\n const previous = options.previous ?? state.pageActivation;\n const definitions = new Map<\n string,\n { mode: PageDeactivationMode; matched: boolean; evaluate: boolean; scopeOnly?: boolean }\n >();\n const pollRules = new Map<string, PageTargetingRule>();\n for (const experiment of experiments) {\n const rules = includedPageRules(experiment);\n const activatableRules = rules.filter(\n (rule) => !rule.disabled && !rule.trigger?.disabled,\n );\n if (rules.length === 0) {\n const pageId = GLOBAL_PAGE_PREFIX + experiment.id;\n const shouldEvaluate = !options.pageRuleScope ||\n options.pageRuleScope.includeImmediate;\n const hasPersistentAssignment =\n targetingLifecycleMode(experiment) === \"persistent\" &&\n Boolean(\n options.persistedAssignments &&\n findPersistedVariation(experiment, options.persistedAssignments),\n );\n const hasRedirectCarry = Array.from(\n state.carryImportedAssignmentKeys,\n ).some((key) => key.startsWith(experiment.id + \":\"));\n definitions.set(pageId, {\n // A global entry has no Page rule that can own deactivation behavior.\n mode: targetingLifecycleMode(experiment),\n matched: shouldEvaluate\n ? hasPersistentAssignment ||\n hasRedirectCarry ||\n evaluateTargetingGatesDetailed(\n experiment.targeting,\n context,\n ).matched\n : previous.get(pageId)?.active === true,\n evaluate: shouldEvaluate,\n });\n }\n for (const rule of activatableRules) {\n const triggerMode = rule.trigger?.mode ?? \"immediate\";\n const shouldEvaluate = !options.pageRuleScope ||\n (triggerMode === \"immediate\"\n ? options.pageRuleScope.includeImmediate\n : options.pageRuleScope.triggeredPageIds.has(rule.id));\n const matched = shouldEvaluate\n ? matchPageTargetingRule(rule, context)\n : previous.get(rule.id)?.active === true;\n if (shouldEvaluate) {\n if (matched) {\n cancelPageRulePoll(rule.id);\n } else if (\n rule.trigger?.pollOnRules === true &&\n triggerMode === \"immediate\"\n ) {\n // Start after the caller completes teardown. Teardown cancels the\n // previous retry window and must not cancel this new retry window.\n pollRules.set(rule.id, rule);\n }\n }\n const existing = definitions.get(rule.id);\n if (existing) {\n existing.matched = existing.matched || matched;\n existing.evaluate = existing.evaluate || shouldEvaluate;\n if (existing.scopeOnly) {\n existing.mode = effectiveDeactivationMode(experiment, rule);\n existing.scopeOnly = false;\n }\n } else {\n definitions.set(rule.id, {\n mode: effectiveDeactivationMode(experiment, rule),\n matched,\n evaluate: shouldEvaluate,\n });\n }\n }\n const targetingIds = new Set(activatableRules.map((rule) => rule.id));\n for (const rule of experiment.goalPageRules ?? []) {\n if (!rule.id || targetingIds.has(rule.id) || definitions.has(rule.id)) continue;\n const triggerMode = rule.trigger?.mode ?? \"immediate\";\n const shouldEvaluate = !options.pageRuleScope ||\n (triggerMode === \"immediate\"\n ? options.pageRuleScope.includeImmediate\n : options.pageRuleScope.triggeredPageIds.has(rule.id));\n definitions.set(rule.id, {\n mode: \"reset\",\n matched: shouldEvaluate\n ? matchPageTargetingRule(rule, context)\n : previous.get(rule.id)?.active === true,\n evaluate: shouldEvaluate,\n scopeOnly: true,\n });\n }\n }\n\n const transitions: PageActivationTransition[] = [];\n const next = new Map<string, PageActivationRuntimeState>();\n for (const [pageId, pageState] of previous) {\n if (definitions.has(pageId)) continue;\n if (pageState.scopeOnly) continue;\n transitions.push({\n pageId,\n mode:\n pageState.configuredMode ??\n pageState.lastTransitionMode ??\n \"reset\",\n previousActive: pageState.active,\n active: false,\n teardown: pageState.active || pageState.appliedKeys.size > 0,\n reapply: false,\n });\n }\n for (const [pageId, definition] of definitions) {\n const pageState = previous.get(pageId) ?? {\n active: false,\n appliedKeys: new Set<string>(),\n };\n const previousActive = pageState.active;\n if (definition.scopeOnly) {\n if (\n !pageState.scopeOnly &&\n (pageState.active || pageState.appliedKeys.size > 0)\n ) {\n transitions.push({\n pageId,\n mode:\n pageState.configuredMode ??\n pageState.lastTransitionMode ??\n \"reset\",\n previousActive,\n active: false,\n teardown: true,\n reapply: false,\n });\n }\n pageState.active = definition.matched;\n pageState.scopeOnly = true;\n pageState.appliedKeys.clear();\n pageState.configuredMode = undefined;\n pageState.lastTransitionMode = undefined;\n pageState.isolationFallback = undefined;\n pageState.isolationFallbackExperimentId = undefined;\n next.set(pageId, pageState);\n continue;\n }\n pageState.scopeOnly = false;\n let active = definition.matched;\n let teardown = false;\n let reapply = !previousActive && active;\n\n if (definition.mode === \"persistent\") {\n active = previousActive || definition.matched;\n reapply = !previousActive && active;\n } else if (definition.mode === \"force_reset\" && definition.evaluate) {\n teardown = previousActive || pageState.appliedKeys.size > 0;\n active = definition.matched;\n reapply = active;\n } else if (previousActive && !definition.matched) {\n teardown = true;\n }\n\n pageState.active = active;\n pageState.configuredMode = definition.mode;\n if (\n active !== previousActive ||\n (definition.mode === \"force_reset\" && definition.evaluate)\n ) {\n pageState.lastTransitionMode = definition.mode;\n pageState.isolationFallback = undefined;\n pageState.isolationFallbackExperimentId = undefined;\n }\n next.set(pageId, pageState);\n transitions.push({\n pageId,\n mode: definition.mode,\n previousActive,\n active,\n teardown,\n reapply,\n });\n }\n return { transitions, next, pollRules: Array.from(pollRules.values()) };\n}\n\nexport function cancelPageRulePoll(pageId: string): void {\n const controller = runtimeSharedState.pageRulePollControllers.get(pageId);\n if (!controller) return;\n window.clearInterval(controller.intervalId);\n runtimeSharedState.pageRulePollControllers.delete(pageId);\n}\n\nexport function cancelAllPageRulePolls(): void {\n for (const pageId of Array.from(runtimeSharedState.pageRulePollControllers.keys())) {\n cancelPageRulePoll(pageId);\n }\n}\n\nexport function pageRulePollSettings(): {\n intervalMs: number;\n windowMs: number;\n} {\n return {\n intervalMs: normalizeNumber(\n state.config?.pageTrigger?.rulePollIntervalMs,\n PAGE_RULE_POLL_INTERVAL_MS,\n ),\n windowMs: normalizeNumber(\n state.config?.pageTrigger?.rulePollWindowMs,\n PAGE_RULE_POLL_WINDOW_MS,\n ),\n };\n}\n\nexport function deactivationModeForTriggeredRule(\n rule: PageTargetingRule,\n): PageDeactivationMode {\n for (const experiment of state.config?.experiments ?? []) {\n const configured = includedPageRules(experiment).find(\n (candidate) => candidate.id === rule.id,\n );\n if (configured) return effectiveDeactivationMode(experiment, configured);\n }\n return normalizePageDeactivationMode(rule);\n}\n\nexport function reconcileTriggeredPageMatch(\n rule: PageTargetingRule,\n matched: boolean,\n detector?: PageDetectorMode,\n options: {\n elapsedMs?: number;\n fromPoll?: boolean;\n pollAttempts?: number;\n } = {},\n): boolean {\n const pageState = state.pageActivation.get(rule.id) ?? {\n active: false,\n appliedKeys: new Set<string>(),\n };\n const previousActive = pageState.active;\n const mode = deactivationModeForTriggeredRule(rule);\n let active = matched;\n let teardown = false;\n\n if (mode === \"persistent\") {\n active = previousActive || matched;\n } else if (mode === \"force_reset\") {\n teardown = previousActive || pageState.appliedKeys.size > 0;\n } else if (previousActive && !matched) {\n teardown = true;\n }\n\n if (teardown) {\n cancelPageRulePoll(rule.id);\n teardownTransaction([{ pageId: rule.id, mode }], {\n goalUrl: typeof location !== \"undefined\" ? location.href : undefined,\n });\n }\n\n pageState.active = active;\n pageState.configuredMode = mode;\n if (detector) pageState.triggerDetector = detector;\n pageState.triggerPollAttempts = options.pollAttempts ?? 0;\n pageState.triggerElapsedMs = Math.max(0, Math.round(options.elapsedMs ?? 0));\n pageState.triggerOutcome = matched ? \"activated\" : \"condition_failed\";\n if (active !== previousActive || mode === \"force_reset\") {\n pageState.lastTransitionMode = mode;\n pageState.isolationFallback = undefined;\n pageState.isolationFallbackExperimentId = undefined;\n }\n state.pageActivation.set(rule.id, pageState);\n\n const experiments = state.config?.experiments ?? [];\n syncAssignmentPageActive(state.assignments, experiments);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n reconcileArtifacts(\n desiredArtifactSet(state.assignments),\n typeof location !== \"undefined\" ? location.href : undefined,\n );\n if (matched && state.analyticsStarted && state.config) {\n trackViewedAssignments(state.config);\n }\n notifyQaAssistantRuntimeListeners();\n\n if (!matched && !options.fromPoll && rule.trigger?.pollOnRules === true) {\n startPageRulePoll(rule, detector);\n }\n\n return active !== previousActive;\n}\n\nexport function startPageRulePoll(\n rule: PageTargetingRule,\n detector?: PageDetectorMode,\n): void {\n if (\n typeof window === \"undefined\" ||\n runtimeSharedState.pageRulePollControllers.has(rule.id)\n ) return;\n const { intervalMs, windowMs } = pageRulePollSettings();\n const maxAttempts = Math.max(1, Math.ceil(windowMs / intervalMs));\n const startedAt = Date.now();\n let attempts = 0;\n const intervalId = window.setInterval(() => {\n attempts += 1;\n const elapsedMs = Date.now() - startedAt;\n const pageState = state.pageActivation.get(rule.id);\n if (elapsedMs > windowMs) {\n cancelPageRulePoll(rule.id);\n if (pageState) {\n pageState.triggerPollAttempts = attempts;\n pageState.triggerElapsedMs = elapsedMs;\n pageState.triggerOutcome = \"window_expired\";\n }\n notifyQaAssistantRuntimeListeners();\n return;\n }\n const context = currentPageMatchContext(location.href);\n const matched = matchPageTargetingRule(rule, context);\n if (matched) {\n cancelPageRulePoll(rule.id);\n reconcileTriggeredPageMatch(rule, true, detector, {\n elapsedMs,\n fromPoll: true,\n pollAttempts: attempts,\n });\n reevaluateAssignments(\"dom\", false, false, {\n triggeredPageIds: new Set([rule.id]),\n includeImmediate: false,\n });\n return;\n }\n if (pageState) {\n pageState.triggerPollAttempts = attempts;\n pageState.triggerElapsedMs = elapsedMs;\n }\n if (attempts >= maxAttempts) {\n cancelPageRulePoll(rule.id);\n if (pageState) pageState.triggerOutcome = \"window_expired\";\n notifyQaAssistantRuntimeListeners();\n }\n }, intervalMs);\n runtimeSharedState.pageRulePollControllers.set(rule.id, { intervalId, startedAt });\n}\n\nexport function firePageDetector(\n detector: PageDetectorMode,\n resolvedUrl: string,\n): Set<string> {\n const rules = runtimeSharedState.pageDetectorRules.get(detector) ?? [];\n const triggeredPageIds = new Set<string>();\n for (const rule of rules) {\n if (detector !== \"dom\" && runtimeSharedState.pageDetectorLastUrls.get(rule.id) === resolvedUrl) {\n continue;\n }\n if (detector !== \"dom\") runtimeSharedState.pageDetectorLastUrls.set(rule.id, resolvedUrl);\n triggeredPageIds.add(rule.id);\n cancelPageRulePoll(rule.id);\n const matched = matchPageTargetingRule(\n rule,\n currentPageMatchContext(resolvedUrl),\n );\n reconcileTriggeredPageMatch(rule, matched, detector);\n }\n return triggeredPageIds;\n}\n\nexport function activePageIds(): Set<string> {\n return new Set(\n Array.from(state.pageActivation.entries())\n .filter(\n ([pageId, pageState]) =>\n !pageId.startsWith(GLOBAL_PAGE_PREFIX) && pageState.active,\n )\n .map(([pageId]) => pageId),\n );\n}\n\nexport function experimentHasActivePage(experiment: Experiment | undefined): boolean {\n if (!experiment) return false;\n const rules = includedPageRules(experiment);\n if (!rules.length) {\n return state.pageActivation.get(GLOBAL_PAGE_PREFIX + experiment.id)?.active === true;\n }\n return rules.some(\n (rule) =>\n !rule.disabled &&\n !rule.trigger?.disabled &&\n state.pageActivation.get(rule.id)?.active === true,\n );\n}\n\nexport function syncAssignmentPageActive(\n assignments: Assignment[],\n experiments: Experiment[],\n): Assignment[] {\n const byId = experimentById(experiments);\n for (const assignment of assignments) {\n assignment.pageActive = experimentHasActivePage(\n byId.get(assignment.experimentId),\n );\n }\n return assignments;\n}\n\nexport function assignmentPageIds(assignment: Assignment): string[] {\n const experiment = state.config?.experiments?.find(\n (candidate) => candidate.id === assignment.experimentId,\n );\n const rules = includedPageRules(experiment);\n if (!rules.length) return [GLOBAL_PAGE_PREFIX + assignment.experimentId];\n return Array.from(\n new Set(\n rules\n .filter(\n (rule) =>\n !rule.disabled &&\n !rule.trigger?.disabled &&\n state.pageActivation.get(rule.id)?.active === true,\n )\n .map((rule) => rule.id),\n ),\n );\n}\n\nexport function stableArtifactJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"null\";\n }\n if (Array.isArray(value)) {\n return `[${value.map(stableArtifactJson).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .filter((key) => record[key] !== undefined)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableArtifactJson(record[key])}`)\n .join(\",\")}}`;\n}\n\nexport function artifactContentHash(assignment: Assignment): string {\n const content = stableArtifactJson({\n mutations: assignment.mutations,\n css: assignment.css ?? null,\n experimentCss: assignment.experimentCss ?? null,\n js: assignment.js ?? null,\n experimentJs: assignment.experimentJs ?? null,\n externalCssUrl: assignment.externalCssUrl ?? null,\n externalJsUrl: assignment.externalJsUrl ?? null,\n });\n let first = 0x811c9dc5;\n let second = 0x9e3779b9;\n for (let index = 0; index < content.length; index += 1) {\n const code = content.charCodeAt(index);\n first = Math.imul(first ^ code, 0x01000193);\n second = Math.imul(second ^ code, 0x85ebca6b);\n }\n return (first >>> 0).toString(16).padStart(8, \"0\") +\n (second >>> 0).toString(16).padStart(8, \"0\");\n}\n\nexport function baseArtifactApplicationKey(assignment: Assignment): ArtifactId {\n return `${assignment.experimentId}\\u0000${assignment.variationId}\\u0000${assignment.activeUrlBlockId ?? \"flat\"}\\u0000${artifactContentHash(assignment)}` as ArtifactId;\n}\n\nexport function artifactApplicationKey(\n assignment: Assignment,\n pageId: string,\n): string {\n return `${pageId}\\u0000${baseArtifactApplicationKey(assignment)}`;\n}\n\nexport function artifactIdFromApplicationKey(applicationKey: string): ArtifactId {\n const separator = applicationKey.indexOf(\"\\u0000\");\n return (separator < 0 ? applicationKey : applicationKey.slice(separator + 1)) as ArtifactId;\n}\n\nexport function assignmentRuntimeKeys(assignments: Assignment[]): Set<string> {\n return new Set(assignments.map((assignment) => [\n assignment.experimentId,\n assignment.variationId,\n assignment.activeUrlBlockId ?? \"flat\",\n assignment.pageActive ? \"active\" : \"inactive\",\n ].join(\"\\u0000\")));\n}\n\nexport function artifactOwnerId(applicationKey: string): string {\n const separator = applicationKey.indexOf(\"\\u0000\");\n return separator < 0 ? applicationKey : applicationKey.slice(0, separator);\n}\n\nexport function redirectCarryAssignmentKey(\n experimentId: string,\n variationId: string,\n epoch: number,\n): string {\n return `${experimentId}:${variationId}:${epoch}`;\n}\n\nexport function shouldPreserveOffTargetRedirectAssignment(\n assignment: Assignment,\n): boolean {\n return isAssignmentArtifactInactive(assignment) ||\n state.carryImportedAssignmentKeys.has(\n redirectCarryAssignmentKey(\n assignment.experimentId,\n assignment.variationId,\n Math.max(\n 1,\n Number.isSafeInteger(assignment.assignmentEpoch)\n ? assignment.assignmentEpoch!\n : 1,\n ),\n ),\n );\n}\n\nexport function isAssignmentArtifactInactive(\n assignment: Assignment,\n): boolean {\n if (!renderable(assignment)) return true;\n if (!assignment.redirectUrl) return false;\n if (typeof location === \"undefined\") return false;\n const destination = buildRedirectDestination(\n location.href,\n assignment.redirectUrl,\n assignment,\n \"\",\n undefined,\n false,\n );\n if (destination && isRedirectLoop(location.href, destination)) return true;\n return false;\n}\n\nexport /** Page plane: this assignment may drive DOM, CSS, JS, and commerce display. */\nfunction renderable(assignment: Assignment): boolean {\n return assignment.pageActive &&\n !state.contaminatedAssignmentKeys.has(exposureAssignmentKey(assignment));\n}\n\nexport /**\n * Exposure plane: rendered assignments become analytics-visible only after\n * mutation delivery resolves. This predicate is also the shared identity\n * gate for pageviews, page exits, and generic analytics events.\n */\nfunction exposable(assignment: Assignment): boolean {\n return renderable(assignment) &&\n !state.mutationPendingAssignmentKeys.has(exposureAssignmentKey(assignment));\n}\n\nexport /**\n * Goal/charge plane: identity survives page deactivation, but never precedes\n * mutation delivery. A mutation-bearing treatment becomes attributable only\n * after its delivery tracker resolves cleanly.\n */\nfunction attributable(assignment: Assignment): boolean {\n const key = exposureAssignmentKey(assignment);\n return assignment.experimentId.length > 0 && assignment.variationId.length > 0 &&\n !state.mutationPendingAssignmentKeys.has(key) &&\n !state.contaminatedAssignmentKeys.has(key);\n}\n\nexport function recordAttributableAssignments(assignments: Assignment[]): void {\n for (const assignment of assignments) {\n if (attributable(assignment)) {\n // Copy: page recompute mutates live Assignment objects (pageActive) and\n // the ledger must keep the snapshot that earned attribution.\n runtimeSharedState.attributionLedger.set(assignment.experimentId, { ...assignment });\n }\n }\n}\n\nexport function attributionLedgerAssignments(): Assignment[] {\n const currentExperimentIds = new Set(\n state.assignments.map((assignment) => assignment.experimentId),\n );\n const assignments: Assignment[] = [];\n for (const assignment of runtimeSharedState.attributionLedger.values()) {\n const key = exposureAssignmentKey(assignment);\n if (state.contaminatedAssignmentKeys.has(key)) {\n runtimeSharedState.attributionLedger.delete(assignment.experimentId);\n continue;\n }\n if (\n state.mutationPendingAssignmentKeys.has(key) ||\n currentExperimentIds.has(assignment.experimentId)\n ) continue;\n assignments.push(assignment);\n }\n return assignments;\n}\n\nexport function artifactRenderableAssignments(\n assignments: Assignment[],\n): Assignment[] {\n return assignments\n .filter(renderable)\n .filter((assignment) => !isAssignmentArtifactInactive(assignment));\n}\n\nexport /**\n * Render plane: `state.assignments` intersected with `state.pageActivation`.\n * Single source for every global runtime that renders, observes, or wires a\n * treatment, so no caller can hand a subsystem a hand-picked subset.\n */\nfunction activeRenderableAssignments(): Assignment[] {\n return artifactRenderableAssignments(state.assignments);\n}\n\nexport /**\n * Charge plane: deliberately page-independent. Deactivating a page stops\n * rendering, but Shopify still charges this cart's pinned commerce arms, so\n * the cohort stamp and its cart listener must outlive a display teardown.\n */\nfunction chargeAffectingAssignments(): Assignment[] {\n return withCommercePriceAssignments(state.assignments).filter(attributable);\n}\n\nexport function loadPersistedAssignments(\n experiments: Experiment[],\n): PersistedAssignmentMap | undefined {\n if (!persistentStorageAllowed() || state.qaMode || state.screenshotMode) {\n return undefined;\n }\n return prunePersistedAssignments(experiments);\n}\n\nexport function buildPersistedAssignmentResult(\n experiment: Experiment,\n persisted: NonNullable<ReturnType<typeof findPersistedVariation>>,\n hashId: string,\n gates: ActivationGateDiagnostic[],\n targetingConditions: ConditionDiagnostic[],\n url: string,\n reason: \"persisted_assignment\" | \"persisted_assignment_off_target\",\n): { assignment: Assignment; diagnostic: ExperimentActivationDiagnostic } {\n const assignment = buildAssignment(\n experiment,\n persisted.variation,\n persisted.index,\n hashId,\n url,\n );\n if (reason === \"persisted_assignment_off_target\") {\n assignment.pageActive = experimentHasActivePage(experiment);\n }\n gates.push(\n {\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: \"skipped\",\n reason: \"persisted_assignment\",\n },\n {\n id: \"assignment\",\n label: \"Variation assignment\",\n status: \"passed\",\n reason,\n detail: {\n variationId: persisted.variation.id,\n index: persisted.index,\n epoch: persisted.record.epoch,\n },\n },\n );\n for (const gate of gates.slice(-2)) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Reused persisted variation ${persisted.variation.id}`, {\n experimentId: experiment.id,\n index: persisted.index,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: persisted \u2192 variation ${persisted.index}`, {\n variationId: persisted.variation.id,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: persisted \u2192 var ${persisted.index}`, {\n variationId: persisted.variation.id,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n return {\n assignment,\n diagnostic: experimentDiagnostic(\n experiment,\n gates,\n assignment,\n reason,\n false,\n targetingConditions,\n ),\n };\n}\n\nexport function withAssignmentEpochData(\n data: Record<string, unknown> | undefined,\n experimentId?: string,\n variationId?: string,\n): Record<string, unknown> | undefined {\n if (!experimentId || !variationId) return data;\n const assignment = state.assignments.find(\n (item) =>\n item.experimentId === experimentId && item.variationId === variationId,\n );\n if (!assignment?.assignmentEpoch) return data;\n if (assignment.kind && assignment.kind !== \"experiment\") return data;\n return { ...(data ?? {}), assignment_epoch: assignment.assignmentEpoch };\n}\n\nexport function usesStickyAssignmentPersistence(experiment: Experiment): boolean {\n return !experiment.kind || experiment.kind === \"experiment\";\n}\n\nexport function persistActiveExperimentAssignments(experiments: Experiment[]): void {\n if (!persistentStorageAllowed()) return;\n // QA traffic must never write to or read from a real visitor's sticky\n // bucket; screenshot mode is short-circuited earlier.\n if (state.qaMode) return;\n const byId = experimentById(experiments);\n for (const assignment of state.assignments) {\n // Off-target restores already came from this exact validated store record.\n // Keep their original assignedAt while on-target revisits refresh it.\n if (isOffTargetPersistedAssignment(assignment)) continue;\n if (assignment.kind && assignment.kind !== \"experiment\") continue;\n if (state.forceMap?.[assignment.experimentId]) continue;\n const experiment = byId.get(assignment.experimentId);\n if (!experiment || !usesStickyAssignmentPersistence(experiment)) continue;\n const variationExists = experiment.variations.some(\n (variation) => variation.id === assignment.variationId,\n );\n if (!variationExists) continue;\n persistAssignmentForExperiment(experiment, assignment.variationId);\n }\n}\n\nexport function experimentDiagnostic(\n experiment: Experiment,\n gates: ActivationGateDiagnostic[],\n assignment: Assignment | null,\n reason?: string,\n forced = false,\n targetingConditions?: ConditionDiagnostic[],\n): ExperimentActivationDiagnostic {\n const failed = gates.find((gate) => gate.status === \"failed\");\n return {\n experimentId: experiment.id,\n experimentName: experiment.name,\n status: assignment ? \"passed\" : \"failed\",\n reason: reason ?? failed?.reason,\n assignedVariationId: assignment?.variationId,\n assignedVariationIndex: assignment?.index,\n forced,\n gates,\n ...(targetingConditions ? { targetingConditions } : {}),\n };\n}\n\n\nexport function evaluateExperimentDetailed(\n experiment: Experiment,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n userId: string;\n storeOrigin?: string | string[];\n persistedAssignments?: PersistedAssignmentMap;\n holdout?: { enabled?: boolean; percentage?: number };\n },\n): { assignment: Assignment | null; diagnostic: ExperimentActivationDiagnostic } {\n const gates: ActivationGateDiagnostic[] = [];\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated experiment ${traceName(experiment.id, experiment.name)}`, {\n kind: experiment.kind ?? \"experiment\",\n status: experiment.status ?? \"running\",\n variations: experiment.variations.length,\n });\n\n if (!experiment.variations.length) {\n gates.push({ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"no_variations\" });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (no variations)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (no variations)`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"no_variations\") };\n }\n\n const forcedVarId = state.forceMap?.[experiment.id];\n const forcedIdx = forcedVarId\n ? experiment.variations.findIndex((v) => v.id === forcedVarId)\n : -1;\n const forcedVariation = forcedIdx >= 0 ? experiment.variations[forcedIdx] : null;\n\n const statusOk = isExperimentServable(experiment, { qaMode: state.qaMode || state.screenshotMode, environment: state.config?.environments?.activeKey || \"production\" });\n gates.push({\n id: \"environment\",\n label: \"Experiment status\",\n status: forcedVariation ? \"skipped\" : statusOk ? \"passed\" : \"failed\",\n reason: forcedVariation ? \"forced_variation\" : statusOk ? \"running\" : `status_${experiment.status}`,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n if ((!forcedVariation || experiment.runtime_disabled === true) && !statusOk) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (status=${experiment.status})`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (status=${experiment.status})`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, `status_${experiment.status}`) };\n }\n\n const weekdayAllowed = !weekdayScheduleBlocksDelivery(\n experiment.weekdaySchedule,\n new Date(),\n );\n gates.push({\n id: \"weekday\",\n label: \"Weekday schedule\",\n status: forcedVariation ? \"skipped\" : weekdayAllowed ? \"passed\" : \"failed\",\n reason: forcedVariation\n ? \"forced_variation\"\n : weekdayAllowed\n ? \"active_weekday\"\n : \"excluded_weekday\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n if (!forcedVariation && !weekdayAllowed) {\n return {\n assignment: null,\n diagnostic: experimentDiagnostic(\n experiment,\n gates,\n null,\n \"excluded_weekday\",\n ),\n };\n }\n\n const hashId = getHashId(experiment, ctx.userId, ctx.attributes);\n const persisted =\n ctx.persistedAssignments && usesStickyAssignmentPersistence(experiment)\n ? findPersistedVariation(experiment, ctx.persistedAssignments)\n : null;\n const carryImportedDestination =\n persisted &&\n experiment.experimentType === \"redirect\" &&\n state.carryImportedAssignmentKeys.has(\n redirectCarryAssignmentKey(\n experiment.id,\n persisted.variation.id,\n persisted.record.epoch,\n ),\n ) &&\n (() => {\n if (!persisted.variation.redirectUrl) return false;\n const destination = buildRedirectDestination(\n ctx.url,\n persisted.variation.redirectUrl,\n {\n experimentId: experiment.id,\n variationId: persisted.variation.id,\n assignmentEpoch: persisted.record.epoch,\n },\n \"\",\n undefined,\n false,\n );\n return Boolean(destination && isRedirectLoop(ctx.url, destination));\n })();\n if (carryImportedDestination) {\n // The signed carry proves that the visitor qualified on the source page.\n // Destination hosts can lack the source's segment, attribute, or DOM\n // signals, so rechecking any targeting gate here would discard a verified\n // cross-origin assignment. Ordinary same-origin sticky assignments do not\n // receive this bypass and remain subject to the audience-only recheck.\n return buildPersistedAssignmentResult(\n experiment,\n persisted,\n hashId,\n gates,\n [],\n ctx.url,\n \"persisted_assignment_off_target\",\n );\n }\n\n const targeting = evaluateTargetingGatesDetailed(experiment.targeting, {\n url: ctx.url,\n attributes: ctx.attributes,\n hostAgnosticIncludeOrigin:\n experiment.experimentType === \"redirect\"\n ? ctx.storeOrigin\n : undefined,\n });\n gates.push(...targeting.gates);\n for (const gate of targeting.gates) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n let forcedOffTarget = false;\n if (!targeting.matched) {\n const pageMismatch = targeting.gates.some(\n (gate) => gate.id === \"page\" && gate.status === \"failed\",\n );\n const previewForceOffTarget = Boolean(\n forcedVariation && (state.qaMode || state.screenshotMode) && pageMismatch,\n );\n const otherwiseEligible = (persisted || previewForceOffTarget) && pageMismatch\n ? evaluateTargetingGatesDetailed(\n {\n ...experiment.targeting,\n url: [],\n pageRules: [],\n // Legacy experiments carry URL rules in `rules`; blank them too so\n // this recheck is audience-only (see normalizeRuntimeUrlRules).\n rules: [],\n } as Targeting,\n {\n url: ctx.url,\n attributes: ctx.attributes,\n hostAgnosticIncludeOrigin:\n experiment.experimentType === \"redirect\"\n ? ctx.storeOrigin\n : undefined,\n },\n ).matched\n : false;\n if (previewForceOffTarget && otherwiseEligible) {\n forcedOffTarget = true;\n } else if (persisted && otherwiseEligible) {\n return buildPersistedAssignmentResult(\n experiment,\n persisted,\n hashId,\n gates,\n targeting.conditions,\n ctx.url,\n \"persisted_assignment_off_target\",\n );\n }\n if (!forcedOffTarget) {\n const reason = targeting.gates.find((gate) => gate.status === \"failed\")?.reason ?? \"targeting_mismatch\";\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (targeting mismatch)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (targeting mismatch)`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, reason, false, targeting.conditions) };\n }\n }\n\n if (forcedVariation) {\n const assignment = buildAssignment(experiment, forcedVariation, forcedIdx, ctx.userId, ctx.url);\n if (forcedOffTarget) assignment.pageActive = false;\n gates.push(\n { id: \"traffic\", label: \"Traffic allocation\", status: \"skipped\", reason: \"forced_variation\" },\n { id: \"assignment\", label: \"Variation assignment\", status: \"passed\", reason: \"forced_variation\" },\n );\n for (const gate of gates.slice(-2)) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated variation ${forcedVarId}`, {\n experimentId: experiment.id,\n index: forcedIdx,\n forced: true,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: FORCED \u2192 variation ${forcedIdx}`, { variationId: forcedVarId });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: FORCED \u2192 var ${forcedIdx}`, { variationId: forcedVarId });\n return { assignment, diagnostic: experimentDiagnostic(experiment, gates, assignment, \"forced_variation\", true, targeting.conditions) };\n }\n if (persisted) {\n return buildPersistedAssignmentResult(\n experiment,\n persisted,\n hashId,\n gates,\n targeting.conditions,\n ctx.url,\n \"persisted_assignment\",\n );\n }\n\n const predecidedVariationId = runtimeSharedState.initialPredecidedByExperiment?.get(experiment.id);\n const predecidedIndex = predecidedVariationId\n ? experiment.variations.findIndex((variation) => variation.id === predecidedVariationId)\n : -1;\n if (predecidedIndex >= 0) {\n const assignment = buildAssignment(\n experiment,\n experiment.variations[predecidedIndex],\n predecidedIndex,\n hashId,\n ctx.url,\n );\n gates.push(\n { id: \"traffic\", label: \"Traffic allocation\", status: \"skipped\", reason: \"persisted_assignment\" },\n { id: \"assignment\", label: \"Variation assignment\", status: \"passed\", reason: \"persisted_assignment\", detail: { variationId: predecidedVariationId, index: predecidedIndex } },\n );\n return { assignment, diagnostic: experimentDiagnostic(experiment, gates, assignment, \"persisted_assignment\", false, targeting.conditions) };\n }\n const hashValue = hashToFloat(experiment.id, hashId);\n const inAllocation = inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1);\n gates.push({\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: inAllocation ? \"passed\" : \"failed\",\n reason: inAllocation ? \"included\" : \"outside_allocation\",\n detail: { hashValue, allocation: experiment.trafficAllocation ?? 1 },\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n if (!inAllocation) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (outside traffic allocation)`, { hashValue, allocation: experiment.trafficAllocation });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (traffic allocation)`, { hashValue, allocation: experiment.trafficAllocation });\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"outside_allocation\", false, targeting.conditions) };\n }\n\n const assignment = decideAssignments({\n experiments: [experiment],\n holdout: ctx.holdout,\n visitorId: hashId,\n storedAssignments: {},\n now: Date.now(),\n url: ctx.url,\n })[0];\n if (!assignment) {\n gates.push({ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"invalid_weighting\" });\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"invalid_weighting\", false, targeting.conditions) };\n }\n\n const variation = experiment.variations[assignment.index];\n if (persistentStorageAllowed() && !state.qaMode && usesStickyAssignmentPersistence(experiment)) {\n persistAssignmentForExperiment(experiment, variation.id);\n }\n gates.push({\n id: \"assignment\",\n label: \"Variation assignment\",\n status: \"passed\",\n reason: \"assigned\",\n detail: { variationId: variation.id, index: assignment.index },\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated variation ${variation.id}`, {\n experimentId: experiment.id,\n index: assignment.index,\n hashValue,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: assigned \u2192 variation ${assignment.index}`, { variationId: variation.id, hashValue });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: \u2192 var ${assignment.index} (${variation.id})`, { variationId: variation.id, hashValue });\n return { assignment, diagnostic: experimentDiagnostic(experiment, gates, assignment, \"assigned\", false, targeting.conditions) };\n}\n\nexport function evaluateExperiment(\n experiment: Experiment,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n userId: string;\n storeOrigin?: string | string[];\n persistedAssignments?: PersistedAssignmentMap;\n },\n): Assignment | null {\n return evaluateExperimentDetailed(experiment, ctx).assignment;\n}\n\nexport function stoppedPersonalizationDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n): ExperimentActivationDiagnostic {\n const { assignedVariationId: _assignedVariationId, assignedVariationIndex: _assignedVariationIndex, ...rest } = diagnostic;\n return {\n ...rest,\n status: \"failed\",\n reason: \"personalization_stopped_after_prior_match\",\n gates: [\n ...diagnostic.gates,\n {\n id: \"personalization_priority\",\n label: \"Personalization priority\",\n status: \"failed\",\n reason: \"stopped_after_prior_match\",\n },\n ],\n };\n}\n\nexport function enforcePersonalizationStopAfterMatch(\n assignments: Assignment[],\n diagnostics?: ExperimentActivationDiagnostic[],\n): { assignments: Assignment[]; diagnostics?: ExperimentActivationDiagnostic[] } {\n const stoppedKeys = new Set<string>();\n const suppressedExperimentIds = new Set<string>();\n const filtered: Assignment[] = [];\n\n for (const assignment of assignments) {\n const key = assignment.personalization?.key;\n if (key && stoppedKeys.has(key)) {\n suppressedExperimentIds.add(assignment.experimentId);\n continue;\n }\n filtered.push(assignment);\n if (key && assignment.personalization?.stopAfterMatch !== false) {\n stoppedKeys.add(key);\n }\n }\n\n if (!diagnostics || suppressedExperimentIds.size === 0) {\n return { assignments: filtered, diagnostics };\n }\n\n return {\n assignments: filtered,\n diagnostics: diagnostics.map((diagnostic) =>\n suppressedExperimentIds.has(diagnostic.experimentId)\n ? stoppedPersonalizationDiagnostic(diagnostic)\n : diagnostic\n ),\n };\n}\n\nexport function excludedByGroupDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n decision: ExclusionGroupDecision,\n): ExperimentActivationDiagnostic {\n const { assignedVariationId: _assignedVariationId, assignedVariationIndex: _assignedVariationIndex, ...rest } = diagnostic;\n const reason = decision.sticky\n ? \"exclusion_group_sticky_other\"\n : \"exclusion_group_overlap_lost\";\n return {\n ...rest,\n status: \"failed\",\n reason,\n gates: [\n ...diagnostic.gates,\n {\n id: \"exclusion_group\",\n label: \"Exclusion group\",\n status: \"failed\",\n reason,\n detail: {\n groupId: decision.groupId,\n winnerExperimentId: decision.winnerExperimentId,\n },\n },\n ],\n };\n}\n\nexport function keptByGroupDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n reason: \"exclusion_group_no_overlap\" | \"exclusion_group_overlap_winner\" | \"exclusion_group_sticky_winner\",\n detail: { groupId: string; conflictingExperimentIds: string[] },\n): ExperimentActivationDiagnostic {\n return {\n ...diagnostic,\n gates: [\n ...diagnostic.gates,\n {\n id: \"exclusion_group\",\n label: \"Exclusion group\",\n status: \"passed\",\n reason,\n detail,\n },\n ],\n };\n}\n\nexport function applyExclusionAndPersonalization(\n assignments: Assignment[],\n context: {\n userId: string;\n exclusionGroups?: ExclusionGroupConfig[];\n storedGroupSelections?: CompactGroupSelections;\n },\n diagnostics?: ExperimentActivationDiagnostic[],\n): {\n assignments: Assignment[];\n diagnostics?: ExperimentActivationDiagnostic[];\n decisions: ExclusionGroupDecision[];\n} {\n const bootstrapStore = context.storedGroupSelections\n ? {\n read: (groupId: string) => {\n const value = context.storedGroupSelections?.[groupId];\n return value ? { experimentId: value[0], epoch: value[1] } : null;\n },\n write: (groupId: string, selection: PersistedGroupSelection) =>\n browserGroupStickyStore.write(groupId, selection),\n }\n : undefined;\n const { assignments: afterGroups, decisions } = resolveExclusionGroups(\n assignments,\n context.exclusionGroups,\n {\n userId: context.userId,\n forcedExperimentIds: state.forceMap ? Object.keys(state.forceMap) : [],\n persist: persistentStorageAllowed() && !state.qaMode,\n store: bootstrapStore,\n },\n );\n\n let nextDiagnostics = diagnostics;\n if (diagnostics && context.exclusionGroups?.length) {\n const suppressed = new Map<string, ExclusionGroupDecision>();\n const decisionsByWinner = new Map<string, ExclusionGroupDecision>();\n for (const decision of decisions) {\n if (decision.winnerExperimentId) {\n decisionsByWinner.set(decision.winnerExperimentId, decision);\n }\n for (const experimentId of decision.suppressedExperimentIds) {\n suppressed.set(experimentId, decision);\n }\n }\n const provisionalIds = new Set(assignments.map((assignment) => assignment.experimentId));\n const forcedIds = new Set(state.forceMap ? Object.keys(state.forceMap) : []);\n nextDiagnostics = diagnostics.map((diagnostic) => {\n const losingDecision = suppressed.get(diagnostic.experimentId);\n if (losingDecision) return excludedByGroupDiagnostic(diagnostic, losingDecision);\n\n const winningDecision = decisionsByWinner.get(diagnostic.experimentId);\n if (winningDecision) {\n return keptByGroupDiagnostic(\n diagnostic,\n winningDecision.sticky ? \"exclusion_group_sticky_winner\" : \"exclusion_group_overlap_winner\",\n {\n groupId: winningDecision.groupId,\n conflictingExperimentIds: winningDecision.conflictingExperimentIds,\n },\n );\n }\n\n const group = context.exclusionGroups?.find((candidate) =>\n candidate.members.some((member) => member.experimentId === diagnostic.experimentId)\n );\n if (!group || !provisionalIds.has(diagnostic.experimentId) || forcedIds.has(diagnostic.experimentId)) {\n return diagnostic;\n }\n const eligibleIds = group.members\n .map((member) => member.experimentId)\n .filter((experimentId) => provisionalIds.has(experimentId) && !forcedIds.has(experimentId));\n return eligibleIds.length === 1\n ? keptByGroupDiagnostic(diagnostic, \"exclusion_group_no_overlap\", {\n groupId: group.id,\n conflictingExperimentIds: eligibleIds,\n })\n : diagnostic;\n });\n }\n\n const personalization = enforcePersonalizationStopAfterMatch(afterGroups, nextDiagnostics);\n return {\n assignments: personalization.assignments,\n diagnostics: personalization.diagnostics ?? nextDiagnostics,\n decisions,\n };\n}\n\nexport function evaluate(\n experiments: Experiment[],\n context?: {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n persistSignals?: boolean;\n storeOrigin?: string | string[];\n exclusionGroups?: ExclusionGroupConfig[];\n },\n): Assignment[] {\n const url = context?.url ?? location.href;\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url, {\n persistSignals: context?.persistSignals,\n });\n const userId = getUserId(context?.userId);\n const assignments: Assignment[] = [];\n const persistedAssignments = loadPersistedAssignments(experiments);\n for (const experiment of experiments) {\n const assignment = evaluateExperiment(experiment, {\n url,\n attributes,\n userId,\n storeOrigin: context?.storeOrigin,\n persistedAssignments,\n });\n if (assignment) assignments.push(assignment);\n }\n return applyExclusionAndPersonalization(assignments, {\n userId,\n exclusionGroups: context?.exclusionGroups,\n }).assignments;\n}\n\nexport function evaluateWithDiagnostics(\n experiments: Experiment[],\n context?: {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n persistSignals?: boolean;\n storeOrigin?: string | string[];\n exclusionGroups?: ExclusionGroupConfig[];\n storedGroupSelections?: CompactGroupSelections;\n persistedAssignments?: PersistedAssignmentMap | null;\n holdout?: { enabled?: boolean; percentage?: number };\n targetingPass?: TargetingEvaluationPass;\n },\n): { assignments: Assignment[]; diagnostics: ExperimentActivationDiagnostic[] } {\n const url = context?.url ?? location.href;\n const sourceAttributes = context?.attributes ?? EMPTY_TARGETING_ATTRIBUTES;\n const persistSignals = context?.persistSignals !== false;\n const attributes = targetingAttributesForPass(\n context?.targetingPass,\n sourceAttributes,\n url,\n persistSignals,\n );\n const userId = getUserId(context?.userId);\n const assignments: Assignment[] = [];\n const diagnostics: ExperimentActivationDiagnostic[] = [];\n const persistedAssignments = context && \"persistedAssignments\" in context\n ? context.persistedAssignments ?? undefined\n : loadPersistedAssignments(experiments);\n for (const experiment of experiments) {\n const result = evaluateExperimentDetailed(experiment, {\n url,\n attributes,\n userId,\n storeOrigin: context?.storeOrigin,\n persistedAssignments,\n holdout: context?.holdout,\n });\n diagnostics.push(result.diagnostic);\n if (result.assignment) assignments.push(result.assignment);\n }\n const resolved = applyExclusionAndPersonalization(\n assignments,\n { userId, exclusionGroups: context?.exclusionGroups, storedGroupSelections: context?.storedGroupSelections },\n diagnostics,\n );\n return {\n assignments: syncAssignmentPageActive(resolved.assignments, experiments),\n diagnostics: resolved.diagnostics ?? diagnostics,\n };\n}\n\nexport function evaluateEdgeRuntimeAssignments(\n experiments: Experiment[],\n context: {\n url: string;\n attributes: Record<string, unknown>;\n userId: string;\n },\n eligibleAssignments?: Assignment[],\n eligibleDiagnostics?: ExperimentActivationDiagnostic[],\n) {\n const authoritative = readEdgeRuntimeAssignments();\n if (!authoritative) return null;\n const assignments: Assignment[] = [];\n const diagnostics: ExperimentActivationDiagnostic[] = [];\n const eligibleByExperiment = eligibleAssignments\n ? new Map(eligibleAssignments.map((assignment) => [assignment.experimentId, assignment]))\n : null;\n const eligibleDiagnosticsByExperiment = eligibleDiagnostics\n ? new Map(eligibleDiagnostics.map((diagnostic) => [diagnostic.experimentId, diagnostic]))\n : null;\n for (const experiment of experiments) {\n const edgeAssignment = authoritative.get(experiment.id);\n if (!edgeAssignment) {\n if (authoritative.size === 0) {\n diagnostics.push(experimentDiagnostic(\n experiment,\n [{ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"edge_runtime_assignment_missing\" }],\n null,\n \"edge_runtime_assignment_missing\",\n ));\n }\n continue;\n }\n const variationIndex = experiment.variations.findIndex(\n (variation) => variation.id === edgeAssignment.variationId,\n );\n if (variationIndex < 0 || variationIndex !== edgeAssignment.index) {\n diagnostics.push(experimentDiagnostic(\n experiment,\n [{ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"edge_runtime_assignment_invalid\" }],\n null,\n \"edge_runtime_assignment_invalid\",\n ));\n continue;\n }\n const eligibleAssignment = eligibleByExperiment?.get(experiment.id);\n if (eligibleByExperiment && !eligibleAssignment) {\n const diagnostic = eligibleDiagnosticsByExperiment?.get(experiment.id);\n if (diagnostic) diagnostics.push(diagnostic);\n continue;\n }\n const assignment = buildAssignment(\n experiment,\n experiment.variations[variationIndex],\n variationIndex,\n getHashId(experiment, context.userId, context.attributes),\n context.url,\n );\n if (eligibleAssignment) assignment.pageActive = eligibleAssignment.pageActive;\n assignments.push(assignment);\n diagnostics.push(experimentDiagnostic(\n experiment,\n [{\n id: \"assignment\",\n label: \"Variation assignment\",\n status: \"passed\",\n reason: \"edge_runtime_assignment\",\n detail: { variationId: assignment.variationId, index: assignment.index },\n }],\n assignment,\n \"edge_runtime_assignment\",\n ));\n }\n return { assignments, diagnostics, experimentIds: authoritative };\n}\n\nexport function resolveCombinedEdgeEvaluation(\n edgeAssignments: Assignment[],\n fallbackAssignments: Assignment[],\n diagnostics: ExperimentActivationDiagnostic[],\n context: {\n userId: string;\n exclusionGroups?: ExclusionGroupConfig[];\n },\n): { assignments: Assignment[]; diagnostics: ExperimentActivationDiagnostic[] } {\n const preferredIds = new Set(edgeAssignments.map((assignment) => assignment.experimentId));\n const combined = [...edgeAssignments, ...fallbackAssignments];\n const assignedIds = new Set(combined.map((assignment) => assignment.experimentId));\n const suppressed = new Map<string, ExclusionGroupDecision>();\n\n for (const group of context.exclusionGroups ?? []) {\n const winner = group.members.find(\n (member) => preferredIds.has(member.experimentId) && assignedIds.has(member.experimentId),\n );\n if (!winner) continue;\n const conflictingExperimentIds = group.members\n .map((member) => member.experimentId)\n .filter((experimentId) => assignedIds.has(experimentId));\n const suppressedExperimentIds = conflictingExperimentIds.filter(\n (experimentId) => experimentId !== winner.experimentId && !preferredIds.has(experimentId),\n );\n if (!suppressedExperimentIds.length) continue;\n const decision: ExclusionGroupDecision = {\n groupId: group.id,\n conflictingExperimentIds,\n winnerExperimentId: winner.experimentId,\n suppressedExperimentIds,\n sticky: false,\n };\n for (const experimentId of suppressedExperimentIds) {\n suppressed.set(experimentId, decision);\n }\n }\n\n const preferred = suppressed.size\n ? combined.filter((assignment) => !suppressed.has(assignment.experimentId))\n : combined;\n const preferredDiagnostics = suppressed.size\n ? diagnostics.map((diagnostic) => {\n const decision = suppressed.get(diagnostic.experimentId);\n return decision ? excludedByGroupDiagnostic(diagnostic, decision) : diagnostic;\n })\n : diagnostics;\n const resolved = applyExclusionAndPersonalization(\n preferred,\n context,\n preferredDiagnostics,\n );\n return {\n assignments: resolved.assignments,\n diagnostics: resolved.diagnostics ?? preferredDiagnostics,\n };\n}\n\nexport function escapeDeliveryRegex(value: string): string {\n return value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n}\n\nexport function matchSimpleDeliveryPattern(pattern: string, url: string): boolean {\n if (!pattern) return false;\n try {\n const current = new URL(url, location.href);\n const cleanPattern = pattern.includes(\"://\")\n ? pattern\n : (pattern.startsWith(\"/\") ? pattern : \"/\" + pattern);\n const re = new RegExp(\"^\" + escapeDeliveryRegex(cleanPattern) + \"$\");\n return pattern.includes(\"://\")\n ? re.test(current.href)\n : re.test(current.pathname + current.search) || re.test(current.pathname);\n } catch {\n return false;\n }\n}\n\nexport function matchRegexDeliveryPattern(pattern: string, url: string): boolean {\n try {\n const current = new URL(url, location.href);\n const re = new RegExp(pattern);\n return re.test(current.href) || re.test(current.pathname + current.search) || re.test(current.pathname);\n } catch {\n return false;\n }\n}\n\nexport function matchesDeliveryUrlRules(rules: SnippetDeliveryUrlRule[] | undefined, url: string): boolean {\n if (!rules?.length) return true;\n let hasInclude = false;\n let includeHit = false;\n for (const rule of rules) {\n if (!rule || typeof rule.pattern !== \"string\") continue;\n const matched = rule.type === \"regex\"\n ? matchRegexDeliveryPattern(rule.pattern, url)\n : matchSimpleDeliveryPattern(rule.pattern, url);\n if (rule.include === false && matched) return false;\n if (rule.include !== false) {\n hasInclude = true;\n if (matched) includeHit = true;\n }\n }\n return !hasInclude || includeHit;\n}\n\nexport function expandCriticalMutation(raw: SnippetCriticalMutation): Mutation | null {\n const [selector, action, value] = raw;\n if (typeof selector !== \"string\" || !selector || typeof action !== \"string\") return null;\n const base = { selector, action } as Mutation;\n switch (action) {\n case \"text\":\n case \"setText\":\n return typeof value === \"string\" ? { ...base, text: value } : null;\n case \"html\":\n case \"insertBefore\":\n case \"insertAfter\":\n return typeof value === \"string\" ? { ...base, html: value } : null;\n case \"attribute\":\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n if (\"name\" in value) return { ...base, attribute: value as Mutation[\"attribute\"] };\n return { ...base, attributes: value as Record<string, string | null> };\n case \"style\":\n case \"setStyle\":\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? { ...base, styles: value as Record<string, string> }\n : null;\n case \"remove\":\n return base;\n default:\n return null;\n }\n}\n\nexport function buildCriticalPathAssignments(\n experiments: Experiment[],\n plan: SnippetCriticalMutationPlanItem[] | undefined,\n ctx: { url: string; attributes: Record<string, unknown>; userId: string },\n): {\n assignments: Assignment[];\n plannedExperimentIds: Set<string>;\n skippedDiagnostics: ExperimentActivationDiagnostic[];\n} {\n const plannedExperimentIds = new Set<string>();\n const assignments: Assignment[] = [];\n const skippedDiagnostics: ExperimentActivationDiagnostic[] = [];\n if (!plan?.length || state.forceMap) {\n return { assignments, plannedExperimentIds, skippedDiagnostics };\n }\n\n const experimentsById = new Map(experiments.map((experiment) => [experiment.id, experiment]));\n for (const item of plan) {\n if (!item?.e || !Array.isArray(item.v)) continue;\n const experiment = experimentsById.get(item.e);\n if (!experiment || !isExperimentServable(experiment, { qaMode: false, environment: state.config?.environments?.activeKey || \"production\" })) continue;\n plannedExperimentIds.add(experiment.id);\n if (\n !state.forceMap?.[experiment.id] &&\n weekdayScheduleBlocksDelivery(experiment.weekdaySchedule, new Date())\n ) {\n skippedDiagnostics.push(experimentDiagnostic(\n experiment,\n [{ id: \"weekday\", label: \"Weekday schedule\", status: \"failed\", reason: \"excluded_weekday\" }],\n null,\n \"excluded_weekday\",\n ));\n continue;\n }\n if (!matchesDeliveryUrlRules(item.r, ctx.url)) {\n skippedDiagnostics.push(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"failed\", reason: \"url_mismatch\" },\n // Critical-path plans only contain campaigns without non-URL\n // targeting, so the truthful audience result is \"all visitors\".\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n ],\n null,\n \"url_mismatch\",\n ));\n continue;\n }\n\n const hashId = getHashId(experiment, ctx.userId, ctx.attributes);\n const hashValue = hashToFloat(experiment.id, hashId);\n if (!inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1)) {\n skippedDiagnostics.push(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"passed\", reason: \"precompiled_delivery_match\" },\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n {\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: \"failed\",\n reason: \"outside_allocation\",\n detail: { hashValue, allocation: experiment.trafficAllocation ?? 1 },\n },\n ],\n null,\n \"outside_allocation\",\n ));\n continue;\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, hashId);\n const planIndex = chooseVariation(variationHashValue, item.v.map((variation) => variation.w));\n const plannedVariation = planIndex >= 0 ? item.v[planIndex] : null;\n if (!plannedVariation) continue;\n const fullIndex = experiment.variations.findIndex((variation) => variation.id === plannedVariation.id);\n if (fullIndex < 0) continue;\n const fullVariation = experiment.variations[fullIndex];\n const mutations = plannedVariation.m\n .map(expandCriticalMutation)\n .filter((mutation): mutation is Mutation => Boolean(mutation));\n\n assignments.push({\n experimentId: experiment.id,\n experimentName: experiment.name,\n variationId: fullVariation.id,\n pageActive: true,\n index: fullIndex,\n mutations,\n value: fullVariation.value,\n featureFlag: experiment.featureFlag,\n personalization: experiment.personalization,\n kind: experiment.kind ?? (experiment.personalization ? \"personalization\" : experiment.featureFlag ? \"feature_flag\" : \"experiment\"),\n experimentCss: experiment.css,\n experimentJs: experiment.js,\n experimentResetJs: experiment.resetJs,\n css: fullVariation.css,\n js: fullVariation.js,\n resetJs: fullVariation.resetJs,\n externalCssUrl: fullVariation.externalCssUrl,\n externalJsUrl: fullVariation.externalJsUrl,\n harnessSession: fullVariation.harnessSession,\n artifactSource: fullVariation.artifactSource,\n isControl: Boolean(fullVariation.isControl || plannedVariation.c),\n hashValue: hashId,\n });\n }\n return { assignments, plannedExperimentIds, skippedDiagnostics };\n}\n\nexport function runPostRevealReassert(): void {\n try {\n if (!state.config || !resolveDomPageTrigger(state.config, state.pageTriggerMode)) return;\n if (!state.assignments.length) return;\n reassertAssignmentMutations(state.assignments);\n } catch {}\n}\n\nexport function schedulePostRevealReassert(): void {\n try {\n const first = () => runPostRevealReassert();\n if (typeof window !== \"undefined\" && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(first);\n } else if (typeof window !== \"undefined\") {\n window.setTimeout(first, 0);\n } else {\n setTimeout(first, 0);\n }\n\n const debounceMs = state.config?.spa?.debounceMs ?? 250;\n if (typeof window !== \"undefined\") {\n window.setTimeout(runPostRevealReassert, debounceMs);\n } else {\n setTimeout(runPostRevealReassert, debounceMs);\n }\n } catch {}\n}\n\nexport function revealExperimentContent(options: { postRevealReassert?: boolean } = {}): void {\n const revealAt = markDripPerf(\"reveal_at\");\n markCwvReveal();\n updateLoadDiagnostics({ stage: \"revealed\", revealAt });\n revealAll();\n removeAntiFlicker();\n if (options.postRevealReassert !== false) {\n schedulePostRevealReassert();\n }\n}\n\nexport function applyAssignmentCode(\n assignment: Assignment,\n applyEpoch: number,\n appliedExperimentCode: Set<string>,\n ownerKeys: readonly string[],\n ownerIds: readonly string[],\n runCustomJs = true,\n onCustomJsRun?: () => void,\n): void {\n const artifactId = baseArtifactApplicationKey(assignment);\n if (assignment.experimentCss && !appliedExperimentCode.has(assignment.experimentId)) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying experiment CSS`, {\n bytes: assignment.experimentCss.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: injecting experiment CSS`);\n injectExperimentCss(\n assignment.experimentCss,\n assignment.experimentId,\n ownerIds,\n artifactId,\n applyEpoch,\n );\n }\n if (assignment.css) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying CSS`, {\n variationId: assignment.variationId,\n bytes: assignment.css.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: injecting CSS`);\n injectCss(\n assignment.css,\n assignment.experimentId,\n assignment.variationId,\n ownerIds,\n artifactId,\n applyEpoch,\n );\n }\n\n if (\n (!runCustomJs || !assignment.experimentJs) &&\n !assignment.externalCssUrl &&\n !assignment.externalJsUrl &&\n (!runCustomJs || !assignment.js)\n ) {\n appliedExperimentCode.add(assignment.experimentId);\n return;\n }\n\n runWhenDomReady(() => {\n if (!artifactEpochCurrent(ownerKeys, applyEpoch)) return;\n const label = assignment.experimentId + \"-\" + assignment.variationId;\n if (\n runCustomJs &&\n assignment.experimentJs &&\n !appliedExperimentCode.has(assignment.experimentId)\n ) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying experiment JS`, {\n bytes: assignment.experimentJs.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: executing experiment JS`);\n runMuted(() => execJs(assignment.experimentJs!, assignment.experimentId + \"-experiment-js\"));\n onCustomJsRun?.();\n }\n appliedExperimentCode.add(assignment.experimentId);\n const cssReady = assignment.externalCssUrl\n ? injectExternalCss(\n assignment.externalCssUrl,\n assignment.experimentId,\n assignment.variationId,\n ownerIds,\n artifactId,\n applyEpoch,\n )\n .then(() => {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: External CSS loaded`, {\n variationId: assignment.variationId,\n url: assignment.externalCssUrl,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: external CSS loaded`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external CSS loaded\", { url: assignment.externalCssUrl });\n })\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external CSS failed\", { url: assignment.externalCssUrl });\n })\n : Promise.resolve();\n\n cssReady.then(() => {\n if (!artifactEpochCurrent(ownerKeys, applyEpoch)) return;\n const jsReady = assignment.externalJsUrl\n ? loadExternalJs(assignment.externalJsUrl, label, ownerIds, artifactId, applyEpoch)\n .then(() => {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: External JS loaded`, {\n variationId: assignment.variationId,\n url: assignment.externalJsUrl,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: external JS loaded`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external JS loaded\", { url: assignment.externalJsUrl });\n })\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external JS failed\", { url: assignment.externalJsUrl });\n })\n : Promise.resolve();\n\n jsReady.then(() => {\n if (!artifactEpochCurrent(ownerKeys, applyEpoch)) return;\n if (runCustomJs && assignment.js) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying JS`, {\n variationId: assignment.variationId,\n bytes: assignment.js.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: executing JS`);\n runMuted(() => execJs(assignment.js!, label));\n onCustomJsRun?.();\n }\n });\n });\n });\n}\n\nexport function recordAppliedAssignment(\n assignment: Assignment,\n pageIds: readonly string[],\n): string[] {\n return pageIds.map((pageId) => {\n const key = artifactApplicationKey(assignment, pageId);\n const pageState = state.pageActivation.get(pageId) ?? {\n active: true,\n appliedKeys: new Set<string>(),\n };\n pageState.appliedKeys.add(key);\n state.pageActivation.set(pageId, pageState);\n appliedAssignmentsByKey.set(key, assignment);\n artifactEpochs.set(key, applyPassEpoch);\n return key;\n });\n}\n\nexport function appliedOwnerKeysForAssignment(assignment: Assignment): string[] {\n const baseKey = baseArtifactApplicationKey(assignment);\n return Array.from(appliedAssignmentsByKey.entries())\n .filter(([, applied]) => baseArtifactApplicationKey(applied) === baseKey)\n .map(([ownerKey]) => ownerKey);\n}\n\nexport function applyAssignments(\n assignments: Assignment[],\n activationMode: ActivationMode,\n options: { pageIds?: ReadonlySet<string>; goalUrl?: string } = {},\n): void {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Applying assignment set`, {\n assignments: assignments.length,\n activationMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `Applying ${assignments.length} assignment(s)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"apply\", `Applying ${assignments.length} assignment(s)`);\n const applyGeneration = ++applyPassEpoch;\n const appliedExperimentCode = new Set<string>();\n const customJsRan = new Set<string>();\n // Keep destination redirect assignments active for attribution, goals, and\n // exposure dedupe, but render only assignments whose artifacts belong to\n // the current (source) page.\n const ownerPageIdsByAssignment = new Map<Assignment, string[]>();\n const existingOwnerKeysByAssignment = new Map<Assignment, string[]>();\n const renderableAssignments = artifactRenderableAssignments(assignments).filter(\n (assignment) => {\n const pageIds = assignmentPageIds(assignment).filter(\n (pageId) => !options.pageIds || options.pageIds.has(pageId),\n );\n ownerPageIdsByAssignment.set(assignment, pageIds);\n existingOwnerKeysByAssignment.set(\n assignment,\n appliedOwnerKeysForAssignment(assignment),\n );\n return pageIds.length > 0;\n },\n );\n const offersDisplayWithheld = (assignment: Assignment): boolean =>\n !isOffersDisplayAssignmentAuthorized(assignment);\n\n // Delivery state is assignment-scoped. A page-limited SPA pass may replace\n // the tracker for assignments it is about to deliver, but must not promote\n // an unrelated page's still-pending assignment into the attribution plane.\n for (const assignment of renderableAssignments) {\n const exposureKey = exposureAssignmentKey(assignment);\n state.mutationPendingAssignmentKeys.delete(exposureKey);\n if (\n assignment.mutations.length > 0 &&\n !offersDisplayWithheld(assignment) &&\n (existingOwnerKeysByAssignment.get(assignment)?.length ?? 0) === 0\n ) {\n state.mutationPendingAssignmentKeys.add(exposureKey);\n // Same prune-hole as contamination: pending keys for removed assignments\n // are dropped on re-init, so an undelivered treatment must leave the\n // ledger now and re-enter only through clean delivery.\n runtimeSharedState.attributionLedger.delete(assignment.experimentId);\n }\n }\n\n const commerce = state.config?.commerce;\n const commerceActive = Boolean(commerce?.price || commerce?.shipping || commerce?.offers);\n const renderableCommerceAssignments = commerceActive\n ? artifactRenderableAssignments(\n withCommercePriceAssignments(renderableAssignments).filter(renderable),\n )\n : renderableAssignments;\n // The charge plane is reconciled before the price gate below reads the cart\n // stamp; the pass therefore skips the cart step of syncGlobalRuntimes().\n reconcileCartSync();\n if (state.config?.holdout_v1_enabled === true && assignments.length === 0) {\n // Cohort identity must cross the storefront -> checkout boundary even\n // when this page has no assignments. Held-out visitors additionally need\n // a privilege-reducing clear that cannot be gated on analytics consent.\n syncActiveAssignmentToShopifyCart({ holdoutCartClear: state.holdout });\n }\n\n // Offers-enforced assignments render nothing until their cart stamp is\n // authorized: a companion treatment shown before the signed envelope lands\n // could advertise an offer Shopify never charges. Identity, goal wiring,\n // and cart-sync behavior are unchanged \u2014 only DOM application (mutations,\n // CSS/JS) is withheld; the display-authorization callback re-applies.\n // Count total mutations to know when all have been applied\n let pendingMutations = 0;\n for (const a of renderableAssignments) {\n if (offersDisplayWithheld(a)) continue;\n if ((existingOwnerKeysByAssignment.get(a)?.length ?? 0) > 0) continue;\n pendingMutations += a.mutations.length;\n }\n // Counts a price treatment whose activation is still PENDING (Shopify has not yet\n // published product metadata), so the reveal cannot flash the original price. The\n // anti-flicker timeout still bounds how long content may stay hidden.\n const pricePending = commerce?.price && isCommercePriceWorkPending(\n commerce.price,\n renderableCommerceAssignments,\n isPriceDisplayAssignmentAuthorized,\n ) ? 1 : 0;\n pendingMutations += pricePending;\n let priceResolved = 0;\n const mutationKey = (assignment: Assignment, index: number) => (\n `${assignment.experimentId}\\u0000${assignment.variationId}\\u0000${index}`\n );\n const deliveryTrackers = new Map<string, DeliveryHealthTracker>();\n const deliveryKey = (assignment: Assignment) => `${assignment.experimentId}\\u0000${assignment.variationId}`;\n for (const assignment of renderableAssignments) {\n if (offersDisplayWithheld(assignment)) continue;\n if ((existingOwnerKeysByAssignment.get(assignment)?.length ?? 0) > 0) {\n continue;\n }\n deliveryTrackers.set(deliveryKey(assignment), {\n assignment,\n expected: assignment.mutations.length,\n applied: new Set<number>(),\n missed: new Set<number>(),\n emitted: false,\n });\n }\n const contaminateAssignment = (tracker: DeliveryHealthTracker): void => {\n const assignment = tracker.assignment;\n const exposureKey = exposureAssignmentKey(assignment);\n if (state.contaminatedAssignmentKeys.has(exposureKey)) return;\n state.mutationPendingAssignmentKeys.delete(exposureKey);\n state.contaminatedAssignmentKeys.add(exposureKey);\n // Evict rather than rely on the read-time contamination check: a later\n // re-init prunes orphaned contamination keys for removed assignments, and\n // a surviving ledger entry would re-enter cart labels fail-open.\n runtimeSharedState.attributionLedger.delete(assignment.experimentId);\n const artifactId = baseArtifactApplicationKey(assignment);\n invalidatedArtifactIds.add(artifactId);\n invalidateArtifact(artifactId);\n const ownerKeys = appliedOwnerKeysForAssignment(assignment);\n for (const ownerKey of ownerKeys) unregisterArtifactOwner(ownerKey);\n for (const pageId of new Set([\n ...(ownerPageIdsByAssignment.get(assignment) ?? []),\n ...ownerKeys.map(artifactOwnerId),\n ])) {\n rollbackArtifactOwner(pageId, artifactId);\n }\n const authorizationKey = priceAssignmentAuthorizationKey(assignment);\n state.authorizedPriceAssignmentKeys?.delete(authorizationKey);\n state.authorizedShippingAssignmentKeys?.delete(authorizationKey);\n state.authorizedOffersAssignmentKeys?.delete(authorizationKey);\n // Observer delivery can run variation JS before its selector tracker\n // expires. Reset unconditionally: reset scripts are idempotent cleanup and\n // execJs contains failures so a broken customer reset cannot abort rollback.\n runAssignmentResetJs([assignment]);\n reconcileGoals();\n // Authorization revocation and visible commerce rollback are one\n // transaction: never leave a contaminated price/shipping/offer rendered\n // until the next global pass.\n reconcileCommercePrice();\n reconcileCommerceShipping();\n reconcileCartSync();\n scheduleShopifyAssignmentSync();\n const event: TrackEvent = {\n type: \"variant_contamination_rollback\",\n data: {\n missed_selector_count: tracker.missed.size,\n expected_mutations: tracker.expected,\n applied_mutations: tracker.applied.size,\n apply_generation: applyGeneration,\n activation_mode: activationMode,\n },\n url: cleanUrl(),\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n };\n if (state.tracker && !trackingBlocked()) state.tracker.track(event);\n else state.pendingDeliveryHealth.push(event);\n };\n const maybeEmitDeliveryHealth = (tracker: DeliveryHealthTracker): void => {\n if (tracker.emitted) return;\n if (tracker.expected > 0 && tracker.applied.size + tracker.missed.size < tracker.expected) return;\n tracker.emitted = true;\n if (tracker.missed.size > 0) {\n contaminateAssignment(tracker);\n } else {\n const exposureKey = exposureAssignmentKey(tracker.assignment);\n const wasPending = state.mutationPendingAssignmentKeys.delete(exposureKey);\n recordAttributableAssignments([tracker.assignment]);\n // The assignment was deliberately excluded from every runtime while its\n // selectors were unresolved. Promote every goal/identity/charge plane in\n // this same turn rather than waiting for a route change or re-init.\n if (wasPending) {\n reconcileGoals();\n reconcileCommercePrice();\n reconcileCommerceShipping();\n reconcileCartSync();\n scheduleShopifyAssignmentSync();\n }\n }\n queueDeliveryHealthEvent(tracker.assignment, {\n expectedMutations: tracker.expected,\n appliedMutations: tracker.applied.size,\n selectorMisses: tracker.missed.size,\n applyGeneration,\n activationMode,\n });\n if (tracker.missed.size === 0 && state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config, [tracker.assignment]);\n }\n };\n updateLoadDiagnostics({\n stage: \"mutations_scheduled\",\n pendingMutations,\n appliedMutations: 0,\n missedMutations: 0,\n });\n\n const appliedMutationKeys = new Set<string>();\n const missedMutationKeys = new Set<string>();\n let revealed = false;\n const maybeRevealResolvedMutations = (): void => {\n if (!revealed && appliedMutationKeys.size + missedMutationKeys.size + priceResolved >= pendingMutations) {\n revealed = true;\n revealExperimentContent();\n }\n };\n if (appliedMutationKeys.size > 0) maybeRevealResolvedMutations();\n const onMutationApplied = pendingMutations > 0\n ? (\n assignment: Assignment,\n ownerKeys: readonly string[],\n mutation: Mutation,\n element: Element,\n index: number,\n journalSeq?: number,\n ) => {\n if (activationMode === \"observer\") {\n trackAppliedMutation(\n element,\n mutation,\n {\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n journalSeq,\n artifactId: baseArtifactApplicationKey(assignment),\n ownerKeys,\n },\n (target, appliedMutation) => applyToElement(appliedMutation, target),\n );\n }\n const key = mutationKey(assignment, index);\n if (appliedMutationKeys.has(key)) return;\n appliedMutationKeys.add(key);\n missedMutationKeys.delete(key);\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) {\n tracker.applied.add(index);\n tracker.missed.delete(index);\n maybeEmitDeliveryHealth(tracker);\n }\n const firstMutationAt = markDripPerf(\"first_mutation_at\");\n updateLoadDiagnostics({\n stage: \"mutation_applied\",\n firstMutationAt,\n pendingMutations,\n appliedMutations: appliedMutationKeys.size,\n missedMutations: missedMutationKeys.size,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `Mutation applied (${appliedMutationKeys.size}/${pendingMutations})`, {\n selector: mutation.selector,\n });\n maybeRevealResolvedMutations();\n }\n : null;\n const onMutationMissed = pendingMutations > 0\n ? (assignment: Assignment, mutation: Mutation, index: number) => {\n const key = mutationKey(assignment, index);\n if (appliedMutationKeys.has(key) || missedMutationKeys.has(key)) return;\n missedMutationKeys.add(key);\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) {\n tracker.missed.add(index);\n maybeEmitDeliveryHealth(tracker);\n }\n updateLoadDiagnostics({\n stage: \"mutation_missed\",\n pendingMutations,\n appliedMutations: appliedMutationKeys.size,\n missedMutations: missedMutationKeys.size,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", `${assignment.experimentId}: selector did not match before expiry`, {\n variationId: assignment.variationId,\n selector: mutation.selector,\n });\n maybeRevealResolvedMutations();\n }\n : null;\n\n for (const assignment of renderableAssignments) {\n if (offersDisplayWithheld(assignment)) continue;\n // A manual mutation earlier in this pass may have contaminated the\n // assignment after the renderable set was built.\n if (!renderable(assignment)) continue;\n const ownerPageIds = ownerPageIdsByAssignment.get(assignment) ?? [];\n const artifactId = baseArtifactApplicationKey(assignment);\n const ownerKeys = assignmentHasRenderableArtifacts(assignment)\n ? recordAppliedAssignment(assignment, ownerPageIds)\n : [];\n const existingOwnerKeys = new Set(\n existingOwnerKeysByAssignment.get(assignment) ?? [],\n );\n const existingOwnerIds = new Set(\n Array.from(existingOwnerKeys, artifactOwnerId),\n );\n const ownershipOnly = existingOwnerKeys.size > 0;\n if (ownershipOnly) {\n addAppliedMutationOwners(existingOwnerIds, ownerPageIds, artifactId);\n addWaitEntryOwners(existingOwnerIds, ownerPageIds, artifactId);\n } else if (assignment.mutations.length) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying mutations`, {\n variationId: assignment.variationId,\n count: assignment.mutations.length,\n activationMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: ${assignment.mutations.length} mutation(s)`, { activationMode });\n if (activationMode === \"manual\") {\n applyMutations(assignment.mutations, {\n artifactId: baseArtifactApplicationKey(assignment),\n epoch: applyGeneration,\n ownerKeys: ownerPageIds,\n preservePrices: assignment.artifactSource === \"operator_chat\",\n onPricePreservationViolation: ({ selector, originalPriceTokens }) => {\n if (!state.config) return;\n sendRuntimeEventNow(state.config, \"sdk_price_preservation_blocked\", {\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n selector,\n original_price_tokens: originalPriceTokens.map((token) => token.raw),\n });\n },\n onApplied: onMutationApplied\n ? (mutation, element, index, journalSeq) => onMutationApplied(\n assignment,\n ownerPageIds,\n mutation,\n element,\n index,\n journalSeq,\n )\n : undefined,\n onMiss: onMutationMissed\n ? (mutation, index) => onMutationMissed(assignment, mutation, index)\n : undefined,\n });\n } else {\n // DOM mutations via MutationObserver-backed waitForElement\n assignment.mutations.forEach((m, i) => applyMutationWithWait(\n m,\n i,\n onMutationApplied\n ? (mutation, element, index, journalSeq) => onMutationApplied(\n assignment,\n ownerPageIds,\n mutation,\n element,\n index,\n journalSeq,\n )\n : undefined,\n onMutationMissed\n ? (mutation, index) => onMutationMissed(assignment, mutation, index)\n : undefined,\n ownerPageIds,\n baseArtifactApplicationKey(assignment),\n applyGeneration,\n assignment.artifactSource === \"operator_chat\" ? {\n enabled: true,\n onViolation: ({ selector, originalPriceTokens }) => {\n if (!state.config) return;\n sendRuntimeEventNow(state.config, \"sdk_price_preservation_blocked\", {\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n selector,\n original_price_tokens: originalPriceTokens.map((token) => token.raw),\n });\n },\n } : undefined,\n ));\n }\n } else {\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) maybeEmitDeliveryHealth(tracker);\n }\n // Manual mutation delivery can contaminate and roll back this assignment\n // synchronously. Re-check immediately before every remaining artifact\n // surface so CSS and custom JS cannot be re-injected in the same pass.\n if (!renderable(assignment)) continue;\n applyAssignmentCode(\n assignment,\n applyGeneration,\n appliedExperimentCode,\n ownerKeys,\n ownerPageIds,\n !ownershipOnly,\n () => customJsRan.add(exposureAssignmentKey(assignment)),\n );\n if (!ownershipOnly) invalidatedArtifactIds.delete(artifactId);\n }\n\n pendingCommercePriceResolve = () => {\n priceResolved = pricePending;\n if (pricePending) maybeRevealResolvedMutations();\n };\n // Goals, harness polling and commerce price/shipping clean up before they\n // render, so they reconcile from the full active set \u2014 never this pass's\n // page subset.\n syncGlobalRuntimes({ goalUrl: options.goalUrl, skipCartSync: true });\n\n // If there were no mutations (or manual mode), reveal immediately.\n if (pendingMutations === 0 || activationMode === \"manual\") {\n revealExperimentContent();\n }\n}\n\nexport function reassertAssignmentMutations(assignments: Assignment[]): void {\n const mutations = artifactRenderableAssignments(assignments).reduce<Assignment[\"mutations\"]>((all, assignment) => {\n all.push(...assignment.mutations);\n return all;\n }, []);\n if (!mutations.length) return;\n reassertNonStructuralMutations(mutations);\n}\n\nexport type TeardownPage = {\n pageId: string;\n mode: PageDeactivationMode;\n};\n\nexport type TeardownRuntimeOptions = {\n goalUrl?: string;\n skipCartSync?: boolean;\n};\n\nexport type TeardownSelection = Map<string, {\n artifactIds: Set<ArtifactId>;\n mode: PageDeactivationMode;\n}>;\n\nexport function runAssignmentResetJs(assignments: Iterable<Assignment>): void {\n const resetExperimentIds = new Set<string>();\n const resetAssignmentKeys = new Set<string>();\n for (const assignment of assignments) {\n const assignmentKey = assignment.experimentId + \"\\u0000\" + assignment.variationId;\n if (assignment.resetJs && !resetAssignmentKeys.has(assignmentKey)) {\n resetAssignmentKeys.add(assignmentKey);\n execJs(assignment.resetJs, assignment.experimentId + \"-reset\");\n }\n if (\n assignment.experimentResetJs &&\n !resetExperimentIds.has(assignment.experimentId)\n ) {\n resetExperimentIds.add(assignment.experimentId);\n execJs(\n assignment.experimentResetJs,\n assignment.experimentId + \"-experiment-reset\",\n );\n }\n }\n}\n\nexport /**\n * Reveal hook for a price activation that is still resolving. The latest\n * `applyAssignments` pass owns it; `applyCommercePrice` keeps calling the\n * stable wrapper, so a late resolution still reveals the current pass.\n */\nlet pendingCommercePriceResolve: (() => void) | null = null;\n\nexport function resolveCommercePricePending(): void {\n pendingCommercePriceResolve?.();\n}\n\nexport function unwireGoals(): void {\n state.wiredGoalKeys = new Set();\n cleanupGoals();\n}\n\nexport function goalWiringEligible(): boolean {\n return state.analyticsStarted &&\n !trackingBlocked() &&\n state.trackingPrerequisiteMet;\n}\n\nexport /**\n * Diff the wired goal set against the assigned plane. Removing one page's goals\n * therefore never removes the document listener while other goals live, and a\n * teardown that changes nothing still leaves the surviving goals wired.\n */\nfunction reconcileGoals(url?: string): void {\n if (!goalWiringEligible()) return;\n const experiments = state.config?.experiments ?? [];\n const activePageIdsForGoals = activePageIds();\n const desired = goalWiringKeys(\n state.assignments.filter(attributable),\n experiments,\n activePageIdsForGoals,\n );\n if (sameStringSet(desired, state.wiredGoalKeys)) {\n if (url) state.wiredGoalUrl = url;\n return;\n }\n setupGoalTracking(experiments, url, activePageIdsForGoals);\n}\n\nexport function reconcileHarnessPolling(): void {\n startHarnessPolling(activeRenderableAssignments());\n}\n\nexport function reconcileCommercePrice(): void {\n try {\n applyCommercePrice(\n state.config?.commerce?.price,\n artifactRenderableAssignments(\n withCommercePriceAssignments(activeRenderableAssignments()).filter(renderable),\n ),\n isCohortStampedOnCart,\n resolveCommercePricePending,\n isPriceDisplayAssignmentAuthorized,\n );\n } catch {\n resolveCommercePricePending();\n }\n}\n\nexport function reconcileCommerceShipping(): void {\n applyCommerceShipping(\n state.config?.commerce?.shipping,\n activeRenderableAssignments().filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n}\n\nexport function reconcileCartSync(): void {\n const commerce = state.config?.commerce;\n if (commerce?.price || commerce?.shipping || commerce?.offers) {\n configureChargeCorrectnessCartSync(chargeAffectingAssignments());\n return;\n }\n // No commerce planes remain, so no cart sync will run \u2014 but an earlier\n // GWP insertion may still sit on the persistent cart with its Function\n // authorization gone. The manager exits instantly without insertion\n // records, so this is free for every non-commerce shop.\n void syncGiftWithPurchase(commerce?.offers, withCommercePriceAssignments(state.assignments).filter(attributable));\n}\n\nexport /**\n * Reconcile every global runtime singleton from runtime state. No page-scoped\n * path may call a global cleanup: teardown and apply change state, this\n * function decides what the document should hold afterwards.\n *\n * `skipCartSync` is for callers that already reconciled the charge plane in\n * the same pass (`applyAssignments`, which must stamp the cart before the\n * price gate is computed) and for the commerce callbacks that run *inside*\n * the cart-sync completion path, where re-entering it would recurse.\n */\nfunction syncGlobalRuntimes(\n options: { goalUrl?: string; skipCartSync?: boolean } = {},\n): void {\n if (!options.skipCartSync) reconcileCartSync();\n reconcileGoals(options.goalUrl);\n reconcileHarnessPolling();\n reconcileCommercePrice();\n reconcileCommerceShipping();\n}\n\nexport function configuredPageDeactivationModes(): Map<string, PageDeactivationMode> {\n const modes = new Map<string, PageDeactivationMode>();\n for (const experiment of state.config?.experiments ?? []) {\n const rules = includedPageRules(experiment);\n if (rules.length === 0) {\n modes.set(GLOBAL_PAGE_PREFIX + experiment.id, targetingLifecycleMode(experiment));\n continue;\n }\n for (const rule of rules) {\n if (!modes.has(rule.id)) {\n modes.set(rule.id, effectiveDeactivationMode(experiment, rule));\n }\n }\n }\n return modes;\n}\n\nexport function allAppliedPagesWithModes(): TeardownPage[] {\n const configuredModes = configuredPageDeactivationModes();\n return Array.from(state.pageActivation.entries())\n .filter(([, pageState]) => pageState.appliedKeys.size > 0)\n .map(([pageId, pageState]) => ({\n pageId,\n mode:\n configuredModes.get(pageId) ??\n pageState.configuredMode ??\n pageState.lastTransitionMode ??\n \"reset\",\n }));\n}\n\nexport function rollbackArtifactOwner(pageId: string, artifactId: ArtifactId): void {\n resetWaitEntriesForOwner(pageId, artifactId);\n resetAppliedMutationsForOwner(pageId, artifactId, {\n preserveReplacementTargets: true,\n });\n removeCssForOwner(pageId, artifactId);\n removeExternalJsForOwner(pageId, artifactId);\n}\n\nexport function unregisterArtifactOwner(ownerKey: string): void {\n artifactEpochs.delete(ownerKey);\n appliedAssignmentsByKey.delete(ownerKey);\n state.pageActivation.get(artifactOwnerId(ownerKey))?.appliedKeys.delete(ownerKey);\n}\n\nexport /**\n * Run one teardown as an ordered document transaction. The reset closure is\n * complete before merchant code runs: all artifacts of every resetting\n * experiment are invalidated, selected owners are unregistered, reset JS runs\n * once, selected owners roll back, and surviving artifacts replay.\n */\nfunction executeTeardownTransaction(\n selection: TeardownSelection,\n runtimeOptions: TeardownRuntimeOptions = {},\n): void {\n const liveBefore = liveArtifactInventory();\n const selectedOwnerKeys = new Set<string>();\n for (const [pageId, selected] of selection) {\n for (const artifactId of selected.artifactIds) {\n const ownerKey = `${pageId}\\u0000${artifactId}`;\n if (appliedAssignmentsByKey.has(ownerKey)) selectedOwnerKeys.add(ownerKey);\n }\n }\n\n const resettingExperimentIds = new Set<string>();\n for (const ownerKey of selectedOwnerKeys) {\n const selected = selection.get(artifactOwnerId(ownerKey));\n const assignment = appliedAssignmentsByKey.get(ownerKey);\n if (\n selected &&\n (selected.mode === \"reset\" || selected.mode === \"force_reset\") &&\n assignment &&\n (assignment.resetJs || assignment.experimentResetJs)\n ) {\n resettingExperimentIds.add(assignment.experimentId);\n }\n }\n\n const closureArtifactIds = new Set<ArtifactId>();\n const closureAssignments = new Map<ArtifactId, Assignment>();\n const closurePageIds = new Set<string>();\n const closureOwnerKeysByExperiment = new Map<string, Set<string>>();\n for (const [artifactId, live] of liveBefore) {\n if (!resettingExperimentIds.has(live.assignment.experimentId)) continue;\n closureArtifactIds.add(artifactId);\n closureAssignments.set(artifactId, live.assignment);\n const ownerKeys = closureOwnerKeysByExperiment.get(live.assignment.experimentId)\n ?? new Set<string>();\n live.ownerKeys.forEach((ownerKey) => {\n ownerKeys.add(ownerKey);\n closurePageIds.add(artifactOwnerId(ownerKey));\n });\n closureOwnerKeysByExperiment.set(live.assignment.experimentId, ownerKeys);\n }\n\n const configuredModes = configuredPageDeactivationModes();\n const modeForPage = (pageId: string): PageDeactivationMode =>\n selection.get(pageId)?.mode ??\n configuredModes.get(pageId) ??\n state.pageActivation.get(pageId)?.configuredMode ??\n state.pageActivation.get(pageId)?.lastTransitionMode ??\n \"reset\";\n const resetSuppressedExperimentIds = new Set<string>();\n const isolationFallbackExperimentIds = new Set<string>();\n for (const [experimentId, ownerKeys] of closureOwnerKeysByExperiment) {\n if (Array.from(ownerKeys).some((ownerKey) => modeForPage(artifactOwnerId(ownerKey)) === \"deactivate\")) {\n resetSuppressedExperimentIds.add(experimentId);\n }\n if (Array.from(ownerKeys).some((ownerKey) => !selectedOwnerKeys.has(ownerKey))) {\n isolationFallbackExperimentIds.add(experimentId);\n }\n }\n\n const fallbackExperimentId = isolationFallbackExperimentIds.values().next().value as string | undefined;\n if (fallbackExperimentId) {\n for (const pageId of closurePageIds) {\n const pageState = state.pageActivation.get(pageId);\n if (!pageState) continue;\n pageState.isolationFallback = \"whole_experiment\";\n pageState.isolationFallbackExperimentId = fallbackExperimentId;\n }\n }\n\n // D6 serializes nested reconciles, but the registry and every journal must\n // already describe invalid state before merchant reset JS can trigger one.\n for (const artifactId of closureArtifactIds) {\n invalidatedArtifactIds.add(artifactId);\n invalidateArtifact(artifactId);\n }\n for (const ownerKeys of closureOwnerKeysByExperiment.values()) {\n ownerKeys.forEach((ownerKey) => artifactEpochs.delete(ownerKey));\n }\n for (const ownerKey of selectedOwnerKeys) unregisterArtifactOwner(ownerKey);\n\n runAssignmentResetJs(\n Array.from(closureAssignments.values()).filter(\n (assignment) => !resetSuppressedExperimentIds.has(assignment.experimentId),\n ),\n );\n\n for (const ownerKey of selectedOwnerKeys) {\n rollbackArtifactOwner(\n artifactOwnerId(ownerKey),\n artifactIdFromApplicationKey(ownerKey),\n );\n }\n\n const liveAfterRollback = liveArtifactInventory();\n const desired = desiredArtifactSet(state.assignments);\n const replay = Array.from(closureArtifactIds)\n .filter((artifactId) => liveAfterRollback.has(artifactId) && desired.has(artifactId))\n .map((artifactId) => desired.get(artifactId)!);\n replayDesiredArtifacts(replay);\n for (const artifactId of closureArtifactIds) {\n if (!liveArtifactInventory().has(artifactId)) invalidatedArtifactIds.delete(artifactId);\n }\n\n revealExperimentContent({ postRevealReassert: false });\n syncGlobalRuntimes(runtimeOptions);\n}\n\nexport function teardownTransaction(\n pages: TeardownPage[],\n runtimeOptions: TeardownRuntimeOptions = {},\n): void {\n pages.forEach((page) => cancelPageRulePoll(page.pageId));\n const selection: TeardownSelection = new Map();\n for (const page of pages) {\n const pageState = state.pageActivation.get(page.pageId);\n if (!pageState || pageState.appliedKeys.size === 0) continue;\n const existing = selection.get(page.pageId);\n const artifactIds = existing?.artifactIds ?? new Set<ArtifactId>();\n pageState.appliedKeys.forEach((ownerKey) =>\n artifactIds.add(artifactIdFromApplicationKey(ownerKey)));\n selection.set(page.pageId, { artifactIds, mode: page.mode });\n }\n executeTeardownTransaction(selection, runtimeOptions);\n}\n\nexport function teardownArtifactsTransaction(\n artifactIds: ReadonlySet<ArtifactId>,\n runtimeOptions: TeardownRuntimeOptions = {},\n): void {\n const configuredModes = configuredPageDeactivationModes();\n const selection: TeardownSelection = new Map();\n const live = liveArtifactInventory();\n for (const artifactId of artifactIds) {\n const artifact = live.get(artifactId);\n if (!artifact) continue;\n for (const pageId of artifact.ownerPageIds) {\n const pageState = state.pageActivation.get(pageId);\n const existing = selection.get(pageId);\n const selectedArtifactIds = existing?.artifactIds ?? new Set<ArtifactId>();\n selectedArtifactIds.add(artifactId);\n selection.set(pageId, {\n artifactIds: selectedArtifactIds,\n mode:\n configuredModes.get(pageId) ??\n pageState?.configuredMode ??\n pageState?.lastTransitionMode ??\n \"reset\",\n });\n }\n }\n executeTeardownTransaction(selection, runtimeOptions);\n}\n\nexport type DesiredArtifact = {\n id: ArtifactId;\n assignment: Assignment;\n ownerPageIds: Set<string>;\n};\n\nexport type LiveArtifact = DesiredArtifact & {\n ownerKeys: Set<string>;\n};\n\nexport type ArtifactReconcileResult = {\n applied: number;\n ownerUpdates: number;\n removed: number;\n replayed: number;\n};\n\nexport function desiredArtifactSet(assignments: Assignment[]): Map<ArtifactId, DesiredArtifact> {\n const desired = new Map<ArtifactId, DesiredArtifact>();\n for (const assignment of artifactRenderableAssignments(assignments)) {\n if (!isOffersDisplayAssignmentAuthorized(assignment)) continue;\n if (!assignmentHasRenderableArtifacts(assignment)) continue;\n const ownerPageIds = assignmentPageIds(assignment);\n if (ownerPageIds.length === 0) continue;\n const id = baseArtifactApplicationKey(assignment);\n const existing = desired.get(id);\n if (existing) {\n ownerPageIds.forEach((pageId) => existing.ownerPageIds.add(pageId));\n continue;\n }\n desired.set(id, { id, assignment, ownerPageIds: new Set(ownerPageIds) });\n }\n return desired;\n}\n\nexport function liveArtifactInventory(): Map<ArtifactId, LiveArtifact> {\n const live = new Map<ArtifactId, LiveArtifact>();\n for (const [ownerKey, assignment] of appliedAssignmentsByKey) {\n const id = artifactIdFromApplicationKey(ownerKey);\n const pageId = artifactOwnerId(ownerKey);\n const existing = live.get(id);\n if (existing) {\n existing.ownerKeys.add(ownerKey);\n existing.ownerPageIds.add(pageId);\n continue;\n }\n live.set(id, {\n id,\n assignment,\n ownerKeys: new Set([ownerKey]),\n ownerPageIds: new Set([pageId]),\n });\n }\n return live;\n}\n\nexport function removeArtifactOwner(artifactId: ArtifactId, pageId: string): void {\n const ownerKey = `${pageId}\\u0000${artifactId}`;\n unregisterArtifactOwner(ownerKey);\n rollbackArtifactOwner(pageId, artifactId);\n}\n\nexport function registerDesiredOwners(\n desired: DesiredArtifact,\n live: LiveArtifact,\n): { ownerKeys: string[]; added: boolean; epoch: number } {\n const liveEpoch = Array.from(live.ownerKeys)\n .map((ownerKey) => artifactEpochs.get(ownerKey) ?? 0)\n .reduce((highest, epoch) => Math.max(highest, epoch), 0);\n let added = false;\n const ownerKeys: string[] = [];\n for (const pageId of desired.ownerPageIds) {\n const ownerKey = `${pageId}\\u0000${desired.id}`;\n ownerKeys.push(ownerKey);\n const pageState = state.pageActivation.get(pageId) ?? {\n active: true,\n appliedKeys: new Set<string>(),\n };\n if (!appliedAssignmentsByKey.has(ownerKey)) added = true;\n pageState.appliedKeys.add(ownerKey);\n state.pageActivation.set(pageId, pageState);\n appliedAssignmentsByKey.set(ownerKey, desired.assignment);\n if (!artifactEpochs.has(ownerKey)) artifactEpochs.set(ownerKey, liveEpoch);\n }\n addAppliedMutationOwners(live.ownerPageIds, Array.from(desired.ownerPageIds), desired.id);\n addWaitEntryOwners(live.ownerPageIds, Array.from(desired.ownerPageIds), desired.id);\n addCssOwners(live.ownerPageIds, Array.from(desired.ownerPageIds), desired.id);\n addExternalJsOwners(live.ownerPageIds, Array.from(desired.ownerPageIds), desired.id);\n return { ownerKeys, added, epoch: liveEpoch };\n}\n\nexport function replayDesiredArtifacts(artifacts: DesiredArtifact[]): void {\n if (artifacts.length === 0) return;\n const replayEpoch = ++applyPassEpoch;\n const appliedExperimentCode = new Set<string>();\n for (const desired of artifacts) {\n const live = liveArtifactInventory().get(desired.id);\n if (!live) continue;\n const registered = registerDesiredOwners(desired, live);\n for (const ownerKey of registered.ownerKeys) artifactEpochs.set(ownerKey, replayEpoch);\n replayArtifact(desired.id);\n for (const pageId of desired.ownerPageIds) {\n removeExternalJsForOwner(pageId, desired.id);\n }\n applyAssignmentCode(\n desired.assignment,\n replayEpoch,\n appliedExperimentCode,\n registered.ownerKeys,\n Array.from(desired.ownerPageIds),\n true,\n );\n invalidatedArtifactIds.delete(desired.id);\n }\n}\n\nexport function invalidateLiveArtifactsForReplay(): void {\n teardownTransaction(allAppliedPagesWithModes());\n}\n\nexport function reconcileArtifacts(\n desired: Map<ArtifactId, DesiredArtifact>,\n goalUrl?: string,\n): ArtifactReconcileResult {\n const result: ArtifactReconcileResult = {\n applied: 0,\n ownerUpdates: 0,\n removed: 0,\n replayed: 0,\n };\n\n const removedArtifactIds = new Set(\n Array.from(liveArtifactInventory().keys()).filter(\n (artifactId) => !desired.has(artifactId),\n ),\n );\n if (removedArtifactIds.size > 0) {\n teardownArtifactsTransaction(removedArtifactIds, { goalUrl });\n result.removed = removedArtifactIds.size;\n }\n\n let live = liveArtifactInventory();\n for (const [artifactId, liveArtifact] of live) {\n const wanted = desired.get(artifactId);\n if (!wanted) continue;\n for (const pageId of liveArtifact.ownerPageIds) {\n if (wanted.ownerPageIds.has(pageId)) continue;\n removeArtifactOwner(artifactId, pageId);\n result.ownerUpdates += 1;\n }\n }\n\n live = liveArtifactInventory();\n const missing: DesiredArtifact[] = [];\n const replay: DesiredArtifact[] = [];\n for (const wanted of desired.values()) {\n const existing = live.get(wanted.id);\n if (!existing) {\n missing.push(wanted);\n continue;\n }\n if (invalidatedArtifactIds.has(wanted.id)) {\n replay.push(wanted);\n continue;\n }\n const registered = registerDesiredOwners(wanted, existing);\n if (registered.added) result.ownerUpdates += 1;\n }\n\n replayDesiredArtifacts(replay);\n result.replayed = replay.length;\n if (missing.length > 0) {\n const pageIds = new Set(missing.flatMap((artifact) => Array.from(artifact.ownerPageIds)));\n applyAssignments(\n missing.map((artifact) => artifact.assignment),\n state.activationMode,\n { pageIds, goalUrl },\n );\n result.applied = missing.length;\n }\n if (missing.length === 0) syncGlobalRuntimes({ goalUrl });\n if (replay.length > 0 && missing.length === 0) revealExperimentContent();\n return result;\n}\n\n", "declare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nimport { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { applyRuntimeAntiFlicker, SDK_SCRIPT_SRC, HeatmapController, SemanticController, FetchAttemptInfo, FetchRetryOptions, DEFAULT_CONFIG_FETCH_TIMEOUT_MS, DEFAULT_CONFIG_FETCH_SLOW_MS, CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, CONFIG_FETCH_MAX_WAIT_MS, CACHED_REDIRECT_HIDE_TIMEOUT_MS, createFetchTimeoutError, fetchWithTimeout, fetchWithRetry, CONFIG_CACHE_KEY_PREFIX, DEFAULT_CONFIG_CACHE_TTL_MS, DEFAULT_ANTI_FLICKER_TIMEOUT_MS, DEFAULT_TRACKING_IDLE_TIMEOUT_MS, DEFAULT_EXECUTION_MODE, DEFAULT_TRACKING_START, DEFAULT_JS_POLICY, PAGE_RULE_POLL_WINDOW_MS, PAGE_RULE_POLL_INTERVAL_MS, CONSENT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS, IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES, SESSION_STORAGE_KEY, collectScopedSelectors, ResolvedRuntimeConfig, UrlDiffNeeds, ConfigSource, PendingPerfEvent, InitPhaseKey, InitPerfContext, MAX_PERF_DURATION_MS, monotonicNow, boundedPerfDuration, createInitPerfContext, BootstrapPredecision, bootstrapPredecision, addInitPhase, DeliveryHealthStatus, DeliveryHealthTracker, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic, ExposureDestinationDiagnostic, RuntimeLoadDiagnostic, DripPerfWindow, normalizeNumber, resolveRuntimeConfig, resolvePageTriggerMode, resolveDomPageTrigger, dtLog, traceName, traceStep, traceGate, browserDoNotTrackValue, trackingBlocked, storefrontVitalsGateOpen, syncStorefrontVitals, doNotTrackEnabled, storageAllowed, readWindowPath, configuredConsentGranted, syncConfiguredConsent, CUSTOM_CONSENT_POLL_INTERVAL_MS, CUSTOM_CONSENT_POLL_MAX_MS, MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS, MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS, MANUAL_CALLBACK_TRIGGER_MAX_RERUNS, EVENT_DRIVEN_CONSENT_PROVIDERS, shouldPollConfiguredConsent, installConsentChangeListeners, resolveConsentRequired, resolveConsentGranted, persistentStorageAllowed, coerceSignalValue, captureUrlSignals, installClickSignalCaptures, captureEventPropertySignals, setCapturedSignal, setPublicSignal, getPublicSignals, normalizePageApiName, pageTriggerSignal, triggerPage, readElementCaptureValue, captureDomAndGlobalSignals, consentAwareDataProtection, writeConsentCookie, readConsentCookie, clearConsentStorage, applyConsentStorageMode, runWhenDomReady, applyProjectCode, resetProjectCode, runProjectStartupCode, collectJsTriggerConditions, collectPageTriggerRules, PageDetectorMode, PageRuleReconcileScope, collectPageDetectorRules, experimentsForGlobalRouteReevaluation, conditionUsesActivateTrigger, buildJsTriggerContext, runJsTriggerReset, normalizeActivationValue, installActivateJsTrigger, installPageTriggerRule, installJsTriggerObserver, notifyQaAssistantRuntimeListeners, HarnessManifest, harnessPollTimer, harnessPollKey, harnessVisibilityInstalled, activeHarnessAssignment, stopHarnessPolling, applyHarnessManifest, pollHarnessManifest, startHarnessPolling, getEventsEndpoint, mintBucketingHandoverPayload, verifyBucketingHandoverToken, clearScheduledAnalyticsStart, normalizeDataLayerTriggers, applyDataLayerMappings, readNumericPath, readStringPath, RESERVED_DATA_LAYER_REVENUE_KEYS, PendingDataLayerEvent, MAX_PENDING_DATA_LAYER_EVENTS, pendingDataLayerEvents, processedDataLayerEntries, isDataLayerEntryObject, markDataLayerEntryProcessed, trackDataLayerRevenue, trackDataLayerEvent, enqueuePendingDataLayerEvent, drainPendingDataLayerEvents, finishInitializingAssignments, handleDataLayerEvent, recordObserverError } from \"./config-runtime\";\nimport { PersistedAssignmentMap, GLOBAL_PAGE_PREFIX, appliedAssignmentsByKey, ArtifactId, invalidatedArtifactIds, artifactEpochs, applyPassEpoch, artifactEpochCurrent, PageActivationTransition, normalizePageDeactivationMode, effectiveDeactivationMode, includedPageRules, currentPageMatchContext, pageActivationDiagnosticRows, reconcilePageActivation, cancelPageRulePoll, cancelAllPageRulePolls, pageRulePollSettings, deactivationModeForTriggeredRule, reconcileTriggeredPageMatch, startPageRulePoll, firePageDetector, activePageIds, experimentHasActivePage, syncAssignmentPageActive, assignmentPageIds, stableArtifactJson, artifactContentHash, baseArtifactApplicationKey, artifactApplicationKey, artifactIdFromApplicationKey, assignmentRuntimeKeys, artifactOwnerId, redirectCarryAssignmentKey, shouldPreserveOffTargetRedirectAssignment, isAssignmentArtifactInactive, renderable, exposable, attributable, recordAttributableAssignments, artifactRenderableAssignments, activeRenderableAssignments, chargeAffectingAssignments, loadPersistedAssignments, buildPersistedAssignmentResult, withAssignmentEpochData, usesStickyAssignmentPersistence, persistActiveExperimentAssignments, experimentDiagnostic, evaluateExperimentDetailed, evaluateExperiment, stoppedPersonalizationDiagnostic, enforcePersonalizationStopAfterMatch, excludedByGroupDiagnostic, keptByGroupDiagnostic, applyExclusionAndPersonalization, evaluate, evaluateWithDiagnostics, evaluateEdgeRuntimeAssignments, resolveCombinedEdgeEvaluation, escapeDeliveryRegex, matchSimpleDeliveryPattern, matchRegexDeliveryPattern, matchesDeliveryUrlRules, expandCriticalMutation, buildCriticalPathAssignments, runPostRevealReassert, schedulePostRevealReassert, revealExperimentContent, applyAssignmentCode, recordAppliedAssignment, appliedOwnerKeysForAssignment, applyAssignments, reassertAssignmentMutations, TeardownPage, TeardownRuntimeOptions, TeardownSelection, runAssignmentResetJs, pendingCommercePriceResolve, resolveCommercePricePending, unwireGoals, goalWiringEligible, reconcileGoals, reconcileHarnessPolling, reconcileCommercePrice, reconcileCommerceShipping, reconcileCartSync, syncGlobalRuntimes, configuredPageDeactivationModes, allAppliedPagesWithModes, rollbackArtifactOwner, unregisterArtifactOwner, executeTeardownTransaction, teardownTransaction, teardownArtifactsTransaction, DesiredArtifact, LiveArtifact, ArtifactReconcileResult, desiredArtifactSet, liveArtifactInventory, removeArtifactOwner, registerDesiredOwners, replayDesiredArtifacts, invalidateLiveArtifactsForReplay, reconcileArtifacts } from \"./assignment-runtime\";\nimport { generateQaSessionId, SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS, shopifyAssignmentSyncTimers, CommerceOnlyAdoptionState, commercePriceAdoptionState, ensureCommercePriceAdoptionState, currentCommercePriceContext, withCommercePriceAssignments, clearShopifyAssignmentSyncTimers, adoptAuthoritativePriceAssignments, OffersAdoptionPlan, planAuthoritativeOffersAdoption, canAdoptAuthoritativeOffersAssignments, adoptAuthoritativeOffersAssignments, sdkCartMintAllowed, buildSdkCartMintInput, buildScopedCartAttributeSyncInput, buildActiveCartAttributeSyncInput, sdkCartMintSync, syncSdkCartMint, removeSdkCartMintTrigger, onSdkCartMintClick, installSdkCartMintTrigger, HeadlessCartAuthorizationState, headlessCartAuthorizationState, ensureHeadlessCartAuthorizationState, hasChargeAffectingCommerceAssignment, hasActiveAuthorizationPlane, hasActivePriceAuthorizationPlane, hasActiveShippingAuthorizationPlane, hasActiveOffersAuthorizationPlane, hasActiveCommerceAuthorizationPlane, requiresCommerceCohortPin, getChargeAffectingCommerceExperimentIds, isCohortStampedOnCart, syncActiveAssignmentToShopifyCart, configureChargeCorrectnessCartSync, holdoutConfigEpoch, publishAssignmentsToShopify, scheduleShopifyAssignmentSync, variationsAllowed, updateProjectActivationDiagnostics, trackingAllowed, experimentById, targetingLifecycleMode, preservePersistentAssignments, stopAnalyticsStage, canMintVerifiedRedirectCarry, planRedirectAssignment, navigateForRedirectAssignment, RECONCILE_MAX_DRAINS, reevaluateAssignments, reevaluateAssignmentsPass, reapplyQaAssistantForceMap, reconcileForcedUnavailable, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, clearQaForceFromCurrentUrl, initWithExperiments } from \"./activation-runtime\";\nimport { loadQaToolbar, loadQaAssistant, loadDevtoolsIfEnabled, loadDevtools, init, trackEvent, track, funnelStepStorageKey, shouldTrackFunnelStep, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, RevenueEventData, normalizeRevenueCurrency, trackRevenue, flush, getAssignments, buildCurrentCartAttributes, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, normalizedHeadlessCartToken, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getGoals, getActiveExperimentIds, getRuntimeValue, getRuntimeTools, buildFlagContext, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics, QueueCommand, processCommand, processQueue, installedGlobalApi, createGlobalApi, installGlobalApi } from \"./public-api\";\n\n\nexport function scheduleDeferredRouteReevaluation(): void {\n if (state.deferredRouteReevaluationTimer !== null) return;\n state.deferredRouteReevaluationTimer = window.setTimeout(() => {\n state.deferredRouteReevaluationTimer = null;\n try {\n reevaluateAssignments(\"dom\", false, false, {\n triggeredPageIds: new Set(),\n includeImmediate: true,\n });\n } catch (error) {\n recordObserverError(\"route\", error);\n }\n }, 0);\n}\n\nexport function installDataLayerTriggers(config: InitConfig): (() => void) | null {\n const triggers = normalizeDataLayerTriggers(config);\n if (!triggers.length || typeof window === \"undefined\") return null;\n\n const byLayer = new Map<string, DataLayerTriggerSettings[]>();\n for (const trigger of triggers) {\n const layerName = trigger.dataLayerName || \"dataLayer\";\n byLayer.set(layerName, [...(byLayer.get(layerName) ?? []), trigger]);\n }\n\n const cleanups: Array<() => void> = [];\n for (const [layerName, layerTriggers] of byLayer.entries()) {\n const w = window as unknown as Record<string, any>;\n const layer = Array.isArray(w[layerName]) ? w[layerName] : [];\n w[layerName] = layer;\n const originalPush = layer.push;\n let active = true;\n const process = (item: unknown) => {\n if (!active) return;\n if (isDataLayerEntryObject(item) && processedDataLayerEntries.has(item)) return;\n const payload = normalizeDataLayerEntry(item);\n if (!payload) {\n markDataLayerEntryProcessed(item);\n return;\n }\n const eventName = typeof payload.event === \"string\" ? payload.event : \"\";\n let matched = false;\n for (const trigger of layerTriggers) {\n if (eventName === trigger.eventName) {\n matched = true;\n handleDataLayerEvent(trigger, payload, layerName, item, payload !== item);\n }\n }\n if (!matched) markDataLayerEntryProcessed(item);\n };\n\n const safelyProcess = (item: unknown) => {\n try {\n process(item);\n } catch (error) {\n recordObserverError(\"data_layer\", error);\n }\n };\n layer.slice(Math.max(0, layer.length - 50)).forEach(safelyProcess);\n const wrappedPush = function (...items: unknown[]) {\n const result = originalPush.apply(layer, items);\n items.forEach(safelyProcess);\n return result;\n };\n layer.push = wrappedPush as typeof layer.push;\n cleanups.push(() => {\n active = false;\n if (layer.push === wrappedPush) layer.push = originalPush;\n });\n }\n\n return () => cleanups.forEach((cleanup) => cleanup());\n}\n\nexport function experimentsUseSurfaceSignals(experiments: Experiment[]): boolean {\n return experiments.some((experiment) => {\n try {\n return JSON.stringify(experiment.targeting ?? {}).includes(CART_DRAWER_OPEN_SIGNAL);\n } catch {\n return false;\n }\n });\n}\n\nexport function rememberExposureDestination(result: ExposureDestinationDiagnostic): void {\n state.exposureDestinationDiagnostics = [result, ...state.exposureDestinationDiagnostics].slice(0, 20);\n}\n\nexport let clarityUpgradeSent = false;\n\nexport function clarityTagKey(prefix: string, name: string): string {\n const key = `${prefix}${name}`\n .replace(/[^A-Za-z0-9 _-]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 80);\n return key || \"apex experiment\";\n}\n\nexport function pushExposureToQueue(destination: NonNullable<ExposureDestinationsSettings[\"queues\"]>[number], payload: Record<string, unknown>): void {\n const queue = readWindowPath(destination.globalName) as any;\n if (!queue) throw new Error(\"queue_missing\");\n const eventName = destination.eventName || \"Viewed an experiment\";\n if (Array.isArray(queue)) {\n queue.push(destination.method\n ? { method: destination.method, event_name: eventName, event_attributes: payload }\n : { event: eventName, ...payload });\n return;\n }\n if (typeof queue.push === \"function\") {\n queue.push(destination.method\n ? { method: destination.method, event_name: eventName, event_attributes: payload }\n : { event: eventName, ...payload });\n return;\n }\n throw new Error(\"queue_push_missing\");\n}\n\nexport function emitExposureDestinations(assignment: Assignment, config: InitConfig): void {\n const destinations = config.exposureDestinations;\n if (!destinations) return;\n const payload = {\n project_id: config.shopId ?? \"\",\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n experiment_name: assignment.experimentName ?? assignment.experimentId,\n variation_index: assignment.index,\n variation_name: assignment.variationId,\n is_control: assignment.isControl,\n };\n const at = Date.now();\n\n if (destinations.dataLayer?.enabled) {\n try {\n const dataLayerName = destinations.dataLayer.dataLayerName || \"dataLayer\";\n const w = window as unknown as Record<string, any>;\n const layer = Array.isArray(w[dataLayerName]) ? w[dataLayerName] : [];\n w[dataLayerName] = layer;\n layer.push({\n event: destinations.dataLayer.eventName || \"apex_experiment_viewed\",\n ...(destinations.dataLayer.includeMetadata === false ? {\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n } : payload),\n });\n rememberExposureDestination({ type: \"dataLayer\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"dataLayer\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.hotjar?.enabled) {\n try {\n const hj = (window as any).hj;\n if (typeof hj !== \"function\") throw new Error(\"hotjar_missing\");\n if (destinations.hotjar.mode === \"event\") {\n hj(\"event\", destinations.hotjar.eventName || \"apex_experiment_viewed\");\n } else {\n hj(\"identify\", null, { apex_ab_test: `${assignment.experimentId}-${assignment.variationId}` });\n }\n rememberExposureDestination({ type: \"hotjar\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"hotjar\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.clarity?.enabled) {\n try {\n const clarityFn = (window as any).clarity;\n if (typeof clarityFn !== \"function\") throw new Error(\"clarity_missing\");\n const mode = destinations.clarity.mode === \"event\" || destinations.clarity.mode === \"both\"\n ? destinations.clarity.mode\n : \"set\";\n if (mode === \"set\" || mode === \"both\") {\n const key = clarityTagKey(\n destinations.clarity.tagPrefix ?? \"apex \",\n assignment.experimentName ?? assignment.experimentId,\n );\n const value = assignment.isControl ? \"control\" : `variant-${assignment.index}`;\n clarityFn(\"set\", key, value);\n }\n if (mode === \"event\" || mode === \"both\") {\n clarityFn(\"event\", destinations.clarity.eventName || \"apex_experiment_viewed\");\n }\n if (destinations.clarity.upgrade && !clarityUpgradeSent) {\n try {\n clarityFn(\"upgrade\", \"apex_experiment\");\n clarityUpgradeSent = true;\n } catch {\n // Leave clarityUpgradeSent false so the upgrade retries on the next exposure.\n }\n }\n rememberExposureDestination({ type: \"clarity\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"clarity\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.contentsquare?.enabled) {\n try {\n const w = window as any;\n const uxa = (w._uxa = Array.isArray(w._uxa) || (w._uxa && typeof w._uxa.push === \"function\") ? w._uxa : []);\n const key = clarityTagKey(\n destinations.contentsquare.keyPrefix ?? \"apex \",\n assignment.experimentName ?? assignment.experimentId,\n ).slice(0, 50);\n uxa.push([\n \"trackDynamicVariable\",\n {\n key,\n value: assignment.isControl ? \"control\" : `variant-${assignment.index}`,\n },\n ]);\n rememberExposureDestination({ type: \"contentsquare\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"contentsquare\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.posthog?.enabled) {\n try {\n const posthog = (window as any).posthog;\n if (!posthog || (typeof posthog !== \"object\" && typeof posthog !== \"function\") || typeof posthog.capture !== \"function\") {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: \"posthog_missing\" });\n } else {\n const mode = destinations.posthog.mode === \"capture\" || destinations.posthog.mode === \"register\"\n ? destinations.posthog.mode\n : \"both\";\n if (mode === \"capture\" || mode === \"both\") {\n posthog.capture(destinations.posthog.eventName || \"apex_experiment_viewed\", payload);\n }\n if (mode === \"register\" || mode === \"both\") {\n if (typeof posthog.register !== \"function\") {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: \"posthog_register_missing\" });\n } else {\n posthog.register({ [`apex_exp_${assignment.experimentId}`]: assignment.variationId });\n rememberExposureDestination({ type: \"posthog\", status: \"sent\", at });\n }\n } else {\n rememberExposureDestination({ type: \"posthog\", status: \"sent\", at });\n }\n }\n } catch (error) {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n for (const queue of destinations.queues ?? []) {\n if (queue.enabled === false) continue;\n try {\n pushExposureToQueue(queue, payload);\n rememberExposureDestination({ type: `queue:${queue.globalName}`, status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({\n type: `queue:${queue.globalName}`,\n status: \"failed\",\n at,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nexport function ensureTrackerStarted(config: InitConfig): void {\n if (state.tracker) return;\n if (state.screenshotMode) return;\n if (state.trackingDisabledByDnt) return;\n const eventsEndpoint = getEventsEndpoint(config);\n if (!eventsEndpoint) return;\n\n state.tracker = new Tracker({\n endpoint: eventsEndpoint,\n proxyEventDelivery: config.proxyEventDelivery,\n assetFallback: config.assetFallback,\n shopId: config.shopId,\n ingestShopId: config.ingestShopId ?? config.shopId,\n ingestSignature: config.ingestSignature,\n visitorId: state.userId ?? undefined,\n getActiveAssignment: () => {\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n return a ? { experimentId: a.experimentId, variationId: a.variationId } : null;\n },\n buildPageExitEvents: buildPageExitEvents,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n environment: config.environments?.activeKey || \"production\",\n cohort: config.holdout_v1_enabled === true ? (state.holdout ? \"holdout\" : \"active\") : undefined,\n holdoutConfigEpoch: holdoutConfigEpoch(config),\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"tracker\", \"Tracker started\", { endpoint: eventsEndpoint, qaMode: state.qaMode });\n state.tracker.start();\n}\n\nexport function exposureAssignmentKey(assignment: Assignment): string {\n const entityId = assignment.kind === \"personalization\" && assignment.personalization\n ? assignment.personalization.id\n : assignment.experimentId;\n return `${entityId}:${assignment.variationId}:${assignment.assignmentEpoch ?? \"\"}`;\n}\n\nexport function priceAssignmentAuthorizationKey(assignment: {\n experimentId: string;\n variationId: string;\n assignmentEpoch?: number;\n}): string {\n return `${assignment.experimentId}:${assignment.variationId}:${assignment.assignmentEpoch ?? \"\"}`;\n}\n\nexport function isPriceDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.price?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n // Inside a mixed experiment, a variation without any charged adjustment is\n // display-only: it needs no cart proof even though its experiment is on\n // the authorization plane.\n const adjustments = state.config?.commerce?.price?.experiments\n .find((experiment) => experiment.experiment_id === assignment.experimentId)\n ?.variants[assignment.variationId];\n if (\n adjustments &&\n !adjustments.some((adjustment) => typeof adjustment.fixedPricePerUnit === \"string\")\n ) return true;\n return state.authorizedPriceAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nexport function isShippingDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.shipping?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n return state.authorizedShippingAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nexport function isOffersDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.offers?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n return state.authorizedOffersAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nexport function giftSyncOptions(extra?: Partial<GiftSyncOptions>): GiftSyncOptions {\n return {\n // Proof comes from the CURRENT stamped offers plane, not config: a\n // shared price+offers assignment whose offers proof was refused must\n // not insert (or keep) a gift the Function will not discount.\n isArmProven: (assignment) =>\n state.authorizedOffersAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true,\n ...extra,\n };\n}\n\nexport /** Every artifact applyAssignments/applyAssignmentCode can render. */\nfunction assignmentHasRenderableArtifacts(assignment: Assignment): boolean {\n return !isAssignmentArtifactInactive(assignment) && !!(\n assignment.mutations.length ||\n assignment.css ||\n assignment.js ||\n assignment.experimentCss ||\n assignment.experimentJs ||\n assignment.externalCssUrl ||\n assignment.externalJsUrl\n );\n}\n\nexport /** Install offers display keys and render any DOM they just unlocked. */\nfunction authorizeOffersDisplayAndRender(\n authorizedAssignments: CartAssignment[],\n): void {\n const previous = state.authorizedOffersAssignmentKeys;\n const next = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n state.authorizedOffersAssignmentKeys = next;\n // Re-apply only when authorization just unlocked withheld DOM for an\n // offers-enforced assignment; the identity guard breaks the\n // apply -> sync -> already-stamped -> authorize loop.\n const offersEnforcedIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const newlyRenderable = state.assignments.some((assignment) =>\n offersEnforcedIds.has(assignment.experimentId) &&\n next.has(priceAssignmentAuthorizationKey(assignment)) &&\n !previous?.has(priceAssignmentAuthorizationKey(assignment)) &&\n assignmentHasRenderableArtifacts(assignment));\n if (newlyRenderable) {\n // Full reapply behind the established cleanup (the adoption pattern):\n // without it, parallel already-rendered assignments would duplicate\n // structural insert mutations and re-run custom JS un-reset.\n teardownTransaction(allAppliedPagesWithModes(), { skipCartSync: true });\n applyAssignments(state.assignments, state.activationMode);\n }\n}\n\nexport /** Revoke the previous cart's offer grant and restore un-authorized DOM. */\nfunction revokeOffersDisplayAuthorization(): void {\n const previous = state.authorizedOffersAssignmentKeys;\n if (!previous || previous.size === 0) return;\n const offersEnforcedIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const hadRenderable = state.assignments.some((assignment) =>\n offersEnforcedIds.has(assignment.experimentId) &&\n previous.has(priceAssignmentAuthorizationKey(assignment)) &&\n assignmentHasRenderableArtifacts(assignment));\n state.authorizedOffersAssignmentKeys = new Set();\n if (hadRenderable) {\n // The new cart holds no stamp for these arms; retire their treatment\n // (cleanup + withheld reapply) until its authorization is confirmed.\n teardownTransaction(allAppliedPagesWithModes(), { skipCartSync: true });\n applyAssignments(state.assignments, state.activationMode);\n }\n}\n\nexport function exposureEligibleAssignments(config: InitConfig): Assignment[] {\n return state.assignments\n .filter(exposable)\n .filter(\n (assignment) =>\n assignment.isControl ||\n (isPriceDisplayAssignmentAuthorized(assignment) &&\n isCommercePriceExposureEligible(config.commerce?.price, assignment)),\n )\n .filter(\n (assignment) =>\n isShippingDisplayAssignmentAuthorized(assignment) &&\n isShippingExposureCartEligible(config, assignment),\n )\n .filter(isOffersDisplayAssignmentAuthorized);\n}\n\nexport function isShippingExposureCartEligible(\n config: InitConfig,\n assignment: Assignment,\n): boolean {\n const experiment = config.commerce?.shipping?.experiments.find(\n (candidate) => candidate.experiment_id === assignment.experimentId,\n );\n if (!experiment) return true;\n const exposure = classifyShippingExposure(\n experiment.variants,\n Boolean(assignment.isControl),\n experiment.variants[assignment.variationId],\n );\n return (!exposure.needsTargetProof && !exposure.isCurrencyBound)\n || isShippingCartEligibilityConfirmed(assignment.experimentId);\n}\n\nexport function trackViewedAssignmentsAfterShippingEligibility(): void {\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n}\n\nsetCommercePriceExposureListener(\n trackViewedAssignmentsAfterShippingEligibility,\n);\n\nexport const EMPTY_TARGETING_ATTRIBUTES: Record<string, unknown> = {};\n\nexport type TargetingEvaluationPass = {\n attributes?: Record<string, unknown>;\n persistSignals: boolean;\n sourceAttributes: Record<string, unknown>;\n url: string;\n};\n\nexport let activeTargetingEvaluationPass: TargetingEvaluationPass | undefined;\n\nexport function createTargetingEvaluationPass(\n sourceAttributes: Record<string, unknown>,\n url: string,\n persistSignals: boolean,\n): TargetingEvaluationPass {\n return { persistSignals, sourceAttributes, url };\n}\n\nexport function targetingAttributesForPass(\n pass: TargetingEvaluationPass | undefined,\n sourceAttributes: Record<string, unknown>,\n url: string,\n persistSignals: boolean,\n): Record<string, unknown> {\n if (\n pass &&\n pass.url === url &&\n pass.sourceAttributes === sourceAttributes\n ) {\n return pass.attributes ??= buildTargetingAttributes(sourceAttributes, url, {\n persistSignals,\n });\n }\n return buildTargetingAttributes(sourceAttributes, url, { persistSignals });\n}\n\nexport function trackViewedAssignments(\n config: InitConfig,\n onlyAssignments?: Assignment[],\n targetingPass?: TargetingEvaluationPass,\n): void {\n if (config.autoTrack === false) return;\n const eligibleAssignments = exposureEligibleAssignments(config);\n const assignments = onlyAssignments\n ? eligibleAssignments.filter((candidate) => onlyAssignments.some((assignment) =>\n assignment.experimentId === candidate.experimentId && assignment.variationId === candidate.variationId))\n : eligibleAssignments;\n if (assignments.length === 0) return;\n const url = config.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n const sourceAttributes = config.attributes ?? EMPTY_TARGETING_ATTRIBUTES;\n const persistSignals = persistentStorageAllowed();\n const attributes = targetingAttributesForPass(\n targetingPass,\n sourceAttributes,\n url,\n persistSignals,\n );\n const exposureSignals = buildExposureSignalContext({\n attributes,\n customSignals: config.signals,\n });\n assignments.forEach((a) => {\n const exposureKey = exposureAssignmentKey(a);\n if (state.exposedAssignmentKeys.has(exposureKey)) return;\n state.exposedAssignmentKeys.add(exposureKey);\n if (a.kind === \"personalization\" && a.personalization) {\n track(\n \"personalization_rendered\",\n {\n index: a.index,\n ...(exposureSignals ? { signals: exposureSignals } : {}),\n entity_kind: \"personalization\",\n personalization_id: a.personalization.id,\n personalization_key: a.personalization.key,\n personalization_rule_id: a.personalization.ruleId,\n personalization_experience_id: a.personalization.experienceId,\n personalization_surface: a.personalization.surface,\n personalization_template_key: a.personalization.templateKey,\n },\n a.experimentId,\n a.variationId,\n );\n } else {\n track(\n \"experiment_viewed\",\n {\n index: a.index,\n ...(exposureSignals ? { signals: exposureSignals } : {}),\n },\n a.experimentId,\n a.variationId,\n );\n }\n emitExposureDestinations(a, config);\n rememberOrderExposure(a);\n config.onExperimentViewed?.(a);\n });\n}\n\nexport function sameStringSet(left: ReadonlySet<string>, right: ReadonlySet<string>): boolean {\n if (left.size !== right.size) return false;\n for (const value of left) {\n if (!right.has(value)) return false;\n }\n return true;\n}\n\nexport function setupGoalTracking(\n experiments: Experiment[],\n url = state.wiredGoalUrl ?? state.config?.url ??\n (typeof location !== \"undefined\" ? location.href : \"https://_\"),\n activePageIdsForGoals = activePageIds(),\n): void {\n // Goals listen on the assigned plane. Their own Page scope decides where\n // they convert; exposure and commerce remain gated by the render plane.\n const assignments = state.assignments.filter(attributable);\n state.wiredGoalKeys = goalWiringKeys(\n assignments,\n experiments,\n activePageIdsForGoals,\n );\n state.wiredGoalUrl = url;\n cleanupGoals();\n setupGoals(assignments, experiments, (goalId, assignment, data) => {\n const originalTimestamp = typeof data?.early_interaction_timestamp === \"number\"\n ? data.early_interaction_timestamp\n : undefined;\n const eventData: Record<string, unknown> = { goalId, ...data };\n delete eventData.early_interaction_timestamp;\n trackEvent(\"goal\", eventData, assignment.experimentId, assignment.variationId, undefined, false, originalTimestamp);\n }, activePageIdsForGoals);\n drainBootstrapEarlyInteractions({\n // Bootstrap interactions were captured before mutation delivery could\n // resolve. Keep them available to the assignment that existed at click\n // time; triggerGoal applies the normal count-once and goal validation.\n assignments: state.assignments.filter((assignment) => {\n const key = exposureAssignmentKey(assignment);\n return assignment.experimentId.length > 0 && assignment.variationId.length > 0 &&\n !state.contaminatedAssignmentKeys.has(key);\n }),\n experiments,\n activePageIds: activePageIdsForGoals,\n requireConsent: state.config?.requireConsent,\n consentModeEnabled: state.config?.consentMode?.enabled,\n consentProvider: state.config?.consentMode?.provider,\n consentRequiredGroup: state.config?.consentMode?.requiredGroup,\n consentGetter: state.config?.consentMode?.getter,\n respectDoNotTrack: state.config?.dataProtection?.respectDoNotTrack,\n consume: (goalId, assignment, timestamp, kind, pageUrl) => triggerGoal(\n goalId,\n [assignment],\n experiments,\n { early_interaction: true, early_page_url: pageUrl, early_interaction_kind: kind, early_interaction_timestamp: timestamp },\n ),\n });\n if (state.tracker && state.config) {\n drainEarlyInteractions({\n configRevision: state.config.delivery?.revision,\n sessionId: state.tracker.getSessionId(),\n storageMode: state.config.dataProtection?.storageMode,\n experiments,\n requireConsent: state.config.requireConsent,\n consentModeEnabled: state.config.consentMode?.enabled,\n consentProvider: state.config.consentMode?.provider,\n consentRequiredGroup: state.config.consentMode?.requiredGroup,\n consentGetter: state.config.consentMode?.getter,\n respectDoNotTrack: state.config.dataProtection?.respectDoNotTrack,\n forcedExperimentIds: Object.keys(state.forceMap ?? {}),\n consume: (entry) => {\n // The origin stamp is authoritative across navigation, but still route\n // through the normal goal implementation for count-once and callbacks.\n triggerGoal(\n entry.goalId,\n [{ experimentId: entry.experimentId, variationId: entry.variationId } as Assignment],\n experiments,\n { ...entry.data, early_page_url: entry.pageUrl, early_interaction_kind: entry.kind },\n );\n },\n });\n }\n}\n\nexport function setupHeatmapTracking(assignments: Assignment[], experiments: Experiment[]): void {\n if (!FEATURE_HEATMAP) return;\n if (!state.tracker || trackingBlocked()) return;\n if (state.heatmapController) {\n state.heatmapController.update(assignments, experiments);\n return;\n }\n import(\"./heatmap\").then(({ startHeatmapCapture }) => {\n if (!state.tracker || trackingBlocked() || state.heatmapController) return;\n state.heatmapController = startHeatmapCapture(assignments, experiments, track);\n }).catch(() => {});\n}\n\nexport function cleanupHeatmapTracking(): void {\n if (!state.heatmapController) return;\n state.heatmapController.stop();\n state.heatmapController = null;\n}\n\nexport function setupReplayTracking(assignments: Assignment[], experiments: Experiment[]): void {\n if (!FEATURE_REPLAY) return;\n if (!state.tracker || !state.config || trackingBlocked()) {\n cleanupReplayTracking();\n return;\n }\n if (state.replayController?.isStopped()) {\n state.replayController = null;\n }\n if (state.replayController) {\n state.replayController.update(assignments, experiments);\n return;\n }\n if (state.replayStartPromise) return;\n\n const generation = state.replayGeneration;\n const config = state.config;\n const tracker = state.tracker;\n const replayBlocked = () =>\n trackingBlocked()\n || generation !== state.replayGeneration\n || state.tracker !== tracker;\n const recorderUrl = resolveReplayRecorderUrl({\n configuredUrl: config.replayRecorderUrl,\n scriptSrc: SDK_SCRIPT_SRC,\n pageUrl: typeof location !== \"undefined\" ? location.href : undefined,\n });\n if (!config.endpoint || !recorderUrl) return;\n let startPromise: Promise<void>;\n startPromise = startReplayCapture({\n assignments: state.assignments,\n experiments: config.experiments ?? [],\n recorderUrl,\n endpoint: config.endpoint,\n shopId: config.ingestShopId ?? config.shopId ?? \"\",\n visitorId: state.userId ?? \"\",\n sessionId: tracker.getSessionId(),\n environment: config.environments?.activeKey || \"production\",\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n sdkVersion: config.sdkVersion || \"unknown\",\n ingestSignature: config.ingestSignature,\n isTrackingBlocked: replayBlocked,\n })\n .then((controller) => {\n if (!controller) return;\n if (replayBlocked()) {\n controller.stop(true);\n return;\n }\n controller.update(state.assignments, state.config?.experiments ?? []);\n state.replayController = controller;\n })\n .catch(() => {})\n .finally(() => {\n if (state.replayStartPromise === startPromise) state.replayStartPromise = null;\n if (\n generation !== state.replayGeneration\n && state.tracker\n && state.config\n && !trackingBlocked()\n ) {\n setupReplayTracking(state.assignments, state.config.experiments ?? []);\n }\n });\n state.replayStartPromise = startPromise;\n}\n\nexport function cleanupReplayTracking(): void {\n state.replayGeneration += 1;\n state.replayController?.stop(true);\n state.replayController = null;\n}\n\nexport function setupSemanticTracking(config: InitConfig): void {\n if (!state.tracker || trackingBlocked()) return;\n if (state.semanticController) return;\n import(\"./semantic\").then(({ startSemanticCapture }) => {\n if (!state.tracker || trackingBlocked() || state.semanticController) return;\n state.semanticController = startSemanticCapture(config.semanticTracking, track);\n }).catch(() => {});\n}\n\nexport function cleanupSemanticTracking(): void {\n if (!state.semanticController) return;\n state.semanticController.stop();\n state.semanticController = null;\n}\n\nexport function buildExperimentBehaviorEvents(\n type: \"experiment_pageview\" | \"experiment_page_exit\",\n data?: Record<string, unknown>,\n): TrackEvent[] {\n return state.assignments.filter(exposable).map((assignment) => ({\n type,\n data: withAssignmentEpochData(data, assignment.experimentId, assignment.variationId),\n url: cleanUrl(),\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n }));\n}\n\nexport function buildPageExitEvents(type: string, data?: Record<string, unknown>): TrackEvent[] {\n const a = state.assignments.find(exposable) ?? null;\n return [\n {\n type,\n data: withAssignmentEpochData(data, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n },\n ...buildExperimentBehaviorEvents(\"experiment_page_exit\", data),\n ];\n}\n\nexport /** Track analytics events with legacy global events plus per-assignment behavior events. */\nfunction analyticsTrack(type: string, data?: Record<string, unknown>): void {\n if (trackingBlocked()) return;\n if (!state.tracker) return;\n // Attach identity only when an assignment is exposable. The shop-level\n // event stays unassigned while all held assignments remain ineligible.\n const a = state.assignments.find(exposable) ?? null;\n const event: TrackEvent = {\n type,\n data: withAssignmentEpochData(data, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n };\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", type, {\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n ...data,\n });\n state.tracker.track(event);\n if (type === \"pageview\") {\n if (state.config) scheduleOrderIdentityBeacon(state.config);\n for (const behaviorEvent of buildExperimentBehaviorEvents(\"experiment_pageview\", data)) {\n state.tracker.track(behaviorEvent);\n }\n } else if (type === \"page_exit\") {\n for (const behaviorEvent of buildExperimentBehaviorEvents(\"experiment_page_exit\", data)) {\n state.tracker.track(behaviorEvent);\n }\n }\n}\n\nexport function syncLoadDiagnosticsToPerf(): void {\n if (typeof window === \"undefined\") return;\n const perfWindow = window as DripPerfWindow;\n const perf = perfWindow.__dripPerf = perfWindow.__dripPerf ?? {};\n perf.load_stage = state.load.stage;\n perf.config_fetch_status = state.load.configFetchStatus;\n if (state.load.configFetchAttempts !== undefined) perf.config_fetch_attempts = state.load.configFetchAttempts;\n if (state.load.configFetchMs !== undefined) perf.config_fetch_ms = state.load.configFetchMs;\n if (state.load.assignmentReadyMs !== undefined) perf.assignment_ready_ms = state.load.assignmentReadyMs;\n if (state.load.pendingMutations !== undefined) perf.pending_mutations = state.load.pendingMutations;\n if (state.load.appliedMutations !== undefined) perf.applied_mutations = state.load.appliedMutations;\n if (state.load.missedMutations !== undefined) perf.missed_mutations = state.load.missedMutations;\n}\n\nexport function updateLoadDiagnostics(patch: Partial<RuntimeLoadDiagnostic> & { stage: string }): void {\n state.load = {\n ...state.load,\n ...patch,\n updatedAt: Date.now(),\n };\n syncLoadDiagnosticsToPerf();\n try {\n document.dispatchEvent(new CustomEvent(\"drip_runtime_status\", { detail: { ...state.load } }));\n } catch {\n // ignore event dispatch failures\n }\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"trace\", `Runtime status: ${patch.stage}`, patch as Record<string, unknown>);\n}\n\nexport function resetLoadDiagnostics(stage = \"boot\"): void {\n const now = Date.now();\n state.load = {\n stage,\n startedAt: now,\n updatedAt: now,\n configFetchStatus: \"idle\",\n configFetchAttempts: 0,\n appliedMutations: 0,\n missedMutations: 0,\n };\n syncLoadDiagnosticsToPerf();\n}\n\nexport function queuePerfEvent(data: PendingPerfEvent): void {\n if (trackingBlocked()) return;\n state.pendingPerf = {\n ...data,\n config_fetch_ms: state.load.configFetchMs,\n config_fetch_attempts: state.load.configFetchAttempts,\n config_fetch_status: state.load.configFetchStatus,\n config_fetch_status_code: state.load.configFetchStatusCode,\n mutation_apply_pending: state.load.pendingMutations,\n mutation_apply_applied: state.load.appliedMutations,\n mutation_apply_missed: state.load.missedMutations,\n };\n}\n\nexport type RuntimeInstallClaim = {\n installSurface: string;\n sdkVersion: string;\n runtimeProfile: string;\n};\n\nexport const RUNTIME_INSTALL_CLAIM_KEY = \"__dripRuntimeInstallClaim\";\nexport const RUNTIME_INSTALL_CONFLICT_KEY = \"__dripRuntimeInstallConflictEmitted\";\n\nexport function telemetryLabel(value: unknown, fallback = \"unknown\"): string {\n if (typeof value !== \"string\") return fallback;\n const cleaned = value.trim().slice(0, 120);\n return cleaned || fallback;\n}\n\nexport function readRuntimeInstallClaim(): RuntimeInstallClaim | null {\n const value = (globalThis as Record<string, unknown>)[RUNTIME_INSTALL_CLAIM_KEY];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n return {\n installSurface: telemetryLabel(record.installSurface, \"direct_script\"),\n sdkVersion: telemetryLabel(record.sdkVersion),\n runtimeProfile: telemetryLabel(record.runtimeProfile, \"full\"),\n };\n}\n\nexport function rememberRuntimeInstallClaim(config: InitConfig): RuntimeInstallClaim {\n const claim = {\n installSurface: telemetryLabel(config.installSurface, \"direct_script\"),\n sdkVersion: telemetryLabel(config.sdkVersion),\n runtimeProfile: telemetryLabel(config.runtimeProfile, \"full\"),\n };\n const runtimeGlobal = globalThis as Record<string, unknown>;\n runtimeGlobal[RUNTIME_INSTALL_CLAIM_KEY] = claim;\n delete runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY];\n return claim;\n}\n\nexport function claimInstallConflictEmission(): boolean {\n const runtimeGlobal = globalThis as Record<string, unknown>;\n if (runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY] === true) return false;\n runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY] = true;\n return true;\n}\n\nexport function sdkAttributionData(config: InitConfig): Record<string, unknown> {\n const firstInstall = readRuntimeInstallClaim();\n const snippetRevision = config.delivery?.revision;\n return {\n sdk_version: telemetryLabel(config.sdkVersion),\n sdk_delivery_mode: telemetryLabel(config.sdkDeliveryMode),\n sdk_delivery_source: telemetryLabel(config.sdkDeliverySource),\n sdk_policy_revision: telemetryLabel(config.sdkPolicyRevision),\n snippet_revision: typeof snippetRevision === \"number\" && Number.isFinite(snippetRevision)\n ? Math.max(0, Math.floor(snippetRevision))\n : undefined,\n runtime_profile: telemetryLabel(config.runtimeProfile, \"full\"),\n sdk_variant: telemetryLabel(config.runtimeFeatures?.sdkVariant, \"live\"),\n install_surface: telemetryLabel(config.installSurface, \"direct_script\"),\n first_install_surface: firstInstall?.installSurface ?? telemetryLabel(config.installSurface, \"direct_script\"),\n };\n}\n\nexport function sendRuntimeEventNow(\n config: InitConfig,\n type: string,\n data: Record<string, unknown>,\n userId?: string | null,\n): void {\n if (trackingBlocked()) return;\n if (state.screenshotMode) return;\n const hydratedConfig = state.config && state.config.shopId === config.shopId ? state.config : config;\n const endpoint = getEventsEndpoint(config);\n if (!endpoint || !config.shopId) return;\n try {\n const tracker = new Tracker({\n endpoint,\n proxyEventDelivery: hydratedConfig.proxyEventDelivery,\n assetFallback: hydratedConfig.assetFallback,\n shopId: config.shopId,\n ingestShopId: config.ingestShopId ?? config.shopId,\n ingestSignature: config.ingestSignature,\n visitorId: userId ?? undefined,\n flushIntervalMs: 60_000,\n maxBatchSize: 1,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n cohort: state.config?.holdout_v1_enabled === true ? (state.holdout ? \"holdout\" : \"active\") : undefined,\n holdoutConfigEpoch: holdoutConfigEpoch(state.config),\n environment: config.environments?.activeKey || \"production\",\n });\n tracker.track({\n type,\n data: { ...sdkAttributionData(config), ...data },\n url: cleanUrl(),\n });\n void tracker.flush().finally(() => tracker.stop());\n } catch {\n // best-effort runtime telemetry\n }\n}\n\nexport function sendRuntimePerfNow(\n config: InitConfig,\n data: Record<string, unknown>,\n userId?: string | null,\n): void {\n sendRuntimeEventNow(config, \"sdk_perf\", data, userId);\n}\n\nexport function readDripPerf(): Record<string, unknown> {\n return ((window as DripPerfWindow).__dripPerf ?? {}) as Record<string, unknown>;\n}\n\nexport function markDripPerf(name: string): number {\n const perfWindow = window as DripPerfWindow;\n const perf = perfWindow.__dripPerf = perfWindow.__dripPerf ?? {};\n const current = perf[name];\n if (typeof current === \"number\" && Number.isFinite(current)) return current;\n const now = Date.now();\n perf[name] = now;\n return now;\n}\n\nexport function numberPerf(perf: Record<string, unknown>, name: string): number | undefined {\n const value = perf[name];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function coexistencePerfFields(perf: Record<string, unknown>): Partial<PendingPerfEvent> {\n return {\n ...getCwvMetrics(),\n hydration_detected_at: numberPerf(perf, \"hydration_detected_at\"),\n apply_delayed_ms: numberPerf(perf, \"apply_delayed_ms\"),\n hydration_timeout: perf.hydration_timeout === true,\n hold_timeout: perf.hold_timeout === true,\n reapply_count: numberPerf(perf, \"reapply_count\") ?? 0,\n reassert_loop_detected: perf.reassert_loop_detected === true,\n early_apply_at: numberPerf(perf, \"early_apply_at\"),\n reasserts_count: numberPerf(perf, \"reasserts_count\") ?? 0,\n revert_loops_detected: numberPerf(perf, \"revert_loops_detected\") ?? 0,\n };\n}\n\nexport function buildPerfEvent(config: InitConfig, timing: {\n eventKind: \"init\" | \"route_change\";\n assignmentReadyMs: number;\n initTotalMs?: number;\n phases?: Partial<Record<InitPhaseKey, number>>;\n includesConfigFetch?: boolean;\n predecisionMismatches?: number;\n blankScreenMs: number;\n assignmentReadyAt?: number;\n}): PendingPerfEvent {\n const perf = readDripPerf();\n const assignmentReadyAt = timing.assignmentReadyAt ?? Date.now();\n const antiFlickerInsertedAt = numberPerf(perf, \"anti_flicker_inserted_at\");\n const revealAt = numberPerf(perf, \"reveal_at\");\n const phases = timing.phases ?? {};\n const measuredPhaseMs = Object.values(phases).reduce((total, value) => total + (value ?? 0), 0);\n const configFetchMs = timing.includesConfigFetch ? state.load.configFetchMs ?? 0 : 0;\n const unattributedInitMs = timing.initTotalMs === undefined\n ? undefined\n : boundedPerfDuration(timing.initTotalMs - measuredPhaseMs - configFetchMs);\n const mutationCount = state.assignments.reduce(\n (total, assignment) => total + assignment.mutations.length,\n 0,\n );\n const attribution = sdkAttributionData(config);\n const deliveryTiming = collectDeliveryTiming(numberPerf(readDripPerf(), \"sdk_init_start\"), SDK_SCRIPT_SRC);\n return {\n perf_event_kind: timing.eventKind,\n assignment_ready_ms: timing.assignmentReadyMs,\n init_total_ms: timing.initTotalMs,\n guard_resolve_ms: phases.guard_resolve_ms,\n consent_identity_ms: phases.consent_identity_ms,\n runtime_setup_ms: phases.runtime_setup_ms,\n targeting_assignment_ms: phases.targeting_assignment_ms,\n mutation_finalize_ms: phases.mutation_finalize_ms,\n predecision_mismatch_count: timing.predecisionMismatches ?? 0,\n unattributed_init_ms: unattributedInitMs,\n // domContentLoadedEventStart - navigationStart. This is page readiness,\n // not the Apex anti-flicker hold (hidden_duration_ms is that metric).\n dom_content_loaded_ms: timing.blankScreenMs,\n blank_screen_ms: timing.blankScreenMs,\n platform: state.platform,\n config_source: state.configSource,\n activation_mode: state.activationMode,\n sdk_version: String(attribution.sdk_version),\n sdk_delivery_mode: String(attribution.sdk_delivery_mode),\n sdk_delivery_source: String(attribution.sdk_delivery_source),\n sdk_policy_revision: String(attribution.sdk_policy_revision),\n snippet_revision: typeof attribution.snippet_revision === \"number\" ? attribution.snippet_revision : undefined,\n runtime_profile: String(attribution.runtime_profile),\n sdk_variant: String(attribution.sdk_variant),\n ...deliveryTiming,\n experiment_count: config.experiments?.length ?? 0,\n assignment_count: state.assignments.length,\n mutation_count: mutationCount,\n script_exec_start: numberPerf(perf, \"script_exec_start\"),\n anti_flicker_inserted_at: antiFlickerInsertedAt,\n assignment_ready_at: assignmentReadyAt,\n first_mutation_at: numberPerf(perf, \"first_mutation_at\"),\n reveal_at: revealAt,\n hidden_duration_ms: antiFlickerInsertedAt && revealAt ? Math.max(0, revealAt - antiFlickerInsertedAt) : undefined,\n current_page_hide_selector_count: numberPerf(perf, \"current_page_hide_selector_count\"),\n delivery_state: typeof config.deliveryState === \"string\" ? config.deliveryState : undefined,\n script_cache_source: typeof config.scriptCacheSource === \"string\" ? config.scriptCacheSource : undefined,\n install_surface: String(attribution.install_surface),\n first_install_surface: String(attribution.first_install_surface),\n ...coexistencePerfFields(perf),\n };\n}\n\nexport function flushPendingPerf(): void {\n if (!state.pendingPerf || !state.tracker) return;\n const pendingPerf = state.pendingPerf;\n state.pendingPerf = null;\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n const perf = readDripPerf();\n const event: TrackEvent = {\n type: \"sdk_perf\",\n data: withAssignmentEpochData({\n ...pendingPerf,\n ...coexistencePerfFields(perf),\n }, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n };\n state.tracker.track(event);\n const completion = waitForCwvMetrics();\n const experimentId = a?.experimentId;\n const variationId = a?.variationId;\n const url = cleanUrl();\n void completion.then((metrics) => {\n if (!metrics || state.screenshotMode || trackingBlocked() || !state.tracker) return;\n state.tracker.track({\n type: \"sdk_cwv\",\n data: withAssignmentEpochData({\n ...metrics,\n cwv_finalized: true,\n }, experimentId, variationId),\n url,\n experimentId,\n variationId,\n });\n });\n}\n\nexport function orderIdentityEndpoint(config: InitConfig): string | null {\n if (!config.endpoint) return null;\n return normalizeEndpoint(config.endpoint) + \"/v1/order-identity\";\n}\n\nexport const ORDER_EXPOSURE_STORAGE_KEY = \"drip_exposures\";\nexport const ORDER_EXPOSURE_MAX_ENTRIES = 50;\nexport const ORDER_EXPOSURE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport type StoredOrderExposure = {\n e: string;\n v: string;\n t: number;\n};\n\nexport function pruneStoredOrderExposures(exposures: StoredOrderExposure[], now = Date.now()): StoredOrderExposure[] {\n return exposures\n .filter((entry) =>\n typeof entry.e === \"string\" &&\n entry.e &&\n typeof entry.v === \"string\" &&\n entry.v &&\n typeof entry.t === \"number\" &&\n Number.isFinite(entry.t) &&\n now - entry.t <= ORDER_EXPOSURE_TTL_MS,\n )\n .sort((a, b) => a.t - b.t)\n .slice(-ORDER_EXPOSURE_MAX_ENTRIES);\n}\n\nexport function readStoredOrderExposures(): StoredOrderExposure[] {\n if (!persistentStorageAllowed()) return [];\n try {\n const raw = globalThis.localStorage?.getItem(ORDER_EXPOSURE_STORAGE_KEY);\n const parsed = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(parsed)) return [];\n return pruneStoredOrderExposures(parsed as StoredOrderExposure[]);\n } catch {\n return [];\n }\n}\n\nexport function writeStoredOrderExposures(exposures: StoredOrderExposure[]): void {\n if (!persistentStorageAllowed()) return;\n try {\n globalThis.localStorage?.setItem(\n ORDER_EXPOSURE_STORAGE_KEY,\n JSON.stringify(pruneStoredOrderExposures(exposures)),\n );\n } catch {}\n}\n\nexport function clearIdentityContextCookie(): void {\n if (!globalThis.document) return;\n try {\n globalThis.document.cookie = `${IDENTITY_CONTEXT_COOKIE_NAME}=; Max-Age=0; Path=/; SameSite=Lax`;\n } catch {}\n}\n\nexport function recentIdentityContextExposures(): StoredOrderExposure[] {\n const deduped = new Map<string, StoredOrderExposure>();\n const exposures = readStoredOrderExposures();\n for (let index = exposures.length - 1; index >= 0; index--) {\n const exposure = exposures[index];\n if (deduped.has(exposure.e)) continue;\n deduped.set(exposure.e, exposure);\n if (deduped.size >= 10) break;\n }\n return Array.from(deduped.values()).reverse();\n}\n\nexport function buildIdentityContextCookieValue(\n visitorId: string,\n sessionId: string,\n exposures: StoredOrderExposure[],\n): string | null {\n let remaining = exposures.slice();\n while (true) {\n // Public contract for in-process commerce platforms (WooCommerce now,\n // Magento later): URL-encoded `1|visitorId|sessionId|expId:varId,...`.\n const raw = `1|${visitorId}|${sessionId}|${remaining.map((entry) => `${entry.e}:${entry.v}`).join(\",\")}`;\n const encoded = encodeURIComponent(raw);\n if (encoded.length <= IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES) return encoded;\n if (remaining.length === 0) return null;\n remaining = remaining.slice(1);\n }\n}\n\nexport function generateSessionId(): string {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport function getIdentityContextSessionId(): string {\n const trackerSessionId = state.tracker?.getSessionId();\n if (trackerSessionId) return trackerSessionId;\n try {\n const existing = globalThis.sessionStorage?.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n const created = generateSessionId();\n globalThis.sessionStorage?.setItem(SESSION_STORAGE_KEY, created);\n return created;\n } catch {\n return generateSessionId();\n }\n}\n\nexport function writeIdentityContextCookie(): StoredOrderExposure[] {\n if (trackingBlocked()) {\n clearIdentityContextCookie();\n return [];\n }\n if (!globalThis.document || !state.userId) return [];\n const exposures = recentIdentityContextExposures();\n try {\n const encoded = buildIdentityContextCookieValue(\n state.userId,\n getIdentityContextSessionId(),\n exposures,\n );\n if (!encoded) {\n clearIdentityContextCookie();\n return exposures;\n }\n globalThis.document.cookie =\n `${IDENTITY_CONTEXT_COOKIE_NAME}=${encoded}; Path=/; SameSite=Lax; Max-Age=${IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS}`;\n } catch {\n clearIdentityContextCookie();\n }\n return exposures;\n}\n\nexport function isOffTargetPersistedAssignment(assignment: Assignment): boolean {\n return state.activationDiagnostics.experiments.find(\n (diagnostic) => diagnostic.experimentId === assignment.experimentId,\n )?.reason === \"persisted_assignment_off_target\";\n}\n\nexport function restoreRecordedExposureDedup(exposures: StoredOrderExposure[]): void {\n if (!exposures.length) return;\n const recorded = new Set(exposures.map((entry) => `${entry.e}:${entry.v}`));\n for (const assignment of state.assignments) {\n if (\n isOffTargetPersistedAssignment(assignment) &&\n recorded.has(`${assignment.experimentId}:${assignment.variationId}`)\n ) {\n state.exposedAssignmentKeys.add(exposureAssignmentKey(assignment));\n }\n }\n}\n\nexport function rememberOrderExposure(assignment: Assignment): void {\n if (!persistentStorageAllowed()) return;\n const now = Date.now();\n const exposures = readStoredOrderExposures()\n .filter((entry) => entry.e !== assignment.experimentId);\n exposures.push({ e: assignment.experimentId, v: assignment.variationId, t: now });\n writeStoredOrderExposures(exposures);\n writeIdentityContextCookie();\n}\n\nexport function mergedOrderIdentityAssignments(): Array<{ experimentId: string; variationId: string }> {\n const merged = new Map<string, { experimentId: string; variationId: string }>();\n for (const exposure of readStoredOrderExposures()) {\n merged.set(exposure.e, { experimentId: exposure.e, variationId: exposure.v });\n }\n for (const assignment of state.assignments) {\n merged.set(assignment.experimentId, {\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n });\n }\n return Array.from(merged.values()).slice(0, ORDER_EXPOSURE_MAX_ENTRIES);\n}\n\nexport function cleanOrderIdentityText(value: unknown): string | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, 255) : null;\n}\n\nexport function resolveOrderIdentityPlatform(): OrderIdentityPlatform {\n if (state.platform === \"shopify\" || state.platform === \"shopware\") return state.platform;\n const w = globalThis as Record<string, unknown>;\n if (w.__apexShopware) return \"shopware\";\n if (w.Shopify) return \"shopify\";\n if (w.wc || w.woocommerce_params) return \"woocommerce\";\n return \"custom\";\n}\n\nexport function detectOrderIdentity(): {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n} | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const currentUrl = typeof location !== \"undefined\" ? location.href : \"\";\n if (state.orderIdentityDetectionUrl === currentUrl && state.orderIdentityDetection !== undefined) {\n return state.orderIdentityDetection;\n }\n const w = window as unknown as Record<string, unknown>;\n const explicit: unknown[] = [\n w.__apexOrderIdentity,\n readPath(w, \"__apexShopware.orderIdentity\"),\n readPath(w, \"__apexShopware.order\"),\n ];\n const dataLayer = Array.isArray(w.dataLayer) ? w.dataLayer : [];\n for (const item of dataLayer) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const eventName = cleanOrderIdentityText((item as Record<string, unknown>).event);\n if (eventName !== \"purchase\" && eventName !== \"transaction\" && eventName !== \"checkout_completed\") continue;\n explicit.push(readPath(item, \"ecommerce.purchase\"));\n explicit.push(readPath(item, \"ecommerce\"));\n explicit.push(item);\n }\n\n let platformOrderId: string | null = null;\n let orderNumber: string | null = null;\n let platform = resolveOrderIdentityPlatform();\n let strongSignal = false;\n for (const source of explicit) {\n if (!source || typeof source !== \"object\" || Array.isArray(source)) continue;\n strongSignal = true;\n const record = source as Record<string, unknown>;\n platformOrderId ||= cleanOrderIdentityText(\n record.platformOrderId ?? record.orderId ?? record.order_id ?? record.transaction_id,\n );\n orderNumber ||= cleanOrderIdentityText(\n record.orderNumber ?? record.order_number ?? record.number ?? record.transaction_id,\n );\n const hintedPlatform = cleanOrderIdentityText(record.platform);\n if (\n hintedPlatform === \"shopify\" ||\n hintedPlatform === \"shopware\" ||\n hintedPlatform === \"woocommerce\" ||\n hintedPlatform === \"centra\" ||\n hintedPlatform === \"custom\"\n ) {\n platform = hintedPlatform;\n }\n }\n\n if (!strongSignal) {\n const orderIdEl = document.querySelector<HTMLElement>(\"[data-apex-order-id]\");\n const orderNumberEl = document.querySelector<HTMLElement>(\"[data-apex-order-number]\");\n const domOrderId = cleanOrderIdentityText(orderIdEl?.dataset.apexOrderId);\n const domOrderNumber = cleanOrderIdentityText(orderNumberEl?.dataset.apexOrderNumber);\n if (domOrderId || domOrderNumber) {\n strongSignal = true;\n platformOrderId ||= domOrderId;\n orderNumber ||= domOrderNumber;\n }\n }\n\n if (strongSignal) {\n try {\n const params = new URLSearchParams(location.search);\n platformOrderId ||= cleanOrderIdentityText(\n params.get(\"platformOrderId\") ?? params.get(\"orderId\") ?? params.get(\"order_id\"),\n );\n orderNumber ||= cleanOrderIdentityText(\n params.get(\"orderNumber\") ?? params.get(\"order_number\") ?? params.get(\"transaction_id\"),\n );\n } catch {}\n }\n\n const result = strongSignal && (platformOrderId || orderNumber)\n ? { platform, platformOrderId, orderNumber }\n : null;\n state.orderIdentityDetectionUrl = currentUrl;\n state.orderIdentityDetection = result;\n return result;\n}\n\nexport function orderIdentityDedupeKey(identity: {\n platform: string;\n platformOrderId: string | null;\n orderNumber: string | null;\n}, assignments: Array<{ experimentId: string; variationId: string }>): string {\n return [\n \"drip:order_identity\",\n identity.platform,\n identity.platformOrderId || \"\",\n identity.orderNumber || \"\",\n assignments.map((assignment) => `${assignment.experimentId}:${assignment.variationId}`).join(\",\") || \"none\",\n ].join(\":\").slice(0, 240);\n}\n\nexport function scheduleOrderIdentityBeacon(config: InitConfig): void {\n if (state.screenshotMode || trackingBlocked()) return;\n if (!state.tracker) return;\n const endpoint = orderIdentityEndpoint(config);\n if (!endpoint || !config.shopId || !config.ingestSignature) return;\n\n window.setTimeout(() => {\n const identity = detectOrderIdentity();\n if (!identity) return;\n const assignments = mergedOrderIdentityAssignments();\n if (assignments.length === 0) return;\n const key = orderIdentityDedupeKey(identity, assignments);\n try {\n if (sessionStorage.getItem(key) === \"1\") return;\n } catch {}\n if (state.orderIdentityInFlight.has(key)) return;\n state.orderIdentityInFlight.add(key);\n\n const markDelivered = () => {\n try {\n sessionStorage.setItem(key, \"1\");\n } catch {}\n };\n const markComplete = () => {\n state.orderIdentityInFlight.delete(key);\n };\n\n const payload = {\n _shopId: config.ingestShopId ?? config.shopId,\n _signature: config.ingestSignature,\n platform: identity.platform,\n environmentKey: config.environments?.activeKey || \"production\",\n platformOrderId: identity.platformOrderId,\n orderNumber: identity.orderNumber,\n visitorId: state.userId ?? \"\",\n sessionId: state.tracker?.getSessionId() ?? \"\",\n assignments,\n url: cleanUrl(),\n };\n const body = JSON.stringify(payload);\n const sendOnPagehide = () => {\n // A queued beacon has no application-level acknowledgement. Do not set\n // the session marker: the server dedupes the stable order/event identity.\n try {\n if (typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\") {\n navigator.sendBeacon(endpoint, new Blob([body], { type: \"application/json\" }));\n }\n } catch {}\n };\n window.addEventListener(\"pagehide\", sendOnPagehide, { once: true });\n void fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n keepalive: true,\n })\n .then((response) => {\n if (response.status >= 200 && response.status < 300) {\n markDelivered();\n // Only a verified delivery retires the pagehide fallback; after a\n // failed or rejected fetch it stays armed as the last-chance send\n // when the shopper leaves the page (server idempotency absorbs\n // any duplicate).\n window.removeEventListener(\"pagehide\", sendOnPagehide);\n }\n })\n .catch(() => {})\n .finally(markComplete);\n }, 0);\n}\n\nexport function deliveryStatus(expected: number, applied: number, missed: number, isControl: boolean): DeliveryHealthStatus {\n if (expected === 0) return isControl ? \"control\" : \"no_mutations\";\n if (applied >= expected && missed === 0) return \"applied\";\n if (applied > 0) return \"partial\";\n return \"miss\";\n}\n\nexport function queueDeliveryHealthEvent(\n assignment: Assignment,\n data: {\n expectedMutations: number;\n appliedMutations: number;\n selectorMisses: number;\n applyGeneration: number;\n activationMode: ActivationMode;\n },\n): void {\n if (state.screenshotMode) return;\n const event: TrackEvent = {\n type: \"delivery_health\",\n data: {\n expected_mutations: data.expectedMutations,\n applied_mutations: data.appliedMutations,\n selector_misses: data.selectorMisses,\n apply_status: deliveryStatus(\n data.expectedMutations,\n data.appliedMutations,\n data.selectorMisses,\n assignment.isControl,\n ),\n assignment_index: assignment.index,\n is_control: assignment.isControl,\n entity_kind: assignment.kind ?? \"experiment\",\n activation_mode: data.activationMode,\n config_source: state.configSource,\n platform: state.platform,\n apply_generation: data.applyGeneration,\n delivery_state: typeof state.config?.deliveryState === \"string\" ? state.config.deliveryState : undefined,\n assignment_epoch:\n !assignment.kind || assignment.kind === \"experiment\"\n ? assignment.assignmentEpoch\n : undefined,\n },\n url: cleanUrl(),\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n };\n if (state.tracker && !trackingBlocked()) {\n state.tracker.track(event);\n return;\n }\n state.pendingDeliveryHealth.push(event);\n if (state.pendingDeliveryHealth.length > 50) {\n state.pendingDeliveryHealth.splice(0, state.pendingDeliveryHealth.length - 50);\n }\n}\n\nexport function flushPendingDeliveryHealth(): void {\n if (!state.tracker || trackingBlocked() || state.pendingDeliveryHealth.length === 0) return;\n const events = state.pendingDeliveryHealth.splice(0);\n for (const event of events) {\n state.tracker.track(event);\n }\n}\n\nexport function startAnalyticsStage(\n config: InitConfig,\n experiments: Experiment[],\n initialExposureAssignments?: Assignment[],\n targetingPass = activeTargetingEvaluationPass,\n): void {\n if (state.analyticsStarted) return;\n if (state.pendingInitialApply) {\n // Exposure (experiment_viewed) and goal wiring must not precede the\n // gated initial apply (after_hydration / pre-init hold) \u2014 consent and\n // route paths can reach this before the gate opens. Re-enter after;\n // the analyticsStarted flag keeps queued re-entries idempotent, and a\n // config replaced while queued (cached init superseded by the network\n // fetch) must not start analytics with the stale experiment list.\n void state.pendingInitialApply.then(() => {\n if (state.config !== config) return;\n startAnalyticsStage(\n config,\n experiments,\n initialExposureAssignments,\n targetingPass,\n );\n });\n return;\n }\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (!state.trackingPrerequisiteMet) return;\n\n const emptyProjectFastPath = config.runtimeProfile === \"empty_project\"\n && state.perfFlags.perf_empty_project_v1;\n ensureTrackerStarted(config);\n drainPendingDataLayerEvents();\n if (!emptyProjectFastPath) syncActiveAssignmentToShopifyCart();\n flushPendingPerf();\n flushPendingDeliveryHealth();\n const storedOrderExposures = writeIdentityContextCookie();\n if (!emptyProjectFastPath) {\n const previousTargetingPass = activeTargetingEvaluationPass;\n activeTargetingEvaluationPass = targetingPass;\n try {\n restoreRecordedExposureDedup(storedOrderExposures);\n trackViewedAssignments(config, initialExposureAssignments, targetingPass);\n setupGoalTracking(experiments);\n setupHeatmapTracking(state.assignments, experiments);\n setupReplayTracking(state.assignments, experiments);\n setupSemanticTracking(config);\n } finally {\n activeTargetingEvaluationPass = previousTargetingPass;\n }\n }\n scheduleOrderIdentityBeacon(config);\n state.analyticsStarted = true;\n if (!emptyProjectFastPath) updateProjectActivationDiagnostics(config);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", \"Analytics stage started\", { assignments: state.assignments.length });\n onPageEnter(analyticsTrack);\n if (state.consentRequired && !emptyProjectFastPath) {\n scheduleShopifyAssignmentSync();\n }\n}\n\nexport function scheduleAnalyticsStart(\n config: InitConfig,\n experiments: Experiment[],\n targetingPass?: TargetingEvaluationPass,\n): void {\n clearScheduledAnalyticsStart();\n const run = () => {\n clearScheduledAnalyticsStart();\n startAnalyticsStage(config, experiments, undefined, targetingPass);\n };\n\n const idleTimeout = state.trackingIdleTimeoutMs;\n\n state.analyticsTimeoutId = window.setTimeout(run, idleTimeout);\n\n const w = globalThis as Record<string, unknown>;\n const requestIdle = w.requestIdleCallback;\n if (typeof requestIdle === \"function\") {\n state.analyticsIdleId = (requestIdle as (\n cb: () => void,\n opts?: { timeout?: number },\n ) => number)(run, { timeout: idleTimeout });\n }\n}\n\nexport function startAnalyticsIfReady(): void {\n if (state.tracker || !state.config) return;\n if (trackingBlocked()) return;\n if (!state.trackingPrerequisiteMet) return;\n\n const experiments = state.config.experiments ?? [];\n startAnalyticsStage(state.config, experiments);\n}\n\nexport function getConfigCacheKey(shopId: string, environmentKey?: string): string {\n const env = environmentKey || \"production\";\n return CONFIG_CACHE_KEY_PREFIX + shopId + \":\" + env;\n}\n\nexport function storageAvailable(kind: \"localStorage\" | \"sessionStorage\"): boolean {\n try {\n const storage = globalThis[kind];\n if (!storage) return false;\n const key = \"__drip_storage_probe__\";\n storage.setItem(key, \"1\");\n storage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getConfigCacheTtlMs(config: InitConfig): number {\n const ttl = config.configCacheTtlMs;\n if (typeof ttl === \"number\" && Number.isFinite(ttl) && ttl > 0) return ttl;\n return DEFAULT_CONFIG_CACHE_TTL_MS;\n}\n\nexport function configuredStoreOrigins(\n config: Pick<InitConfig, \"storeOrigin\" | \"storeOrigins\">,\n): string | string[] | undefined {\n return config.storeOrigins?.length ? config.storeOrigins : config.storeOrigin;\n}\n\nexport function readCachedExperiments(\n shopId: string,\n ttlMs: number,\n environmentKey?: string,\n): { experiments: Experiment[]; storeOrigin?: string; storeOrigins?: string[]; exclusionGroups?: ExclusionGroupConfig[]; profile?: InitConfig[\"profile\"]; runtime?: unknown; signals?: RuntimeSignalDefinition[]; commerce?: InitConfig[\"commerce\"]; geo?: { country?: string }; holdout?: [enabled?: boolean, pct?: number, configUpdatedAt?: string | null]; hash: string } | null {\n try {\n const raw = localStorage.getItem(getConfigCacheKey(shopId, environmentKey));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as {\n fetchedAt?: number;\n hash?: string;\n experiments?: Experiment[];\n storeOrigin?: string;\n storeOrigins?: string[];\n exclusionGroups?: ExclusionGroupConfig[];\n profile?: InitConfig[\"profile\"];\n runtime?: unknown;\n signals?: RuntimeSignalDefinition[];\n commerce?: InitConfig[\"commerce\"];\n geo?: { country?: unknown };\n holdout?: [enabled?: boolean, pct?: number, configUpdatedAt?: string | null];\n };\n if (!parsed || typeof parsed.fetchedAt !== \"number\" || !Array.isArray(parsed.experiments)) {\n return null;\n }\n if (Date.now() - parsed.fetchedAt > ttlMs) return null;\n return {\n experiments: parsed.experiments,\n storeOrigin:\n typeof parsed.storeOrigin === \"string\"\n ? parsed.storeOrigin\n : undefined,\n storeOrigins: Array.isArray(parsed.storeOrigins)\n ? parsed.storeOrigins.filter(\n (origin): origin is string => typeof origin === \"string\",\n )\n : undefined,\n exclusionGroups: Array.isArray(parsed.exclusionGroups)\n ? parsed.exclusionGroups\n : undefined,\n profile: parsed.profile,\n runtime: parsed.runtime,\n signals: Array.isArray(parsed.signals) ? parsed.signals : undefined,\n commerce: parsed.commerce,\n geo: typeof parsed.geo?.country === \"string\"\n ? { country: parsed.geo.country }\n : undefined,\n holdout: parsed.holdout,\n hash: typeof parsed.hash === \"string\" ? parsed.hash : \"\",\n };\n } catch {\n return null;\n }\n}\n\nexport function hashConfigPayload(\n experiments: Experiment[],\n storeOrigin?: string,\n storeOrigins?: string[],\n exclusionGroups?: ExclusionGroupConfig[],\n profile?: InitConfig[\"profile\"],\n runtime?: unknown,\n signals?: RuntimeSignalDefinition[],\n commerce?: InitConfig[\"commerce\"],\n holdout_v1_enabled?: boolean,\n holdout_pct?: number,\n holdout_config_updated_at?: string | null,\n): string {\n try {\n return JSON.stringify({\n experiments,\n ...(storeOrigin ? { storeOrigin } : {}),\n ...(storeOrigins?.length ? { storeOrigins } : {}),\n exclusionGroups: exclusionGroups ?? [],\n profile: profile ?? null,\n runtime: runtime ?? null,\n signals: signals ?? [],\n commerce: commerce ?? null,\n holdout: [\n holdout_v1_enabled ?? false,\n holdout_pct ?? 0,\n holdout_config_updated_at ?? null,\n ],\n });\n } catch {\n return \"\";\n }\n}\n\nexport function writeCachedExperiments(\n shopId: string,\n experiments: Experiment[],\n storeOrigin?: string,\n storeOrigins?: string[],\n exclusionGroups?: ExclusionGroupConfig[],\n profile?: InitConfig[\"profile\"],\n runtime?: unknown,\n signals?: RuntimeSignalDefinition[],\n commerce?: InitConfig[\"commerce\"],\n holdout_v1_enabled?: boolean,\n holdout_pct?: number,\n holdout_config_updated_at?: string | null,\n geo?: { country?: string },\n environmentKey?: string,\n): void {\n try {\n const payload = {\n fetchedAt: Date.now(),\n hash: hashConfigPayload(\n experiments,\n storeOrigin,\n storeOrigins,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n holdout_v1_enabled,\n holdout_pct,\n holdout_config_updated_at,\n ),\n experiments,\n storeOrigin,\n storeOrigins,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n geo,\n holdout: [\n holdout_v1_enabled,\n holdout_pct,\n holdout_config_updated_at,\n ],\n };\n localStorage.setItem(getConfigCacheKey(shopId, environmentKey), JSON.stringify(payload));\n } catch {\n // no-op on storage failures\n }\n}\n\nexport function withRuntimeSettings(\n config: InitConfig,\n runtime: unknown,\n profile?: InitConfig[\"profile\"],\n): InitConfig {\n if (!runtime || typeof runtime !== \"object\") {\n return profile ? { ...config, profile } : config;\n }\n const r = runtime as Record<string, any>;\n const antiFlicker = r.antiFlicker && typeof r.antiFlicker === \"object\" ? r.antiFlicker : {};\n const snippet = r.snippet && typeof r.snippet === \"object\" ? r.snippet : {};\n const prerequisites = r.prerequisites && typeof r.prerequisites === \"object\" ? r.prerequisites : {};\n const debug = r.debug && typeof r.debug === \"object\" ? r.debug : undefined;\n const pageTrigger = r.pageTrigger && typeof r.pageTrigger === \"object\" ? r.pageTrigger : undefined;\n const consentMode = r.consentMode && typeof r.consentMode === \"object\" ? r.consentMode : undefined;\n const spa = r.spa && typeof r.spa === \"object\" ? r.spa : undefined;\n const externalTracking = r.externalTracking && typeof r.externalTracking === \"object\" ? r.externalTracking : undefined;\n const dataLayerTriggers = Array.isArray(r.dataLayerTriggers) ? r.dataLayerTriggers : undefined;\n const exposureDestinations = r.exposureDestinations && typeof r.exposureDestinations === \"object\" ? r.exposureDestinations : undefined;\n const projectCode = r.projectCode && typeof r.projectCode === \"object\" ? r.projectCode : undefined;\n const environments = r.environments && typeof r.environments === \"object\" ? r.environments : undefined;\n const bucketingCleanup = r.bucketingCleanup && typeof r.bucketingCleanup === \"object\" ? r.bucketingCleanup : undefined;\n const dataProtection = r.dataProtection && typeof r.dataProtection === \"object\" ? r.dataProtection : undefined;\n const semanticTracking = r.semanticTracking && typeof r.semanticTracking === \"object\" ? r.semanticTracking : undefined;\n const runtimeControl = r.runtimeControl && typeof r.runtimeControl === \"object\" ? r.runtimeControl : undefined;\n const commerce = r.commerce && typeof r.commerce === \"object\" ? r.commerce : undefined;\n\n return {\n ...config,\n profile: profile ?? config.profile,\n antiFlickerMode: antiFlicker.mode ?? config.antiFlickerMode,\n antiFlickerTimeoutMs: antiFlicker.timeoutMs ?? config.antiFlickerTimeoutMs,\n antiFlickerCustomCss: antiFlicker.customCss ?? config.antiFlickerCustomCss,\n configCacheTtlMs: snippet.configCacheTtlMs ?? config.configCacheTtlMs,\n projectPrerequisites: {\n ...config.projectPrerequisites,\n showVariationsRule: prerequisites.showVariationsRule ?? config.projectPrerequisites?.showVariationsRule,\n startTrackingRule: prerequisites.startTrackingRule ?? config.projectPrerequisites?.startTrackingRule,\n },\n consentMode: consentMode ? { ...config.consentMode, ...consentMode } : config.consentMode,\n debug: debug ? { ...config.debug, ...debug } : config.debug,\n pageTrigger: pageTrigger ? { ...config.pageTrigger, ...pageTrigger } : config.pageTrigger,\n spa: spa ? { ...config.spa, ...spa } : config.spa,\n externalTracking: externalTracking ? { ...config.externalTracking, ...externalTracking } : config.externalTracking,\n dataLayerTriggers: dataLayerTriggers ?? config.dataLayerTriggers,\n exposureDestinations: exposureDestinations ? { ...config.exposureDestinations, ...exposureDestinations } : config.exposureDestinations,\n projectCode: projectCode ? { ...config.projectCode, ...projectCode } : config.projectCode,\n environments: environments ? { ...config.environments, ...environments } : config.environments,\n bucketingCleanup: bucketingCleanup ? { ...config.bucketingCleanup, ...bucketingCleanup } : config.bucketingCleanup,\n dataProtection: dataProtection ? { ...config.dataProtection, ...dataProtection } : config.dataProtection,\n semanticTracking: semanticTracking ? { ...config.semanticTracking, ...semanticTracking } : config.semanticTracking,\n runtimeControl: runtimeControl ? { ...config.runtimeControl, ...runtimeControl } : config.runtimeControl,\n assignmentCookieSync: typeof r.assignmentCookieSync === \"boolean\"\n ? r.assignmentCookieSync\n : config.assignmentCookieSync,\n aggregateMode: (r.aggregateMode as InitConfig[\"aggregateMode\"]) ?? config.aggregateMode,\n proxyEventDelivery: r.proxyEventDelivery?.enabled === true\n ? { enabled: true }\n : config.proxyEventDelivery,\n cartAttributeWrite: commerce?.cartAttributeWrite === \"external\"\n ? \"external\"\n : commerce?.cartAttributeWrite === \"sdk\"\n ? \"sdk\"\n : commerce?.cartAttributeWrite == null && config.cartAttributeWrite === \"external\"\n ? \"external\"\n : \"sdk\",\n cartAttributeScope: commerce?.cartAttributeScope === \"all\"\n ? \"all\"\n : commerce?.cartAttributeScope === \"consented\"\n ? \"consented\"\n : commerce?.cartAttributeScope == null && config.cartAttributeScope === \"all\"\n ? \"all\"\n : \"consented\",\n };\n}\n\nexport function serializeForceMap(forceMap: Record<string, string> | null): string {\n if (!forceMap) return \"\";\n return Object.entries(forceMap)\n .map(([experimentId, variationId]) => `${experimentId}:${variationId}`)\n .join(\",\");\n}\n\nexport function getHashId(exp: Experiment, userId: string, attrs: Record<string, unknown>): string {\n if (exp.hashAttribute && attrs[exp.hashAttribute] != null) {\n return String(attrs[exp.hashAttribute]);\n }\n return userId;\n}\n\n", "declare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nimport { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport { isExperimentServable } from \"@drip/event-schema/experiment-servability\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport {\n clearAssignmentSyncCookie,\n} from \"./assignment-cookie-sync\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getPersistedUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { scheduleDeferredRouteReevaluation, installDataLayerTriggers, experimentsUseSurfaceSignals, rememberExposureDestination, clarityUpgradeSent, clarityTagKey, pushExposureToQueue, emitExposureDestinations, ensureTrackerStarted, exposureAssignmentKey, priceAssignmentAuthorizationKey, isPriceDisplayAssignmentAuthorized, isShippingDisplayAssignmentAuthorized, isOffersDisplayAssignmentAuthorized, giftSyncOptions, assignmentHasRenderableArtifacts, authorizeOffersDisplayAndRender, revokeOffersDisplayAuthorization, exposureEligibleAssignments, isShippingExposureCartEligible, trackViewedAssignmentsAfterShippingEligibility, EMPTY_TARGETING_ATTRIBUTES, TargetingEvaluationPass, activeTargetingEvaluationPass, createTargetingEvaluationPass, targetingAttributesForPass, trackViewedAssignments, sameStringSet, setupGoalTracking, setupHeatmapTracking, cleanupHeatmapTracking, setupReplayTracking, cleanupReplayTracking, setupSemanticTracking, cleanupSemanticTracking, buildExperimentBehaviorEvents, buildPageExitEvents, analyticsTrack, syncLoadDiagnosticsToPerf, updateLoadDiagnostics, resetLoadDiagnostics, queuePerfEvent, RuntimeInstallClaim, RUNTIME_INSTALL_CLAIM_KEY, RUNTIME_INSTALL_CONFLICT_KEY, telemetryLabel, readRuntimeInstallClaim, rememberRuntimeInstallClaim, claimInstallConflictEmission, sdkAttributionData, sendRuntimeEventNow, sendRuntimePerfNow, readDripPerf, markDripPerf, numberPerf, coexistencePerfFields, buildPerfEvent, flushPendingPerf, orderIdentityEndpoint, ORDER_EXPOSURE_STORAGE_KEY, ORDER_EXPOSURE_MAX_ENTRIES, ORDER_EXPOSURE_TTL_MS, StoredOrderExposure, pruneStoredOrderExposures, readStoredOrderExposures, writeStoredOrderExposures, clearIdentityContextCookie, recentIdentityContextExposures, buildIdentityContextCookieValue, generateSessionId, getIdentityContextSessionId, writeIdentityContextCookie, isOffTargetPersistedAssignment, restoreRecordedExposureDedup, rememberOrderExposure, mergedOrderIdentityAssignments, cleanOrderIdentityText, resolveOrderIdentityPlatform, detectOrderIdentity, orderIdentityDedupeKey, scheduleOrderIdentityBeacon, deliveryStatus, queueDeliveryHealthEvent, flushPendingDeliveryHealth, startAnalyticsStage, scheduleAnalyticsStart, startAnalyticsIfReady, getConfigCacheKey, storageAvailable, getConfigCacheTtlMs, configuredStoreOrigins, readCachedExperiments, hashConfigPayload, writeCachedExperiments, withRuntimeSettings, serializeForceMap, getHashId } from \"./analytics-runtime\";\nimport { PersistedAssignmentMap, GLOBAL_PAGE_PREFIX, appliedAssignmentsByKey, ArtifactId, invalidatedArtifactIds, artifactEpochs, applyPassEpoch, artifactEpochCurrent, PageActivationTransition, normalizePageDeactivationMode, effectiveDeactivationMode, includedPageRules, currentPageMatchContext, pageActivationDiagnosticRows, reconcilePageActivation, cancelPageRulePoll, cancelAllPageRulePolls, pageRulePollSettings, deactivationModeForTriggeredRule, reconcileTriggeredPageMatch, startPageRulePoll, firePageDetector, activePageIds, experimentHasActivePage, syncAssignmentPageActive, assignmentPageIds, stableArtifactJson, artifactContentHash, baseArtifactApplicationKey, artifactApplicationKey, artifactIdFromApplicationKey, assignmentRuntimeKeys, artifactOwnerId, redirectCarryAssignmentKey, shouldPreserveOffTargetRedirectAssignment, isAssignmentArtifactInactive, renderable, exposable, attributable, recordAttributableAssignments, artifactRenderableAssignments, activeRenderableAssignments, chargeAffectingAssignments, loadPersistedAssignments, buildPersistedAssignmentResult, withAssignmentEpochData, usesStickyAssignmentPersistence, persistActiveExperimentAssignments, experimentDiagnostic, evaluateExperimentDetailed, evaluateExperiment, stoppedPersonalizationDiagnostic, enforcePersonalizationStopAfterMatch, excludedByGroupDiagnostic, keptByGroupDiagnostic, applyExclusionAndPersonalization, evaluate, evaluateWithDiagnostics, evaluateEdgeRuntimeAssignments, resolveCombinedEdgeEvaluation, escapeDeliveryRegex, matchSimpleDeliveryPattern, matchRegexDeliveryPattern, matchesDeliveryUrlRules, expandCriticalMutation, buildCriticalPathAssignments, runPostRevealReassert, schedulePostRevealReassert, revealExperimentContent, applyAssignmentCode, recordAppliedAssignment, appliedOwnerKeysForAssignment, applyAssignments, reassertAssignmentMutations, TeardownPage, TeardownRuntimeOptions, TeardownSelection, runAssignmentResetJs, pendingCommercePriceResolve, resolveCommercePricePending, unwireGoals, goalWiringEligible, reconcileGoals, reconcileHarnessPolling, reconcileCommercePrice, reconcileCommerceShipping, reconcileCartSync, syncGlobalRuntimes, configuredPageDeactivationModes, allAppliedPagesWithModes, rollbackArtifactOwner, unregisterArtifactOwner, executeTeardownTransaction, teardownTransaction, teardownArtifactsTransaction, DesiredArtifact, LiveArtifact, ArtifactReconcileResult, desiredArtifactSet, liveArtifactInventory, removeArtifactOwner, registerDesiredOwners, replayDesiredArtifacts, invalidateLiveArtifactsForReplay, reconcileArtifacts } from \"./assignment-runtime\";\nimport { generateQaSessionId, SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS, shopifyAssignmentSyncTimers, CommerceOnlyAdoptionState, commercePriceAdoptionState, ensureCommercePriceAdoptionState, currentCommercePriceContext, withCommercePriceAssignments, clearShopifyAssignmentSyncTimers, adoptAuthoritativePriceAssignments, OffersAdoptionPlan, planAuthoritativeOffersAdoption, canAdoptAuthoritativeOffersAssignments, adoptAuthoritativeOffersAssignments, sdkCartMintAllowed, buildSdkCartMintInput, buildScopedCartAttributeSyncInput, buildActiveCartAttributeSyncInput, sdkCartMintSync, syncSdkCartMint, removeSdkCartMintTrigger, onSdkCartMintClick, installSdkCartMintTrigger, HeadlessCartAuthorizationState, headlessCartAuthorizationState, ensureHeadlessCartAuthorizationState, hasChargeAffectingCommerceAssignment, hasActiveAuthorizationPlane, hasActivePriceAuthorizationPlane, hasActiveShippingAuthorizationPlane, hasActiveOffersAuthorizationPlane, hasActiveCommerceAuthorizationPlane, requiresCommerceCohortPin, getChargeAffectingCommerceExperimentIds, isCohortStampedOnCart, syncActiveAssignmentToShopifyCart, configureChargeCorrectnessCartSync, holdoutConfigEpoch, publishAssignmentsToShopify, scheduleShopifyAssignmentSync, variationsAllowed, updateProjectActivationDiagnostics, trackingAllowed, experimentById, targetingLifecycleMode, preservePersistentAssignments, stopAnalyticsStage, canMintVerifiedRedirectCarry, planRedirectAssignment, navigateForRedirectAssignment, RECONCILE_MAX_DRAINS, reevaluateAssignments, reevaluateAssignmentsPass, reapplyQaAssistantForceMap, reconcileForcedUnavailable, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, clearQaForceFromCurrentUrl, initWithExperiments } from \"./activation-runtime\";\nimport { loadQaToolbar, loadQaAssistant, loadDevtoolsIfEnabled, loadDevtools, init, trackEvent, track, funnelStepStorageKey, shouldTrackFunnelStep, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, RevenueEventData, normalizeRevenueCurrency, trackRevenue, flush, getAssignments, buildCurrentCartAttributes, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, normalizedHeadlessCartToken, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getGoals, getActiveExperimentIds, getRuntimeValue, getRuntimeTools, buildFlagContext, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics, QueueCommand, processCommand, processQueue, installedGlobalApi, createGlobalApi, installGlobalApi } from \"./public-api\";\n\n\nexport function applyRuntimeAntiFlicker(\n mode: AntiFlickerMode,\n timeoutMs: number,\n scopedSelectors?: string[],\n customCss?: string,\n): boolean {\n const bootedTooLate = runtimeSharedState.runtimeBootedTooLateForAntiFlicker ?? false;\n const armed = applyAntiFlicker(mode, timeoutMs, scopedSelectors, customCss, bootedTooLate);\n if (bootedTooLate && mode !== \"off\") {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\n \"init\",\n \"Anti-flicker skipped because the runtime loaded after the pre-paint window\",\n );\n }\n return armed;\n}\n\nexport const SDK_SCRIPT_SRC =\n typeof document !== \"undefined\"\n ? (document.currentScript as HTMLScriptElement | null)?.src\n : undefined;\n\nexport type HeatmapController = {\n stop: () => void;\n update: (assignments: Assignment[], experiments: Experiment[]) => void;\n};\n\nexport type SemanticController = {\n stop: () => void;\n};\n\nexport type FetchAttemptInfo = {\n attempt: number;\n elapsedMs: number;\n error?: string;\n status?: number;\n timedOut?: boolean;\n};\n\nexport type FetchRetryOptions = {\n timeoutMs?: number;\n firstAttemptTimeoutMs?: number;\n slowMs?: number;\n onAttemptStart?: (attempt: number) => void;\n onAttemptEnd?: (info: FetchAttemptInfo) => void;\n onSlow?: (info: { attempt: number; elapsedMs: number }) => void;\n};\n\nexport const DEFAULT_CONFIG_FETCH_TIMEOUT_MS = 4500;\nexport const DEFAULT_CONFIG_FETCH_SLOW_MS = 1500;\nexport const CONFIG_FETCH_RETRY_COUNT = 2;\nexport const CONFIG_FETCH_RETRY_DELAY_MS = 500;\nexport const CONFIG_FETCH_MAX_WAIT_MS =\n DEFAULT_CONFIG_FETCH_TIMEOUT_MS * (CONFIG_FETCH_RETRY_COUNT + 1)\n + CONFIG_FETCH_RETRY_DELAY_MS\n * (CONFIG_FETCH_RETRY_COUNT * (CONFIG_FETCH_RETRY_COUNT + 1) / 2);\nexport // Keep the fail-open guard through the last abort/catch microtask. Without\n// this small settle allowance, the hard reveal timer can run before the final\n// fetch timeout confirms the cached redirect.\nconst CACHED_REDIRECT_HIDE_TIMEOUT_MS = CONFIG_FETCH_MAX_WAIT_MS + 100;\n\nexport function createFetchTimeoutError(): Error | DOMException {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function fetchWithTimeout(url: string, timeoutMs: number): Promise<Response> {\n if (typeof AbortController === \"undefined\") {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return Promise.race([\n fetch(url),\n new Promise<Response>((_, reject) => {\n timer = setTimeout(() => reject(createFetchTimeoutError()), timeoutMs);\n }),\n ]).finally(() => {\n if (timer !== null) clearTimeout(timer);\n });\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n return fetch(url, { signal: controller.signal }).finally(() => {\n clearTimeout(timer);\n });\n}\n\nexport async function fetchWithRetry(\n url: string,\n retries = 2,\n delayMs = 500,\n options: FetchRetryOptions = {},\n): Promise<Response> {\n const timeoutMs = normalizeNumber(options.timeoutMs, DEFAULT_CONFIG_FETCH_TIMEOUT_MS);\n const firstAttemptTimeoutMs = normalizeNumber(options.firstAttemptTimeoutMs, timeoutMs);\n for (let attempt = 0; attempt <= retries; attempt++) {\n const startedAt = Date.now();\n let slowTimer: ReturnType<typeof setTimeout> | null = null;\n let slowMarked = false;\n options.onAttemptStart?.(attempt + 1);\n if (options.onSlow) {\n const slowMs = normalizeNumber(options.slowMs, DEFAULT_CONFIG_FETCH_SLOW_MS);\n slowTimer = setTimeout(() => {\n slowMarked = true;\n options.onSlow?.({ attempt: attempt + 1, elapsedMs: Date.now() - startedAt });\n }, slowMs);\n }\n try {\n const attemptTimeoutMs = attempt === 0 ? firstAttemptTimeoutMs : timeoutMs;\n const res = await fetchWithTimeout(url, attemptTimeoutMs);\n if (slowTimer !== null) clearTimeout(slowTimer);\n options.onAttemptEnd?.({\n attempt: attempt + 1,\n elapsedMs: Date.now() - startedAt,\n status: res.status,\n });\n if (res.ok || attempt === retries) return res;\n } catch (err) {\n if (slowTimer !== null) clearTimeout(slowTimer);\n const error = err instanceof Error ? err.message : String(err);\n const timedOut = typeof DOMException !== \"undefined\" && err instanceof DOMException\n ? err.name === \"AbortError\"\n : /abort|timeout/i.test(error);\n options.onAttemptEnd?.({\n attempt: attempt + 1,\n elapsedMs: Date.now() - startedAt,\n error,\n timedOut,\n });\n if (attempt === retries) throw err;\n }\n if (slowTimer !== null && !slowMarked) clearTimeout(slowTimer);\n await new Promise((r) => setTimeout(r, delayMs * (attempt + 1)));\n }\n throw new Error(\"Failed to fetch after retries\");\n}\n\nexport const CONFIG_CACHE_KEY_PREFIX = \"drip_cfg:\";\nexport const DEFAULT_CONFIG_CACHE_TTL_MS = 5 * 60 * 1000;\nexport const DEFAULT_ANTI_FLICKER_TIMEOUT_MS = 1200;\nexport const DEFAULT_TRACKING_IDLE_TIMEOUT_MS = 2000;\nexport const DEFAULT_EXECUTION_MODE: ExecutionMode = \"auto\";\nexport const DEFAULT_TRACKING_START: TrackingStart = \"idle\";\nexport const DEFAULT_JS_POLICY: CustomJsPolicy = \"hybrid\";\nexport const PAGE_RULE_POLL_WINDOW_MS = 2_000;\nexport const PAGE_RULE_POLL_INTERVAL_MS = 50;\nexport const CONSENT_COOKIE_NAME = \"drip_consent\";\nexport const IDENTITY_CONTEXT_COOKIE_NAME = \"drip_ctx\";\nexport const IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nexport const IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES = 1024;\nexport const SESSION_STORAGE_KEY = \"drip_sid\";\n\nexport /** Collect unique CSS selectors from experiments for scoped anti-flicker. */\nfunction collectScopedSelectors(experiments: Experiment[], config?: InitConfig, assignments: Assignment[] = []): string[] {\n const selectors = new Set<string>();\n const pageInactiveExperimentIds = new Set(\n assignments\n .filter(isAssignmentArtifactInactive)\n .map((assignment) => assignment.experimentId),\n );\n for (const exp of experiments) {\n if (!isExperimentServable(exp, { qaMode: false, environment: config?.environments?.activeKey || \"production\" })) continue;\n if (\n !state.forceMap?.[exp.id] &&\n weekdayScheduleBlocksDelivery(exp.weekdaySchedule, new Date())\n ) continue;\n // Redirect treatment artifacts are authored for the source page. The\n // destination document is itself the treatment, so its preserved\n // assignment must not hide source-only selectors before attribution\n // startup.\n if (pageInactiveExperimentIds.has(exp.id)) continue;\n for (const v of exp.variations) {\n v.antiFlickerSelectors?.forEach((selector) => selectors.add(selector));\n for (const m of v.mutations) {\n if (m.selector) selectors.add(m.selector);\n }\n for (const block of v.urlBlocks ?? []) {\n for (const m of block.mutations) {\n if (m.selector) selectors.add(m.selector);\n }\n }\n }\n }\n if (isCommercePriceActive(config?.commerce?.price, assignments)) {\n COMMERCE_PRICE_SELECTORS.forEach((selector) => selectors.add(selector));\n }\n return Array.from(selectors);\n}\n\nexport type ResolvedRuntimeConfig = {\n executionMode: ExecutionMode;\n antiFlickerMode: AntiFlickerMode;\n antiFlickerTimeoutMs: number;\n antiFlickerCustomCss?: string;\n trackingStart: TrackingStart;\n trackingIdleTimeoutMs: number;\n customJsPolicy: CustomJsPolicy;\n proxyEventDelivery?: { enabled: boolean; path?: string };\n assetFallback?: boolean;\n};\n\nexport type UrlDiffNeeds = {\n path: boolean;\n search: boolean;\n hash: boolean;\n};\n\nexport type ConfigSource = \"inline\" | \"cache\" | \"network\" | \"none\";\n\nexport type PendingPerfEvent = {\n perf_event_kind: \"init\" | \"route_change\";\n assignment_ready_ms: number;\n init_total_ms?: number;\n guard_resolve_ms?: number;\n consent_identity_ms?: number;\n runtime_setup_ms?: number;\n targeting_assignment_ms?: number;\n mutation_finalize_ms?: number;\n predecision_mismatch_count?: number;\n unattributed_init_ms?: number;\n dom_content_loaded_ms: number;\n /** @deprecated One-release alias for dom_content_loaded_ms. */\n blank_screen_ms: number;\n platform: PlatformHint;\n config_source: ConfigSource;\n activation_mode: ActivationMode;\n sdk_version: string;\n sdk_delivery_mode: string;\n sdk_delivery_source: string;\n sdk_policy_revision: string;\n snippet_revision?: number;\n runtime_profile: string;\n sdk_variant: string;\n snippet_fetch_ms: number;\n snippet_transfer_size: number;\n sdk_bundle_fetch_ms: number;\n sdk_bundle_transfer_size: number;\n time_to_sdk_ready_ms?: number;\n experiment_count?: number;\n assignment_count?: number;\n mutation_count?: number;\n script_exec_start?: number;\n anti_flicker_inserted_at?: number;\n assignment_ready_at?: number;\n first_mutation_at?: number;\n reveal_at?: number;\n hidden_duration_ms?: number;\n current_page_hide_selector_count?: number;\n delivery_state?: string;\n script_cache_source?: string;\n install_surface?: string;\n first_install_surface?: string;\n config_fetch_ms?: number;\n config_fetch_attempts?: number;\n config_fetch_status?: RuntimeLoadDiagnostic[\"configFetchStatus\"];\n config_fetch_status_code?: number;\n mutation_apply_pending?: number;\n mutation_apply_applied?: number;\n mutation_apply_missed?: number;\n cls_total?: number;\n cls_after_reveal?: number;\n hydration_detected_at?: number;\n apply_delayed_ms?: number;\n hydration_timeout?: boolean;\n hold_timeout?: boolean;\n reapply_count?: number;\n reassert_loop_detected?: boolean;\n early_apply_at?: number;\n reasserts_count?: number;\n revert_loops_detected?: number;\n};\n\n\nexport type InitPhaseKey =\n | \"guard_resolve_ms\"\n | \"consent_identity_ms\"\n | \"runtime_setup_ms\"\n | \"targeting_assignment_ms\"\n | \"mutation_finalize_ms\";\n\nexport type InitPerfContext = {\n startedAt: number;\n phases: Partial<Record<InitPhaseKey, number>>;\n includesConfigFetch: boolean;\n predecisionMismatches: number;\n};\n\nexport const MAX_PERF_DURATION_MS = 60_000;\n\nexport function monotonicNow(): number {\n const value = globalThis.performance?.now?.();\n return typeof value === \"number\" && Number.isFinite(value) ? value : Date.now();\n}\n\nexport function boundedPerfDuration(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(Math.min(MAX_PERF_DURATION_MS, Math.max(0, value)) * 10) / 10;\n}\n\nexport function createInitPerfContext(): InitPerfContext {\n return { startedAt: monotonicNow(), phases: {}, includesConfigFetch: false, predecisionMismatches: 0 };\n}\n\nexport type BootstrapPredecision = {\n decision: Array<[experimentId: string, variationId: string]>;\n configRevision: number;\n visitorId: string;\n groups: CompactGroupSelections;\n};\n\nexport function bootstrapPredecision(config: InitConfig, perf: InitPerfContext): BootstrapPredecision | null {\n const candidate = (globalThis as typeof globalThis & { __dripPredecided?: unknown }).__dripPredecided;\n if (!candidate || typeof candidate !== \"object\") return null;\n const value = candidate as Partial<BootstrapPredecision>;\n const revision = config.delivery?.revision;\n if (!Number.isSafeInteger(revision) || value.configRevision !== revision ||\n typeof value.visitorId !== \"string\" || !value.visitorId || !Array.isArray(value.decision) ||\n !value.groups || typeof value.groups !== \"object\") {\n perf.predecisionMismatches += 1;\n return null;\n }\n return value as BootstrapPredecision;\n}\n\nexport function addInitPhase(context: InitPerfContext, phase: InitPhaseKey, startedAt: number): void {\n const elapsed = boundedPerfDuration(monotonicNow() - startedAt);\n context.phases[phase] = boundedPerfDuration((context.phases[phase] ?? 0) + elapsed);\n}\n\nexport type DeliveryHealthStatus = \"applied\" | \"partial\" | \"miss\" | \"control\" | \"no_mutations\";\n\nexport type DeliveryHealthTracker = {\n assignment: Assignment;\n expected: number;\n applied: Set<number>;\n missed: Set<number>;\n emitted: boolean;\n};\n\nexport type RouteDiagnostic = {\n previousUrl: string;\n nextUrl: string;\n reason: string;\n at: number;\n reEvaluated: boolean;\n};\n\nexport type DataLayerDiagnostic = {\n eventName: string;\n dataLayerName: string;\n at: number;\n mappedSignals: string[];\n gtagNormalized?: boolean;\n};\n\nexport type ShopifySyncDiagnostic = {\n at: number;\n status: \"pending\" | \"sent\" | \"skipped\" | \"failed\";\n reason?: string;\n assignmentCount: number;\n};\n\nexport type ShopifyAssignmentSyncDiagnostic = Omit<ShopifySyncDiagnostic, \"status\"> & {\n status: ShopifySyncDiagnostic[\"status\"] | \"cookie_fallback\";\n truncatedAssignmentCount?: number;\n};\n\nexport type ExposureDestinationDiagnostic = {\n type: string;\n status: \"sent\" | \"skipped\" | \"failed\";\n at: number;\n reason?: string;\n};\n\nexport type RuntimeLoadDiagnostic = SdkDiagnostics[\"load\"];\n\nexport type DripPerfWindow = Window & {\n __dripPerf?: Record<string, unknown>;\n};\n\nexport function normalizeNumber(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) return value;\n return fallback;\n}\n\nexport function resolveRuntimeConfig(config: InitConfig): ResolvedRuntimeConfig {\n const executionMode = config.executionMode ?? DEFAULT_EXECUTION_MODE;\n\n const antiFlickerMode = config.antiFlickerMode\n ?? (config.antiFlicker === false ? \"off\" : config.antiFlicker === true ? \"full\" : \"scoped\");\n\n const antiFlickerTimeoutMs = normalizeNumber(\n config.antiFlickerTimeoutMs ?? config.antiFlickerTimeout,\n DEFAULT_ANTI_FLICKER_TIMEOUT_MS,\n );\n\n const trackingStart = config.trackingStart\n ?? (typeof config.deferTracking === \"boolean\"\n ? (config.deferTracking ? \"idle\" : \"immediate\")\n : DEFAULT_TRACKING_START);\n\n const trackingIdleTimeoutMs = normalizeNumber(\n config.trackingIdleTimeoutMs,\n DEFAULT_TRACKING_IDLE_TIMEOUT_MS,\n );\n\n const customJsPolicy = config.customJsPolicy ?? DEFAULT_JS_POLICY;\n\n return {\n executionMode,\n antiFlickerMode,\n antiFlickerTimeoutMs,\n antiFlickerCustomCss: config.antiFlickerCustomCss,\n trackingStart,\n trackingIdleTimeoutMs,\n customJsPolicy,\n proxyEventDelivery: config.proxyEventDelivery?.enabled === true\n ? { enabled: true, ...(typeof config.proxyEventDelivery.path === \"string\" ? { path: config.proxyEventDelivery.path } : {}) }\n : undefined,\n };\n}\n\nexport function resolvePageTriggerMode(config: InitConfig): PageTriggerMode {\n // Shop defaults map to page overrides as follows: direct -> immediate,\n // url_change -> history/polling, dom_change -> dom, manual -> manual-*.\n // The enums stay separate because the shop mode is a default while each\n // published Page can select its own detector.\n const mode = config.pageTrigger?.defaultMode;\n if (mode === \"url_change\" || mode === \"dom_change\" || mode === \"manual\") return mode;\n return \"direct\";\n}\n\nexport function resolveDomPageTrigger(config: InitConfig, pageTriggerMode: PageTriggerMode): boolean {\n if (config.spa?.domChangeTrigger === false) return false;\n return (\n config.spa?.domChangeTrigger === true ||\n pageTriggerMode === \"dom_change\" ||\n pageTriggerMode === \"url_change\" ||\n config.platformHint === \"spa\"\n );\n}\n\nexport /** Bridge: log to both debug console and devtools overlay */\nfunction dtLog(type: string, label: string, detail?: Record<string, unknown>): void {\n if (!FEATURE_DEVTOOLS) return;\n try {\n import(\"./devtools\").then(({ logDevtoolsEvent }) => {\n logDevtoolsEvent(type, label, detail);\n }).catch(() => {});\n } catch {\n // Dynamic import not supported.\n }\n}\n\nexport function traceName(id: string, name?: string): string {\n return name && name !== id ? `\"${name}\" (${id})` : id;\n}\n\nexport function traceStep(message: string, data?: Record<string, unknown>): void {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"trace\", message, data);\n}\n\nexport function traceGate(experiment: Experiment, gate: ActivationGateDiagnostic): void {\n const status = gate.status === \"passed\"\n ? \"matching\"\n : gate.status === \"failed\"\n ? \"not matching\"\n : \"skipped\";\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${experiment.id}: ${gate.label} is ${status}`, {\n reason: gate.reason,\n ...(gate.detail && typeof gate.detail === \"object\" ? { detail: gate.detail } : {}),\n });\n}\n\nexport function browserDoNotTrackValue(): string {\n const nav = globalThis.navigator as Navigator & { msDoNotTrack?: string } | undefined;\n const win = globalThis as unknown as Window & { doNotTrack?: string };\n return nav?.doNotTrack ?? nav?.msDoNotTrack ?? win.doNotTrack ?? \"\";\n}\n\nexport function trackingBlocked(): boolean {\n return state.trackingDisabledByDnt || (state.consentRequired && !state.consentGranted);\n}\n\nexport let storefrontVitalsGateOpen: boolean | null = null;\n\nexport function syncStorefrontVitals(): void {\n const config = state.config;\n const gateOpen = Boolean(\n runtimeSharedState.storefrontVitalsContext\n && config\n && !trackingBlocked()\n && state.trackingPrerequisiteMet\n && !state.screenshotMode\n // Field vitals measure production customer traffic only; QA and preview\n // sessions must not contaminate the baseline.\n && !state.qaMode\n && (config.environments?.activeKey ?? \"production\") === \"production\"\n );\n if (gateOpen === storefrontVitalsGateOpen) return;\n\n const wasOpen = storefrontVitalsGateOpen;\n storefrontVitalsGateOpen = gateOpen;\n if (gateOpen && runtimeSharedState.storefrontVitalsContext) {\n startStorefrontVitals(runtimeSharedState.storefrontVitalsContext);\n } else if (wasOpen) {\n stopStorefrontVitals();\n }\n}\n\nexport function doNotTrackEnabled(config: InitConfig): boolean {\n return Boolean(evaluateSynchronousConsent({\n consentCookieGranted: false,\n respectDoNotTrack: config.dataProtection?.respectDoNotTrack,\n doNotTrackValue: browserDoNotTrackValue(),\n }) & DNT_BLOCKED);\n}\n\nexport function storageAllowed(consentRequired: boolean, consentGranted: boolean, trackingDisabledByDnt: boolean): boolean {\n return (!consentRequired || consentGranted) && !trackingDisabledByDnt;\n}\n\nexport function readWindowPath(path: string | undefined): unknown {\n return readPath(globalThis as Record<string, unknown>, path);\n}\n\nexport function configuredConsentGranted(config: InitConfig): boolean | null {\n const consent = config.consentMode;\n return readConfiguredConsent(consent?.provider, consent?.requiredGroup, consent?.getter);\n}\n\nexport function syncConfiguredConsent(config: InitConfig): void {\n if (!state.consentRequired) return;\n const configured = configuredConsentGranted(config);\n if (configured == null || configured === state.consentGranted) return;\n setConsent(configured);\n}\n\nexport const CUSTOM_CONSENT_POLL_INTERVAL_MS = 1000;\nexport const CUSTOM_CONSENT_POLL_MAX_MS = 10 * 60 * 1000;\nexport const MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS = 1000;\nexport const MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS = 10_000;\nexport const MANUAL_CALLBACK_TRIGGER_MAX_RERUNS = 10;\nexport const EVENT_DRIVEN_CONSENT_PROVIDERS = new Set([\"onetrust\", \"usercentrics\", \"cookiebot\", \"ccm19\"]);\n\nexport function shouldPollConfiguredConsent(config: InitConfig): boolean {\n const consent = config.consentMode;\n if (!consent?.enabled || state.consentGranted) return false;\n if (consent.provider && EVENT_DRIVEN_CONSENT_PROVIDERS.has(consent.provider)) return false;\n return consent.provider === \"custom\"\n || consent.provider === \"pandectes\"\n || consent.provider === \"cookiescript\"\n || consent.provider === \"borlabs\"\n || typeof consent.getter === \"string\";\n}\n\nexport function installConsentChangeListeners(config: InitConfig): (() => void) | null {\n if (!config.consentMode?.enabled || typeof window === \"undefined\") return null;\n const events = [\n \"OneTrustGroupsUpdated\",\n \"OptanonConsentChanged\",\n \"CookiebotOnConsentReady\",\n \"CookiebotOnAccept\",\n \"CookiebotOnDecline\",\n \"CookieConsentDeclaration\",\n \"UC_UI_CMP_EVENT\",\n \"ccm19EmbeddingAccepted\",\n \"ccm19WidgetClosed\",\n \"ccm19WidgetLoaded\",\n \"PandectesInitialized\",\n \"visitorConsentCollected\",\n \"CookieScriptLoaded\",\n \"CookieScriptAccept\",\n \"CookieScriptAcceptAll\",\n \"CookieScriptReject\",\n \"CookieScriptClose\",\n ];\n const handler = () => syncConfiguredConsent(config);\n events.forEach((event) => window.addEventListener(event, handler));\n const documentEvents = [\"PandectesInitialized\", \"visitorConsentCollected\"];\n if (typeof document !== \"undefined\") {\n documentEvents.forEach((event) => document.addEventListener(event, handler));\n }\n\n let pollTimer: ReturnType<typeof setInterval> | null = null;\n let pollCapTimer: ReturnType<typeof setTimeout> | null = null;\n const stopPolling = () => {\n if (pollTimer !== null) {\n clearInterval(pollTimer);\n pollTimer = null;\n }\n if (pollCapTimer !== null) {\n clearTimeout(pollCapTimer);\n pollCapTimer = null;\n }\n };\n\n if (shouldPollConfiguredConsent(config)) {\n pollTimer = setInterval(() => {\n syncConfiguredConsent(config);\n if (state.consentGranted) stopPolling();\n }, CUSTOM_CONSENT_POLL_INTERVAL_MS);\n pollCapTimer = setTimeout(stopPolling, CUSTOM_CONSENT_POLL_MAX_MS);\n }\n\n return () => {\n stopPolling();\n events.forEach((event) => window.removeEventListener(event, handler));\n if (typeof document !== \"undefined\") {\n documentEvents.forEach((event) => document.removeEventListener(event, handler));\n }\n };\n}\n\nexport function resolveConsentRequired(config: InitConfig): boolean {\n return Boolean(evaluateSynchronousConsent({\n requireConsent: config.requireConsent,\n hasConsent: config.hasConsent,\n consentModeEnabled: config.consentMode?.enabled,\n consentCookieGranted: false,\n }) & CONSENT_REQUIRED);\n}\n\nexport function resolveConsentGranted(config: InitConfig, consentRequired: boolean): boolean {\n if (!consentRequired) return true;\n const configured = configuredConsentGranted(config);\n return resolveSynchronousConsentGranted({\n requireConsent: config.requireConsent,\n hasConsent: config.hasConsent,\n consentModeEnabled: config.consentMode?.enabled,\n provider: config.consentMode?.provider,\n configuredConsentGranted: configured,\n consentCookieGranted: readConsentCookie(),\n });\n}\n\nexport function persistentStorageAllowed(): boolean {\n return storageAllowed(state.consentRequired, state.consentGranted, state.trackingDisabledByDnt);\n}\n\nconfigureSignalPersistenceAllowed(() => persistentStorageAllowed());\n\nexport function coerceSignalValue(value: unknown, valueType?: RuntimeSignalDefinition[\"valueType\"]): unknown {\n if (value === undefined || value === null) return undefined;\n if (valueType === \"number\") {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : undefined;\n }\n if (valueType === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n const normalized = String(value).trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n return undefined;\n }\n if (valueType === \"string_array\") {\n if (Array.isArray(value)) return value.map((item) => String(item).trim()).filter(Boolean);\n return String(value).split(\",\").map((item) => item.trim()).filter(Boolean);\n }\n if (valueType === \"json\") return value;\n return String(value);\n}\n\nexport function captureUrlSignals(config: InitConfig): void {\n const definitions = config.signals ?? [];\n if (!definitions.length) return;\n let parsed: URL | null = null;\n try {\n parsed = new URL(config.url ?? location.href, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n } catch {\n parsed = null;\n }\n if (!parsed) return;\n\n for (const definition of definitions) {\n const capture = definition.capture;\n if (!definition.key || capture?.mode !== \"url_parameter\" || !capture.parameter) continue;\n const raw = parsed.searchParams.get(capture.parameter);\n if (raw == null || raw === \"\") {\n if (capture.persist === false) clearRuntimeSignal(definition.key);\n continue;\n }\n const value = coerceSignalValue(raw, definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"url_parameter\",\n });\n }\n }\n}\n\nexport function installClickSignalCaptures(config: InitConfig): (() => void) | null {\n const definitions = (config.signals ?? []).filter((definition) =>\n definition.capture?.mode === \"click_selector\" && definition.capture.selector,\n );\n if (!definitions.length || typeof document === \"undefined\" || !document.addEventListener) {\n return null;\n }\n\n const handler = (event: Event) => {\n if (!persistentStorageAllowed()) return;\n const target = event.target;\n if (!target || typeof (target as Element).closest !== \"function\") return;\n const targetElement = target as Element;\n\n for (const definition of definitions) {\n const capture = definition.capture!;\n const selector = capture.selector;\n if (!selector) continue;\n let element: Element | null = null;\n try {\n element = targetElement.closest(selector);\n } catch {\n element = null;\n }\n if (!element) continue;\n\n let raw: unknown = true;\n if (capture.source === \"text\") raw = element.textContent?.trim() ?? \"\";\n if (capture.source === \"attribute\" && capture.attribute) raw = element.getAttribute(capture.attribute);\n if (capture.source === \"dataset\" && capture.attribute) {\n const key = capture.attribute.replace(/^data-/, \"\").replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n raw = (element as HTMLElement).dataset?.[key];\n }\n if (capture.source === \"constant\") raw = capture.value ?? true;\n\n const value = coerceSignalValue(raw, definition.valueType);\n if (value !== undefined) setStoredSignal(definition.key, value, definition.ttlDays, \"click_selector\");\n }\n };\n\n document.addEventListener(\"click\", handler, true);\n return () => document.removeEventListener?.(\"click\", handler, true);\n}\n\nexport function captureEventPropertySignals(type: string, data?: Record<string, unknown>): void {\n if (!state.config || !persistentStorageAllowed()) return;\n const definitions = state.config.signals ?? [];\n if (!definitions.length || !data) return;\n\n for (const definition of definitions) {\n const capture = definition.capture;\n if (capture?.mode !== \"event_property\") continue;\n if (!capture.eventName || !capture.property || capture.eventName !== type) continue;\n const value = coerceSignalValue(data[capture.property], definition.valueType);\n if (value !== undefined) setStoredSignal(definition.key, value, definition.ttlDays, \"event_property\");\n }\n}\n\nexport function setCapturedSignal(\n key: string,\n value: unknown,\n opts: { ttlDays?: number; persist?: boolean; source: string },\n): void {\n if (!key) return;\n if (opts.persist === false || !persistentStorageAllowed()) {\n setRuntimeSignal(key, value, opts.source);\n return;\n }\n setStoredSignal(key, value, opts.ttlDays, opts.source);\n setRuntimeSignal(key, value, opts.source);\n}\n\nexport function setPublicSignal(key: string, value: unknown, ttlDays?: number, source = \"manual\"): void {\n if (persistentStorageAllowed()) {\n setStoredSignal(key, value, ttlDays, source);\n } else {\n setRuntimeSignal(key, value, source);\n }\n}\n\nexport function getPublicSignals(options: { markVisitorSeen?: boolean } = {}): ReturnType<typeof getStoredSignals> {\n return getStoredSignals({\n ...options,\n markVisitorSeen: options.markVisitorSeen === false ? false : persistentStorageAllowed(),\n });\n}\n\nexport function normalizePageApiName(value: unknown): string {\n if (typeof value !== \"string\") return \"\";\n const key = value\n .trim()\n .toLowerCase()\n .replace(/['\"`]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_+/g, \"_\");\n if (!key) return \"\";\n return /^[a-z]/.test(key) ? key : `segment_${key}`;\n}\n\nexport function pageTriggerSignal(normalizedApiName: string): string {\n return `page.trigger.${normalizedApiName}`;\n}\n\nexport function triggerPage(apiName: unknown, active: unknown = true): void {\n const normalizedApiName = normalizePageApiName(apiName);\n if (!normalizedApiName) return;\n const nextActive =\n active === false\n ? false\n : active && typeof active === \"object\" && \"isActive\" in active\n ? Boolean((active as { isActive?: unknown }).isActive)\n : true;\n setRuntimeSignal(pageTriggerSignal(normalizedApiName), nextActive, \"page_api\");\n try {\n document.dispatchEvent(new CustomEvent(\"drip:signals-changed\", {\n detail: { source: \"page_api\", apiName: normalizedApiName, active: nextActive },\n }));\n } catch {}\n}\n\nexport function readElementCaptureValue(element: Element, capture: NonNullable<RuntimeSignalDefinition[\"capture\"]>): unknown {\n if (capture.source === \"attribute\" && capture.attribute) return element.getAttribute(capture.attribute);\n if (capture.source === \"dataset\" && capture.attribute) {\n const key = capture.attribute.replace(/^data-/, \"\").replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n return (element as HTMLElement).dataset?.[key];\n }\n if (capture.source === \"constant\") return capture.value ?? true;\n return element.textContent?.trim() ?? \"\";\n}\n\nexport function captureDomAndGlobalSignals(config: InitConfig): void {\n const definitions = config.signals ?? [];\n for (const definition of definitions) {\n const capture = definition.capture;\n if (!capture) continue;\n if (capture.mode === \"dom_selector\" && capture.selector && typeof document !== \"undefined\") {\n let element: Element | null = null;\n try {\n element = document.querySelector(capture.selector);\n } catch {\n element = null;\n }\n if (!element) continue;\n const value = coerceSignalValue(readElementCaptureValue(element, capture), definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"dom_selector\",\n });\n }\n }\n if (capture.mode === \"global\" && capture.path) {\n const value = coerceSignalValue(readWindowPath(capture.path), definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"global\",\n });\n }\n }\n }\n}\n\nexport function consentAwareDataProtection(config: InitConfig): DataProtectionSettings | undefined {\n if (persistentStorageAllowed()) return config.dataProtection;\n return { ...(config.dataProtection ?? {}), storageMode: \"memory\" };\n}\n\nexport function writeConsentCookie(granted: boolean): void {\n if (!globalThis.document) return;\n try {\n globalThis.document.cookie = granted\n ? `${CONSENT_COOKIE_NAME}=1; Max-Age=31536000; Path=/; SameSite=Lax`\n : `${CONSENT_COOKIE_NAME}=; Max-Age=0; Path=/; SameSite=Lax`;\n } catch {\n // ignore cookie failures\n }\n}\n\nexport function readConsentCookie(): boolean {\n if (!globalThis.document?.cookie) return false;\n try {\n return new RegExp(`(?:^|;\\\\s*)${CONSENT_COOKIE_NAME}=1(?:;|$)`).test(globalThis.document.cookie);\n } catch {\n return false;\n }\n}\n\nexport function clearConsentStorage(): void {\n clearPendingRedirectAssignmentCarry();\n try {\n const storage = globalThis.localStorage;\n storage?.removeItem(\"drip_uid\");\n storage?.removeItem(\"drip_goals\");\n storage?.removeItem(\"drip_visitor_sessions_v1\");\n storage?.removeItem(ORDER_EXPOSURE_STORAGE_KEY);\n clearStoredSignals();\n if (storage) {\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (key?.startsWith(CONFIG_CACHE_KEY_PREFIX)) storage.removeItem(key);\n }\n }\n } catch {}\n try {\n const storage = globalThis.sessionStorage;\n storage?.removeItem(\"drip_uid\");\n storage?.removeItem(\"drip_sid\");\n storage?.removeItem(\"drip_events\");\n storage?.removeItem(\"drip_utm\");\n if (storage) {\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (\n key?.startsWith(\"drip_hm:\")\n || key?.startsWith(REPLAY_SAMPLE_KEY_PREFIX)\n || key?.startsWith(REPLAY_PROGRESS_KEY_PREFIX)\n ) {\n storage.removeItem(key);\n }\n }\n }\n } catch {}\n clearIdentityContextCookie();\n clearPersistedAssignments();\n clearBrowserGroupStickyStore();\n clearAssignmentSyncCookie();\n if (globalThis.document) {\n try {\n globalThis.document.cookie = \"drip_uid=; Max-Age=0; Path=/; SameSite=Lax\";\n } catch {}\n }\n}\n\nexport function applyConsentStorageMode(): void {\n if (!state.config) return;\n configureIdentityStorage(consentAwareDataProtection(state.config));\n if (persistentStorageAllowed() && state.userId) {\n const persistedUserId = getPersistedUserId();\n state.userId = persistedUserId || state.userId;\n adoptUserId(state.userId);\n }\n}\n\nexport function runWhenDomReady(callback: () => void): void {\n if (!globalThis.document || document.readyState !== \"loading\") {\n callback();\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", callback, { once: true });\n}\n\nexport function applyProjectCode(config: InitConfig): void {\n const projectCode = config.projectCode;\n if (!projectCode?.enabled) return;\n if (projectCode.css && globalThis.document) {\n const id = \"drip-project-css\";\n let style = document.getElementById(id) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = id;\n (document.head || document.documentElement).appendChild(style);\n }\n style.textContent = projectCode.css;\n }\n if (projectCode.helperJs) execJs(projectCode.helperJs, \"project-helper\");\n}\n\nexport function resetProjectCode(): void {\n // Project helper/startup JS has no general inverse. Run the same supported\n // cleanup path as a runtime re-init first: variation/experiment reset JS,\n // mutation restoration, commerce teardown, and injected artifact removal.\n teardownTransaction(allAppliedPagesWithModes());\n globalThis.document?.getElementById(\"drip-project-css\")?.remove();\n}\n\nexport function runProjectStartupCode(config: InitConfig): void {\n const projectCode = config.projectCode;\n const js = projectCode?.js;\n if (!projectCode?.enabled || !js) return;\n runWhenDomReady(() => {\n // A cached config can be replaced before DOMContentLoaded. Never let its\n // deferred project startup code run after an authoritative re-init.\n if (state.config !== config || state.holdout) return;\n execJs(js, \"project-startup\");\n });\n}\n\nexport function collectJsTriggerConditions(experiments: Experiment[]): SegmentCondition[] {\n const seen = new Set<string>();\n const conditions: SegmentCondition[] = [];\n for (const experiment of experiments) {\n for (const rule of experiment.targeting?.segmentRules ?? []) {\n for (const condition of rule.rules?.conditions ?? []) {\n const code = condition.js?.code?.trim();\n if (!code) continue;\n const key = `${condition.signal}:${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n conditions.push(condition);\n }\n }\n }\n return conditions;\n}\n\nexport function collectPageTriggerRules(experiments: Experiment[]): PageTargetingRule[] {\n const seen = new Set<string>();\n const rules: PageTargetingRule[] = [];\n for (const experiment of experiments) {\n for (const pageRules of [\n experiment.targeting?.pageRules ?? [],\n experiment.goalPageRules ?? [],\n ]) {\n for (const rule of pageRules) {\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") continue;\n const code = rule.trigger?.triggerJs?.trim();\n const signal = rule.trigger?.signal;\n if (!code || !signal) continue;\n const key = `${signal}:${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n rules.push(rule);\n }\n }\n }\n return rules;\n}\n\nexport type PageDetectorMode = \"history\" | \"polling\" | \"dom\";\n\nexport type PageRuleReconcileScope = {\n triggeredPageIds: ReadonlySet<string>;\n includeImmediate: boolean;\n};\n\nexport function collectPageDetectorRules(\n experiments: Experiment[],\n): Map<PageDetectorMode, PageTargetingRule[]> {\n const registry = new Map<PageDetectorMode, PageTargetingRule[]>([\n [\"history\", []],\n [\"polling\", []],\n [\"dom\", []],\n ]);\n const seen = new Set<string>();\n for (const experiment of experiments) {\n for (const rules of [\n experiment.targeting?.pageRules ?? [],\n experiment.goalPageRules ?? [],\n ]) {\n for (const rule of rules) {\n const mode = rule.trigger?.mode;\n if (mode !== \"history\" && mode !== \"polling\" && mode !== \"dom\") continue;\n const key = `${mode}:${rule.id}`;\n if (!rule.id || seen.has(key)) continue;\n seen.add(key);\n registry.get(mode)!.push(rule);\n }\n }\n }\n return registry;\n}\n\nexport function experimentsForGlobalRouteReevaluation(\n experiments: Experiment[],\n): Experiment[] {\n return experiments.map((experiment) => ({\n ...experiment,\n goalPageRules: experiment.goalPageRules?.filter((rule) => {\n const mode = rule.trigger?.mode ?? \"immediate\";\n return mode === \"immediate\";\n }),\n targeting: experiment.targeting\n ? {\n ...experiment.targeting,\n pageRules: experiment.targeting.pageRules?.filter((rule) => {\n const mode = rule.trigger?.mode ?? \"immediate\";\n return mode === \"immediate\";\n }),\n }\n : experiment.targeting,\n }));\n}\n\nexport function conditionUsesActivateTrigger(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\nexport function buildJsTriggerContext(condition: SegmentCondition): Record<string, unknown> {\n const href = typeof window !== \"undefined\" ? window.location.href : \"https://_\";\n const apexTools = getRuntimeTools();\n return {\n apexTools,\n attributes: buildTargetingAttributes({}, href),\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n signal: condition.signal,\n url: new URL(href, \"https://_\"),\n value: condition.value,\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n}\n\nexport function runJsTriggerReset(condition: SegmentCondition): void {\n const resetCode = condition.js?.resetCode?.trim();\n if (!resetCode || resetCode.length > 4000) return;\n try {\n const context = buildJsTriggerContext(condition);\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 `(function(){${resetCode}}).call(window);`,\n );\n fn(context);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger reset failed\", error instanceof Error ? error.message : String(error));\n }\n}\n\nexport function normalizeActivationValue(next: unknown, hasArgument: boolean): boolean {\n if (!hasArgument) return true;\n if (next && typeof next === \"object\" && \"isActive\" in next) {\n return Boolean((next as { isActive?: unknown }).isActive);\n }\n return Boolean(next);\n}\n\nexport function installActivateJsTrigger(condition: SegmentCondition, onChange: () => void): () => void {\n const source = condition.js?.code?.trim();\n if (!source || source.length > 4000) return () => {};\n\n let teardown: unknown;\n let active = Boolean(getPublicSignals({ markVisitorSeen: false })[condition.signal]);\n const options = { isActive: active };\n function activate(next?: unknown) {\n const nextActive = normalizeActivationValue(next, arguments.length > 0);\n active = nextActive;\n options.isActive = nextActive;\n setRuntimeSignal(condition.signal, nextActive);\n onChange();\n }\n\n try {\n const context = buildJsTriggerContext(condition);\n const fn = new Function(\n \"activate\",\n \"options\",\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 `${source}\\n` +\n `if (typeof callbackFn === \"function\") return callbackFn(activate, options);`,\n );\n teardown = fn(activate, options, context);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger activation failed\", error instanceof Error ? error.message : String(error));\n setRuntimeSignal(condition.signal, false);\n }\n\n return () => {\n try {\n if (typeof teardown === \"function\") teardown();\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger teardown failed\", error instanceof Error ? error.message : String(error));\n }\n runJsTriggerReset(condition);\n clearRuntimeSignal(condition.signal);\n onChange();\n };\n}\n\nexport function installPageTriggerRule(\n rule: PageTargetingRule,\n onChange: () => void,\n manualInitialTrigger = false,\n): () => void {\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") return () => {};\n const source = rule.trigger?.triggerJs?.trim();\n const signal = rule.trigger?.signal;\n if (!source || source.length > 8000 || !signal) return () => {};\n const triggerSignal = signal;\n\n const teardowns: Array<() => void> = [];\n let active = Boolean(getPublicSignals({ markVisitorSeen: false })[triggerSignal]);\n const options = { isActive: active, pageId: rule.id, apiName: rule.trigger?.apiName };\n let rerunObserverCleanup: (() => void) | null = null;\n let rerunInterval: number | null = null;\n let rerunCapTimer: number | null = null;\n let rerunCount = 0;\n let totalAttemptCount = 0;\n let rerunsStarted = false;\n let rerunsStopped = false;\n\n const triggerIsActive = () => Boolean(\n getPublicSignals({ markVisitorSeen: false })[triggerSignal],\n );\n\n const stopReruns = (\n reason: \"activated\" | \"attempt_limit\" | \"time_limit\" | \"teardown\",\n ) => {\n if (rerunsStopped) return;\n rerunsStopped = true;\n if (rerunObserverCleanup) {\n rerunObserverCleanup();\n rerunObserverCleanup = null;\n }\n if (rerunInterval !== null) {\n window.clearInterval(rerunInterval);\n rerunInterval = null;\n }\n if (rerunCapTimer !== null) {\n window.clearTimeout(rerunCapTimer);\n rerunCapTimer = null;\n }\n if (rerunsStarted) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\n \"page-trigger\",\n \"Manual callback re-runs stopped\",\n {\n attempts: totalAttemptCount,\n pageId: rule.id,\n reason,\n reruns: rerunCount,\n signal: triggerSignal,\n },\n );\n }\n };\n\n const runTrigger = (isRerun: boolean) => {\n if (isRerun) {\n if (rerunsStopped) return;\n if (triggerIsActive()) {\n stopReruns(\"activated\");\n return;\n }\n if (rerunCount >= MANUAL_CALLBACK_TRIGGER_MAX_RERUNS) {\n stopReruns(\"attempt_limit\");\n return;\n }\n rerunCount += 1;\n }\n totalAttemptCount += 1;\n let activatedThisRun = false;\n\n function activate(next?: unknown) {\n const nextActive = normalizeActivationValue(next, arguments.length > 0);\n if (nextActive) activatedThisRun = true;\n active = nextActive;\n options.isActive = nextActive;\n setRuntimeSignal(triggerSignal, nextActive, \"page_trigger\");\n onChange();\n if (nextActive) stopReruns(\"activated\");\n }\n\n try {\n const href = typeof window !== \"undefined\" ? window.location.href : \"https://_\";\n const context = {\n apexTools: getRuntimeTools(),\n attributes: buildTargetingAttributes({}, href),\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n pageId: rule.id,\n apiName: rule.trigger?.apiName,\n signal: triggerSignal,\n url: new URL(href, \"https://_\"),\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n const fn = new Function(\n \"activate\",\n \"options\",\n \"context\",\n `\"use strict\";` +\n `const apexTools=context.apexTools;` +\n `const attributes=context.attributes;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const pageId=context.pageId;` +\n `const apiName=context.apiName;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const window=context.window;` +\n `${source}\\n`,\n );\n const teardown = fn(activate, options, context);\n if (typeof teardown === \"function\") teardowns.push(teardown);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"Page trigger JS failed\", error instanceof Error ? error.message : String(error));\n if (!activatedThisRun) setRuntimeSignal(triggerSignal, false, \"page_trigger\");\n }\n\n if (triggerIsActive()) {\n stopReruns(\"activated\");\n } else if (isRerun && rerunCount >= MANUAL_CALLBACK_TRIGGER_MAX_RERUNS) {\n stopReruns(\"attempt_limit\");\n }\n };\n\n runTrigger(false);\n\n if (\n mode === \"manual-callback\" &&\n !manualInitialTrigger &&\n !rerunsStopped &&\n !triggerIsActive() &&\n typeof window !== \"undefined\" &&\n typeof document !== \"undefined\"\n ) {\n rerunsStarted = true;\n rerunObserverCleanup = observeDomChanges(() => runTrigger(true));\n rerunInterval = window.setInterval(\n () => runTrigger(true),\n MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS,\n );\n rerunCapTimer = window.setTimeout(\n () => stopReruns(\"time_limit\"),\n MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS,\n );\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\n \"page-trigger\",\n \"Manual callback re-runs started\",\n {\n attempts: totalAttemptCount,\n intervalMs: MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS,\n maxMs: MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS,\n maxReruns: MANUAL_CALLBACK_TRIGGER_MAX_RERUNS,\n pageId: rule.id,\n signal: triggerSignal,\n },\n );\n }\n\n return () => {\n stopReruns(\"teardown\");\n for (const teardown of teardowns) {\n try {\n teardown();\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"Page trigger teardown failed\", error instanceof Error ? error.message : String(error));\n }\n }\n clearRuntimeSignal(triggerSignal);\n onChange();\n };\n}\n\nexport function installJsTriggerObserver(\n experiments: Experiment[],\n onChange: () => void,\n manualInitialTrigger: boolean,\n): () => void {\n if (\n !targetingHasJsTriggers(experiments) ||\n typeof window === \"undefined\" ||\n typeof document === \"undefined\"\n ) {\n return () => {};\n }\n\n const jsTriggerConditions = collectJsTriggerConditions(experiments);\n const activateCleanups = jsTriggerConditions\n .filter(conditionUsesActivateTrigger)\n .map((condition) => installActivateJsTrigger(condition, onChange));\n const pageTriggerCleanups = collectPageTriggerRules(experiments)\n .map((rule) => installPageTriggerRule(rule, onChange, manualInitialTrigger));\n\n let timeoutId: number | null = null;\n const schedule = () => {\n if (timeoutId !== null) return;\n timeoutId = window.setTimeout(() => {\n timeoutId = null;\n onChange();\n }, 80);\n };\n\n const listeners: Array<[EventTarget, string, EventListener, AddEventListenerOptions?]> = [\n [document, \"click\", schedule, { capture: true, passive: true }],\n [document, \"input\", schedule, { capture: true, passive: true }],\n [document, \"change\", schedule, { capture: true, passive: true }],\n [document, \"keyup\", schedule, { capture: true }],\n [document, \"drip:trigger\", schedule],\n [document, \"drip:signals-changed\", schedule],\n [window, \"resize\", schedule, { passive: true }],\n [window, \"scroll\", schedule, { passive: true }],\n ];\n\n let observer: MutationObserver | null = null;\n if (typeof MutationObserver !== \"undefined\" && document.documentElement) {\n observer = new MutationObserver(schedule);\n registerMutedObserver(observer, schedule);\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n }\n\n listeners.forEach(([target, event, listener, options]) => {\n target.addEventListener(event, listener, options);\n });\n\n return () => {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n if (observer) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n activateCleanups.forEach((cleanup) => cleanup());\n pageTriggerCleanups.forEach((cleanup) => cleanup());\n listeners.forEach(([target, event, listener, options]) => {\n target.removeEventListener(event, listener, options);\n });\n };\n}\n\nexport function notifyQaAssistantRuntimeListeners(): void {\n for (const listener of runtimeSharedState.qaAssistantRuntimeListeners) {\n try {\n listener();\n } catch {\n // QA panel subscriptions must not affect storefront behavior.\n }\n }\n}\n\nexport type HarnessManifest = {\n version?: number;\n expiresAt?: string;\n externalJsUrl?: string | null;\n externalCssUrl?: string | null;\n manifestUrl?: string;\n pollIntervalMs?: number;\n};\n\nexport let harnessPollTimer: number | null = null;\nexport let harnessPollKey = \"\";\nexport let harnessVisibilityInstalled = false;\n\nexport function activeHarnessAssignment(assignments: Assignment[]): Assignment | null {\n if (!FEATURE_HARNESS) return null;\n return artifactRenderableAssignments(assignments).find(\n (assignment) => assignment.harnessSession?.manifestUrl,\n ) ?? null;\n}\n\nexport function stopHarnessPolling(): void {\n if (harnessPollTimer !== null) {\n window.clearInterval(harnessPollTimer);\n harnessPollTimer = null;\n }\n harnessPollKey = \"\";\n}\n\nexport function applyHarnessManifest(manifest: HarnessManifest): void {\n if (!manifest.version || manifest.version <= 0) return;\n const current = activeHarnessAssignment(state.assignments);\n if (!current?.harnessSession?.manifestUrl) return;\n if (current.harnessSession.version === manifest.version) return;\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"harness\", `Reloading harness version ${manifest.version}`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"reload\", { version: manifest.version });\n\n teardownTransaction(allAppliedPagesWithModes());\n state.assignments = state.assignments.map((assignment) => {\n const sessionInfo = assignment.harnessSession;\n if (!sessionInfo || sessionInfo.manifestUrl !== current.harnessSession?.manifestUrl) return assignment;\n return {\n ...assignment,\n externalJsUrl: manifest.externalJsUrl ?? undefined,\n externalCssUrl: manifest.externalCssUrl ?? undefined,\n harnessSession: {\n ...sessionInfo,\n version: manifest.version,\n expiresAt: manifest.expiresAt ?? sessionInfo.expiresAt,\n manifestUrl: manifest.manifestUrl ?? sessionInfo.manifestUrl,\n pollIntervalMs: manifest.pollIntervalMs ?? sessionInfo.pollIntervalMs,\n },\n };\n });\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n}\n\nexport function pollHarnessManifest(manifestUrl: string): void {\n if (!FEATURE_HARNESS) return;\n if (document.hidden) return;\n fetch(manifestUrl, { cache: \"no-store\" })\n .then((res) => {\n if (!res.ok) throw new Error(\"Harness manifest failed: \" + res.status);\n return res.json() as Promise<HarnessManifest>;\n })\n .then(applyHarnessManifest)\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"harness\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"poll failed\", {});\n });\n}\n\nexport function startHarnessPolling(assignments: Assignment[]): void {\n if (!FEATURE_HARNESS) return;\n const assignment = activeHarnessAssignment(assignments);\n const manifestUrl = assignment?.harnessSession?.manifestUrl;\n if (!manifestUrl) {\n stopHarnessPolling();\n return;\n }\n\n const intervalMs = Math.max(250, assignment.harnessSession?.pollIntervalMs ?? 750);\n const nextKey = `${manifestUrl}:${intervalMs}`;\n if (harnessPollKey === nextKey && harnessPollTimer !== null) return;\n\n stopHarnessPolling();\n harnessPollKey = nextKey;\n pollHarnessManifest(manifestUrl);\n harnessPollTimer = window.setInterval(() => pollHarnessManifest(manifestUrl), intervalMs);\n\n if (!harnessVisibilityInstalled) {\n harnessVisibilityInstalled = true;\n document.addEventListener(\"visibilitychange\", () => {\n const current = activeHarnessAssignment(state.assignments);\n if (!document.hidden && current?.harnessSession?.manifestUrl) {\n pollHarnessManifest(current.harnessSession.manifestUrl);\n }\n });\n }\n}\n\n\nexport function getEventsEndpoint(config: InitConfig): string | undefined {\n return config.endpoint\n ? normalizeEndpoint(config.endpoint) + \"/v1/events\"\n : undefined;\n}\n\nexport async function mintBucketingHandoverPayload(\n config: InitConfig,\n visitorId: string,\n assignments: Assignment[],\n): Promise<string | null> {\n if (!config.shopId || !config.ingestSignature || config.externalTracking?.signed === false) {\n return null;\n }\n if (!config.endpoint) return null;\n\n const timeoutMs = handoverMintTimeoutMs(config.externalTracking);\n const controller = new AbortController();\n const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(`${normalizeEndpoint(config.endpoint)}/v1/handover/mint`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": config.ingestShopId || config.shopId,\n \"X-Drip-Signature\": config.ingestSignature,\n },\n body: JSON.stringify({\n visitorId,\n ttlSeconds: config.externalTracking?.handoverTtlSeconds,\n assignments: assignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n })),\n }),\n signal: controller.signal,\n credentials: \"omit\",\n keepalive: false,\n });\n if (!response.ok) return null;\n const payload = await response.json() as { token?: unknown };\n return typeof payload.token === \"string\" && payload.token ? payload.token : null;\n } catch {\n return null;\n } finally {\n window.clearTimeout(timeoutId);\n }\n}\n\nexport async function verifyBucketingHandoverToken(config: InitConfig, token: string): Promise<unknown> {\n if (!config.shopId || !config.endpoint) return null;\n const response = await fetch(`${normalizeEndpoint(config.endpoint)}/v1/handover/verify`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": config.shopId,\n },\n body: JSON.stringify({ verifyToken: token }),\n signal: AbortSignal.timeout(handoverMintTimeoutMs(config.externalTracking)),\n });\n if (!response.ok) return null;\n return (await response.json() as { payload?: unknown }).payload;\n}\n\nexport function clearScheduledAnalyticsStart(): void {\n if (state.analyticsTimeoutId !== null) {\n window.clearTimeout(state.analyticsTimeoutId);\n state.analyticsTimeoutId = null;\n }\n const w = globalThis as Record<string, unknown>;\n const cancelIdle = w.cancelIdleCallback;\n if (state.analyticsIdleId !== null && typeof cancelIdle === \"function\") {\n (cancelIdle as (id: number) => void)(state.analyticsIdleId);\n state.analyticsIdleId = null;\n }\n}\n\nexport function normalizeDataLayerTriggers(config: InitConfig): DataLayerTriggerSettings[] {\n return (config.dataLayerTriggers ?? []).filter((trigger) => trigger?.enabled !== false && Boolean(trigger.eventName));\n}\n\nexport function applyDataLayerMappings(\n eventPayload: Record<string, unknown>,\n mappings: DataLayerSignalMapping[] | undefined,\n): string[] {\n const mapped: string[] = [];\n for (const mapping of mappings ?? []) {\n if (!mapping?.from || !mapping.to) continue;\n const value = coerceSignalValue(readPath(eventPayload, mapping.from), mapping.valueType);\n if (value === undefined) continue;\n setCapturedSignal(mapping.to, value, {\n ttlDays: mapping.ttlDays,\n persist: mapping.persist,\n source: \"data_layer\",\n });\n mapped.push(mapping.to);\n }\n return mapped;\n}\n\nexport function readNumericPath(payload: Record<string, unknown>, path: string | undefined): number | undefined {\n const value = coerceSignalValue(readPath(payload, path), \"number\");\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function readStringPath(payload: Record<string, unknown>, path: string | undefined): string | undefined {\n const value = coerceSignalValue(readPath(payload, path), \"string\");\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nexport const RESERVED_DATA_LAYER_REVENUE_KEYS = new Set([\n \"revenue\",\n \"source\",\n \"dataLayerEvent\",\n \"orderId\",\n \"currency\",\n \"cost\",\n \"profit\",\n \"goalId\",\n]);\n\nexport type PendingDataLayerEvent = {\n trigger: DataLayerTriggerSettings;\n payload: Record<string, unknown>;\n dataLayerName: string;\n gtagNormalized: boolean;\n rawItem: unknown;\n};\n\nexport const MAX_PENDING_DATA_LAYER_EVENTS = 50;\nexport const pendingDataLayerEvents: PendingDataLayerEvent[] = [];\nexport const processedDataLayerEntries = new WeakSet<object>();\n\nexport function isDataLayerEntryObject(item: unknown): item is object {\n return item !== null && (typeof item === \"object\" || typeof item === \"function\");\n}\n\nexport function markDataLayerEntryProcessed(item: unknown): void {\n if (isDataLayerEntryObject(item)) processedDataLayerEntries.add(item);\n}\n\nexport function trackDataLayerRevenue(trigger: DataLayerTriggerSettings, payload: Record<string, unknown>): void {\n const settings = trigger.trackRevenue;\n if (!settings || settings.enabled === false) return;\n\n const revenue = readNumericPath(payload, settings.revenueFrom || \"value\");\n if (revenue === undefined) return;\n\n const eventData: Record<string, unknown> = {\n source: \"data_layer\",\n dataLayerEvent: trigger.eventName,\n };\n const orderId = readStringPath(payload, settings.orderIdFrom || \"transaction_id\");\n const currency = readStringPath(payload, settings.currencyFrom || \"currency\");\n const cost = readNumericPath(payload, settings.costFrom);\n const profit = readNumericPath(payload, settings.profitFrom);\n if (orderId) eventData.orderId = orderId;\n if (currency) eventData.currency = currency;\n if (cost !== undefined) eventData.cost = cost;\n if (profit !== undefined) eventData.profit = profit;\n\n for (const mapping of settings.properties ?? []) {\n if (!mapping?.from || !mapping.to) continue;\n if (RESERVED_DATA_LAYER_REVENUE_KEYS.has(mapping.to)) continue;\n const value = coerceSignalValue(readPath(payload, mapping.from), mapping.valueType);\n if (value !== undefined) eventData[mapping.to] = value;\n }\n\n trackRevenue(revenue, eventData);\n}\n\nexport function trackDataLayerEvent(\n trigger: DataLayerTriggerSettings,\n payload: Record<string, unknown>,\n): void {\n const trackEventName = typeof trigger.trackEventName === \"string\" && trigger.trackEventName.length > 0\n ? trigger.trackEventName\n : null;\n if (trigger.trackPageview === true || trackEventName) {\n track(trackEventName ?? \"pageview\", {\n source: \"data_layer\",\n dataLayerEvent: trigger.eventName,\n ...payload,\n });\n }\n\n trackDataLayerRevenue(trigger, payload);\n}\n\nexport function enqueuePendingDataLayerEvent(event: PendingDataLayerEvent): void {\n if (pendingDataLayerEvents.length >= MAX_PENDING_DATA_LAYER_EVENTS) {\n pendingDataLayerEvents.shift();\n }\n pendingDataLayerEvents.push(event);\n}\n\nexport function drainPendingDataLayerEvents(): void {\n const queuedEvents = pendingDataLayerEvents.splice(0);\n for (const event of queuedEvents) {\n markDataLayerEntryProcessed(event.rawItem);\n try {\n trackDataLayerEvent(event.trigger, event.payload);\n if (event.trigger.reEvaluate !== false) {\n reevaluateAssignments(\"dom\");\n }\n } catch (error) {\n recordObserverError(\"data_layer\", error);\n }\n }\n}\n\nexport function finishInitializingAssignments(): void {\n state.initializingAssignments = false;\n if (state.tracker) drainPendingDataLayerEvents();\n}\n\nexport function handleDataLayerEvent(\n trigger: DataLayerTriggerSettings,\n payload: Record<string, unknown>,\n dataLayerName: string,\n rawItem: unknown,\n gtagNormalized = false,\n): void {\n const mappedSignals = applyDataLayerMappings(payload, trigger.mappings);\n state.lastDataLayerTrigger = {\n eventName: trigger.eventName,\n dataLayerName,\n at: Date.now(),\n mappedSignals,\n ...(gtagNormalized ? { gtagNormalized: true } : {}),\n };\n\n if (state.initializingAssignments) {\n enqueuePendingDataLayerEvent({\n trigger,\n payload,\n dataLayerName,\n gtagNormalized,\n rawItem,\n });\n return;\n }\n\n markDataLayerEntryProcessed(rawItem);\n trackDataLayerEvent(trigger, payload);\n\n if (trigger.reEvaluate !== false) {\n reevaluateAssignments(\"dom\");\n }\n}\n\nexport function recordObserverError(source: \"route\" | \"data_layer\" | \"dom\", error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n state.observerErrors = {\n count: state.observerErrors.count + 1,\n last: { source, message, at: Date.now() },\n };\n debugLog(\"spa\", `${source} observer error`, { message });\n}\n\n", "import { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { normalizeEndpoint } from \"./endpoint\";\nimport { EVENT_TYPE_PATTERN, normalizeEventName } from \"@drip/event-schema/event-name\";\nimport {\n applyAntiFlicker,\n bootedTooLateForAntiFlicker,\n removeAntiFlicker,\n} from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { buildAssignment, decideAssignments } from \"./decide-assignments\";\nimport { weekdayScheduleBlocksDelivery } from \"./weekday-schedule\";\nimport { CONSENT_REQUIRED, DNT_BLOCKED, evaluateSynchronousConsent, readConfiguredConsent, readPath, resolveSynchronousConsentGranted } from \"./consent-evaluation\";\nimport { clearEarlyInteractions, drainBootstrapEarlyInteractions, drainEarlyInteractions } from \"./early-interaction-capture\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport { collectDeliveryTiming } from \"./delivery-timing\";\nimport {\n startStorefrontVitals,\n stopStorefrontVitals,\n type StorefrontVitalsContext,\n} from \"./storefront-vitals\";\nimport {\n browserGroupStickyStore,\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n type PersistedGroupSelection,\n} from \"./exclusion-groups\";\nimport type { CompactGroupSelections } from \"./persistence-decoders\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport {\n addCssOwners,\n injectCss,\n injectExperimentCss,\n injectExternalCss,\n removeCssForOwner,\n} from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { loadDebugBuild } from \"./debug-loader\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { edgeRuntimeActive, readEdgeRuntimeAssignments } from \"./edge-runtime\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, goalWiringKeys, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { clearQaForceFromUrl, isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, persistUrlQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, applyHoldoutGate, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, isHoldoutVisitor, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport {\n addExternalJsOwners,\n execJs,\n loadExternalJs,\n removeExternalJsForOwner,\n setJsPolicy,\n} from \"./js\";\nimport {\n addAppliedMutationOwners,\n applyMutations,\n applyToElement,\n invalidateArtifact,\n reassertNonStructuralMutations,\n replayArtifact,\n resetAppliedMutationsForOwner,\n} from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport {\n assignmentsHaveCustomJs,\n assignmentsHaveStructuralMutations,\n installEarlyReassert,\n shouldUseEarlyReassert,\n} from \"./early-reassert\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges, PAGE_URL_POLL_INTERVAL_MS } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport {\n buildRedirectDestination,\n clearPendingRedirectAssignmentCarry,\n finalizeRedirectAssignmentCarryHandover,\n hasGeneratedRedirectAssignmentCarry,\n filterUnsafeRedirectAssignments,\n importRedirectAssignmentCarry,\n isRedirectLoop,\n markRedirectAssignmentCarryExposed,\n parseRedirectAssignmentCarry,\n persistPendingRedirectAssignmentCarry,\n readPendingRedirectAssignmentCarry,\n REDIRECT_ASSIGNMENT_PARAM,\n redirectPlanForAssignment,\n stripRedirectAssignmentCarry,\n validateRedirectAssignmentCarry,\n verifyRedirectAssignmentCarry,\n} from \"./redirect\";\nimport type { VerifiedRedirectCarry } from \"./redirect\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n REPLAY_PROGRESS_KEY_PREFIX,\n REPLAY_SAMPLE_KEY_PREFIX,\n resolveReplayRecorderUrl,\n startReplayCapture,\n type ReplayController,\n} from \"./replay\";\nimport {\n buildCartAttributeEntries,\n buildCartMetafieldInputs,\n buildSignedCartAttributeEntries,\n APEX_CART_ATTRIBUTE_KEYS,\n cannotRequestRequiredCommerceAuthorization,\n getCartMetafieldStaleKeys as collectCartMetafieldStaleKeys,\n invalidateShopifyCartAttributeSync,\n normalizeCartMetafieldNamespace,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartMetafieldInput,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n matchPageTargetingRule,\n readShopifySignal,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { createEventId, Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageActivationDiagnostic,\n PageDeactivationMode,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport {\n addWaitEntryOwners,\n applyMutationWithWait,\n resetWaitEntriesForOwner,\n} from \"./wait\";import { OrderIdentityPlatform, SDKState, QaAssistantRuntimeSnapshot, PageActivationRuntimeState, PageRulePollController, state, runtimeSharedState } from \"./runtime-state\";\nimport { applyRuntimeAntiFlicker, SDK_SCRIPT_SRC, HeatmapController, SemanticController, FetchAttemptInfo, FetchRetryOptions, DEFAULT_CONFIG_FETCH_TIMEOUT_MS, DEFAULT_CONFIG_FETCH_SLOW_MS, CONFIG_FETCH_RETRY_COUNT, CONFIG_FETCH_RETRY_DELAY_MS, CONFIG_FETCH_MAX_WAIT_MS, CACHED_REDIRECT_HIDE_TIMEOUT_MS, createFetchTimeoutError, fetchWithTimeout, fetchWithRetry, CONFIG_CACHE_KEY_PREFIX, DEFAULT_CONFIG_CACHE_TTL_MS, DEFAULT_ANTI_FLICKER_TIMEOUT_MS, DEFAULT_TRACKING_IDLE_TIMEOUT_MS, DEFAULT_EXECUTION_MODE, DEFAULT_TRACKING_START, DEFAULT_JS_POLICY, PAGE_RULE_POLL_WINDOW_MS, PAGE_RULE_POLL_INTERVAL_MS, CONSENT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_NAME, IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS, IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES, SESSION_STORAGE_KEY, collectScopedSelectors, ResolvedRuntimeConfig, UrlDiffNeeds, ConfigSource, PendingPerfEvent, InitPhaseKey, InitPerfContext, MAX_PERF_DURATION_MS, monotonicNow, boundedPerfDuration, createInitPerfContext, BootstrapPredecision, bootstrapPredecision, addInitPhase, DeliveryHealthStatus, DeliveryHealthTracker, RouteDiagnostic, DataLayerDiagnostic, ShopifySyncDiagnostic, ExposureDestinationDiagnostic, RuntimeLoadDiagnostic, DripPerfWindow, normalizeNumber, resolveRuntimeConfig, resolvePageTriggerMode, resolveDomPageTrigger, dtLog, traceName, traceStep, traceGate, browserDoNotTrackValue, trackingBlocked, storefrontVitalsGateOpen, syncStorefrontVitals, doNotTrackEnabled, storageAllowed, readWindowPath, configuredConsentGranted, syncConfiguredConsent, CUSTOM_CONSENT_POLL_INTERVAL_MS, CUSTOM_CONSENT_POLL_MAX_MS, MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS, MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS, MANUAL_CALLBACK_TRIGGER_MAX_RERUNS, EVENT_DRIVEN_CONSENT_PROVIDERS, shouldPollConfiguredConsent, installConsentChangeListeners, resolveConsentRequired, resolveConsentGranted, persistentStorageAllowed, coerceSignalValue, captureUrlSignals, installClickSignalCaptures, captureEventPropertySignals, setCapturedSignal, setPublicSignal, getPublicSignals, normalizePageApiName, pageTriggerSignal, triggerPage, readElementCaptureValue, captureDomAndGlobalSignals, consentAwareDataProtection, writeConsentCookie, readConsentCookie, clearConsentStorage, applyConsentStorageMode, runWhenDomReady, applyProjectCode, resetProjectCode, runProjectStartupCode, collectJsTriggerConditions, collectPageTriggerRules, PageDetectorMode, PageRuleReconcileScope, collectPageDetectorRules, experimentsForGlobalRouteReevaluation, conditionUsesActivateTrigger, buildJsTriggerContext, runJsTriggerReset, normalizeActivationValue, installActivateJsTrigger, installPageTriggerRule, installJsTriggerObserver, notifyQaAssistantRuntimeListeners, HarnessManifest, harnessPollTimer, harnessPollKey, harnessVisibilityInstalled, activeHarnessAssignment, stopHarnessPolling, applyHarnessManifest, pollHarnessManifest, startHarnessPolling, getEventsEndpoint, mintBucketingHandoverPayload, verifyBucketingHandoverToken, clearScheduledAnalyticsStart, normalizeDataLayerTriggers, applyDataLayerMappings, readNumericPath, readStringPath, RESERVED_DATA_LAYER_REVENUE_KEYS, PendingDataLayerEvent, MAX_PENDING_DATA_LAYER_EVENTS, pendingDataLayerEvents, processedDataLayerEntries, isDataLayerEntryObject, markDataLayerEntryProcessed, trackDataLayerRevenue, trackDataLayerEvent, enqueuePendingDataLayerEvent, drainPendingDataLayerEvents, finishInitializingAssignments, handleDataLayerEvent, recordObserverError } from \"./config-runtime\";\nimport { scheduleDeferredRouteReevaluation, installDataLayerTriggers, experimentsUseSurfaceSignals, rememberExposureDestination, clarityUpgradeSent, clarityTagKey, pushExposureToQueue, emitExposureDestinations, ensureTrackerStarted, exposureAssignmentKey, priceAssignmentAuthorizationKey, isPriceDisplayAssignmentAuthorized, isShippingDisplayAssignmentAuthorized, isOffersDisplayAssignmentAuthorized, giftSyncOptions, assignmentHasRenderableArtifacts, authorizeOffersDisplayAndRender, revokeOffersDisplayAuthorization, exposureEligibleAssignments, isShippingExposureCartEligible, trackViewedAssignmentsAfterShippingEligibility, EMPTY_TARGETING_ATTRIBUTES, TargetingEvaluationPass, activeTargetingEvaluationPass, createTargetingEvaluationPass, targetingAttributesForPass, trackViewedAssignments, sameStringSet, setupGoalTracking, setupHeatmapTracking, cleanupHeatmapTracking, setupReplayTracking, cleanupReplayTracking, setupSemanticTracking, cleanupSemanticTracking, buildExperimentBehaviorEvents, buildPageExitEvents, analyticsTrack, syncLoadDiagnosticsToPerf, updateLoadDiagnostics, resetLoadDiagnostics, queuePerfEvent, RuntimeInstallClaim, RUNTIME_INSTALL_CLAIM_KEY, RUNTIME_INSTALL_CONFLICT_KEY, telemetryLabel, readRuntimeInstallClaim, rememberRuntimeInstallClaim, claimInstallConflictEmission, sdkAttributionData, sendRuntimeEventNow, sendRuntimePerfNow, readDripPerf, markDripPerf, numberPerf, coexistencePerfFields, buildPerfEvent, flushPendingPerf, orderIdentityEndpoint, ORDER_EXPOSURE_STORAGE_KEY, ORDER_EXPOSURE_MAX_ENTRIES, ORDER_EXPOSURE_TTL_MS, StoredOrderExposure, pruneStoredOrderExposures, readStoredOrderExposures, writeStoredOrderExposures, clearIdentityContextCookie, recentIdentityContextExposures, buildIdentityContextCookieValue, generateSessionId, getIdentityContextSessionId, writeIdentityContextCookie, isOffTargetPersistedAssignment, restoreRecordedExposureDedup, rememberOrderExposure, mergedOrderIdentityAssignments, cleanOrderIdentityText, resolveOrderIdentityPlatform, detectOrderIdentity, orderIdentityDedupeKey, scheduleOrderIdentityBeacon, deliveryStatus, queueDeliveryHealthEvent, flushPendingDeliveryHealth, startAnalyticsStage, scheduleAnalyticsStart, startAnalyticsIfReady, getConfigCacheKey, storageAvailable, getConfigCacheTtlMs, configuredStoreOrigins, readCachedExperiments, hashConfigPayload, writeCachedExperiments, withRuntimeSettings, serializeForceMap, getHashId } from \"./analytics-runtime\";\nimport { PersistedAssignmentMap, GLOBAL_PAGE_PREFIX, appliedAssignmentsByKey, ArtifactId, invalidatedArtifactIds, artifactEpochs, applyPassEpoch, artifactEpochCurrent, PageActivationTransition, normalizePageDeactivationMode, effectiveDeactivationMode, includedPageRules, currentPageMatchContext, pageActivationDiagnosticRows, reconcilePageActivation, cancelPageRulePoll, cancelAllPageRulePolls, pageRulePollSettings, deactivationModeForTriggeredRule, reconcileTriggeredPageMatch, startPageRulePoll, firePageDetector, activePageIds, experimentHasActivePage, syncAssignmentPageActive, assignmentPageIds, stableArtifactJson, artifactContentHash, baseArtifactApplicationKey, artifactApplicationKey, artifactIdFromApplicationKey, assignmentRuntimeKeys, artifactOwnerId, redirectCarryAssignmentKey, shouldPreserveOffTargetRedirectAssignment, isAssignmentArtifactInactive, renderable, exposable, attributable, recordAttributableAssignments, artifactRenderableAssignments, activeRenderableAssignments, chargeAffectingAssignments, loadPersistedAssignments, buildPersistedAssignmentResult, withAssignmentEpochData, usesStickyAssignmentPersistence, persistActiveExperimentAssignments, experimentDiagnostic, evaluateExperimentDetailed, evaluateExperiment, stoppedPersonalizationDiagnostic, enforcePersonalizationStopAfterMatch, excludedByGroupDiagnostic, keptByGroupDiagnostic, applyExclusionAndPersonalization, evaluate, evaluateWithDiagnostics, evaluateEdgeRuntimeAssignments, resolveCombinedEdgeEvaluation, escapeDeliveryRegex, matchSimpleDeliveryPattern, matchRegexDeliveryPattern, matchesDeliveryUrlRules, expandCriticalMutation, buildCriticalPathAssignments, runPostRevealReassert, schedulePostRevealReassert, revealExperimentContent, applyAssignmentCode, recordAppliedAssignment, appliedOwnerKeysForAssignment, applyAssignments, reassertAssignmentMutations, TeardownPage, TeardownRuntimeOptions, TeardownSelection, runAssignmentResetJs, pendingCommercePriceResolve, resolveCommercePricePending, unwireGoals, goalWiringEligible, reconcileGoals, reconcileHarnessPolling, reconcileCommercePrice, reconcileCommerceShipping, reconcileCartSync, syncGlobalRuntimes, configuredPageDeactivationModes, allAppliedPagesWithModes, rollbackArtifactOwner, unregisterArtifactOwner, executeTeardownTransaction, teardownTransaction, teardownArtifactsTransaction, DesiredArtifact, LiveArtifact, ArtifactReconcileResult, desiredArtifactSet, liveArtifactInventory, removeArtifactOwner, registerDesiredOwners, replayDesiredArtifacts, invalidateLiveArtifactsForReplay, reconcileArtifacts } from \"./assignment-runtime\";\nimport { generateQaSessionId, SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS, shopifyAssignmentSyncTimers, CommerceOnlyAdoptionState, commercePriceAdoptionState, ensureCommercePriceAdoptionState, currentCommercePriceContext, withCommercePriceAssignments, clearShopifyAssignmentSyncTimers, adoptAuthoritativePriceAssignments, OffersAdoptionPlan, planAuthoritativeOffersAdoption, canAdoptAuthoritativeOffersAssignments, adoptAuthoritativeOffersAssignments, sdkCartMintAllowed, buildSdkCartMintInput, buildScopedCartAttributeSyncInput, buildActiveCartAttributeSyncInput, sdkCartMintSync, syncSdkCartMint, removeSdkCartMintTrigger, onSdkCartMintClick, installSdkCartMintTrigger, HeadlessCartAuthorizationState, headlessCartAuthorizationState, ensureHeadlessCartAuthorizationState, hasChargeAffectingCommerceAssignment, hasActiveAuthorizationPlane, hasActivePriceAuthorizationPlane, hasActiveShippingAuthorizationPlane, hasActiveOffersAuthorizationPlane, hasActiveCommerceAuthorizationPlane, requiresCommerceCohortPin, getChargeAffectingCommerceExperimentIds, isCohortStampedOnCart, syncActiveAssignmentToShopifyCart, configureChargeCorrectnessCartSync, holdoutConfigEpoch, publishAssignmentsToShopify, scheduleShopifyAssignmentSync, variationsAllowed, updateProjectActivationDiagnostics, trackingAllowed, experimentById, targetingLifecycleMode, preservePersistentAssignments, stopAnalyticsStage, canMintVerifiedRedirectCarry, planRedirectAssignment, navigateForRedirectAssignment, RECONCILE_MAX_DRAINS, reevaluateAssignments, reevaluateAssignmentsPass, reapplyQaAssistantForceMap, reconcileForcedUnavailable, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, clearQaForceFromCurrentUrl, initWithExperiments } from \"./activation-runtime\";\nimport { loadQaToolbar, loadQaAssistant, loadDevtoolsIfEnabled, loadDevtools, init, trackEvent, track, funnelStepStorageKey, shouldTrackFunnelStep, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, RevenueEventData, normalizeRevenueCurrency, trackRevenue, flush, getAssignments, buildCurrentCartAttributes, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, normalizedHeadlessCartToken, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getGoals, getActiveExperimentIds, getRuntimeValue, getRuntimeTools, buildFlagContext, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics, QueueCommand, processCommand, processQueue, installedGlobalApi, createGlobalApi, installGlobalApi } from \"./public-api\";\n\n\ndeclare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_REPLAY__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\ndeclare const __DRIP_QA_BUILD__: boolean;\ndeclare const __DRIP_GLOBAL_BOOTSTRAP__: boolean;\ndeclare const __DRIP_TEST_HOOKS__: boolean;\n\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_REPLAY = __DRIP_FEATURE_REPLAY__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\n\n\n\n\n// Auto-process on load\nif (__DRIP_GLOBAL_BOOTSTRAP__) processQueue();\n\nexport { defineExperiment, defineExperiments } from \"./define\";\nexport { defineFlagExperiment } from \"./flags\";\nexport {\n getSignals,\n rememberProduct,\n setCartSignals,\n setSearchSignal,\n setSignal,\n} from \"./signals\";\nexport { createApexRuntimeTools } from \"./runtime-tools\";\n\nexport const __test = (__DRIP_QA_BUILD__ || __DRIP_TEST_HOOKS__) ? {\n attributionLedgerHas: (experimentId: string) => runtimeSharedState.attributionLedger.has(experimentId),\n artifactInventory: () => Array.from(liveArtifactInventory().values()).map(\n (artifact) => ({\n id: artifact.id,\n ownerKeys: Array.from(artifact.ownerKeys),\n ownerPageIds: Array.from(artifact.ownerPageIds),\n }),\n ),\n artifactRenderableAssignments,\n baseArtifactApplicationKey,\n buildActiveCartAttributeSyncInput,\n buildCriticalPathAssignments,\n collectScopedSelectors,\n fetchWithTimeout,\n fetchWithRetry,\n getConfigCacheKey,\n installActivateJsTrigger,\n installPageTriggerRule,\n normalizePageApiName,\n reconcilePageActivation,\n triggerPage,\n sendRuntimeEventNow,\n withRuntimeSettings,\n} : undefined;\n\nexport type {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n ExecutionMode,\n Experiment,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n RouterMode,\n TrackEvent,\n TrackingStart,\n Variation,\n DebugSettings,\n ProjectPrerequisites,\n SpaSettings,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n SdkDiagnostics,\n BucketingCleanupSettings,\n DataProtectionSettings,\n};\n\nexport type { ExperimentDefinition, VariationDefinition, GoalDefinition } from \"./define\";\nexport type { FlagDefinition, FlagContext } from \"./flags\";\nexport type { CartAttributeEntry, CartMetafieldInput } from \"./shopify-cart\";\nexport type {\n ApexRuntimeTools,\n DataLayerOptions,\n DomChangedOptions,\n ElementInViewOptions,\n WaitForElementOptions,\n} from \"./runtime-tools\";\n\nexport { evaluate, __getQaAssistantRuntimeSnapshot, __subscribeQaAssistantRuntime, __forceQaAssistantVariation, __resetQaAssistantForce, init, track, trackStep, trackGoal, setConsent, hold, release, hydrated, recheckPrerequisites, reInit, trackRevenue, flush, getAssignments, getCartAttributes, getCartMetafields, getCartMetafieldStaleKeys, mergeCartAttributes, getSignedCartAttributes, confirmCartAttributesWritten, getExperiments, getRuntimeValue, getRuntimeTools, evaluateFlag, evaluateFlagAssignment, evaluateFlagValue, getDiagnostics };\nexport type { RevenueEventData };\n"],
5
+ "mappings": "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",
6
+ "names": ["clamp", "sampledIn", "cleanUrl", "element", "track", "observers", "observer", "entries", "signals", "now", "entries", "schedule", "now", "weekdayScheduleBlocksDelivery", "schedule", "now", "current", "categories", "observe", "observer", "entries", "duration", "flush", "consume", "k1", "readCookie", "writeCookie", "storageAllowed", "readCookie", "map", "writeCookie", "STORAGE_KEY", "COOKIE_NAME", "COOKIE_MAX_AGE_SECONDS", "epoch", "readLocalStorage", "readCookie", "writeCookie", "epoch", "marker", "current", "compare", "isCohortStampedOnCart", "element", "observers", "observer", "pending", "observer", "schedule", "basePayload", "now", "pending", "element", "epoch", "matches", "element", "observer", "cleanup", "entries", "pending", "flush", "current", "pattern", "signals", "referrer", "matchSegmentConditionValues", "pathname", "current", "current", "now", "pathname", "signals", "flush", "duration", "duration", "MAX_PATTERN_LENGTH", "MAX_CACHE_ENTRIES", "regexCache", "cacheRegex", "safeRegexTest", "now", "activePageIds", "safeRegexTest", "readCookie", "element", "entries", "now", "weekdayScheduleBlocksDelivery", "current", "entries", "observer", "element", "state", "current", "schedule", "observer", "current", "track", "safeRegexTest", "STORAGE_KEY", "element", "normalizeValue", "index", "weekdayScheduleBlocksDelivery", "element", "epoch", "epoch", "element", "STYLE_ID", "initialized", "element", "rootObserver", "matches", "now", "metrics", "element", "entries", "observer", "entry", "element", "epoch", "current", "entry", "result", "element", "continuationGeneration", "pending", "inFlight", "entries", "record", "snapshot", "pending", "observer", "pending", "stopShadowListener", "isElement", "element", "roots", "matches", "ttlMs", "epoch", "perf", "observer", "frame", "finish", "frame", "element", "observer", "run", "schedule", "observer", "cleanup", "cleanUrl", "finish", "variation", "weekdayScheduleBlocksDelivery", "mountQaToolbar", "mountQaAssistant", "isDevtoolsEnabled", "mountDevtools", "verifyBucketingHandoverToken", "assignments", "signals", "getCartMetafieldStaleKeys", "entries", "pending", "evaluateFlag", "evaluateFlagAssignment", "evaluateFlagValue", "storageMode", "evaluateFlag", "evaluateFlagAssignment", "evaluateFlagValue", "getCartMetafieldStaleKeys", "FEATURE_QA", "generateQaSessionId", "SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS", "shopifyAssignmentSyncTimers", "commercePriceAdoptionState", "ensureCommercePriceAdoptionState", "currentCommercePriceContext", "withCommercePriceAssignments", "clearShopifyAssignmentSyncTimers", "adoptAuthoritativePriceAssignments", "experiment", "experimentHasActivePage", "setupGoalTracking", "setupHeatmapTracking", "setupReplayTracking", "notifyQaAssistantRuntimeListeners", "planAuthoritativeOffersAdoption", "canAdoptAuthoritativeOffersAssignments", "hasActiveCommerceAuthorizationPlane", "getChargeAffectingCommerceExperimentIds", "renderable", "publishAssignmentsToShopify", "giftSyncOptions", "hasActivePriceAuthorizationPlane", "hasActiveShippingAuthorizationPlane", "sdkCartMintSync", "syncSdkCartMint", "pending", "finish", "onSdkCartMintClick", "installSdkCartMintTrigger", "hasChargeAffectingCommerceAssignment", "hasActiveAuthorizationPlane", "hasActiveOffersAuthorizationPlane", "isCohortStampedOnCart", "reconcileCommerceShipping", "configureChargeCorrectnessCartSync", "holdoutConfigEpoch", "epoch", "variationsAllowed", "experimentById", "targetingLifecycleMode", "preservePersistentAssignments", "includedPageRules", "effectiveDeactivationMode", "clearScheduledAnalyticsStart", "unwireGoals", "cleanupHeatmapTracking", "cleanupReplayTracking", "cleanupSemanticTracking", "canMintVerifiedRedirectCarry", "exposureAssignmentKey", "mintBucketingHandoverPayload", "RECONCILE_MAX_DRAINS", "reevaluateAssignmentsPass", "reconcileArtifacts", "captureUrlSignals", "captureDomAndGlobalSignals", "EMPTY_TARGETING_ATTRIBUTES", "createTargetingEvaluationPass", "assignmentRuntimeKeys", "reconcilePageActivation", "startPageRulePoll", "syncAssignmentPageActive", "evaluateEdgeRuntimeAssignments", "targetingAttributesForPass", "resolveCombinedEdgeEvaluation", "applyExclusionAndPersonalization", "shouldPreserveOffTargetRedirectAssignment", "recordAttributableAssignments", "invalidateLiveArtifactsForReplay", "desiredArtifactSet", "reassertAssignmentMutations", "sameStringSet", "reapplyQaAssistantForceMap", "reconcileForcedUnavailable", "__getQaAssistantRuntimeSnapshot", "detectOrderIdentity", "__subscribeQaAssistantRuntime", "__forceQaAssistantVariation", "__resetQaAssistantForce", "monotonicNow", "resolvePageTriggerMode", "collectPageDetectorRules", "resolveDomPageTrigger", "experimentsForGlobalRouteReevaluation", "bootstrapPredecision", "resetProjectCode", "applyProjectCode", "pendingDataLayerEvents", "cancelAllPageRulePolls", "installConsentChangeListeners", "installClickSignalCaptures", "experimentsUseSurfaceSignals", "installJsTriggerObserver", "installDataLayerTriggers", "redirectCarryAssignmentKey", "loadPersistedAssignments", "buildCriticalPathAssignments", "experimentDiagnostic", "enforcePersonalizationStopAfterMatch", "collectScopedSelectors", "persistActiveExperimentAssignments", "finishInitializingAssignments", "appliedAssignmentsByKey", "artifactRenderableAssignments", "runProjectStartupCode", "activeRenderableAssignments", "isOffersDisplayAssignmentAuthorized", "boundedPerfDuration", "queuePerfEvent", "buildPerfEvent", "writeIdentityContextCookie", "runAuditIfRequested", "firePageDetector", "analyticsTrack", "scheduleDeferredRouteReevaluation", "assignmentReadyAt", "flushPendingPerf", "normalizeNumber", "recordObserverError", "FEATURE_QA", "GLOBAL_PAGE_PREFIX", "appliedAssignmentsByKey", "invalidatedArtifactIds", "artifactEpochs", "applyPassEpoch", "artifactEpochCurrent", "epoch", "normalizePageDeactivationMode", "effectiveDeactivationMode", "targetingLifecycleMode", "includedPageRules", "currentPageMatchContext", "EMPTY_TARGETING_ATTRIBUTES", "targetingAttributesForPass", "reconcilePageActivation", "cancelPageRulePoll", "cancelAllPageRulePolls", "pageRulePollSettings", "normalizeNumber", "PAGE_RULE_POLL_INTERVAL_MS", "PAGE_RULE_POLL_WINDOW_MS", "deactivationModeForTriggeredRule", "reconcileTriggeredPageMatch", "syncAssignmentPageActive", "reconcileArtifacts", "desiredArtifactSet", "notifyQaAssistantRuntimeListeners", "startPageRulePoll", "firePageDetector", "activePageIds", "experimentHasActivePage", "experimentById", "assignmentPageIds", "stableArtifactJson", "artifactContentHash", "baseArtifactApplicationKey", "artifactApplicationKey", "artifactIdFromApplicationKey", "assignmentRuntimeKeys", "artifactOwnerId", "redirectCarryAssignmentKey", "shouldPreserveOffTargetRedirectAssignment", "isAssignmentArtifactInactive", "renderable", "exposureAssignmentKey", "recordAttributableAssignments", "artifactRenderableAssignments", "activeRenderableAssignments", "chargeAffectingAssignments", "withCommercePriceAssignments", "loadPersistedAssignments", "buildPersistedAssignmentResult", "experimentDiagnostic", "usesStickyAssignmentPersistence", "persistActiveExperimentAssignments", "isOffTargetPersistedAssignment", "evaluateExperimentDetailed", "weekdayScheduleBlocksDelivery", "getHashId", "assignment", "variation", "evaluateExperiment", "stoppedPersonalizationDiagnostic", "enforcePersonalizationStopAfterMatch", "excludedByGroupDiagnostic", "keptByGroupDiagnostic", "applyExclusionAndPersonalization", "evaluateEdgeRuntimeAssignments", "resolveCombinedEdgeEvaluation", "escapeDeliveryRegex", "matchSimpleDeliveryPattern", "current", "matchRegexDeliveryPattern", "matchesDeliveryUrlRules", "expandCriticalMutation", "buildCriticalPathAssignments", "runPostRevealReassert", "resolveDomPageTrigger", "reassertAssignmentMutations", "schedulePostRevealReassert", "revealExperimentContent", "applyAssignmentCode", "runWhenDomReady", "recordAppliedAssignment", "appliedOwnerKeysForAssignment", "isOffersDisplayAssignmentAuthorized", "reconcileCartSync", "isPriceDisplayAssignmentAuthorized", "unregisterArtifactOwner", "rollbackArtifactOwner", "runAssignmentResetJs", "reconcileGoals", "reconcileCommercePrice", "reconcileCommerceShipping", "queueDeliveryHealthEvent", "element", "assignmentHasRenderableArtifacts", "pendingCommercePriceResolve", "resolveCommercePricePending", "unwireGoals", "goalWiringEligible", "sameStringSet", "setupGoalTracking", "reconcileHarnessPolling", "startHarnessPolling", "isCohortStampedOnCart", "isShippingDisplayAssignmentAuthorized", "trackViewedAssignmentsAfterShippingEligibility", "configureChargeCorrectnessCartSync", "configuredPageDeactivationModes", "executeTeardownTransaction", "liveArtifactInventory", "replayDesiredArtifacts", "teardownArtifactsTransaction", "removeArtifactOwner", "registerDesiredOwners", "invalidateLiveArtifactsForReplay", "scheduleDeferredRouteReevaluation", "recordObserverError", "installDataLayerTriggers", "normalizeDataLayerTriggers", "isDataLayerEntryObject", "processedDataLayerEntries", "markDataLayerEntryProcessed", "handleDataLayerEvent", "cleanup", "experimentsUseSurfaceSignals", "rememberExposureDestination", "clarityUpgradeSent", "clarityTagKey", "pushExposureToQueue", "readWindowPath", "emitExposureDestinations", "ensureTrackerStarted", "getEventsEndpoint", "buildPageExitEvents", "holdoutConfigEpoch", "exposureAssignmentKey", "isPriceDisplayAssignmentAuthorized", "isShippingDisplayAssignmentAuthorized", "isOffersDisplayAssignmentAuthorized", "giftSyncOptions", "assignmentHasRenderableArtifacts", "isAssignmentArtifactInactive", "exposureEligibleAssignments", "isShippingExposureCartEligible", "trackViewedAssignmentsAfterShippingEligibility", "EMPTY_TARGETING_ATTRIBUTES", "activeTargetingEvaluationPass", "createTargetingEvaluationPass", "targetingAttributesForPass", "rememberOrderExposure", "sameStringSet", "setupGoalTracking", "activePageIds", "setupHeatmapTracking", "startHeatmapCapture", "cleanupHeatmapTracking", "setupReplayTracking", "cleanupReplayTracking", "setupSemanticTracking", "startSemanticCapture", "cleanupSemanticTracking", "buildExperimentBehaviorEvents", "analyticsTrack", "syncLoadDiagnosticsToPerf", "perf", "now", "queuePerfEvent", "RUNTIME_INSTALL_CLAIM_KEY", "RUNTIME_INSTALL_CONFLICT_KEY", "sdkAttributionData", "current", "coexistencePerfFields", "buildPerfEvent", "boundedPerfDuration", "flushPendingPerf", "orderIdentityEndpoint", "ORDER_EXPOSURE_STORAGE_KEY", "ORDER_EXPOSURE_MAX_ENTRIES", "ORDER_EXPOSURE_TTL_MS", "pruneStoredOrderExposures", "readStoredOrderExposures", "writeStoredOrderExposures", "clearIdentityContextCookie", "IDENTITY_CONTEXT_COOKIE_NAME", "recentIdentityContextExposures", "buildIdentityContextCookieValue", "IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES", "generateSessionId", "getIdentityContextSessionId", "SESSION_STORAGE_KEY", "writeIdentityContextCookie", "IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS", "isOffTargetPersistedAssignment", "restoreRecordedExposureDedup", "cleanOrderIdentityText", "resolveOrderIdentityPlatform", "detectOrderIdentity", "orderIdentityDedupeKey", "deliveryStatus", "queueDeliveryHealthEvent", "flushPendingDeliveryHealth", "drainPendingDataLayerEvents", "clearScheduledAnalyticsStart", "run", "getConfigCacheKey", "CONFIG_CACHE_KEY_PREFIX", "DEFAULT_CONFIG_CACHE_TTL_MS", "ttlMs", "signals", "getHashId", "CONFIG_FETCH_MAX_WAIT_MS", "createFetchTimeoutError", "fetchWithTimeout", "timer", "normalizeNumber", "CONFIG_CACHE_KEY_PREFIX", "DEFAULT_CONFIG_CACHE_TTL_MS", "DEFAULT_ANTI_FLICKER_TIMEOUT_MS", "DEFAULT_TRACKING_IDLE_TIMEOUT_MS", "DEFAULT_EXECUTION_MODE", "DEFAULT_TRACKING_START", "DEFAULT_JS_POLICY", "PAGE_RULE_POLL_WINDOW_MS", "PAGE_RULE_POLL_INTERVAL_MS", "CONSENT_COOKIE_NAME", "IDENTITY_CONTEXT_COOKIE_NAME", "IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS", "IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES", "SESSION_STORAGE_KEY", "collectScopedSelectors", "isAssignmentArtifactInactive", "weekdayScheduleBlocksDelivery", "MAX_PERF_DURATION_MS", "monotonicNow", "boundedPerfDuration", "bootstrapPredecision", "perf", "resolvePageTriggerMode", "resolveDomPageTrigger", "browserDoNotTrackValue", "storefrontVitalsGateOpen", "readWindowPath", "configuredConsentGranted", "syncConfiguredConsent", "CUSTOM_CONSENT_POLL_INTERVAL_MS", "CUSTOM_CONSENT_POLL_MAX_MS", "MANUAL_CALLBACK_TRIGGER_RERUN_INTERVAL_MS", "MANUAL_CALLBACK_TRIGGER_RERUN_MAX_MS", "MANUAL_CALLBACK_TRIGGER_MAX_RERUNS", "EVENT_DRIVEN_CONSENT_PROVIDERS", "shouldPollConfiguredConsent", "installConsentChangeListeners", "readConsentCookie", "coerceSignalValue", "captureUrlSignals", "setCapturedSignal", "installClickSignalCaptures", "element", "normalizePageApiName", "pageTriggerSignal", "readElementCaptureValue", "captureDomAndGlobalSignals", "consentAwareDataProtection", "CONSENT_COOKIE_NAME", "ORDER_EXPOSURE_STORAGE_KEY", "CONFIG_CACHE_KEY_PREFIX", "clearIdentityContextCookie", "runWhenDomReady", "applyProjectCode", "resetProjectCode", "runProjectStartupCode", "collectJsTriggerConditions", "collectPageTriggerRules", "collectPageDetectorRules", "experimentsForGlobalRouteReevaluation", "conditionUsesActivateTrigger", "buildJsTriggerContext", "runJsTriggerReset", "normalizeActivationValue", "installActivateJsTrigger", "installPageTriggerRule", "installJsTriggerObserver", "schedule", "listeners", "observer", "cleanup", "notifyQaAssistantRuntimeListeners", "harnessPollTimer", "harnessPollKey", "harnessVisibilityInstalled", "artifactRenderableAssignments", "stopHarnessPolling", "applyHarnessManifest", "current", "startHarnessPolling", "getEventsEndpoint", "mintBucketingHandoverPayload", "verifyBucketingHandoverToken", "clearScheduledAnalyticsStart", "normalizeDataLayerTriggers", "applyDataLayerMappings", "readNumericPath", "readStringPath", "RESERVED_DATA_LAYER_REVENUE_KEYS", "MAX_PENDING_DATA_LAYER_EVENTS", "pendingDataLayerEvents", "processedDataLayerEntries", "isDataLayerEntryObject", "markDataLayerEntryProcessed", "trackDataLayerRevenue", "trackDataLayerEvent", "enqueuePendingDataLayerEvent", "drainPendingDataLayerEvents", "recordObserverError", "finishInitializingAssignments", "handleDataLayerEvent", "processQueue", "runtimeSharedState", "liveArtifactInventory", "artifactRenderableAssignments", "baseArtifactApplicationKey", "buildActiveCartAttributeSyncInput", "buildCriticalPathAssignments", "collectScopedSelectors", "fetchWithTimeout", "fetchWithRetry", "getConfigCacheKey", "installActivateJsTrigger", "installPageTriggerRule", "normalizePageApiName", "reconcilePageActivation", "triggerPage", "sendRuntimeEventNow", "withRuntimeSettings"]
7
+ }