flipflag-sdk 1.1.13 → 1.1.15
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/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -2
- package/dist/index.mjs.map +1 -1
- package/dist/js.js +10 -2
- package/dist/js.js.map +1 -1
- package/dist/js.mjs +10 -2
- package/dist/js.mjs.map +1 -1
- package/dist/next.js +17 -23
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +17 -23
- package/dist/next.mjs.map +1 -1
- package/dist/react-native.js +10 -2
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +10 -2
- package/dist/react-native.mjs.map +1 -1
- package/dist/react.js +10 -2
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +10 -2
- package/dist/react.mjs.map +1 -1
- package/dist/vue.js +10 -2
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +10 -2
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
package/dist/js.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js.mjs","sources":["../src/core/FlipFlagSDK.ts","../src/js/featureFlagManager.ts","../src/js/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","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue, ABTestValue } from \"../types\";\n\ninterface FeatureFlagManagerOptions {\n config: FlipFlagConfig;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport class FeatureFlagManager {\n private sdk: FlipFlagSDK;\n private flags: Map<string, FeatureFlagValue> = new Map();\n private abTests: Map<string, { variant: ABTestValue; variantId: string }> =\n new Map();\n private listeners: Map<string, Set<(value: any) => void>> = new Map();\n private refreshTimer?: NodeJS.Timeout;\n\n constructor(options: FeatureFlagManagerOptions) {\n this.sdk = new FlipFlagSDK(options.config);\n\n if (options.autoRefresh) {\n this.startAutoRefresh(options.refreshInterval || 30000);\n }\n }\n\n /**\n * Get a feature flag value\n */\n async getFlag(flagName: string): Promise<FeatureFlagValue> {\n try {\n const response = await this.sdk.getFlag(flagName);\n const value = response.value;\n this.flags.set(flagName, value);\n this.notifyListeners(flagName, value);\n return value;\n } catch (error) {\n console.error(`Failed to get flag ${flagName}:`, error);\n return this.flags.get(flagName) ?? false;\n }\n }\n\n /**\n * Get multiple feature flags\n */\n async getFlags(\n flagNames: string[]\n ): Promise<Record<string, FeatureFlagValue>> {\n try {\n const response = await this.sdk.getFlags();\n const result: Record<string, FeatureFlagValue> = {};\n\n flagNames.forEach((flagName) => {\n const value = response.flags[flagName] ?? false;\n result[flagName] = value;\n this.flags.set(flagName, value);\n this.notifyListeners(flagName, value);\n });\n\n return result;\n } catch (error) {\n console.error(\"Failed to get flags:\", error);\n const result: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n result[flagName] = this.flags.get(flagName) ?? false;\n });\n return result;\n }\n }\n\n /**\n * Get A/B test variant\n */\n async getABTestVariant(\n testName: string,\n userId: string\n ): Promise<{ variant: ABTestValue; variantId: string }> {\n try {\n const response = await this.sdk.getAbTestVariant(testName, userId);\n const result = {\n variant: response.variant.value,\n variantId: response.variantId,\n };\n this.abTests.set(`${testName}:${userId}`, result);\n this.notifyListeners(`${testName}:${userId}`, result);\n return result;\n } catch (error) {\n console.error(`Failed to get A/B test variant for ${testName}:`, error);\n return (\n this.abTests.get(`${testName}:${userId}`) ?? {\n variant: null,\n variantId: \"\",\n }\n );\n }\n }\n\n /**\n * Record A/B test event\n */\n async recordABTestEvent(\n testName: string,\n userId: string,\n event: string,\n eventData?: Record<string, any>\n ): Promise<void> {\n const testKey = `${testName}:${userId}`;\n const testData = this.abTests.get(testKey);\n\n if (!testData) {\n console.warn(`No A/B test data found for ${testKey}`);\n return;\n }\n\n try {\n await this.sdk.recordAbTestEvent(\n testName,\n userId,\n event,\n testData.variantId,\n eventData\n );\n } catch (error) {\n console.error(`Failed to record A/B test event for ${testName}:`, error);\n }\n }\n\n /**\n * Subscribe to flag changes\n */\n onFlagChange(\n flagName: string,\n callback: (value: FeatureFlagValue) => void\n ): () => void {\n if (!this.listeners.has(flagName)) {\n this.listeners.set(flagName, new Set());\n }\n this.listeners.get(flagName)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.listeners.get(flagName);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.listeners.delete(flagName);\n }\n }\n };\n }\n\n /**\n * Get cached flag value\n */\n getCachedFlag(flagName: string): FeatureFlagValue | undefined {\n return this.flags.get(flagName);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.sdk.clearCache();\n this.flags.clear();\n this.abTests.clear();\n }\n\n /**\n * Start auto-refresh\n */\n private startAutoRefresh(interval: number): void {\n this.refreshTimer = setInterval(async () => {\n try {\n // Refresh all cached flags\n for (const [flagName] of this.flags) {\n await this.getFlag(flagName);\n }\n } catch (error) {\n console.error(\"Auto-refresh failed:\", error);\n }\n }, interval);\n }\n\n /**\n * Stop auto-refresh\n */\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n }\n\n private notifyListeners(key: string, value: any): void {\n const listeners = this.listeners.get(key);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(value);\n } catch (error) {\n console.error(\"Flag change listener error:\", error);\n }\n });\n }\n }\n}\n\n/**\n * Create a feature flag manager instance\n */\nexport function createFeatureFlagManager(\n options: FeatureFlagManagerOptions\n): FeatureFlagManager {\n return new FeatureFlagManager(options);\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n */\nexport function identifyUser(\n sdk: FlipFlagSDK,\n options: IdentifyUserOptions\n): void {\n sdk.identifyUser(options);\n}\n\n/**\n * Global identifyUser function that works with the default SDK instance\n * Note: This requires a global SDK instance to be set up\n */\nexport function identifyUserGlobal(options: IdentifyUserOptions): void {\n // This would need to be implemented with a global registry\n // For now, throw an error\n throw new Error(\n \"Global identifyUser requires a global SDK instance. Use identifyUser(sdk, options) instead.\"\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"js.mjs","sources":["../src/core/FlipFlagSDK.ts","../src/js/featureFlagManager.ts","../src/js/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 const url = new URL(\n `/api/sdk/flags/${this.config.projectId}`,\n this.config.baseUrl\n );\n if (this.config.environment) {\n url.searchParams.set(\"environment\", this.config.environment);\n }\n\n return await this.makeRequest<FeatureFlagsResponse>(url.toString());\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 const url = new URL(\n `/api/sdk/ab-tests/${this.config.projectId}`,\n this.config.baseUrl\n );\n if (this.config.environment) {\n url.searchParams.set(\"environment\", this.config.environment);\n }\n\n return await this.makeRequest<ABTestsResponse>(url.toString());\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","import { FlipFlagSDK } from \"../core/FlipFlagSDK\";\nimport { FlipFlagConfig, FeatureFlagValue, ABTestValue } from \"../types\";\n\ninterface FeatureFlagManagerOptions {\n config: FlipFlagConfig;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport class FeatureFlagManager {\n private sdk: FlipFlagSDK;\n private flags: Map<string, FeatureFlagValue> = new Map();\n private abTests: Map<string, { variant: ABTestValue; variantId: string }> =\n new Map();\n private listeners: Map<string, Set<(value: any) => void>> = new Map();\n private refreshTimer?: NodeJS.Timeout;\n\n constructor(options: FeatureFlagManagerOptions) {\n this.sdk = new FlipFlagSDK(options.config);\n\n if (options.autoRefresh) {\n this.startAutoRefresh(options.refreshInterval || 30000);\n }\n }\n\n /**\n * Get a feature flag value\n */\n async getFlag(flagName: string): Promise<FeatureFlagValue> {\n try {\n const response = await this.sdk.getFlag(flagName);\n const value = response.value;\n this.flags.set(flagName, value);\n this.notifyListeners(flagName, value);\n return value;\n } catch (error) {\n console.error(`Failed to get flag ${flagName}:`, error);\n return this.flags.get(flagName) ?? false;\n }\n }\n\n /**\n * Get multiple feature flags\n */\n async getFlags(\n flagNames: string[]\n ): Promise<Record<string, FeatureFlagValue>> {\n try {\n const response = await this.sdk.getFlags();\n const result: Record<string, FeatureFlagValue> = {};\n\n flagNames.forEach((flagName) => {\n const value = response.flags[flagName] ?? false;\n result[flagName] = value;\n this.flags.set(flagName, value);\n this.notifyListeners(flagName, value);\n });\n\n return result;\n } catch (error) {\n console.error(\"Failed to get flags:\", error);\n const result: Record<string, FeatureFlagValue> = {};\n flagNames.forEach((flagName) => {\n result[flagName] = this.flags.get(flagName) ?? false;\n });\n return result;\n }\n }\n\n /**\n * Get A/B test variant\n */\n async getABTestVariant(\n testName: string,\n userId: string\n ): Promise<{ variant: ABTestValue; variantId: string }> {\n try {\n const response = await this.sdk.getAbTestVariant(testName, userId);\n const result = {\n variant: response.variant.value,\n variantId: response.variantId,\n };\n this.abTests.set(`${testName}:${userId}`, result);\n this.notifyListeners(`${testName}:${userId}`, result);\n return result;\n } catch (error) {\n console.error(`Failed to get A/B test variant for ${testName}:`, error);\n return (\n this.abTests.get(`${testName}:${userId}`) ?? {\n variant: null,\n variantId: \"\",\n }\n );\n }\n }\n\n /**\n * Record A/B test event\n */\n async recordABTestEvent(\n testName: string,\n userId: string,\n event: string,\n eventData?: Record<string, any>\n ): Promise<void> {\n const testKey = `${testName}:${userId}`;\n const testData = this.abTests.get(testKey);\n\n if (!testData) {\n console.warn(`No A/B test data found for ${testKey}`);\n return;\n }\n\n try {\n await this.sdk.recordAbTestEvent(\n testName,\n userId,\n event,\n testData.variantId,\n eventData\n );\n } catch (error) {\n console.error(`Failed to record A/B test event for ${testName}:`, error);\n }\n }\n\n /**\n * Subscribe to flag changes\n */\n onFlagChange(\n flagName: string,\n callback: (value: FeatureFlagValue) => void\n ): () => void {\n if (!this.listeners.has(flagName)) {\n this.listeners.set(flagName, new Set());\n }\n this.listeners.get(flagName)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.listeners.get(flagName);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.listeners.delete(flagName);\n }\n }\n };\n }\n\n /**\n * Get cached flag value\n */\n getCachedFlag(flagName: string): FeatureFlagValue | undefined {\n return this.flags.get(flagName);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.sdk.clearCache();\n this.flags.clear();\n this.abTests.clear();\n }\n\n /**\n * Start auto-refresh\n */\n private startAutoRefresh(interval: number): void {\n this.refreshTimer = setInterval(async () => {\n try {\n // Refresh all cached flags\n for (const [flagName] of this.flags) {\n await this.getFlag(flagName);\n }\n } catch (error) {\n console.error(\"Auto-refresh failed:\", error);\n }\n }, interval);\n }\n\n /**\n * Stop auto-refresh\n */\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n }\n\n private notifyListeners(key: string, value: any): void {\n const listeners = this.listeners.get(key);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(value);\n } catch (error) {\n console.error(\"Flag change listener error:\", error);\n }\n });\n }\n }\n}\n\n/**\n * Create a feature flag manager instance\n */\nexport function createFeatureFlagManager(\n options: FeatureFlagManagerOptions\n): FeatureFlagManager {\n return new FeatureFlagManager(options);\n}\n","import { IdentifyUserOptions } from \"../types\";\nimport { FlipFlagSDK } from \"../core/FlipFlagSDK\";\n\n/**\n * Identify user for A/B testing and user-specific flags\n */\nexport function identifyUser(\n sdk: FlipFlagSDK,\n options: IdentifyUserOptions\n): void {\n sdk.identifyUser(options);\n}\n\n/**\n * Global identifyUser function that works with the default SDK instance\n * Note: This requires a global SDK instance to be set up\n */\nexport function identifyUserGlobal(options: IdentifyUserOptions): void {\n // This would need to be implemented with a global registry\n // For now, throw an error\n throw new Error(\n \"Global identifyUser requires a global SDK instance. Use identifyUser(sdk, options) instead.\"\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/next.js
CHANGED
|
@@ -168,7 +168,11 @@ class FlipFlagSDK {
|
|
|
168
168
|
*/
|
|
169
169
|
async fetchAllFlags() {
|
|
170
170
|
try {
|
|
171
|
-
|
|
171
|
+
const url = new URL(`/api/sdk/flags/${this.config.projectId}`, this.config.baseUrl);
|
|
172
|
+
if (this.config.environment) {
|
|
173
|
+
url.searchParams.set("environment", this.config.environment);
|
|
174
|
+
}
|
|
175
|
+
return await this.makeRequest(url.toString());
|
|
172
176
|
}
|
|
173
177
|
catch (error) {
|
|
174
178
|
console.error("Failed to fetch flags:", error);
|
|
@@ -180,7 +184,11 @@ class FlipFlagSDK {
|
|
|
180
184
|
*/
|
|
181
185
|
async fetchAllABTests() {
|
|
182
186
|
try {
|
|
183
|
-
|
|
187
|
+
const url = new URL(`/api/sdk/ab-tests/${this.config.projectId}`, this.config.baseUrl);
|
|
188
|
+
if (this.config.environment) {
|
|
189
|
+
url.searchParams.set("environment", this.config.environment);
|
|
190
|
+
}
|
|
191
|
+
return await this.makeRequest(url.toString());
|
|
184
192
|
}
|
|
185
193
|
catch (error) {
|
|
186
194
|
console.error("Failed to fetch A/B tests:", error);
|
|
@@ -471,14 +479,7 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
471
479
|
finally {
|
|
472
480
|
setLoading(false);
|
|
473
481
|
}
|
|
474
|
-
}, [
|
|
475
|
-
sdk,
|
|
476
|
-
flagName,
|
|
477
|
-
options.fallbackValue,
|
|
478
|
-
options.enabled,
|
|
479
|
-
isServerRendered,
|
|
480
|
-
serverFlags,
|
|
481
|
-
]);
|
|
482
|
+
}, [sdk, flagName, options.fallbackValue, options.enabled]);
|
|
482
483
|
const refetch = react.useCallback(async () => {
|
|
483
484
|
sdk.clearCache(`flag:${sdk["config"].projectId}:${flagName}:${sdk["config"].environment || "all"}`);
|
|
484
485
|
await fetchFlag();
|
|
@@ -495,7 +496,7 @@ function useFeatureFlag(flagName, options = {}) {
|
|
|
495
496
|
}
|
|
496
497
|
});
|
|
497
498
|
return unsubscribe;
|
|
498
|
-
}, [sdk, flagName
|
|
499
|
+
}, [sdk, flagName]);
|
|
499
500
|
react.useEffect(() => {
|
|
500
501
|
fetchFlag();
|
|
501
502
|
}, [fetchFlag]);
|
|
@@ -512,9 +513,9 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
512
513
|
// Extract specific properties to avoid dependency on entire context object
|
|
513
514
|
const { sdk, serverFlags, isServerRendered } = context;
|
|
514
515
|
// Memoize flagNames array to prevent unnecessary re-renders
|
|
515
|
-
const memoizedFlagNames = react.useMemo(() => flagNames, [flagNames
|
|
516
|
+
const memoizedFlagNames = react.useMemo(() => flagNames, [flagNames]);
|
|
516
517
|
// Memoize fallbackValues object
|
|
517
|
-
const memoizedFallbackValues = react.useMemo(() => options.fallbackValues, [
|
|
518
|
+
const memoizedFallbackValues = react.useMemo(() => options.fallbackValues, [options.fallbackValues]);
|
|
518
519
|
const [flags, setFlags] = react.useState(() => {
|
|
519
520
|
// Initialize with server-side values or fallback
|
|
520
521
|
const initialFlags = {};
|
|
@@ -563,14 +564,7 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
563
564
|
finally {
|
|
564
565
|
setLoading(false);
|
|
565
566
|
}
|
|
566
|
-
}, [
|
|
567
|
-
sdk,
|
|
568
|
-
memoizedFlagNames,
|
|
569
|
-
memoizedFallbackValues,
|
|
570
|
-
options.enabled,
|
|
571
|
-
isServerRendered,
|
|
572
|
-
serverFlags,
|
|
573
|
-
]);
|
|
567
|
+
}, [sdk, memoizedFlagNames, memoizedFallbackValues, options.enabled]);
|
|
574
568
|
// Subscribe to SDK state changes for automatic updates via pullInterval
|
|
575
569
|
react.useEffect(() => {
|
|
576
570
|
const unsubscribe = sdk.subscribe((state) => {
|
|
@@ -597,7 +591,7 @@ function useFeatureFlags(flagNames, options = {}) {
|
|
|
597
591
|
}
|
|
598
592
|
});
|
|
599
593
|
return unsubscribe;
|
|
600
|
-
}, [sdk, memoizedFlagNames, memoizedFallbackValues
|
|
594
|
+
}, [sdk, memoizedFlagNames, memoizedFallbackValues]);
|
|
601
595
|
react.useEffect(() => {
|
|
602
596
|
fetchFlags();
|
|
603
597
|
}, [fetchFlags]);
|
|
@@ -661,7 +655,7 @@ function useABTest(testName, options) {
|
|
|
661
655
|
}
|
|
662
656
|
});
|
|
663
657
|
return unsubscribe;
|
|
664
|
-
}, [sdk, testName
|
|
658
|
+
}, [sdk, testName]);
|
|
665
659
|
react.useEffect(() => {
|
|
666
660
|
fetchVariant();
|
|
667
661
|
}, [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\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":"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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 const url = new URL(\n `/api/sdk/flags/${this.config.projectId}`,\n this.config.baseUrl\n );\n if (this.config.environment) {\n url.searchParams.set(\"environment\", this.config.environment);\n }\n\n return await this.makeRequest<FeatureFlagsResponse>(url.toString());\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 const url = new URL(\n `/api/sdk/ab-tests/${this.config.projectId}`,\n this.config.baseUrl\n );\n if (this.config.environment) {\n url.searchParams.set(\"environment\", this.config.environment);\n }\n\n return await this.makeRequest<ABTestsResponse>(url.toString());\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 }, [sdk, flagName, options.fallbackValue, options.enabled]);\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]);\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]);\n\n // Memoize fallbackValues object\n const memoizedFallbackValues = useMemo(\n () => options.fallbackValues,\n [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 }, [sdk, memoizedFlagNames, memoizedFallbackValues, options.enabled]);\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]);\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]);\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,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,CAAA,eAAA,EAAkB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,EACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;AACD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC3B,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC9D;YAEA,OAAO,MAAM,IAAI,CAAC,WAAW,CAAuB,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrE;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,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,CAAA,kBAAA,EAAqB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA,CAAE,EAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB;AACD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC3B,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC9D;YAEA,OAAO,MAAM,IAAI,CAAC,WAAW,CAAkB,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChE;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;;AClhBD,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,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3D,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;AACpB,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEnBA,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;;SChFgB,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,CAAC;;AAG/D,IAAA,MAAM,sBAAsB,GAAGA,aAAO,CACpC,MAAM,OAAO,CAAC,cAAc,EAC5B,CAAC,OAAO,CAAC,cAAc,CAAC,CACzB;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,CAAC,GAAG,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;;IAGrEH,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,CAAC,CAAC;IAEpDA,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;;AC/GM,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;AACpB,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEnBA,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;;;;;;;;;"}
|