@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.
- package/dist/core/index.mjs +3 -3
- package/dist/react/index.d.mts +9 -6
- package/dist/react/index.d.ts +9 -6
- package/dist/react/index.mjs +198 -313
- package/dist/shared/@databuddy/{sdk.RYpOP8Ko.mjs → sdk.DsZP9wPD.mjs} +1 -1
- package/dist/shared/@databuddy/{sdk.CG1QeYl0.mjs → sdk.mo6tEgU3.mjs} +1 -1
- package/dist/vue/index.d.mts +1 -1
- package/dist/vue/index.d.ts +1 -1
- package/dist/vue/index.mjs +1 -1
- package/package.json +1 -1
package/dist/core/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { D as Databuddy$1 } from '../shared/@databuddy/sdk.
|
|
2
|
-
export { d as detectClientId } from '../shared/@databuddy/sdk.
|
|
3
|
-
export { c as createScript, i as isScriptInjected } from '../shared/@databuddy/sdk.
|
|
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);
|
package/dist/react/index.d.mts
CHANGED
|
@@ -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) =>
|
|
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) =>
|
|
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) =>
|
|
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 };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -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) =>
|
|
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) =>
|
|
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) =>
|
|
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 };
|
package/dist/react/index.mjs
CHANGED
|
@@ -1,120 +1,119 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
export { D as Databuddy } from '../shared/@databuddy/sdk.
|
|
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.
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
90
106
|
}
|
|
107
|
+
return result;
|
|
91
108
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
155
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
179
|
-
const currentFlags =
|
|
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
|
-
|
|
167
|
+
this.deleteMultiple(removedKeys);
|
|
185
168
|
}
|
|
186
169
|
for (const [key, value] of Object.entries(flags)) {
|
|
187
|
-
|
|
170
|
+
this.set(key, value);
|
|
188
171
|
}
|
|
189
172
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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()
|
|
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(
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
-
|
|
280
|
+
logger.warn("No config for bulk fetch");
|
|
363
281
|
return;
|
|
364
282
|
}
|
|
365
283
|
if (config.isPending) {
|
|
366
|
-
|
|
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
|
-
|
|
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
|
-
|
|
397
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
453
|
-
|
|
454
|
-
console.log(`[Databuddy Flags] Cached: ${key}`);
|
|
455
|
-
}
|
|
356
|
+
flagStorage.set(key, result);
|
|
357
|
+
logger.debug(`Cached: ${key}`);
|
|
456
358
|
} catch (err) {
|
|
457
|
-
|
|
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
|
-
|
|
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
|
-
|
|
485
|
-
console.log(`[Databuddy Flags] Getting: ${key}`);
|
|
486
|
-
}
|
|
382
|
+
logger.debug(`Getting: ${key}`);
|
|
487
383
|
if (config?.isPending) {
|
|
488
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
421
|
+
return {
|
|
422
|
+
enabled: memoryFlags[key].enabled,
|
|
423
|
+
isLoading: false,
|
|
424
|
+
isReady: true
|
|
425
|
+
};
|
|
536
426
|
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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
|
|
435
|
+
return {
|
|
436
|
+
enabled: false,
|
|
437
|
+
isLoading: true,
|
|
438
|
+
isReady: false
|
|
439
|
+
};
|
|
546
440
|
};
|
|
547
|
-
const refresh =
|
|
548
|
-
|
|
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
|
-
|
|
556
|
-
|
|
557
|
-
console.log("[Databuddy Flags] Storage cleared");
|
|
558
|
-
}
|
|
447
|
+
flagStorage.clear();
|
|
448
|
+
logger.debug("Storage cleared");
|
|
559
449
|
} catch (err) {
|
|
560
|
-
|
|
561
|
-
console.warn("[Databuddy Flags] Storage clear error:", err);
|
|
562
|
-
}
|
|
450
|
+
logger.warn("Storage clear error:", err);
|
|
563
451
|
}
|
|
564
452
|
}
|
|
565
453
|
}
|
|
566
|
-
|
|
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
|
-
|
|
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
|
package/dist/vue/index.d.mts
CHANGED
|
@@ -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;
|
package/dist/vue/index.d.ts
CHANGED
|
@@ -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;
|
package/dist/vue/index.mjs
CHANGED
|
@@ -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.
|
|
2
|
+
import { i as isScriptInjected, c as createScript } from '../shared/@databuddy/sdk.DsZP9wPD.mjs';
|
|
3
3
|
|
|
4
4
|
const Databuddy = defineComponent({
|
|
5
5
|
props: {},
|