@aranova/tracking-next 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,47 @@
1
+ import { C as ConsentState, T as TrackingInstallSurface, a as TrackingClientContext, b as TrackingParams, c as TrackingEventCreatePayload, d as TrackingSessionUpsertPayload } from './server-BMTa7njW.mjs';
2
+ export { e as TrackingInitConfig, g as getTrackingParamsServer } from './server-BMTa7njW.mjs';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ export { createTrackingMiddleware } from './middleware.mjs';
5
+ import 'next/server';
6
+
7
+ type GtagConsentValue = 'granted' | 'denied';
8
+ declare function getConsentState(): ConsentState;
9
+ declare function setConsentState(state: GtagConsentValue): void;
10
+
11
+ interface TrackingContextInput {
12
+ packageName?: string | null;
13
+ pageTitle?: string | null;
14
+ referrer?: string | null;
15
+ sdkVersion?: string | null;
16
+ siteOrigin?: string | null;
17
+ }
18
+ interface TrackingEventInput {
19
+ eventType: string;
20
+ metadata?: Record<string, unknown> | null;
21
+ pageUrl?: string | null;
22
+ sessionId: string;
23
+ }
24
+ interface TrackingSessionInput {
25
+ consentState?: Record<string, unknown> | null;
26
+ firstPage?: string | null;
27
+ sessionId: string;
28
+ }
29
+ declare function createTrackingClientContext(surface: TrackingInstallSurface, input?: TrackingContextInput): TrackingClientContext;
30
+ declare function createTrackingSessionUpsertPayload(trackingParams: TrackingParams, input: TrackingSessionInput, context: TrackingClientContext): TrackingSessionUpsertPayload;
31
+ declare function createTrackingEventCreatePayload(trackingParams: TrackingParams, input: TrackingEventInput, context: TrackingClientContext): TrackingEventCreatePayload;
32
+
33
+ declare const TRACKING_PARAM_KEYS: readonly ["gclid", "fbclid", "utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
34
+ declare function captureTrackingParamsFromLocation(url?: string, maxAgeSeconds?: number): TrackingParams;
35
+
36
+ declare function ConsentBanner(): react_jsx_runtime.JSX.Element | null;
37
+
38
+ declare function useGclid(): string | null;
39
+ declare function useTrackingParams(): TrackingParams;
40
+ declare function useConsentState(): ConsentState;
41
+
42
+ interface GoogleAdsTrackingProps {
43
+ gtagId: string;
44
+ }
45
+ declare function GoogleAdsTracking({ gtagId }: GoogleAdsTrackingProps): react_jsx_runtime.JSX.Element;
46
+
47
+ export { ConsentBanner, ConsentState, GoogleAdsTracking, type GoogleAdsTrackingProps, TRACKING_PARAM_KEYS, TrackingClientContext, TrackingEventCreatePayload, TrackingInstallSurface, TrackingParams, TrackingSessionUpsertPayload, captureTrackingParamsFromLocation, createTrackingClientContext, createTrackingEventCreatePayload, createTrackingSessionUpsertPayload, getConsentState, setConsentState, useConsentState, useGclid, useTrackingParams };
@@ -0,0 +1,47 @@
1
+ import { C as ConsentState, T as TrackingInstallSurface, a as TrackingClientContext, b as TrackingParams, c as TrackingEventCreatePayload, d as TrackingSessionUpsertPayload } from './server-BMTa7njW.js';
2
+ export { e as TrackingInitConfig, g as getTrackingParamsServer } from './server-BMTa7njW.js';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ export { createTrackingMiddleware } from './middleware.js';
5
+ import 'next/server';
6
+
7
+ type GtagConsentValue = 'granted' | 'denied';
8
+ declare function getConsentState(): ConsentState;
9
+ declare function setConsentState(state: GtagConsentValue): void;
10
+
11
+ interface TrackingContextInput {
12
+ packageName?: string | null;
13
+ pageTitle?: string | null;
14
+ referrer?: string | null;
15
+ sdkVersion?: string | null;
16
+ siteOrigin?: string | null;
17
+ }
18
+ interface TrackingEventInput {
19
+ eventType: string;
20
+ metadata?: Record<string, unknown> | null;
21
+ pageUrl?: string | null;
22
+ sessionId: string;
23
+ }
24
+ interface TrackingSessionInput {
25
+ consentState?: Record<string, unknown> | null;
26
+ firstPage?: string | null;
27
+ sessionId: string;
28
+ }
29
+ declare function createTrackingClientContext(surface: TrackingInstallSurface, input?: TrackingContextInput): TrackingClientContext;
30
+ declare function createTrackingSessionUpsertPayload(trackingParams: TrackingParams, input: TrackingSessionInput, context: TrackingClientContext): TrackingSessionUpsertPayload;
31
+ declare function createTrackingEventCreatePayload(trackingParams: TrackingParams, input: TrackingEventInput, context: TrackingClientContext): TrackingEventCreatePayload;
32
+
33
+ declare const TRACKING_PARAM_KEYS: readonly ["gclid", "fbclid", "utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
34
+ declare function captureTrackingParamsFromLocation(url?: string, maxAgeSeconds?: number): TrackingParams;
35
+
36
+ declare function ConsentBanner(): react_jsx_runtime.JSX.Element | null;
37
+
38
+ declare function useGclid(): string | null;
39
+ declare function useTrackingParams(): TrackingParams;
40
+ declare function useConsentState(): ConsentState;
41
+
42
+ interface GoogleAdsTrackingProps {
43
+ gtagId: string;
44
+ }
45
+ declare function GoogleAdsTracking({ gtagId }: GoogleAdsTrackingProps): react_jsx_runtime.JSX.Element;
46
+
47
+ export { ConsentBanner, ConsentState, GoogleAdsTracking, type GoogleAdsTrackingProps, TRACKING_PARAM_KEYS, TrackingClientContext, TrackingEventCreatePayload, TrackingInstallSurface, TrackingParams, TrackingSessionUpsertPayload, captureTrackingParamsFromLocation, createTrackingClientContext, createTrackingEventCreatePayload, createTrackingSessionUpsertPayload, getConsentState, setConsentState, useConsentState, useGclid, useTrackingParams };
package/dist/index.js ADDED
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ ConsentBanner: () => ConsentBanner,
34
+ GoogleAdsTracking: () => GoogleAdsTracking,
35
+ TRACKING_PARAM_KEYS: () => TRACKING_PARAM_KEYS,
36
+ captureTrackingParamsFromLocation: () => captureTrackingParamsFromLocation,
37
+ createTrackingClientContext: () => createTrackingClientContext,
38
+ createTrackingEventCreatePayload: () => createTrackingEventCreatePayload,
39
+ createTrackingMiddleware: () => createTrackingMiddleware,
40
+ createTrackingSessionUpsertPayload: () => createTrackingSessionUpsertPayload,
41
+ getConsentState: () => getConsentState,
42
+ getTrackingParamsServer: () => getTrackingParamsServer,
43
+ setConsentState: () => setConsentState,
44
+ useConsentState: () => useConsentState,
45
+ useGclid: () => useGclid,
46
+ useTrackingParams: () => useTrackingParams
47
+ });
48
+ module.exports = __toCommonJS(src_exports);
49
+
50
+ // ../tracking-core/src/consent.ts
51
+ var CONSENT_STATE_KEY = "consent_state";
52
+ var CONSENT_TIMESTAMP_KEY = "consent_timestamp";
53
+ function buildConsentPayload(state) {
54
+ return {
55
+ ad_storage: state,
56
+ ad_user_data: state,
57
+ ad_personalization: state,
58
+ analytics_storage: state
59
+ };
60
+ }
61
+ function getConsentState() {
62
+ if (typeof window === "undefined")
63
+ return "pending";
64
+ const storedState = window.localStorage.getItem(CONSENT_STATE_KEY);
65
+ if (storedState === "granted" || storedState === "denied")
66
+ return storedState;
67
+ return "pending";
68
+ }
69
+ function setConsentState(state) {
70
+ if (typeof window === "undefined")
71
+ return;
72
+ window.localStorage.setItem(CONSENT_STATE_KEY, state);
73
+ window.localStorage.setItem(CONSENT_TIMESTAMP_KEY, (/* @__PURE__ */ new Date()).toISOString());
74
+ if (typeof window.gtag === "function")
75
+ window.gtag("consent", "update", buildConsentPayload(state));
76
+ }
77
+
78
+ // ../tracking-core/src/payloads.ts
79
+ function createTrackingClientContext(surface, input = {}) {
80
+ return {
81
+ surface,
82
+ sdk_version: input.sdkVersion ?? null,
83
+ package_name: input.packageName ?? null,
84
+ site_origin: input.siteOrigin ?? (typeof window === "undefined" ? null : window.location.origin),
85
+ page_title: input.pageTitle ?? (typeof document === "undefined" ? null : document.title || null),
86
+ referrer: input.referrer ?? (typeof document === "undefined" ? null : document.referrer || null)
87
+ };
88
+ }
89
+ function createTrackingSessionUpsertPayload(trackingParams, input, context) {
90
+ return {
91
+ session_id: input.sessionId,
92
+ gclid: trackingParams.gclid,
93
+ fbclid: trackingParams.fbclid,
94
+ utm_source: trackingParams.utm_source,
95
+ utm_medium: trackingParams.utm_medium,
96
+ utm_campaign: trackingParams.utm_campaign,
97
+ utm_term: trackingParams.utm_term,
98
+ utm_content: trackingParams.utm_content,
99
+ first_page: input.firstPage ?? null,
100
+ consent_state: input.consentState ?? null,
101
+ context
102
+ };
103
+ }
104
+ function createTrackingEventCreatePayload(trackingParams, input, context) {
105
+ return {
106
+ session_id: input.sessionId,
107
+ event_type: input.eventType,
108
+ gclid: trackingParams.gclid,
109
+ fbclid: trackingParams.fbclid,
110
+ page_url: input.pageUrl ?? (typeof window === "undefined" ? null : window.location.href),
111
+ metadata: input.metadata ?? null,
112
+ context
113
+ };
114
+ }
115
+
116
+ // ../tracking-core/src/gtag.ts
117
+ function createConsentDefaultScript() {
118
+ return `
119
+ window.dataLayer = window.dataLayer || [];
120
+ function gtag(){dataLayer.push(arguments);}
121
+ window.gtag = gtag;
122
+ gtag('consent', 'default', {
123
+ ad_storage: 'denied',
124
+ ad_user_data: 'denied',
125
+ ad_personalization: 'denied',
126
+ analytics_storage: 'denied',
127
+ wait_for_update: 500,
128
+ });
129
+ `.trim();
130
+ }
131
+ function createGtagInitScript(gtagId) {
132
+ return `
133
+ window.dataLayer = window.dataLayer || [];
134
+ function gtag(){dataLayer.push(arguments);}
135
+ window.gtag = gtag;
136
+ gtag('js', new Date());
137
+ gtag('config', '${gtagId}');
138
+ `.trim();
139
+ }
140
+ function createConsentRestoreScript() {
141
+ return `
142
+ const consentState = window.localStorage.getItem('consent_state');
143
+ if (window.gtag && (consentState === 'granted' || consentState === 'denied')) {
144
+ window.gtag('consent', 'update', {
145
+ ad_storage: consentState,
146
+ ad_user_data: consentState,
147
+ ad_personalization: consentState,
148
+ analytics_storage: consentState,
149
+ });
150
+ }
151
+ `.trim();
152
+ }
153
+
154
+ // ../tracking-core/src/tracking.ts
155
+ var TRACKING_COOKIE_MAX_AGE_SECONDS = 7776e3;
156
+ var TRACKING_PARAM_KEYS = [
157
+ "gclid",
158
+ "fbclid",
159
+ "utm_source",
160
+ "utm_medium",
161
+ "utm_campaign",
162
+ "utm_term",
163
+ "utm_content"
164
+ ];
165
+ function createEmptyTrackingParams() {
166
+ return {
167
+ gclid: null,
168
+ fbclid: null,
169
+ utm_source: null,
170
+ utm_medium: null,
171
+ utm_campaign: null,
172
+ utm_term: null,
173
+ utm_content: null
174
+ };
175
+ }
176
+ function normalizeTrackingCookieValue(value) {
177
+ return typeof value === "string" && value.length > 0 ? value : null;
178
+ }
179
+ function getTrackingParamsFromCookieReader(readCookie) {
180
+ return TRACKING_PARAM_KEYS.reduce((params, key) => {
181
+ params[key] = normalizeTrackingCookieValue(readCookie(key));
182
+ return params;
183
+ }, createEmptyTrackingParams());
184
+ }
185
+ function getTrackingQueryValues(searchParams) {
186
+ return TRACKING_PARAM_KEYS.reduce((params, key) => {
187
+ const value = searchParams.get(key);
188
+ if (typeof value === "string" && value.trim().length > 0) {
189
+ params[key] = value;
190
+ }
191
+ return params;
192
+ }, {});
193
+ }
194
+ function getCookieValueFromDocument(key) {
195
+ if (typeof document === "undefined")
196
+ return null;
197
+ const cookies2 = document.cookie ? document.cookie.split("; ") : [];
198
+ const match = cookies2.find((cookie) => cookie.startsWith(`${key}=`));
199
+ if (!match)
200
+ return null;
201
+ const [, rawValue = ""] = match.split("=");
202
+ return normalizeTrackingCookieValue(decodeURIComponent(rawValue));
203
+ }
204
+ function setTrackingCookie(key, value, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
205
+ if (typeof document === "undefined")
206
+ return;
207
+ const encodedValue = encodeURIComponent(value);
208
+ document.cookie = `${key}=${encodedValue}; Max-Age=${maxAgeSeconds}; Path=/; SameSite=Lax`;
209
+ }
210
+ function persistTrackingParamsFromSearchParams(searchParams, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
211
+ const trackingValues = getTrackingQueryValues(searchParams);
212
+ Object.entries(trackingValues).forEach(([key, value]) => {
213
+ setTrackingCookie(key, value, maxAgeSeconds);
214
+ });
215
+ return trackingValues;
216
+ }
217
+ function captureTrackingParamsFromLocation(url = typeof window === "undefined" ? "" : window.location.href, maxAgeSeconds = TRACKING_COOKIE_MAX_AGE_SECONDS) {
218
+ const resolvedUrl = typeof window === "undefined" ? new URL(url || "https://example.invalid") : new URL(url, window.location.origin);
219
+ persistTrackingParamsFromSearchParams(resolvedUrl.searchParams, maxAgeSeconds);
220
+ return getTrackingParamsFromCookieReader(getCookieValueFromDocument);
221
+ }
222
+
223
+ // src/ConsentBanner.tsx
224
+ var import_react = require("react");
225
+ var import_jsx_runtime = require("react/jsx-runtime");
226
+ function ConsentBanner() {
227
+ const [consentState, setBannerConsentState] = (0, import_react.useState)("pending");
228
+ const [isReady, setIsReady] = (0, import_react.useState)(false);
229
+ (0, import_react.useEffect)(() => {
230
+ setBannerConsentState(getConsentState());
231
+ setIsReady(true);
232
+ }, []);
233
+ if (!isReady || consentState !== "pending")
234
+ return null;
235
+ const handleAccept = () => {
236
+ setConsentState("granted");
237
+ setBannerConsentState("granted");
238
+ };
239
+ const handleDecline = () => {
240
+ setConsentState("denied");
241
+ setBannerConsentState("denied");
242
+ };
243
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "fixed bottom-0 left-0 right-0 z-50 border-t border-gray-200 bg-white p-4 shadow-lg", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto flex max-w-5xl flex-col gap-4 md:flex-row md:items-center md:justify-between", children: [
244
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-gray-700", children: "We use cookies to understand ad performance and improve how our marketing works across visits. You can accept or decline this tracking." }),
245
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2 sm:flex-row", children: [
246
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
247
+ "button",
248
+ {
249
+ type: "button",
250
+ onClick: handleDecline,
251
+ className: "rounded-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-100",
252
+ children: "Decline"
253
+ }
254
+ ),
255
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
256
+ "button",
257
+ {
258
+ type: "button",
259
+ onClick: handleAccept,
260
+ className: "rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white transition hover:bg-gray-800",
261
+ children: "Accept"
262
+ }
263
+ )
264
+ ] })
265
+ ] }) });
266
+ }
267
+
268
+ // src/hooks.ts
269
+ var import_react2 = require("react");
270
+ function useGclid() {
271
+ const [gclid, setGclid] = (0, import_react2.useState)(null);
272
+ (0, import_react2.useEffect)(() => {
273
+ setGclid(getCookieValueFromDocument("gclid"));
274
+ }, []);
275
+ return gclid;
276
+ }
277
+ function useTrackingParams() {
278
+ const [trackingParams, setTrackingParams] = (0, import_react2.useState)(createEmptyTrackingParams());
279
+ (0, import_react2.useEffect)(() => {
280
+ setTrackingParams(getTrackingParamsFromCookieReader(getCookieValueFromDocument));
281
+ }, []);
282
+ return trackingParams;
283
+ }
284
+ function useConsentState() {
285
+ const [consentState, setConsentStateValue] = (0, import_react2.useState)("pending");
286
+ (0, import_react2.useEffect)(() => {
287
+ setConsentStateValue(getConsentState());
288
+ const handleStorage = (event) => {
289
+ if (event.key === "consent_state")
290
+ setConsentStateValue(getConsentState());
291
+ };
292
+ window.addEventListener("storage", handleStorage);
293
+ return () => {
294
+ window.removeEventListener("storage", handleStorage);
295
+ };
296
+ }, []);
297
+ return consentState;
298
+ }
299
+
300
+ // src/GoogleAdsTracking.tsx
301
+ var import_script = __toESM(require("next/script"));
302
+ var import_jsx_runtime2 = require("react/jsx-runtime");
303
+ function GoogleAdsTracking({ gtagId }) {
304
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
305
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_script.default, { id: "consent-default", strategy: "beforeInteractive", children: createConsentDefaultScript() }),
306
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
307
+ import_script.default,
308
+ {
309
+ src: `https://www.googletagmanager.com/gtag/js?id=${gtagId}`,
310
+ strategy: "afterInteractive"
311
+ }
312
+ ),
313
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_script.default, { id: "gtag-init", strategy: "afterInteractive", children: createGtagInitScript(gtagId) }),
314
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_script.default, { id: "consent-restore", strategy: "afterInteractive", children: createConsentRestoreScript() })
315
+ ] });
316
+ }
317
+
318
+ // src/middleware.ts
319
+ var import_server_only = require("server-only");
320
+ var import_server = require("next/server");
321
+ function createTrackingMiddleware() {
322
+ return (request) => {
323
+ const response = import_server.NextResponse.next();
324
+ const trackingValues = getTrackingQueryValues(request.nextUrl.searchParams);
325
+ Object.entries(trackingValues).forEach(([param, value]) => {
326
+ response.cookies.set(param, value, {
327
+ maxAge: 7776e3,
328
+ path: "/",
329
+ httpOnly: false
330
+ });
331
+ });
332
+ return response;
333
+ };
334
+ }
335
+
336
+ // src/server.ts
337
+ var import_server_only2 = require("server-only");
338
+ var import_headers = require("next/headers");
339
+ function getCookieStore() {
340
+ return (0, import_headers.cookies)();
341
+ }
342
+ function getTrackingParamsServer() {
343
+ const cookieStore = getCookieStore();
344
+ return getTrackingParamsFromCookieReader((key) => cookieStore.get(key)?.value);
345
+ }
346
+ // Annotate the CommonJS export names for ESM import in node:
347
+ 0 && (module.exports = {
348
+ ConsentBanner,
349
+ GoogleAdsTracking,
350
+ TRACKING_PARAM_KEYS,
351
+ captureTrackingParamsFromLocation,
352
+ createTrackingClientContext,
353
+ createTrackingEventCreatePayload,
354
+ createTrackingMiddleware,
355
+ createTrackingSessionUpsertPayload,
356
+ getConsentState,
357
+ getTrackingParamsServer,
358
+ setConsentState,
359
+ useConsentState,
360
+ useGclid,
361
+ useTrackingParams
362
+ });
363
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../../tracking-core/src/consent.ts","../../tracking-core/src/payloads.ts","../../tracking-core/src/gtag.ts","../../tracking-core/src/tracking.ts","../src/ConsentBanner.tsx","../src/hooks.ts","../src/GoogleAdsTracking.tsx","../src/middleware.ts","../src/server.ts"],"sourcesContent":["export { getConsentState, setConsentState } from '../../tracking-core/src/index';\nexport {\n captureTrackingParamsFromLocation,\n createTrackingClientContext,\n createTrackingEventCreatePayload,\n createTrackingSessionUpsertPayload,\n TRACKING_PARAM_KEYS,\n} from '../../tracking-core/src/index';\nexport type {\n ConsentState,\n TrackingClientContext,\n TrackingEventCreatePayload,\n TrackingInitConfig,\n TrackingInstallSurface,\n TrackingParams,\n TrackingSessionUpsertPayload,\n} from '../../tracking-core/src/index';\nexport { ConsentBanner } from './ConsentBanner';\nexport { useConsentState, useGclid, useTrackingParams } from './hooks';\nexport { GoogleAdsTracking, type GoogleAdsTrackingProps } from './GoogleAdsTracking';\nexport { createTrackingMiddleware } from './middleware';\nexport { getTrackingParamsServer } from './server';\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 type {\n TrackingClientContext,\n TrackingEventCreatePayload,\n TrackingInstallSurface,\n TrackingParams,\n TrackingSessionUpsertPayload,\n} from './types';\n\ninterface TrackingContextInput {\n packageName?: string | null;\n pageTitle?: string | null;\n referrer?: string | null;\n sdkVersion?: string | null;\n siteOrigin?: string | null;\n}\n\ninterface TrackingEventInput {\n eventType: string;\n metadata?: Record<string, unknown> | null;\n pageUrl?: string | null;\n sessionId: string;\n}\n\ninterface TrackingSessionInput {\n consentState?: Record<string, unknown> | null;\n firstPage?: string | null;\n sessionId: string;\n}\n\nexport function createTrackingClientContext(\n surface: TrackingInstallSurface,\n input: TrackingContextInput = {},\n): TrackingClientContext {\n return {\n surface,\n sdk_version: input.sdkVersion ?? null,\n package_name: input.packageName ?? null,\n site_origin: input.siteOrigin ?? (typeof window === 'undefined' ? null : window.location.origin),\n page_title: input.pageTitle ?? (typeof document === 'undefined' ? null : document.title || null),\n referrer: input.referrer ?? (typeof document === 'undefined' ? null : document.referrer || null),\n };\n}\n\nexport function createTrackingSessionUpsertPayload(\n trackingParams: TrackingParams,\n input: TrackingSessionInput,\n context: TrackingClientContext,\n): TrackingSessionUpsertPayload {\n return {\n session_id: input.sessionId,\n gclid: trackingParams.gclid,\n fbclid: trackingParams.fbclid,\n utm_source: trackingParams.utm_source,\n utm_medium: trackingParams.utm_medium,\n utm_campaign: trackingParams.utm_campaign,\n utm_term: trackingParams.utm_term,\n utm_content: trackingParams.utm_content,\n first_page: input.firstPage ?? null,\n consent_state: input.consentState ?? null,\n context,\n };\n}\n\nexport function createTrackingEventCreatePayload(\n trackingParams: TrackingParams,\n input: TrackingEventInput,\n context: TrackingClientContext,\n): TrackingEventCreatePayload {\n return {\n session_id: input.sessionId,\n event_type: input.eventType,\n gclid: trackingParams.gclid,\n fbclid: trackingParams.fbclid,\n page_url: input.pageUrl ?? (typeof window === 'undefined' ? null : window.location.href),\n metadata: input.metadata ?? null,\n context,\n };\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","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { getConsentState, setConsentState, type ConsentState } from '../../tracking-core/src/index';\n\nexport function ConsentBanner() {\n const [consentState, setBannerConsentState] = useState<ConsentState>('pending');\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n setBannerConsentState(getConsentState());\n setIsReady(true);\n }, []);\n\n if (!isReady || consentState !== 'pending')\n return null;\n\n const handleAccept = (): void => {\n setConsentState('granted');\n setBannerConsentState('granted');\n };\n\n const handleDecline = (): void => {\n setConsentState('denied');\n setBannerConsentState('denied');\n };\n\n return (\n <div className=\"fixed bottom-0 left-0 right-0 z-50 border-t border-gray-200 bg-white p-4 shadow-lg\">\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <p className=\"text-sm text-gray-700\">\n We use cookies to understand ad performance and improve how our marketing works across visits.\n You can accept or decline this tracking.\n </p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <button\n type=\"button\"\n onClick={handleDecline}\n className=\"rounded-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-100\"\n >\n Decline\n </button>\n <button\n type=\"button\"\n onClick={handleAccept}\n className=\"rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white transition hover:bg-gray-800\"\n >\n Accept\n </button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { getConsentState } from '../../tracking-core/src/index';\nimport {\n createEmptyTrackingParams,\n getCookieValueFromDocument,\n getTrackingParamsFromCookieReader,\n type ConsentState,\n type TrackingParams,\n} from '../../tracking-core/src/index';\n\nexport function useGclid(): string | null {\n const [gclid, setGclid] = useState<string | null>(null);\n\n useEffect(() => {\n setGclid(getCookieValueFromDocument('gclid'));\n }, []);\n\n return gclid;\n}\n\nexport function useTrackingParams(): TrackingParams {\n const [trackingParams, setTrackingParams] = useState<TrackingParams>(createEmptyTrackingParams());\n\n useEffect(() => {\n setTrackingParams(getTrackingParamsFromCookieReader(getCookieValueFromDocument));\n }, []);\n\n return trackingParams;\n}\n\nexport function useConsentState(): ConsentState {\n const [consentState, setConsentStateValue] = useState<ConsentState>('pending');\n\n useEffect(() => {\n setConsentStateValue(getConsentState());\n\n const handleStorage = (event: StorageEvent): void => {\n if (event.key === 'consent_state')\n setConsentStateValue(getConsentState());\n };\n\n window.addEventListener('storage', handleStorage);\n\n return () => {\n window.removeEventListener('storage', handleStorage);\n };\n }, []);\n\n return consentState;\n}\n","'use client';\n\nimport Script from 'next/script';\n\nimport {\n createConsentDefaultScript,\n createConsentRestoreScript,\n createGtagInitScript,\n} from '../../tracking-core/src/index';\n\nexport interface GoogleAdsTrackingProps {\n gtagId: string;\n}\n\nexport function GoogleAdsTracking({ gtagId }: GoogleAdsTrackingProps) {\n return (\n <>\n <Script id=\"consent-default\" strategy=\"beforeInteractive\">\n {createConsentDefaultScript()}\n </Script>\n <Script\n src={`https://www.googletagmanager.com/gtag/js?id=${gtagId}`}\n strategy=\"afterInteractive\"\n />\n <Script id=\"gtag-init\" strategy=\"afterInteractive\">\n {createGtagInitScript(gtagId)}\n </Script>\n <Script id=\"consent-restore\" strategy=\"afterInteractive\">\n {createConsentRestoreScript()}\n </Script>\n </>\n );\n}\n","import 'server-only';\n\nimport { NextResponse } from 'next/server';\nimport type { NextMiddleware, NextRequest } from 'next/server';\n\nimport { getTrackingQueryValues } from '../../tracking-core/src/index';\n\nexport function createTrackingMiddleware(): NextMiddleware {\n return (request: NextRequest) => {\n const response = NextResponse.next();\n const trackingValues = getTrackingQueryValues(request.nextUrl.searchParams);\n\n Object.entries(trackingValues).forEach(([param, value]) => {\n response.cookies.set(param, value, {\n maxAge: 7776000,\n path: '/',\n httpOnly: false,\n });\n });\n\n return response;\n };\n}\n","import 'server-only';\n\nimport { cookies } from 'next/headers';\n\nimport { getTrackingParamsFromCookieReader, type TrackingParams } from '../../tracking-core/src/index';\n\ninterface CookieValue {\n value: string;\n}\n\ninterface CookieStore {\n get(name: string): CookieValue | undefined;\n}\n\nfunction getCookieStore(): CookieStore {\n return cookies() as unknown as CookieStore;\n}\n\nexport function getTrackingParamsServer(): TrackingParams {\n const cookieStore = getCookieStore();\n return getTrackingParamsFromCookieReader((key) => cookieStore.get(key)?.value);\n}\n"],"mappings":"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","names":["cookies","import_react","import_jsx_runtime","Script","import_server_only"]}