@aranova/tracking-browser 0.2.2

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.
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ var AranovaTracking = (() => {
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ default: () => src_default,
25
+ init: () => init
26
+ });
27
+
28
+ // ../tracking-core/src/consent.ts
29
+ var CONSENT_STATE_KEY = "consent_state";
30
+ var CONSENT_TIMESTAMP_KEY = "consent_timestamp";
31
+ function buildConsentPayload(state) {
32
+ return {
33
+ ad_storage: state,
34
+ ad_user_data: state,
35
+ ad_personalization: state,
36
+ analytics_storage: state
37
+ };
38
+ }
39
+ function getConsentState() {
40
+ if (typeof window === "undefined")
41
+ return "pending";
42
+ const storedState = window.localStorage.getItem(CONSENT_STATE_KEY);
43
+ if (storedState === "granted" || storedState === "denied")
44
+ return storedState;
45
+ return "pending";
46
+ }
47
+ function setConsentState(state) {
48
+ if (typeof window === "undefined")
49
+ return;
50
+ window.localStorage.setItem(CONSENT_STATE_KEY, state);
51
+ window.localStorage.setItem(CONSENT_TIMESTAMP_KEY, (/* @__PURE__ */ new Date()).toISOString());
52
+ if (typeof window.gtag === "function")
53
+ window.gtag("consent", "update", buildConsentPayload(state));
54
+ }
55
+ function restoreStoredConsent() {
56
+ const consentState = getConsentState();
57
+ if (consentState === "granted" || consentState === "denied")
58
+ setConsentState(consentState);
59
+ return consentState;
60
+ }
61
+
62
+ // ../tracking-core/src/gtag.ts
63
+ var GTAG_SCRIPT_HOST = "https://www.googletagmanager.com/gtag/js";
64
+ var TRACKING_SCRIPT_ATTRIBUTE = "data-aranova-tracking";
65
+ function getScriptMarker(id) {
66
+ return `aranova-${id}`;
67
+ }
68
+ function ensureGtagFunction() {
69
+ window.dataLayer = window.dataLayer || [];
70
+ if (typeof window.gtag === "function")
71
+ return window.gtag;
72
+ window.gtag = (...args) => {
73
+ window.dataLayer?.push(args);
74
+ };
75
+ return window.gtag;
76
+ }
77
+ function applyDefaultConsentState() {
78
+ const gtag = ensureGtagFunction();
79
+ gtag("consent", "default", {
80
+ ad_storage: "denied",
81
+ ad_user_data: "denied",
82
+ ad_personalization: "denied",
83
+ analytics_storage: "denied",
84
+ wait_for_update: 500
85
+ });
86
+ }
87
+ function loadGtagScript(gtagId) {
88
+ if (typeof document === "undefined")
89
+ return;
90
+ const marker = getScriptMarker("gtag-loader");
91
+ const existingScript = document.querySelector(`script[${TRACKING_SCRIPT_ATTRIBUTE}="${marker}"]`);
92
+ if (existingScript)
93
+ return;
94
+ const script = document.createElement("script");
95
+ script.async = true;
96
+ script.src = `${GTAG_SCRIPT_HOST}?id=${encodeURIComponent(gtagId)}`;
97
+ script.setAttribute(TRACKING_SCRIPT_ATTRIBUTE, marker);
98
+ document.head.appendChild(script);
99
+ }
100
+ function initializeGtag(gtagId) {
101
+ const gtag = ensureGtagFunction();
102
+ gtag("js", /* @__PURE__ */ new Date());
103
+ gtag("config", gtagId);
104
+ }
105
+ function bootstrapGoogleAdsTracking(gtagId) {
106
+ if (typeof window === "undefined" || typeof document === "undefined")
107
+ return;
108
+ applyDefaultConsentState();
109
+ loadGtagScript(gtagId);
110
+ initializeGtag(gtagId);
111
+ restoreStoredConsent();
112
+ }
113
+
114
+ // ../tracking-core/src/tracking.ts
115
+ var TRACKING_COOKIE_MAX_AGE_SECONDS = 7776e3;
116
+ var TRACKING_PARAM_KEYS = [
117
+ "gclid",
118
+ "fbclid",
119
+ "utm_source",
120
+ "utm_medium",
121
+ "utm_campaign",
122
+ "utm_term",
123
+ "utm_content"
124
+ ];
125
+ function createEmptyTrackingParams() {
126
+ return {
127
+ gclid: null,
128
+ fbclid: null,
129
+ utm_source: null,
130
+ utm_medium: null,
131
+ utm_campaign: null,
132
+ utm_term: null,
133
+ utm_content: null
134
+ };
135
+ }
136
+ function normalizeTrackingCookieValue(value) {
137
+ return typeof value === "string" && value.length > 0 ? value : null;
138
+ }
139
+ function getTrackingParamsFromCookieReader(readCookie) {
140
+ return TRACKING_PARAM_KEYS.reduce((params, key) => {
141
+ params[key] = normalizeTrackingCookieValue(readCookie(key));
142
+ return params;
143
+ }, createEmptyTrackingParams());
144
+ }
145
+ function getTrackingQueryValues(searchParams) {
146
+ return TRACKING_PARAM_KEYS.reduce((params, key) => {
147
+ const value = searchParams.get(key);
148
+ if (typeof value === "string" && value.trim().length > 0) {
149
+ params[key] = value;
150
+ }
151
+ return params;
152
+ }, {});
153
+ }
154
+ function getCookieValueFromDocument(key) {
155
+ if (typeof document === "undefined")
156
+ return null;
157
+ const cookies = document.cookie ? document.cookie.split("; ") : [];
158
+ const match = cookies.find((cookie) => cookie.startsWith(`${key}=`));
159
+ if (!match)
160
+ return null;
161
+ const [, rawValue = ""] = match.split("=");
162
+ return normalizeTrackingCookieValue(decodeURIComponent(rawValue));
163
+ }
164
+ function setTrackingCookie(key, value, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
165
+ if (typeof document === "undefined")
166
+ return;
167
+ const encodedValue = encodeURIComponent(value);
168
+ document.cookie = `${key}=${encodedValue}; Max-Age=${maxAgeSeconds}; Path=/; SameSite=Lax`;
169
+ }
170
+ function persistTrackingParamsFromSearchParams(searchParams, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
171
+ const trackingValues = getTrackingQueryValues(searchParams);
172
+ Object.entries(trackingValues).forEach(([key, value]) => {
173
+ setTrackingCookie(key, value, maxAgeSeconds);
174
+ });
175
+ return trackingValues;
176
+ }
177
+ function captureTrackingParamsFromLocation(url = typeof window === "undefined" ? "" : window.location.href, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
178
+ const resolvedUrl = typeof window === "undefined" ? new URL(url || "https://example.invalid") : new URL(url, window.location.origin);
179
+ persistTrackingParamsFromSearchParams(resolvedUrl.searchParams, maxAgeSeconds);
180
+ return getTrackingParamsFromCookieReader(getCookieValueFromDocument);
181
+ }
182
+
183
+ // src/index.ts
184
+ var BANNER_ID = "aranova-tracking-consent-banner";
185
+ function getTrackingParams() {
186
+ return getTrackingParamsFromCookieReader(getCookieValueFromDocument);
187
+ }
188
+ function removeConsentBanner() {
189
+ document.getElementById(BANNER_ID)?.remove();
190
+ }
191
+ function createConsentButton(label, onClick, style) {
192
+ const button = document.createElement("button");
193
+ button.type = "button";
194
+ button.textContent = label;
195
+ Object.assign(button.style, {
196
+ borderRadius: "6px",
197
+ padding: "10px 16px",
198
+ fontSize: "14px",
199
+ fontWeight: "600",
200
+ cursor: "pointer",
201
+ border: "1px solid #d1d5db",
202
+ background: "#ffffff",
203
+ color: "#374151"
204
+ }, style);
205
+ button.addEventListener("click", onClick);
206
+ return button;
207
+ }
208
+ function mountConsentBanner() {
209
+ if (typeof document === "undefined" || getConsentState() !== "pending" || document.getElementById(BANNER_ID))
210
+ return;
211
+ const banner = document.createElement("div");
212
+ banner.id = BANNER_ID;
213
+ Object.assign(banner.style, {
214
+ position: "fixed",
215
+ left: "0",
216
+ right: "0",
217
+ bottom: "0",
218
+ zIndex: "2147483647",
219
+ background: "#ffffff",
220
+ borderTop: "1px solid #e5e7eb",
221
+ boxShadow: "0 -4px 20px rgba(0, 0, 0, 0.12)",
222
+ padding: "16px",
223
+ fontFamily: "Inter, system-ui, sans-serif"
224
+ });
225
+ const container = document.createElement("div");
226
+ Object.assign(container.style, {
227
+ maxWidth: "960px",
228
+ margin: "0 auto",
229
+ display: "flex",
230
+ flexDirection: "column",
231
+ gap: "12px"
232
+ });
233
+ const message = document.createElement("p");
234
+ message.textContent = "We use cookies to understand ad performance and improve how our marketing works across visits. You can accept or decline this tracking.";
235
+ Object.assign(message.style, {
236
+ margin: "0",
237
+ color: "#374151",
238
+ fontSize: "14px",
239
+ lineHeight: "1.5"
240
+ });
241
+ const actions = document.createElement("div");
242
+ Object.assign(actions.style, {
243
+ display: "flex",
244
+ gap: "8px",
245
+ flexWrap: "wrap"
246
+ });
247
+ const declineButton = createConsentButton("Decline", () => {
248
+ setConsentState("denied");
249
+ removeConsentBanner();
250
+ }, {});
251
+ const acceptButton = createConsentButton("Accept", () => {
252
+ setConsentState("granted");
253
+ removeConsentBanner();
254
+ }, {
255
+ background: "#111827",
256
+ color: "#ffffff",
257
+ border: "1px solid #111827"
258
+ });
259
+ actions.appendChild(declineButton);
260
+ actions.appendChild(acceptButton);
261
+ container.appendChild(message);
262
+ container.appendChild(actions);
263
+ banner.appendChild(container);
264
+ document.body.appendChild(banner);
265
+ }
266
+ function init(config = {}) {
267
+ if (typeof window === "undefined")
268
+ return;
269
+ const {
270
+ autoCaptureTrackingParams = true,
271
+ cookieMaxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS,
272
+ gtagId,
273
+ renderConsentBanner = true
274
+ } = config;
275
+ if (autoCaptureTrackingParams)
276
+ captureTrackingParamsFromLocation(window.location.href, cookieMaxAgeSeconds);
277
+ if (gtagId)
278
+ bootstrapGoogleAdsTracking(gtagId);
279
+ if (renderConsentBanner)
280
+ mountConsentBanner();
281
+ }
282
+ var trackingScriptApi = {
283
+ init,
284
+ captureTrackingParams: () => captureTrackingParamsFromLocation(),
285
+ getTrackingParams,
286
+ getConsentState,
287
+ setConsentState
288
+ };
289
+ if (typeof window !== "undefined")
290
+ window.AranovaTracking = trackingScriptApi;
291
+ var src_default = trackingScriptApi;
292
+ return __toCommonJS(src_exports);
293
+ })();
294
+ //# sourceMappingURL=aranova-tracking.global.js.map
@@ -0,0 +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":[]}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@aranova/tracking-browser",
3
+ "version": "0.2.2",
4
+ "private": false,
5
+ "description": "Aranova tracking global browser script (CDN / <script> install). Serve via jsDelivr, not as an npm import.",
6
+ "files": [
7
+ "dist/browser"
8
+ ],
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/AranovaIO/aranova_internal.git",
12
+ "directory": "packages/tracking-browser"
13
+ },
14
+ "homepage": "https://github.com/AranovaIO/aranova_internal/tree/master/packages/tracking-browser",
15
+ "scripts": {
16
+ "build": "tsup",
17
+ "dev": "tsup --watch",
18
+ "test": "vitest",
19
+ "test:run": "vitest run",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "devDependencies": {
23
+ "jsdom": "^29.0.1",
24
+ "tsup": "^8.5.1",
25
+ "typescript": "^5.7.3",
26
+ "vitest": "^4.1.4"
27
+ },
28
+ "publishConfig": {
29
+ "registry": "https://registry.npmjs.org",
30
+ "access": "public"
31
+ }
32
+ }