@aranova/tracking-browser 0.2.2 → 0.2.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../../tracking-core/src/consent.ts","../../../tracking-core/src/gtag.ts","../../../tracking-core/src/tracking.ts"],"sourcesContent":["import { getConsentState, setConsentState } from '../../tracking-core/src/index';\nimport { bootstrapGoogleAdsTracking } from '../../tracking-core/src/index';\nimport {\n captureTrackingParamsFromLocation,\n getCookieValueFromDocument,\n getTrackingParamsFromCookieReader,\n TRACKING_COOKIE_MAX_AGE_SECONDS,\n type TrackingInitConfig,\n type TrackingParams,\n} from '../../tracking-core/src/index';\n\nconst BANNER_ID = 'aranova-tracking-consent-banner';\n\nfunction getTrackingParams(): TrackingParams {\n return getTrackingParamsFromCookieReader(getCookieValueFromDocument);\n}\n\nfunction removeConsentBanner(): void {\n document.getElementById(BANNER_ID)?.remove();\n}\n\nfunction createConsentButton(label: string, onClick: () => void, style: Partial<CSSStyleDeclaration>): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = label;\n Object.assign(button.style, {\n borderRadius: '6px',\n padding: '10px 16px',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n border: '1px solid #d1d5db',\n background: '#ffffff',\n color: '#374151',\n }, style);\n button.addEventListener('click', onClick);\n return button;\n}\n\nfunction mountConsentBanner(): void {\n if (typeof document === 'undefined' || getConsentState() !== 'pending' || document.getElementById(BANNER_ID))\n return;\n\n const banner = document.createElement('div');\n banner.id = BANNER_ID;\n Object.assign(banner.style, {\n position: 'fixed',\n left: '0',\n right: '0',\n bottom: '0',\n zIndex: '2147483647',\n background: '#ffffff',\n borderTop: '1px solid #e5e7eb',\n boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.12)',\n padding: '16px',\n fontFamily: 'Inter, system-ui, sans-serif',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const container = document.createElement('div');\n Object.assign(container.style, {\n maxWidth: '960px',\n margin: '0 auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const message = document.createElement('p');\n message.textContent = 'We use cookies to understand ad performance and improve how our marketing works across visits. You can accept or decline this tracking.';\n Object.assign(message.style, {\n margin: '0',\n color: '#374151',\n fontSize: '14px',\n lineHeight: '1.5',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const actions = document.createElement('div');\n Object.assign(actions.style, {\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const declineButton = createConsentButton('Decline', () => {\n setConsentState('denied');\n removeConsentBanner();\n }, {});\n\n const acceptButton = createConsentButton('Accept', () => {\n setConsentState('granted');\n removeConsentBanner();\n }, {\n background: '#111827',\n color: '#ffffff',\n border: '1px solid #111827',\n });\n\n actions.appendChild(declineButton);\n actions.appendChild(acceptButton);\n container.appendChild(message);\n container.appendChild(actions);\n banner.appendChild(container);\n document.body.appendChild(banner);\n}\n\nexport function init(config: TrackingInitConfig = {}): void {\n if (typeof window === 'undefined')\n return;\n\n const {\n autoCaptureTrackingParams = true,\n cookieMaxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n gtagId,\n renderConsentBanner = true,\n } = config;\n\n if (autoCaptureTrackingParams)\n captureTrackingParamsFromLocation(window.location.href, cookieMaxAgeSeconds);\n\n if (gtagId)\n bootstrapGoogleAdsTracking(gtagId);\n\n if (renderConsentBanner)\n mountConsentBanner();\n}\n\n// Keep the script surface small so browser installs stay easy to document.\nconst trackingScriptApi = {\n init,\n captureTrackingParams: (): TrackingParams => captureTrackingParamsFromLocation(),\n getTrackingParams,\n getConsentState,\n setConsentState,\n};\n\nif (typeof window !== 'undefined')\n window.AranovaTracking = trackingScriptApi;\n\nexport default trackingScriptApi;\n","import type { ConsentState } from './types';\n\nexport const CONSENT_STATE_KEY = 'consent_state';\nexport const CONSENT_TIMESTAMP_KEY = 'consent_timestamp';\n\nexport type GtagConsentValue = 'granted' | 'denied';\n\nexport interface ConsentUpdatePayload {\n ad_storage: GtagConsentValue;\n ad_user_data: GtagConsentValue;\n ad_personalization: GtagConsentValue;\n analytics_storage: GtagConsentValue;\n}\n\nexport function buildConsentPayload(state: GtagConsentValue): ConsentUpdatePayload {\n return {\n ad_storage: state,\n ad_user_data: state,\n ad_personalization: state,\n analytics_storage: state,\n };\n}\n\nexport function getConsentState(): ConsentState {\n if (typeof window === 'undefined')\n return 'pending';\n\n const storedState = window.localStorage.getItem(CONSENT_STATE_KEY);\n\n if (storedState === 'granted' || storedState === 'denied')\n return storedState;\n\n return 'pending';\n}\n\nexport function setConsentState(state: GtagConsentValue): void {\n if (typeof window === 'undefined')\n return;\n\n window.localStorage.setItem(CONSENT_STATE_KEY, state);\n window.localStorage.setItem(CONSENT_TIMESTAMP_KEY, new Date().toISOString());\n\n if (typeof window.gtag === 'function')\n window.gtag('consent', 'update', buildConsentPayload(state));\n}\n\nexport function restoreStoredConsent(): ConsentState {\n const consentState = getConsentState();\n\n if (consentState === 'granted' || consentState === 'denied')\n setConsentState(consentState);\n\n return consentState;\n}\n","import { buildConsentPayload, getConsentState, restoreStoredConsent } from './consent';\n\nexport const GTAG_SCRIPT_HOST = 'https://www.googletagmanager.com/gtag/js';\nexport const TRACKING_SCRIPT_ATTRIBUTE = 'data-aranova-tracking';\n\nfunction getScriptMarker(id: string): string {\n return `aranova-${id}`;\n}\n\nexport function createConsentDefaultScript(): string {\n return `\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\nwindow.gtag = gtag;\ngtag('consent', 'default', {\n ad_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n analytics_storage: 'denied',\n wait_for_update: 500,\n});\n`.trim();\n}\n\nexport function createGtagInitScript(gtagId: string): string {\n return `\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\nwindow.gtag = gtag;\ngtag('js', new Date());\ngtag('config', '${gtagId}');\n`.trim();\n}\n\nexport function createConsentRestoreScript(): string {\n return `\nconst consentState = window.localStorage.getItem('consent_state');\nif (window.gtag && (consentState === 'granted' || consentState === 'denied')) {\n window.gtag('consent', 'update', {\n ad_storage: consentState,\n ad_user_data: consentState,\n ad_personalization: consentState,\n analytics_storage: consentState,\n });\n}\n`.trim();\n}\n\nexport function ensureGtagFunction(): NonNullable<Window['gtag']> {\n window.dataLayer = window.dataLayer || [];\n\n if (typeof window.gtag === 'function')\n return window.gtag;\n\n window.gtag = (...args: unknown[]) => {\n window.dataLayer?.push(args);\n };\n\n return window.gtag;\n}\n\nexport function applyDefaultConsentState(): void {\n const gtag = ensureGtagFunction();\n gtag('consent', 'default', {\n ad_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n analytics_storage: 'denied',\n wait_for_update: 500,\n });\n}\n\nexport function loadGtagScript(gtagId: string): void {\n if (typeof document === 'undefined')\n return;\n\n const marker = getScriptMarker('gtag-loader');\n const existingScript = document.querySelector<HTMLScriptElement>(`script[${TRACKING_SCRIPT_ATTRIBUTE}=\"${marker}\"]`);\n if (existingScript)\n return;\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `${GTAG_SCRIPT_HOST}?id=${encodeURIComponent(gtagId)}`;\n script.setAttribute(TRACKING_SCRIPT_ATTRIBUTE, marker);\n document.head.appendChild(script);\n}\n\nexport function initializeGtag(gtagId: string): void {\n const gtag = ensureGtagFunction();\n gtag('js', new Date());\n gtag('config', gtagId);\n}\n\nexport function restoreConsentState(): void {\n if (typeof window === 'undefined')\n return;\n\n const consentState = getConsentState();\n if (consentState === 'granted' || consentState === 'denied')\n window.gtag?.('consent', 'update', buildConsentPayload(consentState));\n}\n\nexport function bootstrapGoogleAdsTracking(gtagId: string): void {\n if (typeof window === 'undefined' || typeof document === 'undefined')\n return;\n\n applyDefaultConsentState();\n loadGtagScript(gtagId);\n initializeGtag(gtagId);\n restoreStoredConsent();\n}\n","import type { TrackingParams } from './types';\n\nexport const TRACKING_COOKIE_MAX_AGE_SECONDS = 7_776_000;\n\nexport const TRACKING_PARAM_KEYS = [\n 'gclid',\n 'fbclid',\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_term',\n 'utm_content',\n] as const;\n\nexport type TrackingParamKey = (typeof TRACKING_PARAM_KEYS)[number];\n\nexport function createEmptyTrackingParams(): TrackingParams {\n return {\n gclid: null,\n fbclid: null,\n utm_source: null,\n utm_medium: null,\n utm_campaign: null,\n utm_term: null,\n utm_content: null,\n };\n}\n\nexport function normalizeTrackingCookieValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nexport function getTrackingParamsFromCookieReader(\n readCookie: (key: TrackingParamKey) => unknown,\n): TrackingParams {\n return TRACKING_PARAM_KEYS.reduce<TrackingParams>((params, key) => {\n params[key] = normalizeTrackingCookieValue(readCookie(key));\n return params;\n }, createEmptyTrackingParams());\n}\n\nexport function getTrackingQueryValues(\n searchParams: Pick<URLSearchParams, 'get'>,\n): Partial<Record<TrackingParamKey, string>> {\n return TRACKING_PARAM_KEYS.reduce<Partial<Record<TrackingParamKey, string>>>((params, key) => {\n const value = searchParams.get(key);\n\n if (typeof value === 'string' && value.trim().length > 0) {\n params[key] = value;\n }\n\n return params;\n }, {});\n}\n\nexport function getCookieValueFromDocument(key: TrackingParamKey): string | null {\n if (typeof document === 'undefined')\n return null;\n\n const cookies = document.cookie ? document.cookie.split('; ') : [];\n const match = cookies.find((cookie) => cookie.startsWith(`${key}=`));\n\n if (!match)\n return null;\n\n const [, rawValue = ''] = match.split('=');\n return normalizeTrackingCookieValue(decodeURIComponent(rawValue));\n}\n\nexport function setTrackingCookie(\n key: TrackingParamKey,\n value: string,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): void {\n if (typeof document === 'undefined')\n return;\n\n const encodedValue = encodeURIComponent(value);\n document.cookie = `${key}=${encodedValue}; Max-Age=${maxAgeSeconds}; Path=/; SameSite=Lax`;\n}\n\nexport function persistTrackingParamsFromSearchParams(\n searchParams: Pick<URLSearchParams, 'get'>,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): Partial<Record<TrackingParamKey, string>> {\n const trackingValues = getTrackingQueryValues(searchParams);\n\n Object.entries(trackingValues).forEach(([key, value]) => {\n setTrackingCookie(key as TrackingParamKey, value, maxAgeSeconds);\n });\n\n return trackingValues;\n}\n\nexport function captureTrackingParamsFromLocation(\n url = typeof window === 'undefined' ? '' : window.location.href,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): TrackingParams {\n const resolvedUrl = typeof window === 'undefined'\n ? new URL(url || 'https://example.invalid')\n : new URL(url, window.location.origin);\n persistTrackingParamsFromSearchParams(resolvedUrl.searchParams, maxAgeSeconds);\n return getTrackingParamsFromCookieReader(getCookieValueFromDocument);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../../tracking-core/src/consent.ts","../../../tracking-core/src/gtag.ts","../../../tracking-core/src/tracking.ts"],"sourcesContent":["// Public entry for @aranova/tracking-browser. Served via jsDelivr for <script> installs:\n// https://cdn.jsdelivr.net/npm/@aranova/tracking-browser@<version>/dist/browser/aranova-tracking.global.js\nimport { getConsentState, setConsentState } from '../../tracking-core/src/index';\nimport { bootstrapGoogleAdsTracking } from '../../tracking-core/src/index';\nimport {\n captureTrackingParamsFromLocation,\n getCookieValueFromDocument,\n getTrackingParamsFromCookieReader,\n TRACKING_COOKIE_MAX_AGE_SECONDS,\n type TrackingInitConfig,\n type TrackingParams,\n} from '../../tracking-core/src/index';\n\nconst BANNER_ID = 'aranova-tracking-consent-banner';\n\nfunction getTrackingParams(): TrackingParams {\n return getTrackingParamsFromCookieReader(getCookieValueFromDocument);\n}\n\nfunction removeConsentBanner(): void {\n document.getElementById(BANNER_ID)?.remove();\n}\n\nfunction createConsentButton(label: string, onClick: () => void, style: Partial<CSSStyleDeclaration>): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = label;\n Object.assign(button.style, {\n borderRadius: '6px',\n padding: '10px 16px',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n border: '1px solid #d1d5db',\n background: '#ffffff',\n color: '#374151',\n }, style);\n button.addEventListener('click', onClick);\n return button;\n}\n\nfunction mountConsentBanner(): void {\n if (typeof document === 'undefined' || getConsentState() !== 'pending' || document.getElementById(BANNER_ID))\n return;\n\n const banner = document.createElement('div');\n banner.id = BANNER_ID;\n Object.assign(banner.style, {\n position: 'fixed',\n left: '0',\n right: '0',\n bottom: '0',\n zIndex: '2147483647',\n background: '#ffffff',\n borderTop: '1px solid #e5e7eb',\n boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.12)',\n padding: '16px',\n fontFamily: 'Inter, system-ui, sans-serif',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const container = document.createElement('div');\n Object.assign(container.style, {\n maxWidth: '960px',\n margin: '0 auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const message = document.createElement('p');\n message.textContent = 'We use cookies to understand ad performance and improve how our marketing works across visits. You can accept or decline this tracking.';\n Object.assign(message.style, {\n margin: '0',\n color: '#374151',\n fontSize: '14px',\n lineHeight: '1.5',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const actions = document.createElement('div');\n Object.assign(actions.style, {\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n } satisfies Partial<CSSStyleDeclaration>);\n\n const declineButton = createConsentButton('Decline', () => {\n setConsentState('denied');\n removeConsentBanner();\n }, {});\n\n const acceptButton = createConsentButton('Accept', () => {\n setConsentState('granted');\n removeConsentBanner();\n }, {\n background: '#111827',\n color: '#ffffff',\n border: '1px solid #111827',\n });\n\n actions.appendChild(declineButton);\n actions.appendChild(acceptButton);\n container.appendChild(message);\n container.appendChild(actions);\n banner.appendChild(container);\n document.body.appendChild(banner);\n}\n\nexport function init(config: TrackingInitConfig = {}): void {\n if (typeof window === 'undefined')\n return;\n\n const {\n autoCaptureTrackingParams = true,\n cookieMaxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n gtagId,\n renderConsentBanner = true,\n } = config;\n\n if (autoCaptureTrackingParams)\n captureTrackingParamsFromLocation(window.location.href, cookieMaxAgeSeconds);\n\n if (gtagId)\n bootstrapGoogleAdsTracking(gtagId);\n\n if (renderConsentBanner)\n mountConsentBanner();\n}\n\n// Keep the script surface small so browser installs stay easy to document.\nconst trackingScriptApi = {\n init,\n captureTrackingParams: (): TrackingParams => captureTrackingParamsFromLocation(),\n getTrackingParams,\n getConsentState,\n setConsentState,\n};\n\nif (typeof window !== 'undefined')\n window.AranovaTracking = trackingScriptApi;\n\nexport default trackingScriptApi;\n","import type { ConsentState } from './types';\n\nexport const CONSENT_STATE_KEY = 'consent_state';\nexport const CONSENT_TIMESTAMP_KEY = 'consent_timestamp';\n\nexport type GtagConsentValue = 'granted' | 'denied';\n\nexport interface ConsentUpdatePayload {\n ad_storage: GtagConsentValue;\n ad_user_data: GtagConsentValue;\n ad_personalization: GtagConsentValue;\n analytics_storage: GtagConsentValue;\n}\n\nexport function buildConsentPayload(state: GtagConsentValue): ConsentUpdatePayload {\n return {\n ad_storage: state,\n ad_user_data: state,\n ad_personalization: state,\n analytics_storage: state,\n };\n}\n\nexport function getConsentState(): ConsentState {\n if (typeof window === 'undefined')\n return 'pending';\n\n const storedState = window.localStorage.getItem(CONSENT_STATE_KEY);\n\n if (storedState === 'granted' || storedState === 'denied')\n return storedState;\n\n return 'pending';\n}\n\nexport function setConsentState(state: GtagConsentValue): void {\n if (typeof window === 'undefined')\n return;\n\n window.localStorage.setItem(CONSENT_STATE_KEY, state);\n window.localStorage.setItem(CONSENT_TIMESTAMP_KEY, new Date().toISOString());\n\n if (typeof window.gtag === 'function')\n window.gtag('consent', 'update', buildConsentPayload(state));\n}\n\nexport function restoreStoredConsent(): ConsentState {\n const consentState = getConsentState();\n\n if (consentState === 'granted' || consentState === 'denied')\n setConsentState(consentState);\n\n return consentState;\n}\n","import { buildConsentPayload, getConsentState, restoreStoredConsent } from './consent';\n\nexport const GTAG_SCRIPT_HOST = 'https://www.googletagmanager.com/gtag/js';\nexport const TRACKING_SCRIPT_ATTRIBUTE = 'data-aranova-tracking';\n\nfunction getScriptMarker(id: string): string {\n return `aranova-${id}`;\n}\n\nexport function createConsentDefaultScript(): string {\n return `\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\nwindow.gtag = gtag;\ngtag('consent', 'default', {\n ad_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n analytics_storage: 'denied',\n wait_for_update: 500,\n});\n`.trim();\n}\n\nexport function createGtagInitScript(gtagId: string): string {\n return `\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\nwindow.gtag = gtag;\ngtag('js', new Date());\ngtag('config', '${gtagId}');\n`.trim();\n}\n\nexport function createConsentRestoreScript(): string {\n return `\nconst consentState = window.localStorage.getItem('consent_state');\nif (window.gtag && (consentState === 'granted' || consentState === 'denied')) {\n window.gtag('consent', 'update', {\n ad_storage: consentState,\n ad_user_data: consentState,\n ad_personalization: consentState,\n analytics_storage: consentState,\n });\n}\n`.trim();\n}\n\nexport function ensureGtagFunction(): NonNullable<Window['gtag']> {\n window.dataLayer = window.dataLayer || [];\n\n if (typeof window.gtag === 'function')\n return window.gtag;\n\n window.gtag = (...args: unknown[]) => {\n window.dataLayer?.push(args);\n };\n\n return window.gtag;\n}\n\nexport function applyDefaultConsentState(): void {\n const gtag = ensureGtagFunction();\n gtag('consent', 'default', {\n ad_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n analytics_storage: 'denied',\n wait_for_update: 500,\n });\n}\n\nexport function loadGtagScript(gtagId: string): void {\n if (typeof document === 'undefined')\n return;\n\n const marker = getScriptMarker('gtag-loader');\n const existingScript = document.querySelector<HTMLScriptElement>(`script[${TRACKING_SCRIPT_ATTRIBUTE}=\"${marker}\"]`);\n if (existingScript)\n return;\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `${GTAG_SCRIPT_HOST}?id=${encodeURIComponent(gtagId)}`;\n script.setAttribute(TRACKING_SCRIPT_ATTRIBUTE, marker);\n document.head.appendChild(script);\n}\n\nexport function initializeGtag(gtagId: string): void {\n const gtag = ensureGtagFunction();\n gtag('js', new Date());\n gtag('config', gtagId);\n}\n\nexport function restoreConsentState(): void {\n if (typeof window === 'undefined')\n return;\n\n const consentState = getConsentState();\n if (consentState === 'granted' || consentState === 'denied')\n window.gtag?.('consent', 'update', buildConsentPayload(consentState));\n}\n\nexport function bootstrapGoogleAdsTracking(gtagId: string): void {\n if (typeof window === 'undefined' || typeof document === 'undefined')\n return;\n\n applyDefaultConsentState();\n loadGtagScript(gtagId);\n initializeGtag(gtagId);\n restoreStoredConsent();\n}\n","import type { TrackingParams } from './types';\n\nexport const TRACKING_COOKIE_MAX_AGE_SECONDS = 7_776_000;\n\nexport const TRACKING_PARAM_KEYS = [\n 'gclid',\n 'fbclid',\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_term',\n 'utm_content',\n] as const;\n\nexport type TrackingParamKey = (typeof TRACKING_PARAM_KEYS)[number];\n\nexport function createEmptyTrackingParams(): TrackingParams {\n return {\n gclid: null,\n fbclid: null,\n utm_source: null,\n utm_medium: null,\n utm_campaign: null,\n utm_term: null,\n utm_content: null,\n };\n}\n\nexport function normalizeTrackingCookieValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nexport function getTrackingParamsFromCookieReader(\n readCookie: (key: TrackingParamKey) => unknown,\n): TrackingParams {\n return TRACKING_PARAM_KEYS.reduce<TrackingParams>((params, key) => {\n params[key] = normalizeTrackingCookieValue(readCookie(key));\n return params;\n }, createEmptyTrackingParams());\n}\n\nexport function getTrackingQueryValues(\n searchParams: Pick<URLSearchParams, 'get'>,\n): Partial<Record<TrackingParamKey, string>> {\n return TRACKING_PARAM_KEYS.reduce<Partial<Record<TrackingParamKey, string>>>((params, key) => {\n const value = searchParams.get(key);\n\n if (typeof value === 'string' && value.trim().length > 0) {\n params[key] = value;\n }\n\n return params;\n }, {});\n}\n\nexport function getCookieValueFromDocument(key: TrackingParamKey): string | null {\n if (typeof document === 'undefined')\n return null;\n\n const cookies = document.cookie ? document.cookie.split('; ') : [];\n const match = cookies.find((cookie) => cookie.startsWith(`${key}=`));\n\n if (!match)\n return null;\n\n const [, rawValue = ''] = match.split('=');\n return normalizeTrackingCookieValue(decodeURIComponent(rawValue));\n}\n\nexport function setTrackingCookie(\n key: TrackingParamKey,\n value: string,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): void {\n if (typeof document === 'undefined')\n return;\n\n const encodedValue = encodeURIComponent(value);\n document.cookie = `${key}=${encodedValue}; Max-Age=${maxAgeSeconds}; Path=/; SameSite=Lax`;\n}\n\nexport function persistTrackingParamsFromSearchParams(\n searchParams: Pick<URLSearchParams, 'get'>,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): Partial<Record<TrackingParamKey, string>> {\n const trackingValues = getTrackingQueryValues(searchParams);\n\n Object.entries(trackingValues).forEach(([key, value]) => {\n setTrackingCookie(key as TrackingParamKey, value, maxAgeSeconds);\n });\n\n return trackingValues;\n}\n\nexport function captureTrackingParamsFromLocation(\n url = typeof window === 'undefined' ? '' : window.location.href,\n maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,\n): TrackingParams {\n const resolvedUrl = typeof window === 'undefined'\n ? new URL(url || 'https://example.invalid')\n : new URL(url, window.location.origin);\n persistTrackingParamsFromSearchParams(resolvedUrl.searchParams, maxAgeSeconds);\n return getTrackingParamsFromCookieReader(getCookieValueFromDocument);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,MAAM,oBAAoB;AAC1B,MAAM,wBAAwB;AAW9B,WAAS,oBAAoB,OAA+C;AACjF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEO,WAAS,kBAAgC;AAC9C,QAAI,OAAO,WAAW;AACpB,aAAO;AAET,UAAM,cAAc,OAAO,aAAa,QAAQ,iBAAiB;AAEjE,QAAI,gBAAgB,aAAa,gBAAgB;AAC/C,aAAO;AAET,WAAO;AAAA,EACT;AAEO,WAAS,gBAAgB,OAA+B;AAC7D,QAAI,OAAO,WAAW;AACpB;AAEF,WAAO,aAAa,QAAQ,mBAAmB,KAAK;AACpD,WAAO,aAAa,QAAQ,wBAAuB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAE3E,QAAI,OAAO,OAAO,SAAS;AACzB,aAAO,KAAK,WAAW,UAAU,oBAAoB,KAAK,CAAC;AAAA,EAC/D;AAEO,WAAS,uBAAqC;AACnD,UAAM,eAAe,gBAAgB;AAErC,QAAI,iBAAiB,aAAa,iBAAiB;AACjD,sBAAgB,YAAY;AAE9B,WAAO;AAAA,EACT;;;ACnDO,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAEzC,WAAS,gBAAgB,IAAoB;AAC3C,WAAO,WAAW,EAAE;AAAA,EACtB;AAyCO,WAAS,qBAAkD;AAChE,WAAO,YAAY,OAAO,aAAa,CAAC;AAExC,QAAI,OAAO,OAAO,SAAS;AACzB,aAAO,OAAO;AAEhB,WAAO,OAAO,IAAI,SAAoB;AACpC,aAAO,WAAW,KAAK,IAAI;AAAA,IAC7B;AAEA,WAAO,OAAO;AAAA,EAChB;AAEO,WAAS,2BAAiC;AAC/C,UAAM,OAAO,mBAAmB;AAChC,SAAK,WAAW,WAAW;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAEO,WAAS,eAAe,QAAsB;AACnD,QAAI,OAAO,aAAa;AACtB;AAEF,UAAM,SAAS,gBAAgB,aAAa;AAC5C,UAAM,iBAAiB,SAAS,cAAiC,UAAU,yBAAyB,KAAK,MAAM,IAAI;AACnH,QAAI;AACF;AAEF,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,MAAM,GAAG,gBAAgB,OAAO,mBAAmB,MAAM,CAAC;AACjE,WAAO,aAAa,2BAA2B,MAAM;AACrD,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC;AAEO,WAAS,eAAe,QAAsB;AACnD,UAAM,OAAO,mBAAmB;AAChC,SAAK,MAAM,oBAAI,KAAK,CAAC;AACrB,SAAK,UAAU,MAAM;AAAA,EACvB;AAWO,WAAS,2BAA2B,QAAsB;AAC/D,QAAI,OAAO,WAAW,eAAe,OAAO,aAAa;AACvD;AAEF,6BAAyB;AACzB,mBAAe,MAAM;AACrB,mBAAe,MAAM;AACrB,yBAAqB;AAAA,EACvB;;;AC7GO,MAAM,kCAAkC;AAExC,MAAM,sBAAsB;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAIO,WAAS,4BAA4C;AAC1D,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,EACF;AAEO,WAAS,6BAA6B,OAA+B;AAC1E,WAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AAAA,EACjE;AAEO,WAAS,kCACd,YACgB;AAChB,WAAO,oBAAoB,OAAuB,CAAC,QAAQ,QAAQ;AACjE,aAAO,GAAG,IAAI,6BAA6B,WAAW,GAAG,CAAC;AAC1D,aAAO;AAAA,IACT,GAAG,0BAA0B,CAAC;AAAA,EAChC;AAEO,WAAS,uBACd,cAC2C;AAC3C,WAAO,oBAAoB,OAAkD,CAAC,QAAQ,QAAQ;AAC5F,YAAM,QAAQ,aAAa,IAAI,GAAG;AAElC,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,eAAO,GAAG,IAAI;AAAA,MAChB;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AAEO,WAAS,2BAA2B,KAAsC;AAC/E,QAAI,OAAO,aAAa;AACtB,aAAO;AAET,UAAM,UAAU,SAAS,SAAS,SAAS,OAAO,MAAM,IAAI,IAAI,CAAC;AACjE,UAAM,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,WAAW,GAAG,GAAG,GAAG,CAAC;AAEnE,QAAI,CAAC;AACH,aAAO;AAET,UAAM,CAAC,EAAE,WAAW,EAAE,IAAI,MAAM,MAAM,GAAG;AACzC,WAAO,6BAA6B,mBAAmB,QAAQ,CAAC;AAAA,EAClE;AAEO,WAAS,kBACd,KACA,OACA,gBAAgB,iCACV;AACN,QAAI,OAAO,aAAa;AACtB;AAEF,UAAM,eAAe,mBAAmB,KAAK;AAC7C,aAAS,SAAS,GAAG,GAAG,IAAI,YAAY,aAAa,aAAa;AAAA,EACpE;AAEO,WAAS,sCACd,cACA,gBAAgB,iCAC2B;AAC3C,UAAM,iBAAiB,uBAAuB,YAAY;AAE1D,WAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,wBAAkB,KAAyB,OAAO,aAAa;AAAA,IACjE,CAAC;AAED,WAAO;AAAA,EACT;AAEO,WAAS,kCACd,MAAM,OAAO,WAAW,cAAc,KAAK,OAAO,SAAS,MAC3D,gBAAgB,iCACA;AAChB,UAAM,cAAc,OAAO,WAAW,cAClC,IAAI,IAAI,OAAO,yBAAyB,IACxC,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AACvC,0CAAsC,YAAY,cAAc,aAAa;AAC7E,WAAO,kCAAkC,0BAA0B;AAAA,EACrE;;;AH1FA,MAAM,YAAY;AAElB,WAAS,oBAAoC;AAC3C,WAAO,kCAAkC,0BAA0B;AAAA,EACrE;AAEA,WAAS,sBAA4B;AACnC,aAAS,eAAe,SAAS,GAAG,OAAO;AAAA,EAC7C;AAEA,WAAS,oBAAoB,OAAe,SAAqB,OAAwD;AACvH,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,cAAc;AACrB,WAAO,OAAO,OAAO,OAAO;AAAA,MAC1B,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,IACT,GAAG,KAAK;AACR,WAAO,iBAAiB,SAAS,OAAO;AACxC,WAAO;AAAA,EACT;AAEA,WAAS,qBAA2B;AAClC,QAAI,OAAO,aAAa,eAAe,gBAAgB,MAAM,aAAa,SAAS,eAAe,SAAS;AACzG;AAEF,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,KAAK;AACZ,WAAO,OAAO,OAAO,OAAO;AAAA,MAC1B,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAwC;AAExC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,WAAO,OAAO,UAAU,OAAO;AAAA,MAC7B,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK;AAAA,IACP,CAAwC;AAExC,UAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,YAAQ,cAAc;AACtB,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd,CAAwC;AAExC,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,SAAS;AAAA,MACT,KAAK;AAAA,MACL,UAAU;AAAA,IACZ,CAAwC;AAExC,UAAM,gBAAgB,oBAAoB,WAAW,MAAM;AACzD,sBAAgB,QAAQ;AACxB,0BAAoB;AAAA,IACtB,GAAG,CAAC,CAAC;AAEL,UAAM,eAAe,oBAAoB,UAAU,MAAM;AACvD,sBAAgB,SAAS;AACzB,0BAAoB;AAAA,IACtB,GAAG;AAAA,MACD,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,YAAQ,YAAY,aAAa;AACjC,YAAQ,YAAY,YAAY;AAChC,cAAU,YAAY,OAAO;AAC7B,cAAU,YAAY,OAAO;AAC7B,WAAO,YAAY,SAAS;AAC5B,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC;AAEO,WAAS,KAAK,SAA6B,CAAC,GAAS;AAC1D,QAAI,OAAO,WAAW;AACpB;AAEF,UAAM;AAAA,MACJ,4BAA4B;AAAA,MAC5B,sBAAsB;AAAA,MACtB;AAAA,MACA,sBAAsB;AAAA,IACxB,IAAI;AAEJ,QAAI;AACF,wCAAkC,OAAO,SAAS,MAAM,mBAAmB;AAE7E,QAAI;AACF,iCAA2B,MAAM;AAEnC,QAAI;AACF,yBAAmB;AAAA,EACvB;AAGA,MAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,uBAAuB,MAAsB,kCAAkC;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,WAAW;AACpB,WAAO,kBAAkB;AAE3B,MAAO,cAAQ;","names":[]}
|
package/package.json
CHANGED