{
  "version": 3,
  "sources": ["/cdn/shop/t/23/assets/cw-customer-attribution-20261022-v1.js?cw=20261022-v1"],
  "sourcesContent": ["(function (root) {\n  'use strict';\n\n  const INSTANCE_KEY = '__cwCustomerAttributionV1__';\n  const ENDPOINT = '/apps/cw-preferences/attribution';\n  const SITE_ORIGIN = 'https://craftedwondersart.com';\n  function cleanTouch(href, context = {}, storage = null, now = Date.now()) {\n    return root.CwAttribution?.getTouch('last', context) || null;\n  }\n\n  function consentAllowed(shopify) {\n    try { return shopify?.customerPrivacy?.analyticsProcessingAllowed() === true; } catch (_) { return false; }\n  }\n\n  function createEventId(crypto) {\n    try {\n      if (typeof crypto?.randomUUID === 'function') return crypto.randomUUID();\n      if (typeof crypto?.getRandomValues !== 'function') return null;\n      const bytes = crypto.getRandomValues(new Uint8Array(16));\n      bytes[6] = (bytes[6] & 0x0f) | 0x40;\n      bytes[8] = (bytes[8] & 0x3f) | 0x80;\n      const hex = [...bytes].map(value => value.toString(16).padStart(2, '0')).join('');\n      return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n    } catch (_) { return null; }\n  }\n\n  function createController(options) {\n    const page = options.root;\n    const fetcher = options.fetch;\n    const endpoint = options.endpoint;\n    const context = options.context || {};\n    const storage = options.storage;\n    const now = options.now || Date.now;\n    const makeId = options.createId || (() => createEventId(page.crypto));\n    const AbortCtor = options.AbortController || page.AbortController || globalThis.AbortController;\n    let attemptConsumed = false;\n    let inFlight = null;\n    let controller = null;\n    let generation = 0;\n    let listenerAttached = false;\n\n    function clearRecentUtm() {\n      page.CwAttribution?.sync();\n    }\n\n    function cancelForNoConsent() {\n      generation += 1;\n      try { controller?.abort(); } catch (_) {}\n      controller = null;\n      inFlight = null;\n      attemptConsumed = false;\n      clearRecentUtm();\n    }\n\n    async function run() {\n      if (endpoint !== ENDPOINT || typeof fetcher !== 'function') return false;\n      if (!consentAllowed(page.Shopify)) { cancelForNoConsent(); return false; }\n      if (inFlight) return inFlight;\n      if (attemptConsumed) return false;\n      const eventId = makeId();\n      if (typeof eventId !== 'string' || !/^[0-9a-f-]{36}$/i.test(eventId)) return false;\n      const touch = page.CwAttribution?.getTouch('last', context);\n      if (!touch) return false;\n\n      attemptConsumed = true;\n      const requestGeneration = ++generation;\n      if (typeof AbortCtor !== 'function') return false;\n      controller = new AbortCtor();\n      const signal = controller.signal;\n      const requestOptions = {\n        method: 'POST', credentials: 'same-origin', cache: 'no-store', redirect: 'error', signal,\n        headers: { 'content-type': 'application/json', accept: 'application/json' },\n      };\n      const task = (async () => {\n        try {\n          if (!consentAllowed(page.Shopify)) return false;\n          const issue = await fetcher(`${endpoint}/issue`, {\n            ...requestOptions,\n            body: JSON.stringify({ analyticsConsent: true, eventId, touch }),\n          });\n          if (!issue?.ok) return false;\n          const issued = await issue.json();\n          if (requestGeneration !== generation || !consentAllowed(page.Shopify)) return false;\n          if (typeof issued?.ticket !== 'string' || !issued.ticket) return false;\n          if (!consentAllowed(page.Shopify)) return false;\n          const committed = await fetcher(`${endpoint}/commit`, {\n            ...requestOptions,\n            body: JSON.stringify({ ticket: issued.ticket, analyticsConsent: true }),\n          });\n          if (!committed?.ok) return false;\n          const result = await committed.json();\n          if (requestGeneration !== generation || !consentAllowed(page.Shopify)) return false;\n          return result?.status === 'saved' || result?.status === 'no_change';\n        } catch (_) {\n          return false;\n        }\n      })();\n      inFlight = task;\n      try { return await task; }\n      finally {\n        if (inFlight === task) inFlight = null;\n        if (requestGeneration === generation) controller = null;\n      }\n    }\n\n    function onConsentCollected() {\n      if (consentAllowed(page.Shopify)) void run();\n      else cancelForNoConsent();\n    }\n\n    function initialize() {\n      if (!listenerAttached) {\n        page.document?.addEventListener?.('visitorConsentCollected', onConsentCollected);\n        listenerAttached = true;\n      }\n      if (page.Shopify?.customerPrivacy) void run();\n      else if (typeof page.Shopify?.loadFeatures === 'function') {\n        try {\n          page.Shopify.loadFeatures([{ name: 'consent-tracking-api', version: '0.1' }], error => {\n            if (!error) void run();\n          });\n        } catch (_) {}\n      }\n    }\n\n    return { run, initialize, onConsentCollected, cancelForNoConsent };\n  }\n\n  function boot(page) {\n    if (!page?.document) return null;\n    if (page[INSTANCE_KEY]) return page[INSTANCE_KEY];\n    const script = page.document.currentScript;\n    if (!script || script.dataset?.cwEnabled !== 'true' || script.dataset?.cwEndpoint !== ENDPOINT) return null;\n    const controller = createController({\n      root: page,\n      fetch: page.fetch?.bind(page),\n      endpoint: script.dataset.cwEndpoint,\n      context: {\n        businessLine: script.dataset.businessLine || '',\n        productSku: script.dataset.productSku || '',\n        articleId: script.dataset.articleId || '',\n        collectionId: script.dataset.collectionId || '',\n      },\n      storage: page.sessionStorage,\n      now: () => Date.now(),\n    });\n    Object.defineProperty(page, INSTANCE_KEY, { value: controller, configurable: false, enumerable: false, writable: false });\n    controller.initialize();\n    return controller;\n  }\n\n  const api = { cleanTouch, createController, boot, ENDPOINT, SITE_ORIGIN };\n  if (typeof module !== 'undefined' && module.exports) module.exports = api;\n  if (root.document) {\n    root.CwAttributionTools = Object.freeze({ cleanTouch });\n    boot(root);\n  }\n})(typeof window !== 'undefined' ? window : globalThis);\n"],
  "mappings": "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",
  "names": []
}
