{"version":3,"file":"auto-attributes.mjs","names":["getBrowserDevice","ua","browser","match","deviceType","getURLAttributes","url","href","path","pathname","host","query","search","autoAttributesPlugin","settings","arguments","length","undefined","window","Error","COOKIE_NAME","uuidCookieName","COOKIE_DOMAIN","uuidCookieDomain","uuidKey","uuid","persistUUID","setCookie","expireCookie","getCookie","getUUID","genUUID","crypto","document","addEventListener","getAutoAttributes","_settings$uuidAutoPer","navigator","userAgent","_uuid","uuidAutoPersist","location","_objectSpread","getDataLayerVariables","pageTitle","title","getUtmAttributes","gb","attributes","setURL","updateAttributes","currentUrl","intervalTimer","setInterval","refreshListener","onDestroy","clearInterval","removeEventListener","name","value","domain","d","Date","COOKIE_DAYS","setTime","getTime","domainStr","cookie","toUTCString","parts","split","concat","randomUUID","replace","c","n","getRandomValues","Uint8Array","Math","floor","random","toString","utms","existing","sessionStorage","getItem","JSON","parse","e","params","URLSearchParams","hasChanges","forEach","k","param","attr","toUpperCase","slice","has","get","setItem","stringify","dataLayer","obj","item","Object","keys","val","valueType","includes"],"sources":["../../../src/plugins/auto-attributes.ts"],"sourcesContent":["import type { GrowthBook } from \"../GrowthBook\";\nimport type {\n  UserScopedGrowthBook,\n  GrowthBookClient,\n} from \"../GrowthBookClient\";\n\nexport type AutoAttributeSettings = {\n  uuidCookieName?: string;\n  uuidKey?: string;\n  uuid?: string;\n  uuidAutoPersist?: boolean;\n  // Scope the uuid cookie to a parent domain (e.g. \".example.com\") so the same\n  // anonymous id is shared across subdomains. Without this the cookie is\n  // host-only and a redirect to another subdomain mints a brand new id.\n  uuidCookieDomain?: string;\n};\n\nfunction getBrowserDevice(ua: string): { browser: string; deviceType: string } {\n  const browser = ua.match(/Edg/)\n    ? \"edge\"\n    : ua.match(/Chrome/)\n      ? \"chrome\"\n      : ua.match(/Firefox/)\n        ? \"firefox\"\n        : ua.match(/Safari/)\n          ? \"safari\"\n          : \"unknown\";\n\n  const deviceType = ua.match(/Mobi/) ? \"mobile\" : \"desktop\";\n\n  return { browser, deviceType };\n}\n\nfunction getURLAttributes(url: URL | Location | undefined) {\n  if (!url) return {};\n  return {\n    url: url.href,\n    path: url.pathname,\n    host: url.host,\n    query: url.search,\n  };\n}\n\nexport function autoAttributesPlugin(settings: AutoAttributeSettings = {}) {\n  // Browser only\n  if (typeof window === \"undefined\") {\n    throw new Error(\"autoAttributesPlugin only works in the browser\");\n  }\n\n  const COOKIE_NAME = settings.uuidCookieName || \"gbuuid\";\n  const COOKIE_DOMAIN = settings.uuidCookieDomain || \"\";\n  const uuidKey = settings.uuidKey || \"id\";\n  let uuid = settings.uuid || \"\";\n  function persistUUID() {\n    if (!COOKIE_DOMAIN) {\n      setCookie(COOKIE_NAME, uuid);\n      return;\n    }\n    // Remove any legacy host-only cookie first - two same-named cookies would\n    // shadow each other and make reads unreliable\n    expireCookie(COOKIE_NAME);\n    setCookie(COOKIE_NAME, uuid, COOKIE_DOMAIN);\n    // Browsers silently reject a cookie whose domain doesn't cover this host\n    // (e.g. a typo) - fall back to host-only so the id stays stable here\n    if (getCookie(COOKIE_NAME) !== uuid) {\n      setCookie(COOKIE_NAME, uuid);\n    }\n  }\n  function getUUID() {\n    // Already stored in memory, return\n    if (uuid) return uuid;\n\n    // If cookie is already set, return\n    uuid = getCookie(COOKIE_NAME);\n    if (uuid) return uuid;\n\n    // Generate a new UUID\n    uuid = genUUID(window.crypto);\n    return uuid;\n  }\n\n  // Listen for a custom event to persist the UUID cookie\n  document.addEventListener(\"growthbookpersist\", () => {\n    persistUUID();\n  });\n\n  function getAutoAttributes(settings: AutoAttributeSettings) {\n    const ua = navigator.userAgent;\n\n    const _uuid = getUUID();\n\n    // If a uuid is provided, default persist to false, otherwise default to true\n    if (settings.uuidAutoPersist ?? !settings.uuid) {\n      persistUUID();\n    }\n\n    const url = location;\n\n    return {\n      ...getDataLayerVariables(),\n      [uuidKey]: _uuid,\n      ...getURLAttributes(url),\n      pageTitle: document.title,\n      ...getBrowserDevice(ua),\n      ...getUtmAttributes(url),\n    };\n  }\n\n  return (gb: GrowthBook | UserScopedGrowthBook | GrowthBookClient) => {\n    // Only works for instances with user attributes\n    if (\"createScopedInstance\" in gb) {\n      return;\n    }\n\n    // Set initial attributes\n    const attributes = getAutoAttributes(settings);\n    attributes.url && gb.setURL(attributes.url);\n    gb.updateAttributes(attributes);\n\n    // Poll for URL changes and update GrowthBook\n    let currentUrl = attributes.url;\n    const intervalTimer = setInterval(() => {\n      if (location.href !== currentUrl) {\n        currentUrl = location.href;\n        gb.setURL(currentUrl);\n        gb.updateAttributes(getAutoAttributes(settings));\n      }\n    }, 500);\n\n    // Listen for a custom event to update URL and attributes\n    const refreshListener = () => {\n      if (location.href !== currentUrl) {\n        currentUrl = location.href;\n        gb.setURL(currentUrl);\n      }\n      gb.updateAttributes(getAutoAttributes(settings));\n    };\n    document.addEventListener(\"growthbookrefresh\", refreshListener);\n\n    if (\"onDestroy\" in gb) {\n      gb.onDestroy(() => {\n        clearInterval(intervalTimer);\n        document.removeEventListener(\"growthbookrefresh\", refreshListener);\n      });\n    }\n  };\n}\n\nfunction setCookie(name: string, value: string, domain?: string) {\n  const d = new Date();\n  const COOKIE_DAYS = 400; // 400 days is the max cookie duration for chrome\n  d.setTime(d.getTime() + 24 * 60 * 60 * 1000 * COOKIE_DAYS);\n  const domainStr = domain ? \";domain=\" + domain : \"\";\n  document.cookie =\n    name + \"=\" + value + \";path=/\" + domainStr + \";expires=\" + d.toUTCString();\n}\n\nfunction expireCookie(name: string) {\n  // No domain attribute, so this only removes the host-only cookie\n  document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n}\n\nfunction getCookie(name: string): string {\n  // A host-only and a domain-scoped cookie can coexist under the same name\n  // (e.g. before/after uuidCookieDomain is enabled) - use the first match\n  const value = \"; \" + document.cookie;\n  const parts = value.split(`; ${name}=`);\n  return parts.length >= 2 ? parts[1].split(\";\")[0] : \"\";\n}\n\n// Use the browsers crypto.randomUUID if set to generate a UUID\nfunction genUUID(crypto?: Crypto) {\n  if (crypto && crypto.randomUUID) return crypto.randomUUID();\n  return (\"\" + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => {\n    const n =\n      crypto && crypto.getRandomValues\n        ? crypto.getRandomValues(new Uint8Array(1))[0]\n        : Math.floor(Math.random() * 256);\n    return (\n      (c as unknown as number) ^\n      (n & (15 >> ((c as unknown as number) / 4)))\n    ).toString(16);\n  });\n}\n\nfunction getUtmAttributes(url: URL | Location | undefined) {\n  // Store utm- params in sessionStorage for future page loads\n  let utms: Record<string, string> = {};\n  try {\n    const existing = sessionStorage.getItem(\"utm_params\");\n    if (existing) {\n      utms = JSON.parse(existing);\n    }\n  } catch (e) {\n    // Do nothing if sessionStorage is disabled (e.g. incognito window)\n  }\n\n  // Add utm params from querystring\n  if (url && url.search) {\n    const params = new URLSearchParams(url.search);\n    let hasChanges = false;\n    [\"source\", \"medium\", \"campaign\", \"term\", \"content\"].forEach((k) => {\n      // Querystring is in snake_case\n      const param = `utm_${k}`;\n      // Attribute keys are camelCase\n      const attr = `utm` + k[0].toUpperCase() + k.slice(1);\n\n      if (params.has(param)) {\n        utms[attr] = params.get(param) || \"\";\n        hasChanges = true;\n      }\n    });\n\n    // Write back to sessionStorage\n    if (hasChanges) {\n      try {\n        sessionStorage.setItem(\"utm_params\", JSON.stringify(utms));\n      } catch (e) {\n        // Do nothing if sessionStorage is disabled (e.g. incognito window)\n      }\n    }\n  }\n\n  return utms;\n}\n\nfunction getDataLayerVariables() {\n  if (\n    typeof window === \"undefined\" ||\n    !window.dataLayer ||\n    !window.dataLayer.forEach\n  ) {\n    return {};\n  }\n\n  const obj: Record<string, unknown> = {};\n  window.dataLayer.forEach((item: unknown) => {\n    // Skip empty and non-object entries\n    if (!item || typeof item !== \"object\" || \"length\" in item) return;\n\n    // Skip events\n    if (\"event\" in item) return;\n\n    Object.keys(item).forEach((k) => {\n      // Filter out known properties that aren't useful\n      if (typeof k !== \"string\" || k.match(/^(gtm)/)) return;\n\n      const val = (item as Record<string, unknown>)[k];\n\n      // Only add primitive variable values\n      const valueType = typeof val;\n      if ([\"string\", \"number\", \"boolean\"].includes(valueType)) {\n        obj[k] = val;\n      }\n    });\n  });\n  return obj;\n}\n"],"mappings":"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","ignoreList":[]}