@databuddy/sdk 2.1.5 → 2.1.75

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.
@@ -1,6 +1,6 @@
1
- import { D as Databuddy$1 } from '../shared/@databuddy/sdk.CG1QeYl0.mjs';
2
- export { d as detectClientId } from '../shared/@databuddy/sdk.CG1QeYl0.mjs';
3
- export { c as createScript, i as isScriptInjected } from '../shared/@databuddy/sdk.RYpOP8Ko.mjs';
1
+ import { D as Databuddy$1 } from '../shared/@databuddy/sdk.mo6tEgU3.mjs';
2
+ export { d as detectClientId } from '../shared/@databuddy/sdk.mo6tEgU3.mjs';
3
+ export { c as createScript, i as isScriptInjected } from '../shared/@databuddy/sdk.DsZP9wPD.mjs';
4
4
 
5
5
  function isTrackerAvailable() {
6
6
  return typeof window !== "undefined" && (!!window.databuddy || !!window.db);
@@ -30,9 +30,13 @@ interface FlagsConfig {
30
30
  /** Automatically fetch all flags on initialization (default: true) */
31
31
  autoFetch?: boolean;
32
32
  }
33
+ interface FlagState {
34
+ enabled: boolean;
35
+ isLoading: boolean;
36
+ isReady: boolean;
37
+ }
33
38
  interface FlagsContext {
34
- isEnabled: (key: string) => boolean | undefined;
35
- getValue: (key: string, defaultValue?: boolean) => boolean;
39
+ isEnabled: (key: string) => FlagState;
36
40
  fetchAllFlags: () => Promise<void>;
37
41
  updateUser: (user: FlagsConfig['user']) => void;
38
42
  refresh: (forceClear?: boolean) => Promise<void>;
@@ -50,12 +54,11 @@ declare function FlagsProvider({ children, ...config }: FlagsProviderProps): rea
50
54
  };
51
55
  }>;
52
56
  declare function useFlags(): {
53
- isEnabled: (key: string) => boolean | undefined;
54
- getValue: (key: string, defaultValue?: boolean) => boolean;
57
+ isEnabled: (key: string) => FlagState;
55
58
  fetchAllFlags: () => Promise<void>;
56
59
  updateUser: (user: FlagsConfig["user"]) => void;
57
- refresh: (forceClear?: boolean) => Promise<void>;
60
+ refresh: (forceClear?: boolean) => void;
58
61
  };
59
62
 
60
63
  export { FlagsProvider, useFlags };
61
- export type { FlagResult, FlagsConfig, FlagsContext };
64
+ export type { FlagResult, FlagState, FlagsConfig, FlagsContext };
@@ -30,9 +30,13 @@ interface FlagsConfig {
30
30
  /** Automatically fetch all flags on initialization (default: true) */
31
31
  autoFetch?: boolean;
32
32
  }
33
+ interface FlagState {
34
+ enabled: boolean;
35
+ isLoading: boolean;
36
+ isReady: boolean;
37
+ }
33
38
  interface FlagsContext {
34
- isEnabled: (key: string) => boolean | undefined;
35
- getValue: (key: string, defaultValue?: boolean) => boolean;
39
+ isEnabled: (key: string) => FlagState;
36
40
  fetchAllFlags: () => Promise<void>;
37
41
  updateUser: (user: FlagsConfig['user']) => void;
38
42
  refresh: (forceClear?: boolean) => Promise<void>;
@@ -50,12 +54,11 @@ declare function FlagsProvider({ children, ...config }: FlagsProviderProps): rea
50
54
  };
51
55
  }>;
52
56
  declare function useFlags(): {
53
- isEnabled: (key: string) => boolean | undefined;
54
- getValue: (key: string, defaultValue?: boolean) => boolean;
57
+ isEnabled: (key: string) => FlagState;
55
58
  fetchAllFlags: () => Promise<void>;
56
59
  updateUser: (user: FlagsConfig["user"]) => void;
57
- refresh: (forceClear?: boolean) => Promise<void>;
60
+ refresh: (forceClear?: boolean) => void;
58
61
  };
