flipflag-sdk 1.1.12 → 1.1.13
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/next.js +83 -23
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +83 -23
- package/dist/next.mjs.map +1 -1
- package/package.json +1 -1
package/dist/next.js
CHANGED
|
@@ -434,23 +434,24 @@ function useFlipflagContext() {
|
|
|
434
434
|
|
|
435
435
|
function useFeatureFlag(flagName, options = {}) {
|
|
436
436
|
const context = useFlipflagContext();
|
|
437
|
+
// Extract specific properties to avoid dependency on entire context object
|
|
438
|
+
const { sdk, serverFlags, isServerRendered } = context;
|
|
437
439
|
const [value, setValue] = react.useState(() => {
|
|
438
440
|
var _a, _b, _c;
|
|
439
441
|
// Use server-side value if available
|
|
440
|
-
if (
|
|
441
|
-
return (_b = (_a =
|
|
442
|
+
if (serverFlags && isServerRendered) {
|
|
443
|
+
return (_b = (_a = serverFlags[flagName]) !== null && _a !== void 0 ? _a : options.fallbackValue) !== null && _b !== void 0 ? _b : false;
|
|
442
444
|
}
|
|
443
445
|
return (_c = options.fallbackValue) !== null && _c !== void 0 ? _c : false;
|
|
444
446
|
});
|
|
445
|
-
const [loading, setLoading] = react.useState(!
|
|
447
|
+
const [loading, setLoading] = react.useState(!isServerRendered);
|
|
446
448
|
const [error, setError] = react.useState(null);
|
|
447
|
-
const sdk = context.sdk;
|
|
448
449
|
const fetchFlag = react.useCallback(async () => {
|
|
449
450
|
if (!options.enabled && options.enabled !== undefined) {
|
|
450
451
|
return;
|
|
451
452
|
}
|
|
452
453
|
// Skip fetching if we already have server-side data and it's still valid
|
|
453
|
-
if (
|
|
454
|
+
if (isServerRendered && serverFlags) {
|
|
454
455
|
setLoading(false);
|
|
455
456
|
return;
|
|
456
457
|
}
|
|
@@ -475,13 +476,26 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
475
476
|
flagName,
|
|
476
477
|
options.fallbackValue,
|
|
477
478
|
options.enabled,
|
|
478
|
-
|
|
479
|
-
|
|
479
|
+
isServerRendered,
|
|
480
|
+
serverFlags,
|
|
480
481
|
]);
|
|
481
482
|
const refetch = react.useCallback(async () => {
|
|
482
483
|
sdk.clearCache(`flag:${sdk["config"].projectId}:${flagName}:${sdk["config"].environment || "all"}`);
|
|
483
484
|
await fetchFlag();
|
|
484
485
|
}, [sdk, flagName, fetchFlag]);
|
|
486
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
487
|
+
react.useEffect(() => {
|
|
488
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
489
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
490
|
+
const newValue = state.flags[flagName];
|
|
491
|
+
if (newValue !== undefined && newValue !== value) {
|
|
492
|
+
setValue(newValue);
|
|
493
|
+
setLoading(false);
|
|
494
|
+
setError(null);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
return unsubscribe;
|
|
498
|
+
}, [sdk, flagName, value]);
|
|
485
499
|
react.useEffect(() => {
|
|
486
500
|
fetchFlag();
|
|
487
501
|
}, [fetchFlag]);
|
|
@@ -495,25 +509,30 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
495
509
|
|
|
496
510
|
function useFeatureFlags(flagNames, options = {}) {
|
|
497
511
|
const context = useFlipflagContext();
|
|
512
|
+
// Extract specific properties to avoid dependency on entire context object
|
|
513
|
+
const { sdk, serverFlags, isServerRendered } = context;
|
|
514
|
+
// Memoize flagNames array to prevent unnecessary re-renders
|
|
515
|
+
const memoizedFlagNames = react.useMemo(() => flagNames, [flagNames.join(",")]);
|
|
516
|
+
// Memoize fallbackValues object
|
|
517
|
+
const memoizedFallbackValues = react.useMemo(() => options.fallbackValues, [JSON.stringify(options.fallbackValues)]);
|
|
498
518
|
const [flags, setFlags] = react.useState(() => {
|
|
499
519
|
// Initialize with server-side values or fallback
|
|
500
520
|
const initialFlags = {};
|
|
501
|
-
|
|
502
|
-
var _a, _b
|
|
521
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
522
|
+
var _a, _b;
|
|
503
523
|
initialFlags[flagName] =
|
|
504
|
-
(
|
|
524
|
+
(_b = (_a = serverFlags === null || serverFlags === void 0 ? void 0 : serverFlags[flagName]) !== null && _a !== void 0 ? _a : memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _b !== void 0 ? _b : false;
|
|
505
525
|
});
|
|
506
526
|
return initialFlags;
|
|
507
527
|
});
|
|
508
|
-
const [loading, setLoading] = react.useState(!
|
|
528
|
+
const [loading, setLoading] = react.useState(!isServerRendered);
|
|
509
529
|
const [error, setError] = react.useState(null);
|
|
510
|
-
const sdk = context.sdk;
|
|
511
530
|
const fetchFlags = react.useCallback(async () => {
|
|
512
531
|
if (!options.enabled && options.enabled !== undefined) {
|
|
513
532
|
return;
|
|
514
533
|
}
|
|
515
534
|
// Skip fetching if we already have server-side data and it's still valid
|
|
516
|
-
if (
|
|
535
|
+
if (isServerRendered && serverFlags) {
|
|
517
536
|
setLoading(false);
|
|
518
537
|
return;
|
|
519
538
|
}
|
|
@@ -522,11 +541,11 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
522
541
|
setError(null);
|
|
523
542
|
const response = await sdk.getFlags();
|
|
524
543
|
const newFlags = {};
|
|
525
|
-
|
|
526
|
-
var _a, _b
|
|
544
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
545
|
+
var _a, _b;
|
|
527
546
|
// Use API value if available, otherwise fallback
|
|
528
547
|
newFlags[flagName] =
|
|
529
|
-
(
|
|
548
|
+
(_b = (_a = response.flags[flagName]) !== null && _a !== void 0 ? _a : memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _b !== void 0 ? _b : false;
|
|
530
549
|
});
|
|
531
550
|
setFlags(newFlags);
|
|
532
551
|
}
|
|
@@ -535,9 +554,9 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
535
554
|
setError(errorMessage);
|
|
536
555
|
// Use fallback values
|
|
537
556
|
const fallbackFlags = {};
|
|
538
|
-
|
|
539
|
-
var _a
|
|
540
|
-
fallbackFlags[flagName] = (
|
|
557
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
558
|
+
var _a;
|
|
559
|
+
fallbackFlags[flagName] = (_a = memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _a !== void 0 ? _a : false;
|
|
541
560
|
});
|
|
542
561
|
setFlags(fallbackFlags);
|
|
543
562
|
}
|
|
@@ -546,12 +565,39 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
546
565
|
}
|
|
547
566
|
}, [
|
|
548
567
|
sdk,
|
|
549
|
-
|
|
550
|
-
|
|
568
|
+
memoizedFlagNames,
|
|
569
|
+
memoizedFallbackValues,
|
|
551
570
|
options.enabled,
|
|
552
|
-
|
|
553
|
-
|
|
571
|
+
isServerRendered,
|
|
572
|
+
serverFlags,
|
|
554
573
|
]);
|
|
574
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
575
|
+
react.useEffect(() => {
|
|
576
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
577
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
578
|
+
const newFlags = {};
|
|
579
|
+
let hasChanges = false;
|
|
580
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
581
|
+
var _a;
|
|
582
|
+
const newValue = state.flags[flagName];
|
|
583
|
+
if (newValue !== undefined) {
|
|
584
|
+
newFlags[flagName] = newValue;
|
|
585
|
+
if (newValue !== flags[flagName]) {
|
|
586
|
+
hasChanges = true;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
newFlags[flagName] = (_a = memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _a !== void 0 ? _a : false;
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
if (hasChanges) {
|
|
594
|
+
setFlags(newFlags);
|
|
595
|
+
setLoading(false);
|
|
596
|
+
setError(null);
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
return unsubscribe;
|
|
600
|
+
}, [sdk, memoizedFlagNames, memoizedFallbackValues, flags]);
|
|
555
601
|
react.useEffect(() => {
|
|
556
602
|
fetchFlags();
|
|
557
603
|
}, [fetchFlags]);
|
|
@@ -602,6 +648,20 @@ function useABTest(testName, options) {
|
|
|
602
648
|
console.error("Failed to record A/B test event:", err);
|
|
603
649
|
}
|
|
604
650
|
}, [sdk, testName, options.userId, variantId]);
|
|
651
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
652
|
+
react.useEffect(() => {
|
|
653
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
654
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
655
|
+
const newABTest = state.abTests[testName];
|
|
656
|
+
if (newABTest && newABTest.variantId !== variantId) {
|
|
657
|
+
setVariant(newABTest.variant.value);
|
|
658
|
+
setVariantId(newABTest.variantId);
|
|
659
|
+
setLoading(false);
|
|
660
|
+
setError(null);
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
return unsubscribe;
|
|
664
|
+
}, [sdk, testName, variantId]);
|
|
605
665
|
react.useEffect(() => {
|
|
606
666
|
fetchVariant();
|
|
607
667
|
}, [fetchVariant]);
|
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.js","sources":["../src/core/FlipFlagSDK.ts","../src/next/FlipflagProvider.tsx","../src/next/useFeatureFlag.ts","../src/next/useFeatureFlags.ts","../src/next/useABTest.ts","../src/next/server-utils.ts","../src/next/identifyUser.ts"],"sourcesContent":["import {\n FlipFlagConfig,\n FeatureFlagResponse,\n FeatureFlagsResponse,\n ABTestResponse,\n ABTestEventResponse,\n ABTestsResponse,\n FlipFlagError,\n CacheEntry,\n RetryOptions,\n SDKState,\n IdentifyUserOptions,\n} from \"../types\";\n\nexport class FlipFlagSDK {\n private config: FlipFlagConfig;\n private cache = new Map<string, CacheEntry<any>>();\n private defaultBaseUrl = \"https://app.flipflag.ru\";\n private pullIntervalId?: NodeJS.Timeout;\n private state: SDKState;\n private stateListeners: Set<(state: SDKState) => void> = new Set();\n\n constructor(config: FlipFlagConfig) {\n this.config = {\n baseUrl: this.defaultBaseUrl,\n cacheTimeout: 30000, // 30 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n pullInterval: 60000, // 1 minute\n ...config,\n };\n\n this.state = {\n flags: {},\n abTests: {},\n lastFetch: null,\n isLoading: false,\n error: null,\n };\n\n // Start automatic pulling if pullInterval is set\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.startPulling();\n }\n }\n\n /**\n * Identify user for A/B testing and user-specific flags\n */\n identifyUser(options: IdentifyUserOptions): void {\n this.config.userId = options.userId;\n\n // Clear A/B test cache since user changed\n this.clearABTestCache();\n\n // If we have a user, we might want to refresh immediately\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.pullData();\n }\n }\n\n /**\n * Get current SDK state\n */\n getState(): SDKState {\n return { ...this.state };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(callback: (state: SDKState) => void): () => void {\n this.stateListeners.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.stateListeners.delete(callback);\n };\n }\n\n /**\n * Get a feature flag value from current state\n */\n getFlagValue(flagName: string): boolean {\n return this.state.flags[flagName] ?? false;\n }\n\n /**\n * Get A/B test variant from current state\n */\n getABTestVariant(testName: string): ABTestResponse | null {\n return this.state.abTests[testName] || null;\n }\n\n /**\n * Start automatic data pulling\n */\n private startPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n }\n\n this.pullIntervalId = setInterval(() => {\n this.pullData();\n }, this.config.pullInterval!);\n\n // Initial pull\n this.pullData();\n }\n\n /**\n * Stop automatic data pulling\n */\n stopPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n this.pullIntervalId = undefined;\n }\n }\n\n /**\n * Pull fresh data from API\n */\n private async pullData(): Promise<void> {\n try {\n this.updateState({ isLoading: true, error: null });\n\n // Pull flags\n const flagsResponse = await this.fetchAllFlags();\n\n // Pull A/B tests if user is identified\n let abTestsResponse: ABTestsResponse | null = null;\n if (this.config.userId) {\n try {\n abTestsResponse = await this.fetchAllABTests();\n } catch (error) {\n console.warn(\"Failed to fetch A/B tests:\", error);\n }\n }\n\n const newState: Partial<SDKState> = {\n flags: flagsResponse?.flags || {},\n lastFetch: new Date(),\n isLoading: false,\n error: null,\n };\n\n if (abTestsResponse) {\n const abTestsMap: Record<string, ABTestResponse> = {};\n abTestsResponse.abTests.forEach((test) => {\n // For each test, get the variant for current user\n if (this.config.userId) {\n // This would normally fetch the variant, but for demo we'll simulate\n abTestsMap[test.name] = {\n testName: test.name,\n testId: test.id,\n variantId: \"variant_a\", // Default variant\n variant: test.variants[0] || {\n id: \"default\",\n name: \"Default\",\n value: null,\n weight: 100,\n },\n timestamp: new Date().toISOString(),\n };\n }\n });\n newState.abTests = abTestsMap;\n }\n\n this.updateState(newState);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n this.updateState({\n isLoading: false,\n error: errorMessage,\n });\n console.error(\"Failed to pull data:\", error);\n }\n }\n\n /**\n * Update state and notify listeners\n */\n private updateState(newState: Partial<SDKState>): void {\n this.state = { ...this.state, ...newState };\n\n // Notify all listeners\n this.stateListeners.forEach((callback) => {\n try {\n callback(this.state);\n } catch (error) {\n console.error(\"State listener error:\", error);\n }\n });\n }\n\n /**\n * Fetch all flags from API\n */\n private async fetchAllFlags(): Promise<FeatureFlagsResponse | null> {\n try {\n return await this.makeRequest<FeatureFlagsResponse>(\n `/api/sdk/flags/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch flags:\", error);\n return null;\n }\n }\n\n /**\n * Fetch all A/B tests from API\n */\n private async fetchAllABTests(): Promise<ABTestsResponse | null> {\n try {\n return await this.makeRequest<ABTestsResponse>(\n `/api/sdk/ab-tests/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch A/B tests:\", error);\n return null;\n }\n }\n\n /**\n * Clear A/B test cache\n */\n private clearABTestCache(): void {\n const abTestKeys = Array.from(this.cache.keys()).filter((key) =>\n key.startsWith(\"abtest:\")\n );\n abTestKeys.forEach((key) => this.cache.delete(key));\n }\n\n /**\n * Get all feature flags for a project\n */\n async getFlags(\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagsResponse> {\n const cacheKey = `flags:${projectId}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/flags/${projectId}`, this.config.baseUrl);\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagsResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get a specific feature flag value\n */\n async getFlag(\n flagName: string,\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagResponse> {\n // If we have the flag in state, return it immediately\n if (this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n\n // Check if we're currently loading data (pullData in progress)\n // In this case, wait a bit and check state again\n if (this.state.isLoading) {\n // Wait up to 5 seconds for loading to complete\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (!this.state.isLoading && this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n }\n }\n\n const cacheKey = `flag:${projectId}:${flagName}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/flags/${projectId}/${flagName}`,\n this.config.baseUrl\n );\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get A/B test variant for a user\n */\n async getAbTestVariant(\n testName: string,\n userId: string,\n projectId: string = this.config.projectId\n ): Promise<ABTestResponse> {\n // If we have the A/B test in state, return it immediately\n const stateVariant = this.state.abTests[testName];\n if (stateVariant && stateVariant.testName === testName) {\n return stateVariant;\n }\n\n const cacheKey = `abtest:${projectId}:${testName}:${userId}`;\n const cached = this.getFromCache<ABTestResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}`,\n this.config.baseUrl\n );\n\n const response = await this.makeRequest<ABTestResponse>(url, {\n headers: {\n \"X-User-ID\": userId,\n },\n });\n\n // Cache A/B test variants for longer since they shouldn't change frequently for a user\n this.setCache(cacheKey, response, this.config.cacheTimeout! * 10);\n\n return response;\n }\n\n /**\n * Record an A/B test event\n */\n async recordAbTestEvent(\n testName: string,\n userId: string,\n event: string,\n variantId: string,\n eventData?: Record<string, any>,\n projectId: string = this.config.projectId\n ): Promise<ABTestEventResponse> {\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}/event`,\n this.config.baseUrl\n );\n\n return this.makeRequest<ABTestEventResponse>(url, {\n method: \"POST\",\n headers: {\n \"X-User-ID\": userId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n event,\n variantId,\n eventData,\n }),\n });\n }\n\n /**\n * Get all A/B tests for a project\n */\n async getAbTests(\n projectId: string = this.config.projectId\n ): Promise<ABTestsResponse> {\n const cacheKey = `abtests:${projectId}`;\n const cached = this.getFromCache<ABTestsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/ab-tests/${projectId}`, this.config.baseUrl);\n\n const response = await this.makeRequest<ABTestsResponse>(url);\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Clear cache for specific key or all cache\n */\n clearCache(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<FlipFlagConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n private async makeRequest<T>(\n url: string | URL,\n options: RequestInit = {}\n ): Promise<T> {\n // Convert URL object to string if needed\n const urlString = url instanceof URL ? url.toString() : url;\n\n // If URL starts with '/', prepend baseUrl and handle trailing slashes\n const fullUrl = urlString.startsWith(\"/\")\n ? `${this.config.baseUrl?.replace(/\\/$/, \"\") || this.defaultBaseUrl}${urlString}`\n : urlString;\n\n const headers = {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const requestOptions: RequestInit = {\n ...options,\n headers,\n };\n\n return this.makeRequestWithRetry<T>(fullUrl, requestOptions);\n }\n\n private async makeRequestWithRetry<T>(\n url: string,\n options: RequestInit,\n retryOptions: RetryOptions = {\n attempts: this.config.retryAttempts!,\n delay: this.config.retryDelay!,\n backoff: 2,\n }\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= retryOptions.attempts; attempt++) {\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n console.log(\"retry sdk\");\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n `HTTP ${response.status}: ${errorData.error || response.statusText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx) except 429 (rate limit)\n if (error instanceof Error && error.message.includes(\"HTTP 4\")) {\n if (!error.message.includes(\"HTTP 429\")) {\n throw error;\n }\n }\n\n if (attempt < retryOptions.attempts) {\n const delay =\n retryOptions.delay * Math.pow(retryOptions.backoff, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n\n private getFromCache<T>(key: string): T | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T, ttl: number): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl,\n });\n }\n\n /**\n * Cleanup method - should be called when SDK is no longer needed\n */\n public destroy(): void {\n this.stopPulling();\n this.stateListeners.clear();\n this.cache.clear();\n }\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\ninterface FlipflagContextValue {\n sdk: FlipFlagSDK;\n config: FlipFlagConfig;\n serverFlags?: Record<string, FeatureFlagValue>;\n isServerRendered: boolean;\n}\n\nconst FlipflagContext = createContext<FlipflagContextValue | null>(null);\n\ninterface FlipflagProviderProps {\n children: ReactNode;\n config: FlipFlagConfig;\n serverFlags?: ServerSideFlags;\n}\n\nexport function FlipflagProvider({\n children,\n config,\n serverFlags,\n}: FlipflagProviderProps) {\n const [isServerRendered, setIsServerRendered] = useState(true);\n const sdk = useMemo(() => new FlipFlagSDK(config), [config]);\n\n // Mark as client-rendered after hydration\n useEffect(() => {\n setIsServerRendered(false);\n }, []);\n\n const contextValue: FlipflagContextValue = useMemo(\n () => ({\n sdk,\n config,\n serverFlags: serverFlags?.flags,\n isServerRendered,\n }),\n [sdk, config, serverFlags?.flags, isServerRendered]\n );\n\n return (\n <FlipflagContext.Provider value={contextValue}>\n {children}\n </FlipflagContext.Provider>\n );\n}\n\nexport function useFlipflagContext(): FlipflagContextValue {\n const context = useContext(FlipflagContext);\n\n if (!context) {\n throw new Error(\n \"useFlipflagContext must be used within a FlipflagProvider\"\n );\n }\n\n return context;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagOptions {\n fallbackValue?: FeatureFlagValue;\n enabled?: boolean;\n}\n\nexport function useFeatureFlag(\n flagName: string,\n options: UseFeatureFlagOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagHookResult {\n const context = useFlipflagContext();\n const [value, setValue] = useState<FeatureFlagValue>(() => {\n // Use server-side value if available\n if (context.serverFlags && context.isServerRendered) {\n return context.serverFlags[flagName] ?? options.fallbackValue ?? false;\n }\n return options.fallbackValue ?? false;\n });\n const [loading, setLoading] = useState(!context.isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchFlag = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (context.isServerRendered && context.serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlag(flagName);\n setValue(response.value);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n if (options.fallbackValue !== undefined) {\n setValue(options.fallbackValue);\n }\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagName,\n options.fallbackValue,\n options.enabled,\n context.isServerRendered,\n context.serverFlags,\n ]);\n\n const refetch = useCallback(async () => {\n sdk.clearCache(\n `flag:${sdk[\"config\"].projectId}:${flagName}:${sdk[\"config\"].environment || \"all\"}`\n );\n await fetchFlag();\n }, [sdk, flagName, fetchFlag]);\n\n useEffect(() => {\n fetchFlag();\n }, [fetchFlag]);\n\n return {\n value,\n loading,\n error,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagsHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagsOptions {\n fallbackValues?: Record<string, FeatureFlagValue>;\n enabled?: boolean;\n}\n\nexport function useFeatureFlags(\n flagNames: string[],\n options: UseFeatureFlagsOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagsHookResult {\n const context = useFlipflagContext();\n const [flags, setFlags] = useState<Record<string, FeatureFlagValue>>(() => {\n // Initialize with server-side values or fallback\n const initialFlags: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n initialFlags[flagName] =\n context.serverFlags?.[flagName] ??\n options.fallbackValues?.[flagName] ??\n false;\n });\n return initialFlags;\n });\n const [loading, setLoading] = useState(!context.isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchFlags = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (context.isServerRendered && context.serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlags();\n\n const newFlags: Record<string, FeatureFlagValue> = {};\n\n flagNames.forEach((flagName) => {\n // Use API value if available, otherwise fallback\n newFlags[flagName] =\n response.flags[flagName] ??\n options.fallbackValues?.[flagName] ??\n false;\n });\n\n setFlags(newFlags);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n // Use fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n fallbackFlags[flagName] = options.fallbackValues?.[flagName] ?? false;\n });\n setFlags(fallbackFlags);\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagNames,\n options.fallbackValues,\n options.enabled,\n context.isServerRendered,\n context.serverFlags,\n ]);\n\n useEffect(() => {\n fetchFlags();\n }, [fetchFlags]);\n\n return {\n flags,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { ABTestValue, FlipFlagConfig } from \"../types\";\nimport { ABTestHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseABTestOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useABTest(\n testName: string,\n options: UseABTestOptions & { config?: FlipFlagConfig }\n): ABTestHookResult {\n const context = useFlipflagContext();\n const [variant, setVariant] = useState<ABTestValue | null>(null);\n const [variantId, setVariantId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchVariant = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getAbTestVariant(testName, options.userId);\n\n setVariant(response.variant.value);\n setVariantId(response.variantId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setVariant(null);\n setVariantId(null);\n } finally {\n setLoading(false);\n }\n }, [sdk, testName, options.userId, options.enabled]);\n\n const recordEvent = useCallback(\n async (event: string, eventData?: Record<string, any>) => {\n if (!variantId) {\n console.warn(\"Cannot record event: no variant assigned yet\");\n return;\n }\n\n try {\n await sdk.recordAbTestEvent(\n testName,\n options.userId,\n event,\n variantId,\n eventData\n );\n } catch (err) {\n console.error(\"Failed to record A/B test event:\", err);\n }\n },\n [sdk, testName, options.userId, variantId]\n );\n\n useEffect(() => {\n fetchVariant();\n }, [fetchVariant]);\n\n return {\n variant,\n variantId,\n loading,\n error,\n recordEvent,\n };\n}\n","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\n/**\n * Fetch feature flags on the server side for SSR\n */\nexport async function getServerSideFlags(\n configOrFlagNames?: FlipFlagConfig | string[],\n flagNames?: string[]\n): Promise<ServerSideFlags> {\n let config: FlipFlagConfig;\n let flagList: string[] | undefined;\n\n // Handle different calling patterns\n if (Array.isArray(configOrFlagNames)) {\n // Called with flagNames only - this should not happen in normal usage\n // We'll need to get config from somewhere else, but for now throw error\n throw new Error(\n \"getServerSideFlags must be called with config when used outside of FlipflagProvider context\"\n );\n } else if (configOrFlagNames) {\n config = configOrFlagNames;\n flagList = flagNames;\n } else {\n throw new Error(\"getServerSideFlags requires config parameter\");\n }\n\n const sdk = new FlipFlagSDK({\n ...config,\n // Disable caching for server-side requests to ensure fresh data\n cacheTimeout: 0,\n // Disable auto-pulling for SSR\n pullInterval: 0,\n });\n\n try {\n const response = await sdk.getFlags();\n\n let flags: Record<string, FeatureFlagValue> = response.flags;\n\n // If specific flag names are requested, filter the response\n if (flagList && flagList.length > 0) {\n flags = {};\n flagList.forEach((flagName) => {\n flags[flagName] = response.flags[flagName] ?? false;\n });\n }\n\n return {\n flags,\n timestamp: Date.now(),\n };\n } catch (error) {\n console.error(\"Failed to fetch server-side flags:\", error);\n\n // Return fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n if (flagList) {\n flagList.forEach((flagName) => {\n fallbackFlags[flagName] = false;\n });\n }\n\n return {\n flags: fallbackFlags,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Get static props with feature flags for SSG\n */\nexport async function getStaticPropsWithFlags(\n config: FlipFlagConfig,\n flagNames?: string[]\n) {\n const serverFlags = await getServerSideFlags(config, flagNames);\n\n return {\n props: {\n serverFlags,\n },\n revalidate: 300, // Revalidate every 5 minutes\n };\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n * Must be called within FlipflagProvider\n */\nexport function identifyUser(options: IdentifyUserOptions): void {\n const context = useFlipflagContext();\n context.sdk.identifyUser(options);\n}\n"],"names":["createContext","useState","useMemo","useEffect","_jsx","useContext","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"next.js","sources":["../src/core/FlipFlagSDK.ts","../src/next/FlipflagProvider.tsx","../src/next/useFeatureFlag.ts","../src/next/useFeatureFlags.ts","../src/next/useABTest.ts","../src/next/server-utils.ts","../src/next/identifyUser.ts"],"sourcesContent":["import {\n FlipFlagConfig,\n FeatureFlagResponse,\n FeatureFlagsResponse,\n ABTestResponse,\n ABTestEventResponse,\n ABTestsResponse,\n FlipFlagError,\n CacheEntry,\n RetryOptions,\n SDKState,\n IdentifyUserOptions,\n} from \"../types\";\n\nexport class FlipFlagSDK {\n private config: FlipFlagConfig;\n private cache = new Map<string, CacheEntry<any>>();\n private defaultBaseUrl = \"https://app.flipflag.ru\";\n private pullIntervalId?: NodeJS.Timeout;\n private state: SDKState;\n private stateListeners: Set<(state: SDKState) => void> = new Set();\n\n constructor(config: FlipFlagConfig) {\n this.config = {\n baseUrl: this.defaultBaseUrl,\n cacheTimeout: 30000, // 30 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n pullInterval: 60000, // 1 minute\n ...config,\n };\n\n this.state = {\n flags: {},\n abTests: {},\n lastFetch: null,\n isLoading: false,\n error: null,\n };\n\n // Start automatic pulling if pullInterval is set\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.startPulling();\n }\n }\n\n /**\n * Identify user for A/B testing and user-specific flags\n */\n identifyUser(options: IdentifyUserOptions): void {\n this.config.userId = options.userId;\n\n // Clear A/B test cache since user changed\n this.clearABTestCache();\n\n // If we have a user, we might want to refresh immediately\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.pullData();\n }\n }\n\n /**\n * Get current SDK state\n */\n getState(): SDKState {\n return { ...this.state };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(callback: (state: SDKState) => void): () => void {\n this.stateListeners.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.stateListeners.delete(callback);\n };\n }\n\n /**\n * Get a feature flag value from current state\n */\n getFlagValue(flagName: string): boolean {\n return this.state.flags[flagName] ?? false;\n }\n\n /**\n * Get A/B test variant from current state\n */\n getABTestVariant(testName: string): ABTestResponse | null {\n return this.state.abTests[testName] || null;\n }\n\n /**\n * Start automatic data pulling\n */\n private startPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n }\n\n this.pullIntervalId = setInterval(() => {\n this.pullData();\n }, this.config.pullInterval!);\n\n // Initial pull\n this.pullData();\n }\n\n /**\n * Stop automatic data pulling\n */\n stopPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n this.pullIntervalId = undefined;\n }\n }\n\n /**\n * Pull fresh data from API\n */\n private async pullData(): Promise<void> {\n try {\n this.updateState({ isLoading: true, error: null });\n\n // Pull flags\n const flagsResponse = await this.fetchAllFlags();\n\n // Pull A/B tests if user is identified\n let abTestsResponse: ABTestsResponse | null = null;\n if (this.config.userId) {\n try {\n abTestsResponse = await this.fetchAllABTests();\n } catch (error) {\n console.warn(\"Failed to fetch A/B tests:\", error);\n }\n }\n\n const newState: Partial<SDKState> = {\n flags: flagsResponse?.flags || {},\n lastFetch: new Date(),\n isLoading: false,\n error: null,\n };\n\n if (abTestsResponse) {\n const abTestsMap: Record<string, ABTestResponse> = {};\n abTestsResponse.abTests.forEach((test) => {\n // For each test, get the variant for current user\n if (this.config.userId) {\n // This would normally fetch the variant, but for demo we'll simulate\n abTestsMap[test.name] = {\n testName: test.name,\n testId: test.id,\n variantId: \"variant_a\", // Default variant\n variant: test.variants[0] || {\n id: \"default\",\n name: \"Default\",\n value: null,\n weight: 100,\n },\n timestamp: new Date().toISOString(),\n };\n }\n });\n newState.abTests = abTestsMap;\n }\n\n this.updateState(newState);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n this.updateState({\n isLoading: false,\n error: errorMessage,\n });\n console.error(\"Failed to pull data:\", error);\n }\n }\n\n /**\n * Update state and notify listeners\n */\n private updateState(newState: Partial<SDKState>): void {\n this.state = { ...this.state, ...newState };\n\n // Notify all listeners\n this.stateListeners.forEach((callback) => {\n try {\n callback(this.state);\n } catch (error) {\n console.error(\"State listener error:\", error);\n }\n });\n }\n\n /**\n * Fetch all flags from API\n */\n private async fetchAllFlags(): Promise<FeatureFlagsResponse | null> {\n try {\n return await this.makeRequest<FeatureFlagsResponse>(\n `/api/sdk/flags/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch flags:\", error);\n return null;\n }\n }\n\n /**\n * Fetch all A/B tests from API\n */\n private async fetchAllABTests(): Promise<ABTestsResponse | null> {\n try {\n return await this.makeRequest<ABTestsResponse>(\n `/api/sdk/ab-tests/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch A/B tests:\", error);\n return null;\n }\n }\n\n /**\n * Clear A/B test cache\n */\n private clearABTestCache(): void {\n const abTestKeys = Array.from(this.cache.keys()).filter((key) =>\n key.startsWith(\"abtest:\")\n );\n abTestKeys.forEach((key) => this.cache.delete(key));\n }\n\n /**\n * Get all feature flags for a project\n */\n async getFlags(\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagsResponse> {\n const cacheKey = `flags:${projectId}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/flags/${projectId}`, this.config.baseUrl);\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagsResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get a specific feature flag value\n */\n async getFlag(\n flagName: string,\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagResponse> {\n // If we have the flag in state, return it immediately\n if (this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n\n // Check if we're currently loading data (pullData in progress)\n // In this case, wait a bit and check state again\n if (this.state.isLoading) {\n // Wait up to 5 seconds for loading to complete\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (!this.state.isLoading && this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n }\n }\n\n const cacheKey = `flag:${projectId}:${flagName}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/flags/${projectId}/${flagName}`,\n this.config.baseUrl\n );\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get A/B test variant for a user\n */\n async getAbTestVariant(\n testName: string,\n userId: string,\n projectId: string = this.config.projectId\n ): Promise<ABTestResponse> {\n // If we have the A/B test in state, return it immediately\n const stateVariant = this.state.abTests[testName];\n if (stateVariant && stateVariant.testName === testName) {\n return stateVariant;\n }\n\n const cacheKey = `abtest:${projectId}:${testName}:${userId}`;\n const cached = this.getFromCache<ABTestResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}`,\n this.config.baseUrl\n );\n\n const response = await this.makeRequest<ABTestResponse>(url, {\n headers: {\n \"X-User-ID\": userId,\n },\n });\n\n // Cache A/B test variants for longer since they shouldn't change frequently for a user\n this.setCache(cacheKey, response, this.config.cacheTimeout! * 10);\n\n return response;\n }\n\n /**\n * Record an A/B test event\n */\n async recordAbTestEvent(\n testName: string,\n userId: string,\n event: string,\n variantId: string,\n eventData?: Record<string, any>,\n projectId: string = this.config.projectId\n ): Promise<ABTestEventResponse> {\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}/event`,\n this.config.baseUrl\n );\n\n return this.makeRequest<ABTestEventResponse>(url, {\n method: \"POST\",\n headers: {\n \"X-User-ID\": userId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n event,\n variantId,\n eventData,\n }),\n });\n }\n\n /**\n * Get all A/B tests for a project\n */\n async getAbTests(\n projectId: string = this.config.projectId\n ): Promise<ABTestsResponse> {\n const cacheKey = `abtests:${projectId}`;\n const cached = this.getFromCache<ABTestsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/ab-tests/${projectId}`, this.config.baseUrl);\n\n const response = await this.makeRequest<ABTestsResponse>(url);\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Clear cache for specific key or all cache\n */\n clearCache(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<FlipFlagConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n private async makeRequest<T>(\n url: string | URL,\n options: RequestInit = {}\n ): Promise<T> {\n // Convert URL object to string if needed\n const urlString = url instanceof URL ? url.toString() : url;\n\n // If URL starts with '/', prepend baseUrl and handle trailing slashes\n const fullUrl = urlString.startsWith(\"/\")\n ? `${this.config.baseUrl?.replace(/\\/$/, \"\") || this.defaultBaseUrl}${urlString}`\n : urlString;\n\n const headers = {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const requestOptions: RequestInit = {\n ...options,\n headers,\n };\n\n return this.makeRequestWithRetry<T>(fullUrl, requestOptions);\n }\n\n private async makeRequestWithRetry<T>(\n url: string,\n options: RequestInit,\n retryOptions: RetryOptions = {\n attempts: this.config.retryAttempts!,\n delay: this.config.retryDelay!,\n backoff: 2,\n }\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= retryOptions.attempts; attempt++) {\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n console.log(\"retry sdk\");\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n `HTTP ${response.status}: ${errorData.error || response.statusText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx) except 429 (rate limit)\n if (error instanceof Error && error.message.includes(\"HTTP 4\")) {\n if (!error.message.includes(\"HTTP 429\")) {\n throw error;\n }\n }\n\n if (attempt < retryOptions.attempts) {\n const delay =\n retryOptions.delay * Math.pow(retryOptions.backoff, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n\n private getFromCache<T>(key: string): T | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T, ttl: number): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl,\n });\n }\n\n /**\n * Cleanup method - should be called when SDK is no longer needed\n */\n public destroy(): void {\n this.stopPulling();\n this.stateListeners.clear();\n this.cache.clear();\n }\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\ninterface FlipflagContextValue {\n sdk: FlipFlagSDK;\n config: FlipFlagConfig;\n serverFlags?: Record<string, FeatureFlagValue>;\n isServerRendered: boolean;\n}\n\nconst FlipflagContext = createContext<FlipflagContextValue | null>(null);\n\ninterface FlipflagProviderProps {\n children: ReactNode;\n config: FlipFlagConfig;\n serverFlags?: ServerSideFlags;\n}\n\nexport function FlipflagProvider({\n children,\n config,\n serverFlags,\n}: FlipflagProviderProps) {\n const [isServerRendered, setIsServerRendered] = useState(true);\n const sdk = useMemo(() => new FlipFlagSDK(config), [config]);\n\n // Mark as client-rendered after hydration\n useEffect(() => {\n setIsServerRendered(false);\n }, []);\n\n const contextValue: FlipflagContextValue = useMemo(\n () => ({\n sdk,\n config,\n serverFlags: serverFlags?.flags,\n isServerRendered,\n }),\n [sdk, config, serverFlags?.flags, isServerRendered]\n );\n\n return (\n <FlipflagContext.Provider value={contextValue}>\n {children}\n </FlipflagContext.Provider>\n );\n}\n\nexport function useFlipflagContext(): FlipflagContextValue {\n const context = useContext(FlipflagContext);\n\n if (!context) {\n throw new Error(\n \"useFlipflagContext must be used within a FlipflagProvider\"\n );\n }\n\n return context;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagOptions {\n fallbackValue?: FeatureFlagValue;\n enabled?: boolean;\n}\n\nexport function useFeatureFlag(\n flagName: string,\n options: UseFeatureFlagOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagHookResult {\n const context = useFlipflagContext();\n\n // Extract specific properties to avoid dependency on entire context object\n const { sdk, serverFlags, isServerRendered } = context;\n\n const [value, setValue] = useState<FeatureFlagValue>(() => {\n // Use server-side value if available\n if (serverFlags && isServerRendered) {\n return serverFlags[flagName] ?? options.fallbackValue ?? false;\n }\n return options.fallbackValue ?? false;\n });\n const [loading, setLoading] = useState(!isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const fetchFlag = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (isServerRendered && serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlag(flagName);\n setValue(response.value);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n if (options.fallbackValue !== undefined) {\n setValue(options.fallbackValue);\n }\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagName,\n options.fallbackValue,\n options.enabled,\n isServerRendered,\n serverFlags,\n ]);\n\n const refetch = useCallback(async () => {\n sdk.clearCache(\n `flag:${sdk[\"config\"].projectId}:${flagName}:${sdk[\"config\"].environment || \"all\"}`\n );\n await fetchFlag();\n }, [sdk, flagName, fetchFlag]);\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newValue = state.flags[flagName];\n if (newValue !== undefined && newValue !== value) {\n setValue(newValue);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, flagName, value]);\n\n useEffect(() => {\n fetchFlag();\n }, [fetchFlag]);\n\n return {\n value,\n loading,\n error,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagsHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagsOptions {\n fallbackValues?: Record<string, FeatureFlagValue>;\n enabled?: boolean;\n}\n\nexport function useFeatureFlags(\n flagNames: string[],\n options: UseFeatureFlagsOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagsHookResult {\n const context = useFlipflagContext();\n\n // Extract specific properties to avoid dependency on entire context object\n const { sdk, serverFlags, isServerRendered } = context;\n\n // Memoize flagNames array to prevent unnecessary re-renders\n const memoizedFlagNames = useMemo(() => flagNames, [flagNames.join(\",\")]);\n\n // Memoize fallbackValues object\n const memoizedFallbackValues = useMemo(\n () => options.fallbackValues,\n [JSON.stringify(options.fallbackValues)]\n );\n\n const [flags, setFlags] = useState<Record<string, FeatureFlagValue>>(() => {\n // Initialize with server-side values or fallback\n const initialFlags: Record<string, FeatureFlagValue> = {};\n memoizedFlagNames.forEach((flagName) => {\n initialFlags[flagName] =\n serverFlags?.[flagName] ?? memoizedFallbackValues?.[flagName] ?? false;\n });\n return initialFlags;\n });\n const [loading, setLoading] = useState(!isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const fetchFlags = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (isServerRendered && serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlags();\n\n const newFlags: Record<string, FeatureFlagValue> = {};\n\n memoizedFlagNames.forEach((flagName) => {\n // Use API value if available, otherwise fallback\n newFlags[flagName] =\n response.flags[flagName] ??\n memoizedFallbackValues?.[flagName] ??\n false;\n });\n\n setFlags(newFlags);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n // Use fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n memoizedFlagNames.forEach((flagName) => {\n fallbackFlags[flagName] = memoizedFallbackValues?.[flagName] ?? false;\n });\n setFlags(fallbackFlags);\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n memoizedFlagNames,\n memoizedFallbackValues,\n options.enabled,\n isServerRendered,\n serverFlags,\n ]);\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newFlags: Record<string, FeatureFlagValue> = {};\n let hasChanges = false;\n\n memoizedFlagNames.forEach((flagName) => {\n const newValue = state.flags[flagName];\n if (newValue !== undefined) {\n newFlags[flagName] = newValue;\n if (newValue !== flags[flagName]) {\n hasChanges = true;\n }\n } else {\n newFlags[flagName] = memoizedFallbackValues?.[flagName] ?? false;\n }\n });\n\n if (hasChanges) {\n setFlags(newFlags);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, memoizedFlagNames, memoizedFallbackValues, flags]);\n\n useEffect(() => {\n fetchFlags();\n }, [fetchFlags]);\n\n return {\n flags,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { ABTestValue, FlipFlagConfig } from \"../types\";\nimport { ABTestHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseABTestOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useABTest(\n testName: string,\n options: UseABTestOptions & { config?: FlipFlagConfig }\n): ABTestHookResult {\n const context = useFlipflagContext();\n const [variant, setVariant] = useState<ABTestValue | null>(null);\n const [variantId, setVariantId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchVariant = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getAbTestVariant(testName, options.userId);\n\n setVariant(response.variant.value);\n setVariantId(response.variantId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setVariant(null);\n setVariantId(null);\n } finally {\n setLoading(false);\n }\n }, [sdk, testName, options.userId, options.enabled]);\n\n const recordEvent = useCallback(\n async (event: string, eventData?: Record<string, any>) => {\n if (!variantId) {\n console.warn(\"Cannot record event: no variant assigned yet\");\n return;\n }\n\n try {\n await sdk.recordAbTestEvent(\n testName,\n options.userId,\n event,\n variantId,\n eventData\n );\n } catch (err) {\n console.error(\"Failed to record A/B test event:\", err);\n }\n },\n [sdk, testName, options.userId, variantId]\n );\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newABTest = state.abTests[testName];\n if (newABTest && newABTest.variantId !== variantId) {\n setVariant(newABTest.variant.value);\n setVariantId(newABTest.variantId);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, testName, variantId]);\n\n useEffect(() => {\n fetchVariant();\n }, [fetchVariant]);\n\n return {\n variant,\n variantId,\n loading,\n error,\n recordEvent,\n };\n}\n","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\n/**\n * Fetch feature flags on the server side for SSR\n */\nexport async function getServerSideFlags(\n configOrFlagNames?: FlipFlagConfig | string[],\n flagNames?: string[]\n): Promise<ServerSideFlags> {\n let config: FlipFlagConfig;\n let flagList: string[] | undefined;\n\n // Handle different calling patterns\n if (Array.isArray(configOrFlagNames)) {\n // Called with flagNames only - this should not happen in normal usage\n // We'll need to get config from somewhere else, but for now throw error\n throw new Error(\n \"getServerSideFlags must be called with config when used outside of FlipflagProvider context\"\n );\n } else if (configOrFlagNames) {\n config = configOrFlagNames;\n flagList = flagNames;\n } else {\n throw new Error(\"getServerSideFlags requires config parameter\");\n }\n\n const sdk = new FlipFlagSDK({\n ...config,\n // Disable caching for server-side requests to ensure fresh data\n cacheTimeout: 0,\n // Disable auto-pulling for SSR\n pullInterval: 0,\n });\n\n try {\n const response = await sdk.getFlags();\n\n let flags: Record<string, FeatureFlagValue> = response.flags;\n\n // If specific flag names are requested, filter the response\n if (flagList && flagList.length > 0) {\n flags = {};\n flagList.forEach((flagName) => {\n flags[flagName] = response.flags[flagName] ?? false;\n });\n }\n\n return {\n flags,\n timestamp: Date.now(),\n };\n } catch (error) {\n console.error(\"Failed to fetch server-side flags:\", error);\n\n // Return fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n if (flagList) {\n flagList.forEach((flagName) => {\n fallbackFlags[flagName] = false;\n });\n }\n\n return {\n flags: fallbackFlags,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Get static props with feature flags for SSG\n */\nexport async function getStaticPropsWithFlags(\n config: FlipFlagConfig,\n flagNames?: string[]\n) {\n const serverFlags = await getServerSideFlags(config, flagNames);\n\n return {\n props: {\n serverFlags,\n },\n revalidate: 300, // Revalidate every 5 minutes\n };\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n * Must be called within FlipflagProvider\n */\nexport function identifyUser(options: IdentifyUserOptions): void {\n const context = useFlipflagContext();\n context.sdk.identifyUser(options);\n}\n"],"names":["createContext","useState","useMemo","useEffect","_jsx","useContext","useCallback"],"mappings":";;;;;MAca,WAAW,CAAA;AAQtB,IAAA,WAAA,CAAY,MAAsB,EAAA;AAN1B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAA2B;QAC1C,IAAA,CAAA,cAAc,GAAG,yBAAyB;AAG1C,QAAA,IAAA,CAAA,cAAc,GAAmC,IAAI,GAAG,EAAE;QAGhE,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,YAAY,EAAE,KAAK;AACnB,YAAA,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;AACnB,YAAA,GAAG,MAAM;SACV;QAED,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,KAAK,EAAE,IAAI;SACZ;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,OAA4B,EAAA;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;;QAGnC,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;IAC1B;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,QAAmC,EAAA;AAC3C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAGjC,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AACtC,QAAA,CAAC;IACH;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,QAAgB,EAAA;;QAC3B,OAAO,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;IAC5C;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI;IAC7C;AAEA;;AAEG;IACK,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;YACrC,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;;QAG7B,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;AAGlD,YAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;;YAGhD,IAAI,eAAe,GAA2B,IAAI;AAClD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACtB,gBAAA,IAAI;AACF,oBAAA,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;gBAChD;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC;gBACnD;YACF;AAEA,YAAA,MAAM,QAAQ,GAAsB;gBAClC,KAAK,EAAE,CAAA,aAAa,KAAA,IAAA,IAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,KAAI,EAAE;gBACjC,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,KAAK,EAAE,IAAI;aACZ;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,UAAU,GAAmC,EAAE;gBACrD,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;AAEvC,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAEtB,wBAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;4BACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;4BACnB,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,SAAS,EAAE,WAAW;AACtB,4BAAA,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;AAC3B,gCAAA,EAAE,EAAE,SAAS;AACb,gCAAA,IAAI,EAAE,SAAS;AACf,gCAAA,KAAK,EAAE,IAAI;AACX,gCAAA,MAAM,EAAE,GAAG;AACZ,6BAAA;AACD,4BAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACpC;oBACH;AACF,gBAAA,CAAC,CAAC;AACF,gBAAA,QAAQ,CAAC,OAAO,GAAG,UAAU;YAC/B;AAEA,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;YAC1D,IAAI,CAAC,WAAW,CAAC;AACf,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,KAAK,EAAE,YAAY;AACpB,aAAA,CAAC;AACF,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;QAC9C;IACF;AAEA;;AAEG;AACK,IAAA,WAAW,CAAC,QAA2B,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE;;QAG3C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACvC,YAAA,IAAI;AACF,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACtB;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;YAC/C;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACK,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,CAAA,eAAA,EAAkB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,CAC1C;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,eAAe,GAAA;AAC3B,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,CAAA,kBAAA,EAAqB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,CAC7C;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAClD,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAC1D,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAC1B;AACD,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrD;AAEA;;AAEG;IACH,MAAM,QAAQ,CACZ,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EACzC,WAAoB,EAAA;QAEpB,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,SAAS,IAAI,WAAW,IAAI,KAAK,CAAA,CAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAuB,QAAQ,CAAC;QAEhE,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvE,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC1C,YAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,aAAa,EACb,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAY,CACxC;QACH;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,GAAG,CAAC,QAAQ,EAAE,CACf;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,OAAO,CACX,QAAgB,EAChB,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EACzC,WAAoB,EAAA;;;QAGpB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;YAC5C,OAAO;AACL,gBAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,QAAQ;AACR,gBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK;gBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,gBAAA,SAAS,EACP,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClE;QACH;;;AAIA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;;AAExB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACxD,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;oBACrE,OAAO;AACL,wBAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;wBAChC,QAAQ;AACR,wBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK;wBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,wBAAA,SAAS,EACP,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBAClE;gBACH;YACF;QACF;QAEA,MAAM,QAAQ,GAAG,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,IAAI,KAAK,CAAA,CAAE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAsB,QAAQ,CAAC;QAE/D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,kBAAkB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,EACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;QACD,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC1C,YAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,aAAa,EACb,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAY,CACxC;QACH;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,GAAG,CAAC,QAAQ,EAAE,CACf;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,gBAAgB,CACpB,QAAgB,EAChB,MAAc,EACd,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;;QAGzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACtD,YAAA,OAAO,YAAY;QACrB;QAEA,MAAM,QAAQ,GAAG,CAAA,OAAA,EAAU,SAAS,IAAI,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAiB,QAAQ,CAAC;QAE1D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,oBAAoB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,EAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAiB,GAAG,EAAE;AAC3D,YAAA,OAAO,EAAE;AACP,gBAAA,WAAW,EAAE,MAAM;AACpB,aAAA;AACF,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,GAAG,EAAE,CAAC;AAEjE,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,iBAAiB,CACrB,QAAgB,EAChB,MAAc,EACd,KAAa,EACb,SAAiB,EACjB,SAA+B,EAC/B,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;AAEzC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,oBAAoB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,MAAA,CAAQ,EACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;AAED,QAAA,OAAO,IAAI,CAAC,WAAW,CAAsB,GAAG,EAAE;AAChD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,WAAW,EAAE,MAAM;AACnB,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,SAAS;gBACT,SAAS;aACV,CAAC;AACH,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,MAAM,UAAU,CACd,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;AAEzC,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,SAAS,EAAE;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAkB,QAAQ,CAAC;QAE3D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAkB,GAAG,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAY,EAAA;QACrB,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QACxB;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QACpB;IACF;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,SAAkC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE;IAChD;AAEQ,IAAA,MAAM,WAAW,CACvB,GAAiB,EACjB,UAAuB,EAAE,EAAA;;;AAGzB,QAAA,MAAM,SAAS,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG;;AAG3D,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG;cACpC,GAAG,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAI,IAAI,CAAC,cAAc,CAAA,EAAG,SAAS,CAAA;cAC7E,SAAS;AAEb,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;AAC/B,YAAA,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;AAED,QAAA,MAAM,cAAc,GAAgB;AAClC,YAAA,GAAG,OAAO;YACV,OAAO;SACR;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAI,OAAO,EAAE,cAAc,CAAC;IAC9D;AAEQ,IAAA,MAAM,oBAAoB,CAChC,GAAW,EACX,OAAoB,EACpB,YAAA,GAA6B;AAC3B,QAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAc;AACpC,QAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;AAC9B,QAAA,OAAO,EAAE,CAAC;AACX,KAAA,EAAA;AAED,QAAA,IAAI,SAAgB;AAEpB,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;AACjE,YAAA,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,oBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACxB,oBAAA,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACzD,oBAAA,MAAM,IAAI,KAAK,CACb,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,EAAA,EAAK,SAAS,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAA,CAAE,CACrE;gBACH;AAEA,gBAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;YAC9B;YAAE,OAAO,KAAK,EAAE;gBACd,SAAS,GAAG,KAAc;;AAG1B,gBAAA,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACvC,wBAAA,MAAM,KAAK;oBACb;gBACF;AAEA,gBAAA,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE;AACnC,oBAAA,MAAM,KAAK,GACT,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC;AAClE,oBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5D;YACF;QACF;AAEA,QAAA,MAAM,SAAU;IAClB;AAEQ,IAAA,YAAY,CAAI,GAAW,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE;AAC5C,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACtB,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,KAAK,CAAC,IAAI;IACnB;AAEQ,IAAA,QAAQ,CAAI,GAAW,EAAE,IAAO,EAAE,GAAW,EAAA;AACnD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG;AACJ,SAAA,CAAC;IACJ;AAEA;;AAEG;IACI,OAAO,GAAA;QACZ,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;ACtgBD,MAAM,eAAe,GAAGA,mBAAa,CAA8B,IAAI,CAAC;AAQlE,SAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,WAAW,GACW,EAAA;IACtB,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAGC,cAAQ,CAAC,IAAI,CAAC;AAC9D,IAAA,MAAM,GAAG,GAAGC,aAAO,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;;IAG5DC,eAAS,CAAC,MAAK;QACb,mBAAmB,CAAC,KAAK,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,YAAY,GAAyBD,aAAO,CAChD,OAAO;QACL,GAAG;QACH,MAAM;AACN,QAAA,WAAW,EAAE,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,KAAK;QAC/B,gBAAgB;AACjB,KAAA,CAAC,EACF,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,KAAK,EAAE,gBAAgB,CAAC,CACpD;AAED,IAAA,QACEE,cAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EAC1C,QAAQ,EAAA,CACgB;AAE/B;SAEgB,kBAAkB,GAAA;AAChC,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,eAAe,CAAC;IAE3C,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D;IACH;AAEA,IAAA,OAAO,OAAO;AAChB;;SC1DgB,cAAc,CAC5B,QAAgB,EAChB,UAA+D,EAAE,EAAA;AAEjE,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;;IAGpC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO;IAEtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGJ,cAAQ,CAAmB,MAAK;;;AAExD,QAAA,IAAI,WAAW,IAAI,gBAAgB,EAAE;AACnC,YAAA,OAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAW,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,OAAO,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;QAChE;AACA,QAAA,OAAO,MAAA,OAAO,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;AACvC,IAAA,CAAC,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,CAAC,gBAAgB,CAAC;IACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,SAAS,GAAGK,iBAAW,CAAC,YAAW;QACvC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;;AAGA,QAAA,IAAI,gBAAgB,IAAI,WAAW,EAAE;YACnC,UAAU,CAAC,KAAK,CAAC;YACjB;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;YAEd,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,YAAA,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;AAEtB,YAAA,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE;AACvC,gBAAA,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;YACjC;QACF;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE;QACD,GAAG;QACH,QAAQ;AACR,QAAA,OAAO,CAAC,aAAa;AACrB,QAAA,OAAO,CAAC,OAAO;QACf,gBAAgB;QAChB,WAAW;AACZ,KAAA,CAAC;AAEF,IAAA,MAAM,OAAO,GAAGA,iBAAW,CAAC,YAAW;QACrC,GAAG,CAAC,UAAU,CACZ,CAAA,KAAA,EAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,IAAI,KAAK,CAAA,CAAE,CACpF;QACD,MAAM,SAAS,EAAE;IACnB,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;;IAG9BH,eAAS,CAAC,MAAK;QACb,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;YAE1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,KAAK,EAAE;gBAChD,QAAQ,CAAC,QAAQ,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC;YAChB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,WAAW;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE1BA,eAAS,CAAC,MAAK;AACb,QAAA,SAAS,EAAE;AACb,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAEf,OAAO;QACL,KAAK;QACL,OAAO;QACP,KAAK;QACL,OAAO;KACR;AACH;;SCvFgB,eAAe,CAC7B,SAAmB,EACnB,UAAgE,EAAE,EAAA;AAElE,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;;IAGpC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO;;AAGtD,IAAA,MAAM,iBAAiB,GAAGD,aAAO,CAAC,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;IAGzE,MAAM,sBAAsB,GAAGA,aAAO,CACpC,MAAM,OAAO,CAAC,cAAc,EAC5B,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CACzC;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGD,cAAQ,CAAmC,MAAK;;QAExE,MAAM,YAAY,GAAqC,EAAE;AACzD,QAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;YACrC,YAAY,CAAC,QAAQ,CAAC;gBACpB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAW,KAAA,IAAA,IAAX,WAAW,uBAAX,WAAW,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,uBAAtB,sBAAsB,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;AAC1E,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,YAAY;AACrB,IAAA,CAAC,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,CAAC,gBAAgB,CAAC;IACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,UAAU,GAAGK,iBAAW,CAAC,YAAW;QACxC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;;AAGA,QAAA,IAAI,gBAAgB,IAAI,WAAW,EAAE;YACnC,UAAU,CAAC,KAAK,CAAC;YACjB;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;AAEd,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE;YAErC,MAAM,QAAQ,GAAqC,EAAE;AAErD,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;;gBAErC,QAAQ,CAAC,QAAQ,CAAC;AAChB,oBAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GACxB,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,uBAAtB,sBAAsB,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAClC,KAAK;AACT,YAAA,CAAC,CAAC;YAEF,QAAQ,CAAC,QAAQ,CAAC;QACpB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;;YAGtB,MAAM,aAAa,GAAqC,EAAE;AAC1D,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;AACrC,gBAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAA,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,KAAA,MAAA,GAAA,MAAA,GAAtB,sBAAsB,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;AACvE,YAAA,CAAC,CAAC;YACF,QAAQ,CAAC,aAAa,CAAC;QACzB;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE;QACD,GAAG;QACH,iBAAiB;QACjB,sBAAsB;AACtB,QAAA,OAAO,CAAC,OAAO;QACf,gBAAgB;QAChB,WAAW;AACZ,KAAA,CAAC;;IAGFH,eAAS,CAAC,MAAK;QACb,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;YAE1C,MAAM,QAAQ,GAAqC,EAAE;YACrD,IAAI,UAAU,GAAG,KAAK;AAEtB,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;gBACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtC,gBAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,oBAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ;AAC7B,oBAAA,IAAI,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE;wBAChC,UAAU,GAAG,IAAI;oBACnB;gBACF;qBAAO;AACL,oBAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAA,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,KAAA,MAAA,GAAA,MAAA,GAAtB,sBAAsB,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;gBAClE;AACF,YAAA,CAAC,CAAC;YAEF,IAAI,UAAU,EAAE;gBACd,QAAQ,CAAC,QAAQ,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC;YAChB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,WAAW;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAE3DA,eAAS,CAAC,MAAK;AACb,QAAA,UAAU,EAAE;AACd,IAAA,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,OAAO;QACP,KAAK;KACN;AACH;;ACtHM,SAAU,SAAS,CACvB,QAAgB,EAChB,OAAuD,EAAA;AAEvD,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;IACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGF,cAAQ,CAAqB,IAAI,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,IAAI,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;AAEvB,IAAA,MAAM,YAAY,GAAGK,iBAAW,CAAC,YAAW;QAC1C,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;AAEd,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;AAErE,YAAA,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AAClC,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC;QACpB;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAGA,iBAAW,CAC7B,OAAO,KAAa,EAAE,SAA+B,KAAI;QACvD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC;YAC5D;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,CAAC,iBAAiB,CACzB,QAAQ,EACR,OAAO,CAAC,MAAM,EACd,KAAK,EACL,SAAS,EACT,SAAS,CACV;QACH;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC;QACxD;AACF,IAAA,CAAC,EACD,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAC3C;;IAGDH,eAAS,CAAC,MAAK;QACb,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;YAE1C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE;AAClD,gBAAA,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AACnC,gBAAA,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;gBACjC,UAAU,CAAC,KAAK,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC;YAChB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,WAAW;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9BA,eAAS,CAAC,MAAK;AACb,QAAA,YAAY,EAAE;AAChB,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAElB,OAAO;QACL,OAAO;QACP,SAAS;QACT,OAAO;QACP,KAAK;QACL,WAAW;KACZ;AACH;;AC3FA;;AAEG;AACI,eAAe,kBAAkB,CACtC,iBAA6C,EAC7C,SAAoB,EAAA;AAEpB,IAAA,IAAI,MAAsB;AAC1B,IAAA,IAAI,QAA8B;;AAGlC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;;;AAGpC,QAAA,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F;IACH;SAAO,IAAI,iBAAiB,EAAE;QAC5B,MAAM,GAAG,iBAAiB;QAC1B,QAAQ,GAAG,SAAS;IACtB;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;IACjE;AAEA,IAAA,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC;AAC1B,QAAA,GAAG,MAAM;;AAET,QAAA,YAAY,EAAE,CAAC;;AAEf,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA,CAAC;AAEF,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE;AAErC,QAAA,IAAI,KAAK,GAAqC,QAAQ,CAAC,KAAK;;QAG5D,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,KAAK,GAAG,EAAE;AACV,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;AAC5B,gBAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK;AACrD,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;YACL,KAAK;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;IACH;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;;QAG1D,MAAM,aAAa,GAAqC,EAAE;QAC1D,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC5B,gBAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,KAAK;AACjC,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;AACL,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;IACH;AACF;;AClEA;;;AAGG;AACG,SAAU,YAAY,CAAC,OAA4B,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;AACpC,IAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;AACnC;;;;;;;;;"}
|
package/dist/next.mjs
CHANGED
|
@@ -432,23 +432,24 @@ function useFlipflagContext() {
|
|
|
432
432
|
|
|
433
433
|
function useFeatureFlag(flagName, options = {}) {
|
|
434
434
|
const context = useFlipflagContext();
|
|
435
|
+
// Extract specific properties to avoid dependency on entire context object
|
|
436
|
+
const { sdk, serverFlags, isServerRendered } = context;
|
|
435
437
|
const [value, setValue] = useState(() => {
|
|
436
438
|
var _a, _b, _c;
|
|
437
439
|
// Use server-side value if available
|
|
438
|
-
if (
|
|
439
|
-
return (_b = (_a =
|
|
440
|
+
if (serverFlags && isServerRendered) {
|
|
441
|
+
return (_b = (_a = serverFlags[flagName]) !== null && _a !== void 0 ? _a : options.fallbackValue) !== null && _b !== void 0 ? _b : false;
|
|
440
442
|
}
|
|
441
443
|
return (_c = options.fallbackValue) !== null && _c !== void 0 ? _c : false;
|
|
442
444
|
});
|
|
443
|
-
const [loading, setLoading] = useState(!
|
|
445
|
+
const [loading, setLoading] = useState(!isServerRendered);
|
|
444
446
|
const [error, setError] = useState(null);
|
|
445
|
-
const sdk = context.sdk;
|
|
446
447
|
const fetchFlag = useCallback(async () => {
|
|
447
448
|
if (!options.enabled && options.enabled !== undefined) {
|
|
448
449
|
return;
|
|
449
450
|
}
|
|
450
451
|
// Skip fetching if we already have server-side data and it's still valid
|
|
451
|
-
if (
|
|
452
|
+
if (isServerRendered && serverFlags) {
|
|
452
453
|
setLoading(false);
|
|
453
454
|
return;
|
|
454
455
|
}
|
|
@@ -473,13 +474,26 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
473
474
|
flagName,
|
|
474
475
|
options.fallbackValue,
|
|
475
476
|
options.enabled,
|
|
476
|
-
|
|
477
|
-
|
|
477
|
+
isServerRendered,
|
|
478
|
+
serverFlags,
|
|
478
479
|
]);
|
|
479
480
|
const refetch = useCallback(async () => {
|
|
480
481
|
sdk.clearCache(`flag:${sdk["config"].projectId}:${flagName}:${sdk["config"].environment || "all"}`);
|
|
481
482
|
await fetchFlag();
|
|
482
483
|
}, [sdk, flagName, fetchFlag]);
|
|
484
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
485
|
+
useEffect(() => {
|
|
486
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
487
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
488
|
+
const newValue = state.flags[flagName];
|
|
489
|
+
if (newValue !== undefined && newValue !== value) {
|
|
490
|
+
setValue(newValue);
|
|
491
|
+
setLoading(false);
|
|
492
|
+
setError(null);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
return unsubscribe;
|
|
496
|
+
}, [sdk, flagName, value]);
|
|
483
497
|
useEffect(() => {
|
|
484
498
|
fetchFlag();
|
|
485
499
|
}, [fetchFlag]);
|
|
@@ -493,25 +507,30 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
493
507
|
|
|
494
508
|
function useFeatureFlags(flagNames, options = {}) {
|
|
495
509
|
const context = useFlipflagContext();
|
|
510
|
+
// Extract specific properties to avoid dependency on entire context object
|
|
511
|
+
const { sdk, serverFlags, isServerRendered } = context;
|
|
512
|
+
// Memoize flagNames array to prevent unnecessary re-renders
|
|
513
|
+
const memoizedFlagNames = useMemo(() => flagNames, [flagNames.join(",")]);
|
|
514
|
+
// Memoize fallbackValues object
|
|
515
|
+
const memoizedFallbackValues = useMemo(() => options.fallbackValues, [JSON.stringify(options.fallbackValues)]);
|
|
496
516
|
const [flags, setFlags] = useState(() => {
|
|
497
517
|
// Initialize with server-side values or fallback
|
|
498
518
|
const initialFlags = {};
|
|
499
|
-
|
|
500
|
-
var _a, _b
|
|
519
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
520
|
+
var _a, _b;
|
|
501
521
|
initialFlags[flagName] =
|
|
502
|
-
(
|
|
522
|
+
(_b = (_a = serverFlags === null || serverFlags === void 0 ? void 0 : serverFlags[flagName]) !== null && _a !== void 0 ? _a : memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _b !== void 0 ? _b : false;
|
|
503
523
|
});
|
|
504
524
|
return initialFlags;
|
|
505
525
|
});
|
|
506
|
-
const [loading, setLoading] = useState(!
|
|
526
|
+
const [loading, setLoading] = useState(!isServerRendered);
|
|
507
527
|
const [error, setError] = useState(null);
|
|
508
|
-
const sdk = context.sdk;
|
|
509
528
|
const fetchFlags = useCallback(async () => {
|
|
510
529
|
if (!options.enabled && options.enabled !== undefined) {
|
|
511
530
|
return;
|
|
512
531
|
}
|
|
513
532
|
// Skip fetching if we already have server-side data and it's still valid
|
|
514
|
-
if (
|
|
533
|
+
if (isServerRendered && serverFlags) {
|
|
515
534
|
setLoading(false);
|
|
516
535
|
return;
|
|
517
536
|
}
|
|
@@ -520,11 +539,11 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
520
539
|
setError(null);
|
|
521
540
|
const response = await sdk.getFlags();
|
|
522
541
|
const newFlags = {};
|
|
523
|
-
|
|
524
|
-
var _a, _b
|
|
542
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
543
|
+
var _a, _b;
|
|
525
544
|
// Use API value if available, otherwise fallback
|
|
526
545
|
newFlags[flagName] =
|
|
527
|
-
(
|
|
546
|
+
(_b = (_a = response.flags[flagName]) !== null && _a !== void 0 ? _a : memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _b !== void 0 ? _b : false;
|
|
528
547
|
});
|
|
529
548
|
setFlags(newFlags);
|
|
530
549
|
}
|
|
@@ -533,9 +552,9 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
533
552
|
setError(errorMessage);
|
|
534
553
|
// Use fallback values
|
|
535
554
|
const fallbackFlags = {};
|
|
536
|
-
|
|
537
|
-
var _a
|
|
538
|
-
fallbackFlags[flagName] = (
|
|
555
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
556
|
+
var _a;
|
|
557
|
+
fallbackFlags[flagName] = (_a = memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _a !== void 0 ? _a : false;
|
|
539
558
|
});
|
|
540
559
|
setFlags(fallbackFlags);
|
|
541
560
|
}
|
|
@@ -544,12 +563,39 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
544
563
|
}
|
|
545
564
|
}, [
|
|
546
565
|
sdk,
|
|
547
|
-
|
|
548
|
-
|
|
566
|
+
memoizedFlagNames,
|
|
567
|
+
memoizedFallbackValues,
|
|
549
568
|
options.enabled,
|
|
550
|
-
|
|
551
|
-
|
|
569
|
+
isServerRendered,
|
|
570
|
+
serverFlags,
|
|
552
571
|
]);
|
|
572
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
573
|
+
useEffect(() => {
|
|
574
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
575
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
576
|
+
const newFlags = {};
|
|
577
|
+
let hasChanges = false;
|
|
578
|
+
memoizedFlagNames.forEach((flagName) => {
|
|
579
|
+
var _a;
|
|
580
|
+
const newValue = state.flags[flagName];
|
|
581
|
+
if (newValue !== undefined) {
|
|
582
|
+
newFlags[flagName] = newValue;
|
|
583
|
+
if (newValue !== flags[flagName]) {
|
|
584
|
+
hasChanges = true;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
newFlags[flagName] = (_a = memoizedFallbackValues === null || memoizedFallbackValues === void 0 ? void 0 : memoizedFallbackValues[flagName]) !== null && _a !== void 0 ? _a : false;
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
if (hasChanges) {
|
|
592
|
+
setFlags(newFlags);
|
|
593
|
+
setLoading(false);
|
|
594
|
+
setError(null);
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
return unsubscribe;
|
|
598
|
+
}, [sdk, memoizedFlagNames, memoizedFallbackValues, flags]);
|
|
553
599
|
useEffect(() => {
|
|
554
600
|
fetchFlags();
|
|
555
601
|
}, [fetchFlags]);
|
|
@@ -600,6 +646,20 @@ function useABTest(testName, options) {
|
|
|
600
646
|
console.error("Failed to record A/B test event:", err);
|
|
601
647
|
}
|
|
602
648
|
}, [sdk, testName, options.userId, variantId]);
|
|
649
|
+
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
650
|
+
useEffect(() => {
|
|
651
|
+
const unsubscribe = sdk.subscribe((state) => {
|
|
652
|
+
// Update local state when SDK state changes (via pullInterval)
|
|
653
|
+
const newABTest = state.abTests[testName];
|
|
654
|
+
if (newABTest && newABTest.variantId !== variantId) {
|
|
655
|
+
setVariant(newABTest.variant.value);
|
|
656
|
+
setVariantId(newABTest.variantId);
|
|
657
|
+
setLoading(false);
|
|
658
|
+
setError(null);
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
return unsubscribe;
|
|
662
|
+
}, [sdk, testName, variantId]);
|
|
603
663
|
useEffect(() => {
|
|
604
664
|
fetchVariant();
|
|
605
665
|
}, [fetchVariant]);
|
package/dist/next.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.mjs","sources":["../src/core/FlipFlagSDK.ts","../src/next/FlipflagProvider.tsx","../src/next/useFeatureFlag.ts","../src/next/useFeatureFlags.ts","../src/next/useABTest.ts","../src/next/server-utils.ts","../src/next/identifyUser.ts"],"sourcesContent":["import {\n FlipFlagConfig,\n FeatureFlagResponse,\n FeatureFlagsResponse,\n ABTestResponse,\n ABTestEventResponse,\n ABTestsResponse,\n FlipFlagError,\n CacheEntry,\n RetryOptions,\n SDKState,\n IdentifyUserOptions,\n} from \"../types\";\n\nexport class FlipFlagSDK {\n private config: FlipFlagConfig;\n private cache = new Map<string, CacheEntry<any>>();\n private defaultBaseUrl = \"https://app.flipflag.ru\";\n private pullIntervalId?: NodeJS.Timeout;\n private state: SDKState;\n private stateListeners: Set<(state: SDKState) => void> = new Set();\n\n constructor(config: FlipFlagConfig) {\n this.config = {\n baseUrl: this.defaultBaseUrl,\n cacheTimeout: 30000, // 30 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n pullInterval: 60000, // 1 minute\n ...config,\n };\n\n this.state = {\n flags: {},\n abTests: {},\n lastFetch: null,\n isLoading: false,\n error: null,\n };\n\n // Start automatic pulling if pullInterval is set\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.startPulling();\n }\n }\n\n /**\n * Identify user for A/B testing and user-specific flags\n */\n identifyUser(options: IdentifyUserOptions): void {\n this.config.userId = options.userId;\n\n // Clear A/B test cache since user changed\n this.clearABTestCache();\n\n // If we have a user, we might want to refresh immediately\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.pullData();\n }\n }\n\n /**\n * Get current SDK state\n */\n getState(): SDKState {\n return { ...this.state };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(callback: (state: SDKState) => void): () => void {\n this.stateListeners.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.stateListeners.delete(callback);\n };\n }\n\n /**\n * Get a feature flag value from current state\n */\n getFlagValue(flagName: string): boolean {\n return this.state.flags[flagName] ?? false;\n }\n\n /**\n * Get A/B test variant from current state\n */\n getABTestVariant(testName: string): ABTestResponse | null {\n return this.state.abTests[testName] || null;\n }\n\n /**\n * Start automatic data pulling\n */\n private startPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n }\n\n this.pullIntervalId = setInterval(() => {\n this.pullData();\n }, this.config.pullInterval!);\n\n // Initial pull\n this.pullData();\n }\n\n /**\n * Stop automatic data pulling\n */\n stopPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n this.pullIntervalId = undefined;\n }\n }\n\n /**\n * Pull fresh data from API\n */\n private async pullData(): Promise<void> {\n try {\n this.updateState({ isLoading: true, error: null });\n\n // Pull flags\n const flagsResponse = await this.fetchAllFlags();\n\n // Pull A/B tests if user is identified\n let abTestsResponse: ABTestsResponse | null = null;\n if (this.config.userId) {\n try {\n abTestsResponse = await this.fetchAllABTests();\n } catch (error) {\n console.warn(\"Failed to fetch A/B tests:\", error);\n }\n }\n\n const newState: Partial<SDKState> = {\n flags: flagsResponse?.flags || {},\n lastFetch: new Date(),\n isLoading: false,\n error: null,\n };\n\n if (abTestsResponse) {\n const abTestsMap: Record<string, ABTestResponse> = {};\n abTestsResponse.abTests.forEach((test) => {\n // For each test, get the variant for current user\n if (this.config.userId) {\n // This would normally fetch the variant, but for demo we'll simulate\n abTestsMap[test.name] = {\n testName: test.name,\n testId: test.id,\n variantId: \"variant_a\", // Default variant\n variant: test.variants[0] || {\n id: \"default\",\n name: \"Default\",\n value: null,\n weight: 100,\n },\n timestamp: new Date().toISOString(),\n };\n }\n });\n newState.abTests = abTestsMap;\n }\n\n this.updateState(newState);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n this.updateState({\n isLoading: false,\n error: errorMessage,\n });\n console.error(\"Failed to pull data:\", error);\n }\n }\n\n /**\n * Update state and notify listeners\n */\n private updateState(newState: Partial<SDKState>): void {\n this.state = { ...this.state, ...newState };\n\n // Notify all listeners\n this.stateListeners.forEach((callback) => {\n try {\n callback(this.state);\n } catch (error) {\n console.error(\"State listener error:\", error);\n }\n });\n }\n\n /**\n * Fetch all flags from API\n */\n private async fetchAllFlags(): Promise<FeatureFlagsResponse | null> {\n try {\n return await this.makeRequest<FeatureFlagsResponse>(\n `/api/sdk/flags/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch flags:\", error);\n return null;\n }\n }\n\n /**\n * Fetch all A/B tests from API\n */\n private async fetchAllABTests(): Promise<ABTestsResponse | null> {\n try {\n return await this.makeRequest<ABTestsResponse>(\n `/api/sdk/ab-tests/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch A/B tests:\", error);\n return null;\n }\n }\n\n /**\n * Clear A/B test cache\n */\n private clearABTestCache(): void {\n const abTestKeys = Array.from(this.cache.keys()).filter((key) =>\n key.startsWith(\"abtest:\")\n );\n abTestKeys.forEach((key) => this.cache.delete(key));\n }\n\n /**\n * Get all feature flags for a project\n */\n async getFlags(\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagsResponse> {\n const cacheKey = `flags:${projectId}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/flags/${projectId}`, this.config.baseUrl);\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagsResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get a specific feature flag value\n */\n async getFlag(\n flagName: string,\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagResponse> {\n // If we have the flag in state, return it immediately\n if (this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n\n // Check if we're currently loading data (pullData in progress)\n // In this case, wait a bit and check state again\n if (this.state.isLoading) {\n // Wait up to 5 seconds for loading to complete\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (!this.state.isLoading && this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n }\n }\n\n const cacheKey = `flag:${projectId}:${flagName}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/flags/${projectId}/${flagName}`,\n this.config.baseUrl\n );\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get A/B test variant for a user\n */\n async getAbTestVariant(\n testName: string,\n userId: string,\n projectId: string = this.config.projectId\n ): Promise<ABTestResponse> {\n // If we have the A/B test in state, return it immediately\n const stateVariant = this.state.abTests[testName];\n if (stateVariant && stateVariant.testName === testName) {\n return stateVariant;\n }\n\n const cacheKey = `abtest:${projectId}:${testName}:${userId}`;\n const cached = this.getFromCache<ABTestResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}`,\n this.config.baseUrl\n );\n\n const response = await this.makeRequest<ABTestResponse>(url, {\n headers: {\n \"X-User-ID\": userId,\n },\n });\n\n // Cache A/B test variants for longer since they shouldn't change frequently for a user\n this.setCache(cacheKey, response, this.config.cacheTimeout! * 10);\n\n return response;\n }\n\n /**\n * Record an A/B test event\n */\n async recordAbTestEvent(\n testName: string,\n userId: string,\n event: string,\n variantId: string,\n eventData?: Record<string, any>,\n projectId: string = this.config.projectId\n ): Promise<ABTestEventResponse> {\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}/event`,\n this.config.baseUrl\n );\n\n return this.makeRequest<ABTestEventResponse>(url, {\n method: \"POST\",\n headers: {\n \"X-User-ID\": userId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n event,\n variantId,\n eventData,\n }),\n });\n }\n\n /**\n * Get all A/B tests for a project\n */\n async getAbTests(\n projectId: string = this.config.projectId\n ): Promise<ABTestsResponse> {\n const cacheKey = `abtests:${projectId}`;\n const cached = this.getFromCache<ABTestsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/ab-tests/${projectId}`, this.config.baseUrl);\n\n const response = await this.makeRequest<ABTestsResponse>(url);\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Clear cache for specific key or all cache\n */\n clearCache(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<FlipFlagConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n private async makeRequest<T>(\n url: string | URL,\n options: RequestInit = {}\n ): Promise<T> {\n // Convert URL object to string if needed\n const urlString = url instanceof URL ? url.toString() : url;\n\n // If URL starts with '/', prepend baseUrl and handle trailing slashes\n const fullUrl = urlString.startsWith(\"/\")\n ? `${this.config.baseUrl?.replace(/\\/$/, \"\") || this.defaultBaseUrl}${urlString}`\n : urlString;\n\n const headers = {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const requestOptions: RequestInit = {\n ...options,\n headers,\n };\n\n return this.makeRequestWithRetry<T>(fullUrl, requestOptions);\n }\n\n private async makeRequestWithRetry<T>(\n url: string,\n options: RequestInit,\n retryOptions: RetryOptions = {\n attempts: this.config.retryAttempts!,\n delay: this.config.retryDelay!,\n backoff: 2,\n }\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= retryOptions.attempts; attempt++) {\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n console.log(\"retry sdk\");\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n `HTTP ${response.status}: ${errorData.error || response.statusText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx) except 429 (rate limit)\n if (error instanceof Error && error.message.includes(\"HTTP 4\")) {\n if (!error.message.includes(\"HTTP 429\")) {\n throw error;\n }\n }\n\n if (attempt < retryOptions.attempts) {\n const delay =\n retryOptions.delay * Math.pow(retryOptions.backoff, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n\n private getFromCache<T>(key: string): T | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T, ttl: number): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl,\n });\n }\n\n /**\n * Cleanup method - should be called when SDK is no longer needed\n */\n public destroy(): void {\n this.stopPulling();\n this.stateListeners.clear();\n this.cache.clear();\n }\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\ninterface FlipflagContextValue {\n sdk: FlipFlagSDK;\n config: FlipFlagConfig;\n serverFlags?: Record<string, FeatureFlagValue>;\n isServerRendered: boolean;\n}\n\nconst FlipflagContext = createContext<FlipflagContextValue | null>(null);\n\ninterface FlipflagProviderProps {\n children: ReactNode;\n config: FlipFlagConfig;\n serverFlags?: ServerSideFlags;\n}\n\nexport function FlipflagProvider({\n children,\n config,\n serverFlags,\n}: FlipflagProviderProps) {\n const [isServerRendered, setIsServerRendered] = useState(true);\n const sdk = useMemo(() => new FlipFlagSDK(config), [config]);\n\n // Mark as client-rendered after hydration\n useEffect(() => {\n setIsServerRendered(false);\n }, []);\n\n const contextValue: FlipflagContextValue = useMemo(\n () => ({\n sdk,\n config,\n serverFlags: serverFlags?.flags,\n isServerRendered,\n }),\n [sdk, config, serverFlags?.flags, isServerRendered]\n );\n\n return (\n <FlipflagContext.Provider value={contextValue}>\n {children}\n </FlipflagContext.Provider>\n );\n}\n\nexport function useFlipflagContext(): FlipflagContextValue {\n const context = useContext(FlipflagContext);\n\n if (!context) {\n throw new Error(\n \"useFlipflagContext must be used within a FlipflagProvider\"\n );\n }\n\n return context;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagOptions {\n fallbackValue?: FeatureFlagValue;\n enabled?: boolean;\n}\n\nexport function useFeatureFlag(\n flagName: string,\n options: UseFeatureFlagOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagHookResult {\n const context = useFlipflagContext();\n const [value, setValue] = useState<FeatureFlagValue>(() => {\n // Use server-side value if available\n if (context.serverFlags && context.isServerRendered) {\n return context.serverFlags[flagName] ?? options.fallbackValue ?? false;\n }\n return options.fallbackValue ?? false;\n });\n const [loading, setLoading] = useState(!context.isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchFlag = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (context.isServerRendered && context.serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlag(flagName);\n setValue(response.value);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n if (options.fallbackValue !== undefined) {\n setValue(options.fallbackValue);\n }\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagName,\n options.fallbackValue,\n options.enabled,\n context.isServerRendered,\n context.serverFlags,\n ]);\n\n const refetch = useCallback(async () => {\n sdk.clearCache(\n `flag:${sdk[\"config\"].projectId}:${flagName}:${sdk[\"config\"].environment || \"all\"}`\n );\n await fetchFlag();\n }, [sdk, flagName, fetchFlag]);\n\n useEffect(() => {\n fetchFlag();\n }, [fetchFlag]);\n\n return {\n value,\n loading,\n error,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagsHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagsOptions {\n fallbackValues?: Record<string, FeatureFlagValue>;\n enabled?: boolean;\n}\n\nexport function useFeatureFlags(\n flagNames: string[],\n options: UseFeatureFlagsOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagsHookResult {\n const context = useFlipflagContext();\n const [flags, setFlags] = useState<Record<string, FeatureFlagValue>>(() => {\n // Initialize with server-side values or fallback\n const initialFlags: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n initialFlags[flagName] =\n context.serverFlags?.[flagName] ??\n options.fallbackValues?.[flagName] ??\n false;\n });\n return initialFlags;\n });\n const [loading, setLoading] = useState(!context.isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchFlags = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (context.isServerRendered && context.serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlags();\n\n const newFlags: Record<string, FeatureFlagValue> = {};\n\n flagNames.forEach((flagName) => {\n // Use API value if available, otherwise fallback\n newFlags[flagName] =\n response.flags[flagName] ??\n options.fallbackValues?.[flagName] ??\n false;\n });\n\n setFlags(newFlags);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n // Use fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n fallbackFlags[flagName] = options.fallbackValues?.[flagName] ?? false;\n });\n setFlags(fallbackFlags);\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagNames,\n options.fallbackValues,\n options.enabled,\n context.isServerRendered,\n context.serverFlags,\n ]);\n\n useEffect(() => {\n fetchFlags();\n }, [fetchFlags]);\n\n return {\n flags,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { ABTestValue, FlipFlagConfig } from \"../types\";\nimport { ABTestHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseABTestOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useABTest(\n testName: string,\n options: UseABTestOptions & { config?: FlipFlagConfig }\n): ABTestHookResult {\n const context = useFlipflagContext();\n const [variant, setVariant] = useState<ABTestValue | null>(null);\n const [variantId, setVariantId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchVariant = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getAbTestVariant(testName, options.userId);\n\n setVariant(response.variant.value);\n setVariantId(response.variantId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setVariant(null);\n setVariantId(null);\n } finally {\n setLoading(false);\n }\n }, [sdk, testName, options.userId, options.enabled]);\n\n const recordEvent = useCallback(\n async (event: string, eventData?: Record<string, any>) => {\n if (!variantId) {\n console.warn(\"Cannot record event: no variant assigned yet\");\n return;\n }\n\n try {\n await sdk.recordAbTestEvent(\n testName,\n options.userId,\n event,\n variantId,\n eventData\n );\n } catch (err) {\n console.error(\"Failed to record A/B test event:\", err);\n }\n },\n [sdk, testName, options.userId, variantId]\n );\n\n useEffect(() => {\n fetchVariant();\n }, [fetchVariant]);\n\n return {\n variant,\n variantId,\n loading,\n error,\n recordEvent,\n };\n}\n","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\n/**\n * Fetch feature flags on the server side for SSR\n */\nexport async function getServerSideFlags(\n configOrFlagNames?: FlipFlagConfig | string[],\n flagNames?: string[]\n): Promise<ServerSideFlags> {\n let config: FlipFlagConfig;\n let flagList: string[] | undefined;\n\n // Handle different calling patterns\n if (Array.isArray(configOrFlagNames)) {\n // Called with flagNames only - this should not happen in normal usage\n // We'll need to get config from somewhere else, but for now throw error\n throw new Error(\n \"getServerSideFlags must be called with config when used outside of FlipflagProvider context\"\n );\n } else if (configOrFlagNames) {\n config = configOrFlagNames;\n flagList = flagNames;\n } else {\n throw new Error(\"getServerSideFlags requires config parameter\");\n }\n\n const sdk = new FlipFlagSDK({\n ...config,\n // Disable caching for server-side requests to ensure fresh data\n cacheTimeout: 0,\n // Disable auto-pulling for SSR\n pullInterval: 0,\n });\n\n try {\n const response = await sdk.getFlags();\n\n let flags: Record<string, FeatureFlagValue> = response.flags;\n\n // If specific flag names are requested, filter the response\n if (flagList && flagList.length > 0) {\n flags = {};\n flagList.forEach((flagName) => {\n flags[flagName] = response.flags[flagName] ?? false;\n });\n }\n\n return {\n flags,\n timestamp: Date.now(),\n };\n } catch (error) {\n console.error(\"Failed to fetch server-side flags:\", error);\n\n // Return fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n if (flagList) {\n flagList.forEach((flagName) => {\n fallbackFlags[flagName] = false;\n });\n }\n\n return {\n flags: fallbackFlags,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Get static props with feature flags for SSG\n */\nexport async function getStaticPropsWithFlags(\n config: FlipFlagConfig,\n flagNames?: string[]\n) {\n const serverFlags = await getServerSideFlags(config, flagNames);\n\n return {\n props: {\n serverFlags,\n },\n revalidate: 300, // Revalidate every 5 minutes\n };\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n * Must be called within FlipflagProvider\n */\nexport function identifyUser(options: IdentifyUserOptions): void {\n const context = useFlipflagContext();\n context.sdk.identifyUser(options);\n}\n"],"names":["_jsx"],"mappings":";;;MAca,WAAW,CAAA;AAQtB,IAAA,WAAA,CAAY,MAAsB,EAAA;AAN1B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAA2B;QAC1C,IAAA,CAAA,cAAc,GAAG,yBAAyB;AAG1C,QAAA,IAAA,CAAA,cAAc,GAAmC,IAAI,GAAG,EAAE;QAGhE,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,YAAY,EAAE,KAAK;AACnB,YAAA,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;AACnB,YAAA,GAAG,MAAM;SACV;QAED,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,KAAK,EAAE,IAAI;SACZ;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,OAA4B,EAAA;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;;QAGnC,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;IAC1B;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,QAAmC,EAAA;AAC3C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAGjC,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AACtC,QAAA,CAAC;IACH;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,QAAgB,EAAA;;QAC3B,OAAO,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;IAC5C;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI;IAC7C;AAEA;;AAEG;IACK,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;YACrC,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;;QAG7B,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;AAGlD,YAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;;YAGhD,IAAI,eAAe,GAA2B,IAAI;AAClD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACtB,gBAAA,IAAI;AACF,oBAAA,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;gBAChD;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC;gBACnD;YACF;AAEA,YAAA,MAAM,QAAQ,GAAsB;gBAClC,KAAK,EAAE,CAAA,aAAa,KAAA,IAAA,IAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,KAAI,EAAE;gBACjC,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,KAAK,EAAE,IAAI;aACZ;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,UAAU,GAAmC,EAAE;gBACrD,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;AAEvC,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAEtB,wBAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;4BACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;4BACnB,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,SAAS,EAAE,WAAW;AACtB,4BAAA,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;AAC3B,gCAAA,EAAE,EAAE,SAAS;AACb,gCAAA,IAAI,EAAE,SAAS;AACf,gCAAA,KAAK,EAAE,IAAI;AACX,gCAAA,MAAM,EAAE,GAAG;AACZ,6BAAA;AACD,4BAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACpC;oBACH;AACF,gBAAA,CAAC,CAAC;AACF,gBAAA,QAAQ,CAAC,OAAO,GAAG,UAAU;YAC/B;AAEA,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;YAC1D,IAAI,CAAC,WAAW,CAAC;AACf,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,KAAK,EAAE,YAAY;AACpB,aAAA,CAAC;AACF,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;QAC9C;IACF;AAEA;;AAEG;AACK,IAAA,WAAW,CAAC,QAA2B,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE;;QAG3C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACvC,YAAA,IAAI;AACF,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACtB;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;YAC/C;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACK,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,CAAA,eAAA,EAAkB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,CAC1C;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,eAAe,GAAA;AAC3B,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,CAAA,kBAAA,EAAqB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,CAC7C;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAClD,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAC1D,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAC1B;AACD,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrD;AAEA;;AAEG;IACH,MAAM,QAAQ,CACZ,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EACzC,WAAoB,EAAA;QAEpB,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,SAAS,IAAI,WAAW,IAAI,KAAK,CAAA,CAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAuB,QAAQ,CAAC;QAEhE,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvE,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC1C,YAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,aAAa,EACb,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAY,CACxC;QACH;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,GAAG,CAAC,QAAQ,EAAE,CACf;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,OAAO,CACX,QAAgB,EAChB,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EACzC,WAAoB,EAAA;;;QAGpB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;YAC5C,OAAO;AACL,gBAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,QAAQ;AACR,gBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK;gBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,gBAAA,SAAS,EACP,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClE;QACH;;;AAIA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;;AAExB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACxD,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;oBACrE,OAAO;AACL,wBAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;wBAChC,QAAQ;AACR,wBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK;wBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,wBAAA,SAAS,EACP,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBAClE;gBACH;YACF;QACF;QAEA,MAAM,QAAQ,GAAG,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,IAAI,KAAK,CAAA,CAAE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAsB,QAAQ,CAAC;QAE/D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,kBAAkB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,EACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;QACD,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC1C,YAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,aAAa,EACb,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAY,CACxC;QACH;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,GAAG,CAAC,QAAQ,EAAE,CACf;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,gBAAgB,CACpB,QAAgB,EAChB,MAAc,EACd,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;;QAGzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE;AACtD,YAAA,OAAO,YAAY;QACrB;QAEA,MAAM,QAAQ,GAAG,CAAA,OAAA,EAAU,SAAS,IAAI,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAiB,QAAQ,CAAC;QAE1D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,oBAAoB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,EAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAiB,GAAG,EAAE;AAC3D,YAAA,OAAO,EAAE;AACP,gBAAA,WAAW,EAAE,MAAM;AACpB,aAAA;AACF,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,GAAG,EAAE,CAAC;AAEjE,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,MAAM,iBAAiB,CACrB,QAAgB,EAChB,MAAc,EACd,KAAa,EACb,SAAiB,EACjB,SAA+B,EAC/B,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;AAEzC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,oBAAoB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,MAAA,CAAQ,EACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;AAED,QAAA,OAAO,IAAI,CAAC,WAAW,CAAsB,GAAG,EAAE;AAChD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,WAAW,EAAE,MAAM;AACnB,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,SAAS;gBACT,SAAS;aACV,CAAC;AACH,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,MAAM,UAAU,CACd,SAAA,GAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA;AAEzC,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,SAAS,EAAE;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAkB,QAAQ,CAAC;QAE3D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAkB,GAAG,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC;AAE5D,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAY,EAAA;QACrB,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QACxB;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QACpB;IACF;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,SAAkC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE;IAChD;AAEQ,IAAA,MAAM,WAAW,CACvB,GAAiB,EACjB,UAAuB,EAAE,EAAA;;;AAGzB,QAAA,MAAM,SAAS,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG;;AAG3D,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG;cACpC,GAAG,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAI,IAAI,CAAC,cAAc,CAAA,EAAG,SAAS,CAAA;cAC7E,SAAS;AAEb,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;AAC/B,YAAA,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;AAED,QAAA,MAAM,cAAc,GAAgB;AAClC,YAAA,GAAG,OAAO;YACV,OAAO;SACR;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAI,OAAO,EAAE,cAAc,CAAC;IAC9D;AAEQ,IAAA,MAAM,oBAAoB,CAChC,GAAW,EACX,OAAoB,EACpB,YAAA,GAA6B;AAC3B,QAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAc;AACpC,QAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;AAC9B,QAAA,OAAO,EAAE,CAAC;AACX,KAAA,EAAA;AAED,QAAA,IAAI,SAAgB;AAEpB,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;AACjE,YAAA,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,oBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACxB,oBAAA,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACzD,oBAAA,MAAM,IAAI,KAAK,CACb,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,EAAA,EAAK,SAAS,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAA,CAAE,CACrE;gBACH;AAEA,gBAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;YAC9B;YAAE,OAAO,KAAK,EAAE;gBACd,SAAS,GAAG,KAAc;;AAG1B,gBAAA,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACvC,wBAAA,MAAM,KAAK;oBACb;gBACF;AAEA,gBAAA,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE;AACnC,oBAAA,MAAM,KAAK,GACT,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC;AAClE,oBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5D;YACF;QACF;AAEA,QAAA,MAAM,SAAU;IAClB;AAEQ,IAAA,YAAY,CAAI,GAAW,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE;AAC5C,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACtB,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,KAAK,CAAC,IAAI;IACnB;AAEQ,IAAA,QAAQ,CAAI,GAAW,EAAE,IAAO,EAAE,GAAW,EAAA;AACnD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG;AACJ,SAAA,CAAC;IACJ;AAEA;;AAEG;IACI,OAAO,GAAA;QACZ,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;ACtgBD,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC;AAQlE,SAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,WAAW,GACW,EAAA;IACtB,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;AAC9D,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;;IAG5D,SAAS,CAAC,MAAK;QACb,mBAAmB,CAAC,KAAK,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,YAAY,GAAyB,OAAO,CAChD,OAAO;QACL,GAAG;QACH,MAAM;AACN,QAAA,WAAW,EAAE,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,KAAK;QAC/B,gBAAgB;AACjB,KAAA,CAAC,EACF,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,KAAK,EAAE,gBAAgB,CAAC,CACpD;AAED,IAAA,QACEA,GAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EAC1C,QAAQ,EAAA,CACgB;AAE/B;SAEgB,kBAAkB,GAAA;AAChC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;IAE3C,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D;IACH;AAEA,IAAA,OAAO,OAAO;AAChB;;SC1DgB,cAAc,CAC5B,QAAgB,EAChB,UAA+D,EAAE,EAAA;AAEjE,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,MAAK;;;QAExD,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE;AACnD,YAAA,OAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,OAAO,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;QACxE;AACA,QAAA,OAAO,MAAA,OAAO,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;AACvC,IAAA,CAAC,CAAC;AACF,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACjE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;AAEvB,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,YAAW;QACvC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;;QAGA,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE;YACnD,UAAU,CAAC,KAAK,CAAC;YACjB;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;YAEd,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,YAAA,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;AAEtB,YAAA,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE;AACvC,gBAAA,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;YACjC;QACF;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE;QACD,GAAG;QACH,QAAQ;AACR,QAAA,OAAO,CAAC,aAAa;AACrB,QAAA,OAAO,CAAC,OAAO;AACf,QAAA,OAAO,CAAC,gBAAgB;AACxB,QAAA,OAAO,CAAC,WAAW;AACpB,KAAA,CAAC;AAEF,IAAA,MAAM,OAAO,GAAG,WAAW,CAAC,YAAW;QACrC,GAAG,CAAC,UAAU,CACZ,CAAA,KAAA,EAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,IAAI,KAAK,CAAA,CAAE,CACpF;QACD,MAAM,SAAS,EAAE;IACnB,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9B,SAAS,CAAC,MAAK;AACb,QAAA,SAAS,EAAE;AACb,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAEf,OAAO;QACL,KAAK;QACL,OAAO;QACP,KAAK;QACL,OAAO;KACR;AACH;;SCtEgB,eAAe,CAC7B,SAAmB,EACnB,UAAgE,EAAE,EAAA;AAElE,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmC,MAAK;;QAExE,MAAM,YAAY,GAAqC,EAAE;AACzD,QAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;YAC7B,YAAY,CAAC,QAAQ,CAAC;AACpB,gBAAA,CAAA,EAAA,GAAA,MAAA,CAAA,EAAA,GAAA,OAAO,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAC/B,CAAA,EAAA,GAAA,OAAO,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAClC,KAAK;AACT,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,YAAY;AACrB,IAAA,CAAC,CAAC;AACF,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACjE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;AAEvB,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,YAAW;QACxC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;;QAGA,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE;YACnD,UAAU,CAAC,KAAK,CAAC;YACjB;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;AAEd,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE;YAErC,MAAM,QAAQ,GAAqC,EAAE;AAErD,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;;gBAE7B,QAAQ,CAAC,QAAQ,CAAC;AAChB,oBAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GACxB,CAAA,EAAA,GAAA,OAAO,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAClC,KAAK;AACT,YAAA,CAAC,CAAC;YAEF,QAAQ,CAAC,QAAQ,CAAC;QACpB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;;YAGtB,MAAM,aAAa,GAAqC,EAAE;AAC1D,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;AAC7B,gBAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAA,CAAA,EAAA,GAAA,OAAO,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK;AACvE,YAAA,CAAC,CAAC;YACF,QAAQ,CAAC,aAAa,CAAC;QACzB;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE;QACD,GAAG;QACH,SAAS;AACT,QAAA,OAAO,CAAC,cAAc;AACtB,QAAA,OAAO,CAAC,OAAO;AACf,QAAA,OAAO,CAAC,gBAAgB;AACxB,QAAA,OAAO,CAAC,WAAW;AACpB,KAAA,CAAC;IAEF,SAAS,CAAC,MAAK;AACb,QAAA,UAAU,EAAE;AACd,IAAA,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,OAAO;QACP,KAAK;KACN;AACH;;AChFM,SAAU,SAAS,CACvB,QAAgB,EAChB,OAAuD,EAAA;AAEvD,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;IACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;AAEvD,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;AAEvB,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,YAAW;QAC1C,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;YACrD;QACF;AAEA,QAAA,IAAI;YACF,UAAU,CAAC,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;AAEd,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;AAErE,YAAA,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AAClC,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe;YACzE,QAAQ,CAAC,YAAY,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC;QACpB;gBAAU;YACR,UAAU,CAAC,KAAK,CAAC;QACnB;AACF,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,WAAW,CAC7B,OAAO,KAAa,EAAE,SAA+B,KAAI;QACvD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC;YAC5D;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,CAAC,iBAAiB,CACzB,QAAQ,EACR,OAAO,CAAC,MAAM,EACd,KAAK,EACL,SAAS,EACT,SAAS,CACV;QACH;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC;QACxD;AACF,IAAA,CAAC,EACD,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAC3C;IAED,SAAS,CAAC,MAAK;AACb,QAAA,YAAY,EAAE;AAChB,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAElB,OAAO;QACL,OAAO;QACP,SAAS;QACT,OAAO;QACP,KAAK;QACL,WAAW;KACZ;AACH;;AC3EA;;AAEG;AACI,eAAe,kBAAkB,CACtC,iBAA6C,EAC7C,SAAoB,EAAA;AAEpB,IAAA,IAAI,MAAsB;AAC1B,IAAA,IAAI,QAA8B;;AAGlC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;;;AAGpC,QAAA,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F;IACH;SAAO,IAAI,iBAAiB,EAAE;QAC5B,MAAM,GAAG,iBAAiB;QAC1B,QAAQ,GAAG,SAAS;IACtB;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;IACjE;AAEA,IAAA,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC;AAC1B,QAAA,GAAG,MAAM;;AAET,QAAA,YAAY,EAAE,CAAC;;AAEf,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA,CAAC;AAEF,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE;AAErC,QAAA,IAAI,KAAK,GAAqC,QAAQ,CAAC,KAAK;;QAG5D,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,KAAK,GAAG,EAAE;AACV,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;AAC5B,gBAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK;AACrD,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;YACL,KAAK;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;IACH;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;;QAG1D,MAAM,aAAa,GAAqC,EAAE;QAC1D,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC5B,gBAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,KAAK;AACjC,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO;AACL,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;IACH;AACF;;AClEA;;;AAGG;AACG,SAAU,YAAY,CAAC,OAA4B,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;AACpC,IAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;AACnC;;;;"}
|
|
1
|
+
{"version":3,"file":"next.mjs","sources":["../src/core/FlipFlagSDK.ts","../src/next/FlipflagProvider.tsx","../src/next/useFeatureFlag.ts","../src/next/useFeatureFlags.ts","../src/next/useABTest.ts","../src/next/server-utils.ts","../src/next/identifyUser.ts"],"sourcesContent":["import {\n FlipFlagConfig,\n FeatureFlagResponse,\n FeatureFlagsResponse,\n ABTestResponse,\n ABTestEventResponse,\n ABTestsResponse,\n FlipFlagError,\n CacheEntry,\n RetryOptions,\n SDKState,\n IdentifyUserOptions,\n} from \"../types\";\n\nexport class FlipFlagSDK {\n private config: FlipFlagConfig;\n private cache = new Map<string, CacheEntry<any>>();\n private defaultBaseUrl = \"https://app.flipflag.ru\";\n private pullIntervalId?: NodeJS.Timeout;\n private state: SDKState;\n private stateListeners: Set<(state: SDKState) => void> = new Set();\n\n constructor(config: FlipFlagConfig) {\n this.config = {\n baseUrl: this.defaultBaseUrl,\n cacheTimeout: 30000, // 30 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n pullInterval: 60000, // 1 minute\n ...config,\n };\n\n this.state = {\n flags: {},\n abTests: {},\n lastFetch: null,\n isLoading: false,\n error: null,\n };\n\n // Start automatic pulling if pullInterval is set\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.startPulling();\n }\n }\n\n /**\n * Identify user for A/B testing and user-specific flags\n */\n identifyUser(options: IdentifyUserOptions): void {\n this.config.userId = options.userId;\n\n // Clear A/B test cache since user changed\n this.clearABTestCache();\n\n // If we have a user, we might want to refresh immediately\n if (this.config.pullInterval && this.config.pullInterval > 0) {\n this.pullData();\n }\n }\n\n /**\n * Get current SDK state\n */\n getState(): SDKState {\n return { ...this.state };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(callback: (state: SDKState) => void): () => void {\n this.stateListeners.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.stateListeners.delete(callback);\n };\n }\n\n /**\n * Get a feature flag value from current state\n */\n getFlagValue(flagName: string): boolean {\n return this.state.flags[flagName] ?? false;\n }\n\n /**\n * Get A/B test variant from current state\n */\n getABTestVariant(testName: string): ABTestResponse | null {\n return this.state.abTests[testName] || null;\n }\n\n /**\n * Start automatic data pulling\n */\n private startPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n }\n\n this.pullIntervalId = setInterval(() => {\n this.pullData();\n }, this.config.pullInterval!);\n\n // Initial pull\n this.pullData();\n }\n\n /**\n * Stop automatic data pulling\n */\n stopPulling(): void {\n if (this.pullIntervalId) {\n clearInterval(this.pullIntervalId);\n this.pullIntervalId = undefined;\n }\n }\n\n /**\n * Pull fresh data from API\n */\n private async pullData(): Promise<void> {\n try {\n this.updateState({ isLoading: true, error: null });\n\n // Pull flags\n const flagsResponse = await this.fetchAllFlags();\n\n // Pull A/B tests if user is identified\n let abTestsResponse: ABTestsResponse | null = null;\n if (this.config.userId) {\n try {\n abTestsResponse = await this.fetchAllABTests();\n } catch (error) {\n console.warn(\"Failed to fetch A/B tests:\", error);\n }\n }\n\n const newState: Partial<SDKState> = {\n flags: flagsResponse?.flags || {},\n lastFetch: new Date(),\n isLoading: false,\n error: null,\n };\n\n if (abTestsResponse) {\n const abTestsMap: Record<string, ABTestResponse> = {};\n abTestsResponse.abTests.forEach((test) => {\n // For each test, get the variant for current user\n if (this.config.userId) {\n // This would normally fetch the variant, but for demo we'll simulate\n abTestsMap[test.name] = {\n testName: test.name,\n testId: test.id,\n variantId: \"variant_a\", // Default variant\n variant: test.variants[0] || {\n id: \"default\",\n name: \"Default\",\n value: null,\n weight: 100,\n },\n timestamp: new Date().toISOString(),\n };\n }\n });\n newState.abTests = abTestsMap;\n }\n\n this.updateState(newState);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n this.updateState({\n isLoading: false,\n error: errorMessage,\n });\n console.error(\"Failed to pull data:\", error);\n }\n }\n\n /**\n * Update state and notify listeners\n */\n private updateState(newState: Partial<SDKState>): void {\n this.state = { ...this.state, ...newState };\n\n // Notify all listeners\n this.stateListeners.forEach((callback) => {\n try {\n callback(this.state);\n } catch (error) {\n console.error(\"State listener error:\", error);\n }\n });\n }\n\n /**\n * Fetch all flags from API\n */\n private async fetchAllFlags(): Promise<FeatureFlagsResponse | null> {\n try {\n return await this.makeRequest<FeatureFlagsResponse>(\n `/api/sdk/flags/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch flags:\", error);\n return null;\n }\n }\n\n /**\n * Fetch all A/B tests from API\n */\n private async fetchAllABTests(): Promise<ABTestsResponse | null> {\n try {\n return await this.makeRequest<ABTestsResponse>(\n `/api/sdk/ab-tests/${this.config.projectId}`\n );\n } catch (error) {\n console.error(\"Failed to fetch A/B tests:\", error);\n return null;\n }\n }\n\n /**\n * Clear A/B test cache\n */\n private clearABTestCache(): void {\n const abTestKeys = Array.from(this.cache.keys()).filter((key) =>\n key.startsWith(\"abtest:\")\n );\n abTestKeys.forEach((key) => this.cache.delete(key));\n }\n\n /**\n * Get all feature flags for a project\n */\n async getFlags(\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagsResponse> {\n const cacheKey = `flags:${projectId}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/flags/${projectId}`, this.config.baseUrl);\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagsResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get a specific feature flag value\n */\n async getFlag(\n flagName: string,\n projectId: string = this.config.projectId,\n environment?: string\n ): Promise<FeatureFlagResponse> {\n // If we have the flag in state, return it immediately\n if (this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n\n // Check if we're currently loading data (pullData in progress)\n // In this case, wait a bit and check state again\n if (this.state.isLoading) {\n // Wait up to 5 seconds for loading to complete\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (!this.state.isLoading && this.state.flags[flagName] !== undefined) {\n return {\n projectId: this.config.projectId,\n flagName,\n environment: this.config.environment || \"all\",\n value: this.state.flags[flagName],\n timestamp:\n this.state.lastFetch?.toISOString() || new Date().toISOString(),\n };\n }\n }\n }\n\n const cacheKey = `flag:${projectId}:${flagName}:${environment || \"all\"}`;\n const cached = this.getFromCache<FeatureFlagResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/flags/${projectId}/${flagName}`,\n this.config.baseUrl\n );\n if (environment || this.config.environment) {\n url.searchParams.set(\n \"environment\",\n environment || this.config.environment!\n );\n }\n\n const response = await this.makeRequest<FeatureFlagResponse>(\n url.toString()\n );\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Get A/B test variant for a user\n */\n async getAbTestVariant(\n testName: string,\n userId: string,\n projectId: string = this.config.projectId\n ): Promise<ABTestResponse> {\n // If we have the A/B test in state, return it immediately\n const stateVariant = this.state.abTests[testName];\n if (stateVariant && stateVariant.testName === testName) {\n return stateVariant;\n }\n\n const cacheKey = `abtest:${projectId}:${testName}:${userId}`;\n const cached = this.getFromCache<ABTestResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}`,\n this.config.baseUrl\n );\n\n const response = await this.makeRequest<ABTestResponse>(url, {\n headers: {\n \"X-User-ID\": userId,\n },\n });\n\n // Cache A/B test variants for longer since they shouldn't change frequently for a user\n this.setCache(cacheKey, response, this.config.cacheTimeout! * 10);\n\n return response;\n }\n\n /**\n * Record an A/B test event\n */\n async recordAbTestEvent(\n testName: string,\n userId: string,\n event: string,\n variantId: string,\n eventData?: Record<string, any>,\n projectId: string = this.config.projectId\n ): Promise<ABTestEventResponse> {\n const url = new URL(\n `/api/sdk/ab-test/${projectId}/${testName}/event`,\n this.config.baseUrl\n );\n\n return this.makeRequest<ABTestEventResponse>(url, {\n method: \"POST\",\n headers: {\n \"X-User-ID\": userId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n event,\n variantId,\n eventData,\n }),\n });\n }\n\n /**\n * Get all A/B tests for a project\n */\n async getAbTests(\n projectId: string = this.config.projectId\n ): Promise<ABTestsResponse> {\n const cacheKey = `abtests:${projectId}`;\n const cached = this.getFromCache<ABTestsResponse>(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/sdk/ab-tests/${projectId}`, this.config.baseUrl);\n\n const response = await this.makeRequest<ABTestsResponse>(url);\n this.setCache(cacheKey, response, this.config.cacheTimeout!);\n\n return response;\n }\n\n /**\n * Clear cache for specific key or all cache\n */\n clearCache(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<FlipFlagConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n private async makeRequest<T>(\n url: string | URL,\n options: RequestInit = {}\n ): Promise<T> {\n // Convert URL object to string if needed\n const urlString = url instanceof URL ? url.toString() : url;\n\n // If URL starts with '/', prepend baseUrl and handle trailing slashes\n const fullUrl = urlString.startsWith(\"/\")\n ? `${this.config.baseUrl?.replace(/\\/$/, \"\") || this.defaultBaseUrl}${urlString}`\n : urlString;\n\n const headers = {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const requestOptions: RequestInit = {\n ...options,\n headers,\n };\n\n return this.makeRequestWithRetry<T>(fullUrl, requestOptions);\n }\n\n private async makeRequestWithRetry<T>(\n url: string,\n options: RequestInit,\n retryOptions: RetryOptions = {\n attempts: this.config.retryAttempts!,\n delay: this.config.retryDelay!,\n backoff: 2,\n }\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= retryOptions.attempts; attempt++) {\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n console.log(\"retry sdk\");\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n `HTTP ${response.status}: ${errorData.error || response.statusText}`\n );\n }\n\n return await response.json();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx) except 429 (rate limit)\n if (error instanceof Error && error.message.includes(\"HTTP 4\")) {\n if (!error.message.includes(\"HTTP 429\")) {\n throw error;\n }\n }\n\n if (attempt < retryOptions.attempts) {\n const delay =\n retryOptions.delay * Math.pow(retryOptions.backoff, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n\n private getFromCache<T>(key: string): T | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T, ttl: number): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl,\n });\n }\n\n /**\n * Cleanup method - should be called when SDK is no longer needed\n */\n public destroy(): void {\n this.stopPulling();\n this.stateListeners.clear();\n this.cache.clear();\n }\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\ninterface FlipflagContextValue {\n sdk: FlipFlagSDK;\n config: FlipFlagConfig;\n serverFlags?: Record<string, FeatureFlagValue>;\n isServerRendered: boolean;\n}\n\nconst FlipflagContext = createContext<FlipflagContextValue | null>(null);\n\ninterface FlipflagProviderProps {\n children: ReactNode;\n config: FlipFlagConfig;\n serverFlags?: ServerSideFlags;\n}\n\nexport function FlipflagProvider({\n children,\n config,\n serverFlags,\n}: FlipflagProviderProps) {\n const [isServerRendered, setIsServerRendered] = useState(true);\n const sdk = useMemo(() => new FlipFlagSDK(config), [config]);\n\n // Mark as client-rendered after hydration\n useEffect(() => {\n setIsServerRendered(false);\n }, []);\n\n const contextValue: FlipflagContextValue = useMemo(\n () => ({\n sdk,\n config,\n serverFlags: serverFlags?.flags,\n isServerRendered,\n }),\n [sdk, config, serverFlags?.flags, isServerRendered]\n );\n\n return (\n <FlipflagContext.Provider value={contextValue}>\n {children}\n </FlipflagContext.Provider>\n );\n}\n\nexport function useFlipflagContext(): FlipflagContextValue {\n const context = useContext(FlipflagContext);\n\n if (!context) {\n throw new Error(\n \"useFlipflagContext must be used within a FlipflagProvider\"\n );\n }\n\n return context;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagOptions {\n fallbackValue?: FeatureFlagValue;\n enabled?: boolean;\n}\n\nexport function useFeatureFlag(\n flagName: string,\n options: UseFeatureFlagOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagHookResult {\n const context = useFlipflagContext();\n\n // Extract specific properties to avoid dependency on entire context object\n const { sdk, serverFlags, isServerRendered } = context;\n\n const [value, setValue] = useState<FeatureFlagValue>(() => {\n // Use server-side value if available\n if (serverFlags && isServerRendered) {\n return serverFlags[flagName] ?? options.fallbackValue ?? false;\n }\n return options.fallbackValue ?? false;\n });\n const [loading, setLoading] = useState(!isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const fetchFlag = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (isServerRendered && serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlag(flagName);\n setValue(response.value);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n if (options.fallbackValue !== undefined) {\n setValue(options.fallbackValue);\n }\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n flagName,\n options.fallbackValue,\n options.enabled,\n isServerRendered,\n serverFlags,\n ]);\n\n const refetch = useCallback(async () => {\n sdk.clearCache(\n `flag:${sdk[\"config\"].projectId}:${flagName}:${sdk[\"config\"].environment || \"all\"}`\n );\n await fetchFlag();\n }, [sdk, flagName, fetchFlag]);\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newValue = state.flags[flagName];\n if (newValue !== undefined && newValue !== value) {\n setValue(newValue);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, flagName, value]);\n\n useEffect(() => {\n fetchFlag();\n }, [fetchFlag]);\n\n return {\n value,\n loading,\n error,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FeatureFlagValue, FlipFlagConfig } from \"../types\";\nimport { FeatureFlagsHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseFeatureFlagsOptions {\n fallbackValues?: Record<string, FeatureFlagValue>;\n enabled?: boolean;\n}\n\nexport function useFeatureFlags(\n flagNames: string[],\n options: UseFeatureFlagsOptions & { config?: FlipFlagConfig } = {}\n): FeatureFlagsHookResult {\n const context = useFlipflagContext();\n\n // Extract specific properties to avoid dependency on entire context object\n const { sdk, serverFlags, isServerRendered } = context;\n\n // Memoize flagNames array to prevent unnecessary re-renders\n const memoizedFlagNames = useMemo(() => flagNames, [flagNames.join(\",\")]);\n\n // Memoize fallbackValues object\n const memoizedFallbackValues = useMemo(\n () => options.fallbackValues,\n [JSON.stringify(options.fallbackValues)]\n );\n\n const [flags, setFlags] = useState<Record<string, FeatureFlagValue>>(() => {\n // Initialize with server-side values or fallback\n const initialFlags: Record<string, FeatureFlagValue> = {};\n memoizedFlagNames.forEach((flagName) => {\n initialFlags[flagName] =\n serverFlags?.[flagName] ?? memoizedFallbackValues?.[flagName] ?? false;\n });\n return initialFlags;\n });\n const [loading, setLoading] = useState(!isServerRendered);\n const [error, setError] = useState<string | null>(null);\n\n const fetchFlags = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n // Skip fetching if we already have server-side data and it's still valid\n if (isServerRendered && serverFlags) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getFlags();\n\n const newFlags: Record<string, FeatureFlagValue> = {};\n\n memoizedFlagNames.forEach((flagName) => {\n // Use API value if available, otherwise fallback\n newFlags[flagName] =\n response.flags[flagName] ??\n memoizedFallbackValues?.[flagName] ??\n false;\n });\n\n setFlags(newFlags);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n\n // Use fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n memoizedFlagNames.forEach((flagName) => {\n fallbackFlags[flagName] = memoizedFallbackValues?.[flagName] ?? false;\n });\n setFlags(fallbackFlags);\n } finally {\n setLoading(false);\n }\n }, [\n sdk,\n memoizedFlagNames,\n memoizedFallbackValues,\n options.enabled,\n isServerRendered,\n serverFlags,\n ]);\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newFlags: Record<string, FeatureFlagValue> = {};\n let hasChanges = false;\n\n memoizedFlagNames.forEach((flagName) => {\n const newValue = state.flags[flagName];\n if (newValue !== undefined) {\n newFlags[flagName] = newValue;\n if (newValue !== flags[flagName]) {\n hasChanges = true;\n }\n } else {\n newFlags[flagName] = memoizedFallbackValues?.[flagName] ?? false;\n }\n });\n\n if (hasChanges) {\n setFlags(newFlags);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, memoizedFlagNames, memoizedFallbackValues, flags]);\n\n useEffect(() => {\n fetchFlags();\n }, [fetchFlags]);\n\n return {\n flags,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { ABTestValue, FlipFlagConfig } from \"../types\";\nimport { ABTestHookResult } from \"./types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\ninterface UseABTestOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useABTest(\n testName: string,\n options: UseABTestOptions & { config?: FlipFlagConfig }\n): ABTestHookResult {\n const context = useFlipflagContext();\n const [variant, setVariant] = useState<ABTestValue | null>(null);\n const [variantId, setVariantId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const sdk = context.sdk;\n\n const fetchVariant = useCallback(async () => {\n if (!options.enabled && options.enabled !== undefined) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const response = await sdk.getAbTestVariant(testName, options.userId);\n\n setVariant(response.variant.value);\n setVariantId(response.variantId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setVariant(null);\n setVariantId(null);\n } finally {\n setLoading(false);\n }\n }, [sdk, testName, options.userId, options.enabled]);\n\n const recordEvent = useCallback(\n async (event: string, eventData?: Record<string, any>) => {\n if (!variantId) {\n console.warn(\"Cannot record event: no variant assigned yet\");\n return;\n }\n\n try {\n await sdk.recordAbTestEvent(\n testName,\n options.userId,\n event,\n variantId,\n eventData\n );\n } catch (err) {\n console.error(\"Failed to record A/B test event:\", err);\n }\n },\n [sdk, testName, options.userId, variantId]\n );\n\n // Subscribe to SDK state changes for automatic updates via pullInterval\n useEffect(() => {\n const unsubscribe = sdk.subscribe((state) => {\n // Update local state when SDK state changes (via pullInterval)\n const newABTest = state.abTests[testName];\n if (newABTest && newABTest.variantId !== variantId) {\n setVariant(newABTest.variant.value);\n setVariantId(newABTest.variantId);\n setLoading(false);\n setError(null);\n }\n });\n\n return unsubscribe;\n }, [sdk, testName, variantId]);\n\n useEffect(() => {\n fetchVariant();\n }, [fetchVariant]);\n\n return {\n variant,\n variantId,\n loading,\n error,\n recordEvent,\n };\n}\n","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue } from \"../types\";\nimport { ServerSideFlags } from \"./types\";\n\n/**\n * Fetch feature flags on the server side for SSR\n */\nexport async function getServerSideFlags(\n configOrFlagNames?: FlipFlagConfig | string[],\n flagNames?: string[]\n): Promise<ServerSideFlags> {\n let config: FlipFlagConfig;\n let flagList: string[] | undefined;\n\n // Handle different calling patterns\n if (Array.isArray(configOrFlagNames)) {\n // Called with flagNames only - this should not happen in normal usage\n // We'll need to get config from somewhere else, but for now throw error\n throw new Error(\n \"getServerSideFlags must be called with config when used outside of FlipflagProvider context\"\n );\n } else if (configOrFlagNames) {\n config = configOrFlagNames;\n flagList = flagNames;\n } else {\n throw new Error(\"getServerSideFlags requires config parameter\");\n }\n\n const sdk = new FlipFlagSDK({\n ...config,\n // Disable caching for server-side requests to ensure fresh data\n cacheTimeout: 0,\n // Disable auto-pulling for SSR\n pullInterval: 0,\n });\n\n try {\n const response = await sdk.getFlags();\n\n let flags: Record<string, FeatureFlagValue> = response.flags;\n\n // If specific flag names are requested, filter the response\n if (flagList && flagList.length > 0) {\n flags = {};\n flagList.forEach((flagName) => {\n flags[flagName] = response.flags[flagName] ?? false;\n });\n }\n\n return {\n flags,\n timestamp: Date.now(),\n };\n } catch (error) {\n console.error(\"Failed to fetch server-side flags:\", error);\n\n // Return fallback values\n const fallbackFlags: Record<string, FeatureFlagValue> = {};\n if (flagList) {\n flagList.forEach((flagName) => {\n fallbackFlags[flagName] = false;\n });\n }\n\n return {\n flags: fallbackFlags,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Get static props with feature flags for SSG\n */\nexport async function getStaticPropsWithFlags(\n config: FlipFlagConfig,\n flagNames?: string[]\n) {\n const serverFlags = await getServerSideFlags(config, flagNames);\n\n return {\n props: {\n serverFlags,\n },\n revalidate: 300, // Revalidate every 5 minutes\n };\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { useFlipflagContext } from \"./FlipflagProvider\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n * Must be called within FlipflagProvider\n */\nexport function identifyUser(options: IdentifyUserOptions): void {\n const context = useFlipflagContext();\n context.sdk.identifyUser(options);\n}\n"],"names":["_jsx"],"mappings":"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"}
|