@jewel998/config 0.1.0 → 0.1.2
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/client/ConfigClient.d.ts +3 -1
- package/dist/client/ConfigClient.d.ts.map +1 -1
- package/dist/client/ConfigClient.js +53 -19
- package/dist/client/ConfigClient.js.map +1 -1
- package/dist/context/autoContext.d.ts +28 -0
- package/dist/context/autoContext.d.ts.map +1 -0
- package/dist/context/autoContext.js +135 -0
- package/dist/context/autoContext.js.map +1 -0
- package/dist/createConfig.d.ts.map +1 -1
- package/dist/createConfig.js +31 -7
- package/dist/createConfig.js.map +1 -1
- package/dist/index.d.ts +6 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -9
- package/dist/index.js.map +1 -1
- package/dist/initConfig.d.ts +66 -0
- package/dist/initConfig.d.ts.map +1 -0
- package/dist/initConfig.js +128 -0
- package/dist/initConfig.js.map +1 -0
- package/dist/loading/pessimistic.d.ts.map +1 -1
- package/dist/loading/pessimistic.js +12 -5
- package/dist/loading/pessimistic.js.map +1 -1
- package/dist/plugins/models.d.ts +1 -0
- package/dist/plugins/models.d.ts.map +1 -1
- package/dist/plugins/prerequisites/prerequisitePlugin.d.ts.map +1 -1
- package/dist/plugins/prerequisites/prerequisitePlugin.js +22 -2
- package/dist/plugins/prerequisites/prerequisitePlugin.js.map +1 -1
- package/dist/transport/HttpTransport.d.ts +4 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -1
- package/dist/transport/HttpTransport.js +15 -4
- package/dist/transport/HttpTransport.js.map +1 -1
- package/dist/types.d.ts +24 -37
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/webhook-formats.d.ts +92 -0
- package/dist/webhook-formats.d.ts.map +1 -0
- package/dist/webhook-formats.js +141 -0
- package/dist/webhook-formats.js.map +1 -0
- package/package.json +1 -1
- package/dist/cache/storage.d.ts +0 -15
- package/dist/cache/storage.d.ts.map +0 -1
- package/dist/cache/storage.js +0 -43
- package/dist/cache/storage.js.map +0 -1
- package/dist/cache/types.d.ts +0 -3
- package/dist/cache/types.js +0 -2
- package/dist/cache/types.js.map +0 -1
- package/dist/client.d.ts +0 -15
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -80
- package/dist/client.js.map +0 -1
- package/dist/core/resolver.d.ts +0 -8
- package/dist/core/resolver.d.ts.map +0 -1
- package/dist/core/resolver.js +0 -22
- package/dist/core/resolver.js.map +0 -1
- package/dist/errors/index.d.ts +0 -17
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -29
- package/dist/errors/index.js.map +0 -1
- package/dist/example.d.ts +0 -2
- package/dist/example.d.ts.map +0 -1
- package/dist/example.js +0 -23
- package/dist/example.js.map +0 -1
- package/dist/loading/deferred.d.ts +0 -3
- package/dist/loading/deferred.js +0 -5
- package/dist/loading/deferred.js.map +0 -1
- package/dist/loading/optimistic.d.ts +0 -3
- package/dist/loading/pessimistic.d.ts +0 -3
- package/dist/management/index.d.ts +0 -3
- package/dist/management/index.d.ts.map +0 -1
- package/dist/management/index.js +0 -2
- package/dist/management/index.js.map +0 -1
- package/dist/management/manager.d.ts +0 -34
- package/dist/management/manager.d.ts.map +0 -1
- package/dist/management/manager.js +0 -21
- package/dist/management/manager.js.map +0 -1
- package/dist/management/memory-backend.d.ts +0 -6
- package/dist/management/memory-backend.d.ts.map +0 -1
- package/dist/management/memory-backend.js +0 -78
- package/dist/management/memory-backend.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -5
- package/dist/plugins/lifecycle/index.d.ts +0 -4
- package/dist/plugins/overrides/index.d.ts +0 -2
- package/dist/plugins/prerequisites/index.d.ts +0 -3
- package/dist/plugins/rollout/index.d.ts +0 -3
- package/dist/plugins/rollout/murmurhash3.d.ts +0 -6
- package/dist/plugins/rollout/murmurhash3.d.ts.map +0 -1
- package/dist/plugins/rollout/murmurhash3.js +0 -56
- package/dist/plugins/rollout/murmurhash3.js.map +0 -1
- package/dist/plugins/schedule/index.d.ts +0 -2
- package/dist/plugins/targeting/index.d.ts +0 -4
- package/dist/plugins/targeting/predicates.d.ts +0 -23
- package/dist/plugins/targeting/predicates.js +0 -110
- package/dist/plugins/targeting/predicates.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -35
- package/dist/plugins/types.js +0 -13
- package/dist/plugins/types.js.map +0 -1
- package/dist/registry.d.ts +0 -9
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -22
- package/dist/registry.js.map +0 -1
- package/dist/remote/firebase-adapter.d.ts +0 -6
- package/dist/remote/firebase-adapter.d.ts.map +0 -1
- package/dist/remote/firebase-adapter.js +0 -12
- package/dist/remote/firebase-adapter.js.map +0 -1
- package/dist/remote/provider.d.ts +0 -6
- package/dist/remote/provider.d.ts.map +0 -1
- package/dist/remote/provider.js +0 -5
- package/dist/remote/provider.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EvaluationContext, EvaluationPlugin } from "../plugins/types.js";
|
|
2
|
-
import type { CacheStorage, ConfigClient, ConfigFetcher, EventEmitterInterface, FetchGranularity, RetryConfig } from "../types";
|
|
2
|
+
import type { CacheStorage, ConfigClient, ConfigFetcher, EvaluationMode, EventEmitterInterface, FetchGranularity, RetryConfig } from "../types";
|
|
3
3
|
export interface ConfigClientInternals {
|
|
4
4
|
data: Record<string, unknown>;
|
|
5
5
|
cache: CacheStorage;
|
|
@@ -11,6 +11,8 @@ export interface ConfigClientInternals {
|
|
|
11
11
|
plugins?: EvaluationPlugin[];
|
|
12
12
|
context?: EvaluationContext;
|
|
13
13
|
consentAware?: boolean;
|
|
14
|
+
evaluationMode?: EvaluationMode;
|
|
15
|
+
onContextChange?: (ctx: EvaluationContext) => void;
|
|
14
16
|
}
|
|
15
17
|
export declare const buildConfigClient: (internals: ConfigClientInternals) => ConfigClient;
|
|
16
18
|
//# sourceMappingURL=ConfigClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigClient.d.ts","sourceRoot":"","sources":["../../src/client/ConfigClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG/E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAGZ,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigClient.d.ts","sourceRoot":"","sources":["../../src/client/ConfigClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG/E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAGZ,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD;AAED,eAAO,MAAM,iBAAiB,GAC5B,WAAW,qBAAqB,KAC/B,YAuPF,CAAC"}
|
|
@@ -6,8 +6,16 @@ export const buildConfigClient = (internals) => {
|
|
|
6
6
|
const plugins = internals.plugins ?? [];
|
|
7
7
|
let evalContext = internals.context ?? {};
|
|
8
8
|
const consentAware = internals.consentAware ?? false;
|
|
9
|
+
const evaluationMode = internals.evaluationMode ?? "server";
|
|
10
|
+
const onContextChange = internals.onContextChange;
|
|
9
11
|
let data = { ...internals.data };
|
|
10
12
|
let batchFetchTriggered = false;
|
|
13
|
+
// ── Request deduplication & debouncing ──
|
|
14
|
+
let inflightRefresh = null;
|
|
15
|
+
let lastFetchTime = 0;
|
|
16
|
+
let contextDebounceTimer = null;
|
|
17
|
+
const MIN_FETCH_INTERVAL = 30_000; // Don't re-fetch within 30s
|
|
18
|
+
const CONTEXT_DEBOUNCE_MS = 100; // Batch rapid setContext calls
|
|
11
19
|
const triggerDeferredFetch = () => {
|
|
12
20
|
if (!isDeferred || batchFetchTriggered) {
|
|
13
21
|
return;
|
|
@@ -158,26 +166,35 @@ export const buildConfigClient = (internals) => {
|
|
|
158
166
|
return { ...data };
|
|
159
167
|
},
|
|
160
168
|
async refresh() {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
169
|
+
// Deduplication: if a refresh is already in-flight, reuse it
|
|
170
|
+
if (inflightRefresh)
|
|
171
|
+
return inflightRefresh;
|
|
172
|
+
inflightRefresh = (async () => {
|
|
173
|
+
try {
|
|
174
|
+
const result = await withRetry(() => fetcher.fetchAll(), retry);
|
|
175
|
+
cache.set("__all__", result, DEFAULT_CACHE_TTL);
|
|
176
|
+
for (const [key, value] of Object.entries(result)) {
|
|
177
|
+
cache.set(key, value, DEFAULT_CACHE_TTL);
|
|
178
|
+
}
|
|
179
|
+
data = { ...data, ...result };
|
|
180
|
+
lastFetchTime = Date.now();
|
|
181
|
+
events.emit("updated", {
|
|
182
|
+
keys: Object.keys(result),
|
|
183
|
+
source: "refresh",
|
|
184
|
+
});
|
|
166
185
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
throw error;
|
|
180
|
-
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
events.emit("fetchError", {
|
|
188
|
+
error: error,
|
|
189
|
+
retryCount: retry.maxRetries,
|
|
190
|
+
willRetry: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
inflightRefresh = null;
|
|
195
|
+
}
|
|
196
|
+
})();
|
|
197
|
+
return inflightRefresh;
|
|
181
198
|
},
|
|
182
199
|
on(event, callback) {
|
|
183
200
|
events.on(event, callback);
|
|
@@ -187,6 +204,23 @@ export const buildConfigClient = (internals) => {
|
|
|
187
204
|
},
|
|
188
205
|
setContext(newContext) {
|
|
189
206
|
evalContext = { ...newContext };
|
|
207
|
+
// Notify the transport layer of the context change
|
|
208
|
+
if (onContextChange) {
|
|
209
|
+
onContextChange(evalContext);
|
|
210
|
+
}
|
|
211
|
+
// In server mode, context change means we need fresh resolved values.
|
|
212
|
+
// Debounce rapid setContext calls (e.g., form typing, navigation)
|
|
213
|
+
if (evaluationMode === "server") {
|
|
214
|
+
if (contextDebounceTimer)
|
|
215
|
+
clearTimeout(contextDebounceTimer);
|
|
216
|
+
contextDebounceTimer = setTimeout(() => {
|
|
217
|
+
contextDebounceTimer = null;
|
|
218
|
+
// Skip if we fetched very recently (stale check)
|
|
219
|
+
if (Date.now() - lastFetchTime < MIN_FETCH_INTERVAL)
|
|
220
|
+
return;
|
|
221
|
+
void client.refresh();
|
|
222
|
+
}, CONTEXT_DEBOUNCE_MS);
|
|
223
|
+
}
|
|
190
224
|
},
|
|
191
225
|
};
|
|
192
226
|
return client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigClient.js","sourceRoot":"","sources":["../../src/client/ConfigClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigClient.js","sourceRoot":"","sources":["../../src/client/ConfigClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EvaluationContext } from "../plugins/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Automatically detect browser/device attributes and merge with user-provided context.
|
|
4
|
+
*
|
|
5
|
+
* Can be called two ways:
|
|
6
|
+
* 1. No args: returns auto-detected context only
|
|
7
|
+
* `autoContext()`
|
|
8
|
+
*
|
|
9
|
+
* 2. With user attributes: auto-detects AND merges your attributes (yours win on conflict)
|
|
10
|
+
* `autoContext({ userId: "user_123", plan: "pro", country: "US" })`
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const flags = initFlags({
|
|
15
|
+
* clientId: "cid_xxx",
|
|
16
|
+
* context: autoContext({ userId: "user_123", plan: "pro" }),
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function autoContext(user?: {
|
|
21
|
+
userId?: string;
|
|
22
|
+
[key: string]: string | number | boolean | string[] | undefined;
|
|
23
|
+
}): EvaluationContext;
|
|
24
|
+
/**
|
|
25
|
+
* Deep-merge two evaluation contexts. User-provided values take precedence.
|
|
26
|
+
*/
|
|
27
|
+
export declare function mergeContext(auto: EvaluationContext, user: EvaluationContext): EvaluationContext;
|
|
28
|
+
//# sourceMappingURL=autoContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoContext.d.ts","sourceRoot":"","sources":["../../src/context/autoContext.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACjE,GAAG,iBAAiB,CAmCpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,CASnB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2
|
+
// Auto-Context Detection Helpers
|
|
3
|
+
// Tree-shakeable: only included if explicitly imported by consumer
|
|
4
|
+
// ═══════════════════════════════════════════════════════════════
|
|
5
|
+
/**
|
|
6
|
+
* Automatically detect browser/device attributes and merge with user-provided context.
|
|
7
|
+
*
|
|
8
|
+
* Can be called two ways:
|
|
9
|
+
* 1. No args: returns auto-detected context only
|
|
10
|
+
* `autoContext()`
|
|
11
|
+
*
|
|
12
|
+
* 2. With user attributes: auto-detects AND merges your attributes (yours win on conflict)
|
|
13
|
+
* `autoContext({ userId: "user_123", plan: "pro", country: "US" })`
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const flags = initFlags({
|
|
18
|
+
* clientId: "cid_xxx",
|
|
19
|
+
* context: autoContext({ userId: "user_123", plan: "pro" }),
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function autoContext(user) {
|
|
24
|
+
const detected = {
|
|
25
|
+
attributes: {},
|
|
26
|
+
};
|
|
27
|
+
if (typeof window !== "undefined" && typeof navigator !== "undefined") {
|
|
28
|
+
const ua = navigator.userAgent;
|
|
29
|
+
detected.attributes = {
|
|
30
|
+
browser: detectBrowser(ua),
|
|
31
|
+
browserVersion: detectBrowserVersion(ua),
|
|
32
|
+
os: detectOS(ua),
|
|
33
|
+
device: detectDevice(),
|
|
34
|
+
screenWidth: window.screen?.width ?? 0,
|
|
35
|
+
screenHeight: window.screen?.height ?? 0,
|
|
36
|
+
locale: navigator.language ?? "en",
|
|
37
|
+
timezone: getTimezone(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (!user)
|
|
41
|
+
return detected;
|
|
42
|
+
// Extract userId from the user object, rest goes to attributes
|
|
43
|
+
const { userId, ...attrs } = user;
|
|
44
|
+
const userAttrs = {};
|
|
45
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
46
|
+
if (v !== undefined)
|
|
47
|
+
userAttrs[k] = v;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
userId,
|
|
51
|
+
attributes: {
|
|
52
|
+
...(detected.attributes ?? {}),
|
|
53
|
+
...userAttrs,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Deep-merge two evaluation contexts. User-provided values take precedence.
|
|
59
|
+
*/
|
|
60
|
+
export function mergeContext(auto, user) {
|
|
61
|
+
return {
|
|
62
|
+
userId: user.userId ?? auto.userId,
|
|
63
|
+
attributes: {
|
|
64
|
+
...(auto.attributes ?? {}),
|
|
65
|
+
...(user.attributes ?? {}),
|
|
66
|
+
},
|
|
67
|
+
consentGranted: user.consentGranted ?? auto.consentGranted,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// ═══════════════════════════════════════════════════════════════
|
|
71
|
+
// Detection Helpers (lightweight, no external deps)
|
|
72
|
+
// ═══════════════════════════════════════════════════════════════
|
|
73
|
+
function detectBrowser(ua) {
|
|
74
|
+
if (ua.includes("Firefox/"))
|
|
75
|
+
return "Firefox";
|
|
76
|
+
if (ua.includes("Edg/"))
|
|
77
|
+
return "Edge";
|
|
78
|
+
if (ua.includes("OPR/") || ua.includes("Opera"))
|
|
79
|
+
return "Opera";
|
|
80
|
+
if (ua.includes("Chrome/") && !ua.includes("Edg/"))
|
|
81
|
+
return "Chrome";
|
|
82
|
+
if (ua.includes("Safari/") && !ua.includes("Chrome/"))
|
|
83
|
+
return "Safari";
|
|
84
|
+
return "Unknown";
|
|
85
|
+
}
|
|
86
|
+
function detectBrowserVersion(ua) {
|
|
87
|
+
const patterns = [
|
|
88
|
+
["Firefox", /Firefox\/(\d+[\d.]*)/],
|
|
89
|
+
["Edge", /Edg\/(\d+[\d.]*)/],
|
|
90
|
+
["Opera", /OPR\/(\d+[\d.]*)/],
|
|
91
|
+
["Chrome", /Chrome\/(\d+[\d.]*)/],
|
|
92
|
+
["Safari", /Version\/(\d+[\d.]*)/],
|
|
93
|
+
];
|
|
94
|
+
for (const [, regex] of patterns) {
|
|
95
|
+
const match = ua.match(regex);
|
|
96
|
+
if (match?.[1])
|
|
97
|
+
return match[1];
|
|
98
|
+
}
|
|
99
|
+
return "0";
|
|
100
|
+
}
|
|
101
|
+
function detectOS(ua) {
|
|
102
|
+
if (ua.includes("Windows"))
|
|
103
|
+
return "Windows";
|
|
104
|
+
if (ua.includes("Mac OS"))
|
|
105
|
+
return "macOS";
|
|
106
|
+
if (ua.includes("Linux") && !ua.includes("Android"))
|
|
107
|
+
return "Linux";
|
|
108
|
+
if (ua.includes("Android"))
|
|
109
|
+
return "Android";
|
|
110
|
+
if (/iPhone|iPad|iPod/.test(ua))
|
|
111
|
+
return "iOS";
|
|
112
|
+
if (ua.includes("CrOS"))
|
|
113
|
+
return "ChromeOS";
|
|
114
|
+
return "Unknown";
|
|
115
|
+
}
|
|
116
|
+
function detectDevice() {
|
|
117
|
+
if (typeof window === "undefined")
|
|
118
|
+
return "desktop";
|
|
119
|
+
const width = window.screen?.width ?? window.innerWidth;
|
|
120
|
+
const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
|
|
121
|
+
if (hasTouch && width < 768)
|
|
122
|
+
return "mobile";
|
|
123
|
+
if (hasTouch && width >= 768 && width < 1024)
|
|
124
|
+
return "tablet";
|
|
125
|
+
return "desktop";
|
|
126
|
+
}
|
|
127
|
+
function getTimezone() {
|
|
128
|
+
try {
|
|
129
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return "UTC";
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=autoContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoContext.js","sourceRoot":"","sources":["../../src/context/autoContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createConfig.d.ts","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createConfig.d.ts","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAKjB,wBAAgB,YAAY,CAC1B,OAAO,EAAE,mBAAmB,GAAG;IAAE,eAAe,EAAE,aAAa,CAAA;CAAE,GAChE,OAAO,CAAC,YAAY,CAAC,CAAC;AACzB,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAAC"}
|
package/dist/createConfig.js
CHANGED
|
@@ -9,7 +9,7 @@ import { executeOptimistic } from "./loading/optimistic";
|
|
|
9
9
|
import { executePessimistic } from "./loading/pessimistic";
|
|
10
10
|
import { createHttpTransport } from "./transport/HttpTransport";
|
|
11
11
|
import { DEFAULT_RETRY, DEFAULT_TIMEOUT } from "./types";
|
|
12
|
-
const DEFAULT_BASE_URL = "https://
|
|
12
|
+
const DEFAULT_BASE_URL = "https://jewel998-config.web.app/api";
|
|
13
13
|
export function createConfig(options) {
|
|
14
14
|
// 1. Validate clientId
|
|
15
15
|
if (!options.clientId) {
|
|
@@ -26,16 +26,26 @@ export function createConfig(options) {
|
|
|
26
26
|
const retry = { ...DEFAULT_RETRY, ...options.retry };
|
|
27
27
|
const timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
28
28
|
const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
|
|
29
|
-
//
|
|
29
|
+
// Auto-detect evaluation mode from key prefix:
|
|
30
|
+
// cid_ = client key → server evaluates (frontend)
|
|
31
|
+
// svr_ = server key → client evaluates locally (backend)
|
|
32
|
+
const evaluationMode = options.clientId.startsWith("svr_")
|
|
33
|
+
? "client"
|
|
34
|
+
: "server";
|
|
35
|
+
// 4. Maintain a mutable context reference for server mode
|
|
36
|
+
let currentContext = options.context ?? {};
|
|
37
|
+
// 5. Create internal modules
|
|
30
38
|
const transport = createHttpTransport({
|
|
31
39
|
baseUrl,
|
|
32
40
|
clientId: options.clientId,
|
|
41
|
+
evaluationMode,
|
|
42
|
+
getContext: () => currentContext,
|
|
33
43
|
});
|
|
34
44
|
const events = new TypedEventEmitter();
|
|
35
45
|
const fetcher = granularity === "batch"
|
|
36
46
|
? createBatchFetcher(transport)
|
|
37
47
|
: createProjectedFetcher(transport);
|
|
38
|
-
//
|
|
48
|
+
// 6. Create loading context
|
|
39
49
|
const context = {
|
|
40
50
|
clientId: options.clientId,
|
|
41
51
|
fetcher,
|
|
@@ -45,7 +55,9 @@ export function createConfig(options) {
|
|
|
45
55
|
timeout,
|
|
46
56
|
granularity,
|
|
47
57
|
};
|
|
48
|
-
//
|
|
58
|
+
// 7. In server mode, plugins are not needed (API resolves everything)
|
|
59
|
+
const plugins = evaluationMode === "client" ? options.plugins : undefined;
|
|
60
|
+
// 8. Execute strategy
|
|
49
61
|
if (strategy === "pessimistic") {
|
|
50
62
|
return executePessimistic(context).then((result) => {
|
|
51
63
|
const client = buildConfigClient({
|
|
@@ -56,9 +68,13 @@ export function createConfig(options) {
|
|
|
56
68
|
retry,
|
|
57
69
|
granularity,
|
|
58
70
|
isDeferred: false,
|
|
59
|
-
plugins
|
|
71
|
+
plugins,
|
|
60
72
|
context: options.context,
|
|
61
73
|
consentAware: options.consentAware,
|
|
74
|
+
evaluationMode,
|
|
75
|
+
onContextChange: (ctx) => {
|
|
76
|
+
currentContext = ctx;
|
|
77
|
+
},
|
|
62
78
|
});
|
|
63
79
|
events.emit("ready", {
|
|
64
80
|
loadingStrategy: "pessimistic",
|
|
@@ -77,9 +93,13 @@ export function createConfig(options) {
|
|
|
77
93
|
retry,
|
|
78
94
|
granularity,
|
|
79
95
|
isDeferred: true,
|
|
80
|
-
plugins
|
|
96
|
+
plugins,
|
|
81
97
|
context: options.context,
|
|
82
98
|
consentAware: options.consentAware,
|
|
99
|
+
evaluationMode,
|
|
100
|
+
onContextChange: (ctx) => {
|
|
101
|
+
currentContext = ctx;
|
|
102
|
+
},
|
|
83
103
|
});
|
|
84
104
|
events.emit("ready", {
|
|
85
105
|
loadingStrategy: "deferred",
|
|
@@ -97,9 +117,13 @@ export function createConfig(options) {
|
|
|
97
117
|
retry,
|
|
98
118
|
granularity,
|
|
99
119
|
isDeferred: false,
|
|
100
|
-
plugins
|
|
120
|
+
plugins,
|
|
101
121
|
context: options.context,
|
|
102
122
|
consentAware: options.consentAware,
|
|
123
|
+
evaluationMode,
|
|
124
|
+
onContextChange: (ctx) => {
|
|
125
|
+
currentContext = ctx;
|
|
126
|
+
},
|
|
103
127
|
});
|
|
104
128
|
events.emit("ready", {
|
|
105
129
|
loadingStrategy: "optimistic",
|
package/dist/createConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createConfig.js","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"createConfig.js","sourceRoot":"","sources":["../src/createConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
|
+
export { initConfig } from "./initConfig";
|
|
2
|
+
export type { InitConfigOptions, Flags } from "./initConfig";
|
|
1
3
|
export { createConfig } from "./createConfig";
|
|
2
|
-
export type { CacheStorage, ClientIdRecord, ConfigClient, ConfigEventCallback, ConfigEventPayloads, ConfigEventType, ConfigRecord, CreateConfigOptions, EnvironmentRecord, FetchGranularity, LoadingStrategy, ProjectRecord, RetryConfig, } from "./types";
|
|
4
|
+
export type { CacheStorage, ClientIdRecord, ConfigClient, ConfigEventCallback, ConfigEventPayloads, ConfigEventType, ConfigRecord, CreateConfigOptions, EnvironmentRecord, EvaluationWarning, FetchGranularity, LoadingStrategy, ProjectRecord, RetryConfig, } from "./types";
|
|
3
5
|
export type { EvaluationContext, EvaluationPlugin, PipelineStepId, PipelineStepResult, PipelineHelpers, } from "./plugins/types.js";
|
|
4
6
|
export { PIPELINE_ORDER } from "./plugins/types.js";
|
|
7
|
+
export { autoContext, mergeContext } from "./context/autoContext";
|
|
8
|
+
export { WEBHOOK_FORMATS, WEBHOOK_FORMAT_INFO, TEMPLATE_VARIABLES, WEBHOOK_EVENT_TYPES, WEBHOOK_RESOURCE_CATEGORIES, SAMPLE_WEBHOOK_EVENT, } from "./webhook-formats";
|
|
9
|
+
export type { WebhookFormat, WebhookEventType, WebhookResourceCategory, } from "./webhook-formats";
|
|
5
10
|
export { memoryStorage } from "./cache/memoryStorage";
|
|
6
11
|
export { browserStorage } from "./cache/browserStorage";
|
|
7
12
|
export { AuthenticationError, ConfigError, InitializationError, TimeoutError, } from "./errors/index";
|
|
8
13
|
export type { ConfigErrorCode } from "./errors/index";
|
|
9
|
-
/** @deprecated Use createConfig() instead */
|
|
10
|
-
export { createConfigClient } from "./client";
|
|
11
|
-
export type { ConfigClient as LegacyConfigClient, ConfigClientOptions, } from "./client";
|
|
12
|
-
/** @deprecated Tenant concept removed. Use ProjectRecord instead. */
|
|
13
|
-
export type { TenantRecord } from "./types";
|
|
14
|
-
/** @deprecated Use ConfigRecord instead */
|
|
15
|
-
export type { ConfigVersionRecord } from "./types";
|
|
16
|
-
/** @deprecated Scoping is handled by clientId */
|
|
17
|
-
export type { ConfigResolveContext, ConfigDefinition } from "./types";
|
|
18
|
-
/** @deprecated Use LoadingStrategy instead */
|
|
19
|
-
export type { ConfigScope, ConfigSourceMode } from "./types";
|
|
20
|
-
export { createConfigManager } from "./management/index";
|
|
21
|
-
export type { ConfigManager, ConfigManagerOptions } from "./management/index";
|
|
22
|
-
export type { ConfigManagerBackend } from "./management/manager";
|
|
23
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,YAAY,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,YAAY,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
// ═══════════════════════════════════════════════════════════════
|
|
2
|
-
//
|
|
2
|
+
// @jewel998/config SDK
|
|
3
3
|
// ═══════════════════════════════════════════════════════════════
|
|
4
|
-
//
|
|
4
|
+
// Primary entry point
|
|
5
|
+
export { initConfig } from "./initConfig";
|
|
6
|
+
// Legacy (still works, use initConfig for new projects)
|
|
5
7
|
export { createConfig } from "./createConfig";
|
|
6
8
|
export { PIPELINE_ORDER } from "./plugins/types.js";
|
|
9
|
+
// Context helpers (tree-shakeable)
|
|
10
|
+
export { autoContext, mergeContext } from "./context/autoContext";
|
|
11
|
+
// Webhook format constants (shared between portal, docs, functions)
|
|
12
|
+
export { WEBHOOK_FORMATS, WEBHOOK_FORMAT_INFO, TEMPLATE_VARIABLES, WEBHOOK_EVENT_TYPES, WEBHOOK_RESOURCE_CATEGORIES, SAMPLE_WEBHOOK_EVENT, } from "./webhook-formats";
|
|
7
13
|
// Cache adapters
|
|
8
14
|
export { memoryStorage } from "./cache/memoryStorage";
|
|
9
15
|
export { browserStorage } from "./cache/browserStorage";
|
|
10
16
|
// Errors
|
|
11
17
|
export { AuthenticationError, ConfigError, InitializationError, TimeoutError, } from "./errors/index";
|
|
12
|
-
// ═══════════════════════════════════════════════════════════════
|
|
13
|
-
// Deprecated API (kept for Phase 1 migration, remove in v1.0.0)
|
|
14
|
-
// ═══════════════════════════════════════════════════════════════
|
|
15
|
-
/** @deprecated Use createConfig() instead */
|
|
16
|
-
export { createConfigClient } from "./client";
|
|
17
|
-
// Management (Portal only — still active)
|
|
18
|
-
export { createConfigManager } from "./management/index";
|
|
19
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,uBAAuB;AACvB,kEAAkE;AAElE,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA6B9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,mCAAmC;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElE,oEAAoE;AACpE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAO3B,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,SAAS;AACT,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ConfigEventCallback, ConfigEventType } from "./types";
|
|
2
|
+
import type { EvaluationContext } from "./plugins/types.js";
|
|
3
|
+
export interface InitConfigOptions {
|
|
4
|
+
/** Required. API key from the portal (cid_ for client, svr_ for server). */
|
|
5
|
+
clientId: string;
|
|
6
|
+
/**
|
|
7
|
+
* Default/fallback values returned instantly before the API responds.
|
|
8
|
+
* Keys are flag names, values are what your app uses immediately (optimistic).
|
|
9
|
+
*/
|
|
10
|
+
defaults?: Record<string, unknown>;
|
|
11
|
+
/** User context for targeting evaluation. Use autoContext() to auto-detect browser info. */
|
|
12
|
+
context?: EvaluationContext;
|
|
13
|
+
/**
|
|
14
|
+
* Your self-hosted API URL. Points to your Firebase deployment.
|
|
15
|
+
* Default: https://jewel998-config.web.app/api (demo instance)
|
|
16
|
+
*
|
|
17
|
+
* @example "https://your-project.web.app/api"
|
|
18
|
+
*/
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Polling interval in milliseconds for version checks.
|
|
22
|
+
* The SDK periodically calls /api/version (lightweight ~100 bytes)
|
|
23
|
+
* and only re-fetches full data when the version changes.
|
|
24
|
+
*
|
|
25
|
+
* Default: 300000 (5 minutes). Set to 0 to disable polling.
|
|
26
|
+
*/
|
|
27
|
+
pollInterval?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Flags {
|
|
30
|
+
/** Get a flag value. Returns the default until the API responds, then the resolved value. */
|
|
31
|
+
get<T = unknown>(key: string): T;
|
|
32
|
+
/** Get a boolean flag. Returns false if the flag doesn't exist. */
|
|
33
|
+
flag(key: string): boolean;
|
|
34
|
+
/** Get all resolved flag values. */
|
|
35
|
+
all(): Record<string, unknown>;
|
|
36
|
+
/** Update user context. Triggers a re-fetch in client-key mode. */
|
|
37
|
+
setContext(context: EvaluationContext): void;
|
|
38
|
+
/** Force re-fetch from the API. */
|
|
39
|
+
refresh(): Promise<void>;
|
|
40
|
+
/** Subscribe to events: "ready", "updated", "fetchError" */
|
|
41
|
+
on<E extends ConfigEventType>(event: E, cb: ConfigEventCallback<E>): void;
|
|
42
|
+
/** Unsubscribe from events. */
|
|
43
|
+
off<E extends ConfigEventType>(event: E, cb: ConfigEventCallback<E>): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the feature flags SDK.
|
|
47
|
+
*
|
|
48
|
+
* Returns a Flags instance that immediately serves default values,
|
|
49
|
+
* then resolves to real values from the API in the background.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const flags = initConfig({
|
|
54
|
+
* clientId: "cid_xxx",
|
|
55
|
+
* defaults: { "feature.dark_mode": false },
|
|
56
|
+
* context: autoContext({ userId: "user_123", plan: "pro" }),
|
|
57
|
+
* });
|
|
58
|
+
*
|
|
59
|
+
* flags.get("feature.dark_mode"); // → false (instant)
|
|
60
|
+
* flags.on("updated", () => {
|
|
61
|
+
* flags.get("feature.dark_mode"); // → true (from API)
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function initConfig(options: InitConfigOptions): Flags;
|
|
66
|
+
//# sourceMappingURL=initConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initConfig.d.ts","sourceRoot":"","sources":["../src/initConfig.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAEV,mBAAmB,EACnB,eAAe,EAEhB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,4FAA4F;IAC5F,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE5B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACpB,6FAA6F;IAC7F,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;IAEjC,mEAAmE;IACnE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE3B,oCAAoC;IACpC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B,mEAAmE;IACnE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE7C,mCAAmC;IACnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,4DAA4D;IAC5D,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1E,+BAA+B;IAC/B,GAAG,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC5E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,KAAK,CA4G5D"}
|