@snovasys/usage-analytics-sdk 1.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/ga.js ADDED
@@ -0,0 +1,69 @@
1
+ // src/listeners/ga.ts
2
+ var GTAG_SCRIPT_URL = "https://www.googletagmanager.com/gtag/js";
3
+ function isBrowser() {
4
+ return typeof window !== "undefined";
5
+ }
6
+ function loadGtagScript(measurementId) {
7
+ return new Promise((resolve) => {
8
+ if (!isBrowser()) {
9
+ resolve();
10
+ return;
11
+ }
12
+ if (window.gtag) {
13
+ window.gtag("config", measurementId);
14
+ resolve();
15
+ return;
16
+ }
17
+ window.dataLayer = window.dataLayer ?? [];
18
+ const gtag = (...args) => {
19
+ window.dataLayer.push(args);
20
+ };
21
+ window.gtag = gtag;
22
+ gtag("js", /* @__PURE__ */ new Date());
23
+ const script = document.createElement("script");
24
+ script.async = true;
25
+ script.src = `${GTAG_SCRIPT_URL}?id=${encodeURIComponent(measurementId)}`;
26
+ script.onload = () => {
27
+ gtag("config", measurementId);
28
+ resolve();
29
+ };
30
+ script.onerror = () => resolve();
31
+ document.head.appendChild(script);
32
+ });
33
+ }
34
+ function createGAListener(config) {
35
+ const measurementId = config.measurementId;
36
+ let ready = false;
37
+ return {
38
+ async init(cfg) {
39
+ try {
40
+ const c = cfg ?? config;
41
+ const id = c.measurementId;
42
+ if (!id || !isBrowser()) return;
43
+ await loadGtagScript(id);
44
+ ready = true;
45
+ } catch {
46
+ }
47
+ },
48
+ track(envelope) {
49
+ try {
50
+ if (!isBrowser() || !ready || typeof window.gtag !== "function") return;
51
+ const params = envelope.properties ?? {};
52
+ if (envelope.userId) params["user_id"] = envelope.userId;
53
+ window.gtag("event", envelope.name, params);
54
+ } catch {
55
+ }
56
+ },
57
+ identify(userId, traits) {
58
+ try {
59
+ if (!isBrowser() || typeof window.gtag !== "function") return;
60
+ window.gtag("set", "user_properties", { user_id: userId, ...traits });
61
+ } catch {
62
+ }
63
+ }
64
+ };
65
+ }
66
+ export {
67
+ createGAListener
68
+ };
69
+ //# sourceMappingURL=ga.js.map
package/dist/ga.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/listeners/ga.ts"],"sourcesContent":["import type { AnalyticsListener } from '../types/listener.js';\nimport type { EventEnvelope } from '../types/envelope.js';\n\nexport interface GAListenerConfig {\n measurementId: string;\n}\n\nconst GTAG_SCRIPT_URL = 'https://www.googletagmanager.com/gtag/js';\n\ndeclare global {\n interface Window {\n dataLayer?: unknown[];\n gtag?: (...args: unknown[]) => void;\n }\n}\n\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction loadGtagScript(measurementId: string): Promise<void> {\n return new Promise((resolve) => {\n if (!isBrowser()) {\n resolve();\n return;\n }\n if (window.gtag) {\n window.gtag('config', measurementId);\n resolve();\n return;\n }\n window.dataLayer = window.dataLayer ?? [];\n const gtag = (...args: unknown[]) => {\n window.dataLayer!.push(args);\n };\n window.gtag = gtag;\n gtag('js', new Date());\n const script = document.createElement('script');\n script.async = true;\n script.src = `${GTAG_SCRIPT_URL}?id=${encodeURIComponent(measurementId)}`;\n script.onload = () => {\n gtag('config', measurementId);\n resolve();\n };\n script.onerror = () => resolve();\n document.head.appendChild(script);\n });\n}\n\n/**\n * Listener that sends events to Google Analytics 4 via gtag.\n * Loads gtag script with measurementId; track → gtag('event', name, properties).\n * No-op when typeof window === 'undefined' (SSR).\n */\nexport function createGAListener(config: GAListenerConfig): AnalyticsListener {\n const measurementId = config.measurementId;\n let ready = false;\n\n return {\n async init(cfg: unknown): Promise<void> {\n try {\n const c = (cfg ?? config) as GAListenerConfig;\n const id = c.measurementId;\n if (!id || !isBrowser()) return;\n await loadGtagScript(id);\n ready = true;\n } catch {\n // swallow\n }\n },\n track(envelope: EventEnvelope): void {\n try {\n if (!isBrowser() || !ready || typeof window.gtag !== 'function') return;\n const params = envelope.properties ?? {};\n if (envelope.userId) (params as Record<string, unknown>)['user_id'] = envelope.userId;\n window.gtag('event', envelope.name, params);\n } catch {\n // swallow\n }\n },\n identify(userId: string, traits?: Record<string, unknown>): void {\n try {\n if (!isBrowser() || typeof window.gtag !== 'function') return;\n window.gtag('set', 'user_properties', { user_id: userId, ...traits });\n } catch {\n // swallow\n }\n },\n };\n}\n"],"mappings":";AAOA,IAAM,kBAAkB;AASxB,SAAS,YAAqB;AAC5B,SAAO,OAAO,WAAW;AAC3B;AAEA,SAAS,eAAe,eAAsC;AAC5D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,CAAC,UAAU,GAAG;AAChB,cAAQ;AACR;AAAA,IACF;AACA,QAAI,OAAO,MAAM;AACf,aAAO,KAAK,UAAU,aAAa;AACnC,cAAQ;AACR;AAAA,IACF;AACA,WAAO,YAAY,OAAO,aAAa,CAAC;AACxC,UAAM,OAAO,IAAI,SAAoB;AACnC,aAAO,UAAW,KAAK,IAAI;AAAA,IAC7B;AACA,WAAO,OAAO;AACd,SAAK,MAAM,oBAAI,KAAK,CAAC;AACrB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,MAAM,GAAG,eAAe,OAAO,mBAAmB,aAAa,CAAC;AACvE,WAAO,SAAS,MAAM;AACpB,WAAK,UAAU,aAAa;AAC5B,cAAQ;AAAA,IACV;AACA,WAAO,UAAU,MAAM,QAAQ;AAC/B,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AACH;AAOO,SAAS,iBAAiB,QAA6C;AAC5E,QAAM,gBAAgB,OAAO;AAC7B,MAAI,QAAQ;AAEZ,SAAO;AAAA,IACL,MAAM,KAAK,KAA6B;AACtC,UAAI;AACF,cAAM,IAAK,OAAO;AAClB,cAAM,KAAK,EAAE;AACb,YAAI,CAAC,MAAM,CAAC,UAAU,EAAG;AACzB,cAAM,eAAe,EAAE;AACvB,gBAAQ;AAAA,MACV,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,MAAM,UAA+B;AACnC,UAAI;AACF,YAAI,CAAC,UAAU,KAAK,CAAC,SAAS,OAAO,OAAO,SAAS,WAAY;AACjE,cAAM,SAAS,SAAS,cAAc,CAAC;AACvC,YAAI,SAAS,OAAQ,CAAC,OAAmC,SAAS,IAAI,SAAS;AAC/E,eAAO,KAAK,SAAS,SAAS,MAAM,MAAM;AAAA,MAC5C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,SAAS,QAAgB,QAAwC;AAC/D,UAAI;AACF,YAAI,CAAC,UAAU,KAAK,OAAO,OAAO,SAAS,WAAY;AACvD,eAAO,KAAK,OAAO,mBAAmB,EAAE,SAAS,QAAQ,GAAG,OAAO,CAAC;AAAA,MACtE,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":[]}