59
62
 
60
63
  export { FlagsProvider, useFlags };
61
- export type { FlagResult, FlagsConfig, FlagsContext };
64
+ export type { FlagResult, FlagState, FlagsConfig, FlagsContext };
@@ -1,120 +1,119 @@
1
1
  'use client';
2
2
 
3
- export { D as Databuddy } from '../shared/@databuddy/sdk.CG1QeYl0.mjs';
3
+ export { D as Databuddy } from '../shared/@databuddy/sdk.mo6tEgU3.mjs';
4
4
  import { createStore, atom, Provider, useAtom } from 'jotai';
5
5
  import { useEffect, createElement } from 'react';
6
- import '../shared/@databuddy/sdk.RYpOP8Ko.mjs';
6
+ import '../shared/@databuddy/sdk.DsZP9wPD.mjs';
7
+
8
+ class Logger {
9
+ debugEnabled = false;
10
+ /**
11
+ * Enable or disable debug logging
12
+ */
13
+ setDebug(enabled) {
14
+ this.debugEnabled = enabled;
15
+ }
16
+ /**
17
+ * Log debug messages (only when debug is enabled)
18
+ */
19
+ debug(...args) {
20
+ if (this.debugEnabled) {
21
+ console.log("[Databuddy]", ...args);
22
+ }
23
+ }
24
+ /**
25
+ * Log info messages (always enabled)
26
+ */
27
+ info(...args) {
28
+ console.info("[Databuddy]", ...args);
29
+ }
30
+ /**
31
+ * Log warning messages (always enabled)
32
+ */
33
+ warn(...args) {
34
+ console.warn("[Databuddy]", ...args);
35
+ }
36
+ /**
37
+ * Log error messages (always enabled)
38
+ */
39
+ error(...args) {
40
+ console.error("[Databuddy]", ...args);
41
+ }
42
+ /**
43
+ * Log with table format (only when debug is enabled)
44
+ */
45
+ table(data) {
46
+ if (this.debugEnabled) {
47
+ console.table(data);
48
+ }
49
+ }
50
+ /**
51
+ * Time a function execution (only when debug is enabled)
52
+ */
53
+ time(label) {
54
+ if (this.debugEnabled) {
55
+ console.time(`[Databuddy] ${label}`);
56
+ }
57
+ }
58
+ /**
59
+ * End timing a function execution (only when debug is enabled)
60
+ */
61
+ timeEnd(label) {
62
+ if (this.debugEnabled) {
63
+ console.timeEnd(`[Databuddy] ${label}`);
64
+ }
65
+ }
66
+ /**
67
+ * Log JSON data (only when debug is enabled)
68
+ */
69
+ json(data) {
70
+ if (this.debugEnabled) {
71
+ console.log("[Databuddy]", JSON.stringify(data, null, 2));
72
+ }
73
+ }
74
+ }
75
+ const logger = new Logger();
7
76
 
