consentlayer 0.0.0-stage → 1.0.0-rc.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -2
  3. package/dist/adapters/google-consent-mode.d.ts +20 -0
  4. package/dist/adapters/google-consent-mode.js +18 -0
  5. package/dist/adapters/google-consent-mode.js.map +1 -0
  6. package/dist/adapters/shopify.d.ts +49 -0
  7. package/dist/adapters/shopify.js +85 -0
  8. package/dist/adapters/shopify.js.map +1 -0
  9. package/dist/adapters/tcf.d.ts +20 -0
  10. package/dist/adapters/tcf.js +64 -0
  11. package/dist/adapters/tcf.js.map +1 -0
  12. package/dist/analytics-provider-07mxUgIK.d.ts +36 -0
  13. package/dist/angular.d.ts +56 -0
  14. package/dist/angular.js +120 -0
  15. package/dist/angular.js.map +1 -0
  16. package/dist/auto-tracking.d.ts +11 -0
  17. package/dist/auto-tracking.js +72 -0
  18. package/dist/auto-tracking.js.map +1 -0
  19. package/dist/chunk-7XLGT6U3.js +34 -0
  20. package/dist/chunk-7XLGT6U3.js.map +1 -0
  21. package/dist/chunk-BWPWDN4G.js +61 -0
  22. package/dist/chunk-BWPWDN4G.js.map +1 -0
  23. package/dist/chunk-DK45XPEY.js +77 -0
  24. package/dist/chunk-DK45XPEY.js.map +1 -0
  25. package/dist/chunk-ETU64ZV3.js +98 -0
  26. package/dist/chunk-ETU64ZV3.js.map +1 -0
  27. package/dist/chunk-FDJMIJFV.js +367 -0
  28. package/dist/chunk-FDJMIJFV.js.map +1 -0
  29. package/dist/chunk-HJGBVDPM.js +47 -0
  30. package/dist/chunk-HJGBVDPM.js.map +1 -0
  31. package/dist/chunk-J3KUPF4R.js +69 -0
  32. package/dist/chunk-J3KUPF4R.js.map +1 -0
  33. package/dist/chunk-LBEIEAJX.js +55 -0
  34. package/dist/chunk-LBEIEAJX.js.map +1 -0
  35. package/dist/chunk-LEAQJXJU.js +582 -0
  36. package/dist/chunk-LEAQJXJU.js.map +1 -0
  37. package/dist/chunk-R6I7OYQB.js +69 -0
  38. package/dist/chunk-R6I7OYQB.js.map +1 -0
  39. package/dist/chunk-RK2M57GW.js +54 -0
  40. package/dist/chunk-RK2M57GW.js.map +1 -0
  41. package/dist/chunk-RZ4TYRNY.js +128 -0
  42. package/dist/chunk-RZ4TYRNY.js.map +1 -0
  43. package/dist/chunk-TVSZJLRC.js +112 -0
  44. package/dist/chunk-TVSZJLRC.js.map +1 -0
  45. package/dist/chunk-TYOQYV45.js +79 -0
  46. package/dist/chunk-TYOQYV45.js.map +1 -0
  47. package/dist/chunk-UAIZU5WD.js +52 -0
  48. package/dist/chunk-UAIZU5WD.js.map +1 -0
  49. package/dist/chunk-VIIGBALD.js +14 -0
  50. package/dist/chunk-VIIGBALD.js.map +1 -0
  51. package/dist/consent-controller-DyHPNfyT.d.ts +47 -0
  52. package/dist/consentlayer-banner.global.js +20 -0
  53. package/dist/consentlayer.global.js +9 -0
  54. package/dist/create-analytics-Bzvm1UpE.d.ts +44 -0
  55. package/dist/ecommerce.d.ts +41 -0
  56. package/dist/ecommerce.js +43 -0
  57. package/dist/ecommerce.js.map +1 -0
  58. package/dist/index.d.ts +58 -0
  59. package/dist/index.js +42 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/next.d.ts +16 -0
  62. package/dist/next.js +27 -0
  63. package/dist/next.js.map +1 -0
  64. package/dist/nuxt/config.d.ts +7 -0
  65. package/dist/nuxt/config.js +6 -0
  66. package/dist/nuxt/config.js.map +1 -0
  67. package/dist/nuxt/index.d.ts +11 -0
  68. package/dist/nuxt/index.js +35 -0
  69. package/dist/nuxt/index.js.map +1 -0
  70. package/dist/nuxt/plugin.d.ts +5 -0
  71. package/dist/nuxt/plugin.js +24 -0
  72. package/dist/nuxt/plugin.js.map +1 -0
  73. package/dist/providers/contentsquare.d.ts +27 -0
  74. package/dist/providers/contentsquare.js +58 -0
  75. package/dist/providers/contentsquare.js.map +1 -0
  76. package/dist/providers/ga4.d.ts +46 -0
  77. package/dist/providers/ga4.js +3 -0
  78. package/dist/providers/ga4.js.map +1 -0
  79. package/dist/providers/gtm.d.ts +28 -0
  80. package/dist/providers/gtm.js +83 -0
  81. package/dist/providers/gtm.js.map +1 -0
  82. package/dist/providers/hotjar.d.ts +38 -0
  83. package/dist/providers/hotjar.js +68 -0
  84. package/dist/providers/hotjar.js.map +1 -0
  85. package/dist/providers/meta.d.ts +42 -0
  86. package/dist/providers/meta.js +65 -0
  87. package/dist/providers/meta.js.map +1 -0
  88. package/dist/providers/posthog.d.ts +42 -0
  89. package/dist/providers/posthog.js +91 -0
  90. package/dist/providers/posthog.js.map +1 -0
  91. package/dist/providers/sentry.d.ts +38 -0
  92. package/dist/providers/sentry.js +82 -0
  93. package/dist/providers/sentry.js.map +1 -0
  94. package/dist/providers/tiktok.d.ts +46 -0
  95. package/dist/providers/tiktok.js +72 -0
  96. package/dist/providers/tiktok.js.map +1 -0
  97. package/dist/providers/vercel.d.ts +14 -0
  98. package/dist/providers/vercel.js +17 -0
  99. package/dist/providers/vercel.js.map +1 -0
  100. package/dist/react/index.d.ts +78 -0
  101. package/dist/react/index.js +79 -0
  102. package/dist/react/index.js.map +1 -0
  103. package/dist/sentry/next.d.ts +1 -0
  104. package/dist/sentry/next.js +3 -0
  105. package/dist/sentry/next.js.map +1 -0
  106. package/dist/sentry/server.d.ts +24 -0
  107. package/dist/sentry/server.js +28 -0
  108. package/dist/sentry/server.js.map +1 -0
  109. package/dist/sentry-replay-HSFVEFCM.js +3 -0
  110. package/dist/sentry-replay-HSFVEFCM.js.map +1 -0
  111. package/dist/sentry-sdk-YQOGKGWD.js +3 -0
  112. package/dist/sentry-sdk-YQOGKGWD.js.map +1 -0
  113. package/dist/sentry-tracing-KWT7ITHF.js +3 -0
  114. package/dist/sentry-tracing-KWT7ITHF.js.map +1 -0
  115. package/dist/server/ga4.d.ts +15 -0
  116. package/dist/server/ga4.js +29 -0
  117. package/dist/server/ga4.js.map +1 -0
  118. package/dist/server/index.d.ts +116 -0
  119. package/dist/server/index.js +206 -0
  120. package/dist/server/index.js.map +1 -0
  121. package/dist/server/meta.d.ts +14 -0
  122. package/dist/server/meta.js +63 -0
  123. package/dist/server/meta.js.map +1 -0
  124. package/dist/server/sgtm.d.ts +18 -0
  125. package/dist/server/sgtm.js +34 -0
  126. package/dist/server/sgtm.js.map +1 -0
  127. package/dist/server/tiktok.d.ts +15 -0
  128. package/dist/server/tiktok.js +64 -0
  129. package/dist/server/tiktok.js.map +1 -0
  130. package/dist/solid.d.ts +59 -0
  131. package/dist/solid.js +3 -0
  132. package/dist/solid.js.map +1 -0
  133. package/dist/solidstart.d.ts +16 -0
  134. package/dist/solidstart.js +22 -0
  135. package/dist/solidstart.js.map +1 -0
  136. package/dist/svelte/GtmNoscript.svelte +18 -0
  137. package/dist/svelte/MetaPixelNoscript.svelte +18 -0
  138. package/dist/svelte.d.ts +55 -0
  139. package/dist/svelte.js +3 -0
  140. package/dist/svelte.js.map +1 -0
  141. package/dist/sveltekit.d.ts +18 -0
  142. package/dist/sveltekit.js +16 -0
  143. package/dist/sveltekit.js.map +1 -0
  144. package/dist/testing.d.ts +11 -0
  145. package/dist/testing.js +50 -0
  146. package/dist/testing.js.map +1 -0
  147. package/dist/types-BV_AFZKQ.d.ts +407 -0
  148. package/dist/vue.d.ts +92 -0
  149. package/dist/vue.js +97 -0
  150. package/dist/vue.js.map +1 -0
  151. package/package.json +281 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/storage.ts","../src/core/analytics-manager.ts"],"names":["stored"],"mappings":"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","file":"chunk-LEAQJXJU.js","sourcesContent":["import type { ConsentState, ConsentStorageAdapter, StoredConsent, IdentityStorageAdapter, UserIdentity } from './types'\nimport { legacyStorageKeysFor } from './names'\nimport { isBrowser, normalizeIdentity, safeJsonParse } from './utils'\n\nexport type LocalStorageAdapterOptions = {\n key: string\n /** Keys to move an existing value from. Defaults to the legacy `acm_*` key when `key` is the configured one. */\n legacyKeys?: string[]\n storage?: Storage\n window?: Window\n}\n\n/** Consent in localStorage, synced across tabs. Never throws when storage is blocked or full. */\nexport function createLocalStorageConsentStorage(options: LocalStorageAdapterOptions): ConsentStorageAdapter {\n return {\n read() {\n return withStorage(\n options,\n (storage) => toRecord(safeJsonParse<StoredConsent | ConsentState>(readMigrating(storage, options))),\n null,\n )\n },\n write(record) {\n withStorage(\n options,\n (storage) => (record ? storage.setItem(options.key, JSON.stringify(record)) : storage.removeItem(options.key)),\n undefined,\n )\n },\n subscribe(listener) {\n const win = options.window ?? (isBrowser() ? window : undefined)\n if (!win) return () => undefined\n const handleStorage = (event: StorageEvent) => {\n if (event.key === options.key) listener()\n }\n win.addEventListener('storage', handleStorage)\n return () => win.removeEventListener('storage', handleStorage)\n },\n clear() {\n withStorage(options, (storage) => storage.removeItem(options.key), undefined)\n },\n }\n}\n\n/** Visitor identity in localStorage. Never throws when storage is blocked or full. */\nexport function createLocalStorageIdentityStorage(options: LocalStorageAdapterOptions): IdentityStorageAdapter {\n return {\n read() {\n return withStorage(\n options,\n (storage) => normalizeIdentity(safeJsonParse<UserIdentity>(readMigrating(storage, options)) ?? {}),\n {},\n )\n },\n write(identity) {\n withStorage(\n options,\n (storage) => storage.setItem(options.key, JSON.stringify(normalizeIdentity(identity))),\n undefined,\n )\n },\n clear() {\n withStorage(\n options,\n (storage) => {\n for (const key of [options.key, ...(options.legacyKeys ?? legacyStorageKeysFor(options.key))]) {\n storage.removeItem(key)\n }\n },\n undefined,\n )\n },\n }\n}\n\n/** Consent kept in memory only, e.g. for tests or when you store it yourself. */\nexport function createMemoryConsentStorage(initial: ConsentState | null = null): ConsentStorageAdapter {\n let value = toRecord(initial)\n const listeners = new Set<() => void>()\n return {\n read() {\n return value\n },\n write(record) {\n value = record\n listeners.forEach((listener) => listener())\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n clear() {\n value = null\n listeners.forEach((listener) => listener())\n },\n }\n}\n\n/** Identity kept in memory only. */\nexport function createMemoryIdentityStorage(initial: UserIdentity = {}): IdentityStorageAdapter {\n let value = normalizeIdentity(initial)\n return {\n read() {\n return value\n },\n write(identity) {\n value = normalizeIdentity(identity)\n },\n clear() {\n value = {}\n },\n }\n}\n\n/** Values written before 1.0 are the bare `ConsentState`. */\nfunction toRecord(value: StoredConsent | ConsentState | null): StoredConsent | null {\n if (!value || typeof value !== 'object') return null\n return 'consent' in value && typeof value.consent === 'object' ? value : { consent: value as ConsentState }\n}\n\nfunction readMigrating(\n storage: Storage,\n { key, legacyKeys = legacyStorageKeysFor(key) }: LocalStorageAdapterOptions,\n): string | null {\n const value = storage.getItem(key)\n if (value !== null) return value\n for (const legacyKey of legacyKeys) {\n const legacyValue = storage.getItem(legacyKey)\n if (legacyValue === null) continue\n storage.setItem(key, legacyValue)\n storage.removeItem(legacyKey)\n return legacyValue\n }\n return null\n}\n\n/** Blocked storage (sandboxed iframes, \"block all cookies\") and a full quota throw; consent then lives in memory only. */\nfunction withStorage<T>(options: LocalStorageAdapterOptions, run: (storage: Storage) => T, fallback: T): T {\n try {\n const storage = options.storage ?? (isBrowser() ? window.localStorage : undefined)\n return storage ? run(storage) : fallback\n } catch {\n return fallback\n }\n}\n","import type {\n AnalyticsError,\n AnalyticsEventPayload,\n AnalyticsManager,\n AnalyticsManagerOptions,\n AnalyticsManagerStateSnapshot,\n AnalyticsPlugin,\n DebugTopic,\n LoadTiming,\n PluginContext,\n ServerEvent,\n UserIdentity,\n UserTraits,\n} from './types'\nimport { createMemoryIdentityStorage } from './storage'\nimport {\n createEventId,\n createDebugLog,\n getWindowLocation,\n hasRequiredConsent,\n isBrowser,\n normalizeIdentity,\n} from './utils'\nimport { assertHttpsOrRelativeUrl } from './validation'\n\ntype ProviderState = {\n plugin: AnalyticsPlugin\n setup: boolean\n loaded: boolean\n active: boolean\n /** Calls held while a deferred `load` is pending. */\n backlog?: Array<() => Promise<unknown>>\n}\n\ntype HookName = Exclude<keyof AnalyticsPlugin, 'id' | 'requiredConsent' | 'loadBeforeConsent' | 'defer'>\n\nconst LIFECYCLE_HOOKS = new Set<HookName>(['setup', 'consent', 'load', 'teardown'])\nconst HOOK_TOPICS: Record<HookName, DebugTopic> = {\n setup: 'providers',\n consent: 'providers',\n load: 'providers',\n teardown: 'providers',\n page: 'events',\n track: 'events',\n identify: 'events',\n group: 'events',\n reset: 'events',\n error: 'errors',\n}\nconst INTERACTIONS = ['pointerdown', 'keydown', 'scroll', 'touchstart'] as const\n\nfunction whenDue(timing: Exclude<LoadTiming, false>, signal: AbortSignal): Promise<void> {\n if (!isBrowser()) return Promise.resolve()\n return new Promise((resolve) => {\n if (typeof timing === 'number') {\n window.setTimeout(resolve, timing)\n } else if (timing === 'idle') {\n if (typeof window.requestIdleCallback === 'function') {\n window.requestIdleCallback(() => resolve(), { timeout: 5000 })\n } else window.setTimeout(resolve, 1)\n } else {\n const done = () => {\n for (const type of INTERACTIONS) window.removeEventListener(type, done)\n resolve()\n }\n for (const type of INTERACTIONS) {\n window.addEventListener(type, done, { once: true, passive: true, signal })\n }\n }\n })\n}\n\nexport function createAnalyticsManager(options: AnalyticsManagerOptions = {}): AnalyticsManager {\n if (options.autoTracking !== undefined && typeof options.autoTracking !== 'function') {\n throw new Error('[consentlayer] autoTracking must be autoTracking() from consentlayer/auto-tracking')\n }\n const debugLog = createDebugLog(options.debug)\n const listeners = new Set<(snapshot: AnalyticsManagerStateSnapshot) => void>()\n const providerStates = new Map<string, ProviderState>()\n const identityStorage = options.identityStorage ?? createMemoryIdentityStorage()\n let consent = options.consent ?? options.consentEngine?.getConsent() ?? null\n const stored = identityStorage.read()\n let identity: UserIdentity = stored.userId ? { userId: stored.userId } : {}\n let storedContact: UserIdentity | undefined = stored.email || stored.phone ? stored : undefined\n const settleStoredContact = () => {\n if (!storedContact || !consent) return\n if (consent.marketing && identity.userId === storedContact.userId) {\n identity = { ...storedContact, ...identity }\n }\n storedContact = undefined\n }\n settleStoredContact()\n const pending: Array<() => Promise<unknown>> = []\n let booted = false\n let ready = false\n let identifyQueued = false\n let destroyed = false\n const lifetime = new AbortController()\n let lifecycleQueue = Promise.resolve()\n let unsubscribeConsent: (() => void) | undefined\n let pageSession: (() => void) | undefined\n\n const snapshot = (): AnalyticsManagerStateSnapshot => ({\n booted,\n consent,\n activeProviders: [...providerStates.values()].filter((state) => state.active).map((state) => state.plugin.id),\n })\n\n let currentSnapshot = snapshot()\n\n const refreshSnapshot = () => {\n currentSnapshot = snapshot()\n }\n\n const notify = () => {\n refreshSnapshot()\n listeners.forEach((listener) => listener(currentSnapshot))\n }\n\n const runtimeEnabled = () => {\n if (typeof options.enabled === 'function') return options.enabled()\n if (typeof options.enabled === 'boolean') return options.enabled\n return true\n }\n\n const emitError = (error: AnalyticsError) => {\n debugLog('errors', error.providerId, `[${error.scope}] ${error.message}`, error.cause)\n try {\n options.onError?.(error)\n } catch (handlerError) {\n debugLog('errors', undefined, 'onError handler threw', handlerError)\n }\n }\n\n // ponytail: fixed cap so a runaway caller can't grow memory; overflow is reported once per queue\n const overflowed = new WeakSet<unknown[]>()\n const enqueue = (queue: Array<() => Promise<unknown>>, run: () => Promise<unknown>, providerId?: string) => {\n if (queue.length < 100) {\n queue.push(run)\n } else if (!overflowed.has(queue)) {\n overflowed.add(queue)\n emitError({\n scope: 'queue-full',\n providerId,\n message: `100 calls are already waiting ${providerId ? `for ${providerId} to load` : 'for boot'}; later ones are dropped`,\n })\n }\n }\n\n const providerEmitError = (providerId: string) => (error: AnalyticsError) =>\n emitError({ ...error, providerId: error.providerId ?? providerId })\n\n let serverEndpoint = options.server?.endpoint\n ? assertHttpsOrRelativeUrl(options.server.endpoint, 'server.endpoint')\n : undefined\n const consentEndpoint = options.server?.consentEndpoint\n ? assertHttpsOrRelativeUrl(options.server.consentEndpoint, 'server.consentEndpoint')\n : undefined\n let restoring = false\n\n const restoreConsentCookie = () => {\n if (!consentEndpoint || restoring) return\n restoring = true\n fetch(consentEndpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ consent, restored: true }),\n })\n .then((response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`)\n })\n .catch((cause: unknown) =>\n emitError({\n scope: 'server-forward',\n message: `Restoring the consent cookie at ${consentEndpoint} failed`,\n cause,\n }),\n )\n }\n\n const forward = (event: Omit<ServerEvent, 'consent' | 'identity'>) => {\n if (!serverEndpoint || !(consent?.analytics || consent?.marketing)) return\n const body = JSON.stringify({ ...event, consent, identity: sharedIdentity() })\n const fail = (cause: unknown) =>\n emitError({ scope: 'server-forward', message: `Sending ${event.name} to ${serverEndpoint} failed`, cause })\n if (typeof fetch !== 'function') {\n if (!navigator.sendBeacon(serverEndpoint, new Blob([body], { type: 'application/json' }))) {\n fail(undefined)\n }\n return\n }\n fetch(serverEndpoint, {\n method: 'POST',\n keepalive: true,\n headers: { 'content-type': 'application/json' },\n body,\n })\n .then((response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`)\n if (response.headers.get('consentlayer-forwarding') === 'off') serverEndpoint = undefined\n if (response.headers.get('consentlayer-consent') === 'missing') restoreConsentCookie()\n })\n .catch(fail)\n }\n\n const sharedIdentity = (): UserIdentity =>\n consent?.marketing ? identity : identity.userId ? { userId: identity.userId } : {}\n\n const persistIdentity = () => {\n const stored = sharedIdentity()\n if (Object.keys(stored).length && (consent?.analytics || consent?.marketing)) identityStorage.write(stored)\n else identityStorage.clear?.()\n }\n\n const context = (providerId: string): PluginContext => ({\n consent,\n identity: sharedIdentity(),\n debug: Boolean(options.debug),\n log: (message, ...data) => debugLog('providers', providerId, message, ...data),\n emitError: providerEmitError(providerId),\n })\n\n const call = async (\n state: ProviderState,\n hook: HookName,\n run: (plugin: AnalyticsPlugin, ctx: PluginContext) => Promise<void> | void,\n ...detail: unknown[]\n ): Promise<boolean> => {\n if (destroyed) return false\n const { plugin } = state\n if (state.backlog && !LIFECYCLE_HOOKS.has(hook)) {\n enqueue(state.backlog, () => call(state, hook, run, ...detail), plugin.id)\n return Boolean(plugin[hook])\n }\n if (plugin[hook]) debugLog(HOOK_TOPICS[hook], plugin.id, `${plugin.id}.${hook}`, ...detail)\n try {\n await run(plugin, context(plugin.id))\n } catch (error) {\n emitError({\n scope: hook === 'reset' || hook === 'group' ? 'provider-identify' : `provider-${hook}`,\n providerId: plugin.id,\n message: `${plugin.id}.${hook} failed`,\n cause: error,\n })\n }\n return Boolean(plugin[hook])\n }\n\n const ensureProviderState = (plugin: AnalyticsPlugin): ProviderState => {\n const existing = providerStates.get(plugin.id)\n if (existing) {\n if (existing.plugin !== plugin) {\n emitError({\n scope: 'provider-setup',\n providerId: plugin.id,\n message: `Another provider already uses the id \"${plugin.id}\"; this one is ignored`,\n })\n }\n return existing\n }\n const created: ProviderState = { plugin, setup: false, loaded: false, active: false }\n providerStates.set(plugin.id, created)\n return created\n }\n\n const teardown = async (state: ProviderState) => {\n if (!state.active) return\n state.active = false\n await call(state, 'teardown', (plugin, ctx) => plugin.teardown?.(ctx))\n }\n\n const setupProvider = async (state: ProviderState) => {\n if (state.setup) return\n state.setup = true\n await call(state, 'setup', (p, ctx) => p.setup?.(ctx))\n }\n\n const evaluateProvider = async (state: ProviderState) => {\n if (!booted || !runtimeEnabled()) return teardown(state)\n const { plugin } = state\n const allowed = hasRequiredConsent(consent, plugin.requiredConsent)\n await setupProvider(state)\n await call(state, 'consent', (p, ctx) => p.consent?.(ctx))\n if (!state.loaded && (allowed || plugin.loadBeforeConsent)) {\n state.loaded = true\n if (plugin.defer) deferLoad(state, plugin.defer)\n else await call(state, 'load', (p, ctx) => p.load?.(ctx))\n }\n if (!allowed) return teardown(state)\n if (state.active) return\n state.active = true\n if (Object.keys(sharedIdentity()).length && !identifyQueued) {\n await call(state, 'identify', (p, ctx) => p.identify?.(sharedIdentity(), {}, ctx))\n }\n }\n\n const deferLoad = (state: ProviderState, timing: Exclude<LoadTiming, false>) => {\n state.backlog = []\n void whenDue(timing, lifetime.signal).then(() => {\n lifecycleQueue = lifecycleQueue.then(async () => {\n const backlog = state.backlog ?? []\n state.backlog = undefined\n if (!state.active && !state.plugin.loadBeforeConsent) {\n state.loaded = false\n return\n }\n await call(state, 'load', (p, ctx) => p.load?.(ctx))\n for (const run of backlog) if (state.active) await run()\n })\n })\n }\n\n const runLifecycle = async () => {\n const evaluated = consent\n for (const state of providerStates.values()) {\n await evaluateProvider(state)\n }\n if (options.autoTracking && !pageSession && booted && evaluated?.analytics && isBrowser()) {\n pageSession = () => {}\n try {\n pageSession = options.autoTracking({ track: api.track, signal: lifetime.signal })\n pageSession()\n } catch (cause) {\n emitError({ scope: 'auto-tracking', message: 'Auto-tracking failed to start', cause })\n }\n }\n notify()\n }\n\n const queueLifecycle = async () => {\n lifecycleQueue = lifecycleQueue.then(runLifecycle)\n await lifecycleQueue\n }\n\n const labelTopic = (label: string): DebugTopic => (label === 'captureError' ? 'errors' : 'events')\n\n const trackAgainstProviders = async (\n label: string,\n selectedProviderIds: string[] | undefined,\n callback: (state: ProviderState) => Promise<boolean>,\n serverEvent?: () => Omit<ServerEvent, 'consent' | 'identity'> | undefined,\n ) => {\n if (destroyed) return\n if (!runtimeEnabled()) return debugLog(labelTopic(label), undefined, `${label} dropped: enabled is false`)\n if (!ready) {\n debugLog(labelTopic(label), undefined, `${label} held until boot`)\n enqueue(pending, () => deliver(label, selectedProviderIds, callback, serverEvent))\n return\n }\n await deliver(label, selectedProviderIds, callback, serverEvent)\n }\n\n const deliver = async (\n label: string,\n selectedProviderIds: string[] | undefined,\n callback: (state: ProviderState) => Promise<boolean>,\n serverEvent?: () => Omit<ServerEvent, 'consent' | 'identity'> | undefined,\n ) => {\n if (destroyed) return\n const event = serverEvent?.()\n if (event) forward(event)\n let reached = 0\n for (const state of providerStates.values()) {\n if (!state.active) continue\n if (!hasRequiredConsent(consent, state.plugin.requiredConsent)) continue\n if (selectedProviderIds && !selectedProviderIds.includes(state.plugin.id)) {\n continue\n }\n if (await callback(state)) reached += 1\n }\n if (!reached) debugLog(labelTopic(label), undefined, `${label} reached no provider`)\n }\n\n const identifyProviders = (traits: UserTraits, only?: string[]) =>\n trackAgainstProviders('identify', only, (state) =>\n call(state, 'identify', (p, ctx) => p.identify?.(sharedIdentity(), traits, ctx), traits),\n )\n\n if (options.consentEngine) {\n unsubscribeConsent = options.consentEngine.subscribe(({ consent: nextConsent }) => {\n void api.updateConsent(nextConsent)\n })\n }\n\n for (const provider of options.providers ?? []) {\n const state = ensureProviderState(provider)\n if (isBrowser() && runtimeEnabled()) void setupProvider(state)\n }\n\n const errorsEnabled = options.errors !== false\n const reportedErrors = new WeakSet<object>()\n const onWindowError = (event: ErrorEvent) =>\n void api.captureError(event.error ?? event.message, { source: 'global', level: 'fatal' })\n const onRejection = (event: PromiseRejectionEvent) => void api.captureError(event.reason, { source: 'global' })\n const globalHandlers =\n errorsEnabled && isBrowser() && !(typeof options.errors === 'object' && options.errors.globalHandlers === false)\n\n const api: AnalyticsManager = {\n async boot() {\n if (destroyed || booted) return\n booted = true\n debugLog('providers', undefined, 'boot')\n if (globalHandlers) {\n window.addEventListener('error', onWindowError)\n window.addEventListener('unhandledrejection', onRejection)\n }\n await queueLifecycle()\n for (let run = pending.shift(); run; run = pending.shift()) await run()\n ready = true\n identifyQueued = false\n },\n registerProvider(provider) {\n const state = ensureProviderState(provider)\n if (booted) void queueLifecycle()\n else notify()\n return () => {\n if (!providerStates.has(provider.id)) return\n void teardown(state)\n providerStates.delete(provider.id)\n notify()\n }\n },\n async updateConsent(nextConsent) {\n const hadMarketing = Boolean(consent?.marketing)\n const hadContact = Boolean(identity.email || identity.phone)\n const wasActive = [...providerStates.values()].filter((state) => state.active).map((state) => state.plugin.id)\n consent = nextConsent\n if (!nextConsent) storedContact = undefined\n settleStoredContact()\n if (nextConsent && !nextConsent.marketing) {\n identity = identity.userId ? { userId: identity.userId } : {}\n }\n persistIdentity()\n await queueLifecycle()\n if (!hadContact || hadMarketing === Boolean(nextConsent?.marketing)) return\n if (hadMarketing) {\n for (const state of providerStates.values()) {\n if (state.active) await call(state, 'identify', (p, ctx) => p.identify?.(sharedIdentity(), {}, ctx))\n else if (state.setup) await call(state, 'reset', (p, ctx) => p.reset?.(ctx))\n }\n } else if (wasActive.length) {\n await identifyProviders({}, wasActive)\n }\n },\n getConsent() {\n return consent\n },\n async page(payload = {}, { only, server } = {}) {\n const page = { ...getWindowLocation(), ...payload, id: createEventId() }\n await trackAgainstProviders(\n 'page',\n only,\n (state) => call(state, 'page', (p, ctx) => p.page?.(page, ctx), page),\n () =>\n server === false\n ? undefined\n : { id: page.id, name: 'page_view', url: page.url, only: server ? undefined : only },\n )\n },\n async track(name, params, optionsInput = {}) {\n const event: AnalyticsEventPayload = {\n id: optionsInput.eventId ?? createEventId(),\n name,\n params: params ?? {},\n options: optionsInput,\n }\n const allowed = () =>\n !(optionsInput.requireAnalyticsConsent && !consent?.analytics) &&\n !(optionsInput.requireMarketingConsent && !consent?.marketing)\n await trackAgainstProviders(\n name,\n optionsInput.only,\n async (state) =>\n allowed() &&\n (await call(state, 'track', (p, ctx) => (allowed() ? p.track?.(event, ctx) : undefined), name, event.params)),\n () =>\n allowed()\n ? {\n id: event.id,\n name,\n params: event.params,\n url: getWindowLocation().url,\n only: optionsInput.only,\n providers: optionsInput.providers,\n }\n : undefined,\n )\n },\n async identify(userId, traits = {}) {\n if (userId && userId !== identity.userId) identity = {}\n identity = {\n ...identity,\n ...normalizeIdentity({ userId, email: traits.email, phone: traits.phone }),\n }\n persistIdentity()\n if (!ready) identifyQueued = true\n await identifyProviders(\n Object.fromEntries(Object.entries(traits).filter(([key]) => key !== 'email' && key !== 'phone')),\n )\n },\n async reset() {\n identity = {}\n storedContact = undefined\n identityStorage.clear?.()\n for (const state of providerStates.values()) {\n if (!state.setup) continue\n await call(state, 'reset', (p, ctx) => p.reset?.(ctx))\n }\n },\n async group(groupId, traits = {}) {\n await trackAgainstProviders('group', undefined, (state) =>\n call(state, 'group', (p, ctx) => p.group?.(groupId, traits, ctx), groupId, traits),\n )\n },\n async captureError(error, errorContext = {}) {\n if (!errorsEnabled) return\n if (typeof error === 'object' && error !== null) {\n if (reportedErrors.has(error)) return\n reportedErrors.add(error)\n }\n const captured = { source: 'manual' as const, ...errorContext }\n await trackAgainstProviders('captureError', undefined, (state) =>\n call(state, 'error', (p, ctx) => p.error?.(error, captured, ctx), error),\n )\n },\n newPageSession() {\n try {\n pageSession?.()\n } catch (cause) {\n emitError({ scope: 'auto-tracking', message: 'Auto-tracking failed to start a page session', cause })\n }\n },\n getSnapshot() {\n return currentSnapshot\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n destroy() {\n for (const state of providerStates.values()) void teardown(state)\n destroyed = true\n lifetime.abort()\n unsubscribeConsent?.()\n if (globalHandlers) {\n window.removeEventListener('error', onWindowError)\n window.removeEventListener('unhandledrejection', onRejection)\n }\n providerStates.clear()\n listeners.clear()\n },\n }\n\n return api\n}\n"]}
@@ -0,0 +1,69 @@
1
+ // src/core/names.ts
2
+ var DEFAULT_PREFIX = "consentlayer";
3
+ function derive(prefix, legacy) {
4
+ const upper = prefix.toUpperCase();
5
+ return {
6
+ prefix,
7
+ legacy,
8
+ consentStorageKey: `${prefix}_consent`,
9
+ identityStorageKey: `${prefix}_user_identity`,
10
+ consentEventName: `${prefix}:consent`,
11
+ consentGlobalKey: `${upper}_CONSENT`,
12
+ openConsentGlobalKey: `${upper}_openConsent`,
13
+ autoTrackingEvents: {
14
+ pageSessionStart: `${prefix}.page_session_start`,
15
+ scrollDepth: `${prefix}.scroll_depth`,
16
+ timeOnPage: `${prefix}.time_on_page`,
17
+ uiClick: `${prefix}.ui_click`
18
+ }
19
+ };
20
+ }
21
+ var legacyNames = derive("acm", false);
22
+ var current = derive(DEFAULT_PREFIX, false);
23
+ function configureNames(input = {}) {
24
+ const base = derive(input.prefix ?? DEFAULT_PREFIX, input.legacy ?? false);
25
+ const overrides = Object.fromEntries(Object.entries(input).filter(([, value]) => value !== void 0));
26
+ current = {
27
+ ...base,
28
+ ...overrides,
29
+ autoTrackingEvents: {
30
+ ...base.autoTrackingEvents,
31
+ ...input.autoTrackingEvents
32
+ }
33
+ };
34
+ return current;
35
+ }
36
+ function getNames() {
37
+ return current;
38
+ }
39
+ function legacyStorageKeysFor(key) {
40
+ if (!current.legacy) return [];
41
+ if (key === current.consentStorageKey && key !== legacyNames.consentStorageKey) {
42
+ return [legacyNames.consentStorageKey];
43
+ }
44
+ if (key === current.identityStorageKey && key !== legacyNames.identityStorageKey) {
45
+ return [legacyNames.identityStorageKey];
46
+ }
47
+ return [];
48
+ }
49
+ function withLegacy(pick) {
50
+ const name = pick(current);
51
+ const old = pick(legacyNames);
52
+ return current.legacy && old !== name ? [name, old] : [name];
53
+ }
54
+ function getFlag(name) {
55
+ if (typeof window === "undefined") return void 0;
56
+ const win = window;
57
+ return win[`__${current.prefix}${name}`] ?? (current.legacy ? win[`__${legacyNames.prefix}${name}`] : void 0);
58
+ }
59
+ function setFlag(name, value) {
60
+ if (typeof window === "undefined") return value;
61
+ const win = window;
62
+ win[`__${current.prefix}${name}`] = value;
63
+ if (current.legacy) win[`__${legacyNames.prefix}${name}`] = value;
64
+ return value;
65
+ }
66
+
67
+ export { configureNames, getFlag, getNames, legacyStorageKeysFor, setFlag, withLegacy };
68
+ //# sourceMappingURL=chunk-R6I7OYQB.js.map
69
+ //# sourceMappingURL=chunk-R6I7OYQB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/names.ts"],"names":[],"mappings":"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","file":"chunk-R6I7OYQB.js","sourcesContent":["/** Event names used by auto-tracking. */\nexport type AutoTrackingEventNames = {\n pageSessionStart: string\n scrollDepth: string\n timeOnPage: string\n uiClick: string\n}\n\n/** Storage keys, globals and DOM events in use. */\nexport type Names = {\n prefix: string\n legacy: boolean\n consentStorageKey: string\n identityStorageKey: string\n consentEventName: string\n consentGlobalKey: string\n openConsentGlobalKey: string\n autoTrackingEvents: AutoTrackingEventNames\n}\n\n/** Overrides for `createAnalytics({ names })`; the rest derives from `prefix`. */\nexport type NamesInput = Partial<Omit<Names, 'autoTrackingEvents'>> & {\n autoTrackingEvents?: Partial<AutoTrackingEventNames>\n}\n\nconst DEFAULT_PREFIX = 'consentlayer'\n\nfunction derive(prefix: string, legacy: boolean): Names {\n const upper = prefix.toUpperCase()\n return {\n prefix,\n legacy,\n consentStorageKey: `${prefix}_consent`,\n identityStorageKey: `${prefix}_user_identity`,\n consentEventName: `${prefix}:consent`,\n consentGlobalKey: `${upper}_CONSENT`,\n openConsentGlobalKey: `${upper}_openConsent`,\n autoTrackingEvents: {\n pageSessionStart: `${prefix}.page_session_start`,\n scrollDepth: `${prefix}.scroll_depth`,\n timeOnPage: `${prefix}.time_on_page`,\n uiClick: `${prefix}.ui_click`,\n },\n }\n}\n\n/** Names used by the old `@nicolopadovan/analytics-consent-manager` package. Read and written too when `legacy` is on. */\nconst legacyNames: Names = derive('acm', false)\n\nlet current = derive(DEFAULT_PREFIX, false)\n\n/**\n * Sets every storage key, global, DOM event and auto-tracking event name the\n * package uses. Each call starts again from the defaults.\n * Call it before the first read of consent, e.g. at the top of the module\n * that sets up analytics.\n */\nexport function configureNames(input: NamesInput = {}): Names {\n const base = derive(input.prefix ?? DEFAULT_PREFIX, input.legacy ?? false)\n const overrides = Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined))\n current = {\n ...base,\n ...overrides,\n autoTrackingEvents: {\n ...base.autoTrackingEvents,\n ...input.autoTrackingEvents,\n },\n }\n return current\n}\n\n/** The names in use, after `createAnalytics({ names })`. */\nexport function getNames(): Names {\n return current\n}\n\n/** Old keys to migrate into `key` from, if `key` is one of the package's own. */\nexport function legacyStorageKeysFor(key: string): string[] {\n if (!current.legacy) return []\n if (key === current.consentStorageKey && key !== legacyNames.consentStorageKey) {\n return [legacyNames.consentStorageKey]\n }\n if (key === current.identityStorageKey && key !== legacyNames.identityStorageKey) {\n return [legacyNames.identityStorageKey]\n }\n return []\n}\n\n/** The configured name, plus the legacy one while `legacy` is on. */\nexport function withLegacy(pick: (names: Names) => string): string[] {\n const name = pick(current)\n const old = pick(legacyNames)\n return current.legacy && old !== name ? [name, old] : [name]\n}\n\ntype FlagWindow = Record<string, unknown>\n\n/** Window flags providers use to avoid loading a script twice. */\nexport function getFlag<T>(name: string): T | undefined {\n if (typeof window === 'undefined') return undefined\n const win = window as unknown as FlagWindow\n return (win[`__${current.prefix}${name}`] ?? (current.legacy ? win[`__${legacyNames.prefix}${name}`] : undefined)) as\n | T\n | undefined\n}\n\n/** Sets a `window.__<prefix><name>` flag, so custom plugins can mark one-time setup. */\nexport function setFlag<T>(name: string, value: T): T {\n if (typeof window === 'undefined') return value\n const win = window as unknown as FlagWindow\n win[`__${current.prefix}${name}`] = value\n if (current.legacy) win[`__${legacyNames.prefix}${name}`] = value\n return value\n}\n"]}
@@ -0,0 +1,54 @@
1
+ // src/core/tiktok-events.ts
2
+ var TIKTOK_EVENT_NAMES = {
3
+ view_item: "ViewContent",
4
+ add_to_cart: "AddToCart",
5
+ add_to_wishlist: "AddToWishlist",
6
+ begin_checkout: "InitiateCheckout",
7
+ add_payment_info: "AddPaymentInfo",
8
+ purchase: "Purchase",
9
+ sign_up: "CompleteRegistration",
10
+ lead: "Lead",
11
+ search: "Search",
12
+ contact: "Contact",
13
+ trial_started: "StartTrial",
14
+ subscription_started: "Subscribe",
15
+ customize_product: "CustomizeProduct",
16
+ schedule: "Schedule",
17
+ submit_application: "SubmitApplication",
18
+ find_location: "FindLocation"
19
+ };
20
+ function toTikTokEvent(event) {
21
+ const { items, search_term, transaction_id, ...rest } = event.params;
22
+ const params = { ...rest };
23
+ if (Array.isArray(items) && items.length) {
24
+ const id = (item) => item.item_variant ?? item.item_id;
25
+ params.content_ids = items.map(id);
26
+ params.contents = items.map((item) => ({
27
+ content_id: id(item),
28
+ content_name: item.item_name,
29
+ content_category: item.item_category,
30
+ brand: item.item_brand,
31
+ price: item.price,
32
+ quantity: item.quantity ?? 1
33
+ }));
34
+ params.content_type = "product";
35
+ params.num_items = items.reduce((sum, item) => sum + (item.quantity ?? 1), 0);
36
+ }
37
+ if (search_term !== void 0) params.search_string = search_term;
38
+ if (transaction_id !== void 0) params.order_id = transaction_id;
39
+ return {
40
+ name: TIKTOK_EVENT_NAMES[event.name] ?? event.name,
41
+ params: { ...params, ...event.options.providers?.tiktok }
42
+ };
43
+ }
44
+ function tiktokUserData(identity) {
45
+ const data = {};
46
+ if (identity.email) data.email = identity.email.trim().toLowerCase();
47
+ if (identity.phone) data.phone_number = `+${identity.phone.replace(/\D/g, "")}`;
48
+ if (identity.userId) data.external_id = identity.userId;
49
+ return data;
50
+ }
51
+
52
+ export { tiktokUserData, toTikTokEvent };
53
+ //# sourceMappingURL=chunk-RK2M57GW.js.map
54
+ //# sourceMappingURL=chunk-RK2M57GW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tiktok-events.ts"],"names":[],"mappings":";AAEA,IAAM,kBAAA,GAA6C;AAAA,EACjD,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,WAAA;AAAA,EACb,eAAA,EAAiB,eAAA;AAAA,EACjB,cAAA,EAAgB,kBAAA;AAAA,EAChB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,sBAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe,YAAA;AAAA,EACf,oBAAA,EAAsB,WAAA;AAAA,EACtB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,QAAA,EAAU,UAAA;AAAA,EACV,kBAAA,EAAoB,mBAAA;AAAA,EACpB,aAAA,EAAe;AACjB,CAAA;AAGO,SAAS,cAAc,KAAA,EAAiF;AAC7G,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,gBAAgB,GAAG,IAAA,KAAS,KAAA,CAAM,MAAA;AAK9D,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,IAAA,EAAK;AAClD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAM,MAAA,EAAQ;AACxC,IAAA,MAAM,EAAA,GAAK,CAAC,IAAA,KAAwB,IAAA,CAAK,gBAAgB,IAAA,CAAK,OAAA;AAC9D,IAAA,MAAA,CAAO,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACrC,UAAA,EAAY,GAAG,IAAI,CAAA;AAAA,MACnB,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,kBAAkB,IAAA,CAAK,aAAA;AAAA,MACvB,OAAO,IAAA,CAAK,UAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B,CAAE,CAAA;AACF,IAAA,MAAA,CAAO,YAAA,GAAe,SAAA;AACtB,IAAA,MAAA,CAAO,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,SAAS,GAAA,IAAO,IAAA,CAAK,QAAA,IAAY,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,MAAA,CAAO,aAAA,GAAgB,WAAA;AACtD,EAAA,IAAI,cAAA,KAAmB,MAAA,EAAW,MAAA,CAAO,QAAA,GAAW,cAAA;AACpD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA,CAAmB,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AAAA,IAC9C,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,GAAG,KAAA,CAAM,OAAA,CAAQ,WAAW,MAAA;AAAO,GAC1D;AACF;AAGO,SAAS,eAAe,QAAA,EAAgD;AAC7E,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,IAAI,QAAA,CAAS,OAAO,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AACnE,EAAA,IAAI,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,YAAA,GAAe,CAAA,CAAA,EAAI,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA;AAC7E,EAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,MAAA;AACjD,EAAA,OAAO,IAAA;AACT","file":"chunk-RK2M57GW.js","sourcesContent":["import type { AnalyticsEventPayload, EcommerceItem, UserIdentity } from './types'\n\nconst TIKTOK_EVENT_NAMES: Record<string, string> = {\n view_item: 'ViewContent',\n add_to_cart: 'AddToCart',\n add_to_wishlist: 'AddToWishlist',\n begin_checkout: 'InitiateCheckout',\n add_payment_info: 'AddPaymentInfo',\n purchase: 'Purchase',\n sign_up: 'CompleteRegistration',\n lead: 'Lead',\n search: 'Search',\n contact: 'Contact',\n trial_started: 'StartTrial',\n subscription_started: 'Subscribe',\n customize_product: 'CustomizeProduct',\n schedule: 'Schedule',\n submit_application: 'SubmitApplication',\n find_location: 'FindLocation',\n}\n\n/** Translates a standard event into a TikTok standard event, or a custom one under its own name. */\nexport function toTikTokEvent(event: AnalyticsEventPayload): { name: string; params: Record<string, unknown> } {\n const { items, search_term, transaction_id, ...rest } = event.params as {\n items?: EcommerceItem[]\n search_term?: string\n transaction_id?: string\n } & Record<string, unknown>\n const params: Record<string, unknown> = { ...rest }\n if (Array.isArray(items) && items.length) {\n const id = (item: EcommerceItem) => item.item_variant ?? item.item_id\n params.content_ids = items.map(id)\n params.contents = items.map((item) => ({\n content_id: id(item),\n content_name: item.item_name,\n content_category: item.item_category,\n brand: item.item_brand,\n price: item.price,\n quantity: item.quantity ?? 1,\n }))\n params.content_type = 'product'\n params.num_items = items.reduce((sum, item) => sum + (item.quantity ?? 1), 0)\n }\n if (search_term !== undefined) params.search_string = search_term\n if (transaction_id !== undefined) params.order_id = transaction_id\n return {\n name: TIKTOK_EVENT_NAMES[event.name] ?? event.name,\n params: { ...params, ...event.options.providers?.tiktok },\n }\n}\n\n/** Advanced matching for `ttq.identify`; the pixel hashes the values itself. */\nexport function tiktokUserData(identity: UserIdentity): Record<string, string> {\n const data: Record<string, string> = {}\n if (identity.email) data.email = identity.email.trim().toLowerCase()\n if (identity.phone) data.phone_number = `+${identity.phone.replace(/\\D/g, '')}`\n if (identity.userId) data.external_id = identity.userId\n return data\n}\n"]}
@@ -0,0 +1,128 @@
1
+ import { metaNoscriptImg, gtmNoscriptIframe } from './chunk-VIIGBALD.js';
2
+ import { createConsentController, latestAnalytics } from './chunk-FDJMIJFV.js';
3
+ import { createContext, createSignal, onMount, onCleanup, createEffect, createComponent, useContext, ErrorBoundary as ErrorBoundary$1, splitProps, Show } from 'solid-js';
4
+ import { isServer, Dynamic } from 'solid-js/web';
5
+
6
+ var AnalyticsContext = createContext();
7
+ var ControllerContext = createContext();
8
+ function AnalyticsProvider(props) {
9
+ const { analytics, boot, autoShowBanner, openConsentGlobalKey } = props;
10
+ const controller = createConsentController(analytics, { boot, autoShowBanner, openConsentGlobalKey });
11
+ const [state, setState] = createSignal(controller.getSnapshot());
12
+ const ui = {
13
+ get ready() {
14
+ return state().ready;
15
+ },
16
+ get error() {
17
+ return state().error;
18
+ },
19
+ get bannerVisible() {
20
+ return state().bannerVisible;
21
+ },
22
+ get dialogVisible() {
23
+ return state().dialogVisible;
24
+ },
25
+ get categories() {
26
+ return state().categories;
27
+ },
28
+ get gpc() {
29
+ return state().gpc;
30
+ },
31
+ get prefs() {
32
+ return state().prefs;
33
+ },
34
+ ...controller.actions
35
+ };
36
+ onMount(() => {
37
+ const unsubscribe = controller.subscribe(() => setState(controller.getSnapshot()));
38
+ const stop = controller.start();
39
+ onCleanup(() => {
40
+ stop();
41
+ unsubscribe();
42
+ });
43
+ });
44
+ createEffect(() => controller.setRoute(props.routeKey === void 0 ? "default" : props.routeKey, props.page));
45
+ return createComponent(AnalyticsContext.Provider, {
46
+ value: analytics,
47
+ get children() {
48
+ return createComponent(ControllerContext.Provider, {
49
+ value: ui,
50
+ get children() {
51
+ return props.children;
52
+ }
53
+ });
54
+ }
55
+ });
56
+ }
57
+ function useAnalytics() {
58
+ const analytics = useContext(AnalyticsContext) ?? latestAnalytics();
59
+ if (!analytics) throw new Error("useAnalytics needs createAnalytics() to have run, or an AnalyticsProvider above it");
60
+ return analytics;
61
+ }
62
+ function useConsent() {
63
+ const analytics = useAnalytics();
64
+ const [consent, setConsent] = createSignal(analytics.consent.getConsent());
65
+ if (!isServer) onCleanup(analytics.consent.subscribe(() => setConsent(analytics.consent.getConsent())));
66
+ return {
67
+ consent,
68
+ engine: analytics.consent,
69
+ setConsent: (next) => analytics.consent.setConsent(next),
70
+ update: (partial) => analytics.consent.update(partial)
71
+ };
72
+ }
73
+ function useConsentController() {
74
+ const controller = useContext(ControllerContext);
75
+ if (!controller) throw new Error("useConsentController must be used within AnalyticsProvider");
76
+ return controller;
77
+ }
78
+ function ErrorBoundary(props) {
79
+ const context = useContext(AnalyticsContext);
80
+ return createComponent(ErrorBoundary$1, {
81
+ fallback: (error, reset) => {
82
+ void (props.analytics ?? context ?? latestAnalytics())?.captureError(error, {
83
+ source: "boundary",
84
+ tags: props.tags
85
+ });
86
+ return typeof props.fallback === "function" ? props.fallback(error, reset) : props.fallback;
87
+ },
88
+ get children() {
89
+ return props.children;
90
+ }
91
+ });
92
+ }
93
+ function MetaPixelNoscript(props) {
94
+ const [own, attrs] = splitProps(props, ["pixelId", "enabled"]);
95
+ return Show({
96
+ get when() {
97
+ return own.enabled && own.pixelId;
98
+ },
99
+ get children() {
100
+ return createComponent(Dynamic, {
101
+ component: "noscript",
102
+ get innerHTML() {
103
+ return metaNoscriptImg(own.pixelId ?? "", attrs);
104
+ }
105
+ });
106
+ }
107
+ });
108
+ }
109
+ function GtmNoscript(props) {
110
+ const [own, attrs] = splitProps(props, ["containerId", "enabled"]);
111
+ return Show({
112
+ get when() {
113
+ return own.enabled && own.containerId;
114
+ },
115
+ get children() {
116
+ return createComponent(Dynamic, {
117
+ component: "noscript",
118
+ get innerHTML() {
119
+ return gtmNoscriptIframe(own.containerId ?? "", attrs);
120
+ }
121
+ });
122
+ }
123
+ });
124
+ }
125
+
126
+ export { AnalyticsProvider, ErrorBoundary, GtmNoscript, MetaPixelNoscript, useAnalytics, useConsent, useConsentController };
127
+ //# sourceMappingURL=chunk-RZ4TYRNY.js.map
128
+ //# sourceMappingURL=chunk-RZ4TYRNY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/solid.ts"],"names":["SolidErrorBoundary"],"mappings":"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","file":"chunk-RZ4TYRNY.js","sourcesContent":["import {\n createComponent,\n createContext,\n createEffect,\n createSignal,\n ErrorBoundary as SolidErrorBoundary,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n type Accessor,\n type ComponentProps,\n type JSX,\n} from 'solid-js'\nimport { Dynamic, isServer } from 'solid-js/web'\nimport {\n createConsentController,\n type ConsentControllerActions,\n type ConsentControllerOptions,\n type ConsentControllerState,\n} from './core/consent-controller'\nimport { latestAnalytics } from './core/create-analytics'\nimport { gtmNoscriptIframe, metaNoscriptImg } from './core/noscript'\nimport type { Analytics, ConsentApi, ConsentState, ErrorContext, PageViewPayload } from './core/types'\n\n/** Props for `<AnalyticsProvider>`. */\nexport type AnalyticsProviderProps = ConsentControllerOptions & {\n analytics: Analytics\n children?: JSX.Element\n /** Changes on every navigation; a page view is sent once per key. `null` holds page views until the route is known. */\n routeKey?: string | null\n page?: PageViewPayload\n}\n\n/** What `useConsentController()` returns: the UI state as reactive properties, and the actions. */\nexport type ConsentController = Readonly<ConsentControllerState> & ConsentControllerActions\n\nconst AnalyticsContext = createContext<Analytics>()\nconst ControllerContext = createContext<ConsentController>()\n\n/** Boots analytics, sends page views on navigation and provides the state for your consent UI. */\nexport function AnalyticsProvider(props: AnalyticsProviderProps): JSX.Element {\n const { analytics, boot, autoShowBanner, openConsentGlobalKey } = props\n const controller = createConsentController(analytics, { boot, autoShowBanner, openConsentGlobalKey })\n const [state, setState] = createSignal(controller.getSnapshot())\n const ui: ConsentController = {\n get ready() {\n return state().ready\n },\n get error() {\n return state().error\n },\n get bannerVisible() {\n return state().bannerVisible\n },\n get dialogVisible() {\n return state().dialogVisible\n },\n get categories() {\n return state().categories\n },\n get gpc() {\n return state().gpc\n },\n get prefs() {\n return state().prefs\n },\n ...controller.actions,\n }\n\n onMount(() => {\n const unsubscribe = controller.subscribe(() => setState(controller.getSnapshot()))\n const stop = controller.start()\n onCleanup(() => {\n stop()\n unsubscribe()\n })\n })\n createEffect(() => controller.setRoute(props.routeKey === undefined ? 'default' : props.routeKey, props.page))\n\n return createComponent(AnalyticsContext.Provider, {\n value: analytics,\n get children() {\n return createComponent(ControllerContext.Provider, {\n value: ui,\n get children() {\n return props.children\n },\n })\n },\n })\n}\n\n/** The instance from `<AnalyticsProvider>`, else the one `createAnalytics()` made. */\nexport function useAnalytics(): Analytics {\n const analytics = useContext(AnalyticsContext) ?? latestAnalytics()\n if (!analytics) throw new Error('useAnalytics needs createAnalytics() to have run, or an AnalyticsProvider above it')\n return analytics\n}\n\n/** Current consent as an accessor, `null` before a choice. */\nexport function useConsent(): {\n consent: Accessor<ConsentState | null>\n engine: ConsentApi\n setConsent: (consent: ConsentState) => Promise<void>\n update: (partial: Partial<ConsentState>) => Promise<void>\n} {\n const analytics = useAnalytics()\n const [consent, setConsent] = createSignal(analytics.consent.getConsent())\n if (!isServer) onCleanup(analytics.consent.subscribe(() => setConsent(analytics.consent.getConsent())))\n return {\n consent,\n engine: analytics.consent,\n setConsent: (next) => analytics.consent.setConsent(next),\n update: (partial) => analytics.consent.update(partial),\n }\n}\n\n/** State and actions for building your own consent UI. */\nexport function useConsentController(): ConsentController {\n const controller = useContext(ControllerContext)\n if (!controller) throw new Error('useConsentController must be used within AnalyticsProvider')\n return controller\n}\n\n/** Props for `<ErrorBoundary>`. */\nexport type ErrorBoundaryProps = {\n children?: JSX.Element\n fallback: JSX.Element | ((error: unknown, reset: () => void) => JSX.Element)\n /** Defaults to the instance from `<AnalyticsProvider>`, else the one `createAnalytics()` made. */\n analytics?: Analytics\n tags?: ErrorContext['tags']\n}\n\n/** Renders `fallback` when a child throws, and sends the error through `captureError`. */\nexport function ErrorBoundary(props: ErrorBoundaryProps): JSX.Element {\n const context = useContext(AnalyticsContext)\n return createComponent(SolidErrorBoundary, {\n fallback: (error: unknown, reset: () => void) => {\n void (props.analytics ?? context ?? latestAnalytics())?.captureError(error, {\n source: 'boundary',\n tags: props.tags,\n })\n return typeof props.fallback === 'function' ? props.fallback(error, reset) : props.fallback\n },\n get children() {\n return props.children\n },\n })\n}\n\n/**\n * Meta's `<noscript>` PageView pixel. It fires only for visitors without\n * JavaScript, who never see the consent banner, so it tracks them without\n * consent. Render it only where that is lawful for you. Renders nothing without\n * `enabled` or while `pixelId` is unset. Other attributes go to the `<img>`.\n */\nexport function MetaPixelNoscript(\n props: { pixelId: string | undefined; enabled?: boolean } & ComponentProps<'img'>,\n): JSX.Element {\n const [own, attrs] = splitProps(props, ['pixelId', 'enabled'])\n return Show({\n get when() {\n return own.enabled && own.pixelId\n },\n get children() {\n return createComponent(Dynamic, {\n component: 'noscript',\n get innerHTML() {\n return metaNoscriptImg(own.pixelId ?? '', attrs)\n },\n })\n },\n })\n}\n\n/**\n * Google Tag Manager's `<noscript>` iframe. It loads the container only for\n * visitors without JavaScript, who never see the consent banner, so its tags\n * run without consent. Render it only where that is lawful for you. Renders\n * nothing without `enabled` or while `containerId` is unset. Other attributes go to the `<iframe>`.\n */\nexport function GtmNoscript(\n props: { containerId: string | undefined; enabled?: boolean } & ComponentProps<'iframe'>,\n): JSX.Element {\n const [own, attrs] = splitProps(props, ['containerId', 'enabled'])\n return Show({\n get when() {\n return own.enabled && own.containerId\n },\n get children() {\n return createComponent(Dynamic, {\n component: 'noscript',\n get innerHTML() {\n return gtmNoscriptIframe(own.containerId ?? '', attrs)\n },\n })\n },\n })\n}\n"]}
@@ -0,0 +1,112 @@
1
+ import { isValidEmail, isValidPhoneE164 } from './chunk-J3KUPF4R.js';
2
+
3
+ // src/core/utils.ts
4
+ function isBrowser() {
5
+ return typeof window !== "undefined" && typeof document !== "undefined";
6
+ }
7
+ var BUILT_IN_CATEGORIES = ["preferences", "analytics", "marketing"];
8
+ function normalizeConsent(consent, categories = BUILT_IN_CATEGORIES) {
9
+ if (!consent) return null;
10
+ return {
11
+ ...Object.fromEntries(categories.map((category) => [category, Boolean(consent[category])])),
12
+ ...typeof consent.sale_of_data === "boolean" ? { sale_of_data: consent.sale_of_data } : {}
13
+ };
14
+ }
15
+ function equalConsent(left, right) {
16
+ return JSON.stringify(left) === JSON.stringify(right);
17
+ }
18
+ function hasRequiredConsent(consent, required) {
19
+ if (required === "none") return true;
20
+ if (!required || !consent) return false;
21
+ if (typeof required === "function") return required(consent);
22
+ return Boolean(consent[required]);
23
+ }
24
+ function normalizeIdentity(identity) {
25
+ const output = {};
26
+ if (identity.email) {
27
+ const candidate = identity.email.trim().toLowerCase();
28
+ if (isValidEmail(candidate)) output.email = candidate;
29
+ }
30
+ if (identity.phone) {
31
+ const candidate = identity.phone.replace(/[\s\-().]/g, "");
32
+ if (isValidPhoneE164(candidate)) output.phone = candidate;
33
+ }
34
+ const userId = identity.userId ?? identity.external_id;
35
+ if (userId) output.userId = String(userId);
36
+ return output;
37
+ }
38
+ function createEventId() {
39
+ try {
40
+ return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);
41
+ } catch {
42
+ return Math.random().toString(36).slice(2);
43
+ }
44
+ }
45
+ function expireCookies(match) {
46
+ const hosts = location.hostname.split(".").map((_, i, parts) => parts.slice(i).join("."));
47
+ for (const cookie of document.cookie.split(";")) {
48
+ const name = cookie.split("=")[0]?.trim();
49
+ if (!name || !match(name)) continue;
50
+ for (const domain of ["", ...hosts.map((host) => `; domain=${host}`)]) {
51
+ document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/${domain}`;
52
+ }
53
+ }
54
+ }
55
+ function getWindowLocation() {
56
+ if (!isBrowser()) return {};
57
+ return {
58
+ url: window.location.href,
59
+ path: window.location.pathname + window.location.search,
60
+ title: document.title
61
+ };
62
+ }
63
+ function sanitizeVercelPayload(params) {
64
+ const sanitized = {};
65
+ for (const [key, value] of Object.entries(params)) {
66
+ if (value == null) sanitized[key] = null;
67
+ else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
68
+ sanitized[key] = value;
69
+ } else if (value instanceof Date) {
70
+ sanitized[key] = value.toISOString();
71
+ }
72
+ }
73
+ return sanitized;
74
+ }
75
+ function broadcastConsent(consent, config = {}) {
76
+ const doc = config.document ?? (typeof document !== "undefined" ? document : void 0);
77
+ const win = config.window ?? (typeof window !== "undefined" ? window : void 0);
78
+ if (win) {
79
+ for (const key of [config.globalKey ?? []].flat()) {
80
+ win[key] = consent;
81
+ }
82
+ }
83
+ if (doc) {
84
+ for (const name of [config.eventName ?? []].flat()) {
85
+ doc.dispatchEvent(new CustomEvent(name, { detail: consent }));
86
+ }
87
+ }
88
+ }
89
+ var DEBUG_TOPICS = ["consent", "events", "providers", "errors"];
90
+ function createDebugLog(debug) {
91
+ if (!debug) return () => void 0;
92
+ const options = debug === true ? {} : debug;
93
+ const anyOn = DEBUG_TOPICS.some((topic) => options[topic]);
94
+ return (topic, provider, message, ...data) => {
95
+ if (!(options[topic] ?? !anyOn)) return;
96
+ if (provider && options.only && !options.only.includes(provider)) return;
97
+ if (options.logger) options.logger({ topic, provider, message, data });
98
+ else console.debug("[consentlayer]", message, ...data);
99
+ };
100
+ }
101
+ function safeJsonParse(raw) {
102
+ if (!raw) return null;
103
+ try {
104
+ return JSON.parse(raw);
105
+ } catch {
106
+ return null;
107
+ }
108
+ }
109
+
110
+ export { BUILT_IN_CATEGORIES, broadcastConsent, createDebugLog, createEventId, equalConsent, expireCookies, getWindowLocation, hasRequiredConsent, isBrowser, normalizeConsent, normalizeIdentity, safeJsonParse, sanitizeVercelPayload };
111
+ //# sourceMappingURL=chunk-TVSZJLRC.js.map
112
+ //# sourceMappingURL=chunk-TVSZJLRC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils.ts"],"names":[],"mappings":"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","file":"chunk-TVSZJLRC.js","sourcesContent":["import type {\n ConsentBroadcastConfig,\n ConsentCategory,\n ConsentState,\n DebugOptions,\n DebugTopic,\n ProviderConsentRequirement,\n UserIdentity,\n} from './types'\nimport { isValidEmail, isValidPhoneE164 } from './validation'\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\nexport const BUILT_IN_CATEGORIES = ['preferences', 'analytics', 'marketing'] as const\n\nexport function normalizeConsent(\n consent: Partial<ConsentState> | null | undefined,\n categories: readonly ConsentCategory[] = BUILT_IN_CATEGORIES,\n): ConsentState | null {\n if (!consent) return null\n return {\n ...(Object.fromEntries(categories.map((category) => [category, Boolean(consent[category])])) as Record<\n ConsentCategory,\n boolean\n >),\n ...(typeof consent.sale_of_data === 'boolean' ? { sale_of_data: consent.sale_of_data } : {}),\n }\n}\n\nexport function equalConsent(left: ConsentState | null, right: ConsentState | null): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\nexport function hasRequiredConsent(consent: ConsentState | null, required?: ProviderConsentRequirement): boolean {\n if (required === 'none') return true\n if (!required || !consent) return false\n if (typeof required === 'function') return required(consent)\n return Boolean(consent[required])\n}\n\nexport function normalizeIdentity(identity: Partial<UserIdentity>): UserIdentity {\n const output: UserIdentity = {}\n if (identity.email) {\n const candidate = identity.email.trim().toLowerCase()\n if (isValidEmail(candidate)) output.email = candidate\n }\n if (identity.phone) {\n const candidate = identity.phone.replace(/[\\s\\-().]/g, '')\n if (isValidPhoneE164(candidate)) output.phone = candidate\n }\n const userId = identity.userId ?? (identity as { external_id?: string }).external_id\n if (userId) output.userId = String(userId)\n return output\n}\n\nexport function createEventId(): string {\n try {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2)\n } catch {\n return Math.random().toString(36).slice(2)\n }\n}\n\n/** Expires matching cookies on this host and every parent domain, wherever the vendor set them. */\nexport function expireCookies(match: (name: string) => boolean): void {\n const hosts = location.hostname.split('.').map((_, i, parts) => parts.slice(i).join('.'))\n for (const cookie of document.cookie.split(';')) {\n const name = cookie.split('=')[0]?.trim()\n if (!name || !match(name)) continue\n for (const domain of ['', ...hosts.map((host) => `; domain=${host}`)]) {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/${domain}`\n }\n }\n}\n\nexport function getWindowLocation(): { url?: string; path?: string; title?: string } {\n if (!isBrowser()) return {}\n return {\n url: window.location.href,\n path: window.location.pathname + window.location.search,\n title: document.title,\n }\n}\n\nexport function sanitizeVercelPayload(\n params: Record<string, unknown>,\n): Record<string, string | number | boolean | null> {\n const sanitized: Record<string, string | number | boolean | null> = {}\n for (const [key, value] of Object.entries(params)) {\n if (value == null) sanitized[key] = null\n else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n sanitized[key] = value\n } else if (value instanceof Date) {\n sanitized[key] = value.toISOString()\n }\n }\n return sanitized\n}\n\nexport function broadcastConsent(consent: ConsentState, config: ConsentBroadcastConfig = {}): void {\n const doc = config.document ?? (typeof document !== 'undefined' ? document : undefined)\n const win = config.window ?? (typeof window !== 'undefined' ? window : undefined)\n if (win) {\n for (const key of [config.globalKey ?? []].flat()) {\n ;(win as unknown as Record<string, unknown>)[key] = consent\n }\n }\n if (doc) {\n for (const name of [config.eventName ?? []].flat()) {\n doc.dispatchEvent(new CustomEvent(name, { detail: consent }))\n }\n }\n}\n\nconst DEBUG_TOPICS: DebugTopic[] = ['consent', 'events', 'providers', 'errors']\n\nexport type DebugLog = (topic: DebugTopic, provider: string | undefined, message: string, ...data: unknown[]) => void\n\nexport function createDebugLog(debug: boolean | DebugOptions | undefined): DebugLog {\n if (!debug) return () => undefined\n const options = debug === true ? {} : debug\n const anyOn = DEBUG_TOPICS.some((topic) => options[topic])\n return (topic, provider, message, ...data) => {\n if (!(options[topic] ?? !anyOn)) return\n if (provider && options.only && !options.only.includes(provider)) return\n if (options.logger) options.logger({ topic, provider, message, data })\n else console.debug('[consentlayer]', message, ...data)\n }\n}\n\nexport function safeJsonParse<T>(raw: string | null): T | null {\n if (!raw) return null\n try {\n return JSON.parse(raw) as T\n } catch {\n return null\n }\n}\n"]}
@@ -0,0 +1,79 @@
1
+ import { createConsentController, latestAnalytics } from './chunk-FDJMIJFV.js';
2
+ import { setContext, onMount, getContext } from 'svelte';
3
+ import { createSubscriber } from 'svelte/reactivity';
4
+ import GtmNoscriptComponent from './svelte/GtmNoscript.svelte';
5
+ import MetaPixelNoscriptComponent from './svelte/MetaPixelNoscript.svelte';
6
+
7
+ var MetaPixelNoscript = MetaPixelNoscriptComponent;
8
+ var GtmNoscript = GtmNoscriptComponent;
9
+ var AnalyticsKey = /* @__PURE__ */ Symbol("consentlayer.analytics");
10
+ var ControllerKey = /* @__PURE__ */ Symbol("consentlayer.controller");
11
+ function consentLayer({ analytics, afterNavigate, page, ...options }) {
12
+ const controller = createConsentController(analytics, options);
13
+ const subscribe = createSubscriber((update) => controller.subscribe(update));
14
+ const read = () => {
15
+ subscribe();
16
+ return controller.getSnapshot();
17
+ };
18
+ const ui = {
19
+ get ready() {
20
+ return read().ready;
21
+ },
22
+ get error() {
23
+ return read().error;
24
+ },
25
+ get bannerVisible() {
26
+ return read().bannerVisible;
27
+ },
28
+ get dialogVisible() {
29
+ return read().dialogVisible;
30
+ },
31
+ get categories() {
32
+ return read().categories;
33
+ },
34
+ get gpc() {
35
+ return read().gpc;
36
+ },
37
+ get prefs() {
38
+ return read().prefs;
39
+ },
40
+ ...controller.actions
41
+ };
42
+ setContext(AnalyticsKey, analytics);
43
+ setContext(ControllerKey, ui);
44
+ afterNavigate?.(({ to }) => {
45
+ if (to) controller.setRoute(to.url.pathname + to.url.search, page);
46
+ });
47
+ onMount(() => {
48
+ if (!afterNavigate) controller.setRoute("default", page);
49
+ return controller.start();
50
+ });
51
+ return ui;
52
+ }
53
+ function useAnalytics() {
54
+ const analytics = getContext(AnalyticsKey) ?? latestAnalytics();
55
+ if (!analytics) throw new Error("useAnalytics needs createAnalytics() to have run, or consentLayer()");
56
+ return analytics;
57
+ }
58
+ function useConsent() {
59
+ const analytics = useAnalytics();
60
+ const subscribe = createSubscriber((update) => analytics.consent.subscribe(update));
61
+ return {
62
+ get consent() {
63
+ subscribe();
64
+ return analytics.consent.getConsent();
65
+ },
66
+ engine: analytics.consent,
67
+ setConsent: (next) => analytics.consent.setConsent(next),
68
+ update: (partial) => analytics.consent.update(partial)
69
+ };
70
+ }
71
+ function useConsentController() {
72
+ const controller = getContext(ControllerKey);
73
+ if (!controller) throw new Error("useConsentController needs consentLayer() in a parent component");
74
+ return controller;
75
+ }
76
+
77
+ export { GtmNoscript, MetaPixelNoscript, consentLayer, useAnalytics, useConsent, useConsentController };
78
+ //# sourceMappingURL=chunk-TYOQYV45.js.map
79
+ //# sourceMappingURL=chunk-TYOQYV45.js.map