@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,246 @@
1
+ import { createLogger } from "./logger";
2
+ import { generateId } from "./storage";
3
+ import { STORAGE_KEYS } from "./types";
4
+ const BROADCAST_CHANNEL_NAME = "thisbefine_session";
5
+ /**
6
+ * Session manager handles:
7
+ * - Anonymous ID generation and persistence
8
+ * - User ID management
9
+ * - Session ID with timeout-based regeneration
10
+ * - User traits storage
11
+ * - Cross-tab synchronization via BroadcastChannel
12
+ */
13
+ export class Session {
14
+ constructor(storage, sessionTimeout, debug = false) {
15
+ this.currentSessionId = null;
16
+ this.broadcastChannel = null;
17
+ this.storage = storage;
18
+ this.sessionTimeout = sessionTimeout;
19
+ this.logger = createLogger("Session", debug);
20
+ this.ensureSession();
21
+ this.setupCrossTabSync();
22
+ }
23
+ /**
24
+ * Set up cross-tab session synchronization using BroadcastChannel
25
+ */
26
+ setupCrossTabSync() {
27
+ if (typeof BroadcastChannel === "undefined") {
28
+ this.logger.log("BroadcastChannel not available, cross-tab sync disabled");
29
+ return;
30
+ }
31
+ try {
32
+ this.broadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);
33
+ this.broadcastChannel.onmessage = (event) => {
34
+ this.handleBroadcastMessage(event.data);
35
+ };
36
+ this.logger.log("Cross-tab sync enabled");
37
+ }
38
+ catch {
39
+ this.logger.log("Failed to create BroadcastChannel");
40
+ }
41
+ }
42
+ /**
43
+ * Handle messages from other tabs
44
+ */
45
+ handleBroadcastMessage(message) {
46
+ switch (message.type) {
47
+ case "reset":
48
+ this.currentSessionId = this.storage.get(STORAGE_KEYS.SESSION_ID);
49
+ this.logger.log("Session synced from another tab (reset)");
50
+ break;
51
+ case "identify":
52
+ this.logger.log("User identified in another tab:", message.userId);
53
+ break;
54
+ case "sync_request":
55
+ this.broadcastMessage({
56
+ type: "sync_response",
57
+ sessionId: this.currentSessionId ?? undefined,
58
+ anonymousId: this.storage.get(STORAGE_KEYS.ANONYMOUS_ID) ?? undefined,
59
+ userId: this.storage.get(STORAGE_KEYS.USER_ID) ?? undefined,
60
+ });
61
+ break;
62
+ case "sync_response":
63
+ if (message.sessionId && message.sessionId !== this.currentSessionId) {
64
+ this.currentSessionId = message.sessionId;
65
+ this.logger.log("Session synced from another tab");
66
+ }
67
+ break;
68
+ }
69
+ }
70
+ /**
71
+ * Broadcast a message to other tabs
72
+ */
73
+ broadcastMessage(message) {
74
+ try {
75
+ this.broadcastChannel?.postMessage(message);
76
+ }
77
+ catch { }
78
+ }
79
+ /**
80
+ * Get the anonymous ID, generating one if it doesn't exist
81
+ */
82
+ getAnonymousId() {
83
+ let anonymousId = this.storage.get(STORAGE_KEYS.ANONYMOUS_ID);
84
+ if (!anonymousId) {
85
+ anonymousId = generateId();
86
+ this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, anonymousId);
87
+ this.logger.log("Generated new anonymous ID:", anonymousId);
88
+ }
89
+ return anonymousId;
90
+ }
91
+ /**
92
+ * Get the current user ID (if identified)
93
+ */
94
+ getUserId() {
95
+ return this.storage.get(STORAGE_KEYS.USER_ID) ?? undefined;
96
+ }
97
+ /**
98
+ * Set the user ID (called during identify)
99
+ */
100
+ setUserId(userId) {
101
+ this.storage.set(STORAGE_KEYS.USER_ID, userId);
102
+ this.logger.log("User ID set:", userId);
103
+ this.broadcastMessage({ type: "identify", userId });
104
+ }
105
+ /**
106
+ * Get user traits
107
+ */
108
+ getUserTraits() {
109
+ const traitsJson = this.storage.get(STORAGE_KEYS.USER_TRAITS);
110
+ if (!traitsJson)
111
+ return undefined;
112
+ try {
113
+ return JSON.parse(traitsJson);
114
+ }
115
+ catch {
116
+ return undefined;
117
+ }
118
+ }
119
+ /**
120
+ * Set user traits (merges with existing traits)
121
+ */
122
+ setUserTraits(traits) {
123
+ const existingTraits = this.getUserTraits() ?? {};
124
+ const mergedTraits = { ...existingTraits, ...traits };
125
+ this.storage.set(STORAGE_KEYS.USER_TRAITS, JSON.stringify(mergedTraits));
126
+ this.logger.log("User traits updated:", mergedTraits);
127
+ }
128
+ /**
129
+ * Get the current account ID (if grouped)
130
+ */
131
+ getAccountId() {
132
+ return this.storage.get(STORAGE_KEYS.ACCOUNT_ID) ?? undefined;
133
+ }
134
+ /**
135
+ * Set the account ID (called during group)
136
+ */
137
+ setAccountId(accountId) {
138
+ this.storage.set(STORAGE_KEYS.ACCOUNT_ID, accountId);
139
+ this.logger.log("Account ID set:", accountId);
140
+ }
141
+ /**
142
+ * Get account traits
143
+ */
144
+ getAccountTraits() {
145
+ const traitsJson = this.storage.get(STORAGE_KEYS.ACCOUNT_TRAITS);
146
+ if (!traitsJson)
147
+ return undefined;
148
+ try {
149
+ return JSON.parse(traitsJson);
150
+ }
151
+ catch {
152
+ return undefined;
153
+ }
154
+ }
155
+ /**
156
+ * Set account traits (merges with existing traits)
157
+ */
158
+ setAccountTraits(traits) {
159
+ const existingTraits = this.getAccountTraits() ?? {};
160
+ const mergedTraits = { ...existingTraits, ...traits };
161
+ this.storage.set(STORAGE_KEYS.ACCOUNT_TRAITS, JSON.stringify(mergedTraits));
162
+ this.logger.log("Account traits updated:", mergedTraits);
163
+ }
164
+ /**
165
+ * Get the current session ID, creating a new one if the session has expired
166
+ */
167
+ getSessionId() {
168
+ this.ensureSession();
169
+ if (!this.currentSessionId) {
170
+ this.currentSessionId = generateId();
171
+ this.storage.set(STORAGE_KEYS.SESSION_ID, this.currentSessionId);
172
+ }
173
+ return this.currentSessionId;
174
+ }
175
+ /**
176
+ * Check if the session has expired and create a new one if needed
177
+ */
178
+ ensureSession() {
179
+ const storedSessionId = this.storage.get(STORAGE_KEYS.SESSION_ID);
180
+ const lastActivityStr = this.storage.get(STORAGE_KEYS.LAST_ACTIVITY);
181
+ const lastActivity = lastActivityStr ? parseInt(lastActivityStr, 10) : 0;
182
+ const now = Date.now();
183
+ const sessionExpired = now - lastActivity > this.sessionTimeout;
184
+ if (!storedSessionId || sessionExpired) {
185
+ this.currentSessionId = generateId();
186
+ this.storage.set(STORAGE_KEYS.SESSION_ID, this.currentSessionId);
187
+ this.logger.log(sessionExpired
188
+ ? "Session expired, created new:"
189
+ : "Created new session:", this.currentSessionId);
190
+ }
191
+ else {
192
+ this.currentSessionId = storedSessionId;
193
+ }
194
+ this.updateLastActivity();
195
+ }
196
+ /**
197
+ * Update the last activity timestamp
198
+ */
199
+ updateLastActivity() {
200
+ this.storage.set(STORAGE_KEYS.LAST_ACTIVITY, Date.now().toString());
201
+ }
202
+ /**
203
+ * Reset the session (clear user, account, and session data)
204
+ */
205
+ reset() {
206
+ this.storage.remove(STORAGE_KEYS.USER_ID);
207
+ this.storage.remove(STORAGE_KEYS.USER_TRAITS);
208
+ this.storage.remove(STORAGE_KEYS.ACCOUNT_ID);
209
+ this.storage.remove(STORAGE_KEYS.ACCOUNT_TRAITS);
210
+ const newAnonymousId = generateId();
211
+ this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, newAnonymousId);
212
+ const newSessionId = generateId();
213
+ this.currentSessionId = newSessionId;
214
+ this.storage.set(STORAGE_KEYS.SESSION_ID, newSessionId);
215
+ this.updateLastActivity();
216
+ this.broadcastMessage({
217
+ type: "reset",
218
+ sessionId: newSessionId,
219
+ anonymousId: newAnonymousId,
220
+ });
221
+ this.logger.log("Session reset. New anonymous ID:", newAnonymousId);
222
+ }
223
+ /**
224
+ * Clean up resources (call when destroying the analytics instance)
225
+ */
226
+ destroy() {
227
+ try {
228
+ this.broadcastChannel?.close();
229
+ this.broadcastChannel = null;
230
+ }
231
+ catch { }
232
+ }
233
+ /**
234
+ * Get the full user state
235
+ */
236
+ getUserState() {
237
+ return {
238
+ anonymousId: this.getAnonymousId(),
239
+ userId: this.getUserId(),
240
+ traits: this.getUserTraits(),
241
+ accountId: this.getAccountId(),
242
+ accountTraits: this.getAccountTraits(),
243
+ };
244
+ }
245
+ }
246
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { StorageInterface } from "./types";
2
+ /**
3
+ * Storage implementation with fallback chain:
4
+ * 1. localStorage (persists across sessions)
5
+ * 2. sessionStorage (per-tab)
6
+ * 3. Cookie (cross-subdomain support, 365 day expiry)
7
+ * 4. Memory (final fallback, lost on refresh)
8
+ */
9
+ export declare class Storage implements StorageInterface {
10
+ private memoryStorage;
11
+ private storageType;
12
+ private cookieDomain?;
13
+ constructor(cookieDomain?: string);
14
+ /**
15
+ * Detect the best available storage mechanism
16
+ */
17
+ private detectStorageType;
18
+ /**
19
+ * Check if localStorage is available
20
+ */
21
+ private isLocalStorageAvailable;
22
+ /**
23
+ * Check if sessionStorage is available
24
+ */
25
+ private isSessionStorageAvailable;
26
+ /**
27
+ * Check if cookies are available and can be set with expiry
28
+ */
29
+ private areCookiesAvailable;
30
+ /**
31
+ * Get a value from storage
32
+ */
33
+ get(key: string): string | null;
34
+ /**
35
+ * Set a value in storage
36
+ */
37
+ set(key: string, value: string): void;
38
+ /**
39
+ * Clear old analytics data to free up quota
40
+ */
41
+ private clearOldData;
42
+ /**
43
+ * Remove a value from storage
44
+ */
45
+ remove(key: string): void;
46
+ /**
47
+ * Get a cookie value
48
+ */
49
+ private getCookie;
50
+ /**
51
+ * Set a cookie value (365 day expiry)
52
+ */
53
+ private setCookie;
54
+ /**
55
+ * Delete a cookie
56
+ */
57
+ private deleteCookie;
58
+ /**
59
+ * Get the current storage type being used
60
+ */
61
+ getStorageType(): string;
62
+ }
63
+ export declare const generateId: () => string;
64
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;;;GAMG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC/C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,WAAW,CAA0D;IAC7E,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,YAAY,CAAC,EAAE,MAAM;IAKjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoB/B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA2CrC;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAuBzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,cAAc,IAAI,MAAM;CAGxB;AAED,eAAO,MAAM,UAAU,QAAO,MAAkB,CAAC"}
@@ -0,0 +1,242 @@
1
+ import { v7 as uuidv7 } from "uuid";
2
+ /**
3
+ * Storage implementation with fallback chain:
4
+ * 1. localStorage (persists across sessions)
5
+ * 2. sessionStorage (per-tab)
6
+ * 3. Cookie (cross-subdomain support, 365 day expiry)
7
+ * 4. Memory (final fallback, lost on refresh)
8
+ */
9
+ export class Storage {
10
+ constructor(cookieDomain) {
11
+ this.memoryStorage = new Map();
12
+ this.cookieDomain = cookieDomain;
13
+ this.storageType = this.detectStorageType();
14
+ }
15
+ /**
16
+ * Detect the best available storage mechanism
17
+ */
18
+ detectStorageType() {
19
+ if (this.isLocalStorageAvailable()) {
20
+ return "localStorage";
21
+ }
22
+ if (this.isSessionStorageAvailable()) {
23
+ return "sessionStorage";
24
+ }
25
+ if (this.areCookiesAvailable()) {
26
+ return "cookie";
27
+ }
28
+ return "memory";
29
+ }
30
+ /**
31
+ * Check if localStorage is available
32
+ */
33
+ isLocalStorageAvailable() {
34
+ if (typeof window === "undefined")
35
+ return false;
36
+ try {
37
+ const testKey = "__tif_storage_test__";
38
+ window.localStorage.setItem(testKey, testKey);
39
+ window.localStorage.removeItem(testKey);
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Check if sessionStorage is available
48
+ */
49
+ isSessionStorageAvailable() {
50
+ if (typeof window === "undefined")
51
+ return false;
52
+ try {
53
+ const testKey = "__tif_storage_test__";
54
+ window.sessionStorage.setItem(testKey, testKey);
55
+ window.sessionStorage.removeItem(testKey);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ /**
63
+ * Check if cookies are available and can be set with expiry
64
+ */
65
+ areCookiesAvailable() {
66
+ if (typeof document === "undefined")
67
+ return false;
68
+ if (typeof navigator !== "undefined" && !navigator.cookieEnabled) {
69
+ return false;
70
+ }
71
+ try {
72
+ const testKey = "__tif_cookie_test__";
73
+ const testValue = "1";
74
+ const expires = new Date(Date.now() + 60000).toUTCString();
75
+ // biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
76
+ document.cookie = `${testKey}=${testValue}; expires=${expires}; path=/; SameSite=Lax`;
77
+ const result = document.cookie.includes(`${testKey}=${testValue}`);
78
+ // biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
79
+ document.cookie = `${testKey}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
80
+ return result;
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * Get a value from storage
88
+ */
89
+ get(key) {
90
+ try {
91
+ switch (this.storageType) {
92
+ case "localStorage":
93
+ return window.localStorage.getItem(key);
94
+ case "sessionStorage":
95
+ return window.sessionStorage.getItem(key);
96
+ case "cookie":
97
+ return this.getCookie(key);
98
+ case "memory":
99
+ return this.memoryStorage.get(key) ?? null;
100
+ }
101
+ }
102
+ catch {
103
+ return this.memoryStorage.get(key) ?? null;
104
+ }
105
+ }
106
+ /**
107
+ * Set a value in storage
108
+ */
109
+ set(key, value) {
110
+ try {
111
+ switch (this.storageType) {
112
+ case "localStorage":
113
+ window.localStorage.setItem(key, value);
114
+ break;
115
+ case "sessionStorage":
116
+ window.sessionStorage.setItem(key, value);
117
+ break;
118
+ case "cookie":
119
+ this.setCookie(key, value);
120
+ break;
121
+ case "memory":
122
+ this.memoryStorage.set(key, value);
123
+ break;
124
+ }
125
+ }
126
+ catch (error) {
127
+ if (error instanceof Error &&
128
+ (error.name === "QuotaExceededError" ||
129
+ error.name === "NS_ERROR_DOM_QUOTA_REACHED" ||
130
+ error.message.includes("quota"))) {
131
+ this.clearOldData();
132
+ try {
133
+ switch (this.storageType) {
134
+ case "localStorage":
135
+ window.localStorage.setItem(key, value);
136
+ return;
137
+ case "sessionStorage":
138
+ window.sessionStorage.setItem(key, value);
139
+ return;
140
+ }
141
+ }
142
+ catch { }
143
+ }
144
+ this.memoryStorage.set(key, value);
145
+ }
146
+ }
147
+ /**
148
+ * Clear old analytics data to free up quota
149
+ */
150
+ clearOldData() {
151
+ const storage = this.storageType === "localStorage"
152
+ ? window.localStorage
153
+ : this.storageType === "sessionStorage"
154
+ ? window.sessionStorage
155
+ : null;
156
+ if (!storage)
157
+ return;
158
+ const keysToCheck = ["tif_user_traits", "tif_account_traits"];
159
+ for (const key of keysToCheck) {
160
+ try {
161
+ const value = storage.getItem(key);
162
+ if (value && value.length > 10000) {
163
+ storage.removeItem(key);
164
+ }
165
+ }
166
+ catch { }
167
+ }
168
+ }
169
+ /**
170
+ * Remove a value from storage
171
+ */
172
+ remove(key) {
173
+ this.memoryStorage.delete(key);
174
+ try {
175
+ switch (this.storageType) {
176
+ case "localStorage":
177
+ window.localStorage.removeItem(key);
178
+ break;
179
+ case "sessionStorage":
180
+ window.sessionStorage.removeItem(key);
181
+ break;
182
+ case "cookie":
183
+ this.deleteCookie(key);
184
+ break;
185
+ case "memory":
186
+ break;
187
+ }
188
+ }
189
+ catch { }
190
+ }
191
+ /**
192
+ * Get a cookie value
193
+ */
194
+ getCookie(name) {
195
+ if (typeof document === "undefined")
196
+ return null;
197
+ const cookies = document.cookie.split(";");
198
+ for (const cookie of cookies) {
199
+ const [cookieName, cookieValue] = cookie.split("=").map((c) => c.trim());
200
+ if (cookieName === name) {
201
+ return decodeURIComponent(cookieValue);
202
+ }
203
+ }
204
+ return null;
205
+ }
206
+ /**
207
+ * Set a cookie value (365 day expiry)
208
+ */
209
+ setCookie(name, value) {
210
+ if (typeof document === "undefined")
211
+ return;
212
+ const expires = new Date();
213
+ expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);
214
+ let cookie = `${name}=${encodeURIComponent(value)}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`;
215
+ if (this.cookieDomain) {
216
+ cookie += `; domain=${this.cookieDomain}`;
217
+ }
218
+ // biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
219
+ document.cookie = cookie;
220
+ }
221
+ /**
222
+ * Delete a cookie
223
+ */
224
+ deleteCookie(name) {
225
+ if (typeof document === "undefined")
226
+ return;
227
+ let cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
228
+ if (this.cookieDomain) {
229
+ cookie += `; domain=${this.cookieDomain}`;
230
+ }
231
+ // biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
232
+ document.cookie = cookie;
233
+ }
234
+ /**
235
+ * Get the current storage type being used
236
+ */
237
+ getStorageType() {
238
+ return this.storageType;
239
+ }
240
+ }
241
+ export const generateId = () => uuidv7();
242
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"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"}