@shware/analytics 3.8.2 → 4.0.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.
- package/dist/click-id/index.cjs +125 -0
- package/dist/click-id/index.cjs.map +1 -0
- package/dist/click-id/index.d.cts +76 -0
- package/dist/click-id/index.d.cts.map +1 -0
- package/dist/click-id/index.d.mts +76 -0
- package/dist/click-id/index.d.mts.map +1 -0
- package/dist/click-id/index.mjs +119 -0
- package/dist/click-id/index.mjs.map +1 -0
- package/dist/constants/storage.cjs +1 -4
- package/dist/constants/storage.cjs.map +1 -1
- package/dist/constants/storage.d.cts +0 -3
- package/dist/constants/storage.d.cts.map +1 -1
- package/dist/constants/storage.d.mts +0 -3
- package/dist/constants/storage.d.mts.map +1 -1
- package/dist/constants/storage.mjs +1 -4
- package/dist/constants/storage.mjs.map +1 -1
- package/dist/hooks/use-report-web-vitals.cjs +17 -0
- package/dist/hooks/use-report-web-vitals.cjs.map +1 -0
- package/dist/hooks/use-report-web-vitals.d.cts +6 -0
- package/dist/hooks/use-report-web-vitals.d.cts.map +1 -0
- package/dist/hooks/use-report-web-vitals.d.mts +6 -0
- package/dist/hooks/use-report-web-vitals.d.mts.map +1 -0
- package/dist/hooks/use-report-web-vitals.mjs +16 -0
- package/dist/hooks/use-report-web-vitals.mjs.map +1 -0
- package/dist/next/index.cjs +1 -3
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts.map +1 -1
- package/dist/next/index.d.mts.map +1 -1
- package/dist/next/index.mjs +1 -3
- package/dist/next/index.mjs.map +1 -1
- package/dist/react-router/index.cjs +3 -15
- package/dist/react-router/index.cjs.map +1 -1
- package/dist/react-router/index.d.cts.map +1 -1
- package/dist/react-router/index.d.mts.map +1 -1
- package/dist/react-router/index.mjs +2 -14
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/server/index.cjs +7 -0
- package/dist/server/index.d.cts +2 -1
- package/dist/server/index.d.mts +2 -1
- package/dist/server/index.mjs +2 -1
- package/dist/tanstack/analytics.cjs +154 -0
- package/dist/tanstack/analytics.cjs.map +1 -0
- package/dist/tanstack/analytics.d.cts +22 -0
- package/dist/tanstack/analytics.d.cts.map +1 -0
- package/dist/tanstack/analytics.d.mts +22 -0
- package/dist/tanstack/analytics.d.mts.map +1 -0
- package/dist/tanstack/analytics.mjs +153 -0
- package/dist/tanstack/analytics.mjs.map +1 -0
- package/dist/tanstack/index.cjs +5 -165
- package/dist/tanstack/index.d.cts +3 -22
- package/dist/tanstack/index.d.mts +3 -22
- package/dist/tanstack/index.mjs +3 -165
- package/dist/tanstack/middleware.cjs +52 -0
- package/dist/tanstack/middleware.cjs.map +1 -0
- package/dist/tanstack/middleware.d.cts +54 -0
- package/dist/tanstack/middleware.d.cts.map +1 -0
- package/dist/tanstack/middleware.d.mts +54 -0
- package/dist/tanstack/middleware.d.mts.map +1 -0
- package/dist/tanstack/middleware.mjs +50 -0
- package/dist/tanstack/middleware.mjs.map +1 -0
- package/dist/web/index.cjs +3 -4
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts.map +1 -1
- package/dist/web/index.d.mts.map +1 -1
- package/dist/web/index.mjs +3 -4
- package/dist/web/index.mjs.map +1 -1
- package/package.json +5 -1
- package/dist/hooks/use-click-id-persistence.cjs +0 -52
- package/dist/hooks/use-click-id-persistence.cjs.map +0 -1
- package/dist/hooks/use-click-id-persistence.d.cts +0 -5
- package/dist/hooks/use-click-id-persistence.d.cts.map +0 -1
- package/dist/hooks/use-click-id-persistence.d.mts +0 -5
- package/dist/hooks/use-click-id-persistence.d.mts.map +0 -1
- package/dist/hooks/use-click-id-persistence.mjs +0 -51
- package/dist/hooks/use-click-id-persistence.mjs.map +0 -1
- package/dist/tanstack/index.cjs.map +0 -1
- package/dist/tanstack/index.d.cts.map +0 -1
- package/dist/tanstack/index.d.mts.map +0 -1
- package/dist/tanstack/index.mjs.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/tanstack/middleware.d.ts
|
|
2
|
+
interface ClickIdMiddlewareOptions {
|
|
3
|
+
/** `Domain` attribute for the cookies, e.g. `.edensign.io`. Omit for a host-only cookie. */
|
|
4
|
+
domain?: string;
|
|
5
|
+
/** `Secure` attribute, default true. Set false only for local http testing. */
|
|
6
|
+
secure?: boolean;
|
|
7
|
+
/** subdomainIndex for a freshly built `_fbc` (com=0, example.com=1, www.example.com=2). Default 1. */
|
|
8
|
+
subdomainIndex?: number;
|
|
9
|
+
/**
|
|
10
|
+
* Re-issue a still-valid `_fbc` on every request as an ITP self-heal (restores the long-lived
|
|
11
|
+
* HTTP cookie if the Meta Pixel's `document.cookie` write re-capped it to 24h in Safari). On by
|
|
12
|
+
* default. Note it attaches a per-user `Set-Cookie` — and thus `no-store` — to every page
|
|
13
|
+
* response carrying an `_fbc`, defeating CDN caching of those pages; set false to strictly follow
|
|
14
|
+
* Meta's conditional-write rule and keep them cacheable. See {@link resolveClickIdCookies}.
|
|
15
|
+
*/
|
|
16
|
+
refresh?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Override the `Cache-Control` of a response we attach cookies to (default `private, no-store`).
|
|
19
|
+
* A per-user `Set-Cookie` must never end up on a shared-cache entry, or one visitor's `_fbc` would
|
|
20
|
+
* be served to everyone. Only set this false if you guarantee these responses are never cached.
|
|
21
|
+
*/
|
|
22
|
+
cacheControl?: string | false;
|
|
23
|
+
/**
|
|
24
|
+
* Consent gate. Return false to skip setting cookies for this request (e.g. before the visitor has
|
|
25
|
+
* granted consent where required). Runs per request with the incoming `Request`.
|
|
26
|
+
*/
|
|
27
|
+
shouldPersist?: (request: Request) => boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* TanStack Start request middleware that persists ad click-id cookies (`_fbc`, `_rdt_cid`) on the
|
|
31
|
+
* document response.
|
|
32
|
+
*
|
|
33
|
+
* Setting `_fbc` here — on the top document via an HTTP `Set-Cookie` header, before any client JS
|
|
34
|
+
* runs — is what Meta officially recommends and the only reliable way to keep the cookie alive for
|
|
35
|
+
* 90 days in Safari: ITP caps JavaScript-set cookies on a fbclid-decorated landing page to 24
|
|
36
|
+
* hours, and a document response is never classified as CNAME/IP cloaking (it is the reference the
|
|
37
|
+
* browser measures cloaking against).
|
|
38
|
+
*
|
|
39
|
+
* Register it as a global request middleware:
|
|
40
|
+
* ```ts
|
|
41
|
+
* // start.ts
|
|
42
|
+
* import { createStart } from '@tanstack/react-start'
|
|
43
|
+
* import { clickIdMiddleware } from '@shware/analytics/tanstack'
|
|
44
|
+
* export const startInstance = createStart(() => ({ requestMiddleware: [clickIdMiddleware] }))
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc
|
|
48
|
+
*/
|
|
49
|
+
declare function createClickIdMiddleware(options?: ClickIdMiddlewareOptions): import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
50
|
+
/** Ready-to-register middleware with default options. */
|
|
51
|
+
declare const clickIdMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { ClickIdMiddlewareOptions, clickIdMiddleware, createClickIdMiddleware };
|
|
54
|
+
//# sourceMappingURL=middleware.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.cts","names":[],"sources":["../../src/tanstack/middleware.ts"],"mappings":";UAGiB;;EAEf;;EAEA;;EAEA;;;;;;;;EAQA;;;;;;EAMA;;;;;EAKA,iBAAiB,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAuBZ,wBAAwB,UAAS,2DAA6B;;cAkCjE,mDAAiB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/tanstack/middleware.d.ts
|
|
2
|
+
interface ClickIdMiddlewareOptions {
|
|
3
|
+
/** `Domain` attribute for the cookies, e.g. `.edensign.io`. Omit for a host-only cookie. */
|
|
4
|
+
domain?: string;
|
|
5
|
+
/** `Secure` attribute, default true. Set false only for local http testing. */
|
|
6
|
+
secure?: boolean;
|
|
7
|
+
/** subdomainIndex for a freshly built `_fbc` (com=0, example.com=1, www.example.com=2). Default 1. */
|
|
8
|
+
subdomainIndex?: number;
|
|
9
|
+
/**
|
|
10
|
+
* Re-issue a still-valid `_fbc` on every request as an ITP self-heal (restores the long-lived
|
|
11
|
+
* HTTP cookie if the Meta Pixel's `document.cookie` write re-capped it to 24h in Safari). On by
|
|
12
|
+
* default. Note it attaches a per-user `Set-Cookie` — and thus `no-store` — to every page
|
|
13
|
+
* response carrying an `_fbc`, defeating CDN caching of those pages; set false to strictly follow
|
|
14
|
+
* Meta's conditional-write rule and keep them cacheable. See {@link resolveClickIdCookies}.
|
|
15
|
+
*/
|
|
16
|
+
refresh?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Override the `Cache-Control` of a response we attach cookies to (default `private, no-store`).
|
|
19
|
+
* A per-user `Set-Cookie` must never end up on a shared-cache entry, or one visitor's `_fbc` would
|
|
20
|
+
* be served to everyone. Only set this false if you guarantee these responses are never cached.
|
|
21
|
+
*/
|
|
22
|
+
cacheControl?: string | false;
|
|
23
|
+
/**
|
|
24
|
+
* Consent gate. Return false to skip setting cookies for this request (e.g. before the visitor has
|
|
25
|
+
* granted consent where required). Runs per request with the incoming `Request`.
|
|
26
|
+
*/
|
|
27
|
+
shouldPersist?: (request: Request) => boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* TanStack Start request middleware that persists ad click-id cookies (`_fbc`, `_rdt_cid`) on the
|
|
31
|
+
* document response.
|
|
32
|
+
*
|
|
33
|
+
* Setting `_fbc` here — on the top document via an HTTP `Set-Cookie` header, before any client JS
|
|
34
|
+
* runs — is what Meta officially recommends and the only reliable way to keep the cookie alive for
|
|
35
|
+
* 90 days in Safari: ITP caps JavaScript-set cookies on a fbclid-decorated landing page to 24
|
|
36
|
+
* hours, and a document response is never classified as CNAME/IP cloaking (it is the reference the
|
|
37
|
+
* browser measures cloaking against).
|
|
38
|
+
*
|
|
39
|
+
* Register it as a global request middleware:
|
|
40
|
+
* ```ts
|
|
41
|
+
* // start.ts
|
|
42
|
+
* import { createStart } from '@tanstack/react-start'
|
|
43
|
+
* import { clickIdMiddleware } from '@shware/analytics/tanstack'
|
|
44
|
+
* export const startInstance = createStart(() => ({ requestMiddleware: [clickIdMiddleware] }))
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc
|
|
48
|
+
*/
|
|
49
|
+
declare function createClickIdMiddleware(options?: ClickIdMiddlewareOptions): import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
50
|
+
/** Ready-to-register middleware with default options. */
|
|
51
|
+
declare const clickIdMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { ClickIdMiddlewareOptions, clickIdMiddleware, createClickIdMiddleware };
|
|
54
|
+
//# sourceMappingURL=middleware.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.mts","names":[],"sources":["../../src/tanstack/middleware.ts"],"mappings":";UAGiB;;EAEf;;EAEA;;EAEA;;;;;;;;EAQA;;;;;;EAMA;;;;;EAKA,iBAAiB,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAuBZ,wBAAwB,UAAS,2DAA6B;;cAkCjE,mDAAiB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { resolveClickIdCookies, toSetCookieHeaders } from "../click-id/index.mjs";
|
|
2
|
+
import { createMiddleware } from "@tanstack/react-start";
|
|
3
|
+
//#region src/tanstack/middleware.ts
|
|
4
|
+
/**
|
|
5
|
+
* TanStack Start request middleware that persists ad click-id cookies (`_fbc`, `_rdt_cid`) on the
|
|
6
|
+
* document response.
|
|
7
|
+
*
|
|
8
|
+
* Setting `_fbc` here — on the top document via an HTTP `Set-Cookie` header, before any client JS
|
|
9
|
+
* runs — is what Meta officially recommends and the only reliable way to keep the cookie alive for
|
|
10
|
+
* 90 days in Safari: ITP caps JavaScript-set cookies on a fbclid-decorated landing page to 24
|
|
11
|
+
* hours, and a document response is never classified as CNAME/IP cloaking (it is the reference the
|
|
12
|
+
* browser measures cloaking against).
|
|
13
|
+
*
|
|
14
|
+
* Register it as a global request middleware:
|
|
15
|
+
* ```ts
|
|
16
|
+
* // start.ts
|
|
17
|
+
* import { createStart } from '@tanstack/react-start'
|
|
18
|
+
* import { clickIdMiddleware } from '@shware/analytics/tanstack'
|
|
19
|
+
* export const startInstance = createStart(() => ({ requestMiddleware: [clickIdMiddleware] }))
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc
|
|
23
|
+
*/
|
|
24
|
+
function createClickIdMiddleware(options = {}) {
|
|
25
|
+
const { cacheControl = "private, no-store" } = options;
|
|
26
|
+
return createMiddleware({ type: "request" }).server(async ({ request, next, handlerType }) => {
|
|
27
|
+
const result = await next();
|
|
28
|
+
if (handlerType !== "router") return result;
|
|
29
|
+
if (options.shouldPersist && !options.shouldPersist(request)) return result;
|
|
30
|
+
const { cookies } = resolveClickIdCookies({
|
|
31
|
+
url: request.url,
|
|
32
|
+
cookieHeader: request.headers.get("cookie"),
|
|
33
|
+
domain: options.domain,
|
|
34
|
+
secure: options.secure,
|
|
35
|
+
subdomainIndex: options.subdomainIndex,
|
|
36
|
+
refresh: options.refresh ?? true
|
|
37
|
+
});
|
|
38
|
+
if (cookies.length > 0) {
|
|
39
|
+
for (const header of toSetCookieHeaders(cookies)) result.response.headers.append("set-cookie", header);
|
|
40
|
+
if (cacheControl !== false) result.response.headers.set("cache-control", cacheControl);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Ready-to-register middleware with default options. */
|
|
46
|
+
const clickIdMiddleware = createClickIdMiddleware();
|
|
47
|
+
//#endregion
|
|
48
|
+
export { clickIdMiddleware, createClickIdMiddleware };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=middleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.mjs","names":[],"sources":["../../src/tanstack/middleware.ts"],"sourcesContent":["import { createMiddleware } from '@tanstack/react-start';\nimport { resolveClickIdCookies, toSetCookieHeaders } from '../click-id/index';\n\nexport interface ClickIdMiddlewareOptions {\n /** `Domain` attribute for the cookies, e.g. `.edensign.io`. Omit for a host-only cookie. */\n domain?: string;\n /** `Secure` attribute, default true. Set false only for local http testing. */\n secure?: boolean;\n /** subdomainIndex for a freshly built `_fbc` (com=0, example.com=1, www.example.com=2). Default 1. */\n subdomainIndex?: number;\n /**\n * Re-issue a still-valid `_fbc` on every request as an ITP self-heal (restores the long-lived\n * HTTP cookie if the Meta Pixel's `document.cookie` write re-capped it to 24h in Safari). On by\n * default. Note it attaches a per-user `Set-Cookie` — and thus `no-store` — to every page\n * response carrying an `_fbc`, defeating CDN caching of those pages; set false to strictly follow\n * Meta's conditional-write rule and keep them cacheable. See {@link resolveClickIdCookies}.\n */\n refresh?: boolean;\n /**\n * Override the `Cache-Control` of a response we attach cookies to (default `private, no-store`).\n * A per-user `Set-Cookie` must never end up on a shared-cache entry, or one visitor's `_fbc` would\n * be served to everyone. Only set this false if you guarantee these responses are never cached.\n */\n cacheControl?: string | false;\n /**\n * Consent gate. Return false to skip setting cookies for this request (e.g. before the visitor has\n * granted consent where required). Runs per request with the incoming `Request`.\n */\n shouldPersist?: (request: Request) => boolean;\n}\n\n/**\n * TanStack Start request middleware that persists ad click-id cookies (`_fbc`, `_rdt_cid`) on the\n * document response.\n *\n * Setting `_fbc` here — on the top document via an HTTP `Set-Cookie` header, before any client JS\n * runs — is what Meta officially recommends and the only reliable way to keep the cookie alive for\n * 90 days in Safari: ITP caps JavaScript-set cookies on a fbclid-decorated landing page to 24\n * hours, and a document response is never classified as CNAME/IP cloaking (it is the reference the\n * browser measures cloaking against).\n *\n * Register it as a global request middleware:\n * ```ts\n * // start.ts\n * import { createStart } from '@tanstack/react-start'\n * import { clickIdMiddleware } from '@shware/analytics/tanstack'\n * export const startInstance = createStart(() => ({ requestMiddleware: [clickIdMiddleware] }))\n * ```\n *\n * reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n */\nexport function createClickIdMiddleware(options: ClickIdMiddlewareOptions = {}) {\n const { cacheControl = 'private, no-store' } = options;\n\n return createMiddleware({ type: 'request' }).server(async ({ request, next, handlerType }) => {\n const result = await next();\n\n // Skip serverFn RPC responses. 'router' covers SSR document requests *and* custom server\n // routes (API endpoints) — those also get cookies when the URL carries a click id.\n if (handlerType !== 'router') return result;\n if (options.shouldPersist && !options.shouldPersist(request)) return result;\n\n const { cookies } = resolveClickIdCookies({\n url: request.url,\n cookieHeader: request.headers.get('cookie'),\n domain: options.domain,\n secure: options.secure,\n subdomainIndex: options.subdomainIndex,\n refresh: options.refresh ?? true,\n });\n\n if (cookies.length > 0) {\n for (const header of toSetCookieHeaders(cookies)) {\n result.response.headers.append('set-cookie', header);\n }\n if (cacheControl !== false) {\n result.response.headers.set('cache-control', cacheControl);\n }\n }\n\n return result;\n });\n}\n\n/** Ready-to-register middleware with default options. */\nexport const clickIdMiddleware = createClickIdMiddleware();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmDA,SAAgB,wBAAwB,UAAoC,CAAC,GAAG;CAC9E,MAAM,EAAE,eAAe,wBAAwB;CAE/C,OAAO,iBAAiB,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,SAAS,MAAM,kBAAkB;EAC5F,MAAM,SAAS,MAAM,KAAK;EAI1B,IAAI,gBAAgB,UAAU,OAAO;EACrC,IAAI,QAAQ,iBAAiB,CAAC,QAAQ,cAAc,OAAO,GAAG,OAAO;EAErE,MAAM,EAAE,YAAY,sBAAsB;GACxC,KAAK,QAAQ;GACb,cAAc,QAAQ,QAAQ,IAAI,QAAQ;GAC1C,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,gBAAgB,QAAQ;GACxB,SAAS,QAAQ,WAAW;EAC9B,CAAC;EAED,IAAI,QAAQ,SAAS,GAAG;GACtB,KAAK,MAAM,UAAU,mBAAmB,OAAO,GAC7C,OAAO,SAAS,QAAQ,OAAO,cAAc,MAAM;GAErD,IAAI,iBAAiB,OACnB,OAAO,SAAS,QAAQ,IAAI,iBAAiB,YAAY;EAE7D;EAEA,OAAO;CACT,CAAC;AACH;;AAGA,MAAa,oBAAoB,wBAAwB"}
|
package/dist/web/index.cjs
CHANGED
|
@@ -3,7 +3,6 @@ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
|
3
3
|
const require_setup_index = require("../setup/index.cjs");
|
|
4
4
|
const require_constants_storage = require("../constants/storage.cjs");
|
|
5
5
|
const require_link_index = require("../link/index.cjs");
|
|
6
|
-
let _shware_utils = require("@shware/utils");
|
|
7
6
|
let uuid = require("uuid");
|
|
8
7
|
let cookie = require("cookie");
|
|
9
8
|
let bowser = require("bowser");
|
|
@@ -48,9 +47,9 @@ async function getTags() {
|
|
|
48
47
|
source: "web",
|
|
49
48
|
source_url: window.location.href,
|
|
50
49
|
page_referrer: document.referrer || void 0,
|
|
51
|
-
fbc: parsed._fbc ??
|
|
50
|
+
fbc: parsed._fbc ?? void 0,
|
|
52
51
|
fbp: parsed._fbp,
|
|
53
|
-
fbclid: params.get("fbclid") ??
|
|
52
|
+
fbclid: params.get("fbclid") ?? void 0,
|
|
54
53
|
ad_id: params.get("ad_id") ?? void 0,
|
|
55
54
|
ad_name: params.get("ad_name") ?? void 0,
|
|
56
55
|
adset_id: params.get("adset_id") ?? void 0,
|
|
@@ -63,7 +62,7 @@ async function getTags() {
|
|
|
63
62
|
gclsrc: params.get("gclsrc") ?? void 0,
|
|
64
63
|
gad_source: params.get("gad_source") ?? void 0,
|
|
65
64
|
gad_campaignid: params.get("gad_campaignid") ?? void 0,
|
|
66
|
-
rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ??
|
|
65
|
+
rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ?? void 0,
|
|
67
66
|
rdt_uuid: parsed._rdt_uuid,
|
|
68
67
|
li_fat_id: params.get("li_fat_id") ?? parsed.li_fat_id ?? void 0,
|
|
69
68
|
dclid: params.get("dclid") ?? void 0,
|
package/dist/web/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["keys","Bowser","getLink","config"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["keys","Bowser","getLink","config"],"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { keys } from '../constants/storage';\nimport { getLink } from '../link/index';\nimport { type Storage, cache, config } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem(keys.device_id);\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem(keys.device_id, id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n const linkId = params.get('s');\n const link = linkId ? await getLink(linkId) : null;\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.href,\n page_referrer: document.referrer || undefined,\n // Meta Ads — _fbc is set server-side (see @shware/analytics/server resolveClickIdCookies)\n fbc: parsed._fbc ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // Google Ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // Reddit Ads — _rdt_cid is set server-side (see @shware/analytics/server resolveClickIdCookies)\n rdt_cid: params.get('rdt_cid') ?? parsed._rdt_cid ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // LinkedIn Ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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"}
|
package/dist/web/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/web/index.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/web/index.ts"],"mappings":";;;iBAQgB;iBAQM,WAAO,QAAA;cAsFhB,SAAS"}
|
package/dist/web/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/web/index.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/web/index.ts"],"mappings":";;;iBAQgB;iBAQM,WAAO,QAAA;cAsFhB,SAAS"}
|
package/dist/web/index.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { cache, config } from "../setup/index.mjs";
|
|
2
2
|
import { keys } from "../constants/storage.mjs";
|
|
3
3
|
import { getLink } from "../link/index.mjs";
|
|
4
|
-
import { expiringStorage } from "@shware/utils";
|
|
5
4
|
import { v4 } from "uuid";
|
|
6
5
|
import { parseCookie } from "cookie";
|
|
7
6
|
import Bowser from "bowser";
|
|
@@ -45,9 +44,9 @@ async function getTags() {
|
|
|
45
44
|
source: "web",
|
|
46
45
|
source_url: window.location.href,
|
|
47
46
|
page_referrer: document.referrer || void 0,
|
|
48
|
-
fbc: parsed._fbc ??
|
|
47
|
+
fbc: parsed._fbc ?? void 0,
|
|
49
48
|
fbp: parsed._fbp,
|
|
50
|
-
fbclid: params.get("fbclid") ??
|
|
49
|
+
fbclid: params.get("fbclid") ?? void 0,
|
|
51
50
|
ad_id: params.get("ad_id") ?? void 0,
|
|
52
51
|
ad_name: params.get("ad_name") ?? void 0,
|
|
53
52
|
adset_id: params.get("adset_id") ?? void 0,
|
|
@@ -60,7 +59,7 @@ async function getTags() {
|
|
|
60
59
|
gclsrc: params.get("gclsrc") ?? void 0,
|
|
61
60
|
gad_source: params.get("gad_source") ?? void 0,
|
|
62
61
|
gad_campaignid: params.get("gad_campaignid") ?? void 0,
|
|
63
|
-
rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ??
|
|
62
|
+
rdt_cid: params.get("rdt_cid") ?? parsed._rdt_cid ?? void 0,
|
|
64
63
|
rdt_uuid: parsed._rdt_uuid,
|
|
65
64
|
li_fat_id: params.get("li_fat_id") ?? parsed.li_fat_id ?? void 0,
|
|
66
65
|
dclid: params.get("dclid") ?? void 0,
|
package/dist/web/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["uuidv4"],"sources":["../../src/web/index.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["uuidv4"],"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport { parseCookie } from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { keys } from '../constants/storage';\nimport { getLink } from '../link/index';\nimport { type Storage, cache, config } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem(keys.device_id);\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem(keys.device_id, id);\n return id;\n}\n\nexport async function getTags() {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = parseCookie(document.cookie);\n\n const linkId = params.get('s');\n const link = linkId ? await getLink(linkId) : null;\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: window.devicePixelRatio,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release: config.release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.href,\n page_referrer: document.referrer || undefined,\n // Meta Ads — _fbc is set server-side (see @shware/analytics/server resolveClickIdCookies)\n fbc: parsed._fbc ?? undefined,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // Google Ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // Reddit Ads — _rdt_cid is set server-side (see @shware/analytics/server resolveClickIdCookies)\n rdt_cid: params.get('rdt_cid') ?? parsed._rdt_cid ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // LinkedIn Ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shware/analytics",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -144,6 +144,7 @@
|
|
|
144
144
|
"peerDependencies": {
|
|
145
145
|
"@react-native-firebase/analytics": "^25.1.0",
|
|
146
146
|
"@tanstack/react-router": "^1.170.17",
|
|
147
|
+
"@tanstack/react-start": "^1.168.0",
|
|
147
148
|
"expo-application": "^57.0.0",
|
|
148
149
|
"expo-clipboard": "^57.0.0",
|
|
149
150
|
"expo-crypto": "^57.0.0",
|
|
@@ -167,6 +168,9 @@
|
|
|
167
168
|
"@tanstack/react-router": {
|
|
168
169
|
"optional": true
|
|
169
170
|
},
|
|
171
|
+
"@tanstack/react-start": {
|
|
172
|
+
"optional": true
|
|
173
|
+
},
|
|
170
174
|
"expo-application": {
|
|
171
175
|
"optional": true
|
|
172
176
|
},
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_constants_storage = require("../constants/storage.cjs");
|
|
3
|
-
let _shware_utils = require("@shware/utils");
|
|
4
|
-
let react = require("react");
|
|
5
|
-
let cookie = require("cookie");
|
|
6
|
-
//#region src/hooks/use-click-id-persistence.ts
|
|
7
|
-
const TTL_MS = 2160 * 60 * 60 * 1e3;
|
|
8
|
-
function setCookie(name, value, ttlInMs) {
|
|
9
|
-
const d = /* @__PURE__ */ new Date();
|
|
10
|
-
d.setTime(d.getTime() + ttlInMs);
|
|
11
|
-
const expires = `expires=${d.toUTCString()}`;
|
|
12
|
-
document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;
|
|
13
|
-
}
|
|
14
|
-
/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */
|
|
15
|
-
function extractFbclid(fbc) {
|
|
16
|
-
const parts = fbc.split(".");
|
|
17
|
-
return parts.length >= 4 ? parts.slice(3).join(".") : void 0;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Persist a click-id value across cookie + localStorage.
|
|
21
|
-
* - cookie: readable by third-party SDKs (e.g. Meta Pixel)
|
|
22
|
-
* - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps
|
|
23
|
-
*
|
|
24
|
-
* If only one store has the value, sync it to the other.
|
|
25
|
-
*/
|
|
26
|
-
function persist(cookieName, storageKey, cookieValue, newValue) {
|
|
27
|
-
if (newValue) {
|
|
28
|
-
setCookie(cookieName, newValue, TTL_MS);
|
|
29
|
-
_shware_utils.expiringStorage.setItem(storageKey, newValue, TTL_MS);
|
|
30
|
-
} else {
|
|
31
|
-
const stored = _shware_utils.expiringStorage.getItem(storageKey);
|
|
32
|
-
if (cookieValue && !stored) _shware_utils.expiringStorage.setItem(storageKey, cookieValue, TTL_MS);
|
|
33
|
-
else if (!cookieValue && stored) setCookie(cookieName, stored, TTL_MS);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function useClickIdPersistence() {
|
|
37
|
-
(0, react.useEffect)(() => {
|
|
38
|
-
const params = new URLSearchParams(window.location.search);
|
|
39
|
-
const parsed = (0, cookie.parseCookie)(document.cookie);
|
|
40
|
-
const fbclid = params.get("fbclid");
|
|
41
|
-
const existingFbc = parsed._fbc ?? _shware_utils.expiringStorage.getItem(require_constants_storage.keys.fbc);
|
|
42
|
-
const newFbc = fbclid && extractFbclid(existingFbc ?? "") !== fbclid ? `fb.1.${Date.now()}.${fbclid}` : void 0;
|
|
43
|
-
persist("_fbc", require_constants_storage.keys.fbc, parsed._fbc, newFbc);
|
|
44
|
-
if (fbclid) _shware_utils.expiringStorage.setItem(require_constants_storage.keys.fbclid, fbclid, TTL_MS);
|
|
45
|
-
const rdt_cid = params.get("rdt_cid");
|
|
46
|
-
persist("_rdt_cid", require_constants_storage.keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
47
|
-
}, []);
|
|
48
|
-
}
|
|
49
|
-
//#endregion
|
|
50
|
-
exports.useClickIdPersistence = useClickIdPersistence;
|
|
51
|
-
|
|
52
|
-
//# sourceMappingURL=use-click-id-persistence.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-click-id-persistence.cjs","names":["expiringStorage","keys"],"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":";;;;;;AAMA,MAAM,SAAS,OAAU,KAAK,KAAK;AAEnC,SAAS,UAAU,MAAc,OAAe,SAAiB;CAC/D,MAAM,oBAAI,IAAI,KAAK;CACnB,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO;CAC/B,MAAM,UAAU,WAAW,EAAE,YAAY;CACzC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,IAAI,QAAQ;AACjD;;AAGA,SAAS,cAAc,KAAiC;CAEtD,MAAM,QAAQ,IAAI,MAAM,GAAG;CAC3B,OAAO,MAAM,UAAU,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACxD;;;;;;;;AASA,SAAS,QACP,YACA,YACA,aACA,UACA;CACA,IAAI,UAAU;EACZ,UAAU,YAAY,UAAU,MAAM;EACtC,cAAA,gBAAgB,QAAQ,YAAY,UAAU,MAAM;CACtD,OAAO;EACL,MAAM,SAASA,cAAAA,gBAAgB,QAAgB,UAAU;EACzD,IAAI,eAAe,CAAC,QAElB,cAAA,gBAAgB,QAAQ,YAAY,aAAa,MAAM;OAClD,IAAI,CAAC,eAAe,QAEzB,UAAU,YAAY,QAAQ,MAAM;CAExC;AACF;AAKA,SAAgB,wBAAwB;CACtC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;EACzD,MAAM,UAAA,GAAA,OAAA,YAAA,CAAqB,SAAS,MAAM;EAG1C,MAAM,SAAS,OAAO,IAAI,QAAQ;EAClC,MAAM,cAAc,OAAO,QAAQA,cAAAA,gBAAgB,QAAgBC,0BAAAA,KAAK,GAAG;EAG3E,MAAM,SADgB,UAAU,cAAc,eAAe,EAAE,MAAM,SACtC,QAAQ,KAAK,IAAI,EAAE,GAAG,WAAW,KAAA;EAEhE,QAAQ,QAAQA,0BAAAA,KAAK,KAAK,OAAO,MAAM,MAAM;EAI7C,IAAI,QACF,cAAA,gBAAgB,QAAQA,0BAAAA,KAAK,QAAQ,QAAQ,MAAM;EAIrD,MAAM,UAAU,OAAO,IAAI,SAAS;EACpC,QAAQ,YAAYA,0BAAAA,KAAK,SAAS,OAAO,UAAU,WAAW,KAAA,CAAS;CACzE,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-click-id-persistence.d.cts","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"mappings":";iBAqDgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-click-id-persistence.d.mts","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"mappings":";iBAqDgB"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { keys } from "../constants/storage.mjs";
|
|
2
|
-
import { expiringStorage } from "@shware/utils";
|
|
3
|
-
import { useEffect } from "react";
|
|
4
|
-
import { parseCookie } from "cookie";
|
|
5
|
-
//#region src/hooks/use-click-id-persistence.ts
|
|
6
|
-
const TTL_MS = 2160 * 60 * 60 * 1e3;
|
|
7
|
-
function setCookie(name, value, ttlInMs) {
|
|
8
|
-
const d = /* @__PURE__ */ new Date();
|
|
9
|
-
d.setTime(d.getTime() + ttlInMs);
|
|
10
|
-
const expires = `expires=${d.toUTCString()}`;
|
|
11
|
-
document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;
|
|
12
|
-
}
|
|
13
|
-
/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */
|
|
14
|
-
function extractFbclid(fbc) {
|
|
15
|
-
const parts = fbc.split(".");
|
|
16
|
-
return parts.length >= 4 ? parts.slice(3).join(".") : void 0;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Persist a click-id value across cookie + localStorage.
|
|
20
|
-
* - cookie: readable by third-party SDKs (e.g. Meta Pixel)
|
|
21
|
-
* - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps
|
|
22
|
-
*
|
|
23
|
-
* If only one store has the value, sync it to the other.
|
|
24
|
-
*/
|
|
25
|
-
function persist(cookieName, storageKey, cookieValue, newValue) {
|
|
26
|
-
if (newValue) {
|
|
27
|
-
setCookie(cookieName, newValue, TTL_MS);
|
|
28
|
-
expiringStorage.setItem(storageKey, newValue, TTL_MS);
|
|
29
|
-
} else {
|
|
30
|
-
const stored = expiringStorage.getItem(storageKey);
|
|
31
|
-
if (cookieValue && !stored) expiringStorage.setItem(storageKey, cookieValue, TTL_MS);
|
|
32
|
-
else if (!cookieValue && stored) setCookie(cookieName, stored, TTL_MS);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function useClickIdPersistence() {
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
const params = new URLSearchParams(window.location.search);
|
|
38
|
-
const parsed = parseCookie(document.cookie);
|
|
39
|
-
const fbclid = params.get("fbclid");
|
|
40
|
-
const existingFbc = parsed._fbc ?? expiringStorage.getItem(keys.fbc);
|
|
41
|
-
const newFbc = fbclid && extractFbclid(existingFbc ?? "") !== fbclid ? `fb.1.${Date.now()}.${fbclid}` : void 0;
|
|
42
|
-
persist("_fbc", keys.fbc, parsed._fbc, newFbc);
|
|
43
|
-
if (fbclid) expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);
|
|
44
|
-
const rdt_cid = params.get("rdt_cid");
|
|
45
|
-
persist("_rdt_cid", keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? void 0);
|
|
46
|
-
}, []);
|
|
47
|
-
}
|
|
48
|
-
//#endregion
|
|
49
|
-
export { useClickIdPersistence };
|
|
50
|
-
|
|
51
|
-
//# sourceMappingURL=use-click-id-persistence.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-click-id-persistence.mjs","names":[],"sources":["../../src/hooks/use-click-id-persistence.ts"],"sourcesContent":["import { expiringStorage } from '@shware/utils';\nimport { parseCookie } from 'cookie';\nimport { useEffect } from 'react';\nimport { keys } from '../constants/storage';\n\n// common practice ~90 days\nconst TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\nfunction setCookie(name: string, value: string, ttlInMs: number) {\n const d = new Date();\n d.setTime(d.getTime() + ttlInMs);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${name}=${value}; ${expires}; path=/; SameSite=Lax; Secure`;\n}\n\n/** Extract the raw fbclid portion from a formatted fbc string (fb.1.ts.FBCLID) */\nfunction extractFbclid(fbc: string): string | undefined {\n // fb.<subdomainIndex>.<creationTime>.<fbclid>\n const parts = fbc.split('.');\n return parts.length >= 4 ? parts.slice(3).join('.') : undefined;\n}\n\n/**\n * Persist a click-id value across cookie + localStorage.\n * - cookie: readable by third-party SDKs (e.g. Meta Pixel)\n * - localStorage (via expiringStorage): survives Safari ITP JS-cookie caps\n *\n * If only one store has the value, sync it to the other.\n */\nfunction persist(\n cookieName: string,\n storageKey: string,\n cookieValue: string | undefined,\n newValue: string | undefined\n) {\n if (newValue) {\n setCookie(cookieName, newValue, TTL_MS);\n expiringStorage.setItem(storageKey, newValue, TTL_MS);\n } else {\n const stored = expiringStorage.getItem<string>(storageKey);\n if (cookieValue && !stored) {\n // cookie → localStorage: back up before ITP wipes the cookie\n expiringStorage.setItem(storageKey, cookieValue, TTL_MS);\n } else if (!cookieValue && stored) {\n // localStorage → cookie: restore so third-party SDKs (Meta Pixel) can read it\n setCookie(cookieName, stored, TTL_MS);\n }\n }\n}\n\n// todo: do not set tracking cookies before the user has granted consent where required.\n// reference: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/#3--store-clickid\n// reference: https://watsspace.com/blog/meta-conversions-api-fbc-and-fbp-parameters/\nexport function useClickIdPersistence() {\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const parsed = parseCookie(document.cookie);\n\n // --- Meta fbc ---\n const fbclid = params.get('fbclid');\n const existingFbc = parsed._fbc ?? expiringStorage.getItem<string>(keys.fbc);\n // Only build a new fbc if the fbclid actually changed (preserve original creationTime otherwise).\n const fbclidChanged = fbclid && extractFbclid(existingFbc ?? '') !== fbclid;\n const newFbc = fbclidChanged ? `fb.1.${Date.now()}.${fbclid}` : undefined;\n\n persist('_fbc', keys.fbc, parsed._fbc, newFbc);\n\n // Also persist raw fbclid so the server-side Conversions API fallback\n // (fbc reconstruction from fbclid) works even after SPA navigation.\n if (fbclid) {\n expiringStorage.setItem(keys.fbclid, fbclid, TTL_MS);\n }\n\n // --- Reddit rdt_cid ---\n const rdt_cid = params.get('rdt_cid');\n persist('_rdt_cid', keys.rdt_cid, parsed._rdt_cid, rdt_cid ?? undefined);\n }, []);\n}\n"],"mappings":";;;;;AAMA,MAAM,SAAS,OAAU,KAAK,KAAK;AAEnC,SAAS,UAAU,MAAc,OAAe,SAAiB;CAC/D,MAAM,oBAAI,IAAI,KAAK;CACnB,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO;CAC/B,MAAM,UAAU,WAAW,EAAE,YAAY;CACzC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,IAAI,QAAQ;AACjD;;AAGA,SAAS,cAAc,KAAiC;CAEtD,MAAM,QAAQ,IAAI,MAAM,GAAG;CAC3B,OAAO,MAAM,UAAU,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACxD;;;;;;;;AASA,SAAS,QACP,YACA,YACA,aACA,UACA;CACA,IAAI,UAAU;EACZ,UAAU,YAAY,UAAU,MAAM;EACtC,gBAAgB,QAAQ,YAAY,UAAU,MAAM;CACtD,OAAO;EACL,MAAM,SAAS,gBAAgB,QAAgB,UAAU;EACzD,IAAI,eAAe,CAAC,QAElB,gBAAgB,QAAQ,YAAY,aAAa,MAAM;OAClD,IAAI,CAAC,eAAe,QAEzB,UAAU,YAAY,QAAQ,MAAM;CAExC;AACF;AAKA,SAAgB,wBAAwB;CACtC,gBAAgB;EACd,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;EACzD,MAAM,SAAS,YAAY,SAAS,MAAM;EAG1C,MAAM,SAAS,OAAO,IAAI,QAAQ;EAClC,MAAM,cAAc,OAAO,QAAQ,gBAAgB,QAAgB,KAAK,GAAG;EAG3E,MAAM,SADgB,UAAU,cAAc,eAAe,EAAE,MAAM,SACtC,QAAQ,KAAK,IAAI,EAAE,GAAG,WAAW,KAAA;EAEhE,QAAQ,QAAQ,KAAK,KAAK,OAAO,MAAM,MAAM;EAI7C,IAAI,QACF,gBAAgB,QAAQ,KAAK,QAAQ,QAAQ,MAAM;EAIrD,MAAM,UAAU,OAAO,IAAI,SAAS;EACpC,QAAQ,YAAY,KAAK,SAAS,OAAO,UAAU,WAAW,KAAA,CAAS;CACzE,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/tanstack/index.tsx"],"sourcesContent":["import { useLocation } from '@tanstack/react-router';\nimport { useEffect } from 'react';\nimport { type Metric, onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { useOutboundClickAnalytics } from '../hooks/use-outbound-click-analytics';\nimport { useWebAnalytics } from '../hooks/use-web-analytics';\nimport type { PixelId as MetaPixelId } from '../track/fbq';\nimport type { GaId, GtmId } from '../track/gtag';\nimport { track } from '../track/index';\nimport type { PixelId as RedditPixelId } from '../track/rdt';\n\nfunction useReportWebVitals(reportWebVitalsFn: (metric: Metric) => void) {\n useEffect(() => {\n onCLS(reportWebVitalsFn);\n onLCP(reportWebVitalsFn);\n onINP(reportWebVitalsFn);\n onFCP(reportWebVitalsFn);\n onTTFB(reportWebVitalsFn);\n }, [reportWebVitalsFn]);\n}\n\ninterface Props {\n gaId?: GaId;\n gaSrc?: string;\n gtmId?: GtmId;\n metaPixelId?: MetaPixelId;\n openaiPixelId?: string;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n hotjarId?: `${number}`;\n facebookAppId?: string;\n nonce?: string;\n debugMode?: boolean;\n reportWebVitals?: boolean;\n}\n\nexport function Analytics({\n gaId,\n gaSrc,\n nonce,\n debugMode,\n metaPixelId,\n openaiPixelId,\n redditPixelId,\n linkedInPartnerId,\n hotjarId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n useClickIdPersistence();\n\n const { pathname } = useLocation();\n useWebAnalytics(pathname);\n useOutboundClickAnalytics();\n\n useReportWebVitals((metric) => {\n if (!reportWebVitals) return;\n const properties = {\n value: metric.delta,\n metric_id: metric.id,\n metric_value: metric.value,\n metric_delta: metric.delta,\n metric_rating: metric.rating,\n metric_navigation_type: metric.navigationType,\n non_interaction: true, // avoids affecting bounce rate.\n };\n track(metric.name, properties);\n });\n\n return (\n <>\n {facebookAppId && <meta property=\"fb:app_id\" content={facebookAppId} />}\n {gaId && (\n <>\n <script\n async\n id=\"gtag\"\n nonce={nonce}\n src={gaSrc ?? `https://www.googletagmanager.com/gtag/js?id=${gaId}`}\n />\n <script\n async\n nonce={nonce}\n id=\"gtag-init\"\n dangerouslySetInnerHTML={{\n __html: `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}'${debugMode ? \" ,{ 'debug_mode': true }\" : ''});\n `,\n }}\n />\n </>\n )}\n {metaPixelId && (\n <script\n async\n id=\"meta-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n !(function (f, b, e, v, n, t, s) {\n if (f.fbq) return;\n n = f.fbq = function () {\n n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n n.push = n;\n n.loaded = !0;\n n.version = '2.0';\n n.queue = [];\n t = b.createElement(e);\n t.async = !0;\n t.src = v;\n s = b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t, s);\n })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '${metaPixelId}');\n fbq('track', 'PageView');`,\n }}\n />\n )}\n {openaiPixelId && (\n <script\n async\n id=\"openai-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n (function (w, d, s, u) {\n if (w.oaiq) return;\n var q = function () {\n q.q.push(arguments);\n };\n q.q = [];\n w.oaiq = q;\n var js = d.createElement(s);\n js.async = true;\n js.src = u;\n var f = d.getElementsByTagName(s)[0];\n f.parentNode.insertBefore(js, f);\n })(window, document, \"script\", \"https://bzrcdn.openai.com/sdk/oaiq.min.js\");\n\n oaiq(\"init\", { pixelId: \"${openaiPixelId}\" });\n oaiq(\"measure\", \"page_viewed\", { type: \"contents\" });\n `,\n }}\n />\n )}\n {redditPixelId && (\n <script\n async\n id=\"reddit-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(w,d) {\n if(!w.rdt) {\n var p = w.rdt = function() {\n p.sendEvent ? p.sendEvent.apply(p,arguments) : p.callQueue.push(arguments)\n };\n p.callQueue = [];\n var t = d.createElement(\"script\");\n t.src = \"https://www.redditstatic.com/ads/pixel.js\";\n t.async = !0;\n var s = d.getElementsByTagName(\"script\")[0];\n s.parentNode.insertBefore(t,s)\n }\n }(window, document);\n rdt('init', '${redditPixelId}');\n rdt('track', 'PageVisit');`,\n }}\n />\n )}\n {linkedInPartnerId && (\n <script\n async\n id=\"linkedin-insight-tag\"\n dangerouslySetInnerHTML={{\n __html: `\n _linkedin_partner_id = \"${linkedInPartnerId}\";\n window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];\n window._linkedin_data_partner_ids.push(_linkedin_partner_id);\n\n (function(l) {\n if (!l){\n window.lintrk = function(a,b){\n window.lintrk.q.push([a,b])\n };\n window.lintrk.q=[]\n }\n var s = document.getElementsByTagName(\"script\")[0];\n var b = document.createElement(\"script\");\n b.type = \"text/javascript\";b.async = true;\n b.src = \"https://snap.licdn.com/li.lms-analytics/insight.min.js\";\n s.parentNode.insertBefore(b, s);\n })(window.lintrk);\n `,\n }}\n />\n )}\n {hotjarId && (\n <script\n async\n id=\"hotjar\"\n dangerouslySetInnerHTML={{\n __html: `\n (function(h,o,t,j,a,r){\n h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n h._hjSettings={hjid:${hotjarId},hjsv:6};\n a=o.getElementsByTagName('head')[0];\n r=o.createElement('script');r.async=1;\n r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n a.appendChild(r);\n })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n `,\n }}\n />\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAS,mBAAmB,mBAA6C;CACvE,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,CAAA,GAAA,WAAA,MAAA,CAAM,iBAAiB;EACvB,CAAA,GAAA,WAAA,MAAA,CAAM,iBAAiB;EACvB,CAAA,GAAA,WAAA,MAAA,CAAM,iBAAiB;EACvB,CAAA,GAAA,WAAA,MAAA,CAAM,iBAAiB;EACvB,CAAA,GAAA,WAAA,OAAA,CAAO,iBAAiB;CAC1B,GAAG,CAAC,iBAAiB,CAAC;AACxB;AAiBA,SAAgB,UAAU,EACxB,MACA,OACA,OACA,WACA,aACA,eACA,eACA,mBACA,UACA,eACA,kBAAkB,QACV;CACR,uCAAA,sBAAsB;CAEtB,MAAM,EAAE,cAAA,GAAA,uBAAA,YAAA,CAAyB;CACjC,gCAAA,gBAAgB,QAAQ;CACxB,2CAAA,0BAA0B;CAE1B,oBAAoB,WAAW;EAC7B,IAAI,CAAC,iBAAiB;EACtB,MAAM,aAAa;GACjB,OAAO,OAAO;GACd,WAAW,OAAO;GAClB,cAAc,OAAO;GACrB,cAAc,OAAO;GACrB,eAAe,OAAO;GACtB,wBAAwB,OAAO;GAC/B,iBAAiB;EACnB;EACA,oBAAA,MAAM,OAAO,MAAM,UAAU;CAC/B,CAAC;CAED,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACG,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,UAAS;GAAY,SAAS;EAAgB,CAAA;EACrE,QACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACI;GACP,KAAK,SAAS,+CAA+C;EAC9D,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACO;GACP,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;gCAIU,KAAK,GAAG,YAAY,6BAA6B,GAAG;cAExE;EACD,CAAA,CACD,EAAA,CAAA;EAEH,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;;;;2BAiBO,YAAY;uCAE7B;EACD,CAAA;EAEF,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;;2CAeuB,cAAc;;cAG/C;EACD,CAAA;EAEF,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;2BAcO,cAAc;wCAE/B;EACD,CAAA;EAEF,qBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;sCACkB,kBAAkB;;;;;;;;;;;;;;;;;cAkB9C;EACD,CAAA;EAEF,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;oCAGgB,SAAS;;;;;;cAOnC;EACD,CAAA;CAEH,EAAA,CAAA;AAEN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/tanstack/index.tsx"],"mappings":";;;;UAqBU;EACR,OAAO;EACP;EACA,QAAQ;EACR,cAAc;EACd;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGc,YACd,MACA,OACA,OACA,WACA,aACA,eACA,eACA,mBACA,UACA,eACA,mBACC,wBAAK,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/tanstack/index.tsx"],"mappings":";;;;UAqBU;EACR,OAAO;EACP;EACA,QAAQ;EACR,cAAc;EACd;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGc,YACd,MACA,OACA,OACA,WACA,aACA,eACA,eACA,mBACA,UACA,eACA,mBACC,wBAAK,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/tanstack/index.tsx"],"sourcesContent":["import { useLocation } from '@tanstack/react-router';\nimport { useEffect } from 'react';\nimport { type Metric, onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { useOutboundClickAnalytics } from '../hooks/use-outbound-click-analytics';\nimport { useWebAnalytics } from '../hooks/use-web-analytics';\nimport type { PixelId as MetaPixelId } from '../track/fbq';\nimport type { GaId, GtmId } from '../track/gtag';\nimport { track } from '../track/index';\nimport type { PixelId as RedditPixelId } from '../track/rdt';\n\nfunction useReportWebVitals(reportWebVitalsFn: (metric: Metric) => void) {\n useEffect(() => {\n onCLS(reportWebVitalsFn);\n onLCP(reportWebVitalsFn);\n onINP(reportWebVitalsFn);\n onFCP(reportWebVitalsFn);\n onTTFB(reportWebVitalsFn);\n }, [reportWebVitalsFn]);\n}\n\ninterface Props {\n gaId?: GaId;\n gaSrc?: string;\n gtmId?: GtmId;\n metaPixelId?: MetaPixelId;\n openaiPixelId?: string;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n hotjarId?: `${number}`;\n facebookAppId?: string;\n nonce?: string;\n debugMode?: boolean;\n reportWebVitals?: boolean;\n}\n\nexport function Analytics({\n gaId,\n gaSrc,\n nonce,\n debugMode,\n metaPixelId,\n openaiPixelId,\n redditPixelId,\n linkedInPartnerId,\n hotjarId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n useClickIdPersistence();\n\n const { pathname } = useLocation();\n useWebAnalytics(pathname);\n useOutboundClickAnalytics();\n\n useReportWebVitals((metric) => {\n if (!reportWebVitals) return;\n const properties = {\n value: metric.delta,\n metric_id: metric.id,\n metric_value: metric.value,\n metric_delta: metric.delta,\n metric_rating: metric.rating,\n metric_navigation_type: metric.navigationType,\n non_interaction: true, // avoids affecting bounce rate.\n };\n track(metric.name, properties);\n });\n\n return (\n <>\n {facebookAppId && <meta property=\"fb:app_id\" content={facebookAppId} />}\n {gaId && (\n <>\n <script\n async\n id=\"gtag\"\n nonce={nonce}\n src={gaSrc ?? `https://www.googletagmanager.com/gtag/js?id=${gaId}`}\n />\n <script\n async\n nonce={nonce}\n id=\"gtag-init\"\n dangerouslySetInnerHTML={{\n __html: `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}'${debugMode ? \" ,{ 'debug_mode': true }\" : ''});\n `,\n }}\n />\n </>\n )}\n {metaPixelId && (\n <script\n async\n id=\"meta-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n !(function (f, b, e, v, n, t, s) {\n if (f.fbq) return;\n n = f.fbq = function () {\n n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n n.push = n;\n n.loaded = !0;\n n.version = '2.0';\n n.queue = [];\n t = b.createElement(e);\n t.async = !0;\n t.src = v;\n s = b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t, s);\n })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '${metaPixelId}');\n fbq('track', 'PageView');`,\n }}\n />\n )}\n {openaiPixelId && (\n <script\n async\n id=\"openai-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n (function (w, d, s, u) {\n if (w.oaiq) return;\n var q = function () {\n q.q.push(arguments);\n };\n q.q = [];\n w.oaiq = q;\n var js = d.createElement(s);\n js.async = true;\n js.src = u;\n var f = d.getElementsByTagName(s)[0];\n f.parentNode.insertBefore(js, f);\n })(window, document, \"script\", \"https://bzrcdn.openai.com/sdk/oaiq.min.js\");\n\n oaiq(\"init\", { pixelId: \"${openaiPixelId}\" });\n oaiq(\"measure\", \"page_viewed\", { type: \"contents\" });\n `,\n }}\n />\n )}\n {redditPixelId && (\n <script\n async\n id=\"reddit-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(w,d) {\n if(!w.rdt) {\n var p = w.rdt = function() {\n p.sendEvent ? p.sendEvent.apply(p,arguments) : p.callQueue.push(arguments)\n };\n p.callQueue = [];\n var t = d.createElement(\"script\");\n t.src = \"https://www.redditstatic.com/ads/pixel.js\";\n t.async = !0;\n var s = d.getElementsByTagName(\"script\")[0];\n s.parentNode.insertBefore(t,s)\n }\n }(window, document);\n rdt('init', '${redditPixelId}');\n rdt('track', 'PageVisit');`,\n }}\n />\n )}\n {linkedInPartnerId && (\n <script\n async\n id=\"linkedin-insight-tag\"\n dangerouslySetInnerHTML={{\n __html: `\n _linkedin_partner_id = \"${linkedInPartnerId}\";\n window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];\n window._linkedin_data_partner_ids.push(_linkedin_partner_id);\n\n (function(l) {\n if (!l){\n window.lintrk = function(a,b){\n window.lintrk.q.push([a,b])\n };\n window.lintrk.q=[]\n }\n var s = document.getElementsByTagName(\"script\")[0];\n var b = document.createElement(\"script\");\n b.type = \"text/javascript\";b.async = true;\n b.src = \"https://snap.licdn.com/li.lms-analytics/insight.min.js\";\n s.parentNode.insertBefore(b, s);\n })(window.lintrk);\n `,\n }}\n />\n )}\n {hotjarId && (\n <script\n async\n id=\"hotjar\"\n dangerouslySetInnerHTML={{\n __html: `\n (function(h,o,t,j,a,r){\n h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n h._hjSettings={hjid:${hotjarId},hjsv:6};\n a=o.getElementsByTagName('head')[0];\n r=o.createElement('script');r.async=1;\n r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n a.appendChild(r);\n })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n `,\n }}\n />\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAS,mBAAmB,mBAA6C;CACvE,gBAAgB;EACd,MAAM,iBAAiB;EACvB,MAAM,iBAAiB;EACvB,MAAM,iBAAiB;EACvB,MAAM,iBAAiB;EACvB,OAAO,iBAAiB;CAC1B,GAAG,CAAC,iBAAiB,CAAC;AACxB;AAiBA,SAAgB,UAAU,EACxB,MACA,OACA,OACA,WACA,aACA,eACA,eACA,mBACA,UACA,eACA,kBAAkB,QACV;CACR,sBAAsB;CAEtB,MAAM,EAAE,aAAa,YAAY;CACjC,gBAAgB,QAAQ;CACxB,0BAA0B;CAE1B,oBAAoB,WAAW;EAC7B,IAAI,CAAC,iBAAiB;EACtB,MAAM,aAAa;GACjB,OAAO,OAAO;GACd,WAAW,OAAO;GAClB,cAAc,OAAO;GACrB,cAAc,OAAO;GACrB,eAAe,OAAO;GACtB,wBAAwB,OAAO;GAC/B,iBAAiB;EACnB;EACA,MAAM,OAAO,MAAM,UAAU;CAC/B,CAAC;CAED,OACE,qBAAA,UAAA,EAAA,UAAA;EACG,iBAAiB,oBAAC,QAAD;GAAM,UAAS;GAAY,SAAS;EAAgB,CAAA;EACrE,QACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACI;GACP,KAAK,SAAS,+CAA+C;EAC9D,CAAA,GACD,oBAAC,UAAD;GACE,OAAA;GACO;GACP,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;gCAIU,KAAK,GAAG,YAAY,6BAA6B,GAAG;cAExE;EACD,CAAA,CACD,EAAA,CAAA;EAEH,eACC,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;;;;2BAiBO,YAAY;uCAE7B;EACD,CAAA;EAEF,iBACC,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;;2CAeuB,cAAc;;cAG/C;EACD,CAAA;EAEF,iBACC,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;;;;;;;;;;;;2BAcO,cAAc;wCAE/B;EACD,CAAA;EAEF,qBACC,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;sCACkB,kBAAkB;;;;;;;;;;;;;;;;;cAkB9C;EACD,CAAA;EAEF,YACC,oBAAC,UAAD;GACE,OAAA;GACA,IAAG;GACH,yBAAyB,EACvB,QAAQ;;;oCAGgB,SAAS;;;;;;cAOnC;EACD,CAAA;CAEH,EAAA,CAAA;AAEN"}
|