@thisbefine/analytics 0.1.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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/dist/core/analytics.d.ts +123 -0
  4. package/dist/core/analytics.d.ts.map +1 -0
  5. package/dist/core/analytics.js +334 -0
  6. package/dist/core/analytics.js.map +1 -0
  7. package/dist/core/errors.d.ts +94 -0
  8. package/dist/core/errors.d.ts.map +1 -0
  9. package/dist/core/errors.js +420 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/logger.d.ts +28 -0
  12. package/dist/core/logger.d.ts.map +1 -0
  13. package/dist/core/logger.js +36 -0
  14. package/dist/core/logger.js.map +1 -0
  15. package/dist/core/logging.d.ts +12 -0
  16. package/dist/core/logging.d.ts.map +1 -0
  17. package/dist/core/logging.js +33 -0
  18. package/dist/core/logging.js.map +1 -0
  19. package/dist/core/privacy.d.ts +53 -0
  20. package/dist/core/privacy.d.ts.map +1 -0
  21. package/dist/core/privacy.js +94 -0
  22. package/dist/core/privacy.js.map +1 -0
  23. package/dist/core/queue.d.ts +59 -0
  24. package/dist/core/queue.d.ts.map +1 -0
  25. package/dist/core/queue.js +263 -0
  26. package/dist/core/queue.js.map +1 -0
  27. package/dist/core/session.d.ts +90 -0
  28. package/dist/core/session.d.ts.map +1 -0
  29. package/dist/core/session.js +246 -0
  30. package/dist/core/session.js.map +1 -0
  31. package/dist/core/storage.d.ts +64 -0
  32. package/dist/core/storage.d.ts.map +1 -0
  33. package/dist/core/storage.js +242 -0
  34. package/dist/core/storage.js.map +1 -0
  35. package/dist/core/types.d.ts +298 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +34 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/core/validation.d.ts +11 -0
  40. package/dist/core/validation.d.ts.map +1 -0
  41. package/dist/core/validation.js +82 -0
  42. package/dist/core/validation.js.map +1 -0
  43. package/dist/core/version.d.ts +2 -0
  44. package/dist/core/version.d.ts.map +1 -0
  45. package/dist/core/version.js +4 -0
  46. package/dist/core/version.js.map +1 -0
  47. package/dist/index.d.ts +45 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +41 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/next/analytics.d.ts +59 -0
  52. package/dist/next/analytics.d.ts.map +1 -0
  53. package/dist/next/analytics.js +87 -0
  54. package/dist/next/analytics.js.map +1 -0
  55. package/dist/next.d.ts +46 -0
  56. package/dist/next.d.ts.map +1 -0
  57. package/dist/next.js +44 -0
  58. package/dist/next.js.map +1 -0
  59. package/dist/react/analytics.d.ts +51 -0
  60. package/dist/react/analytics.d.ts.map +1 -0
  61. package/dist/react/analytics.js +63 -0
  62. package/dist/react/analytics.js.map +1 -0
  63. package/dist/react/bug-report-widget.d.ts +21 -0
  64. package/dist/react/bug-report-widget.d.ts.map +1 -0
  65. package/dist/react/bug-report-widget.js +34 -0
  66. package/dist/react/bug-report-widget.js.map +1 -0
  67. package/dist/react/hooks.d.ts +141 -0
  68. package/dist/react/hooks.d.ts.map +1 -0
  69. package/dist/react/hooks.js +186 -0
  70. package/dist/react/hooks.js.map +1 -0
  71. package/dist/react.d.ts +42 -0
  72. package/dist/react.d.ts.map +1 -0
  73. package/dist/react.js +39 -0
  74. package/dist/react.js.map +1 -0
  75. package/dist/widget/bug-report.d.ts +16 -0
  76. package/dist/widget/bug-report.d.ts.map +1 -0
  77. package/dist/widget/bug-report.js +416 -0
  78. package/dist/widget/bug-report.js.map +1 -0
  79. package/package.json +107 -0
