{"version":3,"sources":["../../src/third-parties/openai-pixel.ts"],"sourcesContent":["import { NON_AD_EVENTS, type OAIQ, type OAIQUser, mapOAIEvent } from '../track/oaiq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport { getFirst } from '../utils/field';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n  // oxlint-disable-next-line typescript/no-empty-object-type\n  interface Window extends OAIQ {}\n}\n\n/** Drop `undefined` fields so the SDK only receives populated values. */\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nfunction clean(value: unknown): any {\n  return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * Forward an internal track event to the OpenAI measurement pixel.\n * `eventId` is reused as the OpenAI `event_id` so browser events deduplicate against the\n * Conversions API. https://developers.openai.com/ads/measurement-pixel\n */\nexport function sendOpenAIEvent<T extends EventName>(\n  name: TrackName<T>,\n  properties?: TrackProperties<T>,\n  eventId?: string\n) {\n  if (typeof window === 'undefined' || !window.oaiq) {\n    console.warn('oaiq has not been initialized');\n    return;\n  }\n  if (NON_AD_EVENTS.includes(name)) return;\n  if (window.location.host.includes('127.0.0.1')) return;\n  if (window.location.host.includes('localhost')) return;\n\n  const { type, data } = mapOAIEvent(name, properties);\n  if (type === 'custom') {\n    window.oaiq('measure', 'custom', clean(data), { event_id: eventId, custom_event_name: name });\n  } else {\n    window.oaiq('measure', type, clean(data), { event_id: eventId });\n  }\n}\n\n/** SHA-256 hex digest, lowercase — the format OpenAI expects for hashed identity fields. */\nasync function sha256(value: string): Promise<string> {\n  const bytes = new TextEncoder().encode(value);\n  const digest = await crypto.subtle.digest('SHA-256', bytes);\n  return Array.from(new Uint8Array(digest))\n    .map((byte) => byte.toString(16).padStart(2, '0'))\n    .join('');\n}\n\n/**\n * Re-initialize the pixel with hashed user identity for better conversion matching. Email and\n * external id are hashed client-side; geographic fields are sent raw. Hashing is asynchronous,\n * so the `init` call is deferred until the digests resolve.\n */\nexport function setOpenAIUser(pixelId: string) {\n  return ({ user_id, data }: UpdateVisitorDTO) => {\n    if (typeof window === 'undefined' || !window.oaiq) {\n      console.warn('oaiq has not been initialized');\n      return;\n    }\n\n    const email = getFirst(data?.email)?.trim().toLowerCase();\n    const address = getFirst(data?.address);\n\n    const base: OAIQUser = {\n      country: address?.country?.trim().toUpperCase(),\n      city: address?.city?.trim().toLowerCase(),\n      zip_code: address?.postal_code,\n    };\n\n    const init = (hashed: Partial<OAIQUser>) => {\n      window.oaiq('init', { pixelId, user: clean({ ...base, ...hashed }) });\n    };\n\n    Promise.all([email ? sha256(email) : undefined, user_id ? sha256(user_id) : undefined])\n      .then(([email_sha256, external_id_sha256]) => init({ email_sha256, external_id_sha256 }))\n      .catch(() => init({}));\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAqE;AAErE,mBAAyB;AAUzB,SAAS,MAAM,OAAqB;AAClC,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAOO,SAAS,gBACd,MACA,YACA,SACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,MAAM;AACjD,YAAQ,KAAK,+BAA+B;AAC5C;AAAA,EACF;AACA,MAAI,0BAAc,SAAS,IAAI,EAAG;AAClC,MAAI,OAAO,SAAS,KAAK,SAAS,WAAW,EAAG;AAChD,MAAI,OAAO,SAAS,KAAK,SAAS,WAAW,EAAG;AAEhD,QAAM,EAAE,MAAM,KAAK,QAAI,yBAAY,MAAM,UAAU;AACnD,MAAI,SAAS,UAAU;AACrB,WAAO,KAAK,WAAW,UAAU,MAAM,IAAI,GAAG,EAAE,UAAU,SAAS,mBAAmB,KAAK,CAAC;AAAA,EAC9F,OAAO;AACL,WAAO,KAAK,WAAW,MAAM,MAAM,IAAI,GAAG,EAAE,UAAU,QAAQ,CAAC;AAAA,EACjE;AACF;AAGA,eAAe,OAAO,OAAgC;AACpD,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC5C,QAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,SAAO,MAAM,KAAK,IAAI,WAAW,MAAM,CAAC,EACrC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE;AACZ;AAOO,SAAS,cAAc,SAAiB;AAC7C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAzDlD;AA0DI,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,MAAM;AACjD,cAAQ,KAAK,+BAA+B;AAC5C;AAAA,IACF;AAEA,UAAM,SAAQ,gCAAS,6BAAM,KAAK,MAApB,mBAAuB,OAAO;AAC5C,UAAM,cAAU,uBAAS,6BAAM,OAAO;AAEtC,UAAM,OAAiB;AAAA,MACrB,UAAS,wCAAS,YAAT,mBAAkB,OAAO;AAAA,MAClC,OAAM,wCAAS,SAAT,mBAAe,OAAO;AAAA,MAC5B,UAAU,mCAAS;AAAA,IACrB;AAEA,UAAM,OAAO,CAAC,WAA8B;AAC1C,aAAO,KAAK,QAAQ,EAAE,SAAS,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IACtE;AAEA,YAAQ,IAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,QAAW,UAAU,OAAO,OAAO,IAAI,MAAS,CAAC,EACnF,KAAK,CAAC,CAAC,cAAc,kBAAkB,MAAM,KAAK,EAAE,cAAc,mBAAmB,CAAC,CAAC,EACvF,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,EACzB;AACF;","names":[]}