8
77
  class FlagStorage {
9
- dbName = "databuddy-flags";
10
- version = 1;
11
- storeName = "flags";
12
78
  ttl = 24 * 60 * 60 * 1e3;
13
79
  // 24 hours in milliseconds
14
- async get(key) {
15
- try {
16
- const db = await this.openDB();
17
- const transaction = db.transaction(this.storeName, "readonly");
18
- const store = transaction.objectStore(this.storeName);
19
- return new Promise((resolve) => {
20
- const request = store.get(key);
21
- request.onsuccess = () => {
22
- const result = request.result;
23
- if (result && this.isExpired(result.expiresAt)) {
24
- this.delete(key);
25
- resolve(null);
26
- } else {
27
- resolve(result?.value);
28
- }
29
- };
30
- request.onerror = () => resolve(null);
31
- });
32
- } catch {
33
- return this.getFromLocalStorage(key);
34
- }
80
+ get(key) {
81
+ return this.getFromLocalStorage(key);
35
82
  }
36
- async set(key, value) {
37
- try {
38
- const db = await this.openDB();
39
- const transaction = db.transaction(this.storeName, "readwrite");
40
- const store = transaction.objectStore(this.storeName);
41
- const expiresAt = Date.now() + this.ttl;
42
- store.put({ key, value, timestamp: Date.now(), expiresAt });
43
- } catch {
44
- this.setToLocalStorage(key, value);
45
- }
83
+ set(key, value) {
84
+ this.setToLocalStorage(key, value);
46
85
  }
47
- async getAll() {
48
- try {
49
- const db = await this.openDB();
50
- const transaction = db.transaction(this.storeName, "readonly");
51
- const store = transaction.objectStore(this.storeName);
52
- return new Promise((resolve) => {
53
- const request = store.getAll();
54
- request.onsuccess = () => {
55
- const result = {};
56
- const expiredKeys = [];
57
- for (const item of request.result || []) {
58
- if (this.isExpired(item.expiresAt)) {
59
- expiredKeys.push(item.key);
60
- } else {
61
- result[item.key] = item.value;
62
- }
63
- }
64
- if (expiredKeys.length > 0) {
65
- this.deleteMultiple(expiredKeys);
66
- }
67
- resolve(result);
68
- };
69
- request.onerror = () => resolve({});
70
- });
71
- } catch {
72
- const result = {};
73
- const now = Date.now();
74
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
75
- const flagKey = key.replace("db-flag-", "");
76
- try {
77
- const item = localStorage.getItem(key);
78
- if (item) {
79
- const parsed = JSON.parse(item);
80
- if (parsed.expiresAt && now > parsed.expiresAt) {
81
- localStorage.removeItem(key);
82
- } else {
83
- result[flagKey] = parsed.value || parsed;
84
- }
86
+ getAll() {
87
+ const result = {};
88
+ const now = Date.now();
89
+ const keys = Object.keys(localStorage).filter(
90
+ (key) => key.startsWith("db-flag-")
91
+ );
92
+ for (const key of keys) {
93
+ const flagKey = key.replace("db-flag-", "");
94
+ try {
95
+ const item = localStorage.getItem(key);
96
+ if (item) {
97
+ const parsed = JSON.parse(item);
98
+ if (parsed.expiresAt && now > parsed.expiresAt) {
99
+ localStorage.removeItem(key);
100
+ } else {
101
+ result[flagKey] = parsed.value || parsed;
85
102
  }
86
- } catch {
87
103
  }
88
- });
89
- return result;
104
+ } catch {
105
+ }
90
106
  }
107
+ return result;
91
108
  }
92
- async clear() {
93
- try {
94
- const db = await this.openDB();
95
- const transaction = db.transaction(this.storeName, "readwrite");
96
- const store = transaction.objectStore(this.storeName);
97
- store.clear();
98
- } catch {
99
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
100
- localStorage.removeItem(key);
101
- });
102
- return;
109
+ clear() {
110
+ const keys = Object.keys(localStorage).filter(
111
+ (key) => key.startsWith("db-flag-")
112
+ );
113
+ for (const key of keys) {
114
+ localStorage.removeItem(key);
103
115
  }
104
116
  }
105
- async openDB() {
106
- return new Promise((resolve, reject) => {
107
- const request = indexedDB.open(this.dbName, this.version);
108
- request.onerror = () => reject(request.error);
109
- request.onsuccess = () => resolve(request.result);
110
- request.onupgradeneeded = () => {
111
- const db = request.result;
112
- if (!db.objectStoreNames.contains(this.storeName)) {
113
- db.createObjectStore(this.storeName, { keyPath: "key" });
114
- }
115
- };
116
- });
117
- }
118
117
  getFromLocalStorage(key) {
119
118
  try {
120
119
  const item = localStorage.getItem(`db-flag-${key}`);
@@ -151,80 +150,43 @@ class FlagStorage {
151
150
  }
152
151
  return Date.now() > expiresAt;
153
152
  }
154
- async delete(key) {
155
- try {
156
- const db = await this.openDB();
157
- const transaction = db.transaction(this.storeName, "readwrite");
158
- const store = transaction.objectStore(this.storeName);
159
- store.delete(key);
160
- } catch {
161
- localStorage.removeItem(`db-flag-${key}`);
162
- }
153
+ delete(key) {
154
+ localStorage.removeItem(`db-flag-${key}`);
163
155
  }
164
- async deleteMultiple(keys) {
165
- try {
166
- const db = await this.openDB();
167
- const transaction = db.transaction(this.storeName, "readwrite");
168
- const store = transaction.objectStore(this.storeName);
169
- for (const key of keys) {
170
- store.delete(key);
171
- }
172
- } catch {
173
- for (const key of keys) {
174
- localStorage.removeItem(`db-flag-${key}`);
175
- }
156
+ deleteMultiple(keys) {
157
+ for (const key of keys) {
158
+ localStorage.removeItem(`db-flag-${key}`);
176
159
  }
177
160
  }
178
- async setAll(flags) {
179
- const currentFlags = await this.getAll();
161
+ setAll(flags) {
162
+ const currentFlags = this.getAll();
180
163
  const currentKeys = Object.keys(currentFlags);
181
164
  const newKeys = Object.keys(flags);
182
165
  const removedKeys = currentKeys.filter((key) => !newKeys.includes(key));
183
166
  if (removedKeys.length > 0) {
184
- await this.deleteMultiple(removedKeys);
167
+ this.deleteMultiple(removedKeys);
185
168
  }
186
169
  for (const [key, value] of Object.entries(flags)) {
187
- await this.set(key, value);
170
+ this.set(key, value);
188
171
  }
189
172
  }
190
- async cleanupExpired() {
191
- try {
192
- const db = await this.openDB();
193
- const transaction = db.transaction(this.storeName, "readwrite");
194
- const store = transaction.objectStore(this.storeName);
195
- return new Promise((resolve) => {
196
- const request = store.getAll();
197
- request.onsuccess = () => {
198
- const expiredKeys = [];
199
- for (const item of request.result || []) {
200
- if (this.isExpired(item.expiresAt)) {
201
- expiredKeys.push(item.key);
202
- }
203
- }
204
- if (expiredKeys.length > 0) {
205
- this.deleteMultiple(expiredKeys).then(() => resolve()).catch(() => resolve());
206
- } else {
207
- resolve();
208
- }
209
- };
210
- request.onerror = () => resolve();
211
- });
212
- } catch {
213
- this.cleanupExpired();
214
- const now = Date.now();
215
- Object.keys(localStorage).filter((key) => key.startsWith("db-flag-")).forEach((key) => {
216
- try {
217
- const item = localStorage.getItem(key);
218
- if (item) {
219
- const parsed = JSON.parse(item);
220
- if (parsed.expiresAt && now > parsed.expiresAt) {
221
- localStorage.removeItem(key);
222
- }
173
+ cleanupExpired() {
174
+ const now = Date.now();
175
+ const keys = Object.keys(localStorage).filter(
176
+ (key) => key.startsWith("db-flag-")
177
+ );
178
+ for (const key of keys) {
179
+ try {
180
+ const item = localStorage.getItem(key);
181
+ if (item) {
182
+ const parsed = JSON.parse(item);
183
+ if (parsed.expiresAt && now > parsed.expiresAt) {
184
+ localStorage.removeItem(key);
223
185
  }
224
- } catch {
225
- localStorage.removeItem(key);
226
186
  }
227
- });
187
+ } catch {
188
+ localStorage.removeItem(key);
189
+ }
228
190
  }
229
191
  }
230
192
  }
@@ -236,14 +198,13 @@ const memoryFlagsAtom = atom({});
236
198
  const pendingFlagsAtom = atom(/* @__PURE__ */ new Set());
237
199
  function FlagsProvider({ children, ...config }) {
238
200
  const debug = config.debug ?? false;
239
- if (debug) {
240
- console.log("[Databuddy Flags] Provider rendering with config:", {
241
- clientId: config.clientId,
242
- debug,
243
- isPending: config.isPending,
244
- hasUser: !!config.user
245
- });
246
- }
201
+ logger.setDebug(debug);
202
+ logger.debug("Provider rendering with config:", {
203
+ clientId: config.clientId,
204
+ debug,
205
+ isPending: config.isPending,
206
+ hasUser: !!config.user
207
+ });
247
208
  useEffect(() => {
248
209
  const configWithDefaults = {
249
210
  clientId: config.clientId,
@@ -256,19 +217,16 @@ function FlagsProvider({ children, ...config }) {
256
217
  autoFetch: config.autoFetch !== false
257
218
  };
258
219
  flagsStore.set(configAtom, configWithDefaults);
259
- if (debug) {
260
- console.log("[Databuddy Flags] Config set on store", {
261
- clientId: config.clientId,
262
- apiUrl: configWithDefaults.apiUrl,
263
- user: config.user,
264
- isPending: config.isPending,
265
- skipStorage: config.skipStorage ?? false
266
- });
267
- }
220
+ logger.debug("Config set on store", {
221
+ clientId: config.clientId,
222
+ apiUrl: configWithDefaults.apiUrl,
223
+ user: config.user,
224
+ isPending: config.isPending,
225
+ skipStorage: config.skipStorage ?? false
226
+ });
268
227
  if (!(config.skipStorage ?? false)) {
269
228
  loadCachedFlagsImmediate(configWithDefaults);
270
- flagStorage.cleanupExpired().catch(() => {
271
- });
229
+ flagStorage.cleanupExpired();
272
230
  }
273
231
  }, [
274
232
  config.clientId,
@@ -286,55 +244,17 @@ function FlagsProvider({ children, ...config }) {
286
244
  return;
287
245
  }
288
246
  try {
289
- const cachedFlags = {};
290
- const flagKeys = Object.keys(localStorage).filter(
291
- (key) => key.startsWith("db-flag-")
292
- );
293
- for (const key of flagKeys) {
294
- const flagKey = key.replace("db-flag-", "");
295
- try {
296
- const value = localStorage.getItem(key);
297
- if (value) {
298
- cachedFlags[flagKey] = JSON.parse(value);
299
- }
300
- } catch {
301
- }
302
- }
247
+ const cachedFlags = flagStorage.getAll();
303
248
  if (Object.keys(cachedFlags).length > 0) {
304
- flagsStore.set(memoryFlagsAtom, cachedFlags);
305
- if (config2.debug) {
306
- console.log(
307
- "[Databuddy Flags] Loaded cached flags immediately:",
308
- Object.keys(cachedFlags)
309
- );
310
- }
311
- }
312
- } catch (err) {
313
- if (config2.debug) {
314
- console.warn(
315
- "[Databuddy Flags] Error loading cached flags immediately:",
316
- err
249
+ flagsStore.set(
250
+ memoryFlagsAtom,
251
+ cachedFlags
317
252
  );
253
+ logger.debug("Loaded cached flags:", Object.keys(cachedFlags));
318
254
  }
255
+ } catch (err) {
256
+ logger.warn("Error loading cached flags:", err);
319
257
  }
320
- flagStorage.getAll().then((cachedFlags) => {
321
- if (Object.keys(cachedFlags).length > 0) {
322
- flagsStore.set(memoryFlagsAtom, (prev) => ({
323
- ...prev,
324
- ...cachedFlags
325
- }));
326
- if (config2.debug) {
327
- console.log(
328
- "[Databuddy Flags] Loaded cached flags from IndexedDB:",
329
- Object.keys(cachedFlags)
330
- );
331
- }
332
- }
333
- }).catch((err) => {
334
- if (config2.debug) {
335
- console.warn("[Databuddy Flags] Error loading from IndexedDB:", err);
336
- }
337
- });
338
258
  };
339
259
  return createElement(Provider, { store: flagsStore }, children);
340
260
  }
@@ -346,26 +266,22 @@ function useFlags() {
346
266
  const [pendingFlags, setPendingFlags] = useAtom(pendingFlagsAtom, {
347
267
  store: flagsStore
348
268
  });
349
- if (config?.debug) {
350
- console.log("[Databuddy Flags] useFlags called with config:", {
351
- hasConfig: !!config,
352
- clientId: config?.clientId,
353
- isPending: config?.isPending,
354
- debug: config?.debug,
355
- skipStorage: config?.skipStorage,
356
- memoryFlagsCount: Object.keys(memoryFlags).length,
357
- memoryFlags: Object.keys(memoryFlags)
358
- });
359
- }
269
+ logger.debug("useFlags called with config:", {
270
+ hasConfig: !!config,
271
+ clientId: config?.clientId,
272
+ isPending: config?.isPending,
273
+ debug: config?.debug,
274
+ skipStorage: config?.skipStorage,
275
+ memoryFlagsCount: Object.keys(memoryFlags).length,
276
+ memoryFlags: Object.keys(memoryFlags)
277
+ });
360
278
  const fetchAllFlags = async () => {
361
279
  if (!config) {
362
- console.warn("[Databuddy Flags] No config for bulk fetch");
280
+ logger.warn("No config for bulk fetch");
363
281
  return;
364
282
  }
365
283
  if (config.isPending) {
366
- if (config.debug) {
367
- console.log("[Databuddy Flags] Session pending, skipping bulk fetch");
368
- }
284
+ logger.debug("Session pending, skipping bulk fetch");
369
285
  return;
370
286
  }
371
287
  const params = new URLSearchParams();
@@ -386,33 +302,25 @@ function useFlags() {
386
302
  throw new Error(`HTTP ${response.status}`);
387
303
  }
388
304
  const result = await response.json();
389
- if (config.debug) {
390
- console.log("[Databuddy Flags] Bulk fetch response:", result);
391
- }
305
+ logger.debug("Bulk fetch response:", result);
392
306
  if (result.flags) {
393
307
  setMemoryFlags(result.flags);
394
308
  if (!config.skipStorage) {
395
309
  try {
396
- await flagStorage.setAll(result.flags);
397
- if (config.debug) {
398
- console.log("[Databuddy Flags] Bulk flags synced to cache");
399
- }
310
+ flagStorage.setAll(result.flags);
311
+ logger.debug("Bulk flags synced to cache");
400
312
  } catch (err) {
401
- if (config.debug) {
402
- console.warn("[Databuddy Flags] Bulk storage error:", err);
403
- }
313
+ logger.warn("Bulk storage error:", err);
404
314
  }
405
315
  }
406
316
  }
407
317
  } catch (err) {
408
- if (config.debug) {
409
- console.error("[Databuddy Flags] Bulk fetch error:", err);
410
- }
318
+ logger.error("Bulk fetch error:", err);
411
319
  }
412
320
  };
413
321
  const fetchFlag = async (key) => {
414
322
  if (!config) {
415
- console.warn(`[Databuddy Flags] No config for flag: ${key}`);
323
+ logger.warn(`No config for flag: ${key}`);
416
324
  return {
417
325
  enabled: false,
418
326
  value: false,
@@ -434,36 +342,26 @@ function useFlags() {
434
342
  params.set("properties", JSON.stringify(config.user.properties));
435
343
  }
436
344
  const url = `${config.apiUrl}/public/v1/flags/evaluate?${params.toString()}`;
437
- if (config.debug) {
438
- console.log(`[Databuddy Flags] Fetching: ${key}`);
439
- }
345
+ logger.debug(`Fetching: ${key}`);
440
346
  try {
441
347
  const response = await fetch(url);
442
348
  if (!response.ok) {
443
349
  throw new Error(`HTTP ${response.status}`);
444
350
  }
445
351
  const result = await response.json();
446
- if (config.debug) {
447
- console.log(`[Databuddy Flags] Response for ${key}:`, result);
448
- }
352
+ logger.debug(`Response for ${key}:`, result);
449
353
  setMemoryFlags((prev) => ({ ...prev, [key]: result }));
450
354
  if (!config.skipStorage) {
451
355
  try {
452
- await flagStorage.set(key, result);
453
- if (config.debug) {
454
- console.log(`[Databuddy Flags] Cached: ${key}`);
455
- }
356
+ flagStorage.set(key, result);
357
+ logger.debug(`Cached: ${key}`);
456
358
  } catch (err) {
457
- if (config.debug) {
458
- console.warn(`[Databuddy Flags] Cache error: ${key}`, err);
459
- }
359
+ logger.warn(`Cache error: ${key}`, err);
460
360
  }
461
361
  }
462
362
  return result;
463
363
  } catch (err) {
464
- if (config.debug) {
465
- console.error(`[Databuddy Flags] Fetch error: ${key}`, err);
466
- }
364
+ logger.error(`Fetch error: ${key}`, err);
467
365
  const fallback = {
468
366
  enabled: false,
469
367
  value: false,
@@ -481,13 +379,9 @@ function useFlags() {
481
379
  }
482
380
  };
483
381
  const getFlag = async (key) => {
484
- if (config?.debug) {
485
- console.log(`[Databuddy Flags] Getting: ${key}`);
486
- }
382
+ logger.debug(`Getting: ${key}`);
487
383
  if (config?.isPending) {
488
- if (config?.debug) {
489
- console.log(`[Databuddy Flags] Session pending for: ${key}`);
490
- }
384
+ logger.debug(`Session pending for: ${key}`);
491
385
  return {
492
386
  enabled: false,
493
387
  value: false,
@@ -496,15 +390,11 @@ function useFlags() {
496
390
  };
497
391
  }
498
392
  if (memoryFlags[key]) {
499
- if (config?.debug) {
500
- console.log(`[Databuddy Flags] Memory: ${key}`);
501
- }
393
+ logger.debug(`Memory: ${key}`);
502
394
  return memoryFlags[key];
503
395
  }
504
396
  if (pendingFlags.has(key)) {
505
- if (config?.debug) {
506
- console.log(`[Databuddy Flags] Pending: ${key}`);
507
- }
397
+ logger.debug(`Pending: ${key}`);
508
398
  return {
509
399
  enabled: false,
510
400
  value: false,
@@ -516,54 +406,52 @@ function useFlags() {
516
406
  try {
517
407
  const cached = await flagStorage.get(key);
518
408
  if (cached) {
519
- if (config?.debug) {
520
- console.log(`[Databuddy Flags] Cache: ${key}`);
521
- }
409
+ logger.debug(`Cache: ${key}`);
522
410
  setMemoryFlags((prev) => ({ ...prev, [key]: cached }));
523
411
  return cached;
524
412
  }
525
413
  } catch (err) {
526
- if (config?.debug) {
527
- console.warn(`[Databuddy Flags] Storage error: ${key}`, err);
528
- }
414
+ logger.warn(`Storage error: ${key}`, err);
529
415
  }
530
416
  }
531
417
  return fetchFlag(key);
532
418
  };
533
419
  const isEnabled = (key) => {
534
420
  if (memoryFlags[key]) {
535
- return memoryFlags[key].enabled;
421
+ return {
422
+ enabled: memoryFlags[key].enabled,
423
+ isLoading: false,
424
+ isReady: true
425
+ };
536
426
  }
537
- getFlag(key);
538
- return;
539
- };
540
- const getValue = (key, defaultValue = false) => {
541
- if (memoryFlags[key]) {
542
- return memoryFlags[key].value ?? defaultValue;
427
+ if (pendingFlags.has(key)) {
428
+ return {
429
+ enabled: false,
430
+ isLoading: true,
431
+ isReady: false
432
+ };
543
433
  }
544
434
  getFlag(key);
545
- return defaultValue;
435
+ return {
436
+ enabled: false,
437
+ isLoading: true,
438
+ isReady: false
439
+ };
546
440
  };
547
- const refresh = async (forceClear = false) => {
548
- if (config?.debug) {
549
- console.log("[Databuddy Flags] Refreshing", { forceClear });
550
- }
441
+ const refresh = (forceClear = false) => {
442
+ logger.debug("Refreshing", { forceClear });
551
443
  if (forceClear) {
552
444
  setMemoryFlags({});
553
445
  if (!config?.skipStorage) {
554
446
  try {
555
- await flagStorage.clear();
556
- if (config?.debug) {
557
- console.log("[Databuddy Flags] Storage cleared");
558
- }
447
+ flagStorage.clear();
448
+ logger.debug("Storage cleared");
559
449
  } catch (err) {
560
- if (config?.debug) {
561
- console.warn("[Databuddy Flags] Storage clear error:", err);
562
- }
450
+ logger.warn("Storage clear error:", err);
563
451
  }
564
452
  }
565
453
  }
566
- await fetchAllFlags();
454
+ fetchAllFlags();
567
455
  };
568
456
  const updateUser = (user) => {
569
457
  if (config) {
@@ -573,9 +461,7 @@ function useFlags() {
573
461
  };
574
462
  useEffect(() => {
575
463
  if (config && !config.isPending && config.autoFetch !== false) {
576
- if (config.debug) {
577
- console.log("[Databuddy Flags] Auto-fetching");
578
- }
464
+ logger.debug("Auto-fetching");
579
465
  fetchAllFlags();
580
466
  }
581
467
  }, [
@@ -587,7 +473,6 @@ function useFlags() {
587
473
  ]);
588
474
  return {
589
475
  isEnabled,
590
- getValue,
591
476
  fetchAllFlags,
592
477
  updateUser,
593
478
  refresh
@@ -1,4 +1,4 @@
1
- const version = "2.1.5";
1
+ const version = "2.1.7";
2
2
 
3
3
  const INJECTED_SCRIPT_ATTRIBUTE = "data-databuddy-injected";
4
4
  function isScriptInjected() {
@@ -1,4 +1,4 @@
1
- import { i as isScriptInjected, c as createScript } from './sdk.RYpOP8Ko.mjs';
1
+ import { i as isScriptInjected, c as createScript } from './sdk.DsZP9wPD.mjs';
2
2
 
3
3
  function detectClientId(providedClientId) {
4
4
  if (providedClientId) {
@@ -146,11 +146,11 @@ declare const Databuddy: vue.DefineComponent<{
146
146
  required: false;
147
147
  } | undefined;
148
148
  }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<{} & {
149
+ sdk?: string | undefined;
149
150
  clientId?: string | undefined;
150
151
  clientSecret?: string | undefined;
151
152
  apiUrl?: string | undefined;
152
153
  scriptUrl?: string | undefined;
153
- sdk?: string | undefined;
154
154
  sdkVersion?: string | undefined;
155
155
  disabled?: boolean | undefined;
156
156
  debug?: boolean | undefined;
@@ -146,11 +146,11 @@ declare const Databuddy: vue.DefineComponent<{
146
146
  required: false;
147
147
  } | undefined;
148
148
  }, () => null, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, Record<string, any>, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<{} & {
149
+ sdk?: string | undefined;
149
150
  clientId?: string | undefined;
150
151
  clientSecret?: string | undefined;
151
152
  apiUrl?: string | undefined;
152
153
  scriptUrl?: string | undefined;
153
- sdk?: string | undefined;
154
154
  sdkVersion?: string | undefined;
155
155
  disabled?: boolean | undefined;
156
156
  debug?: boolean | undefined;
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, onMounted, onUnmounted, watch } from 'vue';
2
- import { i as isScriptInjected, c as createScript } from '../shared/@databuddy/sdk.RYpOP8Ko.mjs';
2
+ import { i as isScriptInjected, c as createScript } from '../shared/@databuddy/sdk.DsZP9wPD.mjs';
3
3
 
4
4
  const Databuddy = defineComponent({
5
5
  props: {},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@databuddy/sdk",
3
- "version": "2.1.5",
3
+ "version": "2.1.75",
4
4
  "description": "Official Databuddy Analytics SDK",
5
5
  "main": "./dist/core/index.mjs",
6
6
  "types": "./dist/core/index.d.ts",