@plyaz/core 1.1.0 → 1.2.0
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/backend/featureFlags/config/feature-flag.config.d.ts +111 -0
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
- package/dist/backend/featureFlags/config/validation.d.ts +181 -0
- package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
- package/dist/backend/featureFlags/database/connection.d.ts +321 -0
- package/dist/backend/featureFlags/database/connection.d.ts.map +1 -0
- package/dist/backend/featureFlags/database/repository.d.ts +518 -0
- package/dist/backend/featureFlags/database/repository.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
- package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
- package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
- package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/feature-flag.controller.d.ts +1 -2
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +2 -3
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.service.d.ts +149 -8
- package/dist/backend/featureFlags/feature-flag.service.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +19 -0
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
- package/dist/backend/featureFlags/index.d.ts +10 -36
- package/dist/backend/featureFlags/index.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +167 -0
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
- package/dist/base/cache/feature/caching.d.ts +16 -0
- package/dist/base/cache/feature/caching.d.ts.map +1 -0
- package/dist/base/cache/index.d.ts +1 -0
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/database.d.ts +17 -12
- package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
- package/dist/frontend/index.d.ts +1 -0
- package/dist/frontend/index.d.ts.map +1 -1
- package/dist/frontend/providers/ApiProvider.d.ts +41 -0
- package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
- package/dist/frontend/providers/index.d.ts +7 -0
- package/dist/frontend/providers/index.d.ts.map +1 -0
- package/dist/index.cjs +2325 -273
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +2315 -275
- package/dist/index.mjs.map +1 -1
- package/dist/services/ApiClientService.d.ts +90 -0
- package/dist/services/ApiClientService.d.ts.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/utils/common/index.d.ts +1 -1
- package/dist/utils/common/index.d.ts.map +1 -1
- package/dist/utils/common/validation.d.ts +20 -0
- package/dist/utils/common/validation.d.ts.map +1 -0
- package/dist/utils/db/databaseService.d.ts +6 -0
- package/dist/utils/db/databaseService.d.ts.map +1 -0
- package/dist/utils/db/index.d.ts +2 -0
- package/dist/utils/db/index.d.ts.map +1 -0
- package/dist/web_app/auth/add_user.d.ts +3 -0
- package/dist/web_app/auth/add_user.d.ts.map +1 -0
- package/dist/web_app/auth/update_user.d.ts +2 -0
- package/dist/web_app/auth/update_user.d.ts.map +1 -0
- package/package.json +20 -7
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/common/hash.ts","../src/utils/common/values.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.ts","../src/base/cache/strategies/memory.ts","../src/base/cache/strategies/redis.ts","../src/base/cache/index.ts","../src/domain/featureFlags/provider.ts","../src/domain/featureFlags/providers/memory.ts","../src/domain/featureFlags/providers/file.ts","../src/domain/featureFlags/providers/redis.ts","../src/domain/featureFlags/providers/api.ts","../src/domain/featureFlags/providers/database.ts","../src/domain/featureFlags/providers/factory.ts","../src/domain/featureFlags/index.ts","../src/backend/featureFlags/feature-flag.controller.ts","../src/backend/featureFlags/feature-flag.service.ts","../src/backend/featureFlags/feature-flag.repository.ts","../src/backend/featureFlags/feature-flag.module.ts","../src/backend/featureFlags/index.ts","../src/frontend/featureFlags/providers/FeatureFlagProvider.tsx","../src/frontend/featureFlags/hooks/useFeatureFlagProvider.ts","../src/frontend/featureFlags/hooks/useFeatureFlagHelpers.ts","../src/frontend/featureFlags/hooks/useFeatureFlag.ts","../src/frontend/featureFlags/hooks/useFeatureFlagActions.ts"],"names":["FNV_CONSTANTS","MATH_CONSTANTS","HASH_SEED_CONSTANTS","path","ISO_STANDARDS","config","CACHE_MAX_SIZE_DEFAULT","CACHE_CLEANUP_INTERVAL_DEFAULT","TIME_CONSTANTS","resolve","readFile","promisify","fs","writeFile","access","mkdir","fileURLToPath","yaml","FORMAT_CONSTANTS","FILE_CHECK_INTERVAL_DEFAULT","FEATURE_FLAG_CACHE_TTL_DEFAULT","FEATURE_FLAG_FILE_PATHS","FEATURES","FeatureFlagController","HttpException","HttpStatus","Post","Body","Put","Delete","Get","Controller","FeatureFlagService","Logger","Injectable","FeatureFlagRepository","FeatureFlagModule","Global","Module","createContext","useState","useRef","useCallback","useEffect","jsx","React","useContext","useMemo"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n // Handle empty string edge case early\n if (str.length === 0) return 0;\n\n // Use FNV-1a constants from config\n let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n // Process string with FNV-1a algorithm\n // Using charCodeAt is faster than alternatives and handles Unicode correctly\n for (let i = 0; i < str.length; i++) {\n // XOR with byte value then multiply by prime\n // This order (XOR first) is what makes it FNV-1a vs FNV-1\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n }\n\n // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n // This is more efficient than Math.abs() and handles edge cases better\n return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n if (percentage <= 0) return false;\n\n const hash = hashString(identifier);\n return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n const trimmedUserId = userId?.trim();\n const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n /**\n * Generates a hash-based bucket for load balancing or distribution.\n *\n * @param identifier - Unique identifier\n * @param bucketCount - Number of buckets (default: 10)\n * @returns Bucket number (0 to bucketCount-1)\n */\n getBucket: (identifier: string, bucketCount: number = 10): number => {\n return hashString(identifier) % bucketCount;\n },\n\n /**\n * Checks if an identifier falls within a specific bucket range.\n *\n * @param identifier - Unique identifier\n * @param startBucket - Starting bucket (inclusive)\n * @param endBucket - Ending bucket (inclusive)\n * @param totalBuckets - Total number of buckets (default: 100)\n * @returns true if identifier is in the bucket range\n */\n isInBucketRange: (\n identifier: string,\n startBucket: number,\n endBucket: number,\n totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n ): boolean => {\n const bucket = hashString(identifier) % totalBuckets;\n return bucket >= startBucket && bucket <= endBucket;\n },\n\n /**\n * Creates a deterministic random seed from a string.\n * Uses the improved hash function and ensures the seed is within\n * the safe range for JavaScript's Math.random seeding.\n *\n * @param str - String to convert to seed\n * @returns Deterministic seed value (0 to 2^31-1)\n */\n createSeed: (str: string): number => {\n // Use constant from config for consistency\n return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n },\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true) // true\n * isTruthy('enabled') // true\n * isTruthy('') // false\n * isTruthy('false') // false\n * isTruthy(0) // false\n * isTruthy(42) // true\n * isTruthy({}) // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n if (value === '') return true;\n const lower = value.toLowerCase().trim();\n return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n if (Array.isArray(value)) return value.length > 0;\n if (value instanceof Map || value instanceof Set) return value.size > 0;\n if (value.constructor === Object) return Object.keys(value).length > 0;\n return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return !isStringFalsy(value);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'function':\n case 'symbol':\n return true;\n case 'object':\n return isObjectTruthy(value);\n default:\n return false;\n }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true') // true\n * toBoolean('yes') // true\n * toBoolean('1') // true\n * toBoolean('false') // false\n * toBoolean('no') // false\n * toBoolean('0') // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n const lower = value.toLowerCase();\n if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return parseStringToBoolean(value, defaultValue);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'object':\n case 'function':\n return true;\n default:\n return defaultValue;\n }\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n /**\n * Checks if a value is a valid percentage (0-100).\n *\n * @param value - Value to check\n * @returns true if valid percentage\n */\n isValidPercentage: (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n },\n\n /**\n * Clamps a number to a specific range.\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\n clamp: (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Checks if a value is empty (null, undefined, empty string, empty array).\n *\n * @param value - Value to check\n * @returns true if empty\n */\n isEmpty: (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n },\n\n /**\n * Safely gets a nested property from an object.\n *\n * @param obj - Object to query\n * @param path - Dot-separated path (e.g., 'user.profile.name')\n * @param defaultValue - Default if path doesn't exist\n * @returns Property value or default\n */\n getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n if (!obj || typeof obj !== 'object') return defaultValue;\n\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return defaultValue;\n current = (current as Record<string, unknown>)[key];\n if (current === undefined) return defaultValue;\n }\n\n return current;\n },\n} as const;\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n * Re-exports the context builder and utilities from domain layer for convenience.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n * .setUserId('user123')\n * .setUserRole('premium')\n * .setEnvironment('production')\n * .setPlatform('web')\n * .setCustom({ subscription: 'premium', betaTester: true })\n * .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n private context: Partial<FeatureFlagContext> = {};\n\n /**\n * Sets the user ID in the context.\n *\n * @param userId - User identifier\n * @returns Builder instance for chaining\n */\n setUserId(userId: string): this {\n this.context.userId = userId;\n return this;\n }\n\n /**\n * Sets the user email in the context.\n *\n * @param userEmail - User email address\n * @returns Builder instance for chaining\n */\n setUserEmail(userEmail: string): this {\n this.context.userEmail = userEmail;\n return this;\n }\n\n /**\n * Sets the user role in the context.\n *\n * @param userRole - User role or permission level\n * @returns Builder instance for chaining\n */\n setUserRole(userRole: string): this {\n this.context.userRole = userRole;\n return this;\n }\n\n /**\n * Sets the country in the context.\n *\n * @param country - Country code (ISO 3166-1 alpha-2)\n * @returns Builder instance for chaining\n */\n setCountry(country: string): this {\n this.context.country = country;\n return this;\n }\n\n /**\n * Sets the platform in the context.\n *\n * @param platform - Platform type\n * @returns Builder instance for chaining\n */\n setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n this.context.platform = platform;\n return this;\n }\n\n /**\n * Sets the version in the context.\n *\n * @param version - Application version\n * @returns Builder instance for chaining\n */\n setVersion(version: string): this {\n this.context.version = version;\n return this;\n }\n\n /**\n * Sets the environment in the context.\n *\n * @param environment - Current environment\n * @returns Builder instance for chaining\n */\n setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n this.context.environment = environment;\n return this;\n }\n\n /**\n * Sets custom context data.\n *\n * @param custom - Custom context properties\n * @returns Builder instance for chaining\n */\n setCustom(custom: Record<string, unknown>): this {\n this.context.custom = { ...this.context.custom, ...custom };\n return this;\n }\n\n /**\n * Adds a single custom property to the context.\n *\n * @param key - Custom property key\n * @param value - Custom property value\n * @returns Builder instance for chaining\n */\n addCustomProperty(key: string, value: unknown): this {\n this.context.custom ??= {};\n this.context.custom[key] = value;\n return this;\n }\n\n /**\n * Builds the final context object.\n * Validates required fields and returns the context.\n *\n * @returns Complete feature flag context\n * @throws Error if required environment is not set\n */\n build(): FeatureFlagContext {\n return {\n environment: this.context.environment ?? 'development',\n userId: this.context.userId,\n userEmail: this.context.userEmail,\n userRole: this.context.userRole,\n country: this.context.country,\n platform: this.context.platform,\n version: this.context.version,\n custom: this.context.custom,\n } satisfies FeatureFlagContext;\n }\n\n /**\n * Clears all context data and resets the builder.\n *\n * @returns Builder instance for chaining\n */\n clear(): this {\n this.context = {};\n return this;\n }\n\n /**\n * Creates a copy of the current builder state.\n *\n * @returns New builder instance with copied context\n */\n clone(): FeatureFlagContextBuilder {\n const cloned = new FeatureFlagContextBuilder();\n cloned.context = { ...this.context };\n if (this.context.custom) {\n cloned.context.custom = { ...this.context.custom };\n }\n return cloned;\n }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n /**\n * Creates a basic context for anonymous users using the builder.\n *\n * @param environment - Target environment\n * @param platform - User platform\n * @returns Basic anonymous context\n */\n createAnonymousContext(\n environment: 'development' | 'staging' | 'production',\n platform: 'web' | 'mobile' | 'desktop' = 'web'\n ): FeatureFlagContext {\n return new FeatureFlagContextBuilder()\n .setEnvironment(environment)\n .setPlatform(platform)\n .build();\n },\n\n /**\n * Creates a context for authenticated users using the builder.\n *\n * @param params - User context parameters\n * @returns User context\n */\n createUserContext(params: {\n userId: string;\n environment: 'development' | 'staging' | 'production';\n userEmail?: string;\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n }): FeatureFlagContext {\n const builder = new FeatureFlagContextBuilder()\n .setUserId(params.userId)\n .setEnvironment(params.environment);\n\n if (params.userEmail) builder.setUserEmail(params.userEmail);\n if (params.userRole) builder.setUserRole(params.userRole);\n if (params.platform) builder.setPlatform(params.platform);\n if (params.country) builder.setCountry(params.country);\n if (params.version) builder.setVersion(params.version);\n if (params.custom) builder.setCustom(params.custom);\n\n return builder.build();\n },\n\n /**\n * Creates a testing context with minimal required fields.\n *\n * @param overrides - Optional context overrides\n * @returns Testing context\n */\n createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n return {\n environment: 'development',\n platform: 'web',\n ...overrides,\n };\n },\n\n /**\n * Validates if a context object is complete and valid.\n *\n * @param context - Context to validate\n * @returns Validation result\n */\n validateContext(context: Partial<FeatureFlagContext>): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!context.environment) {\n errors.push('Environment is required');\n } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n errors.push('Environment must be development, staging, or production');\n }\n\n if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n errors.push('Platform must be web, mobile, or desktop');\n }\n\n if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n errors.push('Country must be a 2-letter ISO country code');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Merges multiple context objects, with later contexts taking precedence.\n *\n * @param contexts - Array of contexts to merge\n * @returns Merged context\n */\n mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n const merged = contexts.reduce((acc, context) => {\n const result = {\n ...acc,\n ...context,\n };\n\n // Only merge custom if either has it\n if (acc.custom || context.custom) {\n result.custom = {\n ...acc.custom,\n ...context.custom,\n };\n }\n\n return result;\n }, {} as Partial<FeatureFlagContext>);\n\n merged.environment ??= 'development';\n\n return merged as FeatureFlagContext;\n },\n\n /**\n * Extracts a specific field value from a context.\n *\n * @param field - Field name to extract\n * @param context - Context object\n * @returns Field value or undefined\n */\n getContextValue(field: string, context: FeatureFlagContext): unknown {\n const standardFields = {\n userId: (ctx: FeatureFlagContext) => ctx.userId,\n userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n country: (ctx: FeatureFlagContext) => ctx.country,\n platform: (ctx: FeatureFlagContext) => ctx.platform,\n version: (ctx: FeatureFlagContext) => ctx.version,\n environment: (ctx: FeatureFlagContext) => ctx.environment,\n custom: (ctx: FeatureFlagContext) => ctx.custom,\n };\n\n if (field in standardFields) {\n return standardFields[field as keyof typeof standardFields](context);\n }\n\n return context.custom?.[field];\n },\n\n /**\n * Creates a context fingerprint for caching and consistency.\n *\n * @param context - Context to fingerprint\n * @returns String fingerprint\n */\n createFingerprint(context: FeatureFlagContext): string {\n const relevant = {\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n custom: context.custom,\n };\n\n // Filter out undefined values and sort keys for consistency\n const filtered = Object.entries(relevant)\n .filter(([, value]) => value !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n return JSON.stringify(filtered);\n },\n\n /**\n * Sanitizes a context by removing sensitive information.\n *\n * @param context - Context to sanitize\n * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n * @returns Sanitized context\n */\n sanitizeContext(\n context: FeatureFlagContext,\n sensitiveFields: string[] = ['userEmail']\n ): FeatureFlagContext {\n const sanitized = { ...context };\n\n // Deep copy custom object if it exists\n if (context.custom) {\n sanitized.custom = { ...context.custom };\n }\n\n for (const field of sensitiveFields) {\n if (field in sanitized) {\n delete (sanitized as Record<string, unknown>)[field];\n }\n if (sanitized.custom && field in sanitized.custom) {\n delete sanitized.custom[field];\n }\n }\n\n return sanitized;\n },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'api',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'web',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n condition: FeatureFlagCondition,\n contextValue: unknown\n): boolean {\n const { operator } = condition;\n\n if (isEqualityOperator(operator)) {\n return evaluateEqualityOperator(operator, contextValue, condition.value);\n }\n\n if (isStringOperator(operator)) {\n return evaluateStringOperator(operator, contextValue, condition.value);\n }\n\n if (isArrayOperator(operator)) {\n return evaluateArrayOperator(operator, condition.value, contextValue);\n }\n\n if (isNumericOperator(operator)) {\n return evaluateNumericOperator(operator, contextValue, condition.value);\n }\n\n return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n const isEqual = contextValue === conditionValue;\n return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Handle string contains\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // Handle array contains\n if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // For not_contains, if neither string nor array match, return true\n return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n operator: string,\n conditionValue: unknown,\n contextValue: unknown\n): boolean {\n if (!Array.isArray(conditionValue)) {\n // For not_in operator, if condition value is not an array, return true\n return operator === 'not_in';\n }\n\n const isIncluded = conditionValue.includes(contextValue);\n return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n switch (operator) {\n case 'greater_than':\n return left > right;\n case 'less_than':\n return left < right;\n default:\n return false;\n }\n}\n\nexport function evaluateNumericOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Try numeric comparison first\n const contextNum = Number(contextValue);\n const conditionNum = Number(conditionValue);\n\n if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n return compareValues(operator, contextNum, conditionNum);\n }\n\n // Fall back to string comparison for non-numeric values\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n return compareValues(operator, contextValue, conditionValue);\n }\n\n return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n /**\n * Evaluates multiple conditions with AND logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if all conditions match\n */\n evaluateConditionsAnd: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.every(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Evaluates multiple conditions with OR logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if any condition matches\n */\n evaluateConditionsOr: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.some(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Validates a condition structure.\n *\n * @param condition - Condition to validate\n * @returns Validation result\n */\n validateCondition: (\n condition: Partial<FeatureFlagCondition>\n ): {\n isValid: boolean;\n errors: string[];\n } => {\n const errors: string[] = [];\n\n if (!condition.field) {\n errors.push('Field is required');\n }\n\n if (!condition.operator) {\n errors.push('Operator is required');\n } else {\n const validOperators = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'in',\n 'not_in',\n 'greater_than',\n 'less_than',\n ];\n if (!validOperators.includes(condition.operator)) {\n errors.push(`Invalid operator: ${condition.operator}`);\n }\n }\n\n if (condition.value === undefined) {\n errors.push('Value is required');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Creates a condition object with validation.\n *\n * @param field - Context field to evaluate\n * @param operator - Comparison operator\n * @param value - Value to compare against\n * @returns Valid condition object\n */\n createCondition: (\n field: string,\n operator: FeatureFlagCondition['operator'],\n value: FeatureFlagCondition['value']\n ): FeatureFlagCondition => {\n const condition = { field, operator, value } as FeatureFlagCondition;\n const validation = ConditionUtils.validateCondition(condition);\n\n if (!validation.isValid) {\n throw new Error(`Invalid condition: ${validation.errors.join(', ')}`);\n }\n\n return condition;\n },\n} as const;\n","/**\n * Feature Flag Evaluation Engine\n *\n * Core engine for evaluating feature flags with rules, targeting, and rollouts.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag evaluation engine\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagCondition,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { isInRollout, createRolloutIdentifier, isTruthy } from '@utils/common';\nimport { ContextUtils, evaluateConditionOperator } from '@utils/featureFlags';\n\n/**\n * Core feature flag evaluation engine.\n * Handles all the logic for evaluating feature flags including rules, targeting, and rollouts.\n *\n * @class FeatureFlagEngine\n *\n * @example\n * ```typescript\n * const engine = new FeatureFlagEngine(defaultFlags, true);\n * engine.setFlags(flagsFromDatabase);\n * engine.setRules(rulesFromDatabase);\n *\n * const evaluation = engine.evaluate('AUTH_GOOGLE', context);\n * console.log(evaluation.isEnabled); // true/false\n * ```\n */\nexport class FeatureFlagEngine<FeatureFlagKey extends string> {\n /** Storage for active feature flags */\n private flags: Map<FeatureFlagKey, FeatureFlag<FeatureFlagKey>> = new Map();\n /** Storage for targeting rules, organized by flag key */\n private rules: Map<FeatureFlagKey, FeatureFlagRule<FeatureFlagKey>[]> = new Map();\n /** Storage for manual overrides (useful for testing) */\n private overrides: Map<FeatureFlagKey, FeatureFlagValue> = new Map();\n\n /**\n * Creates a new feature flag evaluation engine.\n *\n * @param defaults - Default flag values to fall back to\n * @param isLoggingEnabled - Whether to enable debug logging\n */\n constructor(\n private defaults: Record<FeatureFlagKey, FeatureFlagValue>,\n private isLoggingEnabled = false\n ) {}\n\n /**\n * Sets the active feature flags for evaluation.\n * Clears existing flags and rules before setting new ones.\n *\n * @param flags - Array of feature flags to activate\n */\n setFlags(flags: FeatureFlag<FeatureFlagKey>[]): void {\n this.flags.clear();\n this.rules.clear();\n\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n\n this.log('Loaded flags:', this.flags.size);\n }\n\n /**\n * Sets the targeting rules for feature flags.\n * Rules are automatically sorted by priority (higher numbers first).\n *\n * @param rules - Array of feature flag rules\n */\n setRules(rules: FeatureFlagRule<FeatureFlagKey>[]): void {\n this.rules.clear();\n\n for (const rule of rules) {\n const existing = this.rules.get(rule.flagKey) ?? [];\n existing.push(rule);\n // Sort by priority (higher priority first)\n existing.sort((a, b) => b.priority - a.priority);\n this.rules.set(rule.flagKey, existing);\n }\n\n this.log('Loaded rules:', rules.length);\n }\n\n /**\n * Sets a manual override for a specific flag.\n * Overrides take precedence over all other evaluation logic.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.overrides.set(key, value);\n this.log('Override set:', key, value);\n }\n\n /**\n * Removes a manual override for a specific flag.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.overrides.delete(key);\n this.log('Override removed:', key);\n }\n\n /**\n * Updates the default values for feature flags.\n * This is useful when the FEATURES constant is updated at runtime.\n *\n * @param newDefaults - New default values\n */\n updateDefaults(newDefaults: Record<FeatureFlagKey, FeatureFlagValue>): void {\n this.defaults = newDefaults;\n this.log('Updated default feature values');\n }\n\n /**\n * Clears all manual overrides.\n */\n clearOverrides(): void {\n this.overrides.clear();\n this.log('All overrides cleared');\n }\n\n /**\n * Gets all current flags.\n *\n * @returns Array of all feature flags\n */\n getFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Array.from(this.flags.values());\n }\n\n /**\n * Evaluates a feature flag and returns the complete evaluation result.\n *\n * @param key - The feature flag key to evaluate\n * @param context - Optional context for targeting\n * @returns Complete evaluation result with value and metadata\n */\n evaluate(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const evaluatedAt = new Date();\n\n // Check for override first\n const overrideResult = this.checkOverride(key, evaluatedAt);\n if (overrideResult) return overrideResult;\n\n // Get flag from storage\n const flag = this.flags.get(key);\n if (!flag) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Check if flag is disabled\n if (!flag.isEnabled) {\n return this.createDisabledEvaluation(key, evaluatedAt);\n }\n\n // Check environment\n if (!this.isEnvironmentMatch(flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Evaluate rules\n const ruleResult = this.evaluateRules(key, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n\n // Check flag-level rollout\n if (!this.isInFlagRollout(key, flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Return flag value\n return this.createFlagEvaluation(key, flag, evaluatedAt);\n }\n\n /**\n * Checks for manual override and returns evaluation if found.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Evaluation result or null if no override\n */\n private checkOverride(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.overrides.has(key)) return null;\n\n const value = this.overrides.get(key)!;\n return {\n flagKey: key,\n value,\n isEnabled: isTruthy(value),\n reason: 'override',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates default evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Default evaluation result\n */\n private createDefaultEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const defaultValue = this.defaults[key] ?? false;\n return {\n flagKey: key,\n value: defaultValue,\n isEnabled: isTruthy(defaultValue),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates disabled evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Disabled evaluation result\n */\n private createDisabledEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: false,\n isEnabled: false,\n reason: 'disabled',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates flag evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param evaluatedAt - Evaluation timestamp\n * @returns Flag evaluation result\n */\n private createFlagEvaluation(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: flag.value,\n isEnabled: isTruthy(flag.value),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Checks if environment matches for flag evaluation.\n *\n * @private\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if environment matches\n */\n private isEnvironmentMatch(\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n return flag.environment === 'all' || context?.environment === flag.environment;\n }\n\n /**\n * Checks if user is in flag-level rollout.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if user is in rollout\n */\n private isInFlagRollout(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (flag.rolloutPercentage === undefined) return true;\n const identifier = createRolloutIdentifier(key, context?.userId);\n return isInRollout(identifier, flag.rolloutPercentage);\n }\n\n /**\n * Evaluates all rules for a flag.\n *\n * @private\n * @param key - The feature flag key\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateRules(\n key: FeatureFlagKey,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n const rules = this.rules.get(key) ?? [];\n\n for (const rule of rules) {\n if (!rule.isEnabled) continue;\n\n const ruleResult = this.evaluateMatchingRule(key, rule, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n }\n\n return null;\n }\n\n /**\n * Evaluates a single matching rule and returns result if it passes.\n *\n * @private\n * @param key - The feature flag key\n * @param rule - The rule to evaluate\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateMatchingRule(\n key: FeatureFlagKey,\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.evaluateRule(rule, context)) return null;\n\n const isInRuleRollout =\n rule.rolloutPercentage === undefined ||\n isInRollout(createRolloutIdentifier(key, context?.userId), rule.rolloutPercentage);\n\n if (!isInRuleRollout) return null;\n\n return {\n flagKey: key,\n value: rule.value,\n isEnabled: isTruthy(rule.value),\n reason: 'rule_match',\n matchedRuleId: rule.id,\n evaluatedAt: evaluatedAt ?? new Date(),\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Evaluates a single rule against the provided context.\n * All conditions in the rule must match (AND logic).\n *\n * @private\n * @param rule - The rule to evaluate\n * @param context - Context to evaluate against\n * @returns true if the rule matches the context\n */\n private evaluateRule(\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (rule.conditions.length === 0) return true;\n\n // All conditions must match (AND logic)\n return rule.conditions.every(condition => this.evaluateCondition(condition, context));\n }\n\n /**\n * Evaluates a single condition against the provided context.\n *\n * @private\n * @param condition - The condition to evaluate\n * @param context - Context to evaluate against\n * @returns true if the condition matches\n */\n private evaluateCondition(\n condition: FeatureFlagCondition,\n context?: FeatureFlagContext\n ): boolean {\n if (!context) return false;\n\n const contextValue = ContextUtils.getContextValue(condition.field, context);\n if (contextValue === undefined) return false;\n\n return evaluateConditionOperator(condition, contextValue);\n }\n\n /**\n * Logs debug information if logging is enabled.\n *\n * @private\n * @param args - Arguments to log\n */\n private log(...args: unknown[]): void {\n if (this.isLoggingEnabled) {\n console.log('[FeatureFlagEngine]', ...args);\n }\n }\n}\n","/* eslint-disable no-undef */\n/**\n * Memory Cache Strategy\n *\n * In-memory cache implementation for fast local caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory cache strategy implementation\n * @version 1.0.0\n */\n\nimport type { CacheStrategy, CacheEntry, CacheStats, MemoryCacheConfig } from '@plyaz/types';\nimport { CACHE_MAX_SIZE_DEFAULT, CACHE_CLEANUP_INTERVAL_DEFAULT } from '@plyaz/config';\n\n/**\n * In-memory cache strategy implementation.\n * Provides fast caching for single-instance applications.\n *\n * @class MemoryCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new MemoryCacheStrategy({\n * maxEntries: 500,\n * cleanupInterval: 30000\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class MemoryCacheStrategy implements CacheStrategy {\n private cache = new Map<string, CacheEntry>();\n private accessOrder = new Map<string, number>();\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n };\n private cleanupTimer?: NodeJS.Timeout;\n private readonly maxSize: number;\n private readonly cleanupInterval: number;\n private readonly onEvict?: (key: string, entry: CacheEntry) => void;\n\n /**\n * Creates a new memory cache strategy.\n *\n * @param config - Memory cache configuration\n */\n constructor(config: MemoryCacheConfig = {}) {\n const defaultConfig = {\n maxEntries: CACHE_MAX_SIZE_DEFAULT,\n cleanupInterval: CACHE_CLEANUP_INTERVAL_DEFAULT,\n };\n\n this.maxSize = config.maxSize ?? config.maxEntries ?? defaultConfig.maxEntries;\n this.cleanupInterval = config.cleanupInterval ?? defaultConfig.cleanupInterval;\n this.onEvict = config.onEvict;\n\n // Start cleanup timer\n this.startCleanup();\n }\n\n /**\n * Stores a cache entry in memory.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n // If maxSize is 0, don't store anything\n if (this.maxSize === 0) {\n this.stats.sets++;\n return;\n }\n\n // Check if we need to evict entries to make room\n // Only evict if this is a new key and we're at capacity\n if (!this.cache.has(key) && this.cache.size >= this.maxSize) {\n this.evictOldestEntries();\n }\n\n this.cache.set(key, entry);\n this.accessOrder.set(key, Date.now());\n this.stats.sets++;\n }\n\n /**\n * Retrieves a cache entry from memory.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Removes a cache entry from memory.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n this.stats.deletes++;\n }\n\n /**\n * Clears all cache entries from memory.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n this.cache.clear();\n this.accessOrder.clear();\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.sets = 0;\n this.stats.deletes = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const totalRequests = this.stats.hits + this.stats.misses;\n const hitRatio = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n size: this.cache.size,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the memory cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n await this.clear();\n }\n\n /**\n * Starts the periodic cleanup of expired entries.\n *\n * @private\n */\n private startCleanup(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredEntries();\n }, this.cleanupInterval);\n\n if (this.cleanupTimer && typeof this.cleanupTimer.unref === 'function') {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Removes expired entries from the cache.\n *\n * @private\n */\n private cleanupExpiredEntries(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, entry] of Array.from(this.cache.entries())) {\n if (now > entry.expiresAt) {\n expiredKeys.push(key);\n }\n }\n\n for (const key of expiredKeys) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n\n /**\n * Evicts the oldest entries when cache is full.\n * Uses LRU-like eviction by removing the oldest entries by creation time.\n *\n * @private\n */\n private evictOldestEntries(): void {\n if (this.maxSize === 0) {\n // If maxSize is 0, don't store anything\n this.cache.clear();\n this.accessOrder.clear();\n return;\n }\n\n const EVICTION_PERCENTAGE = 0.1; // Evict 10% of entries\n const entriesToEvict = Math.max(1, Math.ceil(this.maxSize * EVICTION_PERCENTAGE));\n\n // Sort by access time (LRU)\n const sortedEntries = Array.from(this.accessOrder.entries())\n .sort(([, timeA], [, timeB]) => timeA - timeB)\n .slice(0, entriesToEvict);\n\n for (const [key] of sortedEntries) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n}\n","/**\n * Redis Cache Strategy\n *\n * Redis-based cache implementation for distributed caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis cache strategy implementation\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type { CacheStrategy, CacheEntry, CacheStats, RedisCacheConfig } from '@plyaz/types';\nimport type { Redis as IoRedisClientType } from 'ioredis';\n\n/**\n * Redis cache strategy implementation.\n * Provides distributed caching for multi-instance applications.\n *\n * @class RedisCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new RedisCacheStrategy({\n * url: 'redis://localhost:6379',\n * keyPrefix: 'app:cache:'\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class RedisCacheStrategy implements CacheStrategy {\n private client!: IoRedisClientType;\n private stats = {\n hitCount: 0,\n missCount: 0,\n setCount: 0,\n deleteCount: 0,\n };\n private isConnected = false;\n private readonly keyPrefix: string;\n\n /**\n * Creates a new Redis cache strategy.\n *\n * @param config - Redis cache configuration\n */\n constructor(private config: RedisCacheConfig) {\n if (!config.url) {\n throw new Error('Redis URL is required');\n }\n this.keyPrefix = config.keyPrefix ?? 'cache:';\n }\n\n /**\n * Stores a cache entry in Redis.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = JSON.stringify(entry);\n\n // Calculate TTL in seconds\n const ttlMs = entry.expiresAt - Date.now();\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / TIME_CONSTANTS.MILLISECONDS_PER_SECOND));\n\n await this.client.set(redisKey, serializedEntry, 'EX', ttlSeconds);\n this.stats.setCount++;\n }\n\n /**\n * Retrieves a cache entry from Redis.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = await this.client.get(redisKey);\n\n if (!serializedEntry || typeof serializedEntry !== 'string') {\n this.stats.missCount++;\n return null;\n }\n\n try {\n const entry = JSON.parse(serializedEntry) as CacheEntry<T>;\n this.stats.hitCount++;\n return entry;\n } catch {\n // Invalid JSON, remove the corrupted entry\n await this.client.del(redisKey);\n this.stats.missCount++;\n return null;\n }\n }\n\n /**\n * Removes a cache entry from Redis.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n await this.client.del(redisKey);\n this.stats.deleteCount++;\n }\n\n /**\n * Clears all cache entries from Redis.\n * This removes all keys with the configured prefix.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n await this.ensureConnected();\n\n const pattern = `${this.keyPrefix}*`;\n\n const keys = await this.client.keys(pattern);\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n\n this.stats.hitCount = 0;\n this.stats.missCount = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n await this.ensureConnected();\n\n // Get approximate entry count\n const pattern = `${this.keyPrefix}*`;\n const keys = await this.client.keys(pattern);\n const entryCount = Array.isArray(keys) ? keys.length : 0;\n\n const totalRequests = this.stats.hitCount + this.stats.missCount;\n const hitRatio = totalRequests > 0 ? this.stats.hitCount / totalRequests : 0;\n\n return {\n hits: this.stats.hitCount,\n misses: this.stats.missCount,\n sets: this.stats.setCount,\n deletes: this.stats.deleteCount,\n size: entryCount,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the Redis cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.isConnected = false;\n }\n }\n\n /**\n * Ensures Redis connection is established.\n *\n * @private\n * @returns Promise that resolves when connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.isConnected) return;\n\n try {\n this.client = await this.createIoRedisClient();\n this.isConnected = true;\n } catch (error) {\n throw new Error(\n `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}. ` +\n 'Ensure Redis is running and accessible, and install ioredis package.'\n );\n }\n }\n\n /**\n * Creates an ioredis client.\n *\n * @private\n * @returns Promise that resolves to ioredis client\n */\n private async createIoRedisClient(): Promise<IoRedisClientType> {\n const DEFAULT_TIMEOUT = 5000;\n const defaultOptions = {\n connectTimeout: DEFAULT_TIMEOUT,\n commandTimeout: DEFAULT_TIMEOUT,\n enableOfflineQueue: false,\n } satisfies {\n connectTimeout: number;\n commandTimeout: number;\n enableOfflineQueue: boolean;\n };\n\n const Redis = await import('ioredis');\n const client = new Redis.default(this.config.url, {\n connectTimeout: this.config.connectTimeout ?? defaultOptions.connectTimeout,\n commandTimeout: this.config.commandTimeout ?? defaultOptions.commandTimeout,\n enableOfflineQueue: defaultOptions.enableOfflineQueue,\n });\n\n // Wait for connection\n await new Promise((resolve, reject) => {\n client.on('ready', resolve);\n client.on('error', reject);\n });\n\n return client;\n }\n\n /**\n * Builds a Redis key with the configured prefix.\n *\n * @private\n * @param key - Base cache key\n * @returns Redis key with prefix\n */\n private buildRedisKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n}\n","/**\n * Cache Manager - Core Caching Layer\n *\n * Main cache orchestration service that manages different caching strategies.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core caching infrastructure\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { MemoryCacheStrategy } from './strategies/memory';\nimport { RedisCacheStrategy } from './strategies/redis';\nimport type { CacheStrategy, CacheConfig, CacheEntry, CacheManagerStats } from '@plyaz/types';\n\n/**\n * Cache manager that orchestrates different caching strategies.\n * Provides a unified interface for caching across the application.\n *\n * @class CacheManager\n *\n * @example\n * ```typescript\n * const cache = new CacheManager({\n * isEnabled: true,\n * ttl: 300,\n * strategy: 'redis',\n * redisConfig: { url: 'redis://localhost:6379' }\n * });\n *\n * await cache.set('key', value);\n * const cached = await cache.get('key');\n * ```\n */\nexport class CacheManager {\n private strategy: CacheStrategy;\n\n /**\n * Creates a new cache manager with the specified configuration.\n *\n * @param config - Cache configuration\n */\n constructor(private config: CacheConfig) {\n this.strategy = this.createStrategy(config);\n }\n\n /**\n * Stores a value in the cache.\n *\n * @template T - Type of the value to cache\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - Optional TTL override in seconds\n * @returns Promise that resolves when value is cached\n */\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.config.isEnabled) return;\n\n const finalTtl = ttl ?? this.config.ttl;\n const entry: CacheEntry<T> = {\n data: value,\n expiresAt: Date.now() + finalTtl * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n createdAt: Date.now(),\n };\n\n await this.strategy.set(key, entry);\n }\n\n /**\n * Retrieves a value from the cache.\n *\n * @template T - Expected type of the cached value\n * @param key - Cache key\n * @returns Promise that resolves to cached value or null if not found/expired\n */\n async get<T>(key: string): Promise<T | null> {\n if (!this.config.isEnabled) return null;\n\n const entry = await this.strategy.get<T>(key);\n if (!entry) return null;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await this.strategy.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * Removes a value from the cache.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when value is removed\n */\n async delete(key: string): Promise<void> {\n if (!this.config.isEnabled) return;\n await this.strategy.delete(key);\n }\n\n /**\n * Clears all cached values.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n if (!this.config.isEnabled) return;\n await this.strategy.clear();\n }\n\n /**\n * Checks if a key exists in the cache.\n *\n * @param key - Cache key to check\n * @returns Promise that resolves to true if key exists and is not expired\n */\n async has(key: string): Promise<boolean> {\n if (!this.config.isEnabled) return false;\n\n const entry = await this.strategy.get(key);\n if (!entry) return false;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await this.strategy.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheManagerStats> {\n return this.strategy.getStats();\n }\n\n /**\n * Creates the appropriate cache strategy based on configuration.\n *\n * @private\n * @param config - Cache configuration\n * @returns Cache strategy instance\n */\n private createStrategy(config: CacheConfig): CacheStrategy {\n switch (config.strategy) {\n case 'redis':\n if (!config.redisConfig) {\n throw new Error('Redis configuration is required for Redis cache strategy');\n }\n return new RedisCacheStrategy(config.redisConfig);\n\n case 'memory':\n default:\n return new MemoryCacheStrategy(config.memoryConfig);\n }\n }\n\n /**\n * Disposes of the cache manager and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n await this.strategy.dispose?.();\n }\n}\n","/**\n * Feature Flag Provider - Core Implementation\n *\n * Main provider class that orchestrates feature flag evaluation and management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag provider implementation\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n FetchFeatureFlagDataResponse,\n} from '@plyaz/types';\nimport { FeatureFlagEngine } from '@engine/featureFlags/engine';\nimport { CacheManager } from '@base/cache/index';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Subscription callback function type\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Core feature flag provider that implements the main business logic.\n * This class orchestrates between the evaluation engine, caching, and data providers.\n *\n * @class FeatureFlagProvider\n * @implements {IFeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<MyFeatureFlags>(config, FEATURES);\n * await provider.initialize();\n *\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE', context);\n * const value = await provider.getValue('ROLLOUT_PERCENTAGE', context);\n * ```\n */\nexport abstract class FeatureFlagProvider<FeatureFlagKey extends string>\n implements IFeatureFlagProvider<FeatureFlagKey>\n{\n protected engine: FeatureFlagEngine<FeatureFlagKey>;\n protected cacheManager: CacheManager;\n protected subscribers = new Set<SubscriptionCallback>();\n protected refreshTimer?: ReturnType<typeof setInterval>;\n protected isInitialized = false;\n protected features: Record<FeatureFlagKey, FeatureFlagValue>;\n protected initializePromise?: Promise<void>;\n\n /**\n * Creates a new feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n protected config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n this.features = features;\n // Initialize engine with defaults from FEATURES constant\n this.engine = new FeatureFlagEngine<FeatureFlagKey>(features, config.isLoggingEnabled ?? false);\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n isEnabled: config.isCacheEnabled,\n ttl: config.cacheTtl,\n strategy: 'memory', // Default to memory, can be overridden\n });\n\n this.setupRefreshTimer();\n }\n\n /**\n * Abstract method to fetch flags and rules from the provider's data source.\n * Must be implemented by concrete provider classes.\n *\n * @protected\n * @abstract\n * @returns Promise resolving to flags and rules\n */\n protected abstract fetchData(): Promise<FetchFeatureFlagDataResponse<FeatureFlagKey>>;\n\n /**\n * Initializes the provider by loading initial data.\n *\n * @returns Promise that resolves when initialization is complete\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n // If already initializing, wait for that to complete\n if (this.initializePromise) {\n return this.initializePromise;\n }\n\n // Create and store the initialization promise\n this.initializePromise = this.doInitialize();\n return this.initializePromise;\n }\n\n /**\n * Performs the actual initialization work.\n *\n * @private\n * @returns Promise that resolves when initialization is complete\n */\n private async doInitialize(): Promise<void> {\n try {\n await this.refresh();\n this.isInitialized = true;\n this.log('Provider initialized successfully');\n } catch (error) {\n this.log('Failed to initialize provider:', error);\n // Clear the promise so initialization can be retried\n this.initializePromise = undefined;\n throw error;\n }\n }\n\n /**\n * Gets a feature flag evaluation for the specified key and context.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag evaluation\n */\n async getFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n // Check cache first if enabled\n if (this.config.isCacheEnabled) {\n const cacheKey = this.generateCacheKey(key, context);\n const cached = await this.cacheManager.get<FeatureFlagEvaluation<FeatureFlagKey>>(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Evaluate and cache the result\n const evaluation = this.engine.evaluate(key, context);\n await this.cacheManager.set(cacheKey, evaluation);\n return evaluation;\n }\n\n // Direct evaluation without caching\n return this.engine.evaluate(key, context);\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets the value of a feature flag.\n *\n * @template T - The expected type of the flag value\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag value\n */\n async getValue<T = FeatureFlagValue>(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.value as T;\n }\n\n /**\n * Gets all feature flag evaluations for the given context.\n *\n * @param context - Optional context for evaluation\n * @returns Promise resolving to record of flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const results: Record<string, FeatureFlagEvaluation<FeatureFlagKey>> = {};\n\n // First, evaluate all default flags from FEATURES\n for (const key of Object.keys(this.features) as FeatureFlagKey[]) {\n results[key] = await this.getFlag(key, context);\n }\n\n // Then, evaluate any additional flags from the engine\n const engineFlags = this.engine.getFlags();\n for (const flag of engineFlags) {\n if (!(flag.key in results)) {\n results[flag.key] = await this.getFlag(flag.key, context);\n }\n }\n\n return results;\n }\n\n /**\n * Refreshes the provider by fetching latest data from the source.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n try {\n const { flags, rules } = await this.fetchData();\n\n this.engine.setFlags(flags);\n this.engine.setRules(rules);\n\n // Clear cache after refresh\n await this.cacheManager.clear();\n\n // Notify subscribers\n this.notifySubscribers();\n\n this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);\n } catch (error) {\n this.log('Failed to refresh provider:', error);\n throw error;\n }\n }\n\n /**\n * Subscribes to provider updates.\n *\n * @param callback - Function to call when provider updates\n * @returns Unsubscribe function\n */\n subscribe(callback: SubscriptionCallback): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Sets an override for a specific flag key.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.engine.setOverride(key, value);\n void this.cacheManager.clear(); // Clear cache to ensure overrides take effect\n this.notifySubscribers();\n }\n\n /**\n * Removes an override for a specific flag key.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.engine.removeOverride(key);\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Clears all overrides.\n */\n clearOverrides(): void {\n this.engine.clearOverrides();\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Disposes of the provider, cleaning up resources.\n */\n dispose(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n\n this.subscribers.clear();\n void this.cacheManager.clear();\n this.isInitialized = false;\n\n this.log('Provider disposed');\n }\n\n /**\n * Optional method to sync features at runtime.\n * This is useful for providers that can update their features dynamically.\n *\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n */\n syncFeatures?(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void>;\n\n /**\n * Generates a cache key for flag evaluation.\n *\n * @protected\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Cache key string\n */\n protected generateCacheKey(key: FeatureFlagKey, context?: FeatureFlagContext): string {\n if (!context) {\n return key;\n }\n\n // Create a stable cache key from context\n const contextKey = JSON.stringify({\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n });\n\n return `${key}:${contextKey}`;\n }\n\n /**\n * Sets up the automatic refresh timer if configured.\n *\n * @protected\n */\n protected setupRefreshTimer(): void {\n if (this.config.refreshInterval > 0) {\n this.refreshTimer = setInterval(() => {\n void this.refresh().catch(error => {\n this.log('Auto-refresh failed:', error);\n });\n }, this.config.refreshInterval * TIME_CONSTANTS.MILLISECONDS_PER_SECOND);\n }\n }\n\n /**\n * Notifies all subscribers of provider updates.\n *\n * @protected\n */\n protected notifySubscribers(): void {\n for (const callback of Array.from(this.subscribers)) {\n try {\n callback();\n } catch (error) {\n this.log('Subscriber callback error:', error);\n }\n }\n }\n\n /**\n * Logs a message if logging is enabled.\n *\n * @protected\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[FeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * Memory Feature Flag Provider\n *\n * In-memory provider implementation that uses the FEATURES constant for flag data.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Memory-based feature flag provider that loads flags from the FEATURES constant.\n *\n * @class MemoryFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'memory',\n * isCacheEnabled: false,\n * isLoggingEnabled: true,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class MemoryFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private flags: FeatureFlag<FeatureFlagKey>[] = [];\n private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n /**\n * Creates a new memory feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n }\n\n /**\n * Fetches flags and rules from memory (FEATURES constant).\n *\n * @protected\n * @returns Promise resolving to flags and rules from memory\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n this.log('Fetching feature flags from memory (FEATURES constant)');\n\n const currentTime = new Date();\n\n // Convert FEATURES constant to FeatureFlag objects\n this.flags = Object.entries(this.features).map(([key, value]) =>\n this.createFeatureFlagFromConstant(\n key as FeatureFlagKey,\n value as FeatureFlagValue,\n currentTime\n )\n );\n\n // Memory provider doesn't have rules by default, but allows manual addition\n this.rules = [...this.getManualRules()];\n\n this.log(`Loaded ${this.flags.length} flags and ${this.rules.length} rules from memory`);\n\n return {\n flags: this.flags,\n rules: this.rules,\n };\n }\n\n /**\n * Creates a FeatureFlag object from a FEATURES constant entry.\n *\n * @private\n * @param key - The feature flag key\n * @param value - The value from FEATURES constant\n * @param currentTime - Current timestamp\n * @returns FeatureFlag object\n */\n private createFeatureFlagFromConstant(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n currentTime: Date\n ): FeatureFlag<FeatureFlagKey> {\n return {\n key,\n name: this.generateFlagName(key),\n description: `Memory-based flag for ${key}`,\n isEnabled: true,\n value,\n type: this.inferFlagType(value),\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'memory-system',\n updatedBy: 'memory-system',\n } satisfies FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Generates a human-readable name from a flag key.\n *\n * @private\n * @param key - The feature flag key\n * @returns Human-readable flag name\n */\n private generateFlagName(key: FeatureFlagKey): string {\n return key\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Infers the flag type from its value.\n *\n * @private\n * @param value - The flag value\n * @returns The inferred type\n */\n private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n return 'json';\n }\n\n /**\n * Gets manually added rules for memory provider.\n *\n * @private\n * @returns Array of manually configured rules\n */\n private getManualRules(): FeatureFlagRule<FeatureFlagKey>[] {\n return this.config.memoryRules ?? [];\n }\n\n /**\n * Validates the memory provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'memory') {\n throw new Error('Memory provider requires provider to be set to \"memory\"');\n }\n\n if (this.config.memoryRules && !Array.isArray(this.config.memoryRules)) {\n throw new Error('memoryRules must be an array if provided');\n }\n }\n\n /**\n * Adds a rule to the memory provider at runtime.\n *\n * @param rule - The rule to add\n */\n addRule(rule: FeatureFlagRule<FeatureFlagKey>): void {\n this.rules.push(rule);\n this.engine.setRules(this.rules);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Added rule: ${rule.name} for flag: ${rule.flagKey}`);\n }\n\n /**\n * Removes a rule from the memory provider.\n *\n * @param ruleId - The ID of the rule to remove\n */\n removeRule(ruleId: string): void {\n const initialCount = this.rules.length;\n this.rules = this.rules.filter(rule => rule.id !== ruleId);\n\n if (this.rules.length < initialCount) {\n this.engine.setRules(this.rules);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Removed rule with ID: ${ruleId}`);\n } else {\n this.log(`Rule with ID ${ruleId} not found`);\n }\n }\n\n /**\n * Updates a flag in memory.\n *\n * @param flagOrKey - Either a complete flag object or a flag key\n * @param value - The new value (only used when first param is a key)\n * @param updateProps - Optional properties to update (only used when first param is a key)\n */\n async updateFlag(\n flagOrKey: FeatureFlag<FeatureFlagKey> | FeatureFlagKey,\n value?: FeatureFlagValue,\n updateProps?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): Promise<void> {\n let key: FeatureFlagKey;\n let updatedFlag: FeatureFlag<FeatureFlagKey>;\n\n // Handle both signatures\n if (typeof flagOrKey === 'string') {\n // Backward compatible signature: updateFlag(key, value, updateProps)\n key = flagOrKey;\n const existingFlag = this.flags.find(f => f.key === key);\n if (!existingFlag) {\n this.log(`Flag with key ${key} not found in memory`);\n return;\n }\n\n if (value === undefined) {\n this.log(`Value is required when updating flag by key`);\n return;\n }\n\n updatedFlag = {\n ...existingFlag,\n value,\n type: this.inferFlagType(value),\n updatedAt: new Date(),\n updatedBy: 'memory-runtime',\n ...updateProps,\n };\n } else {\n // Interface signature: updateFlag(flag)\n const flag = flagOrKey;\n key = flag.key;\n updatedFlag = {\n ...flag,\n updatedAt: new Date(),\n updatedBy: flag.updatedBy || 'memory-runtime',\n };\n }\n\n const flagIndex = this.flags.findIndex(f => f.key === key);\n if (flagIndex === -1) {\n this.log(`Flag with key ${key} not found in memory`);\n return;\n }\n\n this.flags[flagIndex] = updatedFlag;\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n\n this.log(`Updated flag: ${key}`);\n }\n\n /**\n * Adds a new flag to memory at runtime.\n *\n * @param key - The flag key\n * @param value - The flag value\n * @param props - Optional flag properties\n */\n addFlag(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): void {\n if (this.flagExists(key)) {\n return;\n }\n\n const newFlag = this.createNewFlag(key, value, props);\n this.addFlagToStore(key, newFlag, value);\n }\n\n /**\n * Checks if a flag with the given key exists.\n */\n private flagExists(key: FeatureFlagKey): boolean {\n const exists = this.flags.some(flag => flag.key === key);\n if (exists) {\n this.log(`Flag with key ${key} already exists in memory`);\n }\n return exists;\n }\n\n /**\n * Creates a new flag object.\n */\n private createNewFlag(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): FeatureFlag<FeatureFlagKey> {\n const currentTime = new Date();\n const flagDefaults = this.getDefaultFlagProperties(key, value);\n const flagProps = this.mergeWithUserProps(flagDefaults, props);\n\n return {\n key,\n ...flagProps,\n value,\n type: flagDefaults.type,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'memory-runtime',\n updatedBy: 'memory-runtime',\n } satisfies FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Gets default properties for a new flag.\n */\n private getDefaultFlagProperties(\n key: FeatureFlagKey,\n value: FeatureFlagValue\n ): {\n name: string;\n description: string;\n isEnabled: boolean;\n type: 'boolean' | 'string' | 'number' | 'json';\n environment: 'all';\n rolloutPercentage: undefined;\n } {\n return {\n name: this.generateFlagName(key),\n description: `Runtime-added flag for ${key}`,\n isEnabled: true,\n type: this.inferFlagType(value),\n environment: 'all' as const,\n rolloutPercentage: undefined,\n };\n }\n\n /**\n * Merges default properties with user-provided properties.\n */\n private mergeWithUserProps(\n defaults: ReturnType<typeof this.getDefaultFlagProperties>,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n > {\n const merged = { ...defaults, ...props };\n\n // If type is provided in props, use it; otherwise use the inferred type\n if (props?.type) {\n merged.type = props.type;\n }\n\n return merged;\n }\n\n /**\n * Adds the flag to the store and notifies systems.\n */\n private addFlagToStore(\n key: FeatureFlagKey,\n newFlag: FeatureFlag<FeatureFlagKey>,\n value: FeatureFlagValue\n ): void {\n this.flags.push(newFlag);\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Added new flag: ${key} with value:`, value);\n }\n\n /**\n * Removes a flag from memory.\n *\n * @param key - The flag key to remove\n */\n removeFlag(key: FeatureFlagKey): void {\n const initialCount = this.flags.length;\n this.flags = this.flags.filter(flag => flag.key !== key);\n\n if (this.flags.length < initialCount) {\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Removed flag: ${key}`);\n } else {\n this.log(`Flag with key ${key} not found in memory`);\n }\n }\n\n /**\n * Gets all current flags in memory.\n *\n * @returns Array of current flags\n */\n getCurrentFlags(): FeatureFlag<FeatureFlagKey>[] {\n return [...this.flags];\n }\n\n /**\n * Gets all current rules in memory.\n *\n * @returns Array of current rules\n */\n getCurrentRules(): FeatureFlagRule<FeatureFlagKey>[] {\n return [...this.rules];\n }\n\n /**\n * Updates the features object and syncs all flags.\n * This allows updating the FEATURES constant at runtime.\n *\n * @param newFeatures - New features object to sync with\n */\n async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n this.log('Syncing with new FEATURES values');\n\n // Update the internal features reference\n this.features = newFeatures;\n\n // Refresh to reload all flags from the new features\n await this.refresh();\n\n this.log(`Synced ${Object.keys(newFeatures).length} features`);\n }\n\n /**\n * Resets the memory provider to its initial state.\n */\n async reset(): Promise<void> {\n this.log('Resetting memory provider to initial state');\n await this.refresh();\n }\n\n /**\n * Gets statistics about the memory provider.\n *\n * @returns Provider statistics\n */\n getStats(): {\n flagCount: number;\n ruleCount: number;\n cacheSize: number;\n subscriberCount: number;\n isInitialized: boolean;\n } {\n return {\n flagCount: this.flags.length,\n ruleCount: this.rules.length,\n cacheSize: 0, // Memory cache size would need to be tracked\n subscriberCount: this.subscribers.size,\n isInitialized: this.isInitialized,\n };\n }\n\n /**\n * Logs messages with MemoryFeatureFlagProvider prefix.\n *\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[MemoryFeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * File Feature Flag Provider\n *\n * File-based provider implementation supporting JSON and YAML configuration files.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview File provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport * as yaml from 'yaml';\nimport { FILE_CHECK_INTERVAL_DEFAULT, FORMAT_CONSTANTS } from '@plyaz/config';\n\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst access = promisify(fs.access);\nconst mkdir = promisify(fs.mkdir);\n\ninterface FileData<FeatureFlagKey extends string> {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n}\n\n/**\n * File-based feature flag provider supporting JSON and YAML formats.\n *\n * @class FileFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new FileFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'file',\n * fileConfig: {\n * filePath: './config/feature-flags.json',\n * format: 'json',\n * shouldWatchForChanges: true,\n * },\n * isCacheEnabled: true,\n * cacheTtl: 60,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class FileFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private fileWatcher?: fs.FSWatcher;\n private lastFileContent?: string;\n private fileCheckInterval?: ReturnType<typeof setInterval>;\n private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n /**\n * Creates a new file feature flag provider.\n *\n * @param config - Provider configuration with file settings\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n }\n\n /**\n * Initializes the provider and sets up file watching if enabled.\n */\n async initialize(): Promise<void> {\n await super.initialize();\n\n // Set up file watching after initialization\n if (this.config.fileConfig?.shouldWatchForChanges) {\n this.setupFileWatcher();\n }\n }\n\n /**\n * Fetches flags and rules from the configuration file.\n *\n * @protected\n * @returns Promise resolving to flags and rules from file\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n const { filePath, format } = this.config.fileConfig!;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n await access(resolvedPath, fs.constants.R_OK);\n const content = await readFile(resolvedPath, 'utf-8');\n this.lastFileContent = content;\n const data = await this.parseFileContent(content, format);\n this.validateFileData(data);\n\n // Store rules for later use\n this.rules = data.rules || [];\n\n return {\n flags: data.flags || [],\n rules: data.rules || [],\n };\n } catch (error) {\n return this.handleFetchDataError(error, resolvedPath, format);\n }\n }\n\n /**\n * Parses file content based on format.\n *\n * @private\n */\n private async parseFileContent(\n content: string,\n format: 'json' | 'yaml'\n ): Promise<FileData<FeatureFlagKey>> {\n if (format === 'json') {\n return this.parseJSON(content);\n } else if (format === 'yaml') {\n return await this.parseYAML(content);\n }\n throw new Error(`Unsupported file format: ${format}`);\n }\n\n /**\n * Handles errors for fetchData, including file creation and fallback.\n *\n * @private\n */\n private async handleFetchDataError(\n error: unknown,\n resolvedPath: string,\n format: 'json' | 'yaml'\n ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n const isFileNotFound = this.isFileNotFoundError(error);\n\n if (isFileNotFound && this.config.shouldFallbackToDefaults) {\n return await this.handleFileNotFound(resolvedPath, format);\n }\n\n this.log(`Error reading file ${resolvedPath}:`, error);\n\n if (this.config.shouldFallbackToDefaults) {\n return this.handleFallbackToDefaults();\n }\n\n throw error;\n }\n\n /**\n * Type guard for NodeJS.ErrnoException.\n */\n private isFileNotFoundError(error: unknown): error is globalThis.NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n typeof (error as globalThis.NodeJS.ErrnoException).code === 'string' &&\n (error as globalThis.NodeJS.ErrnoException).code === 'ENOENT'\n );\n }\n\n /**\n * Handles the case when the file is not found and fallback is enabled.\n */\n private async handleFileNotFound(\n resolvedPath: string,\n format: 'json' | 'yaml'\n ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n this.log(`File not found at ${resolvedPath}, creating with default values`);\n try {\n await this.createDefaultFile(resolvedPath, format);\n const content = await readFile(resolvedPath, 'utf-8');\n this.lastFileContent = content;\n const data = await this.parseFileContent(content, format);\n return {\n flags: data.flags || [],\n rules: data.rules || [],\n };\n } catch (createError) {\n this.log('Error creating default file:', createError);\n return {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n }\n }\n\n /**\n * Handles fallback to default flags and rules.\n */\n private handleFallbackToDefaults(): {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n } {\n this.log('Falling back to default values');\n return {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n }\n\n /**\n * Validates the file provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'file') {\n throw new Error('File provider requires provider to be set to \"file\"');\n }\n\n if (!this.config.fileConfig) {\n throw new Error('File configuration is required for file provider');\n }\n\n const { filePath, format } = this.config.fileConfig;\n\n if (!filePath) {\n throw new Error('File path is required');\n }\n\n if (!format || !['json', 'yaml'].includes(format)) {\n throw new Error('File format must be either \"json\" or \"yaml\"');\n }\n }\n\n /**\n * Resolves the file path, supporting relative and absolute paths.\n *\n * @private\n * @param filePath - The file path from configuration\n * @returns Resolved absolute file path\n */\n private resolveFilePath(filePath: string): string {\n // Default to src/config/feature-provider.json if not provided\n let pathToResolve = filePath;\n\n if (!pathToResolve) {\n // For ES modules, we need to calculate __dirname equivalent\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const __filename = fileURLToPath(import.meta.url);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const __dirname = path.dirname(__filename);\n pathToResolve = path.join(__dirname, '../../../config/feature-provider.json');\n }\n\n // If absolute path, return as is\n if (path.isAbsolute(pathToResolve)) {\n return pathToResolve;\n }\n\n // Resolve relative to current working directory\n return path.resolve(process.cwd(), pathToResolve);\n }\n\n /**\n * Parses JSON content.\n *\n * @private\n * @param content - File content\n * @returns Parsed data\n */\n private parseJSON(content: string): FileData<FeatureFlagKey> {\n try {\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Parses YAML content.\n *\n * @private\n * @param content - File content\n * @returns Parsed data\n */\n private async parseYAML(content: string): Promise<FileData<FeatureFlagKey>> {\n try {\n const data = yaml.parse(content) as FileData<FeatureFlagKey>;\n return data;\n } catch (error) {\n throw new Error(\n `Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validates the structure of file data.\n *\n * @private\n * @param data - Parsed file data\n */\n private validateFileData(data: unknown): void {\n if (!data || typeof data !== 'object') {\n throw new Error('File must contain a valid object');\n }\n\n const fileData = data as Record<string, unknown>;\n\n this.checkFlagsArray(fileData.flags);\n this.checkRulesArray(fileData.rules);\n }\n\n private checkFlagsArray(flags: unknown): void {\n if (flags && !Array.isArray(flags)) {\n throw new Error('\"flags\" must be an array');\n }\n if (Array.isArray(flags)) {\n this.validateFlags(flags);\n }\n }\n\n private checkRulesArray(rules: unknown): void {\n if (rules && !Array.isArray(rules)) {\n throw new Error('\"rules\" must be an array');\n }\n if (Array.isArray(rules)) {\n this.validateRules(rules);\n }\n }\n\n private validateFlags(flags: unknown[]): void {\n flags.forEach((flag: unknown, index: number) => {\n if (!flag || typeof flag !== 'object') {\n throw new Error(`Flag at index ${index} must be an object`);\n }\n const flagObj = flag as Record<string, unknown>;\n if (!flagObj.key || typeof flagObj.key !== 'string') {\n throw new Error(`Flag at index ${index} must have a \"key\" property`);\n }\n if (flagObj.value === undefined) {\n throw new Error(`Flag \"${flagObj.key}\" must have a \"value\" property`);\n }\n });\n }\n\n private validateRules(rules: unknown[]): void {\n rules.forEach((rule: unknown, index: number) => {\n if (!rule || typeof rule !== 'object') {\n throw new Error(`Rule at index ${index} must be an object`);\n }\n const ruleObj = rule as Record<string, unknown>;\n if (!ruleObj.id || typeof ruleObj.id !== 'string') {\n throw new Error(`Rule at index ${index} must have an \"id\" property`);\n }\n if (!ruleObj.flagKey || typeof ruleObj.flagKey !== 'string') {\n throw new Error(`Rule \"${ruleObj.id}\" must have a \"flagKey\" property`);\n }\n if (!Array.isArray(ruleObj.conditions)) {\n throw new Error(`Rule \"${ruleObj.id}\" must have a \"conditions\" array`);\n }\n });\n }\n\n /**\n * Creates a default configuration file with values from features.\n *\n * @private\n * @param filePath - Path where to create the file\n * @param format - File format (json or yaml)\n */\n private async createDefaultFile(filePath: string, format: 'json' | 'yaml'): Promise<void> {\n // Ensure directory exists\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n // Create default data structure\n const defaultData: FileData<FeatureFlagKey> = {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n\n // Serialize based on format\n let content: string;\n if (format === 'json') {\n content = JSON.stringify(defaultData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n } else {\n content = yaml.stringify(defaultData);\n }\n\n // Write file\n await writeFile(filePath, content, 'utf-8');\n this.log(`Created default feature flag file at: ${filePath}`);\n }\n\n /**\n * Creates default flags from the features configuration.\n *\n * @private\n * @returns Array of default flags\n */\n private createDefaultFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Object.entries(this.features).map(([key, value]) => ({\n key: key as FeatureFlagKey,\n value: value as FeatureFlagValue,\n isEnabled: true,\n name: key,\n description: `Default flag for ${key}`,\n type:\n typeof value === 'boolean'\n ? 'boolean'\n : typeof value === 'number'\n ? 'number'\n : typeof value === 'string'\n ? 'string'\n : 'json',\n environment: 'development',\n createdAt: new Date(),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n metadata: {},\n tags: [],\n }));\n }\n\n /**\n * Sets up file watching for hot reload if enabled.\n *\n * @private\n */\n private setupFileWatcher(): void {\n if (!this.config.fileConfig?.shouldWatchForChanges) {\n return;\n }\n\n const { filePath } = this.config.fileConfig;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n // Use fs.watch for file system events\n this.fileWatcher = fs.watch(resolvedPath, async eventType => {\n if (eventType === 'change') {\n this.log(`File changed: ${resolvedPath}`);\n\n // Debounce rapid changes\n if (this.fileCheckInterval) {\n clearTimeout(this.fileCheckInterval);\n }\n\n this.fileCheckInterval = setTimeout(async () => {\n try {\n // Check if content actually changed\n const content = await readFile(resolvedPath, 'utf-8');\n if (content !== this.lastFileContent) {\n this.log('File content changed, refreshing...');\n await this.refresh();\n }\n } catch (error) {\n this.log('Error reading changed file:', error);\n }\n }, this.config.fileConfig?.fileCheckInterval ?? FILE_CHECK_INTERVAL_DEFAULT); // Use configured interval or default\n }\n });\n\n this.log(`File watching enabled for: ${resolvedPath}`);\n } catch (error) {\n this.log(`Failed to set up file watching: ${error}`);\n // File watching is optional, so we don't throw\n }\n }\n\n /**\n * Disposes of the file provider and stops file watching.\n */\n dispose(): void {\n super.dispose();\n\n if (this.fileWatcher) {\n this.fileWatcher.close();\n this.fileWatcher = undefined;\n this.log('File watching stopped');\n }\n\n if (this.fileCheckInterval) {\n clearTimeout(this.fileCheckInterval);\n this.fileCheckInterval = undefined;\n }\n }\n\n /**\n * Refreshes the provider by fetching latest data from the file.\n * Overrides base class to store rules.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n // Just call parent refresh - it will call fetchData and set everything properly\n await super.refresh();\n }\n\n /**\n * Updates the features object and writes to file.\n * This allows updating the FEATURES at runtime and persisting to file.\n *\n * @param newFeatures - New features object to sync with\n */\n async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n this.log('Syncing with new FEATURES values and updating file');\n\n // Update the internal features reference\n this.features = newFeatures;\n\n // Create new file data with updated features\n const fileData: FileData<FeatureFlagKey> = {\n flags: this.createDefaultFlags(),\n rules: this.rules || [],\n };\n\n // Write to file\n const { filePath, format } = this.config.fileConfig!;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n let content: string;\n if (format === 'json') {\n content = JSON.stringify(fileData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n } else {\n content = yaml.stringify(fileData);\n }\n\n await writeFile(resolvedPath, content, 'utf-8');\n this.lastFileContent = content;\n\n // Update engine defaults before refresh\n this.engine.updateDefaults(newFeatures);\n\n // Refresh to reload from file (this will trigger watchers if enabled)\n await this.refresh();\n\n this.log(`Synced ${Object.keys(newFeatures).length} features to file: ${resolvedPath}`);\n } catch (error) {\n this.log('Error syncing features to file:', error);\n throw new Error(\n `Failed to sync features to file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Gets information about the file provider.\n *\n * @returns File provider information\n */\n getFileInfo(): {\n filePath?: string;\n resolvedPath?: string;\n format?: string;\n isWatchEnabled: boolean;\n isImplemented: boolean;\n lastModified?: Date;\n } {\n const filePath = this.config.fileConfig?.filePath;\n const resolvedPath = filePath ? this.resolveFilePath(filePath) : undefined;\n\n let lastModified: Date | undefined;\n if (resolvedPath) {\n try {\n const stats = fs.statSync(resolvedPath);\n lastModified = stats.mtime;\n } catch {\n // File might not exist\n }\n }\n\n return {\n filePath,\n resolvedPath,\n format: this.config.fileConfig?.format,\n isWatchEnabled: Boolean(this.config.fileConfig?.shouldWatchForChanges),\n isImplemented: true,\n lastModified,\n };\n }\n}\n","/**\n * Redis Feature Flag Provider\n *\n * Redis-based provider implementation supporting distributed caching and storage.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Redis-based feature flag provider supporting distributed caching and storage.\n *\n * @class RedisFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new RedisFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'redis',\n * redisConfig: {\n * url: 'redis://localhost:6379',\n * keyPrefix: 'feature_flags',\n * },\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class RedisFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n /**\n * Creates a new Redis feature flag provider.\n *\n * @param config - Provider configuration with Redis settings\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n throw new Error('Redis provider requires @plyaz/core on Cache implementation');\n }\n\n /**\n * Fetches flags and rules from Redis storage.\n *\n * @protected\n * @returns Promise resolving to flags and rules from Redis\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'Redis Provider is not yet fully implemented. ' +\n 'This requires integration with the cache layer.\\n\\n' +\n 'Required Implementation:\\n' +\n '1. Integrate with cache/strategies/redis.ts\\n' +\n '2. Implement Redis data storage patterns\\n' +\n '3. Add Redis client management\\n' +\n '4. Set up data serialization/deserialization\\n' +\n '5. Add connection health monitoring\\n' +\n '6. Implement Redis key management strategies\\n\\n' +\n 'Redis Storage Patterns:\\n' +\n '- Hash-based storage (recommended)\\n' +\n '- List-based storage\\n' +\n '- String/JSON storage\\n\\n' +\n 'Key Structure:\\n' +\n '- {prefix}:flags - Feature flags hash\\n' +\n '- {prefix}:rules - Targeting rules list\\n' +\n '- {prefix}:overrides - Manual overrides hash\\n' +\n '- {prefix}:meta - Metadata and versioning\\n\\n' +\n 'Example Configuration:\\n' +\n '{\\n' +\n ' provider: \"redis\",\\n' +\n ' redisConfig: {\\n' +\n ' url: \"redis://localhost:6379\",\\n' +\n ' keyPrefix: \"plyaz:feature_flags\"\\n' +\n ' },\\n' +\n ' isCacheEnabled: true,\\n' +\n ' cacheTtl: 300\\n' +\n '}\\n\\n' +\n 'Redis Provider Benefits:\\n' +\n '- Distributed caching across instances\\n' +\n '- Real-time flag updates\\n' +\n '- Persistent storage option\\n' +\n '- High performance evaluation\\n\\n' +\n 'Migration Note: This provider will be moved to @plyaz/core/src/domain/featureFlags/providers/\\n' +\n 'It should integrate with the cache layer at @plyaz/core/src/cache/strategies/redis.ts'\n );\n }\n\n /**\n * Validates the Redis provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'redis') {\n throw new Error('Redis provider requires provider to be set to \"redis\"');\n }\n\n if (!this.config.redisConfig) {\n throw new Error('Redis configuration is required for Redis provider');\n }\n\n if (!this.config.redisConfig.url) {\n throw new Error('Redis URL is required');\n }\n\n if (!this.isValidRedisUrl(this.config.redisConfig.url)) {\n throw new Error('Redis URL must be a valid Redis connection string (redis:// or rediss://)');\n }\n\n // Configuration is valid, but implementation is not complete\n this.log('Redis provider configuration is valid, but implementation is not ready');\n this.log('Redis URL:', this.config.redisConfig.url);\n this.log('Key Prefix:', this.config.redisConfig.keyPrefix ?? 'feature_flags');\n }\n\n /**\n * Validates Redis URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid Redis URL\n */\n private isValidRedisUrl(url: string): boolean {\n return url.startsWith('redis://') || url.startsWith('rediss://');\n }\n\n /**\n * Gets Redis provider information.\n *\n * @returns Redis provider status information\n */\n getRedisInfo(): {\n url?: string;\n keyPrefix?: string;\n isImplemented: boolean;\n requiredImplementation: string[];\n recommendedPatterns: string[];\n } {\n return {\n url: this.config.redisConfig?.url,\n keyPrefix: this.config.redisConfig?.keyPrefix ?? 'feature_flags',\n isImplemented: false,\n requiredImplementation: [\n 'Integration with cache/strategies/redis.ts',\n 'Redis data storage patterns',\n 'Client management and health monitoring',\n 'Data serialization/deserialization',\n 'Key management strategies',\n ],\n recommendedPatterns: [\n 'Hash-based storage for flags',\n 'List-based storage for rules',\n 'Pub/Sub for real-time updates',\n 'TTL for automatic cleanup',\n ],\n };\n }\n}\n","/**\n * API Feature Flag Provider (Stub)\n *\n * API-based provider stub that requires @plyaz/api package implementation.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview API provider stub for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * API-based feature flag provider requiring @plyaz/api implementation.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // This will throw an error until @plyaz/api is implemented\n * const provider = new ApiFeatureFlagProvider({\n * provider: 'api',\n * apiEndpoint: 'https://api.plyaz.co.uk',\n * apiKey: process.env.FEATURE_FLAG_API_KEY,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class ApiFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n /**\n * Creates a new API feature flag provider.\n *\n * @param config - Provider configuration with API settings\n * @throws Error indicating that @plyaz/api implementation is required\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n throw new Error('API provider requires @plyaz/api package implementation');\n }\n\n /**\n * Fetches flags and rules from the API endpoint.\n * Currently throws an error as the API implementation is not ready.\n *\n * @protected\n * @returns Promise that rejects with implementation error\n * @throws Error indicating missing API implementation\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'API Provider is not yet implemented. ' +\n 'This requires @plyaz/api package with the following endpoints:\\n\\n' +\n 'Required API Endpoints (to be implemented in @plyaz/api):\\n' +\n '- GET /api/v1/feature-flags (get all flags)\\n' +\n '- GET /api/v1/feature-flag-rules (get all rules)\\n' +\n '- POST /api/v1/feature-flags/evaluate (evaluate flags)\\n' +\n '- POST /api/v1/feature-flags/evaluate/bulk (bulk evaluation)\\n\\n' +\n 'Required Backend Implementation:\\n' +\n '1. Install and configure @plyaz/api package\\n' +\n '2. Implement the API endpoints in NestJS modules\\n' +\n '3. Set up authentication (API key or JWT)\\n' +\n '4. Configure CORS and rate limiting\\n' +\n '5. Add request/response validation\\n' +\n '6. Set up database integration with @plyaz/db\\n\\n' +\n 'Example Configuration:\\n' +\n '{\\n' +\n ' provider: \"api\",\\n' +\n ' apiEndpoint: \"https://api.plyaz.co.uk\",\\n' +\n ' apiKey: \"your-api-key\",\\n' +\n ' isCacheEnabled: true,\\n' +\n ' cacheTtl: 300\\n' +\n '}\\n\\n' +\n 'See /docs/feature-flag-to-implement/api-requirements.md for complete implementation details.\\n\\n' +\n 'Migration Note: This provider will be moved to @plyaz/core/src/domain/featureFlags/providers/'\n );\n }\n\n /**\n * Validates the API provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid or incomplete\n */\n private validateConfig(): void {\n if (this.config.provider !== 'api') {\n throw new Error('API provider requires provider to be set to \"api\"');\n }\n\n if (!this.config.apiEndpoint) {\n throw new Error(\n 'API endpoint is required for API provider. ' +\n 'Set apiEndpoint in your configuration.\\n' +\n 'Example: apiEndpoint: \"https://api.plyaz.co.uk\"'\n );\n }\n\n if (!this.config.apiKey) {\n throw new Error(\n 'API key is required for API provider. ' +\n 'Set apiKey in your configuration.\\n' +\n 'Example: apiKey: process.env.FEATURE_FLAG_API_KEY'\n );\n }\n\n if (!this.isValidUrl(this.config.apiEndpoint)) {\n throw new Error(\n 'API endpoint must be a valid URL. ' +\n `Received: ${this.config.apiEndpoint}\\n` +\n 'Example: \"https://api.plyaz.co.uk\"'\n );\n }\n\n // Configuration is valid, but implementation is missing\n this.log('API provider configuration is valid, but implementation is not ready');\n this.log('API Endpoint:', this.config.apiEndpoint);\n this.log('API Key:', this.config.apiKey ? '[SET]' : '[MISSING]');\n }\n\n /**\n * Validates URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid URL\n */\n private isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets API provider status and configuration info.\n *\n * @returns API provider status information\n */\n getApiInfo(): {\n endpoint?: string;\n hasApiKey: boolean;\n isImplemented: boolean;\n requiredPackages: string[];\n documentationPath: string;\n } {\n return {\n endpoint: this.config.apiEndpoint,\n hasApiKey: Boolean(this.config.apiKey),\n isImplemented: false,\n requiredPackages: ['@plyaz/api'],\n documentationPath: '/docs/feature-flag-to-implement/api-requirements.md',\n };\n }\n}\n","/**\n * Database Feature Flag Provider (Stub)\n *\n * Database-based provider stub that requires @plyaz/db package implementation.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Database provider stub for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Database-based feature flag provider requiring @plyaz/db implementation.\n *\n * @class DatabaseFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // This will throw an error until @plyaz/db is implemented\n * const provider = new DatabaseFeatureFlagProvider({\n * provider: 'database',\n * databaseConfig: {\n * connectionString: process.env.DATABASE_URL,\n * tableName: 'feature_flags',\n * },\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class DatabaseFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n /**\n * Creates a new database feature flag provider.\n *\n * @param config - Provider configuration with database settings\n * @throws Error indicating that @plyaz/db implementation is required\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n throw new Error('Database provider requires @plyaz/db package implementation');\n }\n\n /**\n * Fetches flags and rules from the database.\n * Currently throws an error as the database implementation is not ready.\n *\n * @protected\n * @returns Promise that rejects with implementation error\n * @throws Error indicating missing database implementation\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'Database Provider is not yet implemented. ' +\n 'This requires @plyaz/db package with the following components:\\n\\n' +\n 'Required Database Setup:\\n' +\n '1. PostgreSQL or MySQL database\\n' +\n '2. Tables created using provided schema\\n' +\n '3. ORM implementation (Drizzle or Prisma)\\n' +\n '4. Repository pattern for data access\\n' +\n '5. NestJS modules and services\\n\\n' +\n 'Required Tables:\\n' +\n '- feature_flags (main flags table)\\n' +\n '- feature_flag_rules (targeting rules table)\\n' +\n '- feature_flag_evaluations (audit log table)\\n' +\n '- feature_flag_overrides (temporary overrides table)\\n\\n' +\n 'Database Schema:\\n' +\n 'The complete schema is provided in:\\n' +\n '/docs/feature-flag-to-implement/database-requirements.md\\n\\n' +\n 'Required Implementation Steps:\\n' +\n '1. Install and configure @plyaz/db package\\n' +\n '2. Set up database connection and ORM\\n' +\n '3. Create tables using the provided SQL schema\\n' +\n '4. Implement FeatureFlagsRepository interface\\n' +\n '5. Add NestJS modules, services, and controllers\\n' +\n '6. Set up database migrations\\n' +\n '7. Add comprehensive test coverage\\n\\n' +\n 'Example Configuration:\\n' +\n '{\\n' +\n ' provider: \"database\",\\n' +\n ' databaseConfig: {\\n' +\n ' connectionString: \"postgresql://user:pass@localhost:5432/plyaz\",\\n' +\n ' tableName: \"feature_flags\"\\n' +\n ' },\\n' +\n ' isCacheEnabled: true,\\n' +\n ' cacheTtl: 300\\n' +\n '}\\n\\n' +\n 'See /docs/feature-flag-to-implement/database-requirements.md for complete implementation details.\\n\\n' +\n 'Migration Note: This provider will be moved to @plyaz/core/src/domain/featureFlags/providers/'\n );\n }\n\n /**\n * Validates the database provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid or incomplete\n */\n private validateConfig(): void {\n this.validateProviderType();\n this.validateDatabaseConfig();\n this.validateConnectionString();\n this.logConfigurationStatus();\n }\n\n private validateProviderType(): void {\n if (this.config.provider !== 'database') {\n throw new Error('Database provider requires provider to be set to \"database\"');\n }\n }\n\n private validateDatabaseConfig(): void {\n if (!this.config.databaseConfig) {\n throw new Error(\n 'Database configuration is required for database provider. ' +\n 'Set databaseConfig in your configuration.\\n' +\n 'Example: databaseConfig: { connectionString: \"postgresql://...\", tableName: \"feature_flags\" }'\n );\n }\n }\n\n private validateConnectionString(): void {\n const { connectionString, tableName } = this.config.databaseConfig!;\n\n if (!connectionString) {\n throw new Error(\n 'Database connection string is required. ' +\n 'Set connectionString in your databaseConfig.\\n' +\n 'Example: connectionString: \"postgresql://user:pass@localhost:5432/plyaz\"'\n );\n }\n\n if (!this.isValidPostgresUrl(connectionString) && !this.isValidMysqlUrl(connectionString)) {\n throw new Error(\n 'Database connection string must be a valid PostgreSQL or MySQL URL. ' +\n `Received: ${connectionString}\\n` +\n 'Examples:\\n' +\n '- PostgreSQL: \"postgresql://user:pass@localhost:5432/plyaz\"\\n' +\n '- MySQL: \"mysql://user:pass@localhost:3306/plyaz\"'\n );\n }\n\n if (!tableName || typeof tableName !== 'string') {\n throw new Error('Database provider requires databaseConfig.tableName');\n }\n }\n\n private logConfigurationStatus(): void {\n const { connectionString, tableName } = this.config.databaseConfig!;\n // Configuration is valid, but implementation is missing\n this.log('Database provider configuration is valid, but implementation is not ready');\n this.log('Connection String:', this.maskConnectionString(connectionString));\n this.log('Table Name:', tableName ?? 'feature_flags (default)');\n }\n\n /**\n * Validates PostgreSQL URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid PostgreSQL URL\n */\n private isValidPostgresUrl(url: string): boolean {\n return url.startsWith('postgresql://') || url.startsWith('postgres://');\n }\n\n /**\n * Validates MySQL URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid MySQL URL\n */\n private isValidMysqlUrl(url: string): boolean {\n return url.startsWith('mysql://');\n }\n\n /**\n * Masks sensitive parts of connection string for logging.\n *\n * @private\n * @param connectionString - Original connection string\n * @returns Masked connection string\n */\n private maskConnectionString(connectionString: string): string {\n try {\n const url = new URL(connectionString);\n const masked = `${url.protocol}//${url.username}:****@${url.host}${url.pathname}`;\n return masked;\n } catch {\n return '[INVALID_URL]';\n }\n }\n\n /**\n * Gets database provider status and configuration info.\n *\n * @returns Database provider status information\n */\n getDatabaseInfo(): {\n connectionString?: string;\n tableName?: string;\n isImplemented: boolean;\n requiredPackages: string[];\n recommendedORM: string[];\n documentationPath: string;\n schemaPath: string;\n } {\n return {\n connectionString: this.config.databaseConfig?.connectionString\n ? this.maskConnectionString(this.config.databaseConfig.connectionString)\n : undefined,\n tableName: this.config.databaseConfig?.tableName ?? 'feature_flags',\n isImplemented: false,\n requiredPackages: ['@plyaz/db'],\n recommendedORM: ['drizzle-orm', 'prisma'],\n documentationPath: '/docs/feature-flag-to-implement/database-requirements.md',\n schemaPath: '/docs/feature-flag-to-implement/database-requirements.md#database-schema',\n };\n }\n}\n","/**\n * Feature Flag Provider Factory\n *\n * Factory class for creating and managing feature flag providers.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Provider factory for feature flag system\n * @version 1.0.0\n */\n\nimport type { FeatureFlagConfig, FeatureFlagProvider, FeatureFlagValue } from '@plyaz/types';\nimport type { FeatureFlagKey } from '../../types';\nimport { MemoryFeatureFlagProvider } from './memory';\nimport { FileFeatureFlagProvider } from './file';\nimport { RedisFeatureFlagProvider } from './redis';\nimport { ApiFeatureFlagProvider } from './api';\nimport { DatabaseFeatureFlagProvider } from './database';\nimport { FEATURE_FLAG_CACHE_TTL_DEFAULT, FEATURE_FLAG_FILE_PATHS } from '@plyaz/config';\n\n/**\n * Registry of available provider classes.\n */\nconst PROVIDER_REGISTRY = {\n memory: MemoryFeatureFlagProvider,\n file: FileFeatureFlagProvider,\n redis: RedisFeatureFlagProvider,\n api: ApiFeatureFlagProvider,\n database: DatabaseFeatureFlagProvider,\n} as const satisfies Record<\n string,\n new (\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) => FeatureFlagProvider<FeatureFlagKey>\n>;\n\n/**\n * Type for available provider names.\n */\nexport type ProviderType = keyof typeof PROVIDER_REGISTRY;\n\n/**\n * Feature flag provider factory for creating provider instances.\n *\n * @class FeatureFlagProviderFactory\n *\n * @example\n * ```typescript\n * const provider = FeatureFlagProviderFactory.create({\n * provider: 'memory',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class FeatureFlagProviderFactory {\n /**\n * Creates a new feature flag provider instance based on configuration.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Configured provider instance\n * @throws Error if provider type is unsupported or configuration is invalid\n */\n static create<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ): FeatureFlagProvider<FeatureFlagKey> {\n this.validateConfig<FeatureFlagKey>(config);\n\n const ProviderClass = PROVIDER_REGISTRY[config.provider];\n if (!ProviderClass) {\n throw new Error(\n `Unsupported provider type: ${config.provider}. ` +\n `Supported types: ${this.getSupportedProviders().join(', ')}`\n );\n }\n\n try {\n return new ProviderClass<FeatureFlagKey>(config, features);\n } catch (error) {\n throw new Error(\n `Failed to create ${config.provider} provider: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Creates a provider with automatic initialization.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Promise resolving to initialized provider instance\n */\n static async createAndInitialize<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ): Promise<FeatureFlagProvider<FeatureFlagKey>> {\n const provider = this.create(config, features);\n await provider.initialize();\n return provider;\n }\n\n /**\n * Gets a list of all supported provider types.\n *\n * @returns Array of supported provider names\n */\n static getSupportedProviders(): ProviderType[] {\n return Object.keys(PROVIDER_REGISTRY) as ProviderType[];\n }\n\n /**\n * Checks if a provider type is supported.\n *\n * @param providerType - Provider type to check\n * @returns True if provider type is supported\n */\n static isProviderSupported(providerType: string): providerType is ProviderType {\n return providerType in PROVIDER_REGISTRY;\n }\n\n /**\n * Gets provider information including implementation status.\n *\n * @returns Record of provider information\n */\n static getProvidersInfo(): Record<\n ProviderType,\n {\n name: string;\n isImplemented: boolean;\n description: string;\n requirements?: string[];\n }\n > {\n return {\n memory: {\n name: 'Memory Provider',\n isImplemented: true,\n description: 'In-memory provider using FEATURES constant',\n },\n file: {\n name: 'File Provider',\n isImplemented: true,\n description: 'File-based provider supporting JSON and YAML formats',\n },\n redis: {\n name: 'Redis Provider',\n isImplemented: true,\n description: 'Redis-based provider for distributed caching',\n requirements: ['ioredis or redis package'],\n },\n api: {\n name: 'API Provider',\n isImplemented: false,\n description: 'Remote API provider for centralized flag management',\n requirements: ['@plyaz/api package', 'API endpoints implementation'],\n },\n database: {\n name: 'Database Provider',\n isImplemented: false,\n description: 'Database provider for persistent flag storage',\n requirements: ['@plyaz/db package', 'Database schema setup'],\n },\n } satisfies Record<\n ProviderType,\n {\n name: string;\n isImplemented: boolean;\n description: string;\n requirements?: string[];\n }\n >;\n }\n\n /**\n * Creates a default provider.\n * Uses file provider if features are not provided, memory provider otherwise.\n *\n * @param features - Record of feature flag keys to their default values (optional)\n * @param overrides - Optional configuration overrides\n * @returns Provider instance\n */\n static createDefault<FeatureFlagKey extends string>(\n features?: Record<FeatureFlagKey, FeatureFlagValue>,\n overrides?: Partial<FeatureFlagConfig<FeatureFlagKey>>\n ): FeatureFlagProvider<FeatureFlagKey> {\n // If features are not provided, use file provider as default\n const provider = features ? 'memory' : 'file';\n\n const defaultConfig: FeatureFlagConfig<FeatureFlagKey> = {\n provider,\n isCacheEnabled: true,\n cacheTtl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n refreshInterval: 0, // No auto-refresh\n isLoggingEnabled: false,\n shouldFallbackToDefaults: true,\n ...overrides,\n };\n\n // Add default file config if using file provider and no fileConfig provided\n if (defaultConfig.provider === 'file' && !defaultConfig.fileConfig) {\n defaultConfig.fileConfig = {\n filePath: FEATURE_FLAG_FILE_PATHS.DEFAULT,\n format: 'json',\n shouldWatchForChanges: false,\n };\n }\n\n return this.create(defaultConfig, features ?? ({} as Record<FeatureFlagKey, FeatureFlagValue>));\n }\n\n /**\n * Type guard to check if a provider supports feature syncing.\n *\n * @param provider - The provider instance to check\n * @returns True if provider has syncFeatures method\n */\n static isSyncableProvider<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>\n ): provider is FeatureFlagProvider<FeatureFlagKey> &\n Required<Pick<FeatureFlagProvider<FeatureFlagKey>, 'syncFeatures'>> {\n return 'syncFeatures' in provider && typeof provider.syncFeatures === 'function';\n }\n\n /**\n * Updates features on a provider if it supports the syncFeatures method.\n * This is useful for providers like MemoryProvider that can update their features at runtime.\n *\n * @param provider - The provider instance\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n * @throws Error if provider doesn't support feature syncing\n */\n static async syncFeatures<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>,\n newFeatures: Record<FeatureFlagKey, FeatureFlagValue>\n ): Promise<void> {\n if (this.isSyncableProvider(provider)) {\n await provider.syncFeatures(newFeatures);\n } else {\n throw new Error(\n `Provider type does not support feature syncing. ` +\n `Only providers with syncFeatures method (like MemoryProvider and FileProvider) support this operation.`\n );\n }\n }\n\n /**\n * Checks if a provider supports feature syncing.\n *\n * @param provider - The provider instance to check\n * @returns True if provider supports syncFeatures method\n */\n static supportsFeaturesSync<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>\n ): boolean {\n return this.isSyncableProvider(provider);\n }\n\n /**\n * Validates provider configuration before instantiation.\n *\n * @private\n * @param config - Configuration to validate\n * @throws Error if configuration is invalid\n */\n public static validateConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config) {\n throw new Error('Provider configuration is required');\n }\n\n if (!config.provider) {\n throw new Error('Provider type is required in configuration');\n }\n\n if (!this.isProviderSupported(config.provider)) {\n throw new Error(\n `Unsupported provider type: ${config.provider}. ` +\n `Supported providers: ${this.getSupportedProviders().join(', ')}`\n );\n }\n\n // Validate cache configuration\n if (config.isCacheEnabled && config.cacheTtl <= 0) {\n throw new Error('Cache TTL must be greater than 0 when caching is enabled');\n }\n\n // Validate refresh interval\n if (config.refreshInterval < 0) {\n throw new Error('Refresh interval cannot be negative');\n }\n\n // Provider-specific validation\n this.validateProviderSpecificConfig(config);\n }\n\n /**\n * Validates provider-specific configuration requirements.\n *\n * @private\n * @param config - Configuration to validate\n * @throws Error if provider-specific configuration is invalid\n */\n private static validateProviderSpecificConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n const validationMap = {\n file: () => this.validateFileConfig<FeatureFlagKey>(config),\n redis: () => this.validateRedisConfig<FeatureFlagKey>(config),\n api: () => this.validateApiConfig<FeatureFlagKey>(config),\n database: () => this.validateDatabaseConfig<FeatureFlagKey>(config),\n memory: () => {}, // Memory provider has no additional requirements\n } as const satisfies Record<string, () => void>;\n\n const validator = validationMap[config.provider as keyof typeof validationMap];\n if (!validator) {\n throw new Error(`Unknown provider type: ${config.provider}`);\n }\n\n validator();\n }\n\n private static validateFileConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n // File config is optional, will use defaults if not provided\n if (config.fileConfig) {\n const { format } = config.fileConfig;\n if (format && !['json', 'yaml'].includes(format)) {\n throw new Error('File format must be either \"json\" or \"yaml\"');\n }\n }\n }\n\n private static validateRedisConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.redisConfig) {\n throw new Error('Redis configuration is required for Redis provider');\n }\n }\n\n private static validateApiConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.apiEndpoint) {\n throw new Error('API endpoint is required for API provider');\n }\n }\n\n private static validateDatabaseConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.databaseConfig) {\n throw new Error('Database configuration is required for database provider');\n }\n }\n}\n","/**\n * Feature Flags Domain - Main Exports\n *\n * This module provides the main exports for the feature flags domain logic.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Main feature flags domain exports\n * @version 1.0.0\n */\nimport type { FeatureFlagConfig, FeatureFlagOverrides } from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from './providers/factory';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES } from '@plyaz/config';\n\n// Core provider and factory\nexport { FeatureFlagProvider } from './provider';\nexport { FeatureFlagProviderFactory } from './providers/factory';\nexport type { ProviderType } from './providers/factory';\n\n// Individual providers\nexport { MemoryFeatureFlagProvider } from './providers/memory';\nexport { FileFeatureFlagProvider } from './providers/file';\nexport { RedisFeatureFlagProvider } from './providers/redis';\nexport { ApiFeatureFlagProvider } from './providers/api';\nexport { DatabaseFeatureFlagProvider } from './providers/database';\n\n/**\n * Default configuration for feature flags.\n * Provides sensible defaults for most use cases.\n */\nexport const DEFAULT_FEATURE_FLAG_CONFIG = {\n provider: 'memory',\n isCacheEnabled: true,\n cacheTtl: 300, // 5 minutes\n refreshInterval: 0, // No auto-refresh\n shouldFallbackToDefaults: true,\n isLoggingEnabled: false,\n} as const satisfies Partial<FeatureFlagConfig<FeatureFlagKey>>;\n\n/**\n * Feature flag system initialization for different environments.\n */\nexport const FeatureFlagSystem = {\n /**\n * Initialize for frontend/client applications.\n */\n initializeForFrontend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n const finalConfig = {\n ...DEFAULT_FEATURE_FLAG_CONFIG,\n ...config,\n } as FeatureFlagConfig<FeatureFlagKey>;\n const provider = FeatureFlagProviderFactory.create(finalConfig, FEATURES);\n await provider.initialize();\n return provider;\n },\n\n /**\n * Initialize for backend/server applications.\n */\n initializeForBackend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n const finalConfig = {\n ...DEFAULT_FEATURE_FLAG_CONFIG,\n ...config,\n } as FeatureFlagConfig<FeatureFlagKey>;\n const provider = FeatureFlagProviderFactory.create(finalConfig, FEATURES);\n await provider.initialize();\n return provider;\n },\n\n /**\n * Initialize for testing environments.\n */\n initializeForTesting: async (overrides: FeatureFlagOverrides<FeatureFlagKey> = {}) => {\n const provider = FeatureFlagProviderFactory.createDefault(FEATURES, {\n provider: 'memory',\n isCacheEnabled: false,\n isLoggingEnabled: false,\n });\n await provider.initialize();\n\n // Apply test overrides\n Object.entries(overrides).forEach(([key, value]) => {\n provider.setOverride(key as FeatureFlagKey, value);\n });\n\n return provider;\n },\n} as const;\n","/**\n * Feature Flag Controller\n *\n * NestJS controller for feature flag management.\n * Provides REST API endpoints for feature flag operations.\n *\n * @fileoverview NestJS controller for feature flags\n * @version 1.0.0\n */\n\nimport {\n Controller,\n Get,\n Post,\n Put,\n Delete,\n Query,\n Param,\n Body,\n HttpStatus,\n HttpException,\n} from '@nestjs/common';\nimport type {\n FeatureFlagValue,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlag,\n FeatureFlagRule,\n} from '@plyaz/types';\nimport type { FeatureFlagService } from './feature-flag.service';\nimport type { FeatureFlagKey } from '@domain/types';\n\n/**\n * Request DTO for flag evaluation.\n */\ninterface EvaluateFlagRequest {\n context?: FeatureFlagContext;\n}\n\n/**\n * Request DTO for creating/updating flags.\n */\ninterface CreateFlagRequest {\n name: string;\n description?: string;\n value: FeatureFlagValue;\n isEnabled?: boolean;\n environment?: 'all' | 'development' | 'staging' | 'production';\n rolloutPercentage?: number;\n}\n\n/**\n * Feature Flag Controller\n *\n * Provides REST endpoints for feature flag management and evaluation.\n *\n * @example\n * ```typescript\n * // GET /feature-flags/AUTH_GOOGLE/evaluate\n * // POST /feature-flags\n * // PUT /feature-flags/AUTH_GOOGLE\n * ```\n */\n@Controller('feature-flags')\nexport class FeatureFlagController {\n constructor(private readonly featureFlagService: FeatureFlagService) {}\n\n /**\n * Evaluates a feature flag for the given context.\n *\n * @param key - Feature flag key\n * @param body - Evaluation context\n * @returns Feature flag evaluation result\n */\n @Post(':key/evaluate')\n async evaluateFlag(\n @Param('key') key: FeatureFlagKey,\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.evaluateFlag(key, body.context);\n } catch (error) {\n throw new HttpException(\n `Failed to evaluate flag: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - Feature flag key\n * @param body - Evaluation context\n * @returns Boolean indicating if flag is enabled\n */\n @Post(':key/enabled')\n async isEnabled(\n @Param('key') key: FeatureFlagKey,\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<{ isEnabled: boolean }> {\n try {\n const isEnabled = await this.featureFlagService.isEnabled(key, body.context);\n return { isEnabled };\n } catch (error) {\n throw new HttpException(\n `Failed to check flag status: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Gets all feature flags with their evaluations.\n *\n * @param body - Evaluation context\n * @returns All feature flag evaluations\n */\n @Post('evaluate-all')\n async evaluateAllFlags(\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n try {\n return await this.featureFlagService.getAllFlags(body.context);\n } catch (error) {\n throw new HttpException(\n `Failed to evaluate all flags: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Creates a new feature flag.\n *\n * @param key - Feature flag key\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n @Post()\n async createFlag(\n @Body() createData: CreateFlagRequest & { key: FeatureFlagKey }\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.createFlag(createData);\n } catch (error) {\n throw new HttpException(\n `Failed to create flag: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n @Put(':key')\n async updateFlag(\n @Param('key') key: FeatureFlagKey,\n @Body() updateData: Partial<CreateFlagRequest>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.updateFlag(key, updateData);\n } catch (error) {\n throw new HttpException(\n `Failed to update flag: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Deletes a feature flag.\n *\n * @param key - Feature flag key\n */\n @Delete(':key')\n async deleteFlag(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.deleteFlag(key);\n return { isSuccessful: true };\n } catch (error) {\n throw new HttpException(\n `Failed to delete flag: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Sets a manual override for a flag.\n *\n * @param key - Feature flag key\n * @param value - Override value\n */\n @Post(':key/override')\n async setOverride(\n @Param('key') key: FeatureFlagKey,\n @Body('value') value: FeatureFlagValue\n ): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.setOverride(key, value);\n return { isSuccessful: true };\n } catch (error) {\n throw new HttpException(\n `Failed to set override: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Removes a manual override for a flag.\n *\n * @param key - Feature flag key\n */\n @Delete(':key/override')\n async removeOverride(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.removeOverride(key);\n return { isSuccessful: true };\n } catch (error) {\n throw new HttpException(\n `Failed to remove override: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Gets all available feature flags.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n @Get()\n async getAllFeatureFlags(\n @Query('environment') environment?: string\n ): Promise<FeatureFlag<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagService.getAllFeatureFlags(environment);\n } catch (error) {\n throw new HttpException(\n `Failed to get flags: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n @Get(':key/rules')\n async getFlagRules(\n @Param('key') key: FeatureFlagKey\n ): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagService.getFlagRules(key);\n } catch (error) {\n throw new HttpException(\n `Failed to get flag rules: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.BAD_REQUEST\n );\n }\n }\n\n /**\n * Forces a refresh of the feature flag cache.\n */\n @Post('refresh')\n async refreshCache(): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.refreshCache();\n return { isSuccessful: true };\n } catch (error) {\n throw new HttpException(\n `Failed to refresh cache: ${error instanceof Error ? error.message : 'Unknown error'}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n}\n","/**\n * Feature Flag Service\n *\n * NestJS service for feature flag business logic.\n * Orchestrates between providers, repositories, and external systems.\n *\n * @fileoverview NestJS service for feature flags\n * @version 1.0.0\n */\n\nimport type { OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport { Injectable, Logger } from '@nestjs/common';\nimport type {\n FeatureFlagValue,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagProvider,\n CreateFlagRequest,\n ProviderHealthStatus,\n} from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from '@domain/featureFlags/providers/factory';\nimport type { FeatureFlagRepository } from './feature-flag.repository';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURES } from '@plyaz/config';\n\n/**\n * Feature Flag Service\n *\n * Provides business logic for feature flag operations.\n * Manages provider lifecycle, caching, and data persistence.\n */\n@Injectable()\nexport class FeatureFlagService implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(FeatureFlagService.name);\n private provider!: FeatureFlagProvider<FeatureFlagKey>;\n\n constructor(private readonly featureFlagRepository: FeatureFlagRepository<FeatureFlagKey>) {}\n\n /**\n * Initializes the service on module startup.\n */\n async onModuleInit(): Promise<void> {\n try {\n await this.initializeProvider();\n this.logger.log('Feature flag service initialized successfully');\n } catch (error) {\n this.logger.error('Failed to initialize feature flag service', error);\n throw error;\n }\n }\n\n /**\n * Cleans up resources on module shutdown.\n */\n async onModuleDestroy(): Promise<void> {\n this.provider.dispose();\n this.logger.log('Feature flag service disposed');\n }\n\n /**\n * Initializes the feature flag provider.\n */\n private async initializeProvider(): Promise<void> {\n const DEFAULT_CACHE_TTL = 300; // 5 minutes\n\n const config: FeatureFlagConfig<FeatureFlagKey> = {\n provider:\n (process.env.FEATURE_FLAG_PROVIDER as FeatureFlagConfig<FeatureFlagKey>['provider']) ??\n 'database',\n isCacheEnabled: process.env.FEATURE_FLAG_CACHE_ENABLED === 'true',\n cacheTtl: Number(process.env.FEATURE_FLAG_CACHE_TTL) || DEFAULT_CACHE_TTL,\n refreshInterval: Number(process.env.FEATURE_FLAG_REFRESH_INTERVAL) || 0,\n shouldFallbackToDefaults: true,\n isLoggingEnabled: process.env.NODE_ENV === 'development',\n };\n\n this.provider = FeatureFlagProviderFactory.create(config, FEATURES);\n await this.provider.initialize();\n }\n\n /**\n * Gets the current provider instance.\n */\n private getProvider(): FeatureFlagProvider<FeatureFlagKey> {\n if (!this.provider) {\n throw new Error('Feature flag provider not initialized');\n }\n return this.provider;\n }\n\n /**\n * Evaluates a feature flag for the given context.\n *\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Feature flag evaluation result\n */\n async evaluateFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n try {\n const provider = this.getProvider();\n const evaluation = await provider.getFlag(key, context);\n\n this.logger.debug(`Evaluated flag ${key}: ${evaluation.isEnabled}`, {\n key,\n value: evaluation.value,\n reason: evaluation.reason,\n context,\n });\n\n return evaluation;\n } catch (error) {\n this.logger.error(`Failed to evaluate flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.evaluateFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets all feature flags with their evaluations.\n *\n * @param context - Evaluation context\n * @returns All feature flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n try {\n const provider = this.getProvider();\n const flags = await provider.getAllFlags();\n\n this.logger.debug(`Evaluated all flags for context`, {\n flagCount: Object.keys(flags).length,\n context,\n });\n\n return flags;\n } catch (error) {\n this.logger.error('Failed to evaluate all flags', error);\n throw error;\n }\n }\n\n /**\n * Creates a new feature flag.\n *\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n async createFlag(\n createData: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n const flag = await this.featureFlagRepository.createFlag(createData);\n\n // Refresh provider cache to include new flag\n await this.refreshCache();\n\n this.logger.log(`Created feature flag: ${createData.key}`);\n return flag;\n } catch (error) {\n this.logger.error(`Failed to create flag ${createData.key}`, error);\n throw error;\n }\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n const flag = await this.featureFlagRepository.updateFlag(key, updateData);\n\n // Refresh provider cache to reflect changes\n await this.refreshCache();\n\n this.logger.log(`Updated feature flag: ${key}`);\n return flag;\n } catch (error) {\n this.logger.error(`Failed to update flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Deletes a feature flag.\n *\n * @param key - Feature flag key\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n try {\n await this.featureFlagRepository.deleteFlag(key);\n\n // Refresh provider cache to remove deleted flag\n await this.refreshCache();\n\n this.logger.log(`Deleted feature flag: ${key}`);\n } catch (error) {\n this.logger.error(`Failed to delete flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Sets a manual override for a flag.\n *\n * @param key - Feature flag key\n * @param value - Override value\n */\n async setOverride(key: FeatureFlagKey, value: FeatureFlagValue): Promise<void> {\n try {\n const provider = this.getProvider();\n provider.setOverride(key, value);\n\n this.logger.log(`Set override for flag ${key}: ${value}`);\n } catch (error) {\n this.logger.error(`Failed to set override for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Removes a manual override for a flag.\n *\n * @param key - Feature flag key\n */\n async removeOverride(key: FeatureFlagKey): Promise<void> {\n try {\n const provider = this.getProvider();\n provider.removeOverride(key);\n\n this.logger.log(`Removed override for flag ${key}`);\n } catch (error) {\n this.logger.error(`Failed to remove override for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Gets all available feature flags.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n async getAllFeatureFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagRepository.getAllFlags(environment);\n } catch (error) {\n this.logger.error('Failed to get all feature flags', error);\n throw error;\n }\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n async getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagRepository.getFlagRules(key);\n } catch (error) {\n this.logger.error(`Failed to get rules for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Forces a refresh of the feature flag cache.\n */\n async refreshCache(): Promise<void> {\n try {\n const provider = this.getProvider();\n await provider.refresh();\n\n this.logger.log('Feature flag cache refreshed');\n } catch (error) {\n this.logger.error('Failed to refresh feature flag cache', error);\n throw error;\n }\n }\n\n /**\n * Gets provider health status.\n *\n * @returns Provider health information\n */\n async getHealthStatus(): Promise<ProviderHealthStatus> {\n return {\n isInitialized: !!this.provider,\n provider: 'database', // or get from config\n isCacheEnabled: true, // or get from config\n };\n }\n}\n","/**\n * Feature Flag Repository\n *\n * NestJS repository for feature flag data persistence.\n * Handles database operations and data mapping.\n *\n * @fileoverview NestJS repository for feature flags\n * @version 1.0.0\n */\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport type {\n FeatureFlagValue,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\n\n/**\n * Feature Flag Repository\n *\n * Handles all database operations for feature flags.\n * This is a stub implementation that provides the interface\n * for integration with @plyaz/db when available.\n */\n@Injectable()\nexport class FeatureFlagRepository<FeatureFlagKey extends string> {\n private readonly logger = new Logger(FeatureFlagRepository.name);\n\n // Constants for time calculations\n private static readonly ONE_DAY_MS = 86_400_000; // 24 * 60 * 60 * 1000\n\n // TODO: Inject database service when @plyaz/db is available\n // constructor(private readonly databaseService: DatabaseService) {}\n\n /**\n * Creates a new feature flag in the database.\n *\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n async createFlag(\n createData: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.log(`Creating flag: ${createData.key}`);\n\n // TODO: Implement database insertion when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(`\n // INSERT INTO feature_flags (key, name, description, value, is_enabled, environment, rollout_percentage, created_at, updated_at)\n // VALUES ($1, $2, $3, $4, $5, $6, $7, NOW(), NOW())\n // RETURNING *\n // `, [createData.key, createData.name, createData.description, JSON.stringify(createData.value),\n // createData.isEnabled ?? true, createData.environment ?? 'all', createData.rolloutPercentage]);\n\n const currentTime = new Date();\n const newFlag: FeatureFlag<FeatureFlagKey> = {\n key: createData.key,\n name: createData.name,\n description: createData.description ?? `Feature flag for ${createData.key}`,\n isEnabled: createData.isEnabled ?? true,\n value: createData.value,\n type: this.inferFlagType(createData.value),\n environment: createData.environment ?? 'all',\n rolloutPercentage: createData.rolloutPercentage,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'api',\n updatedBy: 'api',\n } satisfies FeatureFlag<FeatureFlagKey>;\n\n this.logger.debug(`Flag created: ${createData.key}`, newFlag);\n return newFlag;\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.log(`Updating flag: ${key}`);\n\n // TODO: Implement database update when @plyaz/db is available\n // Example implementation:\n // const updates = [];\n // const values = [];\n // let paramCount = 1;\n\n // if (updateData.name !== undefined) {\n // updates.push(`name = $${paramCount++}`);\n // values.push(updateData.name);\n // }\n // ... (build dynamic update query)\n\n // const result = await this.databaseService.query(`\n // UPDATE feature_flags\n // SET ${updates.join(', ')}, updated_at = NOW()\n // WHERE key = $${paramCount}\n // RETURNING *\n // `, [...values, key]);\n\n // Stub implementation - return updated flag structure\n const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n key,\n name: updateData.name ?? `Updated ${key}`,\n description: updateData.description ?? `Updated feature flag for ${key}`,\n isEnabled: updateData.isEnabled ?? true,\n value: updateData.value ?? true,\n type: updateData.value ? this.inferFlagType(updateData.value) : 'boolean',\n environment: updateData.environment ?? 'all',\n rolloutPercentage: updateData.rolloutPercentage,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS), // 1 day ago\n updatedAt: new Date(),\n createdBy: 'api',\n updatedBy: 'api',\n } satisfies FeatureFlag<FeatureFlagKey>;\n\n this.logger.debug(`Flag updated: ${key}`, updatedFlag);\n return updatedFlag;\n }\n\n /**\n * Deletes a feature flag from the database.\n *\n * @param key - Feature flag key\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n this.logger.log(`Deleting flag: ${key}`);\n\n // TODO: Implement database deletion when @plyaz/db is available\n // Example implementation:\n // await this.databaseService.query('DELETE FROM feature_flags WHERE key = $1', [key]);\n\n this.logger.debug(`Flag deleted: ${key}`);\n }\n\n /**\n * Gets all feature flags from the database.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n async getAllFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]> {\n this.logger.log(`Getting all flags${environment ? ` for environment: ${environment}` : ''}`);\n\n // TODO: Implement database query when @plyaz/db is available\n const sampleFlags = this.createSampleFlags();\n const filteredFlags = this.filterFlagsByEnvironment(sampleFlags, environment);\n\n this.logger.debug(`Retrieved ${filteredFlags.length} flags`);\n return filteredFlags;\n }\n\n /**\n * Creates sample flags for stub implementation.\n *\n * @returns Array of sample feature flags\n */\n private createSampleFlags(): FeatureFlag<FeatureFlagKey>[] {\n return [\n {\n key: 'AUTH_GOOGLE' as FeatureFlagKey,\n name: 'Google Authentication',\n description: 'Enable Google OAuth authentication',\n isEnabled: true,\n value: 'true',\n type: 'boolean',\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n },\n {\n key: 'AUTH_DISCORD' as FeatureFlagKey,\n name: 'Discord Authentication',\n description: 'Enable Discord OAuth authentication',\n isEnabled: true,\n value: 'true',\n type: 'boolean',\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n },\n ] satisfies FeatureFlag<FeatureFlagKey>[];\n }\n\n /**\n * Filters flags by environment.\n *\n * @param flags - Array of flags to filter\n * @param environment - Environment to filter by\n * @returns Filtered flags\n */\n private filterFlagsByEnvironment(\n flags: FeatureFlag<FeatureFlagKey>[],\n environment?: string\n ): FeatureFlag<FeatureFlagKey>[] {\n return environment\n ? flags.filter(flag => flag.environment === environment || flag.environment === 'all')\n : flags;\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n async getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n this.logger.log(`Getting rules for flag: ${key}`);\n\n // TODO: Implement database query when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(`\n // SELECT * FROM feature_flag_rules\n // WHERE flag_key = $1\n // ORDER BY priority DESC\n // `, [key]);\n // return result.rows.map(row => this.mapRowToRule(row));\n\n // Stub implementation - return empty rules\n const rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n this.logger.debug(`Retrieved ${rules.length} rules for flag: ${key}`);\n return rules;\n }\n\n /**\n * Gets a single feature flag by key.\n *\n * @param key - Feature flag key\n * @returns Feature flag or null if not found\n */\n async getFlagByKey(key: FeatureFlagKey): Promise<FeatureFlag<FeatureFlagKey> | null> {\n this.logger.log(`Getting flag by key: ${key}`);\n\n // TODO: Implement database query when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(\n // 'SELECT * FROM feature_flags WHERE key = $1',\n // [key]\n // );\n // return result.rows.length > 0 ? this.mapRowToFlag(result.rows[0]) : null;\n\n // Stub implementation - return null for now\n return null;\n }\n\n /**\n * Infers the type of a feature flag value.\n *\n * @param value - The flag value\n * @returns Inferred type string\n */\n private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'object' && value !== null) return 'json';\n return 'boolean'; // Default fallback\n }\n\n /**\n * Maps a database row to a FeatureFlag object.\n * This will be used when @plyaz/db is available.\n *\n * @param row - Database row\n * @returns Mapped feature flag\n */\n // private mapRowToFlag(row: any): FeatureFlag {\n // return {\n // key: row.key,\n // name: row.name,\n // description: row.description,\n // isEnabled: row.is_enabled,\n // value: JSON.parse(row.value),\n // type: row.type,\n // environment: row.environment,\n // rolloutPercentage: row.rollout_percentage,\n // createdAt: row.created_at,\n // updatedAt: row.updated_at,\n // createdBy: row.created_by,\n // updatedBy: row.updated_by,\n // } satisfies FeatureFlag;\n // }\n\n /**\n * Maps a database row to a FeatureFlagRule object.\n * This will be used when @plyaz/db is available.\n *\n * @param row - Database row\n * @returns Mapped feature flag rule\n */\n // private mapRowToRule(row: any): FeatureFlagRule {\n // return {\n // id: row.id,\n // flagKey: row.flag_key,\n // name: row.name,\n // description: row.description,\n // isEnabled: row.is_enabled,\n // priority: row.priority,\n // conditions: JSON.parse(row.conditions),\n // value: JSON.parse(row.value),\n // rolloutPercentage: row.rollout_percentage,\n // createdAt: row.created_at,\n // updatedAt: row.updated_at,\n // createdBy: row.created_by,\n // updatedBy: row.updated_by,\n // } satisfies FeatureFlagRule;\n // }\n}\n","/**\n * Feature Flag Module\n *\n * NestJS module for feature flag functionality.\n * Configures providers, controllers, and dependencies.\n *\n * @fileoverview NestJS module for feature flags\n * @version 1.0.0\n */\n\nimport { Module, Global } from '@nestjs/common';\nimport { FeatureFlagController } from './feature-flag.controller';\nimport { FeatureFlagService } from './feature-flag.service';\nimport { FeatureFlagRepository } from './feature-flag.repository';\n\n/**\n * Feature Flag Module\n *\n * Provides feature flag functionality as a NestJS module.\n * Can be imported by other modules to access feature flag services.\n *\n * @example\n * ```typescript\n * // In your app.module.ts\n * import { FeatureFlagModule } from '@plyaz/config/backend/featureFlags';\n *\n * @Module({\n * imports: [FeatureFlagModule],\n * // ... other module configuration\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // In your service\n * import { FeatureFlagService } from '@plyaz/config/backend/featureFlags';\n *\n * @Injectable()\n * export class MyService {\n * constructor(private readonly featureFlagService: FeatureFlagService) {}\n *\n * async doSomething() {\n * const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');\n * if (isEnabled) {\n * // Execute new feature logic\n * }\n * }\n * }\n * ```\n */\n@Global()\n@Module({\n controllers: [FeatureFlagController],\n providers: [FeatureFlagService, FeatureFlagRepository],\n exports: [FeatureFlagService, FeatureFlagRepository],\n})\nexport class FeatureFlagModule {\n /**\n * Static method for importing the module with configuration.\n * This allows customization of the feature flag system.\n *\n * @param options - Module configuration options\n * @returns Configured module\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * FeatureFlagModule.forRoot({\n * provider: 'redis',\n * cacheEnabled: true,\n * cacheTtl: 600,\n * })\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n static forRoot(options?: {\n provider?: 'memory' | 'database' | 'redis' | 'api' | 'file';\n isCacheEnabled?: boolean;\n cacheTtl?: number;\n refreshInterval?: number;\n isLoggingEnabled?: boolean;\n }): {\n module: typeof FeatureFlagModule;\n providers: unknown[];\n exports: unknown[];\n } {\n // TODO: Implement configuration providers when needed\n // For now, configuration is handled via environment variables\n return {\n module: FeatureFlagModule,\n providers: [\n {\n provide: 'FEATURE_FLAG_CONFIG',\n useValue: options ?? {},\n },\n FeatureFlagService,\n FeatureFlagRepository,\n ],\n exports: [FeatureFlagService, FeatureFlagRepository],\n };\n }\n\n /**\n * Static method for importing the module asynchronously.\n * Useful when configuration depends on other services.\n *\n * @param options - Async module configuration options\n * @returns Configured async module\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * FeatureFlagModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (configService: ConfigService) => ({\n * provider: configService.get('FEATURE_FLAG_PROVIDER'),\n * cacheEnabled: configService.get('FEATURE_FLAG_CACHE_ENABLED'),\n * }),\n * })\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n static forRootAsync(options: {\n imports?: unknown[];\n inject?: unknown[];\n useFactory?: (...args: unknown[]) => unknown;\n }): {\n module: typeof FeatureFlagModule;\n imports: unknown[];\n providers: unknown[];\n exports: unknown[];\n } {\n return {\n module: FeatureFlagModule,\n imports: options.imports ?? [],\n providers: [\n {\n provide: 'FEATURE_FLAG_CONFIG',\n inject: options.inject ?? [],\n useFactory: options.useFactory ?? (() => ({})),\n },\n FeatureFlagService,\n FeatureFlagRepository,\n ],\n exports: [FeatureFlagService, FeatureFlagRepository],\n };\n }\n}\n","/**\n * Feature Flag Backend - Main Exports\n *\n * NestJS backend exports for feature flag functionality.\n * Provides controllers, services, repositories, and module for easy integration.\n *\n * @fileoverview Backend feature flags exports\n * @version 1.0.0\n */\n\n// Main module export\nexport { FeatureFlagModule } from './feature-flag.module';\n\n// Service layer exports\nexport { FeatureFlagService } from './feature-flag.service';\nexport { FeatureFlagRepository } from './feature-flag.repository';\n\n// Controller exports\nexport { FeatureFlagController } from './feature-flag.controller';\n\n/**\n * NestJS Guard for feature flag protection.\n * Use this to protect routes based on feature flag status.\n *\n * @example\n * ```typescript\n * import { UseGuards } from '@nestjs/common';\n * import { FeatureFlagGuard } from '@plyaz/config/backend/featureFlags';\n *\n * @UseGuards(FeatureFlagGuard('BETA_API'))\n * @Get('beta-endpoint')\n * async betaEndpoint() {\n * // This endpoint is only accessible when BETA_API flag is enabled\n * }\n * ```\n */\nexport function FeatureFlagGuard() {\n // TODO: Implement NestJS guard when needed\n // This is a placeholder for the guard implementation\n return function (\n _target: object,\n _propertyName: string,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n // Guard implementation would go here\n // For now, just return the original method\n return descriptor;\n };\n}\n\n/**\n * NestJS Decorator for feature flag checking.\n * Use this to check feature flags within methods.\n *\n * @example\n * ```typescript\n * import { FeatureFlag } from '@plyaz/config/backend/featureFlags';\n *\n * @Injectable()\n * export class MyService {\n * @FeatureFlag('NEW_ALGORITHM')\n * async processData(data: any) {\n * // This method behavior can be controlled by the NEW_ALGORITHM flag\n * }\n * }\n * ```\n */\nexport function FeatureFlag() {\n // TODO: Implement NestJS decorator when needed\n // This is a placeholder for the decorator implementation\n return function (\n _target: object,\n _propertyName: string,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n // Decorator implementation would go here\n // For now, just return the original method\n return descriptor;\n };\n}\n","/**\n * Feature Flag Provider Component\n *\n * React context provider for feature flags system.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview React provider for feature flag context\n * @version 1.0.0\n */\n\nimport React from 'react';\nimport { createContext, useEffect, useState, useCallback, useRef } from 'react';\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContextValue,\n FeatureFlagProviderProps,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from '@domain/featureFlags/providers/factory';\nimport type { FeatureFlagKey } from '@domain/types';\n\n/**\n * React context for feature flag provider.\n * Using string as the base type to support any feature flag key.\n */\nexport const FeatureFlagContext = createContext<FeatureFlagContextValue<FeatureFlagKey> | null>(\n null\n);\n\n/**\n * Feature Flag Provider component that manages the feature flag system.\n * Provides context for accessing feature flags throughout the React component tree.\n *\n * @param props - Provider configuration and options\n * @returns JSX element providing feature flag context\n *\n * @example\n * ```typescript\n * // Basic usage\n * function App() {\n * return (\n * <FeatureFlagAppProvider\n * config={{\n * provider: 'memory',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }}\n * features={FEATURES}\n * >\n * <MyApplication />\n * </FeatureFlagAppProvider>\n * );\n * }\n *\n * // With custom context and callbacks\n * function App() {\n * const featureFlagConfig = {\n * provider: 'api' as const,\n * apiEndpoint: 'https://api.example.com',\n * apiKey: process.env.REACT_APP_FF_API_KEY,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * };\n *\n * const defaultContext = {\n * environment: 'production' as const,\n * userId: getCurrentUserId(),\n * userRole: getCurrentUserRole(),\n * };\n *\n * return (\n * <FeatureFlagAppProvider\n * config={featureFlagConfig}\n * features={FEATURES}\n * defaultContext={defaultContext}\n * onReady={(provider) => console.log('Feature flags ready!')}\n * onError={(error) => console.error('Feature flag error:', error)}\n * showLoading\n * >\n * <MyApplication />\n * </FeatureFlagAppProvider>\n * );\n * }\n * ```\n */\n// eslint-disable-next-line max-lines-per-function\nexport function FeatureFlagAppProvider<\n FeatureFlags extends Record<FeatureFlagKey, FeatureFlagValue>,\n>({\n config,\n // defaultContext: _defaultContext,\n children,\n features,\n onReady,\n onError,\n isShowLoading = false,\n loadingComponent,\n errorComponent,\n}: FeatureFlagProviderProps<FeatureFlagKey, FeatureFlags>): React.ReactElement {\n // State management\n const [state, setState] = useState<{\n provider: IFeatureFlagProvider<FeatureFlagKey> | null;\n isInitialized: boolean;\n isLoading: boolean;\n error: Error | null;\n lastUpdated: Date | null;\n }>({\n provider: null,\n isInitialized: false,\n isLoading: true,\n error: null,\n lastUpdated: null,\n });\n\n // Ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n // Initialize provider\n const initializeProvider = useCallback(async (): Promise<void> => {\n try {\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n // Create and initialize provider\n const provider = FeatureFlagProviderFactory.create<FeatureFlagKey>(config, features);\n await provider.initialize();\n\n if (isMountedRef.current) {\n setState({\n provider,\n isInitialized: true,\n isLoading: false,\n error: null,\n lastUpdated: new Date(),\n });\n\n // Call onReady callback\n onReady?.(provider);\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error('Failed to initialize feature flags');\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n error: errorObj,\n }));\n\n // Call onError callback\n onError?.(errorObj);\n }\n }\n }, [config, onReady, onError]);\n\n // Manual refresh function\n const refresh = useCallback(async (): Promise<void> => {\n if (!state.provider) {\n await initializeProvider();\n return;\n }\n\n try {\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n await state.provider.refresh();\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n lastUpdated: new Date(),\n }));\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error('Failed to refresh feature flags');\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n error: errorObj,\n }));\n\n onError?.(errorObj);\n }\n }\n }, [state.provider, initializeProvider, onError]);\n\n // Initialize on mount\n useEffect(() => {\n void initializeProvider();\n }, [initializeProvider]);\n\n // Subscribe to provider updates\n useEffect(() => {\n if (!state.provider) return;\n\n const unsubscribe = state.provider.subscribe(() => {\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n lastUpdated: new Date(),\n }));\n }\n });\n\n return unsubscribe;\n }, [state.provider]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n if (state.provider) {\n state.provider.dispose();\n }\n };\n }, [state.provider]);\n\n // Handle loading state\n if (state.isLoading && isShowLoading) {\n if (loadingComponent) {\n const LoadingComponent = loadingComponent;\n return <LoadingComponent />;\n }\n return <div>Loading feature flags...</div>;\n }\n\n // Handle error state\n if (state.error && errorComponent) {\n const ErrorComponent = errorComponent;\n return <ErrorComponent error={state.error} retry={initializeProvider} />;\n }\n\n // Don't render children if provider is not available\n if (!state.provider) {\n return <div>Feature flag provider not available</div>;\n }\n\n // Create context value\n const contextValue: FeatureFlagContextValue<FeatureFlagKey> = {\n provider: state.provider,\n isInitialized: state.isInitialized,\n isLoading: state.isLoading,\n error: state.error,\n lastUpdated: state.lastUpdated,\n refresh,\n };\n\n return <FeatureFlagContext.Provider value={contextValue}>{children}</FeatureFlagContext.Provider>;\n}\n\n// Set display name for proper identification in testing\nFeatureFlagAppProvider.displayName = 'FeatureFlagAppProvider';\n\n/**\n * Higher-order component for providing feature flag context.\n * Alternative to using the FeatureFlagAppProvider component directly.\n *\n * @param config - Feature flag configuration\n * @param options - Additional provider options\n * @returns HOC function that wraps components with feature flag provider\n *\n * @example\n * ```typescript\n * const withFeatureFlags = createFeatureFlagProvider({\n * provider: 'memory',\n * isCacheEnabled: true,\n * }, {\n * features: FEATURES\n * });\n *\n * const AppWithFeatureFlags = withFeatureFlags(App);\n * ```\n */\nexport function createFeatureFlagProvider<\n FeatureFlags extends Record<FeatureFlagKey, FeatureFlagValue>,\n>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n options?: Pick<\n FeatureFlagProviderProps<FeatureFlagKey, FeatureFlags>,\n 'defaultContext' | 'onReady' | 'onError' | 'features'\n >\n) {\n return function withFeatureFlags<P extends object>(\n component: React.ComponentType<P>\n ): React.ComponentType<P> {\n const WrappedComponent = (props: P): React.ReactElement => (\n <FeatureFlagAppProvider\n config={config}\n features={options?.features ?? ({} as FeatureFlags)}\n {...options}\n >\n {React.createElement(component, props)}\n </FeatureFlagAppProvider>\n );\n\n WrappedComponent.displayName = `withFeatureFlags(${component.displayName ?? component.name})`;\n\n return WrappedComponent;\n };\n}\n","/**\n * useFeatureFlagProvider Hook\n *\n * React hook for accessing the feature flag provider from context.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Provider access hook for feature flags\n * @version 1.0.0\n */\n\nimport { useContext } from 'react';\nimport { FeatureFlagContext } from '../providers/FeatureFlagProvider';\nimport type { FeatureFlagProvider, FeatureFlagContextValue } from '@plyaz/types';\n\n/**\n * Hook for accessing the feature flag provider from React context.\n * Must be used within a FeatureFlagProvider component.\n *\n * @returns Feature flag provider instance\n * @throws Error if used outside of FeatureFlagProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const provider = useFeatureFlagProvider<FeatureFlagKey>();\n *\n * const handleRefresh = async () => {\n * await provider.refresh();\n * };\n *\n * return <button onClick={handleRefresh}>Refresh Flags</button>;\n * }\n * ```\n */\nexport function useFeatureFlagProvider<\n FeatureFlagKey extends string,\n>(): FeatureFlagProvider<FeatureFlagKey> {\n const context = useContext(FeatureFlagContext) as FeatureFlagContextValue<FeatureFlagKey> | null;\n\n if (!context) {\n throw new Error(\n 'useFeatureFlagProvider must be used within a FeatureFlagAppProvider. ' +\n 'Make sure to wrap your component tree with <FeatureFlagAppProvider>.'\n );\n }\n\n return context.provider;\n}\n\n/**\n * Hook for accessing the feature flag provider status.\n * Provides information about provider initialization and health.\n *\n * @returns Provider status information\n *\n * @example\n * ```typescript\n * function StatusComponent() {\n * const { isInitialized, isLoading, error } = useFeatureFlagProviderStatus<FeatureFlagKey>();\n *\n * if (isLoading) return <div>Loading feature flags...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!isInitialized) return <div>Initializing...</div>;\n *\n * return <div>Feature flags ready!</div>;\n * }\n * ```\n */\nexport function useFeatureFlagProviderStatus<FeatureFlagKey extends string>(): {\n isInitialized: boolean;\n isLoading: boolean;\n error: Error | null;\n lastUpdated: Date | null | undefined;\n} {\n const context = useContext(FeatureFlagContext) as FeatureFlagContextValue<FeatureFlagKey> | null;\n\n if (!context) {\n throw new Error(\n 'useFeatureFlagProviderStatus must be used within a FeatureFlagProvider. ' +\n 'Make sure to wrap your component tree with <FeatureFlagAppProvider>.'\n );\n }\n\n return {\n isInitialized: context.isInitialized,\n isLoading: context.isLoading,\n error: context.error,\n lastUpdated: context.lastUpdated ? new Date(context.lastUpdated) : undefined,\n };\n}\n","/* eslint-disable max-lines-per-function */\n/**\n * Feature Flag Hook Helpers\n *\n * Helper functions for feature flag hooks to reduce function complexity.\n *\n * @fileoverview Helper functions for feature flag hooks\n * @version 1.0.0\n */\n\nimport type * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n FeatureFlagValue,\n FeatureFlagContext,\n FeatureFlagHook,\n FeatureFlagProvider,\n FeatureFlagState,\n} from '@plyaz/types';\n\n/**\n * Creates evaluation function for a feature flag.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @template T - The expected type of the flag value\n * @param params - Evaluation parameters\n * @param params.provider - Feature flag provider instance\n * @param params.key - Feature flag key to evaluate\n * @param params.context - Optional evaluation context\n * @param params.defaultValue - Default value if evaluation fails\n * @param setState - React state setter for flag state\n * @returns Async function that evaluates the flag\n */\nexport function createEvaluationFunction<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = string | number | boolean | Record<string, unknown>,\n>(\n params: {\n provider: FeatureFlagProvider<FeatureFlagKey> | null;\n key: FeatureFlagKey;\n context: FeatureFlagContext | undefined;\n defaultValue: T | undefined;\n },\n setState: React.Dispatch<React.SetStateAction<FeatureFlagState<FeatureFlagKey, T>>>\n): () => Promise<void> {\n const { provider, key, context, defaultValue } = params;\n return async (): Promise<void> => {\n if (!provider) return;\n\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const evaluation = await provider.getFlag(key, context);\n setState(prev => ({\n ...prev,\n value: (evaluation?.value ?? defaultValue ?? false) as T,\n isLoading: false,\n error: null,\n evaluation,\n }));\n } catch (error) {\n setState(prev => ({\n ...prev,\n value: (defaultValue ?? false) as T,\n isLoading: false,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n evaluation: null,\n }));\n }\n };\n}\n\n/**\n * Custom hook for managing feature flag evaluation logic.\n * Handles loading state, error management, and automatic evaluation.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @template T - The expected type of the flag value\n * @param key - Feature flag key to evaluate\n * @param context - Optional evaluation context\n * @param defaultValue - Default value if evaluation fails\n * @param provider - Feature flag provider instance\n * @returns Feature flag hook state with value, loading, error, and refresh function\n */\nexport function useFeatureFlagEvaluation<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = boolean,\n>(\n key: FeatureFlagKey,\n context: FeatureFlagContext | undefined,\n defaultValue: T | undefined,\n provider: FeatureFlagProvider<FeatureFlagKey> | null\n): FeatureFlagHook<T> {\n // State management\n const [state, setState] = useState<FeatureFlagState<FeatureFlagKey, T>>({\n value: (defaultValue ?? false) as T,\n isLoading: true,\n error: null,\n evaluation: null,\n });\n\n // Create evaluation function with memoization\n const evaluateFlag = useCallback(\n createEvaluationFunction<FeatureFlagKey, T>({ provider, key, context, defaultValue }, setState),\n [provider, key, context, defaultValue]\n );\n\n // Evaluate on mount and when dependencies change\n useEffect(() => {\n // Use setTimeout to avoid \"act\" warnings in tests\n const timer = setTimeout(() => {\n void evaluateFlag();\n }, 0);\n\n return () => clearTimeout(timer);\n }, [evaluateFlag]);\n\n return {\n value: state.value,\n isLoading: state.isLoading,\n error: state.error,\n refresh: evaluateFlag,\n };\n}\n\n/**\n * Custom hook for managing multiple feature flags evaluation.\n * Returns a record of flag states for multiple flags.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @param keys - Array of feature flag keys to evaluate\n * @param context - Optional evaluation context\n * @param defaultValue - Default value for all flags if evaluation fails\n * @param provider - Feature flag provider instance\n * @returns Record mapping flag keys to their hook states\n */\nexport function useMultipleFeatureFlagsEvaluation<FeatureFlagKey extends string>(\n keys: FeatureFlagKey[],\n context: FeatureFlagContext | undefined,\n defaultValue: FeatureFlagValue,\n provider: FeatureFlagProvider<FeatureFlagKey> | null\n): Record<string, FeatureFlagHook<FeatureFlagValue>> {\n // Initialize state for all flags\n const [flagStates, setFlagStates] = useState<\n Record<string, FeatureFlagState<FeatureFlagKey, FeatureFlagValue>>\n >(() => {\n const initialStates: Record<string, FeatureFlagState<FeatureFlagKey, FeatureFlagValue>> = {};\n keys.forEach(key => {\n initialStates[key] = {\n value: defaultValue,\n isLoading: true,\n error: null,\n evaluation: null,\n };\n });\n return initialStates;\n });\n\n // Evaluate all flags\n const evaluateFlags = useCallback(async () => {\n if (!provider) return;\n\n // Set loading state for all flags\n setFlagStates(prevStates => {\n const newStates = { ...prevStates };\n keys.forEach(key => {\n newStates[key] = {\n ...newStates[key],\n isLoading: true,\n error: null,\n };\n });\n return newStates;\n });\n\n // Evaluate all flags concurrently\n const evaluations = await Promise.allSettled(\n keys.map(async key => {\n try {\n const evaluation = await provider.getFlag(key, context);\n return { key, evaluation, error: null };\n } catch (error) {\n return {\n key,\n evaluation: null,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n };\n }\n })\n );\n\n // Update states with results\n setFlagStates(prevStates => {\n const newStates = { ...prevStates };\n evaluations.forEach((result, index) => {\n const key = keys[index];\n if (result.status === 'fulfilled') {\n const { evaluation, error } = result.value;\n newStates[key] = {\n value: evaluation?.value ?? defaultValue,\n isLoading: false,\n error,\n evaluation,\n };\n }\n });\n return newStates;\n });\n }, [keys, provider, context, defaultValue]);\n\n // Evaluate on mount and when dependencies change\n useEffect(() => {\n const timer = setTimeout(() => {\n void evaluateFlags();\n }, 0);\n\n return () => clearTimeout(timer);\n }, [evaluateFlags]);\n\n // Create individual refresh functions for each flag\n const refreshFunctions = useMemo(() => {\n const refreshFns: Record<string, () => Promise<void>> = {};\n\n keys.forEach(key => {\n refreshFns[key] = async () => {\n if (!provider) return;\n\n setFlagStates(prev => ({\n ...prev,\n [key]: { ...prev[key], isLoading: true, error: null },\n }));\n\n try {\n const evaluation = await provider.getFlag(key, context);\n setFlagStates(prev => ({\n ...prev,\n [key]: {\n value: evaluation?.value ?? defaultValue,\n isLoading: false,\n error: null,\n evaluation,\n },\n }));\n } catch (error) {\n setFlagStates(prev => ({\n ...prev,\n [key]: {\n value: defaultValue,\n isLoading: false,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n evaluation: null,\n },\n }));\n }\n };\n });\n\n return refreshFns;\n }, [keys, provider, context, defaultValue]);\n\n // Build the return object\n return useMemo(() => {\n const result: Record<string, FeatureFlagHook<FeatureFlagValue>> = {};\n\n keys.forEach(key => {\n const state = flagStates[key] ?? {\n value: defaultValue,\n isLoading: true,\n error: null,\n evaluation: null,\n };\n\n result[key] = {\n value: state.value,\n isLoading: state.isLoading,\n error: state.error,\n refresh: refreshFunctions[key] ?? (async () => {}),\n };\n });\n\n return result;\n }, [keys, flagStates, refreshFunctions, defaultValue]);\n}\n","/**\n * useFeatureFlag Hook\n *\n * React hook for accessing individual feature flags with caching and real-time updates.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview React hook for feature flag access\n * @version 1.0.0\n */\n\nimport { useEffect, useCallback } from 'react';\nimport type { FeatureFlagValue, FeatureFlagHook, UseFeatureFlagOptions } from '@plyaz/types';\nimport { useFeatureFlagProvider } from './useFeatureFlagProvider';\nimport {\n useFeatureFlagEvaluation,\n useMultipleFeatureFlagsEvaluation,\n} from './useFeatureFlagHelpers';\n\n/**\n * React hook for accessing a single feature flag.\n * Provides real-time updates and automatic caching.\n *\n * @template T - Expected type of the flag value\n * @param key - Feature flag key to evaluate\n * @param options - Hook configuration options\n * @returns Feature flag hook state\n *\n * @example\n * ```typescript\n * // Basic usage\n * const { value: isEnabled, isLoading, error } = useFeatureFlag<FeatureFlagKey>('AUTH_GOOGLE');\n *\n * // With context and type safety\n * const { value, isLoading, refresh } = useFeatureFlag<FeatureFlagKey, number>(\n * 'ROLLOUT_PERCENTAGE',\n * {\n * context: { userId: 'user123', environment: 'production' },\n * defaultValue: 0\n * }\n * );\n *\n * // With auto-refresh disabled\n * const { value, refresh } = useFeatureFlag<FeatureFlagKey>('BETA_FEATURE', {\n * autoRefresh: false,\n * defaultValue: false\n * });\n * ```\n */\nexport function useFeatureFlag<FeatureFlagKey extends string, T extends FeatureFlagValue = boolean>(\n key: FeatureFlagKey,\n options: UseFeatureFlagOptions = {}\n): FeatureFlagHook<T> {\n const { context, isAutoRefresh = true, defaultValue, isSuspense = false } = options;\n const provider = useFeatureFlagProvider<FeatureFlagKey>();\n\n const {\n value,\n isLoading,\n error,\n refresh: evaluateFlag,\n } = useFeatureFlagEvaluation<FeatureFlagKey, T>(\n key,\n context,\n defaultValue as T | undefined,\n provider\n );\n\n // Manual refresh function\n const refresh = useCallback(async (): Promise<void> => {\n await evaluateFlag();\n }, [evaluateFlag]);\n\n // Note: Initial evaluation is handled by useFeatureFlagEvaluation hook\n\n // Subscribe to provider updates if auto-refresh is enabled\n useEffect(() => {\n if (!provider || !isAutoRefresh) return;\n\n const unsubscribe = provider.subscribe(() => {\n void evaluateFlag();\n });\n\n return unsubscribe;\n }, [provider, isAutoRefresh, evaluateFlag]);\n\n // Handle suspense mode\n if (isSuspense && isLoading) {\n // Throw the evaluation promise for React Suspense\n throw evaluateFlag();\n }\n\n return {\n value,\n isLoading,\n error,\n refresh,\n };\n}\n\n/**\n * Hook for checking if a feature flag is enabled.\n * Simplified version of useFeatureFlag that returns only boolean state.\n *\n * @param key - Feature flag key to check\n * @param options - Hook configuration options\n * @returns Boolean indicating if flag is enabled\n *\n * @example\n * ```typescript\n * const isGoogleAuthEnabled = useFeatureFlagEnabled<FeatureFlagKey>('AUTH_GOOGLE');\n * const isBetaEnabled = useFeatureFlagEnabled<FeatureFlagKey>('BETA_FEATURE', {\n * context: { userId: 'user123', environment: 'production' }\n * });\n * ```\n */\nexport function useFeatureFlagEnabled<FeatureFlagKey extends string>(\n key: FeatureFlagKey,\n options: UseFeatureFlagOptions = {}\n): boolean {\n const { value } = useFeatureFlag<FeatureFlagKey, boolean>(key, {\n ...options,\n defaultValue: options.defaultValue ?? false,\n });\n\n return value;\n}\n\n/**\n * Hook for getting a feature flag value with type safety.\n * Provides the raw value without the loading state wrapper.\n *\n * @template T - Expected type of the flag value\n * @param key - Feature flag key to get value for\n * @param options - Hook configuration options\n * @returns The flag value with type safety\n *\n * @example\n * ```typescript\n * const rolloutPercentage = useFeatureFlagValue<FeatureFlagKey, number>('ROLLOUT_PERCENTAGE', {\n * defaultValue: 0\n * });\n *\n * const theme = useFeatureFlagValue<FeatureFlagKey, 'light' | 'dark'>('UI_THEME', {\n * defaultValue: 'light'\n * });\n * ```\n */\nexport function useFeatureFlagValue<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = FeatureFlagValue,\n>(key: FeatureFlagKey, options: UseFeatureFlagOptions = {}): T {\n const { value } = useFeatureFlag<FeatureFlagKey, T>(key, options);\n return value;\n}\n\n/**\n * Hook for evaluating multiple feature flags at once.\n * Useful for loading multiple flags with a single provider call.\n *\n * @param keys - Array of feature flag keys to evaluate\n * @param options - Hook configuration options\n * @returns Map of flag keys to their hook states\n *\n * @example\n * ```typescript\n * const flags = useMultipleFeatureFlags<FeatureFlagKey>([\n * 'AUTH_GOOGLE',\n * 'AUTH_GITHUB',\n * 'BETA_FEATURE'\n * ], {\n * context: { userId: 'user123', environment: 'production' }\n * });\n *\n * const isGoogleEnabled = flags.AUTH_GOOGLE.value;\n * const isGithubEnabled = flags.AUTH_GITHUB.value;\n * ```\n */\nexport function useMultipleFeatureFlags<FeatureFlagKey extends string>(\n keys: FeatureFlagKey[],\n options: UseFeatureFlagOptions = {}\n): Record<FeatureFlagKey, FeatureFlagHook<FeatureFlagValue>> {\n const provider = useFeatureFlagProvider();\n const { context, isAutoRefresh = true, defaultValue = false } = options;\n\n const flagStates = useMultipleFeatureFlagsEvaluation(keys, context, defaultValue, provider);\n\n // Subscribe to provider updates\n useEffect(() => {\n if (!provider || !isAutoRefresh) return;\n\n const unsubscribe = provider.subscribe(() => {\n // Refresh individual flags on provider updates\n keys.forEach(key => {\n if (typeof flagStates[key]?.refresh === 'function') {\n void flagStates[key].refresh();\n }\n });\n });\n\n return unsubscribe;\n }, [provider, isAutoRefresh, flagStates, keys]);\n\n return flagStates;\n}\n","/**\n * useFeatureFlagHelpers Hook\n *\n * React hook providing helper functions for feature flag management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Helper functions hook for feature flags\n * @version 1.0.0\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type { FeatureFlagValue, FeatureFlagContext, FeatureFlagHelpers } from '@plyaz/types';\nimport { useFeatureFlagProvider } from './useFeatureFlagProvider';\n\n/**\n * Hook that provides helper functions for feature flag operations.\n * Includes override management, bulk operations, and conditional execution.\n *\n * @returns Object containing helper functions\n *\n * @example\n * ```typescript\n * const helpers = useFeatureFlagHelpers<FeatureFlagKey>();\n *\n * // Set override\n * helpers.setOverride('AUTH_GOOGLE', true);\n *\n * // Check multiple flags\n * const anyEnabled = await helpers.isAnyEnabled(['AUTH_GOOGLE', 'AUTH_GITHUB']);\n *\n * // Conditional execution\n * const result = await helpers.whenEnabled('BETA_FEATURE',\n * () => console.log('Beta feature is enabled'),\n * () => console.log('Beta feature is disabled')\n * );\n * ```\n */\nexport function useFeatureFlagHelpers<\n FeatureFlagKey extends string,\n>(): FeatureFlagHelpers<FeatureFlagKey> {\n const provider = useFeatureFlagProvider();\n\n const setOverride = useCallback(\n (key: FeatureFlagKey, value: FeatureFlagValue) => {\n provider.setOverride(key, value);\n },\n [provider]\n );\n\n const removeOverride = useCallback(\n (key: FeatureFlagKey) => {\n provider.removeOverride(key);\n },\n [provider]\n );\n\n const clearOverrides = useCallback(() => {\n provider.clearOverrides();\n }, [provider]);\n\n const refresh = useCallback(async () => {\n await provider.refresh();\n }, [provider]);\n\n const getMultipleFlags = useCallback(\n async (\n keys: FeatureFlagKey[],\n context?: FeatureFlagContext\n ): Promise<Record<FeatureFlagKey, FeatureFlagValue>> => {\n const results = {} as Record<FeatureFlagKey, FeatureFlagValue>;\n\n await Promise.all(\n keys.map(async key => {\n const evaluation = await provider.getFlag(key, context);\n results[key] = evaluation.value;\n })\n );\n\n return results;\n },\n [provider]\n );\n\n const isAnyEnabled = useCallback(\n async (keys: FeatureFlagKey[], context?: FeatureFlagContext): Promise<boolean> => {\n const evaluations = await Promise.all(keys.map(key => provider.isEnabled(key, context)));\n return evaluations.some((enabled: boolean) => enabled);\n },\n [provider]\n );\n\n const isAllEnabled = useCallback(\n async (keys: FeatureFlagKey[], context?: FeatureFlagContext): Promise<boolean> => {\n const evaluations = await Promise.all(keys.map(key => provider.isEnabled(key, context)));\n return evaluations.every((enabled: boolean) => enabled);\n },\n [provider]\n );\n\n const whenEnabled = useCallback(\n async <T>(\n key: FeatureFlagKey,\n callback: () => T | Promise<T>,\n fallback?: () => T | Promise<T>,\n context?: FeatureFlagContext\n ): Promise<T | undefined> => {\n const isEnabled = await provider.isEnabled(key, context);\n\n if (isEnabled) {\n return callback();\n } else if (fallback) {\n return fallback();\n }\n\n return undefined;\n },\n [provider]\n );\n\n return useMemo(\n () => ({\n setOverride,\n removeOverride,\n clearOverrides,\n refresh,\n getMultipleFlags,\n isAnyEnabled,\n isAllEnabled,\n whenEnabled,\n }),\n [\n setOverride,\n removeOverride,\n clearOverrides,\n refresh,\n getMultipleFlags,\n isAnyEnabled,\n isAllEnabled,\n whenEnabled,\n ]\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/common/hash.ts","../src/utils/common/values.ts","../src/utils/common/validation.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.ts","../src/base/cache/strategies/memory.ts","../src/base/cache/strategies/redis.ts","../src/base/cache/feature/caching.ts","../src/base/cache/index.ts","../src/domain/featureFlags/provider.ts","../src/domain/featureFlags/providers/memory.ts","../src/domain/featureFlags/providers/file.ts","../src/domain/featureFlags/providers/redis.ts","../src/domain/featureFlags/providers/api.ts","../src/backend/featureFlags/database/connection.ts","../src/backend/featureFlags/database/repository.ts","../src/domain/featureFlags/providers/database.ts","../src/domain/featureFlags/providers/factory.ts","../src/domain/featureFlags/index.ts","../src/backend/featureFlags/feature-flag.controller.ts","../src/backend/featureFlags/config/validation.ts","../src/backend/featureFlags/config/feature-flag.config.ts","../src/backend/featureFlags/feature-flag.service.ts","../src/backend/featureFlags/feature-flag.repository.ts","../src/backend/featureFlags/feature-flag.module.ts","../src/backend/featureFlags/decorators/feature-flag.decorator.ts","../src/backend/featureFlags/decorators/feature-disabled.decorator.ts","../src/backend/featureFlags/decorators/feature-enabled.decorator.ts","../src/backend/featureFlags/guards/feature-flag.guard.ts","../src/backend/featureFlags/middleware/feature-flag-middleware.ts","../src/backend/featureFlags/interceptors/feature-flag-logging-interceptor.ts","../src/backend/featureFlags/interceptors/error-handling-interceptor.ts","../src/frontend/featureFlags/providers/FeatureFlagProvider.tsx","../src/frontend/featureFlags/hooks/useFeatureFlagProvider.ts","../src/frontend/featureFlags/hooks/useFeatureFlagHelpers.ts","../src/frontend/featureFlags/hooks/useFeatureFlag.ts","../src/frontend/featureFlags/hooks/useFeatureFlagActions.ts","../src/services/ApiClientService.ts","../src/frontend/providers/ApiProvider.tsx"],"names":["FNV_CONSTANTS","MATH_CONSTANTS","HASH_SEED_CONSTANTS","path","FEATURE_FLAG_PROVIDERS","ISO_STANDARDS","config","CACHE_MAX_SIZE_DEFAULT","CACHE_CLEANUP_INTERVAL_DEFAULT","TIME_CONSTANTS","resolve","Caching","of","tap","Injectable","readFile","promisify","fs","writeFile","access","mkdir","fileURLToPath","yaml","FORMAT_CONSTANTS","FILE_CHECK_INTERVAL_DEFAULT","DatabaseError","DATABASE_ERROR_CODES","createDatabaseService","ADAPTER_TYPES","FEATURE_FLAG_FIELD","SORT_DIRECTION","DATABASE_TABLE","FEATURE_FLAG_RULE_FIELD","randomUUID","EVALUATION_REASONS","DATABASE_FIELDS","FEATURE_FLAG_TYPES","SYSTEM_USERS","FEATURE_FLAG_CACHE_TTL_DEFAULT","FEATURE_FLAG_FILE_PATHS","FEATURES","FeatureFlagController","BaseError","ERROR_CODES","HTTP_STATUS","Post","Body","Put","Delete","Get","Controller","ValidationError","NUMERIC_CONSTANTS","Logger","NODE_ENVIRONMENTS","FEATURE_FLAG_DEFAULTS","FeatureFlagService","FeatureFlagRepository","FeatureFlagModule","Global","Module","SetMetadata","FEATURE_FLAG_METADATA","FeatureFlagGuard","FeatureFlagMiddleware","FeatureFlagLoggingInterceptor","ErrorHandlingInterceptor","catchError","createContext","useState","useRef","useCallback","useEffect","jsx","React","useContext","useMemo","PRODUCTION_CONFIG","STAGING_CONFIG","DEVELOPMENT_CONFIG","setDefaultApiClient","ApiPackageError","PACKAGE_STATUS_CODES","API_ERROR_CODES","OPERATIONS","mergeConfigs","createApiClient","error","Fragment","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n // Handle empty string edge case early\n if (str.length === 0) return 0;\n\n // Use FNV-1a constants from config\n let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n // Process string with FNV-1a algorithm\n // Using charCodeAt is faster than alternatives and handles Unicode correctly\n for (let i = 0; i < str.length; i++) {\n // XOR with byte value then multiply by prime\n // This order (XOR first) is what makes it FNV-1a vs FNV-1\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n }\n\n // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n // This is more efficient than Math.abs() and handles edge cases better\n return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n if (percentage <= 0) return false;\n\n const hash = hashString(identifier);\n return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n const trimmedUserId = userId?.trim();\n const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n /**\n * Generates a hash-based bucket for load balancing or distribution.\n *\n * @param identifier - Unique identifier\n * @param bucketCount - Number of buckets (default: 10)\n * @returns Bucket number (0 to bucketCount-1)\n */\n getBucket: (identifier: string, bucketCount: number = 10): number => {\n return hashString(identifier) % bucketCount;\n },\n\n /**\n * Checks if an identifier falls within a specific bucket range.\n *\n * @param identifier - Unique identifier\n * @param startBucket - Starting bucket (inclusive)\n * @param endBucket - Ending bucket (inclusive)\n * @param totalBuckets - Total number of buckets (default: 100)\n * @returns true if identifier is in the bucket range\n */\n isInBucketRange: (\n identifier: string,\n startBucket: number,\n endBucket: number,\n totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n ): boolean => {\n const bucket = hashString(identifier) % totalBuckets;\n return bucket >= startBucket && bucket <= endBucket;\n },\n\n /**\n * Creates a deterministic random seed from a string.\n * Uses the improved hash function and ensures the seed is within\n * the safe range for JavaScript's Math.random seeding.\n *\n * @param str - String to convert to seed\n * @returns Deterministic seed value (0 to 2^31-1)\n */\n createSeed: (str: string): number => {\n // Use constant from config for consistency\n return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n },\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true) // true\n * isTruthy('enabled') // true\n * isTruthy('') // false\n * isTruthy('false') // false\n * isTruthy(0) // false\n * isTruthy(42) // true\n * isTruthy({}) // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n if (value === '') return true;\n const lower = value.toLowerCase().trim();\n return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n if (Array.isArray(value)) return value.length > 0;\n if (value instanceof Map || value instanceof Set) return value.size > 0;\n if (value.constructor === Object) return Object.keys(value).length > 0;\n return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return !isStringFalsy(value);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'function':\n case 'symbol':\n return true;\n case 'object':\n return isObjectTruthy(value);\n default:\n return false;\n }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true') // true\n * toBoolean('yes') // true\n * toBoolean('1') // true\n * toBoolean('false') // false\n * toBoolean('no') // false\n * toBoolean('0') // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n const lower = value.toLowerCase();\n if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return parseStringToBoolean(value, defaultValue);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'object':\n case 'function':\n return true;\n default:\n return defaultValue;\n }\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n /**\n * Checks if a value is a valid percentage (0-100).\n *\n * @param value - Value to check\n * @returns true if valid percentage\n */\n isValidPercentage: (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n },\n\n /**\n * Clamps a number to a specific range.\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\n clamp: (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Checks if a value is empty (null, undefined, empty string, empty array).\n *\n * @param value - Value to check\n * @returns true if empty\n */\n isEmpty: (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n },\n\n /**\n * Safely gets a nested property from an object.\n *\n * @param obj - Object to query\n * @param path - Dot-separated path (e.g., 'user.profile.name')\n * @param defaultValue - Default if path doesn't exist\n * @returns Property value or default\n */\n getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n if (!obj || typeof obj !== 'object') return defaultValue;\n\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return defaultValue;\n current = (current as Record<string, unknown>)[key];\n if (current === undefined) return defaultValue;\n }\n\n return current;\n },\n} as const;\n","/**\n * Validation Utility Functions\n */\n\nimport { FEATURE_FLAG_PROVIDERS } from '@plyaz/types';\n\n/**\n * Type guard to check if value is string\n */\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\n/**\n * Type guard to check if value is defined (not undefined)\n */\nexport const isDefined = <T>(value: T | undefined): value is T => value !== undefined;\n\n/**\n * Type guard to check if value is number\n */\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\n/**\n * Helper function to get all valid provider types as array\n */\nexport const getValidProviders = (): string[] => Object.values(FEATURE_FLAG_PROVIDERS);\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n * Re-exports the context builder and utilities from domain layer for convenience.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n * .setUserId('user123')\n * .setUserRole('premium')\n * .setEnvironment('production')\n * .setPlatform('web')\n * .setCustom({ subscription: 'premium', betaTester: true })\n * .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n private context: Partial<FeatureFlagContext> = {};\n\n /**\n * Sets the user ID in the context.\n *\n * @param userId - User identifier\n * @returns Builder instance for chaining\n */\n setUserId(userId: string): this {\n this.context.userId = userId;\n return this;\n }\n\n /**\n * Sets the user email in the context.\n *\n * @param userEmail - User email address\n * @returns Builder instance for chaining\n */\n setUserEmail(userEmail: string): this {\n this.context.userEmail = userEmail;\n return this;\n }\n\n /**\n * Sets the user role in the context.\n *\n * @param userRole - User role or permission level\n * @returns Builder instance for chaining\n */\n setUserRole(userRole: string): this {\n this.context.userRole = userRole;\n return this;\n }\n\n /**\n * Sets the country in the context.\n *\n * @param country - Country code (ISO 3166-1 alpha-2)\n * @returns Builder instance for chaining\n */\n setCountry(country: string): this {\n this.context.country = country;\n return this;\n }\n\n /**\n * Sets the platform in the context.\n *\n * @param platform - Platform type\n * @returns Builder instance for chaining\n */\n setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n this.context.platform = platform;\n return this;\n }\n\n /**\n * Sets the version in the context.\n *\n * @param version - Application version\n * @returns Builder instance for chaining\n */\n setVersion(version: string): this {\n this.context.version = version;\n return this;\n }\n\n /**\n * Sets the environment in the context.\n *\n * @param environment - Current environment\n * @returns Builder instance for chaining\n */\n setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n this.context.environment = environment;\n return this;\n }\n\n /**\n * Sets custom context data.\n *\n * @param custom - Custom context properties\n * @returns Builder instance for chaining\n */\n setCustom(custom: Record<string, unknown>): this {\n this.context.custom = { ...this.context.custom, ...custom };\n return this;\n }\n\n /**\n * Adds a single custom property to the context.\n *\n * @param key - Custom property key\n * @param value - Custom property value\n * @returns Builder instance for chaining\n */\n addCustomProperty(key: string, value: unknown): this {\n this.context.custom ??= {};\n this.context.custom[key] = value;\n return this;\n }\n\n /**\n * Builds the final context object.\n * Validates required fields and returns the context.\n *\n * @returns Complete feature flag context\n * @throws Error if required environment is not set\n */\n build(): FeatureFlagContext {\n return {\n environment: this.context.environment ?? 'development',\n userId: this.context.userId,\n userEmail: this.context.userEmail,\n userRole: this.context.userRole,\n country: this.context.country,\n platform: this.context.platform,\n version: this.context.version,\n custom: this.context.custom,\n } satisfies FeatureFlagContext;\n }\n\n /**\n * Clears all context data and resets the builder.\n *\n * @returns Builder instance for chaining\n */\n clear(): this {\n this.context = {};\n return this;\n }\n\n /**\n * Creates a copy of the current builder state.\n *\n * @returns New builder instance with copied context\n */\n clone(): FeatureFlagContextBuilder {\n const cloned = new FeatureFlagContextBuilder();\n cloned.context = { ...this.context };\n if (this.context.custom) {\n cloned.context.custom = { ...this.context.custom };\n }\n return cloned;\n }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n /**\n * Creates a basic context for anonymous users using the builder.\n *\n * @param environment - Target environment\n * @param platform - User platform\n * @returns Basic anonymous context\n */\n createAnonymousContext(\n environment: 'development' | 'staging' | 'production',\n platform: 'web' | 'mobile' | 'desktop' = 'web'\n ): FeatureFlagContext {\n return new FeatureFlagContextBuilder()\n .setEnvironment(environment)\n .setPlatform(platform)\n .build();\n },\n\n /**\n * Creates a context for authenticated users using the builder.\n *\n * @param params - User context parameters\n * @returns User context\n */\n createUserContext(params: {\n userId: string;\n environment: 'development' | 'staging' | 'production';\n userEmail?: string;\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n }): FeatureFlagContext {\n const builder = new FeatureFlagContextBuilder()\n .setUserId(params.userId)\n .setEnvironment(params.environment);\n\n if (params.userEmail) builder.setUserEmail(params.userEmail);\n if (params.userRole) builder.setUserRole(params.userRole);\n if (params.platform) builder.setPlatform(params.platform);\n if (params.country) builder.setCountry(params.country);\n if (params.version) builder.setVersion(params.version);\n if (params.custom) builder.setCustom(params.custom);\n\n return builder.build();\n },\n\n /**\n * Creates a testing context with minimal required fields.\n *\n * @param overrides - Optional context overrides\n * @returns Testing context\n */\n createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n return {\n environment: 'development',\n platform: 'web',\n ...overrides,\n };\n },\n\n /**\n * Validates if a context object is complete and valid.\n *\n * @param context - Context to validate\n * @returns Validation result\n */\n validateContext(context: Partial<FeatureFlagContext>): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!context.environment) {\n errors.push('Environment is required');\n } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n errors.push('Environment must be development, staging, or production');\n }\n\n if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n errors.push('Platform must be web, mobile, or desktop');\n }\n\n if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n errors.push('Country must be a 2-letter ISO country code');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Merges multiple context objects, with later contexts taking precedence.\n *\n * @param contexts - Array of contexts to merge\n * @returns Merged context\n */\n mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n const merged = contexts.reduce((acc, context) => {\n const result = {\n ...acc,\n ...context,\n };\n\n // Only merge custom if either has it\n if (acc.custom || context.custom) {\n result.custom = {\n ...acc.custom,\n ...context.custom,\n };\n }\n\n return result;\n }, {} as Partial<FeatureFlagContext>);\n\n merged.environment ??= 'development';\n\n return merged as FeatureFlagContext;\n },\n\n /**\n * Extracts a specific field value from a context.\n *\n * @param field - Field name to extract\n * @param context - Context object\n * @returns Field value or undefined\n */\n getContextValue(field: string, context: FeatureFlagContext): unknown {\n const standardFields = {\n userId: (ctx: FeatureFlagContext) => ctx.userId,\n userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n country: (ctx: FeatureFlagContext) => ctx.country,\n platform: (ctx: FeatureFlagContext) => ctx.platform,\n version: (ctx: FeatureFlagContext) => ctx.version,\n environment: (ctx: FeatureFlagContext) => ctx.environment,\n custom: (ctx: FeatureFlagContext) => ctx.custom,\n };\n\n if (field in standardFields) {\n return standardFields[field as keyof typeof standardFields](context);\n }\n\n return context.custom?.[field];\n },\n\n /**\n * Creates a context fingerprint for caching and consistency.\n *\n * @param context - Context to fingerprint\n * @returns String fingerprint\n */\n createFingerprint(context: FeatureFlagContext): string {\n const relevant = {\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n custom: context.custom,\n };\n\n // Filter out undefined values and sort keys for consistency\n const filtered = Object.entries(relevant)\n .filter(([, value]) => value !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n return JSON.stringify(filtered);\n },\n\n /**\n * Sanitizes a context by removing sensitive information.\n *\n * @param context - Context to sanitize\n * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n * @returns Sanitized context\n */\n sanitizeContext(\n context: FeatureFlagContext,\n sensitiveFields: string[] = ['userEmail']\n ): FeatureFlagContext {\n const sanitized = { ...context };\n\n // Deep copy custom object if it exists\n if (context.custom) {\n sanitized.custom = { ...context.custom };\n }\n\n for (const field of sensitiveFields) {\n if (field in sanitized) {\n delete (sanitized as Record<string, unknown>)[field];\n }\n if (sanitized.custom && field in sanitized.custom) {\n delete sanitized.custom[field];\n }\n }\n\n return sanitized;\n },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'api',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'web',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n condition: FeatureFlagCondition,\n contextValue: unknown\n): boolean {\n const { operator } = condition;\n\n if (isEqualityOperator(operator)) {\n return evaluateEqualityOperator(operator, contextValue, condition.value);\n }\n\n if (isStringOperator(operator)) {\n return evaluateStringOperator(operator, contextValue, condition.value);\n }\n\n if (isArrayOperator(operator)) {\n return evaluateArrayOperator(operator, condition.value, contextValue);\n }\n\n if (isNumericOperator(operator)) {\n return evaluateNumericOperator(operator, contextValue, condition.value);\n }\n\n return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n const isEqual = contextValue === conditionValue;\n return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Handle string contains\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // Handle array contains\n if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // For not_contains, if neither string nor array match, return true\n return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n operator: string,\n conditionValue: unknown,\n contextValue: unknown\n): boolean {\n if (!Array.isArray(conditionValue)) {\n // For not_in operator, if condition value is not an array, return true\n return operator === 'not_in';\n }\n\n const isIncluded = conditionValue.includes(contextValue);\n return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n switch (operator) {\n case 'greater_than':\n return left > right;\n case 'less_than':\n return left < right;\n default:\n return false;\n }\n}\n\nexport function evaluateNumericOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Try numeric comparison first\n const contextNum = Number(contextValue);\n const conditionNum = Number(conditionValue);\n\n if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n return compareValues(operator, contextNum, conditionNum);\n }\n\n // Fall back to string comparison for non-numeric values\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n return compareValues(operator, contextValue, conditionValue);\n }\n\n return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n /**\n * Evaluates multiple conditions with AND logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if all conditions match\n */\n evaluateConditionsAnd: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.every(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Evaluates multiple conditions with OR logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if any condition matches\n */\n evaluateConditionsOr: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.some(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Validates a condition structure.\n *\n * @param condition - Condition to validate\n * @returns Validation result\n */\n validateCondition: (\n condition: Partial<FeatureFlagCondition>\n ): {\n isValid: boolean;\n errors: string[];\n } => {\n const errors: string[] = [];\n\n if (!condition.field) {\n errors.push('Field is required');\n }\n\n if (!condition.operator) {\n errors.push('Operator is required');\n } else {\n const validOperators = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'in',\n 'not_in',\n 'greater_than',\n 'less_than',\n ];\n if (!validOperators.includes(condition.operator)) {\n errors.push(`Invalid operator: ${condition.operator}`);\n }\n }\n\n if (condition.value === undefined) {\n errors.push('Value is required');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Creates a condition object with validation.\n *\n * @param field - Context field to evaluate\n * @param operator - Comparison operator\n * @param value - Value to compare against\n * @returns Valid condition object\n */\n createCondition: (\n field: string,\n operator: FeatureFlagCondition['operator'],\n value: FeatureFlagCondition['value']\n ): FeatureFlagCondition => {\n const condition = { field, operator, value } as FeatureFlagCondition;\n const validation = ConditionUtils.validateCondition(condition);\n\n if (!validation.isValid) {\n throw new Error(`Invalid condition: ${validation.errors.join(', ')}`);\n }\n\n return condition;\n },\n} as const;\n","/**\n * Feature Flag Evaluation Engine\n *\n * Core engine for evaluating feature flags with rules, targeting, and rollouts.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag evaluation engine\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagCondition,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { isInRollout, createRolloutIdentifier, isTruthy } from '@utils/common';\nimport { ContextUtils, evaluateConditionOperator } from '@utils/featureFlags';\n\n/**\n * Core feature flag evaluation engine.\n * Handles all the logic for evaluating feature flags including rules, targeting, and rollouts.\n *\n * @class FeatureFlagEngine\n *\n * @example\n * ```typescript\n * const engine = new FeatureFlagEngine(defaultFlags, true);\n * engine.setFlags(flagsFromDatabase);\n * engine.setRules(rulesFromDatabase);\n *\n * const evaluation = engine.evaluate('AUTH_GOOGLE', context);\n * console.log(evaluation.isEnabled); // true/false\n * ```\n */\nexport class FeatureFlagEngine<FeatureFlagKey extends string> {\n /** Storage for active feature flags */\n private flags: Map<FeatureFlagKey, FeatureFlag<FeatureFlagKey>> = new Map();\n /** Storage for targeting rules, organized by flag key */\n private rules: Map<FeatureFlagKey, FeatureFlagRule<FeatureFlagKey>[]> = new Map();\n /** Storage for manual overrides (useful for testing) */\n private overrides: Map<FeatureFlagKey, FeatureFlagValue> = new Map();\n\n /**\n * Creates a new feature flag evaluation engine.\n *\n * @param defaults - Default flag values to fall back to\n * @param isLoggingEnabled - Whether to enable debug logging\n */\n constructor(\n private defaults: Record<FeatureFlagKey, FeatureFlagValue>,\n private isLoggingEnabled = false\n ) {}\n\n /**\n * Sets the active feature flags for evaluation.\n * Clears existing flags and rules before setting new ones.\n *\n * @param flags - Array of feature flags to activate\n */\n setFlags(flags: FeatureFlag<FeatureFlagKey>[]): void {\n this.flags.clear();\n this.rules.clear();\n\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n\n this.log('Loaded flags:', this.flags.size);\n }\n\n /**\n * Sets the targeting rules for feature flags.\n * Rules are automatically sorted by priority (higher numbers first).\n *\n * @param rules - Array of feature flag rules\n */\n setRules(rules: FeatureFlagRule<FeatureFlagKey>[]): void {\n this.rules.clear();\n\n for (const rule of rules) {\n const existing = this.rules.get(rule.flagKey) ?? [];\n existing.push(rule);\n // Sort by priority (higher priority first)\n existing.sort((a, b) => b.priority - a.priority);\n this.rules.set(rule.flagKey, existing);\n }\n\n this.log('Loaded rules:', rules.length);\n }\n\n /**\n * Sets a manual override for a specific flag.\n * Overrides take precedence over all other evaluation logic.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.overrides.set(key, value);\n this.log('Override set:', key, value);\n }\n\n /**\n * Removes a manual override for a specific flag.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.overrides.delete(key);\n this.log('Override removed:', key);\n }\n\n /**\n * Updates the default values for feature flags.\n * This is useful when the FEATURES constant is updated at runtime.\n *\n * @param newDefaults - New default values\n */\n updateDefaults(newDefaults: Record<FeatureFlagKey, FeatureFlagValue>): void {\n this.defaults = newDefaults;\n this.log('Updated default feature values');\n }\n\n /**\n * Clears all manual overrides.\n */\n clearOverrides(): void {\n this.overrides.clear();\n this.log('All overrides cleared');\n }\n\n /**\n * Gets all current flags.\n *\n * @returns Array of all feature flags\n */\n getFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Array.from(this.flags.values());\n }\n\n /**\n * Evaluates a feature flag and returns the complete evaluation result.\n *\n * @param key - The feature flag key to evaluate\n * @param context - Optional context for targeting\n * @returns Complete evaluation result with value and metadata\n */\n evaluate(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const evaluatedAt = new Date();\n\n // Check for override first\n const overrideResult = this.checkOverride(key, evaluatedAt);\n if (overrideResult) return overrideResult;\n\n // Get flag from storage\n const flag = this.flags.get(key);\n if (!flag) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Check if flag is disabled\n if (!flag.isEnabled) {\n return this.createDisabledEvaluation(key, evaluatedAt);\n }\n\n // Check environment\n if (!this.isEnvironmentMatch(flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Evaluate rules\n const ruleResult = this.evaluateRules(key, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n\n // Check flag-level rollout\n if (!this.isInFlagRollout(key, flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Return flag value\n return this.createFlagEvaluation(key, flag, evaluatedAt);\n }\n\n /**\n * Checks for manual override and returns evaluation if found.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Evaluation result or null if no override\n */\n private checkOverride(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.overrides.has(key)) return null;\n\n const value = this.overrides.get(key)!;\n return {\n flagKey: key,\n value,\n isEnabled: isTruthy(value),\n reason: 'override',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates default evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Default evaluation result\n */\n private createDefaultEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const defaultValue = this.defaults[key] ?? false;\n return {\n flagKey: key,\n value: defaultValue,\n isEnabled: isTruthy(defaultValue),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates disabled evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Disabled evaluation result\n */\n private createDisabledEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: false,\n isEnabled: false,\n reason: 'disabled',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates flag evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param evaluatedAt - Evaluation timestamp\n * @returns Flag evaluation result\n */\n private createFlagEvaluation(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: flag.value,\n isEnabled: isTruthy(flag.value),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Checks if environment matches for flag evaluation.\n *\n * @private\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if environment matches\n */\n private isEnvironmentMatch(\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n return flag.environment === 'all' || context?.environment === flag.environment;\n }\n\n /**\n * Checks if user is in flag-level rollout.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if user is in rollout\n */\n private isInFlagRollout(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (flag.rolloutPercentage === undefined) return true;\n const identifier = createRolloutIdentifier(key, context?.userId);\n return isInRollout(identifier, flag.rolloutPercentage);\n }\n\n /**\n * Evaluates all rules for a flag.\n *\n * @private\n * @param key - The feature flag key\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateRules(\n key: FeatureFlagKey,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n const rules = this.rules.get(key) ?? [];\n\n for (const rule of rules) {\n if (!rule.isEnabled) continue;\n\n const ruleResult = this.evaluateMatchingRule(key, rule, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n }\n\n return null;\n }\n\n /**\n * Evaluates a single matching rule and returns result if it passes.\n *\n * @private\n * @param key - The feature flag key\n * @param rule - The rule to evaluate\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateMatchingRule(\n key: FeatureFlagKey,\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.evaluateRule(rule, context)) return null;\n\n const isInRuleRollout =\n rule.rolloutPercentage === undefined ||\n isInRollout(createRolloutIdentifier(key, context?.userId), rule.rolloutPercentage);\n\n if (!isInRuleRollout) return null;\n\n return {\n flagKey: key,\n value: rule.value,\n isEnabled: isTruthy(rule.value),\n reason: 'rule_match',\n matchedRuleId: rule.id,\n evaluatedAt: evaluatedAt ?? new Date(),\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Evaluates a single rule against the provided context.\n * All conditions in the rule must match (AND logic).\n *\n * @private\n * @param rule - The rule to evaluate\n * @param context - Context to evaluate against\n * @returns true if the rule matches the context\n */\n private evaluateRule(\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (rule.conditions.length === 0) return true;\n\n // All conditions must match (AND logic)\n return rule.conditions.every(condition => this.evaluateCondition(condition, context));\n }\n\n /**\n * Evaluates a single condition against the provided context.\n *\n * @private\n * @param condition - The condition to evaluate\n * @param context - Context to evaluate against\n * @returns true if the condition matches\n */\n private evaluateCondition(\n condition: FeatureFlagCondition,\n context?: FeatureFlagContext\n ): boolean {\n if (!context) return false;\n\n const contextValue = ContextUtils.getContextValue(condition.field, context);\n if (contextValue === undefined) return false;\n\n return evaluateConditionOperator(condition, contextValue);\n }\n\n /**\n * Logs debug information if logging is enabled.\n *\n * @private\n * @param args - Arguments to log\n */\n private log(...args: unknown[]): void {\n if (this.isLoggingEnabled) {\n console.log('[FeatureFlagEngine]', ...args);\n }\n }\n}\n","/* eslint-disable no-undef */\n/**\n * Memory Cache Strategy\n *\n * In-memory cache implementation for fast local caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory cache strategy implementation\n * @version 1.0.0\n */\n\nimport type { CacheStrategy, CacheEntry, CacheStats, MemoryCacheConfig } from '@plyaz/types';\nimport { CACHE_MAX_SIZE_DEFAULT, CACHE_CLEANUP_INTERVAL_DEFAULT } from '@plyaz/config';\n\n/**\n * In-memory cache strategy implementation.\n * Provides fast caching for single-instance applications.\n *\n * @class MemoryCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new MemoryCacheStrategy({\n * maxEntries: 500,\n * cleanupInterval: 30000\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class MemoryCacheStrategy implements CacheStrategy {\n private cache = new Map<string, CacheEntry>();\n private accessOrder = new Map<string, number>();\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n };\n private cleanupTimer?: NodeJS.Timeout;\n private readonly maxSize: number;\n private readonly cleanupInterval: number;\n private readonly onEvict?: (key: string, entry: CacheEntry) => void;\n\n /**\n * Creates a new memory cache strategy.\n *\n * @param config - Memory cache configuration\n */\n constructor(config: MemoryCacheConfig = {}) {\n const defaultConfig = {\n maxEntries: CACHE_MAX_SIZE_DEFAULT,\n cleanupInterval: CACHE_CLEANUP_INTERVAL_DEFAULT,\n };\n\n this.maxSize = config.maxSize ?? config.maxEntries ?? defaultConfig.maxEntries;\n this.cleanupInterval = config.cleanupInterval ?? defaultConfig.cleanupInterval;\n this.onEvict = config.onEvict;\n\n // Start cleanup timer\n this.startCleanup();\n }\n\n /**\n * Stores a cache entry in memory.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n // If maxSize is 0, don't store anything\n if (this.maxSize === 0) {\n this.stats.sets++;\n return;\n }\n\n // Check if we need to evict entries to make room\n // Only evict if this is a new key and we're at capacity\n if (!this.cache.has(key) && this.cache.size >= this.maxSize) {\n this.evictOldestEntries();\n }\n\n this.cache.set(key, entry);\n this.accessOrder.set(key, Date.now());\n this.stats.sets++;\n }\n\n /**\n * Retrieves a cache entry from memory.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Removes a cache entry from memory.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n this.stats.deletes++;\n }\n\n /**\n * Clears all cache entries from memory.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n this.cache.clear();\n this.accessOrder.clear();\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.sets = 0;\n this.stats.deletes = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const totalRequests = this.stats.hits + this.stats.misses;\n const hitRatio = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n size: this.cache.size,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the memory cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n await this.clear();\n }\n\n /**\n * Starts the periodic cleanup of expired entries.\n *\n * @private\n */\n private startCleanup(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredEntries();\n }, this.cleanupInterval);\n\n if (this.cleanupTimer && typeof this.cleanupTimer.unref === 'function') {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Removes expired entries from the cache.\n *\n * @private\n */\n private cleanupExpiredEntries(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, entry] of Array.from(this.cache.entries())) {\n if (now > entry.expiresAt) {\n expiredKeys.push(key);\n }\n }\n\n for (const key of expiredKeys) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n\n /**\n * Evicts the oldest entries when cache is full.\n * Uses LRU-like eviction by removing the oldest entries by creation time.\n *\n * @private\n */\n private evictOldestEntries(): void {\n if (this.maxSize === 0) {\n // If maxSize is 0, don't store anything\n this.cache.clear();\n this.accessOrder.clear();\n return;\n }\n\n const EVICTION_PERCENTAGE = 0.1; // Evict 10% of entries\n const entriesToEvict = Math.max(1, Math.ceil(this.maxSize * EVICTION_PERCENTAGE));\n\n // Sort by access time (LRU)\n const sortedEntries = Array.from(this.accessOrder.entries())\n .sort(([, timeA], [, timeB]) => timeA - timeB)\n .slice(0, entriesToEvict);\n\n for (const [key] of sortedEntries) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n}\n","/**\n * Redis Cache Strategy\n *\n * Redis-based cache implementation for distributed caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis cache strategy implementation\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type { CacheStrategy, CacheEntry, CacheStats, RedisCacheConfig } from '@plyaz/types';\nimport type { Redis as IoRedisClientType } from 'ioredis';\n\n/**\n * Redis cache strategy implementation.\n * Provides distributed caching for multi-instance applications.\n *\n * @class RedisCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new RedisCacheStrategy({\n * url: 'redis://localhost:6379',\n * keyPrefix: 'app:cache:'\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class RedisCacheStrategy implements CacheStrategy {\n private client!: IoRedisClientType;\n private stats = {\n hitCount: 0,\n missCount: 0,\n setCount: 0,\n deleteCount: 0,\n };\n private isConnected = false;\n private readonly keyPrefix: string;\n\n /**\n * Creates a new Redis cache strategy.\n *\n * @param config - Redis cache configuration\n */\n constructor(private config: RedisCacheConfig) {\n if (!config.url) {\n throw new Error('Redis URL is required');\n }\n this.keyPrefix = config.keyPrefix ?? 'cache:';\n }\n\n /**\n * Stores a cache entry in Redis.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = JSON.stringify(entry);\n\n // Calculate TTL in seconds\n const ttlMs = entry.expiresAt - Date.now();\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / TIME_CONSTANTS.MILLISECONDS_PER_SECOND));\n\n await this.client.set(redisKey, serializedEntry, 'EX', ttlSeconds);\n this.stats.setCount++;\n }\n\n /**\n * Retrieves a cache entry from Redis.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = await this.client.get(redisKey);\n\n if (!serializedEntry || typeof serializedEntry !== 'string') {\n this.stats.missCount++;\n return null;\n }\n\n try {\n const entry = JSON.parse(serializedEntry) as CacheEntry<T>;\n this.stats.hitCount++;\n return entry;\n } catch {\n // Invalid JSON, remove the corrupted entry\n await this.client.del(redisKey);\n this.stats.missCount++;\n return null;\n }\n }\n\n /**\n * Removes a cache entry from Redis.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n await this.client.del(redisKey);\n this.stats.deleteCount++;\n }\n\n /**\n * Clears all cache entries from Redis.\n * This removes all keys with the configured prefix.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n await this.ensureConnected();\n\n const pattern = `${this.keyPrefix}*`;\n\n const keys = await this.client.keys(pattern);\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n\n this.stats.hitCount = 0;\n this.stats.missCount = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n await this.ensureConnected();\n\n // Get approximate entry count\n const pattern = `${this.keyPrefix}*`;\n const keys = await this.client.keys(pattern);\n const entryCount = Array.isArray(keys) ? keys.length : 0;\n\n const totalRequests = this.stats.hitCount + this.stats.missCount;\n const hitRatio = totalRequests > 0 ? this.stats.hitCount / totalRequests : 0;\n\n return {\n hits: this.stats.hitCount,\n misses: this.stats.missCount,\n sets: this.stats.setCount,\n deletes: this.stats.deleteCount,\n size: entryCount,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the Redis cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.isConnected = false;\n }\n }\n\n /**\n * Ensures Redis connection is established.\n *\n * @private\n * @returns Promise that resolves when connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.isConnected) return;\n\n try {\n this.client = await this.createIoRedisClient();\n this.isConnected = true;\n } catch (error) {\n throw new Error(\n `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}. ` +\n 'Ensure Redis is running and accessible, and install ioredis package.'\n );\n }\n }\n\n /**\n * Creates an ioredis client.\n *\n * @private\n * @returns Promise that resolves to ioredis client\n */\n private async createIoRedisClient(): Promise<IoRedisClientType> {\n const DEFAULT_TIMEOUT = 5000;\n const defaultOptions = {\n connectTimeout: DEFAULT_TIMEOUT,\n commandTimeout: DEFAULT_TIMEOUT,\n enableOfflineQueue: false,\n } satisfies {\n connectTimeout: number;\n commandTimeout: number;\n enableOfflineQueue: boolean;\n };\n\n const Redis = await import('ioredis');\n const client = new Redis.default(this.config.url, {\n connectTimeout: this.config.connectTimeout ?? defaultOptions.connectTimeout,\n commandTimeout: this.config.commandTimeout ?? defaultOptions.commandTimeout,\n enableOfflineQueue: defaultOptions.enableOfflineQueue,\n });\n\n // Wait for connection\n await new Promise((resolve, reject) => {\n client.on('ready', resolve);\n client.on('error', reject);\n });\n\n return client;\n }\n\n /**\n * Builds a Redis key with the configured prefix.\n *\n * @private\n * @param key - Base cache key\n * @returns Redis key with prefix\n */\n private buildRedisKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';\nimport { Observable, of, tap } from 'rxjs';\n\n/**\n * Caching interceptor for feature flag responses.\n *\n * FLOW:\n * 1. Runs AFTER middleware attaches dynamic feature flags.\n * 2. Generates a cache key based on request URL and enabled flags.\n * 3. If a cached response exists for this combination, returns it immediately.\n * 4. Otherwise, calls the next handler and caches the response.\n */\n@Injectable()\nexport class Caching implements NestInterceptor {\n // Map to store cached responses keyed by URL + active feature flags\n private cache = new Map<string, unknown>();\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const request = context.switchToHttp().getRequest();\n\n // Include active flags in cache key\n const flagsKey = JSON.stringify(request.featureFlags ?? {});\n const cacheKey = `${request.url}|${flagsKey}`;\n\n if (this.cache.has(cacheKey)) {\n // Return cached response as Observable\n return of(this.cache.get(cacheKey));\n }\n\n // Otherwise, proceed to handler and cache the response\n return next.handle().pipe(\n tap(response => {\n this.cache.set(cacheKey, response);\n })\n );\n }\n}\n","/**\n * Cache Manager - Core Caching Layer\n *\n * Main cache orchestration service that manages different caching strategies.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core caching infrastructure\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { MemoryCacheStrategy } from './strategies/memory';\nimport { RedisCacheStrategy } from './strategies/redis';\nimport type { CacheStrategy, CacheConfig, CacheEntry, CacheManagerStats } from '@plyaz/types';\n\n/**\n * Cache manager that orchestrates different caching strategies.\n * Provides a unified interface for caching across the application.\n *\n * @class CacheManager\n *\n * @example\n * ```typescript\n * const cache = new CacheManager({\n * isEnabled: true,\n * ttl: 300,\n * strategy: 'redis',\n * redisConfig: { url: 'redis://localhost:6379' }\n * });\n *\n * await cache.set('key', value);\n * const cached = await cache.get('key');\n * ```\n */\nexport class CacheManager {\n private strategy: CacheStrategy;\n\n /**\n * Creates a new cache manager with the specified configuration.\n *\n * @param config - Cache configuration\n */\n constructor(private config: CacheConfig) {\n this.strategy = this.createStrategy(config);\n }\n\n /**\n * Stores a value in the cache.\n *\n * @template T - Type of the value to cache\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - Optional TTL override in seconds\n * @returns Promise that resolves when value is cached\n */\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.config.isEnabled) return;\n\n const finalTtl = ttl ?? this.config.ttl;\n const entry: CacheEntry<T> = {\n data: value,\n expiresAt: Date.now() + finalTtl * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n createdAt: Date.now(),\n };\n\n await this.strategy.set(key, entry);\n }\n\n /**\n * Retrieves a value from the cache.\n *\n * @template T - Expected type of the cached value\n * @param key - Cache key\n * @returns Promise that resolves to cached value or null if not found/expired\n */\n async get<T>(key: string): Promise<T | null> {\n if (!this.config.isEnabled) return null;\n\n const entry = await this.strategy.get<T>(key);\n if (!entry) return null;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await this.strategy.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * Removes a value from the cache.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when value is removed\n */\n async delete(key: string): Promise<void> {\n if (!this.config.isEnabled) return;\n await this.strategy.delete(key);\n }\n\n /**\n * Clears all cached values.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n if (!this.config.isEnabled) return;\n await this.strategy.clear();\n }\n\n /**\n * Checks if a key exists in the cache.\n *\n * @param key - Cache key to check\n * @returns Promise that resolves to true if key exists and is not expired\n */\n async has(key: string): Promise<boolean> {\n if (!this.config.isEnabled) return false;\n\n const entry = await this.strategy.get(key);\n if (!entry) return false;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await this.strategy.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheManagerStats> {\n return this.strategy.getStats();\n }\n\n /**\n * Creates the appropriate cache strategy based on configuration.\n *\n * @private\n * @param config - Cache configuration\n * @returns Cache strategy instance\n */\n private createStrategy(config: CacheConfig): CacheStrategy {\n switch (config.strategy) {\n case 'redis':\n if (!config.redisConfig) {\n throw new Error('Redis configuration is required for Redis cache strategy');\n }\n return new RedisCacheStrategy(config.redisConfig);\n\n case 'memory':\n default:\n return new MemoryCacheStrategy(config.memoryConfig);\n }\n }\n\n /**\n * Disposes of the cache manager and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n await this.strategy.dispose?.();\n }\n}\n\nexport * from './feature/caching';\n","/**\n * Feature Flag Provider - Core Implementation\n *\n * Main provider class that orchestrates feature flag evaluation and management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag provider implementation\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n FetchFeatureFlagDataResponse,\n} from '@plyaz/types';\nimport { FeatureFlagEngine } from '@engine/featureFlags/engine';\nimport { CacheManager } from '@base/cache/index';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Subscription callback function type\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Core feature flag provider that implements the main business logic.\n * This class orchestrates between the evaluation engine, caching, and data providers.\n *\n * @class FeatureFlagProvider\n * @implements {IFeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<MyFeatureFlags>(config, FEATURES);\n * await provider.initialize();\n *\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE', context);\n * const value = await provider.getValue('ROLLOUT_PERCENTAGE', context);\n * ```\n */\nexport abstract class FeatureFlagProvider<FeatureFlagKey extends string>\n implements IFeatureFlagProvider<FeatureFlagKey>\n{\n protected engine: FeatureFlagEngine<FeatureFlagKey>;\n protected cacheManager: CacheManager;\n protected subscribers = new Set<SubscriptionCallback>();\n protected refreshTimer?: ReturnType<typeof setInterval>;\n protected isInitialized = false;\n protected features: Record<FeatureFlagKey, FeatureFlagValue>;\n protected initializePromise?: Promise<void>;\n\n /**\n * Creates a new feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n protected config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n this.features = features;\n // Initialize engine with defaults from FEATURES constant\n this.engine = new FeatureFlagEngine<FeatureFlagKey>(features, config.isLoggingEnabled ?? false);\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n isEnabled: config.isCacheEnabled,\n ttl: config.cacheTtl,\n strategy: 'memory', // Default to memory, can be overridden\n });\n\n this.setupRefreshTimer();\n }\n\n /**\n * Abstract method to fetch flags and rules from the provider's data source.\n * Must be implemented by concrete provider classes.\n *\n * @protected\n * @abstract\n * @returns Promise resolving to flags and rules\n */\n protected abstract fetchData(): Promise<FetchFeatureFlagDataResponse<FeatureFlagKey>>;\n\n /**\n * Initializes the provider by loading initial data.\n *\n * @returns Promise that resolves when initialization is complete\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n // If already initializing, wait for that to complete\n if (this.initializePromise) {\n return this.initializePromise;\n }\n\n // Create and store the initialization promise\n this.initializePromise = this.doInitialize();\n return this.initializePromise;\n }\n\n /**\n * Performs the actual initialization work.\n *\n * @private\n * @returns Promise that resolves when initialization is complete\n */\n private async doInitialize(): Promise<void> {\n try {\n await this.refresh();\n this.isInitialized = true;\n this.log('Provider initialized successfully');\n } catch (error) {\n this.log('Failed to initialize provider:', error);\n // Clear the promise so initialization can be retried\n this.initializePromise = undefined;\n throw error;\n }\n }\n\n /**\n * Gets a feature flag evaluation for the specified key and context.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag evaluation\n */\n async getFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n // Check cache first if enabled\n if (this.config.isCacheEnabled) {\n const cacheKey = this.generateCacheKey(key, context);\n const cached = await this.cacheManager.get<FeatureFlagEvaluation<FeatureFlagKey>>(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Evaluate and cache the result\n const evaluation = this.engine.evaluate(key, context);\n await this.cacheManager.set(cacheKey, evaluation);\n return evaluation;\n }\n\n // Direct evaluation without caching\n return this.engine.evaluate(key, context);\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets the value of a feature flag.\n *\n * @template T - The expected type of the flag value\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag value\n */\n async getValue<T = FeatureFlagValue>(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.value as T;\n }\n\n /**\n * Gets all feature flag evaluations for the given context.\n *\n * @param context - Optional context for evaluation\n * @returns Promise resolving to record of flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const results: Record<string, FeatureFlagEvaluation<FeatureFlagKey>> = {};\n\n // First, evaluate all default flags from FEATURES\n for (const key of Object.keys(this.features) as FeatureFlagKey[]) {\n results[key] = await this.getFlag(key, context);\n }\n\n // Then, evaluate any additional flags from the engine\n const engineFlags = this.engine.getFlags();\n for (const flag of engineFlags) {\n if (!(flag.key in results)) {\n results[flag.key] = await this.getFlag(flag.key, context);\n }\n }\n\n return results;\n }\n\n /**\n * Refreshes the provider by fetching latest data from the source.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n try {\n const { flags, rules } = await this.fetchData();\n\n this.engine.setFlags(flags);\n this.engine.setRules(rules);\n\n // Clear cache after refresh\n await this.cacheManager.clear();\n\n // Notify subscribers\n this.notifySubscribers();\n\n this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);\n } catch (error) {\n this.log('Failed to refresh provider:', error);\n throw error;\n }\n }\n\n /**\n * Subscribes to provider updates.\n *\n * @param callback - Function to call when provider updates\n * @returns Unsubscribe function\n */\n subscribe(callback: SubscriptionCallback): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Sets an override for a specific flag key.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.engine.setOverride(key, value);\n void this.cacheManager.clear(); // Clear cache to ensure overrides take effect\n this.notifySubscribers();\n }\n\n /**\n * Removes an override for a specific flag key.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.engine.removeOverride(key);\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Clears all overrides.\n */\n clearOverrides(): void {\n this.engine.clearOverrides();\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Disposes of the provider, cleaning up resources.\n */\n dispose(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n\n this.subscribers.clear();\n void this.cacheManager.clear();\n this.isInitialized = false;\n\n this.log('Provider disposed');\n }\n\n /**\n * Optional method to sync features at runtime.\n * This is useful for providers that can update their features dynamically.\n *\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n */\n syncFeatures?(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void>;\n\n /**\n * Generates a cache key for flag evaluation.\n *\n * @protected\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Cache key string\n */\n protected generateCacheKey(key: FeatureFlagKey, context?: FeatureFlagContext): string {\n if (!context) {\n return key;\n }\n\n // Create a stable cache key from context\n const contextKey = JSON.stringify({\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n });\n\n return `${key}:${contextKey}`;\n }\n\n /**\n * Sets up the automatic refresh timer if configured.\n *\n * @protected\n */\n protected setupRefreshTimer(): void {\n if (this.config.refreshInterval > 0) {\n this.refreshTimer = setInterval(() => {\n void this.refresh().catch(error => {\n this.log('Auto-refresh failed:', error);\n });\n }, this.config.refreshInterval * TIME_CONSTANTS.MILLISECONDS_PER_SECOND);\n }\n }\n\n /**\n * Notifies all subscribers of provider updates.\n *\n * @protected\n */\n protected notifySubscribers(): void {\n for (const callback of Array.from(this.subscribers)) {\n try {\n callback();\n } catch (error) {\n this.log('Subscriber callback error:', error);\n }\n }\n }\n\n /**\n * Logs a message if logging is enabled.\n *\n * @protected\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[FeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * Memory Feature Flag Provider\n *\n * In-memory provider implementation that uses the FEATURES constant for flag data.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Memory-based feature flag provider that loads flags from the FEATURES constant.\n *\n * @class MemoryFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'memory',\n * isCacheEnabled: false,\n * isLoggingEnabled: true,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class MemoryFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private flags: FeatureFlag<FeatureFlagKey>[] = [];\n private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n /**\n * Creates a new memory feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n }\n\n /**\n * Fetches flags and rules from memory (FEATURES constant).\n *\n * @protected\n * @returns Promise resolving to flags and rules from memory\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n this.log('Fetching feature flags from memory (FEATURES constant)');\n\n const currentTime = new Date();\n\n // Convert FEATURES constant to FeatureFlag objects\n this.flags = Object.entries(this.features).map(([key, value]) =>\n this.createFeatureFlagFromConstant(\n key as FeatureFlagKey,\n value as FeatureFlagValue,\n currentTime\n )\n );\n\n // Memory provider doesn't have rules by default, but allows manual addition\n this.rules = [...this.getManualRules()];\n\n this.log(`Loaded ${this.flags.length} flags and ${this.rules.length} rules from memory`);\n\n return {\n flags: this.flags,\n rules: this.rules,\n };\n }\n\n /**\n * Creates a FeatureFlag object from a FEATURES constant entry.\n *\n * @private\n * @param key - The feature flag key\n * @param value - The value from FEATURES constant\n * @param currentTime - Current timestamp\n * @returns FeatureFlag object\n */\n private createFeatureFlagFromConstant(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n currentTime: Date\n ): FeatureFlag<FeatureFlagKey> {\n return {\n key,\n name: this.generateFlagName(key),\n description: `Memory-based flag for ${key}`,\n isEnabled: true,\n value,\n type: this.inferFlagType(value),\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'memory-system',\n updatedBy: 'memory-system',\n } satisfies FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Generates a human-readable name from a flag key.\n *\n * @private\n * @param key - The feature flag key\n * @returns Human-readable flag name\n */\n private generateFlagName(key: FeatureFlagKey): string {\n return key\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Infers the flag type from its value.\n *\n * @private\n * @param value - The flag value\n * @returns The inferred type\n */\n private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n return 'json';\n }\n\n /**\n * Gets manually added rules for memory provider.\n *\n * @private\n * @returns Array of manually configured rules\n */\n private getManualRules(): FeatureFlagRule<FeatureFlagKey>[] {\n return this.config.memoryRules ?? [];\n }\n\n /**\n * Validates the memory provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'memory') {\n throw new Error('Memory provider requires provider to be set to \"memory\"');\n }\n\n if (this.config.memoryRules && !Array.isArray(this.config.memoryRules)) {\n throw new Error('memoryRules must be an array if provided');\n }\n }\n\n /**\n * Adds a rule to the memory provider at runtime.\n *\n * @param rule - The rule to add\n */\n addRule(rule: FeatureFlagRule<FeatureFlagKey>): void {\n this.rules.push(rule);\n this.engine.setRules(this.rules);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Added rule: ${rule.name} for flag: ${rule.flagKey}`);\n }\n\n /**\n * Removes a rule from the memory provider.\n *\n * @param ruleId - The ID of the rule to remove\n */\n removeRule(ruleId: string): void {\n const initialCount = this.rules.length;\n this.rules = this.rules.filter(rule => rule.id !== ruleId);\n\n if (this.rules.length < initialCount) {\n this.engine.setRules(this.rules);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Removed rule with ID: ${ruleId}`);\n } else {\n this.log(`Rule with ID ${ruleId} not found`);\n }\n }\n\n /**\n * Updates a flag in memory.\n *\n * @param flagOrKey - Either a complete flag object or a flag key\n * @param value - The new value (only used when first param is a key)\n * @param updateProps - Optional properties to update (only used when first param is a key)\n */\n async updateFlag(\n flagOrKey: FeatureFlag<FeatureFlagKey> | FeatureFlagKey,\n value?: FeatureFlagValue,\n updateProps?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): Promise<void> {\n let key: FeatureFlagKey;\n let updatedFlag: FeatureFlag<FeatureFlagKey>;\n\n // Handle both signatures\n if (typeof flagOrKey === 'string') {\n // Backward compatible signature: updateFlag(key, value, updateProps)\n key = flagOrKey;\n const existingFlag = this.flags.find(f => f.key === key);\n if (!existingFlag) {\n this.log(`Flag with key ${key} not found in memory`);\n return;\n }\n\n if (value === undefined) {\n this.log(`Value is required when updating flag by key`);\n return;\n }\n\n updatedFlag = {\n ...existingFlag,\n value,\n type: this.inferFlagType(value),\n updatedAt: new Date(),\n updatedBy: 'memory-runtime',\n ...updateProps,\n };\n } else {\n // Interface signature: updateFlag(flag)\n const flag = flagOrKey;\n key = flag.key;\n updatedFlag = {\n ...flag,\n updatedAt: new Date(),\n updatedBy: flag.updatedBy || 'memory-runtime',\n };\n }\n\n const flagIndex = this.flags.findIndex(f => f.key === key);\n if (flagIndex === -1) {\n this.log(`Flag with key ${key} not found in memory`);\n return;\n }\n\n this.flags[flagIndex] = updatedFlag;\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n\n this.log(`Updated flag: ${key}`);\n }\n\n /**\n * Adds a new flag to memory at runtime.\n *\n * @param key - The flag key\n * @param value - The flag value\n * @param props - Optional flag properties\n */\n addFlag(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): void {\n if (this.flagExists(key)) {\n return;\n }\n\n const newFlag = this.createNewFlag(key, value, props);\n this.addFlagToStore(key, newFlag, value);\n }\n\n /**\n * Checks if a flag with the given key exists.\n */\n private flagExists(key: FeatureFlagKey): boolean {\n const exists = this.flags.some(flag => flag.key === key);\n if (exists) {\n this.log(`Flag with key ${key} already exists in memory`);\n }\n return exists;\n }\n\n /**\n * Creates a new flag object.\n */\n private createNewFlag(\n key: FeatureFlagKey,\n value: FeatureFlagValue,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): FeatureFlag<FeatureFlagKey> {\n const currentTime = new Date();\n const flagDefaults = this.getDefaultFlagProperties(key, value);\n const flagProps = this.mergeWithUserProps(flagDefaults, props);\n\n return {\n key,\n ...flagProps,\n value,\n type: flagDefaults.type,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'memory-runtime',\n updatedBy: 'memory-runtime',\n } satisfies FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Gets default properties for a new flag.\n */\n private getDefaultFlagProperties(\n key: FeatureFlagKey,\n value: FeatureFlagValue\n ): {\n name: string;\n description: string;\n isEnabled: boolean;\n type: 'boolean' | 'string' | 'number' | 'json';\n environment: 'all';\n rolloutPercentage: undefined;\n } {\n return {\n name: this.generateFlagName(key),\n description: `Runtime-added flag for ${key}`,\n isEnabled: true,\n type: this.inferFlagType(value),\n environment: 'all' as const,\n rolloutPercentage: undefined,\n };\n }\n\n /**\n * Merges default properties with user-provided properties.\n */\n private mergeWithUserProps(\n defaults: ReturnType<typeof this.getDefaultFlagProperties>,\n props?: Partial<\n Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n >\n >\n ): Pick<\n FeatureFlag<FeatureFlagKey>,\n 'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n > {\n const merged = { ...defaults, ...props };\n\n // If type is provided in props, use it; otherwise use the inferred type\n if (props?.type) {\n merged.type = props.type;\n }\n\n return merged;\n }\n\n /**\n * Adds the flag to the store and notifies systems.\n */\n private addFlagToStore(\n key: FeatureFlagKey,\n newFlag: FeatureFlag<FeatureFlagKey>,\n value: FeatureFlagValue\n ): void {\n this.flags.push(newFlag);\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Added new flag: ${key} with value:`, value);\n }\n\n /**\n * Removes a flag from memory.\n *\n * @param key - The flag key to remove\n */\n removeFlag(key: FeatureFlagKey): void {\n const initialCount = this.flags.length;\n this.flags = this.flags.filter(flag => flag.key !== key);\n\n if (this.flags.length < initialCount) {\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Removed flag: ${key}`);\n } else {\n this.log(`Flag with key ${key} not found in memory`);\n }\n }\n\n /**\n * Gets all current flags in memory.\n *\n * @returns Array of current flags\n */\n getCurrentFlags(): FeatureFlag<FeatureFlagKey>[] {\n return [...this.flags];\n }\n\n /**\n * Gets all current rules in memory.\n *\n * @returns Array of current rules\n */\n getCurrentRules(): FeatureFlagRule<FeatureFlagKey>[] {\n return [...this.rules];\n }\n\n /**\n * Updates the features object and syncs all flags.\n * This allows updating the FEATURES constant at runtime.\n *\n * @param newFeatures - New features object to sync with\n */\n async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n this.log('Syncing with new FEATURES values');\n\n // Update the internal features reference\n this.features = newFeatures;\n\n // Refresh to reload all flags from the new features\n await this.refresh();\n\n this.log(`Synced ${Object.keys(newFeatures).length} features`);\n }\n\n /**\n * Resets the memory provider to its initial state.\n */\n async reset(): Promise<void> {\n this.log('Resetting memory provider to initial state');\n await this.refresh();\n }\n\n /**\n * Gets statistics about the memory provider.\n *\n * @returns Provider statistics\n */\n getStats(): {\n flagCount: number;\n ruleCount: number;\n cacheSize: number;\n subscriberCount: number;\n isInitialized: boolean;\n } {\n return {\n flagCount: this.flags.length,\n ruleCount: this.rules.length,\n cacheSize: 0, // Memory cache size would need to be tracked\n subscriberCount: this.subscribers.size,\n isInitialized: this.isInitialized,\n };\n }\n\n /**\n * Logs messages with MemoryFeatureFlagProvider prefix.\n *\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[MemoryFeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * File Feature Flag Provider\n *\n * File-based provider implementation supporting JSON and YAML configuration files.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview File provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport * as yaml from 'yaml';\nimport { FILE_CHECK_INTERVAL_DEFAULT, FORMAT_CONSTANTS } from '@plyaz/config';\n\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst access = promisify(fs.access);\nconst mkdir = promisify(fs.mkdir);\n\ninterface FileData<FeatureFlagKey extends string> {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n}\n\n/**\n * File-based feature flag provider supporting JSON and YAML formats.\n *\n * @class FileFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new FileFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'file',\n * fileConfig: {\n * filePath: './config/feature-flags.json',\n * format: 'json',\n * shouldWatchForChanges: true,\n * },\n * isCacheEnabled: true,\n * cacheTtl: 60,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class FileFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private fileWatcher?: fs.FSWatcher;\n private lastFileContent?: string;\n private fileCheckInterval?: ReturnType<typeof setInterval>;\n private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n /**\n * Creates a new file feature flag provider.\n *\n * @param config - Provider configuration with file settings\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n }\n\n /**\n * Initializes the provider and sets up file watching if enabled.\n */\n async initialize(): Promise<void> {\n await super.initialize();\n\n // Set up file watching after initialization\n if (this.config.fileConfig?.shouldWatchForChanges) {\n this.setupFileWatcher();\n }\n }\n\n /**\n * Fetches flags and rules from the configuration file.\n *\n * @protected\n * @returns Promise resolving to flags and rules from file\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n const { filePath, format } = this.config.fileConfig!;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n await access(resolvedPath, fs.constants.R_OK);\n const content = await readFile(resolvedPath, 'utf-8');\n this.lastFileContent = content;\n const data = await this.parseFileContent(content, format);\n this.validateFileData(data);\n\n // Store rules for later use\n this.rules = data.rules || [];\n\n return {\n flags: data.flags || [],\n rules: data.rules || [],\n };\n } catch (error) {\n return this.handleFetchDataError(error, resolvedPath, format);\n }\n }\n\n /**\n * Parses file content based on format.\n *\n * @private\n */\n private async parseFileContent(\n content: string,\n format: 'json' | 'yaml'\n ): Promise<FileData<FeatureFlagKey>> {\n if (format === 'json') {\n return this.parseJSON(content);\n } else if (format === 'yaml') {\n return await this.parseYAML(content);\n }\n throw new Error(`Unsupported file format: ${format}`);\n }\n\n /**\n * Handles errors for fetchData, including file creation and fallback.\n *\n * @private\n */\n private async handleFetchDataError(\n error: unknown,\n resolvedPath: string,\n format: 'json' | 'yaml'\n ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n const isFileNotFound = this.isFileNotFoundError(error);\n\n if (isFileNotFound && this.config.shouldFallbackToDefaults) {\n return await this.handleFileNotFound(resolvedPath, format);\n }\n\n this.log(`Error reading file ${resolvedPath}:`, error);\n\n if (this.config.shouldFallbackToDefaults) {\n return this.handleFallbackToDefaults();\n }\n\n throw error;\n }\n\n /**\n * Type guard for NodeJS.ErrnoException.\n */\n private isFileNotFoundError(error: unknown): error is globalThis.NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n typeof (error as globalThis.NodeJS.ErrnoException).code === 'string' &&\n (error as globalThis.NodeJS.ErrnoException).code === 'ENOENT'\n );\n }\n\n /**\n * Handles the case when the file is not found and fallback is enabled.\n */\n private async handleFileNotFound(\n resolvedPath: string,\n format: 'json' | 'yaml'\n ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n this.log(`File not found at ${resolvedPath}, creating with default values`);\n try {\n await this.createDefaultFile(resolvedPath, format);\n const content = await readFile(resolvedPath, 'utf-8');\n this.lastFileContent = content;\n const data = await this.parseFileContent(content, format);\n return {\n flags: data.flags || [],\n rules: data.rules || [],\n };\n } catch (createError) {\n this.log('Error creating default file:', createError);\n return {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n }\n }\n\n /**\n * Handles fallback to default flags and rules.\n */\n private handleFallbackToDefaults(): {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n } {\n this.log('Falling back to default values');\n return {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n }\n\n /**\n * Validates the file provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'file') {\n throw new Error('File provider requires provider to be set to \"file\"');\n }\n\n if (!this.config.fileConfig) {\n throw new Error('File configuration is required for file provider');\n }\n\n const { filePath, format } = this.config.fileConfig;\n\n if (!filePath) {\n throw new Error('File path is required');\n }\n\n if (!format || !['json', 'yaml'].includes(format)) {\n throw new Error('File format must be either \"json\" or \"yaml\"');\n }\n }\n\n /**\n * Resolves the file path, supporting relative and absolute paths.\n *\n * @private\n * @param filePath - The file path from configuration\n * @returns Resolved absolute file path\n */\n private resolveFilePath(filePath: string): string {\n // Default to src/config/feature-provider.json if not provided\n let pathToResolve = filePath;\n\n if (!pathToResolve) {\n // For ES modules, we need to calculate __dirname equivalent\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const __filename = fileURLToPath(import.meta.url);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const __dirname = path.dirname(__filename);\n pathToResolve = path.join(__dirname, '../../../config/feature-provider.json');\n }\n\n // If absolute path, return as is\n if (path.isAbsolute(pathToResolve)) {\n return pathToResolve;\n }\n\n // Resolve relative to current working directory\n return path.resolve(process.cwd(), pathToResolve);\n }\n\n /**\n * Parses JSON content.\n *\n * @private\n * @param content - File content\n * @returns Parsed data\n */\n private parseJSON(content: string): FileData<FeatureFlagKey> {\n try {\n return JSON.parse(content);\n } catch (error) {\n throw new Error(\n `Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Parses YAML content.\n *\n * @private\n * @param content - File content\n * @returns Parsed data\n */\n private async parseYAML(content: string): Promise<FileData<FeatureFlagKey>> {\n try {\n const data = yaml.parse(content) as FileData<FeatureFlagKey>;\n return data;\n } catch (error) {\n throw new Error(\n `Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validates the structure of file data.\n *\n * @private\n * @param data - Parsed file data\n */\n private validateFileData(data: unknown): void {\n if (!data || typeof data !== 'object') {\n throw new Error('File must contain a valid object');\n }\n\n const fileData = data as Record<string, unknown>;\n\n this.checkFlagsArray(fileData.flags);\n this.checkRulesArray(fileData.rules);\n }\n\n private checkFlagsArray(flags: unknown): void {\n if (flags && !Array.isArray(flags)) {\n throw new Error('\"flags\" must be an array');\n }\n if (Array.isArray(flags)) {\n this.validateFlags(flags);\n }\n }\n\n private checkRulesArray(rules: unknown): void {\n if (rules && !Array.isArray(rules)) {\n throw new Error('\"rules\" must be an array');\n }\n if (Array.isArray(rules)) {\n this.validateRules(rules);\n }\n }\n\n private validateFlags(flags: unknown[]): void {\n flags.forEach((flag: unknown, index: number) => {\n if (!flag || typeof flag !== 'object') {\n throw new Error(`Flag at index ${index} must be an object`);\n }\n const flagObj = flag as Record<string, unknown>;\n if (!flagObj.key || typeof flagObj.key !== 'string') {\n throw new Error(`Flag at index ${index} must have a \"key\" property`);\n }\n if (flagObj.value === undefined) {\n throw new Error(`Flag \"${flagObj.key}\" must have a \"value\" property`);\n }\n });\n }\n\n private validateRules(rules: unknown[]): void {\n rules.forEach((rule: unknown, index: number) => {\n if (!rule || typeof rule !== 'object') {\n throw new Error(`Rule at index ${index} must be an object`);\n }\n const ruleObj = rule as Record<string, unknown>;\n if (!ruleObj.id || typeof ruleObj.id !== 'string') {\n throw new Error(`Rule at index ${index} must have an \"id\" property`);\n }\n if (!ruleObj.flagKey || typeof ruleObj.flagKey !== 'string') {\n throw new Error(`Rule \"${ruleObj.id}\" must have a \"flagKey\" property`);\n }\n if (!Array.isArray(ruleObj.conditions)) {\n throw new Error(`Rule \"${ruleObj.id}\" must have a \"conditions\" array`);\n }\n });\n }\n\n /**\n * Creates a default configuration file with values from features.\n *\n * @private\n * @param filePath - Path where to create the file\n * @param format - File format (json or yaml)\n */\n private async createDefaultFile(filePath: string, format: 'json' | 'yaml'): Promise<void> {\n // Ensure directory exists\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n // Create default data structure\n const defaultData: FileData<FeatureFlagKey> = {\n flags: this.createDefaultFlags(),\n rules: [],\n };\n\n // Serialize based on format\n let content: string;\n if (format === 'json') {\n content = JSON.stringify(defaultData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n } else {\n content = yaml.stringify(defaultData);\n }\n\n // Write file\n await writeFile(filePath, content, 'utf-8');\n this.log(`Created default feature flag file at: ${filePath}`);\n }\n\n /**\n * Creates default flags from the features configuration.\n *\n * @private\n * @returns Array of default flags\n */\n private createDefaultFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Object.entries(this.features).map(([key, value]) => ({\n key: key as FeatureFlagKey,\n value: value as FeatureFlagValue,\n isEnabled: true,\n name: key,\n description: `Default flag for ${key}`,\n type:\n typeof value === 'boolean'\n ? 'boolean'\n : typeof value === 'number'\n ? 'number'\n : typeof value === 'string'\n ? 'string'\n : 'json',\n environment: 'development',\n createdAt: new Date(),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n metadata: {},\n tags: [],\n }));\n }\n\n /**\n * Sets up file watching for hot reload if enabled.\n *\n * @private\n */\n private setupFileWatcher(): void {\n if (!this.config.fileConfig?.shouldWatchForChanges) {\n return;\n }\n\n const { filePath } = this.config.fileConfig;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n // Use fs.watch for file system events\n this.fileWatcher = fs.watch(resolvedPath, async eventType => {\n if (eventType === 'change') {\n this.log(`File changed: ${resolvedPath}`);\n\n // Debounce rapid changes\n if (this.fileCheckInterval) {\n clearTimeout(this.fileCheckInterval);\n }\n\n this.fileCheckInterval = setTimeout(async () => {\n try {\n // Check if content actually changed\n const content = await readFile(resolvedPath, 'utf-8');\n if (content !== this.lastFileContent) {\n this.log('File content changed, refreshing...');\n await this.refresh();\n }\n } catch (error) {\n this.log('Error reading changed file:', error);\n }\n }, this.config.fileConfig?.fileCheckInterval ?? FILE_CHECK_INTERVAL_DEFAULT); // Use configured interval or default\n }\n });\n\n this.log(`File watching enabled for: ${resolvedPath}`);\n } catch (error) {\n this.log(`Failed to set up file watching: ${error}`);\n // File watching is optional, so we don't throw\n }\n }\n\n /**\n * Disposes of the file provider and stops file watching.\n */\n dispose(): void {\n super.dispose();\n\n if (this.fileWatcher) {\n this.fileWatcher.close();\n this.fileWatcher = undefined;\n this.log('File watching stopped');\n }\n\n if (this.fileCheckInterval) {\n clearTimeout(this.fileCheckInterval);\n this.fileCheckInterval = undefined;\n }\n }\n\n /**\n * Refreshes the provider by fetching latest data from the file.\n * Overrides base class to store rules.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n // Just call parent refresh - it will call fetchData and set everything properly\n await super.refresh();\n }\n\n /**\n * Updates the features object and writes to file.\n * This allows updating the FEATURES at runtime and persisting to file.\n *\n * @param newFeatures - New features object to sync with\n */\n async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n this.log('Syncing with new FEATURES values and updating file');\n\n // Update the internal features reference\n this.features = newFeatures;\n\n // Create new file data with updated features\n const fileData: FileData<FeatureFlagKey> = {\n flags: this.createDefaultFlags(),\n rules: this.rules || [],\n };\n\n // Write to file\n const { filePath, format } = this.config.fileConfig!;\n const resolvedPath = this.resolveFilePath(filePath);\n\n try {\n let content: string;\n if (format === 'json') {\n content = JSON.stringify(fileData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n } else {\n content = yaml.stringify(fileData);\n }\n\n await writeFile(resolvedPath, content, 'utf-8');\n this.lastFileContent = content;\n\n // Update engine defaults before refresh\n this.engine.updateDefaults(newFeatures);\n\n // Refresh to reload from file (this will trigger watchers if enabled)\n await this.refresh();\n\n this.log(`Synced ${Object.keys(newFeatures).length} features to file: ${resolvedPath}`);\n } catch (error) {\n this.log('Error syncing features to file:', error);\n throw new Error(\n `Failed to sync features to file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Gets information about the file provider.\n *\n * @returns File provider information\n */\n getFileInfo(): {\n filePath?: string;\n resolvedPath?: string;\n format?: string;\n isWatchEnabled: boolean;\n isImplemented: boolean;\n lastModified?: Date;\n } {\n const filePath = this.config.fileConfig?.filePath;\n const resolvedPath = filePath ? this.resolveFilePath(filePath) : undefined;\n\n let lastModified: Date | undefined;\n if (resolvedPath) {\n try {\n const stats = fs.statSync(resolvedPath);\n lastModified = stats.mtime;\n } catch {\n // File might not exist\n }\n }\n\n return {\n filePath,\n resolvedPath,\n format: this.config.fileConfig?.format,\n isWatchEnabled: Boolean(this.config.fileConfig?.shouldWatchForChanges),\n isImplemented: true,\n lastModified,\n };\n }\n}\n","/**\n * Redis Feature Flag Provider\n *\n * Redis-based provider implementation supporting distributed caching and storage.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Redis-based feature flag provider supporting distributed caching and storage.\n *\n * @class RedisFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new RedisFeatureFlagProvider<FeatureFlagKey>({\n * provider: 'redis',\n * redisConfig: {\n * url: 'redis://localhost:6379',\n * keyPrefix: 'feature_flags',\n * },\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class RedisFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n /**\n * Creates a new Redis feature flag provider.\n *\n * @param config - Provider configuration with Redis settings\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n throw new Error('Redis provider requires @plyaz/core on Cache implementation');\n }\n\n /**\n * Fetches flags and rules from Redis storage.\n *\n * @protected\n * @returns Promise resolving to flags and rules from Redis\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'Redis Provider is not yet fully implemented. ' +\n 'This requires integration with the cache layer.\\n\\n' +\n 'Required Implementation:\\n' +\n '1. Integrate with cache/strategies/redis.ts\\n' +\n '2. Implement Redis data storage patterns\\n' +\n '3. Add Redis client management\\n' +\n '4. Set up data serialization/deserialization\\n' +\n '5. Add connection health monitoring\\n' +\n '6. Implement Redis key management strategies\\n\\n' +\n 'Redis Storage Patterns:\\n' +\n '- Hash-based storage (recommended)\\n' +\n '- List-based storage\\n' +\n '- String/JSON storage\\n\\n' +\n 'Key Structure:\\n' +\n '- {prefix}:flags - Feature flags hash\\n' +\n '- {prefix}:rules - Targeting rules list\\n' +\n '- {prefix}:overrides - Manual overrides hash\\n' +\n '- {prefix}:meta - Metadata and versioning\\n\\n' +\n 'Example Configuration:\\n' +\n '{\\n' +\n ' provider: \"redis\",\\n' +\n ' redisConfig: {\\n' +\n ' url: \"redis://localhost:6379\",\\n' +\n ' keyPrefix: \"plyaz:feature_flags\"\\n' +\n ' },\\n' +\n ' isCacheEnabled: true,\\n' +\n ' cacheTtl: 300\\n' +\n '}\\n\\n' +\n 'Redis Provider Benefits:\\n' +\n '- Distributed caching across instances\\n' +\n '- Real-time flag updates\\n' +\n '- Persistent storage option\\n' +\n '- High performance evaluation\\n\\n' +\n 'Migration Note: This provider will be moved to @plyaz/core/src/domain/featureFlags/providers/\\n' +\n 'It should integrate with the cache layer at @plyaz/core/src/cache/strategies/redis.ts'\n );\n }\n\n /**\n * Validates the Redis provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid\n */\n private validateConfig(): void {\n if (this.config.provider !== 'redis') {\n throw new Error('Redis provider requires provider to be set to \"redis\"');\n }\n\n if (!this.config.redisConfig) {\n throw new Error('Redis configuration is required for Redis provider');\n }\n\n if (!this.config.redisConfig.url) {\n throw new Error('Redis URL is required');\n }\n\n if (!this.isValidRedisUrl(this.config.redisConfig.url)) {\n throw new Error('Redis URL must be a valid Redis connection string (redis:// or rediss://)');\n }\n\n // Configuration is valid, but implementation is not complete\n this.log('Redis provider configuration is valid, but implementation is not ready');\n this.log('Redis URL:', this.config.redisConfig.url);\n this.log('Key Prefix:', this.config.redisConfig.keyPrefix ?? 'feature_flags');\n }\n\n /**\n * Validates Redis URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid Redis URL\n */\n private isValidRedisUrl(url: string): boolean {\n return url.startsWith('redis://') || url.startsWith('rediss://');\n }\n\n /**\n * Gets Redis provider information.\n *\n * @returns Redis provider status information\n */\n getRedisInfo(): {\n url?: string;\n keyPrefix?: string;\n isImplemented: boolean;\n requiredImplementation: string[];\n recommendedPatterns: string[];\n } {\n return {\n url: this.config.redisConfig?.url,\n keyPrefix: this.config.redisConfig?.keyPrefix ?? 'feature_flags',\n isImplemented: false,\n requiredImplementation: [\n 'Integration with cache/strategies/redis.ts',\n 'Redis data storage patterns',\n 'Client management and health monitoring',\n 'Data serialization/deserialization',\n 'Key management strategies',\n ],\n recommendedPatterns: [\n 'Hash-based storage for flags',\n 'List-based storage for rules',\n 'Pub/Sub for real-time updates',\n 'TTL for automatic cleanup',\n ],\n };\n }\n}\n","/**\n * API Feature Flag Provider (Stub)\n *\n * API-based provider stub that requires @plyaz/api package implementation.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview API provider stub for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * API-based feature flag provider requiring @plyaz/api implementation.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // This will throw an error until @plyaz/api is implemented\n * const provider = new ApiFeatureFlagProvider({\n * provider: 'api',\n * apiEndpoint: 'https://api.plyaz.co.uk',\n * apiKey: process.env.FEATURE_FLAG_API_KEY,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class ApiFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n /**\n * Creates a new API feature flag provider.\n *\n * @param config - Provider configuration with API settings\n * @throws Error indicating that @plyaz/api implementation is required\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n this.validateConfig();\n throw new Error('API provider requires @plyaz/api package implementation');\n }\n\n /**\n * Fetches flags and rules from the API endpoint.\n * Currently throws an error as the API implementation is not ready.\n *\n * @protected\n * @returns Promise that rejects with implementation error\n * @throws Error indicating missing API implementation\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'API Provider is not yet implemented. ' +\n 'This requires @plyaz/api package with the following endpoints:\\n\\n' +\n 'Required API Endpoints (to be implemented in @plyaz/api):\\n' +\n '- GET /api/v1/feature-flags (get all flags)\\n' +\n '- GET /api/v1/feature-flag-rules (get all rules)\\n' +\n '- POST /api/v1/feature-flags/evaluate (evaluate flags)\\n' +\n '- POST /api/v1/feature-flags/evaluate/bulk (bulk evaluation)\\n\\n' +\n 'Required Backend Implementation:\\n' +\n '1. Install and configure @plyaz/api package\\n' +\n '2. Implement the API endpoints in NestJS modules\\n' +\n '3. Set up authentication (API key or JWT)\\n' +\n '4. Configure CORS and rate limiting\\n' +\n '5. Add request/response validation\\n' +\n '6. Set up database integration with @plyaz/db\\n\\n' +\n 'Example Configuration:\\n' +\n '{\\n' +\n ' provider: \"api\",\\n' +\n ' apiEndpoint: \"https://api.plyaz.co.uk\",\\n' +\n ' apiKey: \"your-api-key\",\\n' +\n ' isCacheEnabled: true,\\n' +\n ' cacheTtl: 300\\n' +\n '}\\n\\n' +\n 'See /docs/feature-flag-to-implement/api-requirements.md for complete implementation details.\\n\\n' +\n 'Migration Note: This provider will be moved to @plyaz/core/src/domain/featureFlags/providers/'\n );\n }\n\n /**\n * Validates the API provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid or incomplete\n */\n private validateConfig(): void {\n if (this.config.provider !== 'api') {\n throw new Error('API provider requires provider to be set to \"api\"');\n }\n\n if (!this.config.apiEndpoint) {\n throw new Error(\n 'API endpoint is required for API provider. ' +\n 'Set apiEndpoint in your configuration.\\n' +\n 'Example: apiEndpoint: \"https://api.plyaz.co.uk\"'\n );\n }\n\n if (!this.config.apiKey) {\n throw new Error(\n 'API key is required for API provider. ' +\n 'Set apiKey in your configuration.\\n' +\n 'Example: apiKey: process.env.FEATURE_FLAG_API_KEY'\n );\n }\n\n if (!this.isValidUrl(this.config.apiEndpoint)) {\n throw new Error(\n 'API endpoint must be a valid URL. ' +\n `Received: ${this.config.apiEndpoint}\\n` +\n 'Example: \"https://api.plyaz.co.uk\"'\n );\n }\n\n // Configuration is valid, but implementation is missing\n this.log('API provider configuration is valid, but implementation is not ready');\n this.log('API Endpoint:', this.config.apiEndpoint);\n this.log('API Key:', this.config.apiKey ? '[SET]' : '[MISSING]');\n }\n\n /**\n * Validates URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid URL\n */\n private isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets API provider status and configuration info.\n *\n * @returns API provider status information\n */\n getApiInfo(): {\n endpoint?: string;\n hasApiKey: boolean;\n isImplemented: boolean;\n requiredPackages: string[];\n documentationPath: string;\n } {\n return {\n endpoint: this.config.apiEndpoint,\n hasApiKey: Boolean(this.config.apiKey),\n isImplemented: false,\n requiredPackages: ['@plyaz/api'],\n documentationPath: '/docs/feature-flag-to-implement/api-requirements.md',\n };\n }\n}\n","import { createDatabaseService } from '@plyaz/db';\nimport { DatabaseError } from '@plyaz/errors';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types';\nimport { ADAPTER_TYPES, type DatabaseServiceInterface, type Transaction } from '@plyaz/types/db';\n\n/**\n * DatabaseConnectionManager - Singleton manager for feature flag database connections\n *\n * @description Manages Supabase database connections for the feature flag system using a singleton pattern.\n * Handles connection initialization, table registration, transactions, and cleanup. This is the core\n * database layer that all feature flag operations depend on.\n *\n * **Initialization Flow:**\n * 1. FeatureFlagService calls initialize() during onModuleInit()\n * 2. Reads Supabase credentials from environment variables\n * 3. Creates database service with @plyaz/db\n * 4. Registers feature flag tables\n * 5. Enables caching and other optimizations\n *\n * **Required Environment Variables:**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for admin operations\n * - SUPABASE_ANON_PUBLIC_KEY: Anonymous key for public operations\n *\n * @example Environment Setup (.env.local)\n * ```bash\n * SUPABASE_URL=https://your-project.supabase.co\n * SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n * SUPABASE_ANON_PUBLIC_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n * ```\n *\n * @example Basic Usage (Internal - called by FeatureFlagService)\n * ```typescript\n * // During system initialization:\n * const manager = DatabaseConnectionManager.getInstance();\n * await manager.initialize();\n *\n * // During runtime operations:\n * const db = manager.getDatabase();\n * const flags = await db.query('feature_flags', { limit: 100 });\n * ```\n *\n * @example Transaction Usage\n * ```typescript\n * const manager = DatabaseConnectionManager.getInstance();\n *\n * // Atomic flag creation with rules\n * const result = await manager.transaction(async (tx) => {\n * // Create flag\n * const flag = await tx.create('feature_flags', {\n * key: 'NEW_FEATURE',\n * value: true,\n * is_enabled: true\n * });\n *\n * // Create associated rule\n * const rule = await tx.create('feature_flag_rules', {\n * flag_key: 'NEW_FEATURE',\n * name: 'Premium Users Only',\n * conditions: [{ field: 'userRole', operator: 'equals', value: 'premium' }]\n * });\n *\n * return { flag, rule };\n * });\n * ```\n *\n */\nexport class DatabaseConnectionManager {\n private static instance: DatabaseConnectionManager;\n private databaseService: DatabaseServiceInterface | null = null;\n\n private constructor() {}\n\n /**\n * Gets the singleton instance of DatabaseConnectionManager\n *\n * @description Returns the single instance of the connection manager, creating it if it doesn't exist.\n * This ensures only one database connection pool is maintained across the application.\n *\n * @returns {DatabaseConnectionManager} The singleton instance\n *\n * @example Getting the Instance\n * ```typescript\n * // Always returns the same instance\n * const manager1 = DatabaseConnectionManager.getInstance();\n * const manager2 = DatabaseConnectionManager.getInstance();\n * console.log(manager1 === manager2); // true\n *\n * // Use in services\n * class FeatureFlagRepository {\n * private connectionManager = DatabaseConnectionManager.getInstance();\n *\n * async getFlags() {\n * const db = this.connectionManager.getDatabase();\n * return db.query('feature_flags');\n * }\n * }\n * ```\n */\n static getInstance(): DatabaseConnectionManager {\n if (!DatabaseConnectionManager.instance) {\n DatabaseConnectionManager.instance = new DatabaseConnectionManager();\n }\n return DatabaseConnectionManager.instance;\n }\n\n /**\n * Initializes the database connection and registers feature flag tables\n *\n * @description Sets up the Supabase connection using environment variables and registers\n * all feature flag related tables. This method is idempotent - calling it multiple\n * times won't create additional connections.\n *\n * **What it does:**\n * 1. Validates required environment variables\n * 2. Creates Supabase database service\n * 3. Configures caching (5-minute TTL)\n * 4. Registers feature flag tables with proper ID columns\n * 5. Disables audit logging (until tables are created)\n *\n * @throws {DatabaseError} When environment variables are missing or connection fails\n *\n * @example Initialization Process\n * ```typescript\n * // Called automatically by FeatureFlagService.onModuleInit()\n * const manager = DatabaseConnectionManager.getInstance();\n *\n * try {\n * await manager.initialize();\n * console.log('Database connection established');\n * } catch (error) {\n * console.error('Failed to connect to database:', error.message);\n * // Error: Missing environment variables for Supabase connection\n * }\n * ```\n *\n * @example Environment Variable Validation\n * ```typescript\n * // If any of these are missing, initialization fails:\n * // SUPABASE_URL=undefined\n * // SUPABASE_SERVICE_ROLE_KEY=undefined\n * // SUPABASE_ANON_PUBLIC_KEY=undefined\n *\n * // Throws: DatabaseError with code CONFIG_REQUIRED\n * ```\n *\n * @example Registered Tables\n * ```typescript\n * // These tables are automatically registered:\n * // - feature_flags (ID: key)\n * // - feature_flag_rules (ID: id)\n * // - feature_flag_overrides (ID: id)\n * // - feature_flag_evaluations (ID: id)\n * ```\n */\n async initialize(): Promise<void> {\n if (this.databaseService) {\n return;\n }\n\n const supabaseUrl = process.env.SUPABASE_URL;\n const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY;\n const supabaseAnonKey = process.env.SUPABASE_ANON_PUBLIC_KEY;\n\n if (!supabaseUrl || !supabaseServiceKey || !supabaseAnonKey) {\n throw new DatabaseError(\n 'Missing environment variables for Supabase connection. Please check your .env file.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n this.databaseService = await createDatabaseService({\n adapter: ADAPTER_TYPES.SUPABASE,\n config: {\n supabaseUrl,\n supabaseServiceKey,\n supabaseAnonKey,\n },\n // Enable working extensions only\n audit: {\n enabled: false,\n retentionDays: 90,\n },\n cache: {\n enabled: true,\n provider: 'memory',\n ttl: 300,\n },\n softDelete: {\n enabled: false,\n field: 'deleted_at',\n },\n });\n\n // Register feature_flags table\n const serviceWithAdapter = this.databaseService as DatabaseServiceInterface & {\n adapter?: { registerTable?: (name: string, table?: string, idColumn?: string) => void };\n };\n\n if (serviceWithAdapter.adapter?.registerTable) {\n serviceWithAdapter.adapter.registerTable('feature_flags', 'feature_flags', 'key');\n serviceWithAdapter.adapter.registerTable('feature_flag_rules', 'feature_flag_rules', 'id');\n serviceWithAdapter.adapter.registerTable(\n 'feature_flag_overrides',\n 'feature_flag_overrides',\n 'id'\n );\n serviceWithAdapter.adapter.registerTable(\n 'feature_flag_evaluations',\n 'feature_flag_evaluations',\n 'id'\n );\n }\n }\n\n /**\n * Gets the initialized database service instance\n *\n * @description Returns the database service for performing queries. The database must be\n * initialized first using initialize() method, otherwise this will throw an error.\n *\n * @returns {DatabaseServiceInterface} The database service instance\n * @throws {DatabaseError} When database is not initialized\n *\n * @example Basic Usage\n * ```typescript\n * const manager = DatabaseConnectionManager.getInstance();\n * await manager.initialize(); // Must initialize first\n *\n * const db = manager.getDatabase();\n *\n * // Query feature flags\n * const result = await db.query('feature_flags', {\n * filters: [{ field: 'is_enabled', operator: 'eq', value: true }],\n * sort: [{ field: 'key', direction: 'asc' }]\n * });\n *\n * if (result.success) {\n * console.log('Found flags:', result.value.data);\n * }\n * ```\n *\n * @example Error Handling\n * ```typescript\n * const manager = DatabaseConnectionManager.getInstance();\n * // Don't call initialize()\n *\n * try {\n * const db = manager.getDatabase();\n * } catch (error) {\n * console.error(error.message);\n * // \"Database not initialized. Call initialize() first.\"\n * }\n * ```\n *\n * @example CRUD Operations\n * ```typescript\n * const db = manager.getDatabase();\n *\n * // Create a flag\n * const createResult = await db.create('feature_flags', {\n * key: 'NEW_FEATURE',\n * value: true,\n * is_enabled: true\n * });\n *\n * // Update a flag\n * const updateResult = await db.update('feature_flags', 'NEW_FEATURE', {\n * value: false\n * });\n *\n * // Delete a flag\n * const deleteResult = await db.delete('feature_flags', 'NEW_FEATURE');\n * ```\n */\n getDatabase(): DatabaseServiceInterface {\n if (!this.databaseService) {\n throw new DatabaseError(\n 'Database not initialized. Call initialize() first.',\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return this.databaseService;\n }\n\n /**\n * Executes a database transaction with automatic rollback on failure\n *\n * @description Provides atomic database operations by wrapping multiple queries in a transaction.\n * If any operation fails, all changes are rolled back automatically. This is essential for\n * maintaining data consistency when creating flags with rules or performing bulk operations.\n *\n * @template T The return type of the transaction callback\n * @param {Function} callback - Function that receives transaction object and performs operations\n * @returns {Promise<T>} The result of the transaction callback\n * @throws {DatabaseError} When transaction fails or returns no value\n *\n * @example Atomic Flag Creation with Rules\n * ```typescript\n * const manager = DatabaseConnectionManager.getInstance();\n *\n * const result = await manager.transaction(async (tx) => {\n * // Create the flag\n * const flag = await tx.create('feature_flags', {\n * key: 'PREMIUM_CHECKOUT',\n * value: true,\n * is_enabled: true,\n * description: 'Premium checkout flow'\n * });\n *\n * // Create targeting rule\n * const rule = await tx.create('feature_flag_rules', {\n * flag_key: 'PREMIUM_CHECKOUT',\n * name: 'Premium Users Only',\n * conditions: [\n * { field: 'userRole', operator: 'equals', value: 'premium' },\n * { field: 'subscriptionActive', operator: 'equals', value: true }\n * ],\n * value: true,\n * priority: 100\n * });\n *\n * return { flag, rule };\n * });\n *\n * console.log('Created flag and rule:', result);\n * ```\n *\n * @example Bulk Flag Updates\n * ```typescript\n * const flagsToUpdate = ['FEATURE_A', 'FEATURE_B', 'FEATURE_C'];\n *\n * await manager.transaction(async (tx) => {\n * for (const flagKey of flagsToUpdate) {\n * await tx.update('feature_flags', flagKey, {\n * is_enabled: false,\n * updated_at: new Date().toISOString()\n * });\n * }\n *\n * // Log the bulk update\n * await tx.create('feature_flag_evaluations', {\n * flag_key: 'BULK_UPDATE',\n * result: { updatedFlags: flagsToUpdate },\n * reason: 'bulk_disable',\n * evaluated_at: new Date().toISOString()\n * });\n * });\n * ```\n *\n * @example Error Handling and Rollback\n * ```typescript\n * try {\n * await manager.transaction(async (tx) => {\n * await tx.create('feature_flags', { key: 'TEST_FLAG', value: true });\n *\n * // This will cause the entire transaction to rollback\n * throw new Error('Something went wrong');\n *\n * // This won't execute, and the flag creation above will be rolled back\n * await tx.create('feature_flag_rules', { flag_key: 'TEST_FLAG' });\n * });\n * } catch (error) {\n * console.log('Transaction failed, all changes rolled back');\n * }\n * ```\n */\n async transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T> {\n const db = this.getDatabase();\n const result = await db.transaction(callback);\n if (!result.success) {\n const errorMessage = result.error?.message ?? 'Transaction failed';\n throw new DatabaseError(errorMessage, DATABASE_ERROR_CODES.TRANSACTION_FAILED);\n }\n\n if (result.value === undefined || result.value === null) {\n throw new DatabaseError('Transaction returned no value', DATABASE_ERROR_CODES.INVALID_RESULT);\n }\n\n return result.value;\n }\n\n /**\n * Closes the database connection and cleans up resources\n *\n * @description Properly closes the database connection and resets the singleton instance.\n * This is typically called during application shutdown or in tests that need to reset\n * the connection state.\n *\n * @example Application Shutdown\n * ```typescript\n * // In your NestJS module's onModuleDestroy\n * export class FeatureFlagModule implements OnModuleDestroy {\n * async onModuleDestroy() {\n * const manager = DatabaseConnectionManager.getInstance();\n * await manager.close();\n * console.log('Database connection closed');\n * }\n * }\n * ```\n *\n * @example Test Cleanup\n * ```typescript\n * describe('Feature Flag Tests', () => {\n * afterEach(async () => {\n * // Clean up connection between tests\n * const manager = DatabaseConnectionManager.getInstance();\n * await manager.close();\n * });\n * });\n * ```\n */\n async close(): Promise<void> {\n // Connection cleanup is handled internally\n this.databaseService = null;\n }\n}\n","/**\n * Database Repository Implementation\n *\n * Database adapter integration with @plyaz/db for feature flag storage.\n * Provides optimized queries and transaction management.\n *\n * @fileoverview Database repository for feature flags\n */\n\nimport { randomUUID } from 'node:crypto';\nimport {\n type FeatureFlag,\n type FeatureFlagRule,\n type FeatureFlagValue,\n type CreateFlagRequest,\n type FeatureFlagContext,\n DATABASE_ERROR_CODES,\n} from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { DatabaseConnectionManager } from './connection';\nimport {\n SORT_DIRECTION,\n DATABASE_TABLE,\n FEATURE_FLAG_FIELD,\n FEATURE_FLAG_RULE_FIELD,\n type DatabaseFeatureFlagRow,\n type DatabaseFeatureFlagRuleRow,\n type DatabaseOverrideRow,\n type DatabaseEvaluationRow,\n type EnvironmentFilterRow,\n} from '@plyaz/types';\nimport {\n DATABASE_FIELDS,\n SYSTEM_USERS,\n EVALUATION_REASONS,\n FEATURE_FLAG_TYPES,\n} from '@plyaz/types';\nimport { DatabaseError } from '@plyaz/errors';\n\n/**\n * Database Repository for Feature Flags\n *\n * **FOURTH COMPONENT CALLED** - Handles all database operations for feature flags\n *\n * **EXECUTION ORDER:**\n * 1. FeatureFlagService.onModuleInit()\n * 2. → FeatureFlagConfigFactory.fromEnvironment()\n * 3. → DatabaseConnectionManager.initialize()\n * 4. → **THIS REPOSITORY USED** ← YOU ARE HERE\n * 5. → Database queries executed via Drizzle ORM\n *\n * **PURPOSE:**\n * - Executes optimized SQL queries using Drizzle ORM\n * - Maps database rows to TypeScript types\n * - Handles CRUD operations for flags, rules, evaluations, and overrides\n * - Provides audit logging and user override functionality\n *\n * **PERFORMANCE FEATURES:**\n * - Uses database indexes for fast queries\n * - Batch operations where possible\n * - Connection pooling via DatabaseConnectionManager\n * - Optimized queries with proper WHERE clauses and ordering\n *\n * @template TKey - Feature flag key type (extends string)\n *\n * @example Basic Usage (automatically called by provider):\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Get all flags (called during system initialization)\n * const flags = await repository.getAllFlags();\n *\n * // Get specific flag (called during runtime evaluation)\n * const flag = await repository.getFlag('PREMIUM_FEATURE');\n *\n * // Create new flag (called via admin API)\n * const newFlag = await repository.createFlag({\n * key: 'NEW_FEATURE',\n * value: true,\n * isEnabled: true,\n * description: 'New awesome feature'\n * });\n * ```\n *\n * @example Query Performance:\n * ```sql\n * -- Optimized queries with indexes:\n * SELECT * FROM feature_flags WHERE key = 'PREMIUM_FEATURE'; -- Uses primary key index\n * SELECT * FROM feature_flag_rules WHERE flag_key = 'PREMIUM_FEATURE' AND is_enabled = true ORDER BY priority DESC; -- Uses composite index\n * ```\n */\nexport class FeatureFlagDatabaseRepository<TKey extends string = FeatureFlagKey> {\n private connectionManager = DatabaseConnectionManager.getInstance();\n\n /**\n * Retrieves all feature flags from the database with optional environment filtering\n *\n * @description Fetches all feature flags from the database. This method is primarily called\n * during system initialization to load flags into cache, but can also be used for\n * administrative purposes or cache refresh operations.\n *\n * @param {string} [environment] - Optional environment filter (e.g., 'production', 'staging')\n * @returns {Promise<FeatureFlag<TKey>[]>} Array of feature flags matching the criteria\n *\n * @throws {Error} When database query fails critically\n *\n * @example\n * ```typescript\n * // Get all flags for system initialization\n * const repository = new FeatureFlagDatabaseRepository();\n * const allFlags = await repository.getAllFlags();\n * console.log(`Loaded ${allFlags.length} feature flags`);\n *\n * // Get only production flags\n * const prodFlags = await repository.getAllFlags('production');\n * console.log(`Production flags: ${prodFlags.length}`);\n *\n * // Handle empty results\n * const flags = await repository.getAllFlags('nonexistent');\n * if (flags.length === 0) {\n * console.log('No flags found for environment');\n * }\n * ```\n *\n */\n async getAllFlags(environment?: string): Promise<FeatureFlag<TKey>[]> {\n const db = this.connectionManager.getDatabase();\n\n const options = {\n sort: [\n {\n field: FEATURE_FLAG_FIELD.Key as keyof object,\n direction: SORT_DIRECTION.Asc,\n },\n ],\n pagination: { page: 1, limit: 1000 },\n };\n\n const result = await db.query(DATABASE_TABLE.FeatureFlags, options);\n\n if (!result.success) {\n console.warn('Query failed, returning empty array:', result.error?.message);\n return [];\n }\n\n let flags = result.value?.data ?? [];\n\n if (environment) {\n flags = (flags as EnvironmentFilterRow[]).filter(flag => {\n return Boolean(flag.environments?.includes(environment));\n });\n }\n\n return flags.map(flag => this.mapToFeatureFlag(flag as DatabaseFeatureFlagRow));\n }\n\n /**\n * Retrieves a specific feature flag by its key\n *\n * @description Fetches a single feature flag from the database using its unique key.\n * This method is optimized for runtime flag evaluation and uses the primary key index\n * for O(1) lookup performance.\n *\n * @param {TKey} key - The unique identifier of the feature flag to retrieve\n * @returns {Promise<FeatureFlag<TKey> | null>} The feature flag object or null if not found\n *\n * @throws {Error} When database operation fails\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Get a specific flag for evaluation\n * const premiumFlag = await repository.getFlag('PREMIUM_FEATURE');\n * if (premiumFlag) {\n * console.log(`Flag enabled: ${premiumFlag.isEnabled}`);\n * console.log(`Flag value:`, premiumFlag.value);\n * } else {\n * console.log('Flag not found');\n * }\n *\n * // Handle flag evaluation\n * const checkoutFlag = await repository.getFlag('NEW_CHECKOUT');\n * const isNewCheckoutEnabled = checkoutFlag?.isEnabled ?? false;\n * ```\n *\n */\n async getFlag(key: TKey): Promise<FeatureFlag<TKey> | null> {\n const db = this.connectionManager.getDatabase();\n\n const result = await db.get(DATABASE_TABLE.FeatureFlags, key);\n\n if (!result.success) {\n throw new DatabaseError(\n `Failed to get flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.NO_DATA\n );\n }\n\n return result.value ? this.mapToFeatureFlag(result.value as DatabaseFeatureFlagRow) : null;\n }\n\n /**\n * Creates a new feature flag in the database\n *\n * @description Creates a new feature flag record with the provided configuration.\n * This method is typically called through administrative interfaces or during\n * system setup and migration processes.\n *\n * @param {CreateFlagRequest<TKey>} data - The feature flag creation data\n * @returns {Promise<FeatureFlag<TKey>>} The created feature flag object\n *\n * @throws {Error} When flag key already exists (primary key constraint violation)\n * @throws {Error} When database operation fails\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Create a simple boolean flag\n * const simpleFlag = await repository.createFlag({\n * key: 'ENABLE_DARK_MODE',\n * value: true,\n * isEnabled: true,\n * environment: 'production',\n * description: 'Enable dark mode theme'\n * });\n *\n * // Create a complex flag with object value\n * const complexFlag = await repository.createFlag({\n * key: 'CHECKOUT_CONFIG',\n * value: {\n * variant: 'blue',\n * showPromo: true,\n * maxItems: 10\n * },\n * isEnabled: false,\n * environment: 'staging',\n * description: 'Checkout page configuration'\n * });\n *\n * console.log(`Created flag: ${simpleFlag.key}`);\n * ```\n *\n */\n async createFlag(data: CreateFlagRequest<TKey>): Promise<FeatureFlag<TKey>> {\n const db = this.connectionManager.getDatabase();\n\n const flagData = {\n [FEATURE_FLAG_FIELD.Key]: data.key,\n [FEATURE_FLAG_FIELD.Value]: data.value,\n [FEATURE_FLAG_FIELD.IsEnabled]: data.isEnabled ?? true,\n [FEATURE_FLAG_FIELD.Environments]: data.environment ? [data.environment] : undefined,\n [FEATURE_FLAG_FIELD.Description]: data.description,\n [FEATURE_FLAG_FIELD.UpdatedAt]: new Date().toISOString(),\n };\n\n const result = await db.create(DATABASE_TABLE.FeatureFlags, flagData);\n\n if (!result.success || !result.value) {\n throw new DatabaseError(\n `Failed to create flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.CREATE_FAILED\n );\n }\n\n return this.mapToFeatureFlag(result.value as DatabaseFeatureFlagRow);\n }\n\n /**\n * Updates an existing feature flag in the database\n *\n * @description Updates specific fields of an existing feature flag. Only provided\n * fields will be updated, leaving other fields unchanged. The updated_at timestamp\n * is automatically set to the current time.\n *\n * @param {TKey} key - The unique identifier of the feature flag to update\n * @param {Partial<CreateFlagRequest<TKey>>} data - Partial flag data to update\n * @returns {Promise<FeatureFlag<TKey>>} The updated feature flag object\n *\n * @throws {Error} When flag with the specified key is not found\n * @throws {Error} When database operation fails\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Enable a flag\n * const enabledFlag = await repository.updateFlag('BETA_FEATURE', {\n * isEnabled: true\n * });\n *\n * // Update flag value and description\n * const updatedFlag = await repository.updateFlag('CHECKOUT_CONFIG', {\n * value: { variant: 'green', showPromo: false },\n * description: 'Updated checkout configuration'\n * });\n *\n * // Change environment\n * const prodFlag = await repository.updateFlag('NEW_FEATURE', {\n * environment: 'production'\n * });\n *\n * console.log(`Updated flag: ${updatedFlag.key}`);\n * ```\n *\n */\n async updateFlag(key: TKey, data: Partial<CreateFlagRequest<TKey>>): Promise<FeatureFlag<TKey>> {\n const db = this.connectionManager.getDatabase();\n\n const updateData = {\n ...data,\n [FEATURE_FLAG_FIELD.UpdatedAt]: new Date().toISOString(),\n };\n\n const result = await db.update(DATABASE_TABLE.FeatureFlags, key, updateData);\n\n if (!result.success || !result.value) {\n throw new DatabaseError(\n `Failed to update flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.UPDATE_FAILED\n );\n }\n\n return this.mapToFeatureFlag(result.value as DatabaseFeatureFlagRow);\n }\n\n /**\n * Deletes a feature flag from the database\n *\n * @description Permanently removes a feature flag from the database. This operation\n * cannot be undone. All associated rules, evaluations, and overrides should be\n * cleaned up separately if needed.\n *\n * @param {TKey} key - The unique identifier of the feature flag to delete\n * @returns {Promise<void>} Promise that resolves when deletion is complete\n *\n * @throws {Error} When flag with the specified key is not found\n * @throws {Error} When database operation fails\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Delete a flag\n * try {\n * await repository.deleteFlag('OLD_FEATURE');\n * console.log('Flag deleted successfully');\n * } catch (error) {\n * console.error('Failed to delete flag:', error.message);\n * }\n *\n * // Verify deletion\n * const deletedFlag = await repository.getFlag('OLD_FEATURE');\n * console.log(deletedFlag === null); // true\n * ```\n *\n */\n async deleteFlag(key: TKey): Promise<void> {\n const db = this.connectionManager.getDatabase();\n\n const result = await db.delete(DATABASE_TABLE.FeatureFlags, key);\n\n if (!result.success) {\n throw new DatabaseError(\n `Failed to delete flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.DELETE_FAILED\n );\n }\n }\n\n /**\n * Retrieves all rules associated with a specific feature flag\n *\n * @description Fetches all rules configured for a specific feature flag, ordered by\n * priority in descending order. Rules are used for advanced flag evaluation logic\n * based on user context and conditions.\n *\n * @param {TKey} key - The feature flag key to get rules for\n * @returns {Promise<FeatureFlagRule<TKey>[]>} Array of rules for the specified flag\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Get rules for a flag\n * const rules = await repository.getFlagRules('PREMIUM_FEATURE');\n * console.log(`Found ${rules.length} rules`);\n *\n * // Process rules by priority\n * rules.forEach(rule => {\n * console.log(`Rule: ${rule.name}, Priority: ${rule.priority}`);\n * });\n * ```\n *\n */\n async getFlagRules(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n const db = this.connectionManager.getDatabase();\n\n const options = {\n filter: {\n field: FEATURE_FLAG_RULE_FIELD.FlagKey as keyof object,\n operator: 'eq' as const,\n value: key as string,\n },\n sort: [\n {\n field: FEATURE_FLAG_RULE_FIELD.Priority as keyof object,\n direction: SORT_DIRECTION.Desc,\n },\n ],\n } as const;\n\n const result = await db.list(\n DATABASE_TABLE.FeatureFlagRules,\n options as unknown as Parameters<typeof db.list>[1]\n );\n\n if (!result.success) {\n console.warn('getFlagRules failed, returning empty array:', result.error?.message);\n return [];\n }\n\n const rules = result.value?.data ?? [];\n return rules.map(rule => this.mapToFeatureFlagRule(rule as DatabaseFeatureFlagRuleRow));\n }\n\n /**\n * Retrieves all enabled feature flag rules from the database\n *\n * @description Fetches all enabled rules across all feature flags, sorted by flag key\n * and then by priority. This method is used during system initialization to load\n * all active rules into the evaluation engine.\n *\n * @returns {Promise<FeatureFlagRule<TKey>[]>} Array of all enabled rules\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Load all rules for evaluation engine\n * const allRules = await repository.getAllRules();\n * console.log(`Loaded ${allRules.length} active rules`);\n *\n * // Group rules by flag\n * const rulesByFlag = allRules.reduce((acc, rule) => {\n * if (!acc[rule.flagKey]) acc[rule.flagKey] = [];\n * acc[rule.flagKey].push(rule);\n * return acc;\n * }, {});\n * ```\n *\n */\n async getAllRules(): Promise<FeatureFlagRule<TKey>[]> {\n const db = this.connectionManager.getDatabase();\n\n const options = {\n filter: {\n field: FEATURE_FLAG_RULE_FIELD.IsEnabled as keyof object,\n operator: 'eq' as const,\n value: true,\n },\n sort: [\n { field: FEATURE_FLAG_RULE_FIELD.FlagKey as keyof object, direction: SORT_DIRECTION.Asc },\n { field: FEATURE_FLAG_RULE_FIELD.Priority as keyof object, direction: SORT_DIRECTION.Desc },\n ],\n } as const;\n\n const result = await db.list(\n DATABASE_TABLE.FeatureFlagRules,\n options as unknown as Parameters<typeof db.list>[1]\n );\n\n if (!result.success) {\n console.warn('getAllRules failed, returning empty array:', result.error?.message);\n return [];\n }\n\n const rules = result.value?.data ?? [];\n return rules.map(rule => this.mapToFeatureFlagRule(rule as DatabaseFeatureFlagRuleRow));\n }\n\n /**\n * Logs a feature flag evaluation for audit and analytics purposes\n *\n * @description Records feature flag evaluation events for compliance tracking,\n * debugging, and analytics. This method is called after each flag evaluation\n * when audit logging is enabled.\n *\n * @param {Object} params - The evaluation parameters\n * @param {TKey} params.flagKey - The feature flag key that was evaluated\n * @param {string} [params.userId] - Optional user ID who triggered the evaluation\n * @param {FeatureFlagContext} [params.context] - Optional evaluation context\n * @param {FeatureFlagValue} params.result - The evaluation result\n * @returns {Promise<void>} Promise that resolves when log entry is created\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Log a user evaluation\n * await repository.logEvaluation({\n * flagKey: 'PREMIUM_FEATURE',\n * userId: 'user123',\n * context: {\n * userRole: 'premium',\n * environment: 'production',\n * requestId: 'req-456'\n * },\n * result: true\n * });\n *\n * // Log anonymous evaluation\n * await repository.logEvaluation({\n * flagKey: 'PUBLIC_FEATURE',\n * result: { variant: 'blue', enabled: true }\n * });\n * ```\n *\n */\n async logEvaluation(params: {\n flagKey: TKey;\n userId?: string;\n context?: FeatureFlagContext;\n result: FeatureFlagValue;\n }): Promise<void> {\n try {\n const db = this.connectionManager.getDatabase();\n\n const evaluationData: DatabaseEvaluationRow = {\n id: randomUUID(),\n flag_key: params.flagKey as string,\n user_id: params.userId,\n context: params.context\n ? (params.context as unknown as Record<string, string | number | boolean>)\n : undefined,\n result: params.result,\n reason: EVALUATION_REASONS.EVALUATION,\n evaluated_at: new Date().toISOString(),\n };\n\n const result = await db.create(DATABASE_TABLE.FeatureFlagEvaluations, evaluationData);\n\n if (!result.success) {\n console.warn('logEvaluation failed:', result.error?.message);\n }\n } catch (error) {\n console.warn('logEvaluation error:', error);\n }\n }\n\n /**\n * Sets a user-specific override for a feature flag\n *\n * @description Creates a user-specific override that takes precedence over the\n * default flag value and rules. Overrides can have optional expiration times\n * and are useful for testing, gradual rollouts, or user-specific configurations.\n *\n * @param {TKey} flagKey - The feature flag key to override\n * @param {string} userId - The user ID for whom to set the override\n * @param {FeatureFlagValue} value - The override value\n * @param {Date} [expiresAt] - Optional expiration date for the override\n * @returns {Promise<void>} Promise that resolves when override is created\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Set permanent override\n * await repository.setOverride(\n * 'BETA_FEATURE',\n * 'user123',\n * true\n * );\n *\n * // Set temporary override (expires in 1 hour)\n * const expiresAt = new Date(Date.now() + 60 * 60 * 1000);\n * await repository.setOverride(\n * 'PREMIUM_FEATURE',\n * 'testuser456',\n * { enabled: true, variant: 'premium' },\n * expiresAt\n * );\n * ```\n *\n */\n async setOverride(\n flagKey: TKey,\n userId: string,\n value: FeatureFlagValue,\n expiresAt?: Date\n ): Promise<void> {\n const db = this.connectionManager.getDatabase();\n\n const overrideData: DatabaseOverrideRow = {\n id: randomUUID(),\n flag_key: flagKey as string,\n user_id: userId,\n value,\n expires_at: expiresAt?.toISOString(),\n created_at: new Date().toISOString(),\n };\n\n const result = await db.create(DATABASE_TABLE.FeatureFlagOverrides, overrideData);\n\n if (!result.success) {\n console.warn('setOverride failed:', result.error?.message);\n }\n }\n\n /**\n * Retrieves a user-specific override for a feature flag\n *\n * @description Fetches the override value for a specific user and flag combination.\n * Automatically filters out expired overrides. Returns null if no valid override\n * exists for the user.\n *\n * @param {TKey} flagKey - The feature flag key to check for overrides\n * @param {string} userId - The user ID to get the override for\n * @returns {Promise<FeatureFlagValue | null>} The override value or null if none exists\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Check for user override\n * const override = await repository.getOverride('BETA_FEATURE', 'user123');\n * if (override !== null) {\n * console.log('User has override:', override);\n * } else {\n * console.log('No override found, using default flag value');\n * }\n *\n * // Use in flag evaluation\n * const userOverride = await repository.getOverride('PREMIUM_FEATURE', userId);\n * const flagValue = userOverride ?? defaultFlagValue;\n * ```\n *\n */\n async getOverride(flagKey: TKey, userId: string): Promise<FeatureFlagValue | null> {\n const db = this.connectionManager.getDatabase();\n\n const options = {\n filter: {\n field: DATABASE_FIELDS.FlagKey as keyof object,\n operator: 'eq' as const,\n value: flagKey as string,\n },\n } as const;\n\n const result = await db.list(\n DATABASE_TABLE.FeatureFlagOverrides,\n options as unknown as Parameters<typeof db.list>[1]\n );\n\n if (!result.success || !result.value?.data) {\n return null;\n }\n\n const typedData = result.value.data as DatabaseOverrideRow[];\n const validOverrides = typedData.filter(override => {\n if (override.user_id !== userId) return false;\n if (override.expires_at && new Date(override.expires_at) < new Date()) return false;\n return true;\n });\n\n return validOverrides.length > 0 ? validOverrides[0].value : null;\n }\n\n /**\n * Removes user-specific overrides for a feature flag\n *\n * @description Deletes all override records for a specific user and flag combination.\n * This operation cannot be undone and will cause the user to receive the default\n * flag value or rule-based evaluation on subsequent requests.\n *\n * @param {TKey} flagKey - The feature flag key to remove overrides for\n * @param {string} userId - The user ID to remove overrides for\n * @returns {Promise<void>} Promise that resolves when overrides are removed\n *\n * @example\n * ```typescript\n * const repository = new FeatureFlagDatabaseRepository();\n *\n * // Remove user override\n * await repository.removeOverride('BETA_FEATURE', 'user123');\n * console.log('Override removed, user will get default flag value');\n *\n * // Verify removal\n * const override = await repository.getOverride('BETA_FEATURE', 'user123');\n * console.log(override === null); // true\n *\n * // Bulk cleanup - remove overrides for multiple users\n * const userIds = ['user1', 'user2', 'user3'];\n * for (const userId of userIds) {\n * await repository.removeOverride('OLD_FEATURE', userId);\n * }\n * ```\n *\n */\n async removeOverride(flagKey: TKey, userId: string): Promise<void> {\n const db = this.connectionManager.getDatabase();\n\n const options = {\n filter: {\n field: DATABASE_FIELDS.FlagKey as keyof object,\n operator: 'eq' as const,\n value: flagKey as string,\n },\n } as const;\n\n const listResult = await db.list(\n DATABASE_TABLE.FeatureFlagOverrides,\n options as unknown as Parameters<typeof db.list>[1]\n );\n\n if (!listResult.success || !listResult.value?.data) {\n return;\n }\n\n const typedOverrides = listResult.value.data as DatabaseOverrideRow[];\n const overridesToDelete = typedOverrides.filter(override => override.user_id === userId);\n\n for (const override of overridesToDelete) {\n await db.delete(DATABASE_TABLE.FeatureFlagOverrides, override.id);\n }\n }\n\n /**\n * Maps a database row to a FeatureFlag object\n *\n * @description Converts raw database row data to a properly typed FeatureFlag object.\n * Handles field name variations between database schema and application types,\n * provides default values for missing fields, and ensures type safety.\n *\n * @private\n * @param {DatabaseFeatureFlagRow} row - Raw database row data\n * @returns {FeatureFlag<TKey>} Typed FeatureFlag object\n *\n * @example\n * ```typescript\n * // Database row input:\n * const dbRow = {\n * key: 'PREMIUM_FEATURE',\n * value: { enabled: true, variant: 'blue' },\n * is_enabled: true,\n * environments: ['production'],\n * description: 'Premium feature toggle',\n * created_at: '2024-01-15T10:30:00Z'\n * };\n *\n * // Mapped output:\n * const flag = this.mapToFeatureFlag(dbRow);\n * // {\n * // key: 'PREMIUM_FEATURE',\n * // type: 'boolean',\n * // name: 'PREMIUM_FEATURE',\n * // value: { enabled: true, variant: 'blue' },\n * // isEnabled: true,\n * // environment: 'production',\n * // description: 'Premium feature toggle',\n * // createdAt: Date('2024-01-15T10:30:00Z'),\n * // updatedAt: Date('2024-01-15T10:30:00Z'),\n * // createdBy: 'system',\n * // updatedBy: 'system'\n * // }\n * ```\n *\n */\n private mapToFeatureFlag(row: DatabaseFeatureFlagRow): FeatureFlag<TKey> {\n return {\n key: row.key as TKey,\n type: FEATURE_FLAG_TYPES.BOOLEAN,\n name: row.key,\n value: row.value,\n isEnabled: this.getIsEnabled(row),\n environment: row.environments?.[0] ?? '',\n description: row.description ?? '',\n createdAt: this.getCreatedAt(row),\n updatedAt: this.getUpdatedAt(row),\n createdBy: SYSTEM_USERS.SYSTEM,\n updatedBy: SYSTEM_USERS.SYSTEM,\n };\n }\n\n /**\n * Extracts the enabled status from a database row\n *\n * @private\n * @param {DatabaseFeatureFlagRow} row - Database row with enabled field variations\n * @returns {boolean} The enabled status, defaulting to true if not specified\n */\n private getIsEnabled(row: DatabaseFeatureFlagRow): boolean {\n return row.isEnabled ?? row.is_enabled ?? true;\n }\n\n /**\n * Extracts the creation date from a database row\n *\n * @private\n * @param {DatabaseFeatureFlagRow} row - Database row with creation date field variations\n * @returns {Date} The creation date, defaulting to current date if not specified\n */\n private getCreatedAt(row: DatabaseFeatureFlagRow): Date {\n return row.createdAt ?? (row.created_at ? new Date(row.created_at) : new Date());\n }\n\n /**\n * Extracts the update date from a database row\n *\n * @private\n * @param {DatabaseFeatureFlagRow} row - Database row with update date field variations\n * @returns {Date} The update date, defaulting to current date if not specified\n */\n private getUpdatedAt(row: DatabaseFeatureFlagRow): Date {\n return row.updatedAt ?? (row.updated_at ? new Date(row.updated_at) : new Date());\n }\n\n /**\n * Maps a database row to a FeatureFlagRule object\n *\n * @description Converts raw database rule row data to a properly typed FeatureFlagRule object.\n * Handles field name variations and ensures type safety for rule evaluation.\n *\n * @private\n * @param {DatabaseFeatureFlagRuleRow} row - Raw database rule row data\n * @returns {FeatureFlagRule<TKey>} Typed FeatureFlagRule object\n *\n */\n private mapToFeatureFlagRule(row: DatabaseFeatureFlagRuleRow): FeatureFlagRule<TKey> {\n return {\n id: row.id,\n flagKey: (row.flagKey || row.flag_key) as TKey,\n name: row.name,\n conditions: row.conditions,\n value: row.value,\n priority: row.priority,\n isEnabled: row.isEnabled ?? row.is_enabled ?? true,\n };\n }\n}\n","/**\n * Database Feature Flag Provider\n *\n * Database-based provider with Drizzle ORM and Supabase integration.\n * Provides persistent storage with caching and transaction support.\n *\n * @fileoverview Database provider for feature flags\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProvider } from '../provider';\nimport { DatabaseConnectionManager } from '@backend/featureFlags/database/connection';\nimport { FeatureFlagDatabaseRepository } from '@backend/featureFlags/database/repository';\n// Note: DatabaseConfig type lives in the backend config module but isn't exported reliably.\n// Avoid importing it here to prevent build-time circular/visibility issues.\n\n/**\n * Database-based feature flag provider with Drizzle ORM integration.\n *\n * @class DatabaseFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new DatabaseFeatureFlagProvider({\n * provider: 'database',\n * databaseConfig: {\n * connectionString: process.env.SUPABASE_URL,\n * tableName: 'feature_flags',\n * },\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class DatabaseFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private connectionManager = DatabaseConnectionManager.getInstance();\n private repository = new FeatureFlagDatabaseRepository<FeatureFlagKey>();\n\n /**\n * Creates a new database feature flag provider.\n *\n * @param config - Provider configuration with database settings\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n\n // Always throw error for stub implementation as expected by tests\n throw new Error('Database provider requires @plyaz/db package implementation');\n }\n\n /**\n * Initialize database connection\n */\n async initialize(): Promise<void> {\n // DatabaseConnectionManager.initialize() does not accept args; call without parameters\n await this.connectionManager.initialize();\n await super.initialize();\n }\n\n /**\n * Fetches flags and rules from the database.\n *\n * @protected\n * @returns Promise with flags and rules from database\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n throw new Error(\n 'Database Provider is not yet implemented.\\n\\n' +\n 'Required Database Setup:\\n' +\n '- Install @plyaz/db package\\n' +\n '- Configure database connection\\n' +\n '- Run database migrations\\n\\n' +\n 'Required Tables:\\n' +\n '- feature_flags\\n' +\n '- feature_flag_rules\\n\\n' +\n 'Database Schema:\\n' +\n 'See /src/backend/featureFlags/database/schema.ts for table definitions'\n );\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n super.dispose();\n this.connectionManager.close().catch(error => {\n this.log('Error closing database connection:', error);\n });\n }\n\n /**\n * Validates the database provider configuration.\n *\n * @private\n * @throws Error if configuration is invalid or incomplete\n */\n private validateConfig(): void {\n this.validateProviderType();\n this.validateDatabaseConfig();\n this.validateConnectionString();\n this.logConfigurationStatus();\n }\n\n private validateProviderType(): void {\n if (this.config.provider !== 'database') {\n throw new Error('Database provider requires provider to be set to \"database\"');\n }\n }\n\n private validateDatabaseConfig(): void {\n if (!this.config.databaseConfig) {\n throw new Error(\n 'Database configuration is required for database provider. ' +\n 'Set databaseConfig in your configuration.\\n' +\n 'Example: databaseConfig: { connectionString: \"postgresql://...\", tableName: \"feature_flags\" }'\n );\n }\n }\n\n private validateConnectionString(): void {\n const { connectionString, tableName } = this.config.databaseConfig!;\n\n if (!connectionString) {\n throw new Error(\n 'Database connection string is required. ' +\n 'Set connectionString in your databaseConfig.\\n' +\n 'Example: connectionString: \"postgresql://user:pass@localhost:5432/plyaz\"'\n );\n }\n\n if (!this.isValidPostgresUrl(connectionString) && !this.isValidMysqlUrl(connectionString)) {\n throw new Error(\n 'Database connection string must be a valid PostgreSQL or MySQL URL. ' +\n `Received: ${connectionString}\\n` +\n 'Examples:\\n' +\n '- PostgreSQL: \"postgresql://user:pass@localhost:5432/plyaz\"\\n' +\n '- MySQL: \"mysql://user:pass@localhost:3306/plyaz\"'\n );\n }\n\n if (!tableName || typeof tableName !== 'string') {\n throw new Error('Database provider requires databaseConfig.tableName');\n }\n }\n\n private logConfigurationStatus(): void {\n const { connectionString, tableName } = this.config.databaseConfig!;\n // Configuration is valid, but implementation is missing\n this.log('Database provider configuration is valid, but implementation is not ready');\n this.log('Connection String:', this.maskConnectionString(connectionString));\n this.log('Table Name:', tableName ?? 'feature_flags (default)');\n }\n\n /**\n * Validates PostgreSQL URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid PostgreSQL URL\n */\n private isValidPostgresUrl(url: string): boolean {\n return url.startsWith('postgresql://') || url.startsWith('postgres://');\n }\n\n /**\n * Validates MySQL URL format.\n *\n * @private\n * @param url - URL to validate\n * @returns True if valid MySQL URL\n */\n private isValidMysqlUrl(url: string): boolean {\n return url.startsWith('mysql://');\n }\n\n /**\n * Masks sensitive parts of connection string for logging.\n *\n * @private\n * @param connectionString - Original connection string\n * @returns Masked connection string\n */\n private maskConnectionString(connectionString: string): string {\n try {\n const url = new URL(connectionString);\n const masked = `${url.protocol}//${url.username}:****@${url.host}${url.pathname}`;\n return masked;\n } catch {\n return '[INVALID_URL]';\n }\n }\n\n /**\n * Gets database provider status and configuration info.\n *\n * @returns Database provider status information\n */\n getDatabaseInfo(): {\n connectionString?: string;\n tableName?: string;\n isImplemented: boolean;\n requiredPackages: string[];\n recommendedORM: string[];\n documentationPath: string;\n schemaPath: string;\n } {\n return {\n connectionString: this.config.databaseConfig?.connectionString\n ? this.maskConnectionString(this.config.databaseConfig.connectionString)\n : undefined,\n tableName: this.config.databaseConfig?.tableName ?? 'feature_flags',\n isImplemented: false,\n requiredPackages: ['@plyaz/db'],\n recommendedORM: ['drizzle-orm', 'prisma'],\n documentationPath: '/docs/feature-flag-to-implement/database-requirements.md',\n schemaPath: '/docs/feature-flag-to-implement/database-requirements.md#database-schema',\n };\n }\n}\n","/**\n * Feature Flag Provider Factory\n *\n * Factory class for creating and managing feature flag providers.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Provider factory for feature flag system\n * @version 1.0.0\n */\n\nimport type { FeatureFlagConfig, FeatureFlagProvider, FeatureFlagValue } from '@plyaz/types';\nimport type { FeatureFlagKey } from '../../types';\nimport { MemoryFeatureFlagProvider } from './memory';\nimport { FileFeatureFlagProvider } from './file';\nimport { RedisFeatureFlagProvider } from './redis';\nimport { ApiFeatureFlagProvider } from './api';\nimport { DatabaseFeatureFlagProvider } from './database';\nimport { FEATURE_FLAG_CACHE_TTL_DEFAULT, FEATURE_FLAG_FILE_PATHS } from '@plyaz/config';\n\n/**\n * Registry of available provider classes.\n */\nconst PROVIDER_REGISTRY = {\n memory: MemoryFeatureFlagProvider,\n file: FileFeatureFlagProvider,\n redis: RedisFeatureFlagProvider,\n api: ApiFeatureFlagProvider,\n database: DatabaseFeatureFlagProvider,\n} as const satisfies Record<\n string,\n new (\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) => FeatureFlagProvider<FeatureFlagKey>\n>;\n\n/**\n * Type for available provider names.\n */\nexport type ProviderType = keyof typeof PROVIDER_REGISTRY;\n\n/**\n * Feature flag provider factory for creating provider instances.\n *\n * @class FeatureFlagProviderFactory\n *\n * @example\n * ```typescript\n * const provider = FeatureFlagProviderFactory.create({\n * provider: 'memory',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * });\n * ```\n */\nexport class FeatureFlagProviderFactory {\n /**\n * Creates a new feature flag provider instance based on configuration.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Configured provider instance\n * @throws Error if provider type is unsupported or configuration is invalid\n */\n static create<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ): FeatureFlagProvider<FeatureFlagKey> {\n this.validateConfig<FeatureFlagKey>(config);\n\n const ProviderClass = PROVIDER_REGISTRY[config.provider];\n if (!ProviderClass) {\n throw new Error(\n `Unsupported provider type: ${config.provider}. ` +\n `Supported types: ${this.getSupportedProviders().join(', ')}`\n );\n }\n\n try {\n return new ProviderClass<FeatureFlagKey>(config, features);\n } catch (error) {\n throw new Error(\n `Failed to create ${config.provider} provider: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Creates a provider with automatic initialization.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Promise resolving to initialized provider instance\n */\n static async createAndInitialize<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ): Promise<FeatureFlagProvider<FeatureFlagKey>> {\n const provider = this.create(config, features);\n await provider.initialize();\n return provider;\n }\n\n /**\n * Gets a list of all supported provider types.\n *\n * @returns Array of supported provider names\n */\n static getSupportedProviders(): ProviderType[] {\n return Object.keys(PROVIDER_REGISTRY) as ProviderType[];\n }\n\n /**\n * Checks if a provider type is supported.\n *\n * @param providerType - Provider type to check\n * @returns True if provider type is supported\n */\n static isProviderSupported(providerType: string): providerType is ProviderType {\n return providerType in PROVIDER_REGISTRY;\n }\n\n /**\n * Gets provider information including implementation status.\n *\n * @returns Record of provider information\n */\n static getProvidersInfo(): Record<\n ProviderType,\n {\n name: string;\n isImplemented: boolean;\n description: string;\n requirements?: string[];\n }\n > {\n return {\n memory: {\n name: 'Memory Provider',\n isImplemented: true,\n description: 'In-memory provider using FEATURES constant',\n },\n file: {\n name: 'File Provider',\n isImplemented: true,\n description: 'File-based provider supporting JSON and YAML formats',\n },\n redis: {\n name: 'Redis Provider',\n isImplemented: true,\n description: 'Redis-based provider for distributed caching',\n requirements: ['ioredis or redis package'],\n },\n api: {\n name: 'API Provider',\n isImplemented: false,\n description: 'Remote API provider for centralized flag management',\n requirements: ['@plyaz/api package', 'API endpoints implementation'],\n },\n database: {\n name: 'Database Provider',\n isImplemented: false,\n description: 'Database provider for persistent flag storage',\n requirements: ['@plyaz/db package', 'Database schema setup'],\n },\n } satisfies Record<\n ProviderType,\n {\n name: string;\n isImplemented: boolean;\n description: string;\n requirements?: string[];\n }\n >;\n }\n\n /**\n * Creates a default provider.\n * Uses file provider if features are not provided, memory provider otherwise.\n *\n * @param features - Record of feature flag keys to their default values (optional)\n * @param overrides - Optional configuration overrides\n * @returns Provider instance\n */\n static createDefault<FeatureFlagKey extends string>(\n features?: Record<FeatureFlagKey, FeatureFlagValue>,\n overrides?: Partial<FeatureFlagConfig<FeatureFlagKey>>\n ): FeatureFlagProvider<FeatureFlagKey> {\n // If features are not provided, use file provider as default\n const provider = features ? 'memory' : 'file';\n\n const defaultConfig: FeatureFlagConfig<FeatureFlagKey> = {\n provider,\n isCacheEnabled: true,\n cacheTtl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n refreshInterval: 0, // No auto-refresh\n isLoggingEnabled: false,\n shouldFallbackToDefaults: true,\n ...overrides,\n };\n\n // Add default file config if using file provider and no fileConfig provided\n if (defaultConfig.provider === 'file' && !defaultConfig.fileConfig) {\n defaultConfig.fileConfig = {\n filePath: FEATURE_FLAG_FILE_PATHS.DEFAULT,\n format: 'json',\n shouldWatchForChanges: false,\n };\n }\n\n return this.create(defaultConfig, features ?? ({} as Record<FeatureFlagKey, FeatureFlagValue>));\n }\n\n /**\n * Type guard to check if a provider supports feature syncing.\n *\n * @param provider - The provider instance to check\n * @returns True if provider has syncFeatures method\n */\n static isSyncableProvider<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>\n ): provider is FeatureFlagProvider<FeatureFlagKey> &\n Required<Pick<FeatureFlagProvider<FeatureFlagKey>, 'syncFeatures'>> {\n return 'syncFeatures' in provider && typeof provider.syncFeatures === 'function';\n }\n\n /**\n * Updates features on a provider if it supports the syncFeatures method.\n * This is useful for providers like MemoryProvider that can update their features at runtime.\n *\n * @param provider - The provider instance\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n * @throws Error if provider doesn't support feature syncing\n */\n static async syncFeatures<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>,\n newFeatures: Record<FeatureFlagKey, FeatureFlagValue>\n ): Promise<void> {\n if (this.isSyncableProvider(provider)) {\n await provider.syncFeatures(newFeatures);\n } else {\n throw new Error(\n `Provider type does not support feature syncing. ` +\n `Only providers with syncFeatures method (like MemoryProvider and FileProvider) support this operation.`\n );\n }\n }\n\n /**\n * Checks if a provider supports feature syncing.\n *\n * @param provider - The provider instance to check\n * @returns True if provider supports syncFeatures method\n */\n static supportsFeaturesSync<FeatureFlagKey extends string>(\n provider: FeatureFlagProvider<FeatureFlagKey>\n ): boolean {\n return this.isSyncableProvider(provider);\n }\n\n /**\n * Validates provider configuration before instantiation.\n *\n * @private\n * @param config - Configuration to validate\n * @throws Error if configuration is invalid\n */\n public static validateConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config) {\n throw new Error('Provider configuration is required');\n }\n\n if (!config.provider) {\n throw new Error('Provider type is required in configuration');\n }\n\n if (!this.isProviderSupported(config.provider)) {\n throw new Error(\n `Unsupported provider type: ${config.provider}. ` +\n `Supported providers: ${this.getSupportedProviders().join(', ')}`\n );\n }\n\n // Validate cache configuration\n if (config.isCacheEnabled && config.cacheTtl <= 0) {\n throw new Error('Cache TTL must be greater than 0 when caching is enabled');\n }\n\n // Validate refresh interval\n if (config.refreshInterval < 0) {\n throw new Error('Refresh interval cannot be negative');\n }\n\n // Provider-specific validation\n this.validateProviderSpecificConfig(config);\n }\n\n /**\n * Validates provider-specific configuration requirements.\n *\n * @private\n * @param config - Configuration to validate\n * @throws Error if provider-specific configuration is invalid\n */\n private static validateProviderSpecificConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n const validationMap = {\n file: () => this.validateFileConfig<FeatureFlagKey>(config),\n redis: () => this.validateRedisConfig<FeatureFlagKey>(config),\n api: () => this.validateApiConfig<FeatureFlagKey>(config),\n database: () => this.validateDatabaseConfig<FeatureFlagKey>(config),\n memory: () => {}, // Memory provider has no additional requirements\n } as const satisfies Record<string, () => void>;\n\n const validator = validationMap[config.provider as keyof typeof validationMap];\n if (!validator) {\n throw new Error(`Unknown provider type: ${config.provider}`);\n }\n\n validator();\n }\n\n private static validateFileConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n // File config is optional, will use defaults if not provided\n if (config.fileConfig) {\n const { format } = config.fileConfig;\n if (format && !['json', 'yaml'].includes(format)) {\n throw new Error('File format must be either \"json\" or \"yaml\"');\n }\n }\n }\n\n private static validateRedisConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.redisConfig) {\n throw new Error('Redis configuration is required for Redis provider');\n }\n }\n\n private static validateApiConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.apiEndpoint) {\n throw new Error('API endpoint is required for API provider');\n }\n }\n\n private static validateDatabaseConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.databaseConfig) {\n throw new Error('Database configuration is required for database provider');\n }\n }\n}\n","/**\n * Feature Flags Domain - Main Exports\n *\n * This module provides the main exports for the feature flags domain logic.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Main feature flags domain exports\n * @version 1.0.0\n */\nimport type { FeatureFlagConfig, FeatureFlagOverrides } from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from './providers/factory';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES } from '@plyaz/config';\n\n// Core provider and factory\nexport { FeatureFlagProvider } from './provider';\nexport { FeatureFlagProviderFactory } from './providers/factory';\nexport type { ProviderType } from './providers/factory';\n\n// Individual providers\nexport { MemoryFeatureFlagProvider } from './providers/memory';\nexport { FileFeatureFlagProvider } from './providers/file';\nexport { RedisFeatureFlagProvider } from './providers/redis';\nexport { ApiFeatureFlagProvider } from './providers/api';\nexport { DatabaseFeatureFlagProvider } from './providers/database';\n\n/**\n * Default configuration for feature flags.\n * Provides sensible defaults for most use cases.\n */\nexport const DEFAULT_FEATURE_FLAG_CONFIG = {\n provider: 'memory',\n isCacheEnabled: true,\n cacheTtl: 300, // 5 minutes\n refreshInterval: 0, // No auto-refresh\n shouldFallbackToDefaults: true,\n isLoggingEnabled: false,\n} as const satisfies Partial<FeatureFlagConfig<FeatureFlagKey>>;\n\n/**\n * Feature flag system initialization for different environments.\n */\nexport const FeatureFlagSystem = {\n /**\n * Initialize for frontend/client applications.\n */\n initializeForFrontend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n const finalConfig = {\n ...DEFAULT_FEATURE_FLAG_CONFIG,\n ...config,\n } as FeatureFlagConfig<FeatureFlagKey>;\n const provider = FeatureFlagProviderFactory.create(finalConfig, FEATURES);\n await provider.initialize();\n return provider;\n },\n\n /**\n * Initialize for backend/server applications.\n */\n initializeForBackend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n const finalConfig = {\n ...DEFAULT_FEATURE_FLAG_CONFIG,\n ...config,\n } as FeatureFlagConfig<FeatureFlagKey>;\n const provider = FeatureFlagProviderFactory.create(finalConfig, FEATURES);\n await provider.initialize();\n return provider;\n },\n\n /**\n * Initialize for testing environments.\n */\n initializeForTesting: async (overrides: FeatureFlagOverrides<FeatureFlagKey> = {}) => {\n const provider = FeatureFlagProviderFactory.createDefault(FEATURES, {\n provider: 'memory',\n isCacheEnabled: false,\n isLoggingEnabled: false,\n });\n await provider.initialize();\n\n // Apply test overrides\n Object.entries(overrides).forEach(([key, value]) => {\n provider.setOverride(key as FeatureFlagKey, value);\n });\n\n return provider;\n },\n} as const;\n","/**\n * Feature Flag Controller\n *\n * NestJS controller for feature flag management.\n * Provides REST API endpoints for feature flag operations.\n *\n * @fileoverview NestJS controller for feature flags\n */\n\nimport { Controller, Get, Post, Put, Delete, Query, Param, Body } from '@nestjs/common';\nimport {\n type FeatureFlagValue,\n type FeatureFlagContext,\n type FeatureFlagEvaluation,\n type FeatureFlag,\n type FeatureFlagRule,\n ERROR_CODES,\n HTTP_STATUS,\n} from '@plyaz/types';\nimport type { FeatureFlagService } from './feature-flag.service';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { BaseError } from '@plyaz/errors';\n\n/**\n * Request DTO for flag evaluation.\n */\ninterface EvaluateFlagRequest {\n context?: FeatureFlagContext;\n}\n\n/**\n * Request DTO for creating/updating flags.\n */\ninterface CreateFlagRequest {\n name: string;\n description?: string;\n value: FeatureFlagValue;\n isEnabled?: boolean;\n environment?: 'all' | 'development' | 'staging' | 'production';\n rolloutPercentage?: number;\n}\n\n/**\n * Feature Flag Controller\n *\n * Provides REST endpoints for feature flag management and evaluation.\n *\n * @example\n * ```typescript\n * // GET /feature-flags/AUTH_GOOGLE/evaluate\n * // POST /feature-flags\n * // PUT /feature-flags/AUTH_GOOGLE\n * ```\n */\n@Controller('feature-flags')\nexport class FeatureFlagController {\n constructor(private readonly featureFlagService: FeatureFlagService) {}\n\n /**\n * Evaluates a feature flag for the given context.\n *\n * @param key - Feature flag key\n * @param body - Evaluation context\n * @returns Feature flag evaluation result\n */\n @Post(':key/evaluate')\n async evaluateFlag(\n @Param('key') key: FeatureFlagKey,\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.evaluateFlag(key, body.context);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to evaluate flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - Feature flag key\n * @param body - Evaluation context\n * @returns Boolean indicating if flag is enabled\n */\n @Post(':key/enabled')\n async isEnabled(\n @Param('key') key: FeatureFlagKey,\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<{ isEnabled: boolean }> {\n try {\n const isEnabled = await this.featureFlagService.isEnabled(key, body.context);\n return { isEnabled };\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to check flag status: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Gets all feature flags with their evaluations.\n *\n * @param body - Evaluation context\n * @returns All feature flag evaluations\n */\n @Post('evaluate-all')\n async evaluateAllFlags(\n @Body() body: EvaluateFlagRequest = {}\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n try {\n return await this.featureFlagService.getAllFlags(body.context);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.SERVER_ERROR,\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n `Failed to evaluate all flags: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Creates a new feature flag.\n *\n * @param key - Feature flag key\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n @Post()\n async createFlag(\n @Body() createData: CreateFlagRequest & { key: FeatureFlagKey }\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.createFlag(createData);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to create flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n @Put(':key')\n async updateFlag(\n @Param('key') key: FeatureFlagKey,\n @Body() updateData: Partial<CreateFlagRequest>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n return await this.featureFlagService.updateFlag(key, updateData);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to update flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Deletes a feature flag.\n *\n * @param key - Feature flag key\n */\n @Delete(':key')\n async deleteFlag(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.deleteFlag(key);\n return { isSuccessful: true };\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to delete flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Sets a manual override for a flag.\n *\n * @param key - Feature flag key\n * @param value - Override value\n */\n @Post(':key/override')\n async setOverride(\n @Param('key') key: FeatureFlagKey,\n @Body('value') value: FeatureFlagValue\n ): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.setOverride(key, value);\n return { isSuccessful: true };\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to set override: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Removes a manual override for a flag.\n *\n * @param key - Feature flag key\n */\n @Delete(':key/override')\n async removeOverride(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.removeOverride(key);\n return { isSuccessful: true };\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to remove override: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Gets all available feature flags.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n @Get()\n async getAllFeatureFlags(\n @Query('environment') environment?: string\n ): Promise<FeatureFlag<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagService.getAllFeatureFlags(environment);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.SERVER_ERROR,\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n `Failed to get flags: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n @Get(':key/rules')\n async getFlagRules(\n @Param('key') key: FeatureFlagKey\n ): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagService.getFlagRules(key);\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.API_INVALID_INPUT,\n HTTP_STATUS.BAD_REQUEST,\n `Failed to get flag rules: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Forces a refresh of the feature flag cache.\n */\n @Post('refresh')\n async refreshCache(): Promise<{ isSuccessful: boolean }> {\n try {\n await this.featureFlagService.refreshCache();\n return { isSuccessful: true };\n } catch (error) {\n throw new BaseError(\n ERROR_CODES.SERVER_ERROR,\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n `Failed to refresh cache: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n}\n","/**\n * Configuration Validation Utilities\n *\n * Validation utilities for feature flag configuration in NestJS applications.\n * Provides error reporting and environment-specific validation.\n *\n */\n\nimport { ValidationError, BaseError } from '@plyaz/errors';\nimport {\n ERROR_CODES,\n type FeatureFlagEnvironmentConfig,\n type FeatureFlagValidationResult,\n HTTP_STATUS,\n NODE_ENVIRONMENTS,\n} from '@plyaz/types';\nimport { Logger } from '@nestjs/common';\nimport { isString, isDefined, getValidProviders } from '@/utils/common/validation';\nimport { FEATURE_FLAG_PROVIDERS, NUMERIC_CONSTANTS } from '@plyaz/config';\n\n/**\n * FeatureFlagConfigValidator - Comprehensive configuration validation for feature flags\n *\n * @description Validates feature flag configuration objects to ensure they meet system requirements\n * and best practices. Provides detailed error reporting and warnings for potential issues.\n *\n * **Validation Categories:**\n * - Provider validation (memory, file, redis, api, database)\n * - Cache configuration validation\n * - Database connection validation\n * - Environment-specific settings validation\n *\n * **Usage Flow:**\n * 1. Configuration is loaded from environment variables\n * 2. Validator checks all settings for correctness\n * 3. Errors prevent system startup\n * 4. Warnings are logged but don't block startup\n *\n * @example Basic Validation\n * ```typescript\n * const config = {\n * provider: 'database',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * databaseConfig: {\n * connectionString: 'https://project.supabase.co',\n * tableName: 'feature_flags'\n * }\n * };\n *\n * const result = FeatureFlagConfigValidator.validate(config);\n *\n * if (result.isValid) {\n * console.log('Configuration is valid!');\n * } else {\n * console.error('Configuration errors:', result.errors);\n * }\n * ```\n *\n * @example Error Handling\n * ```typescript\n * try {\n * FeatureFlagConfigValidator.validateOrThrow(config);\n * // Configuration is valid, proceed with initialization\n * } catch (error) {\n * console.error('Invalid configuration:', error.message);\n * process.exit(1);\n * }\n * ```\n */\nexport class FeatureFlagConfigValidator {\n /**\n * Validates feature flag configuration and returns detailed results\n *\n * @description Performs comprehensive validation of feature flag configuration,\n * checking all aspects including provider settings, cache configuration,\n * database connections, and environment-specific settings.\n *\n * @param {FeatureFlagEnvironmentConfig} config - Configuration object to validate\n * @returns {ValidationResult} Validation result with errors and warnings\n *\n * @example Successful Validation\n * ```typescript\n * const validConfig = {\n * provider: 'memory',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * refreshInterval: 60\n * };\n *\n * const result = FeatureFlagConfigValidator.validate(validConfig);\n * // result.isValid = true\n * // result.errors = []\n * // result.warnings = []\n * ```\n *\n * @example Validation with Errors\n * ```typescript\n * const invalidConfig = {\n * provider: 'invalid_provider', // Error: invalid provider\n * cacheTtl: -100, // Error: negative TTL\n * databaseConfig: { // Error: missing connection string\n * tableName: 'flags'\n * }\n * };\n *\n * const result = FeatureFlagConfigValidator.validate(invalidConfig);\n * // result.isValid = false\n * // result.errors = [\n * // { field: 'provider', message: 'Invalid provider...', code: 'INVALID_PROVIDER' },\n * // { field: 'cacheTtl', message: 'Cache TTL must be non-negative', code: 'INVALID_CACHE_TTL' }\n * // ]\n * ```\n *\n * @example Validation with Warnings\n * ```typescript\n * const configWithWarnings = {\n * provider: 'database',\n * cacheTtl: 7200, // Warning: very high TTL\n * isLoggingEnabled: true, // Warning: logging in production\n * databaseConfig: {\n * connectionString: 'https://project.supabase.co',\n * tableName: 'feature_flags'\n * }\n * };\n *\n * process.env.NODE_ENV = 'production';\n * const result = FeatureFlagConfigValidator.validate(configWithWarnings);\n * // result.isValid = true (warnings don't fail validation)\n * // result.warnings = [\n * // { field: 'cacheTtl', message: 'Cache TTL is very high...', code: 'HIGH_CACHE_TTL' },\n * // { field: 'isLoggingEnabled', message: 'Logging is enabled in production...', code: 'PRODUCTION_LOGGING_ENABLED' }\n * // ]\n * ```\n */\n static validate(config: FeatureFlagEnvironmentConfig): FeatureFlagValidationResult {\n try {\n // Validate provider\n this.validateProvider(config);\n\n // Validate cache settings\n this.validateCacheSettings(config);\n\n // Validate database configuration\n if (config.provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n this.validateDatabaseConfig(config);\n }\n\n return {\n isValid: true,\n errors: [],\n warnings: this.getWarnings(config),\n };\n } catch (error) {\n return {\n isValid: false,\n errors: [\n {\n field: 'config',\n message: error instanceof Error ? error.message : 'Validation failed',\n code: error instanceof BaseError ? error.code : 'VALIDATION_ERROR',\n },\n ],\n warnings: [],\n };\n }\n }\n\n private static validateProvider(config: FeatureFlagEnvironmentConfig): void {\n const validProviders = getValidProviders();\n\n if (!validProviders.includes(config.provider)) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n `Invalid provider: ${config.provider}. Must be one of: ${validProviders.join(', ')}`\n );\n }\n }\n\n private static validateCacheSettings(config: FeatureFlagEnvironmentConfig): void {\n if (config.cacheTtl < 0) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Cache TTL must be non-negative'\n );\n }\n\n if (config.refreshInterval < 0) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Refresh interval must be non-negative'\n );\n }\n }\n\n private static validateDatabaseConfig(config: FeatureFlagEnvironmentConfig): void {\n if (!config.databaseConfig) {\n throw new ValidationError(\n ERROR_CODES.DB_CONFIG_REQUIRED,\n HTTP_STATUS.BAD_REQUEST,\n 'Database configuration is required for database provider'\n );\n }\n\n const { connectionString, tableName, poolSize, timeout } = config.databaseConfig;\n\n this.validateConnectionString(connectionString);\n this.validateTableName(tableName);\n this.validatePoolSize(poolSize);\n this.validateTimeout(timeout);\n }\n\n private static validateConnectionString(connectionString: string): void {\n if (!connectionString) {\n throw new ValidationError(\n ERROR_CODES.DB_CONFIG_REQUIRED,\n HTTP_STATUS.BAD_REQUEST,\n 'Database connection string is required'\n );\n }\n\n try {\n new URL(connectionString);\n } catch {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Invalid database connection string format'\n );\n }\n }\n\n private static validateTableName(tableName: string): void {\n if (tableName && !isString(tableName)) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Table name must be a string'\n );\n }\n }\n\n private static validatePoolSize(poolSize: number | undefined): void {\n if (\n isDefined(poolSize) &&\n (poolSize < NUMERIC_CONSTANTS.MIN_POOL_SIZE || poolSize > NUMERIC_CONSTANTS.MAX_POOL_SIZE)\n ) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Pool size must be between 1 and 100'\n );\n }\n }\n\n private static validateTimeout(timeout: number | undefined): void {\n if (isDefined(timeout) && timeout < NUMERIC_CONSTANTS.MIN_TIMEOUT_MS) {\n throw new ValidationError(\n ERROR_CODES.CLIENT_INVALID_CONFIG,\n HTTP_STATUS.BAD_REQUEST,\n 'Timeout must be at least 1000ms'\n );\n }\n }\n\n private static getWarnings(config: FeatureFlagEnvironmentConfig): never[] {\n const env = process.env.NODE_ENV;\n\n if (config.cacheTtl > NUMERIC_CONSTANTS.ONE_HOUR_SECONDS) {\n Logger.warn(\n 'Cache TTL is very high (>1 hour). Consider reducing for better responsiveness.',\n {\n field: 'cacheTtl',\n value: config.cacheTtl,\n code: 'HIGH_CACHE_TTL',\n }\n );\n }\n\n if (env === NODE_ENVIRONMENTS.PRODUCTION && config.isLoggingEnabled) {\n Logger.warn('Logging is enabled in production. Consider disabling for performance.', {\n field: 'isLoggingEnabled',\n code: 'PRODUCTION_LOGGING_ENABLED',\n });\n }\n\n if (env === NODE_ENVIRONMENTS.DEVELOPMENT && !config.isCacheEnabled) {\n Logger.warn('Cache is disabled in development. This may impact performance testing.', {\n field: 'isCacheEnabled',\n code: 'DEVELOPMENT_CACHE_DISABLED',\n });\n }\n\n return [];\n }\n\n /**\n * Validates configuration and throws error if validation fails\n *\n * @description Convenience method that validates configuration and throws a detailed\n * error if validation fails. This is typically used during application startup\n * to ensure the system doesn't start with invalid configuration.\n *\n * @param {FeatureFlagEnvironmentConfig} config - Configuration to validate\n * @throws {DatabaseError} When validation fails with detailed error messages\n *\n * @example Startup Validation\n * ```typescript\n * // In FeatureFlagService.onModuleInit()\n * try {\n * const config = FeatureFlagConfigFactory.fromEnvironment();\n * FeatureFlagConfigValidator.validateOrThrow(config);\n *\n * // Configuration is valid, proceed with initialization\n * this.provider = FeatureFlagProviderFactory.create(config, FEATURES);\n * await this.provider.initialize();\n * } catch (error) {\n * this.logger.error('Configuration validation failed:', error.message);\n * throw error; // Prevent service from starting\n * }\n * ```\n *\n * @example Error Output\n * ```typescript\n * // When validation fails, throws DatabaseError with message:\n * // \"Configuration validation failed:\n * // provider: Invalid provider: invalid_type. Must be one of: memory, file, redis, api, database\n * // cacheTtl: Cache TTL must be non-negative\n * // databaseConfig.connectionString: Database connection string is required\"\n * ```\n *\n * @example Environment Variable Validation\n * ```bash\n * # Missing required environment variables:\n * # SUPABASE_URL= # Empty/missing\n * # FEATURE_FLAG_PROVIDER=database\n *\n * # Results in error:\n * # \"Configuration validation failed:\n * # databaseConfig.connectionString: Database connection string is required\"\n * ```\n */\n static validateOrThrow(config: FeatureFlagEnvironmentConfig): void {\n // Validate provider\n this.validateProvider(config);\n\n // Validate cache settings\n this.validateCacheSettings(config);\n\n // Validate database configuration\n if (config.provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n this.validateDatabaseConfig(config);\n }\n }\n}\n","/**\n * Feature Flag Configuration\n *\n * Configuration integration for feature flags with environment variable support.\n * Imports configuration from .env.local and provides validation.\n *\n */\n\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlagConfigValidator } from './validation';\nimport {\n NODE_ENVIRONMENTS,\n FEATURE_FLAG_DEFAULTS,\n DATABASE_ERROR_CODES,\n FEATURE_FLAG_PROVIDERS,\n type FeatureFlagEnvironmentConfig,\n type FeatureFlagConfig,\n type FeatureFlagDatabaseConfig,\n} from '@plyaz/types';\n\nimport { DatabaseError } from '@plyaz/errors';\n\n/**\n * Feature flag configuration factory\n *\n * This factory is the FIRST component called during application startup.\n * It reads environment variables from .env.local and creates a validated configuration object.\n *\n * @example\n * ```typescript\n * // Step 1: Called automatically by FeatureFlagService.onModuleInit()\n * const config = FeatureFlagConfigFactory.fromEnvironment();\n *\n * // Step 2: Configuration is validated\n * // Step 3: Provider is created with this config\n * const provider = FeatureFlagProviderFactory.create(config, FEATURES);\n * ```\n *\n * @example Environment Variables (.env.local)\n * ```bash\n * SUPABASE_URL=https://your-project.supabase.co\n * SUPABASE_ANON_PUBLIC_KEY=your-anon-key\n * FEATURE_FLAG_PROVIDER=database\n * FEATURE_FLAG_CACHE_ENABLED=true\n * FEATURE_FLAG_CACHE_TTL=300\n * FEATURE_FLAG_TABLE_NAME=feature_flags\n * ```\n */\nexport class FeatureFlagConfigFactory {\n /**\n * Creates configuration from environment variables\n *\n * **EXECUTION ORDER: This is called FIRST in the initialization chain**\n *\n * Flow:\n * 1. NestJS starts → FeatureFlagModule loads\n * 2. FeatureFlagService.onModuleInit() called\n * 3. → initializeProvider() called\n * 4. → **THIS METHOD CALLED** ← YOU ARE HERE\n * 5. → Configuration validated\n * 6. → Provider created and initialized\n * 7. → Database connection established\n *\n * @returns Validated configuration object ready for provider creation\n * @throws {FeatureFlagConfigError} If environment variables are missing or invalid\n *\n * @example\n * ```typescript\n * // This method reads from process.env and creates:\n * {\n * provider: 'database',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * databaseConfig: {\n * connectionString: 'https://your-project.supabase.co',\n * tableName: 'feature_flags',\n * poolSize: 10,\n * timeout: 30000\n * }\n * }\n * ```\n */\n static fromEnvironment(): FeatureFlagEnvironmentConfig {\n const config: FeatureFlagEnvironmentConfig = {\n provider: this.getProvider(),\n isCacheEnabled: this.getCacheEnabled(),\n cacheTtl: this.getCacheTtl(),\n refreshInterval: this.getRefreshInterval(),\n shouldFallbackToDefaults: true,\n isLoggingEnabled: this.getLoggingEnabled(),\n };\n\n // Add database config if using database provider\n if (config.provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n config.databaseConfig = this.getDatabaseConfig();\n }\n\n FeatureFlagConfigValidator.validateOrThrow(config);\n return config;\n }\n\n /**\n * Determines which provider to use - now uses constants instead of environment variables\n *\n * @private\n * @returns Provider type from constants\n */\n private static getProvider(): FeatureFlagConfig<FeatureFlagKey>['provider'] {\n return FEATURE_FLAG_PROVIDERS.MEMORY;\n }\n\n private static getCacheEnabled(): boolean {\n return true;\n }\n\n private static getCacheTtl(): number {\n return FEATURE_FLAG_DEFAULTS.CACHE_TTL;\n }\n\n private static getRefreshInterval(): number {\n return FEATURE_FLAG_DEFAULTS.REFRESH_INTERVAL;\n }\n\n private static getLoggingEnabled(): boolean {\n return (\n process.env.NODE_ENV === NODE_ENVIRONMENTS.DEVELOPMENT ||\n process.env.FEATURE_FLAG_LOGGING === 'true'\n );\n }\n\n /**\n * Creates database configuration from environment variables\n *\n * **CRITICAL**: This method requires SUPABASE_URL to be set in .env.local\n *\n * @private\n * @returns Database configuration object\n * @throws {FeatureFlagConfigError} If SUPABASE_URL is missing\n *\n * @example Environment Variables Required:\n * ```bash\n * SUPABASE_URL=https://your-project.supabase.co # REQUIRED\n * SUPABASE_ANON_PUBLIC_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... # Used in connection\n * FEATURE_FLAG_TABLE_NAME=feature_flags # Optional, defaults to 'feature_flags'\n * DB_POOL_SIZE=10 # Optional, defaults to 10\n * DB_TIMEOUT=30000 # Optional, defaults to 30000ms\n * ```\n *\n * @example Generated Configuration:\n * ```typescript\n * {\n * connectionString: 'https://your-project.supabase.co',\n * tableName: 'feature_flags',\n * poolSize: 10,\n * timeout: 30000\n * }\n * ```\n */\n private static getDatabaseConfig(): FeatureFlagDatabaseConfig {\n const connectionString = process.env.SUPABASE_URL;\n if (!connectionString) {\n throw new DatabaseError(\n 'SUPABASE_URL is required for database provider',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n return {\n connectionString,\n tableName: FEATURE_FLAG_DEFAULTS.TABLE_NAME,\n poolSize: FEATURE_FLAG_DEFAULTS.POOL_SIZE,\n timeout: FEATURE_FLAG_DEFAULTS.TIMEOUT,\n };\n }\n}\n","/**\n * Feature Flag Service\n *\n * NestJS service for feature flag business logic.\n * Orchestrates between providers, repositories, and external systems.\n *\n * @fileoverview NestJS service for feature flags\n */\n\nimport type { OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport { Injectable, Logger } from '@nestjs/common';\nimport {\n type FeatureFlagValue,\n type FeatureFlagContext,\n type FeatureFlagEvaluation,\n type FeatureFlag,\n type FeatureFlagRule,\n type FeatureFlagProvider,\n type CreateFlagRequest,\n type ProviderHealthStatus,\n ERROR_CODES,\n HTTP_STATUS,\n FEATURE_FLAG_PROVIDERS,\n} from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from '@domain/featureFlags/providers/factory';\nimport type { FeatureFlagRepository } from './feature-flag.repository';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURES } from '@plyaz/config';\nimport { BaseError } from '@plyaz/errors';\nimport { FeatureFlagConfigFactory } from './config/feature-flag.config';\n\n/**\n * Feature Flag Service\n *\n * **MAIN ORCHESTRATOR** - This service coordinates the entire feature flag system.\n *\n * **EXECUTION FLOW:**\n * 1. NestJS Module System → Instantiates this service\n * 2. **onModuleInit()** ← ENTRY POINT - Called automatically by NestJS\n * 3. initializeProvider() → Loads configuration and creates provider\n * 4. Provider.initialize() → Establishes database connection\n * 5. System ready to serve requests\n *\n * **RUNTIME FLOW:**\n * Client Request → Controller → **This Service** → Provider → Database/Cache\n *\n * @example Basic Usage in Controller\n * ```typescript\n * @Controller('features')\n * export class FeatureController {\n * constructor(private readonly featureFlagService: FeatureFlagService) {}\n *\n * @Get(':key')\n * async getFeature(@Param('key') key: string) {\n * // This calls the service which orchestrates the entire evaluation\n * return this.featureFlagService.evaluateFlag(key);\n * }\n * }\n * ```\n *\n * @example Advanced Usage with Context\n * ```typescript\n * // Evaluate flag with user context for targeting rules\n * const evaluation = await this.featureFlagService.evaluateFlag('PREMIUM_FEATURE', {\n * userId: 'user123',\n * userRole: 'premium',\n * environment: 'production'\n * });\n *\n * if (evaluation.isEnabled) {\n * // Execute premium feature logic\n * }\n * ```\n *\n * Provides business logic for feature flag operations.\n * Manages provider lifecycle, caching, and data persistence.\n */\n@Injectable()\nexport class FeatureFlagService implements OnModuleInit, OnModuleDestroy {\n [x: string]: unknown;\n private readonly logger = new Logger(FeatureFlagService.name);\n private provider!: FeatureFlagProvider<FeatureFlagKey>;\n\n constructor(private readonly featureFlagRepository: FeatureFlagRepository<FeatureFlagKey>) {}\n\n /**\n * **FIRST METHOD CALLED** - NestJS lifecycle hook for module initialization\n *\n * **EXECUTION ORDER:**\n * 1. NestJS creates FeatureFlagModule\n * 2. NestJS instantiates FeatureFlagService\n * 3. **THIS METHOD CALLED AUTOMATICALLY** ← YOU ARE HERE\n * 4. → initializeProvider() called\n * 5. → Configuration loaded from .env.local\n * 6. → Database provider created and initialized\n * 7. → Database connection established\n * 8. → Initial data loaded from database\n * 9. System ready to serve requests\n *\n * @throws {Error} If provider initialization fails\n *\n * @example What happens during initialization:\n * ```typescript\n * // 1. Load config from environment\n * const config = FeatureFlagConfigFactory.fromEnvironment();\n *\n * // 2. Create database provider\n * this.provider = FeatureFlagProviderFactory.create(config, FEATURES);\n *\n * // 3. Initialize database connection\n * await this.provider.initialize();\n *\n * // 4. Load flags and rules from database\n * const { flags, rules } = await this.provider.fetchData();\n * ```\n */\n async onModuleInit(): Promise<void> {\n try {\n await this.initializeProvider();\n this.logger.log('Feature flag service initialized successfully');\n } catch (error) {\n this.logger.error('Failed to initialize feature flag service', error);\n throw error;\n }\n }\n\n /**\n * Cleans up resources on module shutdown.\n */\n async onModuleDestroy(): Promise<void> {\n this.provider.dispose();\n this.logger.log('Feature flag service disposed');\n }\n\n /**\n * **SECOND METHOD CALLED** - Initializes the feature flag provider\n *\n * **EXECUTION FLOW:**\n * 1. onModuleInit() called by NestJS\n * 2. **THIS METHOD CALLED** ← YOU ARE HERE\n * 3. → FeatureFlagConfigFactory.fromEnvironment() - Loads .env.local\n * 4. → FeatureFlagProviderFactory.create() - Creates database provider\n * 5. → provider.initialize() - Establishes database connection\n *\n * @private\n * @throws {Error} If configuration is invalid or database connection fails\n *\n * @example Configuration Loading Process:\n * ```typescript\n * // Reads from .env.local:\n * // SUPABASE_URL=https://your-project.supabase.co\n * // FEATURE_FLAG_PROVIDER=database\n * // FEATURE_FLAG_CACHE_ENABLED=true\n *\n * const config = {\n * provider: 'database',\n * isCacheEnabled: true,\n * databaseConfig: {\n * connectionString: 'https://your-project.supabase.co',\n * tableName: 'feature_flags'\n * }\n * };\n * ```\n */\n private async initializeProvider(): Promise<void> {\n try {\n const config = FeatureFlagConfigFactory.fromEnvironment();\n\n this.provider = FeatureFlagProviderFactory.create(config, FEATURES);\n await this.provider.initialize();\n\n this.logger.log(`Feature flag provider initialized: ${config.provider}`);\n } catch (error) {\n this.logger.error('Failed to initialize feature flag provider', error);\n throw new BaseError(\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n 'Failed to initialize feature flag provider'\n );\n }\n }\n\n /**\n * Gets the current provider instance.\n */\n private getProvider(): FeatureFlagProvider<FeatureFlagKey> {\n if (!this.provider) {\n throw new BaseError(\n ERROR_CODES.ERROR_SYSTEM_NOT_INITIALIZED,\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n 'Feature flag provider not initialized'\n );\n }\n return this.provider;\n }\n\n /**\n * **MAIN RUNTIME METHOD** - Evaluates a feature flag for the given context\n *\n * **RUNTIME EXECUTION FLOW:**\n * 1. Client makes HTTP request to controller\n * 2. Controller calls **THIS METHOD** ← RUNTIME ENTRY POINT\n * 3. → getProvider() - Gets initialized provider\n * 4. → provider.getFlag() - Evaluates flag with context\n * 5. → Provider checks cache, rules, overrides\n * 6. → Database query if needed\n * 7. ← Returns evaluation result\n *\n * @param key - Feature flag key (e.g., 'PREMIUM_FEATURE', 'NEW_UI')\n * @param context - Evaluation context for targeting rules\n * @returns Feature flag evaluation result with value, reason, and metadata\n *\n * @example Simple Usage:\n * ```typescript\n * const evaluation = await this.featureFlagService.evaluateFlag('NEW_CHECKOUT');\n * console.log(evaluation.isEnabled); // true/false\n * console.log(evaluation.reason); // 'default_value' | 'rule_match' | 'override'\n * ```\n *\n * @example With User Context (for targeting rules):\n * ```typescript\n * const evaluation = await this.featureFlagService.evaluateFlag('BETA_FEATURE', {\n * userId: 'user123',\n * userRole: 'premium',\n * environment: 'production',\n * customAttributes: {\n * subscriptionTier: 'pro',\n * region: 'us-east'\n * }\n * });\n *\n * // Provider will:\n * // 1. Check for user-specific overrides\n * // 2. Evaluate targeting rules against context\n * // 3. Return appropriate value with reason\n * ```\n *\n * @example Evaluation Result:\n * ```typescript\n * {\n * key: 'BETA_FEATURE',\n * isEnabled: true,\n * value: { enabled: true, variant: 'blue' },\n * reason: 'rule_match',\n * ruleId: 'premium-users-rule',\n * evaluatedAt: '2024-01-15T10:30:00Z'\n * }\n * ```\n */\n async evaluateFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n try {\n const provider = this.getProvider();\n const evaluation = await provider.getFlag(key, context);\n\n this.logger.debug(`Evaluated flag ${key}: ${evaluation.isEnabled}`, {\n key,\n value: evaluation.value,\n reason: evaluation.reason,\n context,\n });\n\n return evaluation;\n } catch (error) {\n this.logger.error(`Failed to evaluate flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.evaluateFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets all feature flags with their evaluations.\n *\n * @param context - Evaluation context\n * @returns All feature flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n try {\n const provider = this.getProvider();\n const flags = await provider.getAllFlags();\n\n this.logger.debug(`Evaluated all flags for context`, {\n flagCount: Object.keys(flags).length,\n context,\n });\n\n return flags;\n } catch (error) {\n this.logger.error('Failed to evaluate all flags', error);\n throw error;\n }\n }\n\n /**\n * Creates a new feature flag.\n *\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n async createFlag(\n createData: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n const flag = await this.featureFlagRepository.createFlag(createData);\n\n // Refresh provider cache to include new flag\n await this.refreshCache();\n\n this.logger.log(`Created feature flag: ${createData.key}`);\n return flag;\n } catch (error) {\n this.logger.error(`Failed to create flag ${createData.key}`, error);\n throw error;\n }\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n try {\n const flag = await this.featureFlagRepository.updateFlag(key, updateData);\n\n // Refresh provider cache to reflect changes\n await this.refreshCache();\n\n this.logger.log(`Updated feature flag: ${key}`);\n return flag;\n } catch (error) {\n this.logger.error(`Failed to update flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Deletes a feature flag.\n *\n * @param key - Feature flag key\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n try {\n await this.featureFlagRepository.deleteFlag(key);\n\n // Refresh provider cache to remove deleted flag\n await this.refreshCache();\n\n this.logger.log(`Deleted feature flag: ${key}`);\n } catch (error) {\n this.logger.error(`Failed to delete flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Sets a manual override for a flag.\n *\n * @param key - Feature flag key\n * @param value - Override value\n */\n async setOverride(key: FeatureFlagKey, value: FeatureFlagValue): Promise<void> {\n try {\n const provider = this.getProvider();\n provider.setOverride(key, value);\n\n this.logger.log(`Set override for flag ${key}: ${value}`);\n } catch (error) {\n this.logger.error(`Failed to set override for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Removes a manual override for a flag.\n *\n * @param key - Feature flag key\n */\n async removeOverride(key: FeatureFlagKey): Promise<void> {\n try {\n const provider = this.getProvider();\n provider.removeOverride(key);\n\n this.logger.log(`Removed override for flag ${key}`);\n } catch (error) {\n this.logger.error(`Failed to remove override for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Gets all available feature flags.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n async getAllFeatureFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagRepository.getAllFlags(environment);\n } catch (error) {\n this.logger.error('Failed to get all feature flags', error);\n throw error;\n }\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n async getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n try {\n return await this.featureFlagRepository.getFlagRules(key);\n } catch (error) {\n this.logger.error(`Failed to get rules for flag ${key}`, error);\n throw error;\n }\n }\n\n /**\n * Forces a refresh of the feature flag cache.\n */\n async refreshCache(): Promise<void> {\n try {\n const provider = this.getProvider();\n await provider.refresh();\n\n this.logger.log('Feature flag cache refreshed');\n } catch (error) {\n this.logger.error('Failed to refresh feature flag cache', error);\n throw error;\n }\n }\n\n /**\n * Gets provider health status.\n *\n * @returns Provider health information\n */\n async getHealthStatus(): Promise<ProviderHealthStatus> {\n return {\n isInitialized: !!this.provider,\n provider: FEATURE_FLAG_PROVIDERS.DATABASE,\n isCacheEnabled: true,\n };\n }\n}\n","/**\n * Feature Flag Repository\n *\n * NestJS repository for feature flag data persistence.\n * Handles database operations and data mapping.\n *\n * @fileoverview NestJS repository for feature flags\n * @version 1.0.0\n */\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport type {\n FeatureFlagValue,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\n\n/**\n * Feature Flag Repository\n *\n * Handles all database operations for feature flags.\n * This is a stub implementation that provides the interface\n * for integration with @plyaz/db when available.\n */\n@Injectable()\nexport class FeatureFlagRepository<FeatureFlagKey extends string> {\n private readonly logger = new Logger(FeatureFlagRepository.name);\n\n // Constants for time calculations\n private static readonly ONE_DAY_MS = 86_400_000; // 24 * 60 * 60 * 1000\n\n // TODO: Inject database service when @plyaz/db is available\n // constructor(private readonly databaseService: DatabaseService) {}\n\n /**\n * Creates a new feature flag in the database.\n *\n * @param createData - Flag creation data\n * @returns Created feature flag\n */\n async createFlag(\n createData: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.log(`Creating flag: ${createData.key}`);\n\n // TODO: Implement database insertion when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(`\n // INSERT INTO feature_flags (key, name, description, value, is_enabled, environment, rollout_percentage, created_at, updated_at)\n // VALUES ($1, $2, $3, $4, $5, $6, $7, NOW(), NOW())\n // RETURNING *\n // `, [createData.key, createData.name, createData.description, JSON.stringify(createData.value),\n // createData.isEnabled ?? true, createData.environment ?? 'all', createData.rolloutPercentage]);\n\n const currentTime = new Date();\n const newFlag: FeatureFlag<FeatureFlagKey> = {\n key: createData.key,\n name: createData.name,\n description: createData.description ?? `Feature flag for ${createData.key}`,\n isEnabled: createData.isEnabled ?? true,\n value: createData.value,\n type: this.inferFlagType(createData.value),\n environment: createData.environment ?? 'all',\n rolloutPercentage: createData.rolloutPercentage,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'api',\n updatedBy: 'api',\n } satisfies FeatureFlag<FeatureFlagKey>;\n\n this.logger.debug(`Flag created: ${createData.key}`, newFlag);\n return newFlag;\n }\n\n /**\n * Updates an existing feature flag.\n *\n * @param key - Feature flag key\n * @param updateData - Flag update data\n * @returns Updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.log(`Updating flag: ${key}`);\n\n // TODO: Implement database update when @plyaz/db is available\n // Example implementation:\n // const updates = [];\n // const values = [];\n // let paramCount = 1;\n\n // if (updateData.name !== undefined) {\n // updates.push(`name = $${paramCount++}`);\n // values.push(updateData.name);\n // }\n // ... (build dynamic update query)\n\n // const result = await this.databaseService.query(`\n // UPDATE feature_flags\n // SET ${updates.join(', ')}, updated_at = NOW()\n // WHERE key = $${paramCount}\n // RETURNING *\n // `, [...values, key]);\n\n // Stub implementation - return updated flag structure\n const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n key,\n name: updateData.name ?? `Updated ${key}`,\n description: updateData.description ?? `Updated feature flag for ${key}`,\n isEnabled: updateData.isEnabled ?? true,\n value: updateData.value ?? true,\n type: updateData.value ? this.inferFlagType(updateData.value) : 'boolean',\n environment: updateData.environment ?? 'all',\n rolloutPercentage: updateData.rolloutPercentage,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS), // 1 day ago\n updatedAt: new Date(),\n createdBy: 'api',\n updatedBy: 'api',\n } satisfies FeatureFlag<FeatureFlagKey>;\n\n this.logger.debug(`Flag updated: ${key}`, updatedFlag);\n return updatedFlag;\n }\n\n /**\n * Deletes a feature flag from the database.\n *\n * @param key - Feature flag key\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n this.logger.log(`Deleting flag: ${key}`);\n\n // TODO: Implement database deletion when @plyaz/db is available\n // Example implementation:\n // await this.databaseService.query('DELETE FROM feature_flags WHERE key = $1', [key]);\n\n this.logger.debug(`Flag deleted: ${key}`);\n }\n\n /**\n * Gets all feature flags from the database.\n *\n * @param environment - Filter by environment\n * @returns List of feature flags\n */\n async getAllFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]> {\n this.logger.log(`Getting all flags${environment ? ` for environment: ${environment}` : ''}`);\n\n // TODO: Implement database query when @plyaz/db is available\n const sampleFlags = this.createSampleFlags();\n const filteredFlags = this.filterFlagsByEnvironment(sampleFlags, environment);\n\n this.logger.debug(`Retrieved ${filteredFlags.length} flags`);\n return filteredFlags;\n }\n\n /**\n * Creates sample flags for stub implementation.\n *\n * @returns Array of sample feature flags\n */\n private createSampleFlags(): FeatureFlag<FeatureFlagKey>[] {\n return [\n {\n key: 'AUTH_GOOGLE' as FeatureFlagKey,\n name: 'Google Authentication',\n description: 'Enable Google OAuth authentication',\n isEnabled: true,\n value: 'true',\n type: 'boolean',\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n },\n {\n key: 'AUTH_DISCORD' as FeatureFlagKey,\n name: 'Discord Authentication',\n description: 'Enable Discord OAuth authentication',\n isEnabled: true,\n value: 'true',\n type: 'boolean',\n environment: 'all',\n rolloutPercentage: undefined,\n createdAt: new Date(Date.now() - FeatureFlagRepository.ONE_DAY_MS),\n updatedAt: new Date(),\n createdBy: 'system',\n updatedBy: 'system',\n },\n ] satisfies FeatureFlag<FeatureFlagKey>[];\n }\n\n /**\n * Filters flags by environment.\n *\n * @param flags - Array of flags to filter\n * @param environment - Environment to filter by\n * @returns Filtered flags\n */\n private filterFlagsByEnvironment(\n flags: FeatureFlag<FeatureFlagKey>[],\n environment?: string\n ): FeatureFlag<FeatureFlagKey>[] {\n return environment\n ? flags.filter(flag => flag.environment === environment || flag.environment === 'all')\n : flags;\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Feature flag key\n * @returns List of rules for the flag\n */\n async getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n this.logger.log(`Getting rules for flag: ${key}`);\n\n // TODO: Implement database query when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(`\n // SELECT * FROM feature_flag_rules\n // WHERE flag_key = $1\n // ORDER BY priority DESC\n // `, [key]);\n // return result.rows.map(row => this.mapRowToRule(row));\n\n // Stub implementation - return empty rules\n const rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n this.logger.debug(`Retrieved ${rules.length} rules for flag: ${key}`);\n return rules;\n }\n\n /**\n * Gets a single feature flag by key.\n *\n * @param key - Feature flag key\n * @returns Feature flag or null if not found\n */\n async getFlagByKey(key: FeatureFlagKey): Promise<FeatureFlag<FeatureFlagKey> | null> {\n this.logger.log(`Getting flag by key: ${key}`);\n\n // TODO: Implement database query when @plyaz/db is available\n // Example implementation:\n // const result = await this.databaseService.query(\n // 'SELECT * FROM feature_flags WHERE key = $1',\n // [key]\n // );\n // return result.rows.length > 0 ? this.mapRowToFlag(result.rows[0]) : null;\n\n // Stub implementation - return null for now\n return null;\n }\n\n /**\n * Infers the type of a feature flag value.\n *\n * @param value - The flag value\n * @returns Inferred type string\n */\n private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'object' && value !== null) return 'json';\n return 'boolean'; // Default fallback\n }\n\n /**\n * Maps a database row to a FeatureFlag object.\n * This will be used when @plyaz/db is available.\n *\n * @param row - Database row\n * @returns Mapped feature flag\n */\n // private mapRowToFlag(row: any): FeatureFlag {\n // return {\n // key: row.key,\n // name: row.name,\n // description: row.description,\n // isEnabled: row.is_enabled,\n // value: JSON.parse(row.value),\n // type: row.type,\n // environment: row.environment,\n // rolloutPercentage: row.rollout_percentage,\n // createdAt: row.created_at,\n // updatedAt: row.updated_at,\n // createdBy: row.created_by,\n // updatedBy: row.updated_by,\n // } satisfies FeatureFlag;\n // }\n\n /**\n * Maps a database row to a FeatureFlagRule object.\n * This will be used when @plyaz/db is available.\n *\n * @param row - Database row\n * @returns Mapped feature flag rule\n */\n // private mapRowToRule(row: any): FeatureFlagRule {\n // return {\n // id: row.id,\n // flagKey: row.flag_key,\n // name: row.name,\n // description: row.description,\n // isEnabled: row.is_enabled,\n // priority: row.priority,\n // conditions: JSON.parse(row.conditions),\n // value: JSON.parse(row.value),\n // rolloutPercentage: row.rollout_percentage,\n // createdAt: row.created_at,\n // updatedAt: row.updated_at,\n // createdBy: row.created_by,\n // updatedBy: row.updated_by,\n // } satisfies FeatureFlagRule;\n // }\n}\n","/**\n * Feature Flag Module\n *\n * NestJS module for feature flag functionality.\n * Configures providers, controllers, and dependencies.\n *\n * @fileoverview NestJS module for feature flags\n */\n\nimport { Module, Global } from '@nestjs/common';\nimport { FeatureFlagController } from './feature-flag.controller';\nimport { FeatureFlagService } from './feature-flag.service';\nimport { FeatureFlagRepository } from './feature-flag.repository';\nimport { FeatureFlagConfigFactory } from './config/feature-flag.config';\n\n/**\n * Feature Flag Module\n *\n * Provides feature flag functionality as a NestJS module.\n * Can be imported by other modules to access feature flag services.\n *\n * @example\n * ```typescript\n * // In your app.module.ts\n * import { FeatureFlagModule } from '@plyaz/config/backend/featureFlags';\n *\n * @Module({\n * imports: [FeatureFlagModule],\n * // ... other module configuration\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // In your service\n * import { FeatureFlagService } from '@plyaz/config/backend/featureFlags';\n *\n * @Injectable()\n * export class MyService {\n * constructor(private readonly featureFlagService: FeatureFlagService) {}\n *\n * async doSomething() {\n * const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');\n * if (isEnabled) {\n * // Execute new feature logic\n * }\n * }\n * }\n * ```\n */\n@Global()\n@Module({\n controllers: [FeatureFlagController],\n providers: [FeatureFlagService, FeatureFlagRepository],\n exports: [FeatureFlagService, FeatureFlagRepository],\n})\nexport class FeatureFlagModule {\n /**\n * Static method for importing the module with configuration.\n * This allows customization of the feature flag system.\n *\n * @param options - Module configuration options\n * @returns Configured module\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * FeatureFlagModule.forRoot({\n * provider: 'database',\n * isCacheEnabled: true,\n * cacheTtl: 600,\n * })\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n static forRoot(options?: {\n provider?: 'memory' | 'database' | 'redis' | 'api' | 'file';\n isCacheEnabled?: boolean;\n cacheTtl?: number;\n refreshInterval?: number;\n isLoggingEnabled?: boolean;\n }): {\n module: typeof FeatureFlagModule;\n providers: unknown[];\n exports: unknown[];\n } {\n const config = FeatureFlagConfigFactory.fromEnvironment();\n const mergedConfig = { ...config, ...options };\n\n return {\n module: FeatureFlagModule,\n providers: [\n {\n provide: 'FEATURE_FLAG_CONFIG',\n useValue: mergedConfig,\n },\n FeatureFlagService,\n FeatureFlagRepository,\n ],\n exports: [FeatureFlagService, FeatureFlagRepository],\n };\n }\n\n /**\n * Static method for importing the module asynchronously.\n * Useful when configuration depends on other services.\n *\n * @param options - Async module configuration options\n * @returns Configured async module\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * FeatureFlagModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (configService: ConfigService) => ({\n * provider: configService.get('FEATURE_FLAG_PROVIDER'),\n * cacheEnabled: configService.get('FEATURE_FLAG_CACHE_ENABLED'),\n * }),\n * })\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n static forRootAsync(options: {\n imports?: unknown[];\n inject?: unknown[];\n useFactory?: (...args: unknown[]) => unknown;\n }): {\n module: typeof FeatureFlagModule;\n imports: unknown[];\n providers: unknown[];\n exports: unknown[];\n } {\n return {\n module: FeatureFlagModule,\n imports: options.imports ?? [],\n providers: [\n {\n provide: 'FEATURE_FLAG_CONFIG',\n inject: options.inject ?? [],\n useFactory: options.useFactory ?? (() => ({})),\n },\n FeatureFlagService,\n FeatureFlagRepository,\n ],\n exports: [FeatureFlagService, FeatureFlagRepository],\n };\n }\n}\n","import { SetMetadata } from '@nestjs/common';\nimport type { FeatureFlagValue } from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURE_FLAG_METADATA } from '@plyaz/types';\n\n/**\n * Decorator to require a feature flag to be in a specific state\n * before allowing access to the route handler.\n *\n * @param key - The feature flag key\n * @param expected - Expected flag value (default: true)\n */\nexport function FeatureFlag(\n key: FeatureFlagKey,\n expected: FeatureFlagValue = true\n): MethodDecorator {\n return SetMetadata(FEATURE_FLAG_METADATA.FLAG_CHECK, { key, expected }) as MethodDecorator;\n}\n","import type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlag } from './feature-flag.decorator';\n\n/**\n * Shortcut decorator to require a feature flag to be disabled (false).\n */\nexport function FeatureDisabled(key: FeatureFlagKey): MethodDecorator {\n return FeatureFlag(key, false);\n}\n","import type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlag } from './feature-flag.decorator';\n\n/**\n * FeatureEnabled decorator\n * Shorthand for enabling a feature flag with `true`\n */\nexport function FeatureEnabled(key: FeatureFlagKey): MethodDecorator {\n return FeatureFlag(key, true);\n}\n\n// Ensure TypeScript treats this as a module\nexport {};\n","import { Injectable, CanActivate, ExecutionContext, Logger } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport {\n type FeatureFlagValue,\n type FeatureFlagEvaluation,\n ERROR_CODES,\n HTTP_STATUS,\n} from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlagService } from '../feature-flag.service';\nimport { FEATURE_FLAG_METADATA } from '@plyaz/types';\nimport { BaseError } from '@plyaz/errors';\n\n/**\n * Guard that ensures a feature flag is in the expected state\n * before allowing access to a route handler.\n */\n@Injectable()\nexport class FeatureFlagGuard implements CanActivate {\n private readonly logger = new Logger(FeatureFlagGuard.name);\n\n constructor(\n private readonly reflector: Reflector,\n private readonly featureFlagService: FeatureFlagService\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n // Get metadata set by @FeatureFlag decorator\n const meta = this.reflector.get<{ key: FeatureFlagKey; expected: FeatureFlagValue }>(\n FEATURE_FLAG_METADATA.FLAG_CHECK,\n context.getHandler() // to get keys\n );\n\n if (!meta) return true; // No flag restriction → allow request\n\n const { key, expected } = meta;\n\n // Evaluate the feature flag state\n const evaluation: FeatureFlagEvaluation<FeatureFlagKey> =\n await this.featureFlagService.evaluateFlag(key);\n\n const actual = evaluation.value ?? evaluation.isEnabled;\n\n if (!this.matches(expected, actual)) {\n this.logger.log(\n `FeatureFlagGuard denied: key=${key}, expected=${expected}, actual=${actual}`\n );\n throw new BaseError(\n ERROR_CODES.AUTH_FORBIDDEN,\n HTTP_STATUS.FORBIDDEN,\n `Feature ${key} not in required state`\n );\n }\n\n return true;\n }\n\n /**\n * Compare expected vs actual values.\n */\n private matches(expected: FeatureFlagValue, actual: unknown): boolean {\n if (expected === undefined || expected === null) return Boolean(actual);\n\n if (typeof actual !== 'object' || actual === null) {\n return String(actual) === String(expected);\n }\n\n // Simple deep comparison for objects\n return JSON.stringify(actual) === JSON.stringify(expected);\n }\n}\n","import { Injectable, NestMiddleware, Logger } from '@nestjs/common';\nimport { BaseError } from '@plyaz/errors';\nimport { FeatureFlagService } from '../feature-flag.service';\nimport { FeatureFlagKey } from '@/domain';\nimport { FEATURES, HTTP_STATUS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\n\ntype FeatureFlagRequest = {\n featureFlags?: Record<string, boolean>;\n query?: Record<string, unknown> | URLSearchParams;\n headers?: Record<string, string | string[] | undefined>;\n url?: string;\n};\n\n// Type guard Function\nfunction isFeatureFlagKey(value: string): value is FeatureFlagKey {\n return Object.keys(FEATURES).includes(value);\n}\n\n/**\n * FeatureFlagMiddleware - Evaluates and attaches feature flags to every request\n *\n * @description This middleware runs early in the request lifecycle to evaluate feature flags\n * and attach them to the request object. It allows controllers and services to access\n * pre-evaluated flags without making additional service calls, improving performance.\n *\n * **Execution Flow:**\n * 1. Middleware executes first for every incoming HTTP request\n * 2. Extracts flag key from query params, headers, or uses default\n * 3. Calls FeatureFlagService to evaluate the specified flag\n * 4. Attaches evaluated flags to `req.featureFlags` object\n * 5. Passes control to next middleware/interceptor/controller\n *\n * **Flag Key Priority:**\n * 1. Query parameter: `?flag=FEATURE_NAME`\n * 2. HTTP header: `X-Feature-Flag: FEATURE_NAME`\n * 3. Default: `AUTH_GOOGLE`\n *\n * **Use Cases:**\n * - Global feature flag evaluation for all requests\n * - Performance optimization (evaluate once, use many times)\n * - Request-scoped feature flag context\n * - Dynamic flag selection via client parameters\n *\n * @example Setup - Register middleware globally\n * ```typescript\n * // app.module.ts\n * import { MiddlewareConsumer, Module } from '@nestjs/common';\n * import { FeatureFlagMiddleware } from './middleware/feature-flag-middleware';\n *\n * @Module({\n * // ... other config\n * })\n * export class AppModule {\n * configure(consumer: MiddlewareConsumer) {\n * consumer\n * .apply(FeatureFlagMiddleware)\n * .forRoutes('*'); // Apply to all routes\n * }\n * }\n * ```\n *\n * @example Client Usage - Query Parameter\n * ```bash\n * # Client specifies which flag to evaluate\n * curl \"https://api.example.com/users?flag=PREMIUM_FEATURES\"\n *\n * # Middleware evaluates PREMIUM_FEATURES and attaches to request\n * # req.featureFlags = { PREMIUM_FEATURES: true }\n * ```\n *\n * @example Client Usage - HTTP Header\n * ```bash\n * # Alternative: Use HTTP header\n * curl -H \"X-Feature-Flag: NEW_DASHBOARD\" \"https://api.example.com/dashboard\"\n *\n * # Middleware evaluates NEW_DASHBOARD\n * # req.featureFlags = { NEW_DASHBOARD: false }\n * ```\n *\n * @example Controller Access - Use pre-evaluated flags\n * ```typescript\n * @Controller('api')\n * export class ApiController {\n * @Get('dashboard')\n * async getDashboard(@Req() req: Request) {\n * // Access pre-evaluated flags (no service call needed)\n * const flags = req.featureFlags;\n *\n * if (flags?.NEW_DASHBOARD) {\n * return this.dashboardService.getNewDashboard();\n * } else {\n * return this.dashboardService.getLegacyDashboard();\n * }\n * }\n * }\n * ```\n *\n * @example Service Access - Inject flags into services\n * ```typescript\n * @Injectable()\n * export class UserService {\n * async getUsers(@Req() req: Request) {\n * const flags = req.featureFlags;\n *\n * // Use flags to modify service behavior\n * if (flags?.ENHANCED_USER_DATA) {\n * return this.getUsersWithEnhancedData();\n * }\n *\n * return this.getBasicUsers();\n * }\n * }\n * ```\n *\n * @example Error Handling - Invalid flag keys\n * ```typescript\n * // Request with invalid flag:\n * // GET /api/users?flag=INVALID_FLAG\n * //\n * // Response:\n * // HTTP 404 Not Found\n * // {\n * // \"error\": \"Invalid feature flag key: INVALID_FLAG\",\n * // \"statusCode\": 404\n * // }\n * ```\n *\n * @example Multiple Flags - Accumulate flags across requests\n * ```typescript\n * // First request adds AUTH_GOOGLE: true\n * // Second request adds PREMIUM_FEATURES: false\n * // req.featureFlags = {\n * // AUTH_GOOGLE: true,\n * // PREMIUM_FEATURES: false\n * // }\n * ```\n */\n@Injectable()\nexport class FeatureFlagMiddleware implements NestMiddleware {\n private readonly logger = new Logger(FeatureFlagMiddleware.name);\n\n constructor(private readonly featureFlagService: FeatureFlagService) {}\n\n /**\n * Main middleware execution method\n *\n * @description Processes incoming requests to evaluate and attach feature flags.\n * Handles flag key extraction from multiple sources and graceful error handling.\n *\n * @param {FeatureFlagRequest} req - Express request object with feature flag extensions\n * @param {unknown} res - Express response object (not used in this middleware)\n * @param {Function} next - Next middleware function in the chain\n *\n * @throws {BaseError} When flag key is invalid or evaluation fails\n *\n * @example Request Processing Flow\n * ```typescript\n * // 1. Extract flag key from request\n * const flagKey = req.query.flag || req.headers['x-feature-flag'] || 'AUTH_GOOGLE';\n *\n * // 2. Validate flag key exists in system\n * if (!isFeatureFlagKey(flagKey)) {\n * throw new Error('Invalid flag key');\n * }\n *\n * // 3. Evaluate flag using service\n * const evaluation = await this.featureFlagService.evaluateFlag(flagKey);\n *\n * // 4. Attach to request object\n * req.featureFlags = { [flagKey]: evaluation.isEnabled };\n *\n * // 5. Continue to next middleware\n * next();\n * ```\n */\n // Use a simple next type to avoid conflicts with differing framework types across environments\n async use(\n req: FeatureFlagRequest,\n res: unknown,\n next: (...args: unknown[]) => void\n ): Promise<void> {\n try {\n const flagKey =\n // Prefer query param -> header -> default\n (req.query instanceof URLSearchParams\n ? req.query.get('flag')\n : (req.query?.['flag'] as string | undefined)) ??\n (req.headers?.['x-feature-flag'] as string | undefined) ??\n 'AUTH_GOOGLE';\n\n if (!isFeatureFlagKey(flagKey)) {\n throw new BaseError(\n ERROR_CODES.RETRY_FAILED,\n HTTP_STATUS.NOT_FOUND,\n `Invalid feature flag key: ${flagKey}`\n );\n }\n\n const flagEvaluation = await this.featureFlagService.evaluateFlag(flagKey);\n // Attach dynamically evaluated flag\n req.featureFlags = {\n ...req.featureFlags,\n [flagKey]: flagEvaluation.isEnabled,\n };\n\n this.logger.debug(`Feature flags attached to request: ${JSON.stringify(req.featureFlags)}`);\n next();\n } catch (error) {\n this.logger.error('Error evaluating feature flags', error);\n throw new BaseError(\n ERROR_CODES.RETRY_FAILED,\n HTTP_STATUS.SERVICE_UNAVAILABLE,\n 'Failed to evaluate feature flag'\n );\n }\n }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Logger } from '@nestjs/common';\nimport { Observable, tap } from 'rxjs';\n\n/**\n * Interceptor for feature flag usage analytics.\n *\n * FLOW:\n * 1. Runs AFTER middleware attaches feature flags.\n * 2. Dynamically tracks which feature flags are enabled for this request.\n * 3. Can send metrics to analytics service or database.\n * 4. Calls the next handler (controller/service).\n * 5. After controller/service finishes, optionally track request completion.\n */\n\n@Injectable()\nexport class FeatureFlagLoggingInterceptor implements NestInterceptor {\n private readonly logger = new Logger(FeatureFlagLoggingInterceptor.name);\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const request = context.switchToHttp().getRequest();\n const path = request.url;\n const flags = request.featureFlags ?? {};\n\n // Dynamically track feature flag usage\n const featureToTrack = request.headers?.['x-feature-flag'];\n\n if (featureToTrack && flags[featureToTrack]) {\n this.trackFeatureUsage(featureToTrack, path);\n } else {\n // Fallback: track all enabled flags\n for (const [flag, enabled] of Object.entries(flags)) {\n if (enabled) this.trackFeatureUsage(flag, path);\n }\n }\n\n // Proceed to controller/service\n return next.handle().pipe(\n tap(() => {\n // Optional: track request completion\n this.logger.log(`Completed request: ${path}`);\n })\n );\n }\n\n private trackFeatureUsage(flag: string, path: string): void {\n // TODO: Replace this with real analytics integration\n this.logger.log(`Feature \"${flag}\" used on endpoint \"${path}\"`);\n }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Logger } from '@nestjs/common';\nimport { BaseError } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\n\nimport { Observable } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\n/**\n * Interceptor to enforce feature flag rules in real-time.\n *\n * FLOW:\n * 1. Runs AFTER middleware has attached feature flags to the request.\n * 2. Checks if the requested feature is enabled.\n * 3. If disabled, blocks the request with an HTTP 403.\n * 4. If enabled, passes the request to the controller/service.\n */\n@Injectable()\nexport class ErrorHandlingInterceptor implements NestInterceptor {\n private readonly logger = new Logger(ErrorHandlingInterceptor.name);\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const req = context.switchToHttp().getRequest();\n const path = req.url;\n const flags = req.featureFlags ?? {};\n\n // Determine which feature flag to enforce.\n // Optionally, you can pass it in headers, query, or some route metadata.\n const featureToCheck = req.headers?.['x-feature-flag'] ?? 'GLOBAL_FEATURE';\n\n // Block request if the feature is disabled\n if (!flags[featureToCheck]) {\n this.logger.warn(`Request to ${path} blocked: ${featureToCheck} is disabled`);\n throw new BaseError('RETRY_FAILED', HTTP_STATUS.FORBIDDEN);\n }\n\n // If feature is enabled, continue normally\n this.logger.debug(`Request to ${path} allowed: ${featureToCheck} is enabled`);\n return next.handle().pipe(\n catchError(error => {\n this.logger.error(`Error processing request to ${path}`, error);\n throw new BaseError('INTERNAL_SERVER_ERROR', HTTP_STATUS.INTERNAL_SERVER_ERROR, error);\n })\n );\n }\n}\n","/**\n * Feature Flag Provider Component\n *\n * React context provider for feature flags system.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview React provider for feature flag context\n * @version 1.0.0\n */\n\nimport React from 'react';\nimport { createContext, useEffect, useState, useCallback, useRef } from 'react';\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContextValue,\n FeatureFlagProviderProps,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { FeatureFlagProviderFactory } from '@domain/featureFlags/providers/factory';\nimport type { FeatureFlagKey } from '@domain/types';\n\n/**\n * React context for feature flag provider.\n * Using string as the base type to support any feature flag key.\n */\nexport const FeatureFlagContext = createContext<FeatureFlagContextValue<FeatureFlagKey> | null>(\n null\n);\n\n/**\n * Feature Flag Provider component that manages the feature flag system.\n * Provides context for accessing feature flags throughout the React component tree.\n *\n * @param props - Provider configuration and options\n * @returns JSX element providing feature flag context\n *\n * @example\n * ```typescript\n * // Basic usage\n * function App() {\n * return (\n * <FeatureFlagAppProvider\n * config={{\n * provider: 'memory',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }}\n * features={FEATURES}\n * >\n * <MyApplication />\n * </FeatureFlagAppProvider>\n * );\n * }\n *\n * // With custom context and callbacks\n * function App() {\n * const featureFlagConfig = {\n * provider: 'api' as const,\n * apiEndpoint: 'https://api.example.com',\n * apiKey: process.env.REACT_APP_FF_API_KEY,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * };\n *\n * const defaultContext = {\n * environment: 'production' as const,\n * userId: getCurrentUserId(),\n * userRole: getCurrentUserRole(),\n * };\n *\n * return (\n * <FeatureFlagAppProvider\n * config={featureFlagConfig}\n * features={FEATURES}\n * defaultContext={defaultContext}\n * onReady={(provider) => console.log('Feature flags ready!')}\n * onError={(error) => console.error('Feature flag error:', error)}\n * showLoading\n * >\n * <MyApplication />\n * </FeatureFlagAppProvider>\n * );\n * }\n * ```\n */\n// eslint-disable-next-line max-lines-per-function\nexport function FeatureFlagAppProvider<\n FeatureFlags extends Record<FeatureFlagKey, FeatureFlagValue>,\n>({\n config,\n // defaultContext: _defaultContext,\n children,\n features,\n onReady,\n onError,\n isShowLoading = false,\n loadingComponent,\n errorComponent,\n}: FeatureFlagProviderProps<FeatureFlagKey, FeatureFlags>): React.ReactElement {\n // State management\n const [state, setState] = useState<{\n provider: IFeatureFlagProvider<FeatureFlagKey> | null;\n isInitialized: boolean;\n isLoading: boolean;\n error: Error | null;\n lastUpdated: Date | null;\n }>({\n provider: null,\n isInitialized: false,\n isLoading: true,\n error: null,\n lastUpdated: null,\n });\n\n // Ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n // Initialize provider\n const initializeProvider = useCallback(async (): Promise<void> => {\n try {\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n // Create and initialize provider\n const provider = FeatureFlagProviderFactory.create<FeatureFlagKey>(config, features);\n await provider.initialize();\n\n if (isMountedRef.current) {\n setState({\n provider,\n isInitialized: true,\n isLoading: false,\n error: null,\n lastUpdated: new Date(),\n });\n\n // Call onReady callback\n onReady?.(provider);\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error('Failed to initialize feature flags');\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n error: errorObj,\n }));\n\n // Call onError callback\n onError?.(errorObj);\n }\n }\n }, [config, onReady, onError]);\n\n // Manual refresh function\n const refresh = useCallback(async (): Promise<void> => {\n if (!state.provider) {\n await initializeProvider();\n return;\n }\n\n try {\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n await state.provider.refresh();\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n lastUpdated: new Date(),\n }));\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error('Failed to refresh feature flags');\n\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n error: errorObj,\n }));\n\n onError?.(errorObj);\n }\n }\n }, [state.provider, initializeProvider, onError]);\n\n // Initialize on mount\n useEffect(() => {\n void initializeProvider();\n }, [initializeProvider]);\n\n // Subscribe to provider updates\n useEffect(() => {\n if (!state.provider) return;\n\n const unsubscribe = state.provider.subscribe(() => {\n if (isMountedRef.current) {\n setState(prev => ({\n ...prev,\n lastUpdated: new Date(),\n }));\n }\n });\n\n return unsubscribe;\n }, [state.provider]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n if (state.provider) {\n state.provider.dispose();\n }\n };\n }, [state.provider]);\n\n // Handle loading state\n if (state.isLoading && isShowLoading) {\n if (loadingComponent) {\n const LoadingComponent = loadingComponent;\n return <LoadingComponent />;\n }\n return <div>Loading feature flags...</div>;\n }\n\n // Handle error state\n if (state.error && errorComponent) {\n const ErrorComponent = errorComponent;\n return <ErrorComponent error={state.error} retry={initializeProvider} />;\n }\n\n // Don't render children if provider is not available\n if (!state.provider) {\n return <div>Feature flag provider not available</div>;\n }\n\n // Create context value\n const contextValue: FeatureFlagContextValue<FeatureFlagKey> = {\n provider: state.provider,\n isInitialized: state.isInitialized,\n isLoading: state.isLoading,\n error: state.error,\n lastUpdated: state.lastUpdated,\n refresh,\n };\n\n return <FeatureFlagContext.Provider value={contextValue}>{children}</FeatureFlagContext.Provider>;\n}\n\n// Set display name for proper identification in testing\nFeatureFlagAppProvider.displayName = 'FeatureFlagAppProvider';\n\n/**\n * Higher-order component for providing feature flag context.\n * Alternative to using the FeatureFlagAppProvider component directly.\n *\n * @param config - Feature flag configuration\n * @param options - Additional provider options\n * @returns HOC function that wraps components with feature flag provider\n *\n * @example\n * ```typescript\n * const withFeatureFlags = createFeatureFlagProvider({\n * provider: 'memory',\n * isCacheEnabled: true,\n * }, {\n * features: FEATURES\n * });\n *\n * const AppWithFeatureFlags = withFeatureFlags(App);\n * ```\n */\nexport function createFeatureFlagProvider<\n FeatureFlags extends Record<FeatureFlagKey, FeatureFlagValue>,\n>(\n config: FeatureFlagConfig<FeatureFlagKey>,\n options?: Pick<\n FeatureFlagProviderProps<FeatureFlagKey, FeatureFlags>,\n 'defaultContext' | 'onReady' | 'onError' | 'features'\n >\n) {\n return function withFeatureFlags<P extends object>(\n component: React.ComponentType<P>\n ): React.ComponentType<P> {\n const WrappedComponent = (props: P): React.ReactElement => (\n <FeatureFlagAppProvider\n config={config}\n features={options?.features ?? ({} as FeatureFlags)}\n {...options}\n >\n {React.createElement(component, props)}\n </FeatureFlagAppProvider>\n );\n\n WrappedComponent.displayName = `withFeatureFlags(${component.displayName ?? component.name})`;\n\n return WrappedComponent;\n };\n}\n","/**\n * useFeatureFlagProvider Hook\n *\n * React hook for accessing the feature flag provider from context.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Provider access hook for feature flags\n * @version 1.0.0\n */\n\nimport { useContext } from 'react';\nimport { FeatureFlagContext } from '../providers/FeatureFlagProvider';\nimport type { FeatureFlagProvider, FeatureFlagContextValue } from '@plyaz/types';\n\n/**\n * Hook for accessing the feature flag provider from React context.\n * Must be used within a FeatureFlagProvider component.\n *\n * @returns Feature flag provider instance\n * @throws Error if used outside of FeatureFlagProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const provider = useFeatureFlagProvider<FeatureFlagKey>();\n *\n * const handleRefresh = async () => {\n * await provider.refresh();\n * };\n *\n * return <button onClick={handleRefresh}>Refresh Flags</button>;\n * }\n * ```\n */\nexport function useFeatureFlagProvider<\n FeatureFlagKey extends string,\n>(): FeatureFlagProvider<FeatureFlagKey> {\n const context = useContext(FeatureFlagContext) as FeatureFlagContextValue<FeatureFlagKey> | null;\n\n if (!context) {\n throw new Error(\n 'useFeatureFlagProvider must be used within a FeatureFlagAppProvider. ' +\n 'Make sure to wrap your component tree with <FeatureFlagAppProvider>.'\n );\n }\n\n return context.provider;\n}\n\n/**\n * Hook for accessing the feature flag provider status.\n * Provides information about provider initialization and health.\n *\n * @returns Provider status information\n *\n * @example\n * ```typescript\n * function StatusComponent() {\n * const { isInitialized, isLoading, error } = useFeatureFlagProviderStatus<FeatureFlagKey>();\n *\n * if (isLoading) return <div>Loading feature flags...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!isInitialized) return <div>Initializing...</div>;\n *\n * return <div>Feature flags ready!</div>;\n * }\n * ```\n */\nexport function useFeatureFlagProviderStatus<FeatureFlagKey extends string>(): {\n isInitialized: boolean;\n isLoading: boolean;\n error: Error | null;\n lastUpdated: Date | null | undefined;\n} {\n const context = useContext(FeatureFlagContext) as FeatureFlagContextValue<FeatureFlagKey> | null;\n\n if (!context) {\n throw new Error(\n 'useFeatureFlagProviderStatus must be used within a FeatureFlagProvider. ' +\n 'Make sure to wrap your component tree with <FeatureFlagAppProvider>.'\n );\n }\n\n return {\n isInitialized: context.isInitialized,\n isLoading: context.isLoading,\n error: context.error,\n lastUpdated: context.lastUpdated ? new Date(context.lastUpdated) : undefined,\n };\n}\n","/* eslint-disable max-lines-per-function */\n/**\n * Feature Flag Hook Helpers\n *\n * Helper functions for feature flag hooks to reduce function complexity.\n *\n * @fileoverview Helper functions for feature flag hooks\n * @version 1.0.0\n */\n\nimport type * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n FeatureFlagValue,\n FeatureFlagContext,\n FeatureFlagHook,\n FeatureFlagProvider,\n FeatureFlagState,\n} from '@plyaz/types';\n\n/**\n * Creates evaluation function for a feature flag.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @template T - The expected type of the flag value\n * @param params - Evaluation parameters\n * @param params.provider - Feature flag provider instance\n * @param params.key - Feature flag key to evaluate\n * @param params.context - Optional evaluation context\n * @param params.defaultValue - Default value if evaluation fails\n * @param setState - React state setter for flag state\n * @returns Async function that evaluates the flag\n */\nexport function createEvaluationFunction<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = string | number | boolean | Record<string, unknown>,\n>(\n params: {\n provider: FeatureFlagProvider<FeatureFlagKey> | null;\n key: FeatureFlagKey;\n context: FeatureFlagContext | undefined;\n defaultValue: T | undefined;\n },\n setState: React.Dispatch<React.SetStateAction<FeatureFlagState<FeatureFlagKey, T>>>\n): () => Promise<void> {\n const { provider, key, context, defaultValue } = params;\n return async (): Promise<void> => {\n if (!provider) return;\n\n setState(prev => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const evaluation = await provider.getFlag(key, context);\n setState(prev => ({\n ...prev,\n value: (evaluation?.value ?? defaultValue ?? false) as T,\n isLoading: false,\n error: null,\n evaluation,\n }));\n } catch (error) {\n setState(prev => ({\n ...prev,\n value: (defaultValue ?? false) as T,\n isLoading: false,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n evaluation: null,\n }));\n }\n };\n}\n\n/**\n * Custom hook for managing feature flag evaluation logic.\n * Handles loading state, error management, and automatic evaluation.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @template T - The expected type of the flag value\n * @param key - Feature flag key to evaluate\n * @param context - Optional evaluation context\n * @param defaultValue - Default value if evaluation fails\n * @param provider - Feature flag provider instance\n * @returns Feature flag hook state with value, loading, error, and refresh function\n */\nexport function useFeatureFlagEvaluation<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = boolean,\n>(\n key: FeatureFlagKey,\n context: FeatureFlagContext | undefined,\n defaultValue: T | undefined,\n provider: FeatureFlagProvider<FeatureFlagKey> | null\n): FeatureFlagHook<T> {\n // State management\n const [state, setState] = useState<FeatureFlagState<FeatureFlagKey, T>>({\n value: (defaultValue ?? false) as T,\n isLoading: true,\n error: null,\n evaluation: null,\n });\n\n // Create evaluation function with memoization\n const evaluateFlag = useCallback(\n createEvaluationFunction<FeatureFlagKey, T>({ provider, key, context, defaultValue }, setState),\n [provider, key, context, defaultValue]\n );\n\n // Evaluate on mount and when dependencies change\n useEffect(() => {\n // Use setTimeout to avoid \"act\" warnings in tests\n const timer = setTimeout(() => {\n void evaluateFlag();\n }, 0);\n\n return () => clearTimeout(timer);\n }, [evaluateFlag]);\n\n return {\n value: state.value,\n isLoading: state.isLoading,\n error: state.error,\n refresh: evaluateFlag,\n };\n}\n\n/**\n * Custom hook for managing multiple feature flags evaluation.\n * Returns a record of flag states for multiple flags.\n *\n * @template FeatureFlagKey - The type of feature flag keys\n * @param keys - Array of feature flag keys to evaluate\n * @param context - Optional evaluation context\n * @param defaultValue - Default value for all flags if evaluation fails\n * @param provider - Feature flag provider instance\n * @returns Record mapping flag keys to their hook states\n */\nexport function useMultipleFeatureFlagsEvaluation<FeatureFlagKey extends string>(\n keys: FeatureFlagKey[],\n context: FeatureFlagContext | undefined,\n defaultValue: FeatureFlagValue,\n provider: FeatureFlagProvider<FeatureFlagKey> | null\n): Record<string, FeatureFlagHook<FeatureFlagValue>> {\n // Initialize state for all flags\n const [flagStates, setFlagStates] = useState<\n Record<string, FeatureFlagState<FeatureFlagKey, FeatureFlagValue>>\n >(() => {\n const initialStates: Record<string, FeatureFlagState<FeatureFlagKey, FeatureFlagValue>> = {};\n keys.forEach(key => {\n initialStates[key] = {\n value: defaultValue,\n isLoading: true,\n error: null,\n evaluation: null,\n };\n });\n return initialStates;\n });\n\n // Evaluate all flags\n const evaluateFlags = useCallback(async () => {\n if (!provider) return;\n\n // Set loading state for all flags\n setFlagStates(prevStates => {\n const newStates = { ...prevStates };\n keys.forEach(key => {\n newStates[key] = {\n ...newStates[key],\n isLoading: true,\n error: null,\n };\n });\n return newStates;\n });\n\n // Evaluate all flags concurrently\n const evaluations = await Promise.allSettled(\n keys.map(async key => {\n try {\n const evaluation = await provider.getFlag(key, context);\n return { key, evaluation, error: null };\n } catch (error) {\n return {\n key,\n evaluation: null,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n };\n }\n })\n );\n\n // Update states with results\n setFlagStates(prevStates => {\n const newStates = { ...prevStates };\n evaluations.forEach((result, index) => {\n const key = keys[index];\n if (result.status === 'fulfilled') {\n const { evaluation, error } = result.value;\n newStates[key] = {\n value: evaluation?.value ?? defaultValue,\n isLoading: false,\n error,\n evaluation,\n };\n }\n });\n return newStates;\n });\n }, [keys, provider, context, defaultValue]);\n\n // Evaluate on mount and when dependencies change\n useEffect(() => {\n const timer = setTimeout(() => {\n void evaluateFlags();\n }, 0);\n\n return () => clearTimeout(timer);\n }, [evaluateFlags]);\n\n // Create individual refresh functions for each flag\n const refreshFunctions = useMemo(() => {\n const refreshFns: Record<string, () => Promise<void>> = {};\n\n keys.forEach(key => {\n refreshFns[key] = async () => {\n if (!provider) return;\n\n setFlagStates(prev => ({\n ...prev,\n [key]: { ...prev[key], isLoading: true, error: null },\n }));\n\n try {\n const evaluation = await provider.getFlag(key, context);\n setFlagStates(prev => ({\n ...prev,\n [key]: {\n value: evaluation?.value ?? defaultValue,\n isLoading: false,\n error: null,\n evaluation,\n },\n }));\n } catch (error) {\n setFlagStates(prev => ({\n ...prev,\n [key]: {\n value: defaultValue,\n isLoading: false,\n error: error instanceof Error ? error : new Error('Evaluation failed'),\n evaluation: null,\n },\n }));\n }\n };\n });\n\n return refreshFns;\n }, [keys, provider, context, defaultValue]);\n\n // Build the return object\n return useMemo(() => {\n const result: Record<string, FeatureFlagHook<FeatureFlagValue>> = {};\n\n keys.forEach(key => {\n const state = flagStates[key] ?? {\n value: defaultValue,\n isLoading: true,\n error: null,\n evaluation: null,\n };\n\n result[key] = {\n value: state.value,\n isLoading: state.isLoading,\n error: state.error,\n refresh: refreshFunctions[key] ?? (async () => {}),\n };\n });\n\n return result;\n }, [keys, flagStates, refreshFunctions, defaultValue]);\n}\n","/**\n * useFeatureFlag Hook\n *\n * React hook for accessing individual feature flags with caching and real-time updates.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview React hook for feature flag access\n * @version 1.0.0\n */\n\nimport { useEffect, useCallback } from 'react';\nimport type { FeatureFlagValue, FeatureFlagHook, UseFeatureFlagOptions } from '@plyaz/types';\nimport { useFeatureFlagProvider } from './useFeatureFlagProvider';\nimport {\n useFeatureFlagEvaluation,\n useMultipleFeatureFlagsEvaluation,\n} from './useFeatureFlagHelpers';\n\n/**\n * React hook for accessing a single feature flag.\n * Provides real-time updates and automatic caching.\n *\n * @template T - Expected type of the flag value\n * @param key - Feature flag key to evaluate\n * @param options - Hook configuration options\n * @returns Feature flag hook state\n *\n * @example\n * ```typescript\n * // Basic usage\n * const { value: isEnabled, isLoading, error } = useFeatureFlag<FeatureFlagKey>('AUTH_GOOGLE');\n *\n * // With context and type safety\n * const { value, isLoading, refresh } = useFeatureFlag<FeatureFlagKey, number>(\n * 'ROLLOUT_PERCENTAGE',\n * {\n * context: { userId: 'user123', environment: 'production' },\n * defaultValue: 0\n * }\n * );\n *\n * // With auto-refresh disabled\n * const { value, refresh } = useFeatureFlag<FeatureFlagKey>('BETA_FEATURE', {\n * autoRefresh: false,\n * defaultValue: false\n * });\n * ```\n */\nexport function useFeatureFlag<FeatureFlagKey extends string, T extends FeatureFlagValue = boolean>(\n key: FeatureFlagKey,\n options: UseFeatureFlagOptions = {}\n): FeatureFlagHook<T> {\n const { context, isAutoRefresh = true, defaultValue, isSuspense = false } = options;\n const provider = useFeatureFlagProvider<FeatureFlagKey>();\n\n const {\n value,\n isLoading,\n error,\n refresh: evaluateFlag,\n } = useFeatureFlagEvaluation<FeatureFlagKey, T>(\n key,\n context,\n defaultValue as T | undefined,\n provider\n );\n\n // Manual refresh function\n const refresh = useCallback(async (): Promise<void> => {\n await evaluateFlag();\n }, [evaluateFlag]);\n\n // Note: Initial evaluation is handled by useFeatureFlagEvaluation hook\n\n // Subscribe to provider updates if auto-refresh is enabled\n useEffect(() => {\n if (!provider || !isAutoRefresh) return;\n\n const unsubscribe = provider.subscribe(() => {\n void evaluateFlag();\n });\n\n return unsubscribe;\n }, [provider, isAutoRefresh, evaluateFlag]);\n\n // Handle suspense mode\n if (isSuspense && isLoading) {\n // Throw the evaluation promise for React Suspense\n throw evaluateFlag();\n }\n\n return {\n value,\n isLoading,\n error,\n refresh,\n };\n}\n\n/**\n * Hook for checking if a feature flag is enabled.\n * Simplified version of useFeatureFlag that returns only boolean state.\n *\n * @param key - Feature flag key to check\n * @param options - Hook configuration options\n * @returns Boolean indicating if flag is enabled\n *\n * @example\n * ```typescript\n * const isGoogleAuthEnabled = useFeatureFlagEnabled<FeatureFlagKey>('AUTH_GOOGLE');\n * const isBetaEnabled = useFeatureFlagEnabled<FeatureFlagKey>('BETA_FEATURE', {\n * context: { userId: 'user123', environment: 'production' }\n * });\n * ```\n */\nexport function useFeatureFlagEnabled<FeatureFlagKey extends string>(\n key: FeatureFlagKey,\n options: UseFeatureFlagOptions = {}\n): boolean {\n const { value } = useFeatureFlag<FeatureFlagKey, boolean>(key, {\n ...options,\n defaultValue: options.defaultValue ?? false,\n });\n\n return value;\n}\n\n/**\n * Hook for getting a feature flag value with type safety.\n * Provides the raw value without the loading state wrapper.\n *\n * @template T - Expected type of the flag value\n * @param key - Feature flag key to get value for\n * @param options - Hook configuration options\n * @returns The flag value with type safety\n *\n * @example\n * ```typescript\n * const rolloutPercentage = useFeatureFlagValue<FeatureFlagKey, number>('ROLLOUT_PERCENTAGE', {\n * defaultValue: 0\n * });\n *\n * const theme = useFeatureFlagValue<FeatureFlagKey, 'light' | 'dark'>('UI_THEME', {\n * defaultValue: 'light'\n * });\n * ```\n */\nexport function useFeatureFlagValue<\n FeatureFlagKey extends string,\n T extends FeatureFlagValue = FeatureFlagValue,\n>(key: FeatureFlagKey, options: UseFeatureFlagOptions = {}): T {\n const { value } = useFeatureFlag<FeatureFlagKey, T>(key, options);\n return value;\n}\n\n/**\n * Hook for evaluating multiple feature flags at once.\n * Useful for loading multiple flags with a single provider call.\n *\n * @param keys - Array of feature flag keys to evaluate\n * @param options - Hook configuration options\n * @returns Map of flag keys to their hook states\n *\n * @example\n * ```typescript\n * const flags = useMultipleFeatureFlags<FeatureFlagKey>([\n * 'AUTH_GOOGLE',\n * 'AUTH_GITHUB',\n * 'BETA_FEATURE'\n * ], {\n * context: { userId: 'user123', environment: 'production' }\n * });\n *\n * const isGoogleEnabled = flags.AUTH_GOOGLE.value;\n * const isGithubEnabled = flags.AUTH_GITHUB.value;\n * ```\n */\nexport function useMultipleFeatureFlags<FeatureFlagKey extends string>(\n keys: FeatureFlagKey[],\n options: UseFeatureFlagOptions = {}\n): Record<FeatureFlagKey, FeatureFlagHook<FeatureFlagValue>> {\n const provider = useFeatureFlagProvider();\n const { context, isAutoRefresh = true, defaultValue = false } = options;\n\n const flagStates = useMultipleFeatureFlagsEvaluation(keys, context, defaultValue, provider);\n\n // Subscribe to provider updates\n useEffect(() => {\n if (!provider || !isAutoRefresh) return;\n\n const unsubscribe = provider.subscribe(() => {\n // Refresh individual flags on provider updates\n keys.forEach(key => {\n if (typeof flagStates[key]?.refresh === 'function') {\n void flagStates[key].refresh();\n }\n });\n });\n\n return unsubscribe;\n }, [provider, isAutoRefresh, flagStates, keys]);\n\n return flagStates;\n}\n","/**\n * useFeatureFlagHelpers Hook\n *\n * React hook providing helper functions for feature flag management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Helper functions hook for feature flags\n * @version 1.0.0\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type { FeatureFlagValue, FeatureFlagContext, FeatureFlagHelpers } from '@plyaz/types';\nimport { useFeatureFlagProvider } from './useFeatureFlagProvider';\n\n/**\n * Hook that provides helper functions for feature flag operations.\n * Includes override management, bulk operations, and conditional execution.\n *\n * @returns Object containing helper functions\n *\n * @example\n * ```typescript\n * const helpers = useFeatureFlagHelpers<FeatureFlagKey>();\n *\n * // Set override\n * helpers.setOverride('AUTH_GOOGLE', true);\n *\n * // Check multiple flags\n * const anyEnabled = await helpers.isAnyEnabled(['AUTH_GOOGLE', 'AUTH_GITHUB']);\n *\n * // Conditional execution\n * const result = await helpers.whenEnabled('BETA_FEATURE',\n * () => console.log('Beta feature is enabled'),\n * () => console.log('Beta feature is disabled')\n * );\n * ```\n */\nexport function useFeatureFlagHelpers<\n FeatureFlagKey extends string,\n>(): FeatureFlagHelpers<FeatureFlagKey> {\n const provider = useFeatureFlagProvider();\n\n const setOverride = useCallback(\n (key: FeatureFlagKey, value: FeatureFlagValue) => {\n provider.setOverride(key, value);\n },\n [provider]\n );\n\n const removeOverride = useCallback(\n (key: FeatureFlagKey) => {\n provider.removeOverride(key);\n },\n [provider]\n );\n\n const clearOverrides = useCallback(() => {\n provider.clearOverrides();\n }, [provider]);\n\n const refresh = useCallback(async () => {\n await provider.refresh();\n }, [provider]);\n\n const getMultipleFlags = useCallback(\n async (\n keys: FeatureFlagKey[],\n context?: FeatureFlagContext\n ): Promise<Record<FeatureFlagKey, FeatureFlagValue>> => {\n const results = {} as Record<FeatureFlagKey, FeatureFlagValue>;\n\n await Promise.all(\n keys.map(async key => {\n const evaluation = await provider.getFlag(key, context);\n results[key] = evaluation.value;\n })\n );\n\n return results;\n },\n [provider]\n );\n\n const isAnyEnabled = useCallback(\n async (keys: FeatureFlagKey[], context?: FeatureFlagContext): Promise<boolean> => {\n const evaluations = await Promise.all(keys.map(key => provider.isEnabled(key, context)));\n return evaluations.some((enabled: boolean) => enabled);\n },\n [provider]\n );\n\n const isAllEnabled = useCallback(\n async (keys: FeatureFlagKey[], context?: FeatureFlagContext): Promise<boolean> => {\n const evaluations = await Promise.all(keys.map(key => provider.isEnabled(key, context)));\n return evaluations.every((enabled: boolean) => enabled);\n },\n [provider]\n );\n\n const whenEnabled = useCallback(\n async <T>(\n key: FeatureFlagKey,\n callback: () => T | Promise<T>,\n fallback?: () => T | Promise<T>,\n context?: FeatureFlagContext\n ): Promise<T | undefined> => {\n const isEnabled = await provider.isEnabled(key, context);\n\n if (isEnabled) {\n return callback();\n } else if (fallback) {\n return fallback();\n }\n\n return undefined;\n },\n [provider]\n );\n\n return useMemo(\n () => ({\n setOverride,\n removeOverride,\n clearOverrides,\n refresh,\n getMultipleFlags,\n isAnyEnabled,\n isAllEnabled,\n whenEnabled,\n }),\n [\n setOverride,\n removeOverride,\n clearOverrides,\n refresh,\n getMultipleFlags,\n isAnyEnabled,\n isAllEnabled,\n whenEnabled,\n ]\n );\n}\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport { API_ERROR_CODES, PACKAGE_STATUS_CODES, OPERATIONS } from '@plyaz/types';\nimport type { ApiEnvironmentConfig } from '@plyaz/types/core';\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link ApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: ApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG;\n case 'staging':\n return STAGING_CONFIG;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG;\n }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n * // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n if (!mergedConfig.baseURL) {\n errors.push('baseURL is required in API configuration (apiConfig parameter)');\n }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED when encryption is enabled in production. ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in production. ' +\n 'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n );\n }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (!mergedConfig.networkAware?.enabled) {\n warnings.push(\n '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n 'Enable it for better user experience on varying network conditions.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in production. ' +\n 'Enable it for production monitoring and alerting.'\n );\n }\n\n if (\n mergedConfig.retry &&\n mergedConfig.retry.attempts !== undefined &&\n mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n ) {\n warnings.push(\n `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n 'Consider increasing to 3-5 for better reliability in production.'\n );\n }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED in staging (aligned with production). ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in staging. ' +\n 'Staging should mirror production for accurate testing.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in staging. ' +\n 'Enable it to test monitoring before production deployment.'\n );\n }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n warnings.push(\n '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n 'Encryption will be skipped in development (this is normal).'\n );\n }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `ApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link ApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: ApiEnvironmentConfig,\n envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n const mapped: Partial<ApiConfig> = {};\n\n // Add API key to headers if provided\n if (envConfig.apiKey) {\n // Extract existing static headers if headers is an object with static property\n const existingStatic =\n envDefaults.headers &&\n typeof envDefaults.headers === 'object' &&\n 'static' in envDefaults.headers &&\n typeof envDefaults.headers.static === 'object'\n ? envDefaults.headers.static\n : {};\n\n mapped.headers = {\n static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n };\n }\n\n // Note: rateLimit from envConfig is not mapped to ApiConfig\n // Rate limiting is typically handled at the server/API gateway level\n // If needed in the future, it should be added to ApiConfig interface first\n\n return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n * { date: '2025-10-16' },\n * { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link ApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n envConfig: ApiEnvironmentConfig\n): void {\n const shouldSetAsDefault = envConfig.setAsDefault !== false;\n if (shouldSetAsDefault) {\n setDefaultApiClient(client);\n }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n envConfig: ApiEnvironmentConfig,\n mergedConfig: ApiClientOptions\n): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required base URL\n validateBaseURL(mergedConfig, errors);\n\n // Environment-specific validation\n if (envConfig.env === 'production') {\n validateProductionEncryption(mergedConfig, errors, warnings);\n validateProductionPerformance(mergedConfig, warnings);\n } else if (envConfig.env === 'staging') {\n validateStagingEncryption(mergedConfig, errors, warnings);\n } else if (envConfig.env === 'development') {\n validateDevelopmentEncryption(mergedConfig, warnings);\n }\n\n // Log warnings (intentional console usage for config validation)\n if (warnings.length > 0) {\n globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n }\n\n // Throw if there are errors\n if (errors.length > 0) {\n throw new ApiPackageError(\n 'service.validation.failed',\n PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n {\n context: {\n operation: OPERATIONS.VALIDATION,\n // Ensure error details conform to ErrorDetail shape (include errorCode)\n errors: errors.map(err => ({\n field: 'config',\n message: err,\n errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n })),\n i18n: {\n errors: errors.join('; '),\n warnings: warnings.join('; '),\n },\n },\n }\n );\n }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n * baseURL: process.env.API_URL!,\n * encryption: {\n * key: {\n * id: 'prod-key-v1',\n * key: process.env.ENCRYPTION_KEY!,\n * algorithm: 'AES-GCM'\n * }\n * },\n * clientEvents: {\n * onRequestStart: (event) => apiStore.trackRequest(event),\n * },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\nexport class ApiClientService {\n private static instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null = null;\n private static isInitializing = false;\n private static initPromise: Promise<void> | null = null;\n\n /**\n * Initialize the API client with environment config and API options\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n * @returns Promise that resolves to the initialized client\n */\n static async init(\n envConfig: ApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n // If already initialized, return existing instance\n if (this.instance) {\n globalThis.console.warn(\n '[ApiClientService] Client already initialized. Returning existing instance.'\n );\n return this.instance;\n }\n\n // If currently initializing, wait for that to complete\n if (this.isInitializing && this.initPromise) {\n await this.initPromise;\n return this.instance!;\n }\n\n // Start initialization\n this.isInitializing = true;\n this.initPromise = this.createClient(envConfig, apiConfig);\n\n try {\n await this.initPromise;\n return this.instance!;\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n * Merges environment-specific defaults with API configuration\n *\n * Merge Priority (lowest to highest):\n * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n * 2. Environment metadata (envConfig - apiKey)\n * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n */\n private static async createClient(\n envConfig: ApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<void> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Merge with priority: envDefaults → envMetadata → apiConfig\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n apiConfig ?? {} // API configuration (highest priority - includes baseURL, encryption, etc.)\n ) as ApiClientOptions;\n\n // Step 4: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 5: Create the client instance with merged configuration\n this.instance = await createApiClient(mergedOptions);\n\n // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n applyDefaultClientSetting(this.instance, envConfig);\n } catch (error) {\n throw new ApiPackageError(\n 'service.initialization.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Get the initialized client instance\n *\n * @throws {ApiPackageError} If client not initialized\n */\n static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n if (!this.instance) {\n throw new ApiPackageError(\n 'service.not_initialized',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n context: {\n operation: OPERATIONS.INITIALIZATION,\n i18n: {\n hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n },\n },\n }\n );\n }\n return this.instance;\n }\n\n /**\n * Check if client is initialized\n */\n static isInitialized(): boolean {\n return this.instance !== null;\n }\n\n /**\n * Reinitialize with new config and options\n */\n static async reinitialize(\n envConfig: ApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n this.dispose();\n return this.init(envConfig, apiConfig);\n }\n\n /**\n * Dispose of the client instance\n */\n static dispose(): void {\n if (this.instance && 'dispose' in this.instance) {\n this.instance.dispose?.();\n }\n this.instance = null;\n this.isInitializing = false;\n this.initPromise = null;\n }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: ApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n","/**\n * API Provider Component for React/Next.js\n * Initializes the API client service with environment configuration and event handlers\n *\n * @module frontend/providers/ApiProvider\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactElement } from 'react';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport type { ApiProviderProps } from '@plyaz/types/core';\n\n/**\n * API Provider Component\n * IMPORTANT: For client components, pass sensitive config from server-side props/actions\n * Initializes the API client service for React/Next.js applications\n *\n * @example\n * ```tsx\n * // In your app layout or _app.tsx\n * import { ApiProvider } from '@plyaz/core';\n *\n * export default function RootLayout({ children }) {\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * const apiConfig = {\n * baseURL: process.env.API_URL!,\n * clientEvents: {\n * onRequestStart: (event) => console.log('Request started:', event),\n * },\n * };\n *\n * return (\n * <ApiProvider envConfig={envConfig} apiConfig={apiConfig}>\n * {children}\n * </ApiProvider>\n * );\n * }\n * ```\n */\nexport function ApiProvider({\n children,\n envConfig,\n apiConfig,\n loadingComponent,\n errorComponent,\n onInitialized,\n onError,\n}: ApiProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Initialize API client service once on mount\n // The singleton pattern in ApiClientService ensures only one instance is created\n // If already initialized, it returns the existing instance with a warning\n ApiClientService.init(envConfig, apiConfig)\n .then(() => {\n setIsReady(true);\n onInitialized?.();\n })\n .catch((err: unknown) => {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n globalThis.console.error('[ApiProvider] Failed to initialize API client:', error);\n });\n\n // Cleanup on unmount\n return () => {\n // Don't dispose the client on unmount - it's a singleton\n // Only dispose if you're sure you want to tear down the client\n };\n }, []); // Initialize once on mount - config changes are not supported after initialization\n\n // Show error component if initialization failed\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return (\n <div style={{ padding: '20px', color: 'red' }}>\n <h2>API Client Initialization Failed</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Show loading component while initializing\n if (!isReady) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div style={{ padding: '20px' }}>\n <p>Initializing API client...</p>\n </div>\n );\n }\n\n // Render children when ready\n return <>{children}</>;\n}\n"]}
|