@@ -0,0 +1,420 @@
1
+ import { createLogger } from "./logger";
2
+ /**
3
+ * Cyrb53 hash - a fast, high-quality 53-bit hash function.
4
+ * Better distribution than FNV-1a, and we call it twice with
5
+ * different seeds to get a 106-bit hash for lower collision probability.
6
+ */
7
+ const cyrb53 = (str, seed = 0) => {
8
+ let h1 = 0xdeadbeef ^ seed;
9
+ let h2 = 0x41c6ce57 ^ seed;
10
+ for (let i = 0; i < str.length; i++) {
11
+ const ch = str.charCodeAt(i);
12
+ h1 = Math.imul(h1 ^ ch, 2654435761);
13
+ h2 = Math.imul(h2 ^ ch, 1597334677);
14
+ }
15
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
16
+ h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
17
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
18
+ h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
19
+ return 4294967296 * (2097151 & h2) + (h1 >>> 0);
20
+ };
21
+ /**
22
+ * Generate a 128-bit hash by running cyrb53 with two different seeds
23
+ */
24
+ const hashString = (str) => {
25
+ const h1 = cyrb53(str, 0);
26
+ const h2 = cyrb53(str, 1);
27
+ return h1.toString(16).padStart(14, "0") + h2.toString(16).padStart(14, "0");
28
+ };
29
+ /**
30
+ * Extract the top stack frame from a stack trace string
31
+ */
32
+ const extractTopFrame = (stack) => {
33
+ if (!stack)
34
+ return "";
35
+ const lines = stack.split("\n").filter((l) => l.trim().startsWith("at "));
36
+ return lines[0]?.trim() ?? "";
37
+ };
38
+ /**
39
+ * Normalize error message for fingerprinting.
40
+ * Removes dynamic values like IDs, timestamps, etc.
41
+ */
42
+ const normalizeMessage = (message) => {
43
+ return message
44
+ .replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "<uuid>")
45
+ .replace(/\b\d{5,}\b/g, "<id>")
46
+ .replace(/"[^"]*\d+[^"]*"/g, '"<dynamic>"')
47
+ .replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/g, "<timestamp>")
48
+ .replace(/\s+/g, " ")
49
+ .trim();
50
+ };
51
+ /**
52
+ * Generate a fingerprint for error grouping
53
+ */
54
+ const generateFingerprint = (type, message, stack) => {
55
+ const topFrame = extractTopFrame(stack);
56
+ const normalizedMessage = normalizeMessage(message);
57
+ const input = `${type ?? "Error"}:${normalizedMessage}:${topFrame}`;
58
+ return hashString(input);
59
+ };
60
+ /**
61
+ * Truncate a string to a maximum length without allocating if not needed
62
+ */
63
+ const truncate = (str, maxLen) => str.length > maxLen ? str.slice(0, maxLen) : str;
64
+ /**
65
+ * Extract meaningful text from an element efficiently.
66
+ * Avoids getting huge textContent from container elements.
67
+ */
68
+ const getElementText = (el, maxLen) => {
69
+ if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
70
+ return truncate(el.value || el.placeholder || "", maxLen);
71
+ }
72
+ const ariaLabel = el.getAttribute("aria-label");
73
+ if (ariaLabel) {
74
+ return truncate(ariaLabel.trim(), maxLen);
75
+ }
76
+ if (el.childNodes.length <= 3) {
77
+ let text = "";
78
+ for (const node of el.childNodes) {
79
+ if (node.nodeType === Node.TEXT_NODE) {
80
+ text += node.textContent || "";
81
+ }
82
+ }
83
+ text = text.trim();
84
+ if (text) {
85
+ return truncate(text, maxLen);
86
+ }
87
+ }
88
+ if (el.tagName === "BUTTON" ||
89
+ el.tagName === "A" ||
90
+ el.getAttribute("role") === "button") {
91
+ const firstLine = el.innerText?.split("\n")[0]?.trim() ?? "";
92
+ return truncate(firstLine, maxLen);
93
+ }
94
+ return "";
95
+ };
96
+ /**
97
+ * Error capture module for the analytics SDK.
98
+ *
99
+ * Captures unhandled exceptions, unhandled promise rejections,
100
+ * and records breadcrumbs (clicks, navigation, console, network).
101
+ */
102
+ export class ErrorCapture {
103
+ constructor(config, session, errorConfig) {
104
+ this.breadcrumbs = [];
105
+ this.installed = false;
106
+ this.originalOnError = null;
107
+ this.originalConsoleError = null;
108
+ this.originalFetch = null;
109
+ this.unhandledRejectionHandler = null;
110
+ this.clickHandler = null;
111
+ this.lastClickTarget = null;
112
+ this.lastClickTime = 0;
113
+ this.originalPushState = null;
114
+ this.originalReplaceState = null;
115
+ this.popstateHandler = null;
116
+ this.config = config;
117
+ this.session = session;
118
+ this.logger = createLogger("Errors", config.debug);
119
+ this.errorConfig = {
120
+ enabled: errorConfig?.enabled ?? true,
121
+ captureConsoleErrors: errorConfig?.captureConsoleErrors ?? false,
122
+ captureNetworkErrors: errorConfig?.captureNetworkErrors ?? false,
123
+ maxBreadcrumbs: errorConfig?.maxBreadcrumbs ?? 25,
124
+ beforeSend: errorConfig?.beforeSend,
125
+ };
126
+ }
127
+ /**
128
+ * Install global error handlers and breadcrumb collectors
129
+ */
130
+ install() {
131
+ if (this.installed || typeof window === "undefined")
132
+ return;
133
+ if (!this.errorConfig.enabled)
134
+ return;
135
+ this.installErrorHandler();
136
+ this.installUnhandledRejectionHandler();
137
+ this.installClickBreadcrumbs();
138
+ this.installNavigationBreadcrumbs();
139
+ if (this.errorConfig.captureConsoleErrors) {
140
+ this.installConsoleBreadcrumbs();
141
+ }
142
+ if (this.errorConfig.captureNetworkErrors) {
143
+ this.installNetworkBreadcrumbs();
144
+ }
145
+ this.installed = true;
146
+ this.logger.log("Error capture installed");
147
+ }
148
+ /**
149
+ * Remove all handlers and restore originals
150
+ */
151
+ uninstall() {
152
+ if (!this.installed || typeof window === "undefined")
153
+ return;
154
+ window.onerror = this.originalOnError;
155
+ this.originalOnError = null;
156
+ if (this.unhandledRejectionHandler) {
157
+ window.removeEventListener("unhandledrejection", this.unhandledRejectionHandler);
158
+ this.unhandledRejectionHandler = null;
159
+ }
160
+ if (this.clickHandler) {
161
+ document.removeEventListener("click", this.clickHandler, true);
162
+ this.clickHandler = null;
163
+ }
164
+ if (this.originalPushState) {
165
+ history.pushState = this.originalPushState;
166
+ this.originalPushState = null;
167
+ }
168
+ if (this.originalReplaceState) {
169
+ history.replaceState = this.originalReplaceState;
170
+ this.originalReplaceState = null;
171
+ }
172
+ if (this.popstateHandler) {
173
+ window.removeEventListener("popstate", this.popstateHandler);
174
+ this.popstateHandler = null;
175
+ }
176
+ if (this.originalConsoleError) {
177
+ console.error = this.originalConsoleError;
178
+ this.originalConsoleError = null;
179
+ }
180
+ if (this.originalFetch) {
181
+ window.fetch = this.originalFetch;
182
+ this.originalFetch = null;
183
+ }
184
+ this.installed = false;
185
+ this.logger.log("Error capture uninstalled");
186
+ }
187
+ /**
188
+ * Add a breadcrumb manually
189
+ */
190
+ addBreadcrumb(breadcrumb) {
191
+ this.pushBreadcrumb({
192
+ ...breadcrumb,
193
+ timestamp: new Date().toISOString(),
194
+ });
195
+ }
196
+ /**
197
+ * Clear all breadcrumbs
198
+ */
199
+ clearBreadcrumbs() {
200
+ this.breadcrumbs = [];
201
+ }
202
+ /**
203
+ * Capture an exception and send it to the API
204
+ */
205
+ captureException(error, context) {
206
+ const message = error.message || String(error);
207
+ const stack = error.stack;
208
+ const type = error.name || "Error";
209
+ const fingerprint = generateFingerprint(type, message, stack);
210
+ this.sendError({
211
+ message,
212
+ stack,
213
+ type,
214
+ level: "error",
215
+ fingerprint,
216
+ context,
217
+ });
218
+ }
219
+ /**
220
+ * Capture a message as an error event
221
+ */
222
+ captureMessage(message, level = "error", context) {
223
+ const fingerprint = generateFingerprint(undefined, message, undefined);
224
+ this.sendError({
225
+ message,
226
+ level,
227
+ fingerprint,
228
+ context,
229
+ });
230
+ }
231
+ installErrorHandler() {
232
+ this.originalOnError = window.onerror;
233
+ window.onerror = (message, source, lineno, colno, error) => {
234
+ if (error) {
235
+ this.captureException(error);
236
+ }
237
+ else {
238
+ const msg = typeof message === "string" ? message : "Unknown error";
239
+ this.captureMessage(msg);
240
+ }
241
+ if (typeof this.originalOnError === "function") {
242
+ return this.originalOnError.call(window, message, source, lineno, colno, error);
243
+ }
244
+ return false;
245
+ };
246
+ }
247
+ installUnhandledRejectionHandler() {
248
+ this.unhandledRejectionHandler = (event) => {
249
+ const reason = event.reason;
250
+ if (reason instanceof Error) {
251
+ this.captureException(reason);
252
+ }
253
+ else {
254
+ const message = typeof reason === "string" ? reason : "Unhandled promise rejection";
255
+ this.captureMessage(message);
256
+ }
257
+ };
258
+ window.addEventListener("unhandledrejection", this.unhandledRejectionHandler);
259
+ }
260
+ installClickBreadcrumbs() {
261
+ this.clickHandler = (event) => {
262
+ const target = event.target;
263
+ if (!target)
264
+ return;
265
+ const now = Date.now();
266
+ if (target === this.lastClickTarget && now - this.lastClickTime < 100) {
267
+ return;
268
+ }
269
+ this.lastClickTarget = target;
270
+ this.lastClickTime = now;
271
+ const tag = target.tagName?.toLowerCase() ?? "unknown";
272
+ const id = target.id ? `#${target.id}` : "";
273
+ const text = getElementText(target, 50);
274
+ const message = `${tag}${id}${text ? ` "${text}"` : ""}`;
275
+ this.pushBreadcrumb({
276
+ type: "click",
277
+ message,
278
+ timestamp: new Date().toISOString(),
279
+ data: {
280
+ tagName: tag,
281
+ id: target.id || undefined,
282
+ className: typeof target.className === "string"
283
+ ? truncate(target.className, 100)
284
+ : undefined,
285
+ },
286
+ });
287
+ };
288
+ document.addEventListener("click", this.clickHandler, true);
289
+ }
290
+ installNavigationBreadcrumbs() {
291
+ const addNavBreadcrumb = (url) => {
292
+ this.pushBreadcrumb({
293
+ type: "navigation",
294
+ message: url,
295
+ timestamp: new Date().toISOString(),
296
+ });
297
+ };
298
+ this.originalPushState = history.pushState.bind(history);
299
+ history.pushState = (...args) => {
300
+ this.originalPushState?.(...args);
301
+ addNavBreadcrumb(window.location.href);
302
+ };
303
+ this.originalReplaceState = history.replaceState.bind(history);
304
+ history.replaceState = (...args) => {
305
+ this.originalReplaceState?.(...args);
306
+ addNavBreadcrumb(window.location.href);
307
+ };
308
+ this.popstateHandler = () => {
309
+ addNavBreadcrumb(window.location.href);
310
+ };
311
+ window.addEventListener("popstate", this.popstateHandler);
312
+ }
313
+ installConsoleBreadcrumbs() {
314
+ this.originalConsoleError = console.error.bind(console);
315
+ console.error = (...args) => {
316
+ this.pushBreadcrumb({
317
+ type: "console",
318
+ message: args.map((a) => String(a)).join(" "),
319
+ timestamp: new Date().toISOString(),
320
+ });
321
+ this.originalConsoleError?.(...args);
322
+ };
323
+ }
324
+ installNetworkBreadcrumbs() {
325
+ this.originalFetch = window.fetch.bind(window);
326
+ window.fetch = async (input, init) => {
327
+ const url = typeof input === "string"
328
+ ? input
329
+ : input instanceof URL
330
+ ? input.toString()
331
+ : input.url;
332
+ const method = init?.method ?? "GET";
333
+ try {
334
+ if (!this.originalFetch) {
335
+ throw new Error("originalFetch is not available");
336
+ }
337
+ const response = await this.originalFetch(input, init);
338
+ if (!response.ok) {
339
+ this.pushBreadcrumb({
340
+ type: "network",
341
+ message: `${method} ${url} → ${response.status}`,
342
+ timestamp: new Date().toISOString(),
343
+ data: { method, url, status: response.status },
344
+ });
345
+ }
346
+ return response;
347
+ }
348
+ catch (error) {
349
+ this.pushBreadcrumb({
350
+ type: "network",
351
+ message: `${method} ${url} → failed`,
352
+ timestamp: new Date().toISOString(),
353
+ data: {
354
+ method,
355
+ url,
356
+ error: error instanceof Error ? error.message : "Unknown",
357
+ },
358
+ });
359
+ throw error;
360
+ }
361
+ };
362
+ }
363
+ pushBreadcrumb(breadcrumb) {
364
+ this.breadcrumbs.push(breadcrumb);
365
+ if (this.breadcrumbs.length > this.errorConfig.maxBreadcrumbs) {
366
+ this.breadcrumbs.shift();
367
+ }
368
+ }
369
+ sendError(partial) {
370
+ const payload = {
371
+ ...partial,
372
+ url: typeof window !== "undefined" ? window.location.href : undefined,
373
+ breadcrumbs: [...this.breadcrumbs],
374
+ anonymousId: this.session.getAnonymousId(),
375
+ userId: this.session.getUserId(),
376
+ sessionId: this.session.getSessionId(),
377
+ timestamp: new Date().toISOString(),
378
+ };
379
+ const finalPayload = this.errorConfig.beforeSend
380
+ ? this.errorConfig.beforeSend(payload)
381
+ : payload;
382
+ if (!finalPayload) {
383
+ this.logger.log("Error discarded by beforeSend");
384
+ return;
385
+ }
386
+ this.postError(finalPayload);
387
+ }
388
+ async postError(payload) {
389
+ const url = `${this.config.host}/api/v1/error`;
390
+ for (let attempt = 0; attempt < 2; attempt++) {
391
+ try {
392
+ const response = await fetch(url, {
393
+ method: "POST",
394
+ headers: {
395
+ "Content-Type": "application/json",
396
+ "X-API-Key": this.config.apiKey,
397
+ },
398
+ body: JSON.stringify(payload),
399
+ });
400
+ if (response.ok) {
401
+ this.logger.log("Error sent:", payload.message);
402
+ return;
403
+ }
404
+ if (response.status >= 400 &&
405
+ response.status < 500 &&
406
+ response.status !== 429) {
407
+ this.logger.log("Error rejected (client error):", response.status);
408
+ return;
409
+ }
410
+ }
411
+ catch {
412
+ this.logger.log("Error send failed, attempt", attempt + 1);
413
+ }
414
+ if (attempt === 0) {
415
+ await new Promise((r) => setTimeout(r, 1000));
416
+ }
417
+ }
418
+ }
419
+ }
420
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared debug logger factory for SDK modules
3
+ *
4
+ * Creates a consistent logging interface across all SDK components.
5
+ * Logs are only output when debug mode is enabled.
6
+ */
7
+ export interface Logger {
8
+ log: (...args: unknown[]) => void;
9
+ warn: (...args: unknown[]) => void;
10
+ error: (...args: unknown[]) => void;
11
+ }
12
+ /**
13
+ * Create a namespaced debug logger
14
+ *
15
+ * @param prefix - Module name (e.g., "Queue", "Session", "Errors")
16
+ * @param debug - Whether debug mode is enabled
17
+ * @returns Logger interface with log, warn, and error methods
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const logger = createLogger("Queue", this.config.debug);
22
+ * logger.log("Event queued:", event.type);
23
+ * logger.warn("Queue is full, dropping oldest event");
24
+ * logger.error("Failed to send batch:", error);
25
+ * ```
26
+ */
27
+ export declare const createLogger: (prefix: string, debug: boolean) => Logger;
28
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACtB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,OAAO,KAAG,MAoB7D,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Create a namespaced debug logger
3
+ *
4
+ * @param prefix - Module name (e.g., "Queue", "Session", "Errors")
5
+ * @param debug - Whether debug mode is enabled
6
+ * @returns Logger interface with log, warn, and error methods
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const logger = createLogger("Queue", this.config.debug);
11
+ * logger.log("Event queued:", event.type);
12
+ * logger.warn("Queue is full, dropping oldest event");
13
+ * logger.error("Failed to send batch:", error);
14
+ * ```
15
+ */
16
+ export const createLogger = (prefix, debug) => {
17
+ const shouldLog = debug && typeof console !== "undefined";
18
+ return {
19
+ log: (...args) => {
20
+ if (shouldLog) {
21
+ console.log(`[Thisbefine ${prefix}]`, ...args);
22
+ }
23
+ },
24
+ warn: (...args) => {
25
+ if (shouldLog) {
26
+ console.warn(`[Thisbefine ${prefix}]`, ...args);
27
+ }
28
+ },
29
+ error: (...args) => {
30
+ if (typeof console !== "undefined") {
31
+ console.error(`[Thisbefine ${prefix}]`, ...args);
32
+ }
33
+ },
34
+ };
35
+ };
36
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,KAAc,EAAU,EAAE;IACtE,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,OAAO,KAAK,WAAW,CAAC;IAE1D,OAAO;QACN,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC3B,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACjD,CAAC;QACF,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC7B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Analytics } from "./types";
2
+ export type LogLevel = "debug" | "info" | "warn" | "error" | "fatal";
3
+ /**
4
+ * Send a structured log event through the analytics track pipeline.
5
+ * Logs are stored as track events with name "$log".
6
+ *
7
+ * Note: The event timestamp is set by track() - no need to duplicate it.
8
+ * Metadata keys "message" and "level" are reserved and will be prefixed
9
+ * with "meta_" to avoid conflicts.
10
+ */
11
+ export declare const log: (analytics: Analytics, message: string, level: LogLevel, metadata?: Record<string, unknown>) => void;
12
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAQrE;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,GACf,WAAW,SAAS,EACpB,SAAS,MAAM,EACf,OAAO,QAAQ,EACf,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,IAmBF,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Reserved property names that cannot be used in log metadata.
3
+ * These are used by the logging system itself.
4
+ */
5
+ const RESERVED_KEYS = ["message", "level"];
6
+ /**
7
+ * Send a structured log event through the analytics track pipeline.
8
+ * Logs are stored as track events with name "$log".
9
+ *
10
+ * Note: The event timestamp is set by track() - no need to duplicate it.
11
+ * Metadata keys "message" and "level" are reserved and will be prefixed
12
+ * with "meta_" to avoid conflicts.
13
+ */
14
+ export const log = (analytics, message, level, metadata) => {
15
+ let sanitizedMetadata;
16
+ if (metadata) {
17
+ sanitizedMetadata = {};
18
+ for (const [key, value] of Object.entries(metadata)) {
19
+ if (RESERVED_KEYS.includes(key)) {
20
+ sanitizedMetadata[`meta_${key}`] = value;
21
+ }
22
+ else {
23
+ sanitizedMetadata[key] = value;
24
+ }
25
+ }
26
+ }
27
+ analytics.track("$log", {
28
+ message,
29
+ level,
30
+ ...sanitizedMetadata,
31
+ });
32
+ };
33
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAClB,SAAoB,EACpB,OAAe,EACf,KAAe,EACf,QAAkC,EAC3B,EAAE;IACT,IAAI,iBAAsD,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACd,iBAAiB,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAqC,CAAC,EAAE,CAAC;gBACnE,iBAAiB,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACP,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;QACvB,OAAO;QACP,KAAK;QACL,GAAG,iBAAiB;KACpB,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { StorageInterface } from "./types";
2
+ /**
3
+ * Privacy manager handles:
4
+ * - Do Not Track (DNT) detection
5
+ * - Global Privacy Control (GPC) detection
6
+ * - User opt-out/opt-in state
7
+ */
8
+ export declare class Privacy {
9
+ private storage;
10
+ private respectDNT;
11
+ private debug;
12
+ constructor(storage: StorageInterface, respectDNT: boolean, debug?: boolean);
13
+ /**
14
+ * Check if Do Not Track is enabled in the browser
15
+ */
16
+ isDNTEnabled(): boolean;
17
+ /**
18
+ * Check if Global Privacy Control is enabled
19
+ * GPC is a newer standard that's gaining adoption
20
+ */
21
+ isGPCEnabled(): boolean;
22
+ /**
23
+ * Check if the user has explicitly opted out
24
+ */
25
+ isOptedOut(): boolean;
26
+ /**
27
+ * Opt out of tracking
28
+ */
29
+ optOut(): void;
30
+ /**
31
+ * Opt back in to tracking
32
+ */
33
+ optIn(): void;
34
+ /**
35
+ * Check if tracking should be allowed based on all privacy signals
36
+ */
37
+ shouldTrack(): boolean;
38
+ /**
39
+ * Get a summary of privacy signals for debugging
40
+ */
41
+ getPrivacyStatus(): {
42
+ dntEnabled: boolean;
43
+ gpcEnabled: boolean;
44
+ optedOut: boolean;
45
+ respectDNT: boolean;
46
+ trackingAllowed: boolean;
47
+ };
48
+ /**
49
+ * Debug logger
50
+ */
51
+ private log;
52
+ }
53
+ //# sourceMappingURL=privacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/core/privacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD;;;;;GAKG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,UAAQ;IAMzE;;OAEG;IACH,YAAY,IAAI,OAAO;IAWvB;;;OAGG;IACH,YAAY,IAAI,OAAO;IASvB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,WAAW,IAAI,OAAO;IAmBtB;;OAEG;IACH,gBAAgB,IAAI;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;KACzB;IAUD;;OAEG;IACH,OAAO,CAAC,GAAG;CAKX"}