@plyaz/core 1.1.1 → 1.2.1

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.
Files changed (243) hide show
  1. package/dist/adapters/index.d.ts +16 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/nestjs.d.ts +79 -0
  4. package/dist/adapters/nestjs.d.ts.map +1 -0
  5. package/dist/adapters/nextjs.d.ts +28 -0
  6. package/dist/adapters/nextjs.d.ts.map +1 -0
  7. package/dist/backend/example/example.controller.d.ts +121 -0
  8. package/dist/backend/example/example.controller.d.ts.map +1 -0
  9. package/dist/backend/example/example.module.d.ts +29 -0
  10. package/dist/backend/example/example.module.d.ts.map +1 -0
  11. package/dist/backend/example/index.d.ts +8 -0
  12. package/dist/backend/example/index.d.ts.map +1 -0
  13. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
  14. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
  15. package/dist/backend/featureFlags/config/feature-flag.config.d.ts +89 -0
  16. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
  17. package/dist/backend/featureFlags/config/validation.d.ts +181 -0
  18. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
  19. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
  20. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
  21. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
  22. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
  23. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
  24. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
  25. package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -56
  26. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  27. package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -44
  28. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  29. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +33 -0
  30. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
  31. package/dist/backend/featureFlags/index.d.ts +14 -41
  32. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  33. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
  34. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
  35. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
  36. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
  37. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +162 -0
  38. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
  39. package/dist/backend/index.d.ts +5 -0
  40. package/dist/backend/index.d.ts.map +1 -1
  41. package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
  42. package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
  43. package/dist/base/cache/feature/caching.d.ts +16 -0
  44. package/dist/base/cache/feature/caching.d.ts.map +1 -0
  45. package/dist/base/cache/index.d.ts +2 -0
  46. package/dist/base/cache/index.d.ts.map +1 -1
  47. package/dist/base/cache/strategies/redis.d.ts.map +1 -1
  48. package/dist/base/observability/BaseAdapter.d.ts +79 -0
  49. package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
  50. package/dist/base/observability/CompositeAdapter.d.ts +72 -0
  51. package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
  52. package/dist/base/observability/DatadogAdapter.d.ts +117 -0
  53. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
  54. package/dist/base/observability/LoggerAdapter.d.ts +54 -0
  55. package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
  56. package/dist/base/observability/ObservabilityService.d.ts +160 -0
  57. package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
  58. package/dist/base/observability/index.d.ts +17 -0
  59. package/dist/base/observability/index.d.ts.map +1 -0
  60. package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
  61. package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
  62. package/dist/domain/base/BaseDomainService.d.ts +284 -0
  63. package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
  64. package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
  65. package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
  66. package/dist/domain/base/BaseMapper.d.ts +100 -0
  67. package/dist/domain/base/BaseMapper.d.ts.map +1 -0
  68. package/dist/domain/base/BaseValidator.d.ts +105 -0
  69. package/dist/domain/base/BaseValidator.d.ts.map +1 -0
  70. package/dist/domain/base/index.d.ts +10 -0
  71. package/dist/domain/base/index.d.ts.map +1 -0
  72. package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
  73. package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
  74. package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
  75. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
  76. package/dist/domain/example/index.d.ts +10 -0
  77. package/dist/domain/example/index.d.ts.map +1 -0
  78. package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
  79. package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
  80. package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
  81. package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
  82. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
  83. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
  84. package/dist/domain/featureFlags/index.d.ts +10 -5
  85. package/dist/domain/featureFlags/index.d.ts.map +1 -1
  86. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
  87. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
  88. package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
  89. package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
  90. package/dist/domain/featureFlags/module.d.ts +20 -0
  91. package/dist/domain/featureFlags/module.d.ts.map +1 -0
  92. package/dist/domain/featureFlags/provider.d.ts +40 -1
  93. package/dist/domain/featureFlags/provider.d.ts.map +1 -1
  94. package/dist/domain/featureFlags/providers/api.d.ts +59 -34
  95. package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
  96. package/dist/domain/featureFlags/providers/database.d.ts +59 -52
  97. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  98. package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
  99. package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
  100. package/dist/domain/featureFlags/providers/file.d.ts +48 -1
  101. package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
  102. package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
  103. package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
  104. package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
  105. package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
  106. package/dist/domain/featureFlags/service.d.ts +112 -0
  107. package/dist/domain/featureFlags/service.d.ts.map +1 -0
  108. package/dist/domain/index.d.ts +2 -0
  109. package/dist/domain/index.d.ts.map +1 -1
  110. package/dist/engine/featureFlags/engine.d.ts +8 -0
  111. package/dist/engine/featureFlags/engine.d.ts.map +1 -1
  112. package/dist/entry-backend.d.ts +24 -0
  113. package/dist/entry-backend.d.ts.map +1 -0
  114. package/dist/entry-backend.js +15635 -0
  115. package/dist/entry-backend.js.map +1 -0
  116. package/dist/entry-backend.mjs +15506 -0
  117. package/dist/entry-backend.mjs.map +1 -0
  118. package/dist/entry-frontend.d.ts +23 -0
  119. package/dist/entry-frontend.d.ts.map +1 -0
  120. package/dist/entry-frontend.js +11152 -0
  121. package/dist/entry-frontend.js.map +1 -0
  122. package/dist/entry-frontend.mjs +11089 -0
  123. package/dist/entry-frontend.mjs.map +1 -0
  124. package/dist/events/CoreEventManager.d.ts +116 -0
  125. package/dist/events/CoreEventManager.d.ts.map +1 -0
  126. package/dist/events/index.d.ts +27 -0
  127. package/dist/events/index.d.ts.map +1 -0
  128. package/dist/frontend/base/index.d.ts +8 -0
  129. package/dist/frontend/base/index.d.ts.map +1 -0
  130. package/dist/frontend/components/InitializationError.d.ts +25 -0
  131. package/dist/frontend/components/InitializationError.d.ts.map +1 -0
  132. package/dist/frontend/components/InitializationLoading.d.ts +22 -0
  133. package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
  134. package/dist/frontend/components/index.d.ts +9 -0
  135. package/dist/frontend/components/index.d.ts.map +1 -0
  136. package/dist/frontend/example/index.d.ts +9 -0
  137. package/dist/frontend/example/index.d.ts.map +1 -0
  138. package/dist/frontend/featureFlags/index.d.ts +28 -7
  139. package/dist/frontend/featureFlags/index.d.ts.map +1 -1
  140. package/dist/frontend/index.d.ts +5 -0
  141. package/dist/frontend/index.d.ts.map +1 -1
  142. package/dist/frontend/providers/ApiProvider.d.ts +41 -0
  143. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
  144. package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
  145. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
  146. package/dist/frontend/providers/index.d.ts +8 -0
  147. package/dist/frontend/providers/index.d.ts.map +1 -0
  148. package/dist/frontend/store/feature-flags.d.ts +63 -0
  149. package/dist/frontend/store/feature-flags.d.ts.map +1 -0
  150. package/dist/frontend/store/index.d.ts +14 -0
  151. package/dist/frontend/store/index.d.ts.map +1 -0
  152. package/dist/frontend/store/integrations.d.ts +36 -0
  153. package/dist/frontend/store/integrations.d.ts.map +1 -0
  154. package/dist/frontend/store/service-accessors.d.ts +78 -0
  155. package/dist/frontend/store/service-accessors.d.ts.map +1 -0
  156. package/dist/index.d.ts +6 -2
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +15450 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/index.mjs +13461 -2440
  161. package/dist/index.mjs.map +1 -1
  162. package/dist/init/CoreInitializer.d.ts +582 -0
  163. package/dist/init/CoreInitializer.d.ts.map +1 -0
  164. package/dist/init/ServiceRegistry.d.ts +256 -0
  165. package/dist/init/ServiceRegistry.d.ts.map +1 -0
  166. package/dist/init/index.d.ts +14 -0
  167. package/dist/init/index.d.ts.map +1 -0
  168. package/dist/init/nestjs/CoreModule.d.ts +63 -0
  169. package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
  170. package/dist/init/nestjs/index.d.ts +5 -0
  171. package/dist/init/nestjs/index.d.ts.map +1 -0
  172. package/dist/init/nestjs/index.js +9059 -0
  173. package/dist/init/nestjs/index.js.map +1 -0
  174. package/dist/init/nestjs/index.mjs +9055 -0
  175. package/dist/init/nestjs/index.mjs.map +1 -0
  176. package/dist/init/react.d.ts +33 -0
  177. package/dist/init/react.d.ts.map +1 -0
  178. package/dist/models/example/ExampleRepository.d.ts +124 -0
  179. package/dist/models/example/ExampleRepository.d.ts.map +1 -0
  180. package/dist/models/example/index.d.ts +7 -0
  181. package/dist/models/example/index.d.ts.map +1 -0
  182. package/dist/models/featureFlags/FeatureFlagRepository.d.ts +560 -0
  183. package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
  184. package/dist/models/featureFlags/index.d.ts +7 -0
  185. package/dist/models/featureFlags/index.d.ts.map +1 -0
  186. package/dist/models/index.d.ts +9 -0
  187. package/dist/models/index.d.ts.map +1 -0
  188. package/dist/services/ApiClientService.d.ts +178 -0
  189. package/dist/services/ApiClientService.d.ts.map +1 -0
  190. package/dist/services/CacheService.d.ts +176 -0
  191. package/dist/services/CacheService.d.ts.map +1 -0
  192. package/dist/services/DbService.d.ts +391 -0
  193. package/dist/services/DbService.d.ts.map +1 -0
  194. package/dist/services/NotificationService.d.ts +151 -0
  195. package/dist/services/NotificationService.d.ts.map +1 -0
  196. package/dist/services/StorageService.d.ts +144 -0
  197. package/dist/services/StorageService.d.ts.map +1 -0
  198. package/dist/services/index.d.ts +12 -0
  199. package/dist/services/index.d.ts.map +1 -0
  200. package/dist/utils/common/id.d.ts +83 -0
  201. package/dist/utils/common/id.d.ts.map +1 -0
  202. package/dist/utils/common/index.d.ts +3 -1
  203. package/dist/utils/common/index.d.ts.map +1 -1
  204. package/dist/utils/common/object.d.ts +70 -0
  205. package/dist/utils/common/object.d.ts.map +1 -0
  206. package/dist/utils/common/validation.d.ts +20 -0
  207. package/dist/utils/common/validation.d.ts.map +1 -0
  208. package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
  209. package/dist/utils/featureFlags/context.d.ts +0 -1
  210. package/dist/utils/featureFlags/context.d.ts.map +1 -1
  211. package/dist/utils/index.d.ts +1 -0
  212. package/dist/utils/index.d.ts.map +1 -1
  213. package/dist/utils/mapperUtils.d.ts +38 -0
  214. package/dist/utils/mapperUtils.d.ts.map +1 -0
  215. package/dist/utils/runtime.d.ts +15 -0
  216. package/dist/utils/runtime.d.ts.map +1 -0
  217. package/dist/version.d.ts +24 -0
  218. package/dist/version.d.ts.map +1 -0
  219. package/dist/web_app/auth/add_user.d.ts +3 -0
  220. package/dist/web_app/auth/add_user.d.ts.map +1 -0
  221. package/dist/web_app/auth/update_user.d.ts +2 -0
  222. package/dist/web_app/auth/update_user.d.ts.map +1 -0
  223. package/package.json +102 -15
  224. package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
  225. package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
  226. package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -123
  227. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
  228. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
  229. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
  230. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
  231. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
  232. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
  233. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
  234. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
  235. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
  236. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
  237. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
  238. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
  239. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
  240. package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
  241. package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
  242. package/dist/index.cjs +0 -4383
  243. package/dist/index.cjs.map +0 -1
@@ -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":["MATH_CONSTANTS","path","resolve","TIME_CONSTANTS","readFile","writeFile","access","mkdir","FEATURES","Logger","Injectable","useState","useCallback","useEffect","useMemo"],"mappings":"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","file":"index.mjs","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/domain/base/BaseDomainService.ts","../src/utils/common/hash.ts","../src/utils/common/id.ts","../src/utils/common/values.ts","../src/utils/common/object.ts","../src/utils/common/validation.ts","../src/events/CoreEventManager.ts","../src/services/DbService.ts","../src/services/ApiClientService.ts","../src/base/cache/strategies/memory.ts","../src/base/cache/strategies/redis.ts","../src/base/cache/feature/caching.ts","../src/base/cache/CacheKeyBuilder.ts","../src/base/cache/index.ts","../src/services/CacheService.ts","../src/services/StorageService.ts","../src/services/NotificationService.ts","../src/models/example/ExampleRepository.ts","../src/domain/example/mappers/ExampleMapper.ts","../src/domain/example/validators/ExampleValidator.ts","../src/domain/example/BackendExampleDomainService.ts","../src/domain/example/FrontendExampleDomainService.ts","../src/base/observability/BaseAdapter.ts","../src/base/observability/LoggerAdapter.ts","../src/base/observability/ObservabilityService.ts","../src/init/ServiceRegistry.ts","../src/utils/runtime.ts","../src/init/CoreInitializer.ts","../src/domain/base/BaseFrontendDomainService.ts","../src/domain/base/BaseBackendDomainService.ts","../src/domain/base/BaseMapper.ts","../src/domain/base/BaseValidator.ts","../src/utils/mapperUtils.ts","../src/domain/featureFlags/service.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.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/models/featureFlags/FeatureFlagRepository.ts","../src/domain/featureFlags/providers/database.ts","../src/domain/featureFlags/providers/factory.ts","../src/domain/featureFlags/module.ts","../src/domain/featureFlags/FrontendFeatureFlagDomainService.ts","../src/domain/featureFlags/mappers/FeatureFlagMapper.ts","../src/domain/featureFlags/index.ts","../src/version.ts","../src/backend/index.ts","../src/backend/example/example.controller.ts","../src/backend/example/example.module.ts","../src/backend/featureFlags/FeatureFlagDomainService.ts","../src/backend/featureFlags/feature-flag.controller.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/backend/featureFlags/config/validation.ts","../src/backend/featureFlags/config/feature-flag.config.ts","../src/frontend/index.ts","../src/frontend/components/InitializationError.tsx","../src/frontend/components/InitializationLoading.tsx","../src/frontend/providers/ApiProvider.tsx","../src/frontend/providers/PlyazProvider.tsx","../src/frontend/store/service-accessors.ts","../src/frontend/store/feature-flags.ts"],"names":["MATH_CONSTANTS","path","FEATURE_FLAG_PROVIDERS","setDefaultApiClient","ERROR_CODES","CORE_EVENTS","createApiClient","defaultConfig","CorePackageError","resolve","TIME_CONSTANTS","StorageServiceImpl","NotificationServiceImpl","DatabasePackageError","DATABASE_ERROR_CODES","SERVICE_KEYS","PackageLogger","logger","STORE_KEYS","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","BaseError","OBSERVABILITY_METRICS","API_ERROR_CODES","HTTP_STATUS","readFile","writeFile","access","mkdir","apiEvaluateAllFlags","apiCreateFlag","apiUpdateFlag","apiDeleteFlag","apiFetchRules","FEATURE_FLAG_CACHE_TTL_DEFAULT","DEFAULT_CACHE_TTL_SECONDS","FEATURES","require","fileURLToPath","dirname","join","Post","Param","Body","Delete","Get","Controller","Inject","Module","FEATURE_FLAG_METADATA","Injectable","tap","ValidationError","NODE_ENVIRONMENTS","jsx","Fragment","error","jsxs","useState","useEffect","ApiProvider"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Base Domain Service\n *\n * Abstract base class for all domain services in @plyaz/core.\n * Follows the same pattern as BaseAdapter in @plyaz/notifications.\n *\n * Provides:\n * - API client initialization via constructor config\n * - Automatic mapper/validator instantiation\n * - Service enabled/disabled state management\n * - Default values handling\n * - Runtime context detection\n * - Lazy logger initialization\n *\n * Subclasses must implement:\n * - isAvailable() - Check if service is configured and ready\n * - dispose() - Cleanup resources\n *\n * @example\n * ```typescript\n * interface MyServiceConfig extends BaseDomainServiceConfig {\n * apiBasePath?: string;\n * }\n *\n * class MyDomainService extends BaseDomainService<\n * MyServiceConfig,\n * MyMapper,\n * MyValidator\n * > {\n * constructor(config: MyServiceConfig) {\n * super({\n * serviceName: 'MyDomainService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: {\n * baseURL: config.apiBasePath ?? '/api',\n * },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n *\n * isAvailable(): boolean {\n * return this.config.enabled !== false;\n * }\n *\n * dispose(): void {\n * // Cleanup\n * }\n *\n * async create(data: unknown): Promise<MyEntity> {\n * this.assertReady();\n * const validated = this.validator.validateCreateOrThrow(data);\n * const dto = this.mapper.toCreateDTO(validated);\n * const response = await this.apiClient.post('/entities', dto);\n * return this.mapper.toDomain(response.data);\n * }\n * }\n *\n * // Usage\n * const service = new MyDomainService({ enabled: true, apiBasePath: '/api/v1' });\n * await service.ensureApiClientInitialized();\n * const entity = await service.create({ name: 'Test' });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreServiceRuntime,\n} from '@plyaz/types/core';\nimport type { FeatureFlagValue } from '@plyaz/types/features';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createApiClient, setDefaultApiClient } from '@plyaz/api';\n// Import types we need locally\nimport type {\n CoreBaseDomainServiceConfig,\n CoreMapperClass,\n CoreValidatorClass,\n CoreBaseServiceConfig,\n} from '@plyaz/types/core';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\nimport type { CacheManager } from '@/base/cache';\nimport type { ObservabilityAdapter, Span } from '@plyaz/types/observability';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * API client type (from @plyaz/api)\n */\nexport type ApiClient = Awaited<ReturnType<typeof createApiClient>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for domain services\n *\n * Uses generics for strong typing:\n * - TConfig: Service configuration type\n * - TMapper: Mapper instance type\n * - TValidator: Validator instance type\n *\n * Subclasses use the super({...}) pattern:\n * ```typescript\n * class MyService extends BaseDomainService<MyConfig, MyMapper, MyValidator> {\n * constructor(config: MyConfig) {\n * super({\n * serviceName: 'MyService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: { baseURL: '/api' },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n * }\n * ```\n */\nexport abstract class BaseDomainService<\n TConfig extends CoreBaseDomainServiceConfig = CoreBaseDomainServiceConfig,\n TMapper extends CoreBaseMapperInstance<unknown, unknown> = CoreBaseMapperInstance<\n unknown,\n unknown\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Instance Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Service name for logging and error messages */\n readonly serviceName: string;\n\n /** Supported runtimes for this service */\n readonly supportedRuntimes: readonly CoreServiceRuntime[];\n\n /** Service configuration */\n protected readonly config: TConfig;\n\n /** Logger instance */\n protected readonly logger: PackageLogger;\n\n /** Initialization state */\n protected _initialized: boolean = false;\n\n // API Client (optional)\n private _apiClient: ApiClient | null = null;\n private _clientInitPromise: Promise<void> | null = null;\n private readonly _apiClientConfig?: ApiClientOptions;\n private readonly _setAsDefaultClient: boolean;\n\n // Injected Services (cache, db, api, observability)\n protected readonly cacheManager?: CacheManager;\n protected readonly dbService?: DatabaseServiceInterface;\n protected readonly apiService?: ApiClient; // Injected ApiClient (different from _apiClient)\n protected readonly observabilityService?: ObservabilityAdapter;\n\n /**\n * Cache prefix for namespacing cache keys (e.g., 'example', 'user', 'product').\n * Subclasses can override by defining as a property.\n * If not overridden, defaults to serviceName.toLowerCase().\n *\n * @example\n * ```typescript\n * protected cachePrefix = 'my-service'; // Override default\n * ```\n */\n protected cachePrefix: string = '';\n\n // Mapper and Validator instances (lazy)\n private _mapperInstance: TMapper | null = null;\n private _validatorInstance: TValidator | null = null;\n private readonly _MapperClass?: CoreMapperClass<TMapper>;\n private readonly _ValidatorClass?: CoreValidatorClass<TValidator>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new domain service instance\n *\n * @param config - Base service configuration (passed via super({...}))\n */\n // eslint-disable-next-line complexity\n constructor(config: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n this.serviceName = config.serviceName;\n this.supportedRuntimes = config.supportedRuntimes;\n this.config = config.serviceConfig;\n this._setAsDefaultClient = config.setAsDefaultClient ?? false;\n\n // Initialize logger\n this.logger = new PackageLogger({\n packageName: 'core',\n service: this.serviceName,\n });\n\n // Store API client config for lazy initialization\n this._apiClientConfig = config.apiClientConfig;\n\n // Store injected services (cache, db, api, observability)\n // Cast from unknown (types package uses unknown to avoid circular deps)\n this.cacheManager = config.injected?.cache as CacheManager | undefined;\n this.dbService = config.injected?.db as DatabaseServiceInterface | undefined;\n this.apiService = config.injected?.api as ApiClient | undefined;\n // observabilityOverride takes precedence over injected observability\n this.observabilityService = (config.serviceConfig.observabilityOverride ??\n config.injected?.observability) as ObservabilityAdapter | undefined;\n\n // Initialize cache prefix to serviceName if not set by subclass\n // Subclasses can override by setting in their constructor after super()\n if (!this.cachePrefix) {\n this.cachePrefix = this.serviceName.toLowerCase();\n }\n\n // Store mapper/validator classes for lazy initialization\n this._MapperClass = config.mapperClass;\n this._ValidatorClass = config.validatorClass;\n\n // Initialize API client if config provided\n if (this._apiClientConfig) {\n this.initializeApiClient();\n }\n\n this.logger.debug(`${this.serviceName} created`, {\n supportedRuntimes: this.supportedRuntimes,\n hasApiClient: !!this._apiClientConfig,\n injected: {\n cache: !!this.cacheManager,\n db: !!this.dbService,\n api: !!this.apiService,\n observability: !!this.observabilityService,\n },\n cachePrefix: this.cachePrefix,\n hasMapper: !!this._MapperClass,\n hasValidator: !!this._ValidatorClass,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Getters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if the service is enabled\n * Service is enabled by default unless explicitly disabled\n */\n get isServiceEnabled(): boolean {\n return this.config?.enabled !== false;\n }\n\n /**\n * Check if the service is initialized (API client ready)\n */\n get isInitialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Check if mapper is available\n */\n get hasMapper(): boolean {\n return !!this._MapperClass;\n }\n\n /**\n * Check if validator is available\n */\n get hasValidator(): boolean {\n return !!this._ValidatorClass;\n }\n\n /**\n * Get the mapper instance (lazy initialization)\n * @throws CorePackageError if MapperClass was not provided\n */\n get mapper(): TMapper {\n if (!this._mapperInstance && this._MapperClass) {\n this._mapperInstance = new this._MapperClass();\n }\n if (!this._mapperInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Mapper configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._mapperInstance;\n }\n\n /**\n * Set the mapper instance\n * Allows subclasses to override mapper initialization\n */\n set mapper(value: TMapper) {\n this._mapperInstance = value;\n }\n\n /**\n * Get the validator instance (lazy initialization)\n * @throws CorePackageError if ValidatorClass was not provided\n */\n get validator(): TValidator {\n if (!this._validatorInstance && this._ValidatorClass) {\n this._validatorInstance = new this._ValidatorClass();\n }\n if (!this._validatorInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Validator configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._validatorInstance;\n }\n\n /**\n * Set the validator instance\n * Allows subclasses to override validator initialization\n */\n set validator(value: TValidator) {\n this._validatorInstance = value;\n }\n\n /**\n * Get the API client (after initialization)\n * @throws CorePackageError if API client was not configured or not initialized\n */\n get apiClient(): ApiClient {\n if (!this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized. Call ensureApiClientInitialized() first.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return this._apiClient;\n }\n\n /**\n * Get the observability adapter (if injected)\n * Returns undefined if observability is not enabled\n */\n get observability(): ObservabilityAdapter | undefined {\n return this.observabilityService;\n }\n\n /**\n * Check if observability is available\n */\n get hasObservability(): boolean {\n return !!this.observabilityService;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // API Client Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize API client asynchronously\n * Called from constructor if apiClientConfig is provided\n */\n private initializeApiClient(): void {\n if (this._clientInitPromise || !this._apiClientConfig) {\n return;\n }\n\n this._clientInitPromise = (async () => {\n try {\n this._apiClient = await createApiClient(this._apiClientConfig!);\n\n // Set as default client for all fetchers if configured\n if (this._setAsDefaultClient) {\n setDefaultApiClient(this._apiClient);\n }\n\n this._initialized = true;\n\n this.logger.debug('API client initialized', {\n service: this.serviceName,\n baseURL: this._apiClientConfig!.baseURL,\n });\n } catch (error) {\n this.logger.error('Failed to initialize API client', {\n service: this.serviceName,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n })();\n }\n\n /**\n * Ensure API client is initialized before use.\n * Call this from methods that need the API client.\n * Also called by ServiceRegistry.create() for services with async initialization.\n */\n async ensureApiClientInitialized(): Promise<void> {\n if (this._clientInitPromise) {\n await this._clientInitPromise;\n }\n if (this._apiClientConfig && !this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Configuration Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get current configuration (immutable copy)\n */\n getConfig(): Readonly<TConfig> {\n return { ...this.config };\n }\n\n /**\n * Get a default value\n * @param key - The key to get the default for\n */\n getDefault<T = FeatureFlagValue>(key: string): T | undefined {\n return this.config?.defaults?.[key] as T | undefined;\n }\n\n /**\n * Set a default value (mutates config.defaults)\n * @param key - The key to set the default for\n * @param value - The default value\n */\n setDefault(key: string, value: FeatureFlagValue): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n this.config.defaults![key] = value;\n }\n\n /**\n * Set multiple default values\n * @param defaults - Record of default values\n */\n setDefaults(defaults: Record<string, FeatureFlagValue>): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n Object.assign(this.config.defaults!, defaults);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Assertions\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Assert that the service is available (configured and ready)\n * @throws CorePackageError if not available\n */\n protected assertAvailable(): void {\n if (!this.isAvailable()) {\n throw new CorePackageError(\n `${this.serviceName} is not available. Check configuration.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n /**\n * Assert that the service is enabled\n * @throws CorePackageError if disabled\n */\n protected assertEnabled(): void {\n if (!this.isServiceEnabled) {\n throw new CorePackageError(\n `${this.serviceName} is disabled. Set enabled: true in configuration.`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Assert that the service is ready (enabled AND available)\n * @throws CorePackageError if not ready\n */\n protected assertReady(): void {\n this.assertEnabled();\n this.assertAvailable();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Methods - Must be implemented by subclasses\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if service is available (configured and ready)\n * Subclasses must implement this to check credentials, config, etc.\n *\n * @returns true if available\n */\n abstract isAvailable(): boolean;\n\n /**\n * Dispose/cleanup the service\n * Subclasses must implement to release resources\n */\n abstract dispose(): void;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Log debug message with service context\n */\n protected logDebug(message: string, data?: Record<string, unknown>): void {\n this.logger.debug(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log info message with service context\n */\n protected logInfo(message: string, data?: Record<string, unknown>): void {\n this.logger.info(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log warning message with service context\n */\n protected logWarn(message: string, data?: Record<string, unknown>): void {\n this.logger.warn(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log error message with service context\n */\n protected logError(message: string, data?: Record<string, unknown>): void {\n this.logger.error(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Record a metric (no-op if observability not available)\n */\n protected async recordMetric(\n name: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.recordHistogram(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Increment a counter (no-op if observability not available)\n */\n protected async incrementCounter(\n name: string,\n value = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.incrementCounter(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Start a span for tracing (returns noop span if observability not available)\n */\n protected startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span {\n if (!this.observabilityService) {\n // Return a noop span\n return {\n context: { traceId: '', spanId: '' },\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n return this.observabilityService.startSpan({\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n });\n }\n\n /**\n * Execute a function within a traced span\n */\n protected async withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> {\n if (!this.observabilityService) {\n // Execute without tracing\n const noopSpan = this.startSpan(name);\n return fn(noopSpan);\n }\n return this.observabilityService.withSpan(\n {\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n },\n fn\n );\n }\n}\n","/**\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","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins -- Using globalThis.crypto for cross-platform support\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins -- Using globalThis.crypto for cross-platform support\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins -- Using globalThis.crypto for cross-platform support\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins -- Using globalThis.crypto for cross-platform support\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\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 * Object Utilities\n *\n * Provides utilities for working with nested object paths and property access.\n *\n * @fileoverview Object manipulation utilities\n */\n\n/**\n * Sets a value at a nested path in an object, creating intermediate objects as needed.\n *\n * @param obj - The target object to modify\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param value - The value to set at the path\n *\n * @example\n * ```typescript\n * const obj = { user: { id: 1 } };\n * setNestedProperty(obj, 'user.profile.name', 'John');\n * // Result: { user: { id: 1, profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedProperty(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n // Navigate to the parent object, creating intermediate objects as needed\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n // Set the final property\n const finalKey = keys[keys.length - 1];\n current[finalKey] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n *\n * @param obj - The source object to read from\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param defaultValue - Optional default value if the path doesn't exist\n * @returns The value at the path, or defaultValue if not found\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * getNestedProperty(obj, 'user.profile.name'); // 'John'\n * getNestedProperty(obj, 'user.settings.theme', 'dark'); // 'dark' (default)\n * ```\n */\nexport function getNestedProperty<T = unknown>(\n obj: Record<string, unknown>,\n path: string,\n defaultValue?: T\n): T | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n // Navigate through the path\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return defaultValue;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current !== undefined ? (current as T) : defaultValue;\n}\n\n/**\n * Checks if a nested path exists in an object.\n *\n * @param obj - The object to check\n * @param path - Dot-separated path to check (e.g., 'user.profile.name')\n * @returns True if the path exists and is not undefined\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * hasNestedProperty(obj, 'user.profile.name'); // true\n * hasNestedProperty(obj, 'user.settings.theme'); // false\n * ```\n */\nexport function hasNestedProperty(obj: Record<string, unknown>, path: string): boolean {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return false;\n }\n if (!(key in (current as Record<string, unknown>))) {\n return false;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current !== undefined;\n}\n\n/**\n * Object utilities namespace for convenient grouped access.\n *\n * @example\n * ```typescript\n * import { ObjectUtils } from '@plyaz/core/utils';\n *\n * ObjectUtils.setNestedProperty(obj, 'user.name', 'John');\n * const name = ObjectUtils.getNestedProperty(obj, 'user.name');\n * ```\n */\nexport const ObjectUtils = {\n setNestedProperty,\n getNestedProperty,\n hasNestedProperty,\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 * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * error: new Error('Failed'),\n * duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n * userId: '123',\n * method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n private emitter = new EventEmitter();\n private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n constructor() {\n // Increase max listeners for large apps\n this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n }\n\n /**\n * Emit an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param data - Event payload (type-safe when using CORE_EVENTS)\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n *\n * // Custom event\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean {\n const [scope] = eventType.split(':');\n const event: CoreEvent<TData, string> = {\n type: eventType,\n scope: scope ?? 'system',\n timestamp: Date.now(),\n correlationId: this.getCorrelationId(),\n data: data as TData,\n };\n\n // Emit to specific listeners\n this.emitter.emit(eventType, event);\n\n // Emit to wildcard listeners\n this.emitter.emit('*', event);\n\n return true;\n }\n\n /**\n * Subscribe to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler (type-safe when using CORE_EVENTS)\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom event\n * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n * console.log(event.data.custom);\n * });\n * ```\n */\n on<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe once to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n once<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n handler(event);\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n\n this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions\n .get(eventType)!\n .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe to all events in a scope\n *\n * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n * // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n * console.log(`Auth event: ${event.type}`, event.data);\n * });\n * ```\n */\n onScope<TScope extends string = string, TData = unknown>(\n scope: TScope,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n if (event.scope === scope) {\n handler(event);\n }\n };\n return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Remove a specific handler from an event\n *\n * @param eventType - Event type\n * @param handler - Handler to remove\n */\n off<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): void {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Dispose all subscriptions\n */\n dispose(): void {\n this.subscriptions.forEach((handlers, eventType) => {\n handlers.forEach(handler => this.emitter.off(eventType, handler));\n });\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n\n /**\n * Generate correlation ID for event tracing\n */\n private getCorrelationId(): string {\n return generateCorrelationId();\n }\n}\n\n// Singleton export\nexport const CoreEventManager = new CoreEventManagerClass();\n","/**\n * DbService - Singleton Database Connection Manager\n *\n * @description Manages database connections for the entire application using a singleton pattern.\n * This service wraps @plyaz/db and provides a centralized way to initialize and access\n * the database across all domains (feature flags, users, campaigns, backoffice, etc.).\n *\n * **Architecture:**\n * - Uses `createDatabaseService()` from @plyaz/db which builds an adapter chain\n * - Supports Drizzle (direct PostgreSQL), Supabase (REST API), or raw SQL adapters\n * - Extension layers: Encryption → SoftDelete → Caching → Audit → ReadReplica\n *\n * **Adapter Configuration:**\n * - **Drizzle**: Requires `connectionString` (PostgreSQL URL)\n * - **Supabase**: Requires `supabaseUrl`, `supabaseServiceKey`, `supabaseAnonKey`\n * - **SQL**: Requires `connectionString`\n *\n * **Required Environment Variables (Drizzle with Supabase):**\n * - DATABASE_URL: PostgreSQL connection string (from Supabase Dashboard > Database > URI)\n *\n * **Required Environment Variables (Supabase REST API):**\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 Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * // Core.initialize() handles loading env and passing to DbService\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'sql',\n * cache: { enabled: true, ttl: 60 },\n * },\n * });\n *\n * // Access via Core.db\n * const db = Core.db.getDatabase();\n * const result = await db.list('users', { pagination: { limit: 10, offset: 0 } });\n * ```\n *\n * @example Direct Usage (requires explicit config)\n * ```typescript\n * // Direct usage requires explicit connectionString\n * await DbService.initialize({\n * adapter: 'drizzle',\n * drizzle: {\n * connectionString: 'postgresql://user:pass@localhost:5432/db',\n * poolSize: 20,\n * },\n * });\n * ```\n *\n * @example With Extensions\n * ```typescript\n * await Core.initialize({\n * envPath: '.env',\n * db: {\n * adapter: 'drizzle',\n * softDelete: {\n * enabled: true,\n * field: 'deleted_at',\n * excludeTables: ['audit_logs', 'feature_flag_evaluations'],\n * },\n * cache: {\n * enabled: true,\n * provider: 'memory',\n * ttl: 300,\n * },\n * audit: {\n * enabled: true,\n * retentionDays: 90,\n * },\n * },\n * });\n * ```\n *\n * @example Using with BaseRepository\n * ```typescript\n * import { BaseRepository } from '@plyaz/db';\n * import { DbService } from '@plyaz/core';\n *\n * class UserRepository extends BaseRepository<User> {\n * constructor() {\n * super(DbService.getInstance().getDatabase(), 'users');\n * }\n * }\n * ```\n *\n * @module services\n */\n\nimport { createDatabaseService } from '@plyaz/db';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport {\n type DatabaseServiceInterface,\n type DatabaseServiceConfig,\n type DrizzleConfig,\n type SupabaseConfig,\n type SqlConfig,\n type Transaction,\n} from '@plyaz/types/db';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CORE_EVENTS, type CoreDatabaseErrorPayload } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\n\n/**\n * Default fields to encrypt per table\n * Contains sensitive PII and financial data that should be encrypted at rest\n *\n * @see docs/db-schemas/dbdiagram_schema.dbml for field definitions\n */\nexport const DEFAULT_ENCRYPTION_FIELDS: Record<string, string[]> = {\n // User PII\n users: ['password_hash', 'phone_number', 'date_of_birth'],\n\n // KYC sensitive data\n 'backoffice.kyc_submissions': ['tax_id', 'address_line1', 'address_line2'],\n\n // Connected accounts OAuth tokens\n connected_accounts: ['access_token_encrypted', 'refresh_token_encrypted', 'wallet_address'],\n\n // Payment payout accounts\n user_payout_accounts: ['provider_account_id', 'account_holder_name'],\n\n // Sessions\n sessions: ['token'],\n};\n\n// Re-export DbServiceConfig from @plyaz/types/core\nexport type { CoreDbServiceConfig } from '@plyaz/types/core';\n\n// Local alias for internal use\nimport type { CoreDbServiceConfig as DbServiceConfig } from '@plyaz/types/core';\n\n/**\n * Default configuration for DbService\n *\n * **Adapter Selection Guide:**\n *\n * | Adapter | Connection | Auto-Register | RLS | Use Case |\n * |-------------|------------------|---------------|----------|-----------------------------------|\n * | `'sql'` | PostgreSQL URL | ✓ Yes | Bypassed | **Recommended** for backend |\n * | `'supabase'`| Supabase API | ✓ Yes | Enforced | Frontend / RLS-required scenarios |\n * | `'drizzle'` | PostgreSQL URL | ✓ Yes* | Bypassed | Type-safe ORM (with PgTable schemas) |\n *\n * *Drizzle supports dual-mode: uses PgTable schemas if registered, falls back to raw SQL otherwise.\n *\n * **Recommended:** Use `'sql'` adapter for backend services with Supabase PostgreSQL.\n * Direct PostgreSQL connection = best performance, bypasses RLS for full backend access.\n */\n// Database configuration constants\nconst DEFAULT_CACHE_TTL_SECONDS = 300; // 5 minutes\nconst DEFAULT_AUDIT_RETENTION_DAYS = 180; // GDPR/SOX compliance (6 months minimum)\nconst DEFAULT_POOL_SIZE = 10;\n\nconst DEFAULT_CONFIG: Partial<DbServiceConfig> = {\n adapter: 'sql',\n cache: {\n enabled: true,\n provider: 'memory',\n ttl: DEFAULT_CACHE_TTL_SECONDS,\n },\n softDelete: {\n enabled: true,\n field: 'deleted_at',\n excludeTables: [\n 'audit_logs',\n 'audit.audit_logs',\n 'audit.feature_flag_evaluations',\n 'feature_flag_evaluations',\n 'notification_events',\n 'payments_activity',\n 'campaign_analytics',\n 'admin_actions',\n 'backoffice.admin_actions',\n ],\n },\n audit: {\n enabled: true, // Enabled by default for compliance\n retentionDays: DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: ['password_hash', 'api_key_hash', 'token_hash'],\n excludeTables: ['audit_logs', 'audit.audit_logs'], // Don't audit the audit table itself\n schema: 'audit', // Use dedicated audit schema\n usePartitionedTables: true, // Use daily partitioned tables (audit_log_yyyy_mm_dd)\n },\n // NOTE: Encryption requires key from environment or DbService.initialize()\n // Enable via: DbService.initialize({ encryption: { enabled: true, key: process.env.ENCRYPTION_KEY!, fields: DEFAULT_ENCRYPTION_FIELDS } })\n};\n\n/**\n * Complete table registry from database migrations\n * Maps logical table names to their ID columns\n *\n * @see docs/db-schemas/migrations/ for schema definitions\n * @see docs/db-schemas/dbdiagram_schema.dbml for full schema\n */\n/**\n * TABLE_REGISTRY - Custom ID Column and Schema Registry\n *\n * ONLY register tables with:\n * 1. Custom ID columns (anything other than 'id')\n * 2. Custom database schemas (anything other than 'public')\n *\n * Tables with standard 'id' column in 'public' schema do NOT need registration.\n * You can also override ID column and schema per-query using OperationConfig.\n *\n * Schema can be defined in the table key or in the config object (or both):\n * - 'schema.table': { idColumn: 'key' } ← Schema in key only\n * - 'schema.table': { idColumn: 'key', schema: 'schema' } ← Redundant but allowed\n * - 'schema.table': {} ← Empty config, schema in key\n * - 'table': { idColumn: 'key', schema: 'schema' } ← Schema in config only\n *\n * @example\n * ```typescript\n * // Using registry\n * await db.get('feature_flags', 'my-flag-key'); // Uses 'key' column from registry\n *\n * // Per-query override\n * await db.get('custom_table', 'some-key', { idColumn: 'custom_id' });\n *\n * // Schema override\n * await db.get('logs', '123', { schema: 'logging' });\n * ```\n */\nexport const TABLE_REGISTRY: Record<string, { idColumn?: string; schema?: string }> = {\n // Migration 008: Feature Flags (custom ID column 'key')\n feature_flags: { idColumn: 'key' },\n\n // Test Feature Flags (custom ID column 'key')\n test_feature_flags: { idColumn: 'key' },\n\n // Migration 010: Universal Analytics (custom ID column 'user_id')\n user_analytics_summary: { idColumn: 'user_id' },\n};\n\n/**\n * DbService - Singleton Database Connection Manager\n *\n * Provides centralized database connection management for all domains.\n * Uses @plyaz/db under the hood with configurable adapters and extensions.\n */\nexport class DbService {\n private static instance: DbService | null = null;\n private databaseService: DatabaseServiceInterface | null = null;\n private namedAdapters: Map<string, DatabaseServiceInterface> = new Map();\n private config: DbServiceConfig | null = null;\n private initialized = false;\n\n private constructor() {}\n\n /**\n * Emits a database error event via CoreEventManager.\n * Called when database operations fail to integrate with global error handling.\n *\n * @param error - The error that occurred\n * @param operation - The operation that failed (e.g., 'transaction', 'query', 'healthCheck')\n * @param table - Optional table name involved in the operation\n * @param query - Optional query string that failed\n * @param recoverable - Whether the error is recoverable (default: false)\n */\n private emitDatabaseError(\n error: unknown,\n operation: string,\n options?: {\n table?: string;\n query?: string;\n recoverable?: boolean;\n }\n ): void {\n const payload: CoreDatabaseErrorPayload = {\n error,\n operation,\n table: options?.table,\n query: options?.query,\n recoverable: options?.recoverable ?? false,\n };\n CoreEventManager.emit(CORE_EVENTS.DATABASE.ERROR, payload);\n }\n\n /**\n * Gets the singleton instance of DbService\n *\n * @returns {DbService} The singleton instance\n */\n static getInstance(): DbService {\n DbService.instance ??= new DbService();\n return DbService.instance;\n }\n\n /**\n * Checks if the database service has been initialized\n *\n * @returns {boolean} True if initialized\n */\n static isInitialized(): boolean {\n return DbService.instance?.initialized ?? false;\n }\n\n /**\n * Resets the database service by closing connections and clearing the singleton instance\n *\n * @description Properly closes the database connection and clears the singleton.\n * Useful for testing or when you need to reinitialize with different configuration.\n *\n * @example\n * ```typescript\n * await DbService.reset();\n * await DbService.initialize({ adapter: 'sql', ... });\n * ```\n */\n static async reset(): Promise<void> {\n if (DbService.instance) {\n try {\n await DbService.instance.databaseService?.close?.();\n } catch {\n // Ignore close errors (pool might already be closed)\n }\n DbService.instance = null;\n }\n }\n\n /**\n * Initializes the database connection\n *\n * @description Sets up the database connection using the provided configuration\n * or environment variables. This method is idempotent - calling it multiple\n * times won't create additional connections.\n *\n * **Environment Variables:**\n * - `DATABASE_URL` - PostgreSQL connection string (for sql/drizzle adapters)\n * - `ENCRYPTION_KEY` - 32-byte encryption key for field encryption (optional)\n * - `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY`, `SUPABASE_ANON_PUBLIC_KEY` - For supabase adapter\n *\n * **Encryption:** If `ENCRYPTION_KEY` env is set, encryption is auto-enabled\n * using `DEFAULT_ENCRYPTION_FIELDS`. Override via config.encryption.\n *\n * @param {DbServiceConfig} [config] - Optional configuration\n * @returns {Promise<DbService>} The initialized DbService instance\n * @throws {DatabasePackageError} When configuration is invalid or connection fails\n *\n * @example\n * ```typescript\n * // Minimal - uses DATABASE_URL env, auto-enables encryption if ENCRYPTION_KEY set\n * await DbService.initialize();\n *\n * // With explicit encryption\n * await DbService.initialize({\n * adapter: 'sql',\n * encryption: {\n * enabled: true,\n * key: 'your-32-byte-encryption-key-here!!',\n * fields: DEFAULT_ENCRYPTION_FIELDS,\n * },\n * });\n *\n * // Or via Core.initialize() with env:\n * await Core.initialize({\n * env: { ENCRYPTION_KEY: '...' },\n * db: { adapter: 'sql' },\n * });\n * ```\n */\n /** Build encryption config from user config */\n private static buildEncryptionConfig(config?: DbServiceConfig): DbServiceConfig['encryption'] {\n const encryption = config?.encryption;\n if (!encryption?.key) return undefined;\n\n return {\n enabled: encryption.enabled ?? true,\n key: encryption.key,\n fields: encryption.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: encryption.algorithm ?? 'aes-256-gcm',\n };\n }\n\n /** Merge user config with defaults */\n private static mergeConfig(config?: DbServiceConfig): DbServiceConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config?.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config?.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config?.audit },\n encryption: DbService.buildEncryptionConfig(config),\n } as DbServiceConfig;\n }\n\n /** Initialize named adapters */\n private async initializeNamedAdapters(mergedConfig: DbServiceConfig): Promise<void> {\n if (!mergedConfig.adapters) return;\n\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = this.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n this.namedAdapters.set(name, namedService);\n }\n }\n\n static async initialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n\n if (instance.initialized) {\n return instance;\n }\n\n const mergedConfig = DbService.mergeConfig(config);\n instance.config = mergedConfig;\n\n const dbConfig = instance.buildDatabaseConfig(mergedConfig);\n instance.databaseService = await createDatabaseService(dbConfig);\n\n await instance.initializeNamedAdapters(mergedConfig);\n\n instance.initialized = true;\n return instance;\n }\n\n /**\n * Builds the DatabaseServiceConfig based on the adapter type\n * @private\n */\n\n /** Builds adapter-specific config based on adapter type */\n private buildAdapterConfig(\n adapter: string,\n config: DbServiceConfig\n ): DrizzleConfig | SupabaseConfig | SqlConfig {\n const builders: Record<string, () => DrizzleConfig | SupabaseConfig | SqlConfig> = {\n drizzle: () => this.buildDrizzleConfig(config),\n supabase: () => this.buildSupabaseConfig(config),\n sql: () => this.buildSqlConfig(config),\n };\n\n const builder = builders[adapter];\n if (!builder) {\n throw new DatabasePackageError(\n `Unsupported adapter type: ${adapter}`,\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n return builder();\n }\n\n /** Builds soft delete extension config */\n private buildSoftDeleteExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['softDelete'] | undefined {\n if (!config.softDelete?.enabled) return undefined;\n return {\n enabled: true,\n field: config.softDelete.field ?? 'deleted_at',\n excludeTables: config.softDelete.excludeTables,\n };\n }\n\n /** Builds cache extension config */\n private buildCacheExtension(config: DbServiceConfig): DatabaseServiceConfig['cache'] | undefined {\n if (!config.cache?.enabled) return undefined;\n return {\n enabled: true,\n ttl: config.cache.ttl ?? DEFAULT_CACHE_TTL_SECONDS,\n provider: config.cache.provider ?? 'memory',\n invalidation: config.cache.invalidation ?? 'write',\n };\n }\n\n /** Builds audit extension config */\n private buildAuditExtension(config: DbServiceConfig): DatabaseServiceConfig['audit'] | undefined {\n if (!config.audit?.enabled) return undefined;\n return {\n enabled: true,\n retentionDays: config.audit.retentionDays ?? DEFAULT_AUDIT_RETENTION_DAYS,\n excludeFields: config.audit.excludeFields,\n excludeTables: config.audit.excludeTables,\n schema: config.audit.schema ?? 'audit',\n usePartitionedTables: config.audit.usePartitionedTables ?? true,\n };\n }\n\n /** Builds encryption extension config */\n private buildEncryptionExtension(\n config: DbServiceConfig\n ): DatabaseServiceConfig['encryption'] | undefined {\n if (!config.encryption?.enabled || !config.encryption.key) return undefined;\n return {\n enabled: true,\n key: config.encryption.key,\n fields: config.encryption.fields ?? {},\n algorithm: config.encryption.algorithm,\n };\n }\n\n private buildDatabaseConfig(config: DbServiceConfig): DatabaseServiceConfig {\n const adapter = config.adapter ?? 'drizzle';\n\n const dbConfig: DatabaseServiceConfig = {\n adapter: adapter as DatabaseServiceConfig['adapter'],\n config: this.buildAdapterConfig(adapter, config),\n };\n\n // Apply extensions\n const softDelete = this.buildSoftDeleteExtension(config);\n const cache = this.buildCacheExtension(config);\n const audit = this.buildAuditExtension(config);\n const encryption = this.buildEncryptionExtension(config);\n\n if (softDelete) dbConfig.softDelete = softDelete;\n if (cache) dbConfig.cache = cache;\n if (audit) dbConfig.audit = audit;\n if (encryption) dbConfig.encryption = encryption;\n\n return dbConfig;\n }\n\n /**\n * Builds Drizzle adapter configuration\n * @private\n */\n private buildDrizzleConfig(config: DbServiceConfig): DrizzleConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.drizzle?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'Drizzle adapter requires a PostgreSQL connection string. ' +\n 'Provide `drizzle.connectionString` in config or use Core.initialize() with DATABASE_URL in env. ' +\n 'For Supabase, find this in Dashboard > Database > Connection string (URI).',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n poolSize: config.drizzle?.poolSize ?? DEFAULT_POOL_SIZE,\n ssl: config.drizzle?.ssl,\n schema: config.drizzle?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds Supabase adapter configuration\n * @private\n */\n // eslint-disable-next-line complexity\n private buildSupabaseConfig(config: DbServiceConfig): SupabaseConfig {\n // Get Supabase config (Core.initialize() passes env values)\n const supabaseUrl = config.supabase?.supabaseUrl;\n const supabaseServiceKey = config.supabase?.supabaseServiceKey;\n const supabaseAnonKey = config.supabase?.supabaseAnonKey;\n\n if (!supabaseUrl || !supabaseServiceKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseUrl and supabaseServiceKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n if (!supabaseAnonKey) {\n throw new DatabasePackageError(\n 'Supabase adapter requires supabaseAnonKey. ' +\n 'Provide in config or use Core.initialize() with SUPABASE_ANON_PUBLIC_KEY in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n supabaseUrl,\n supabaseServiceKey,\n supabaseAnonKey,\n schema: config.supabase?.schema ?? 'public',\n tableIdColumns,\n };\n }\n\n /**\n * Builds SQL adapter configuration\n * @private\n */\n private buildSqlConfig(config: DbServiceConfig): SqlConfig {\n // Get connection string from config (Core.initialize() passes env values)\n const connectionString = config.sql?.connectionString;\n\n if (!connectionString) {\n throw new DatabasePackageError(\n 'SQL adapter requires a connection string. ' +\n 'Provide `sql.connectionString` in config or use Core.initialize() with DATABASE_URL in env.',\n DATABASE_ERROR_CODES.CONFIG_REQUIRED\n );\n }\n\n // Build table ID column mappings from TABLE_REGISTRY\n const tableIdColumns = this.buildTableIdColumns();\n\n return {\n connectionString,\n dialect: config.sql?.dialect ?? 'postgresql',\n schema: config.sql?.schema, // Pass through schema configuration\n tableIdColumns,\n };\n }\n\n /**\n * Builds table ID column mappings from TABLE_REGISTRY\n * @private\n * @returns Record of table names to ID column names\n */\n // eslint-disable-next-line complexity\n private buildTableIdColumns(): Record<string, string> {\n const tableIdColumns: Record<string, string> = {};\n const baseNameConflicts = new Set<string>();\n const baseNameMappings = new Map<string, string>();\n\n // First pass: identify base name conflicts\n // e.g., if we have both 'public.users' and 'backoffice.users',\n // we can't map 'users' → one ID column\n for (const tableName of Object.keys(TABLE_REGISTRY)) {\n if (tableName.includes('.')) {\n const baseName = tableName.split('.').pop()!;\n if (baseNameMappings.has(baseName) || TABLE_REGISTRY[baseName]) {\n baseNameConflicts.add(baseName);\n } else {\n baseNameMappings.set(baseName, tableName);\n }\n }\n }\n\n // Second pass: build ID column mappings\n for (const [tableName, config] of Object.entries(TABLE_REGISTRY)) {\n const idColumn = config.idColumn ?? 'id';\n\n // Only include non-standard ID columns (not 'id')\n if (idColumn === 'id') continue;\n\n // Always map the full table name (with or without schema)\n tableIdColumns[tableName] = idColumn;\n\n // If the table name includes a schema (e.g., 'backoffice.flagged_content'),\n // also map the base name (e.g., 'flagged_content') for convenience\n // unless there's a conflict with another schema's table\n if (!tableName.includes('.')) continue;\n\n const baseName = tableName.split('.').pop()!;\n if (!baseNameConflicts.has(baseName)) {\n tableIdColumns[baseName] = idColumn;\n }\n }\n\n return tableIdColumns;\n }\n\n /**\n * Gets the initialized database service instance\n *\n * @param {string} [adapterName] - Optional named adapter to use instead of default\n * @returns {DatabaseServiceInterface} The database service instance\n * @throws {DatabasePackageError} When database is not initialized or named adapter not found\n */\n getDatabase(adapterName?: string): DatabaseServiceInterface {\n if (adapterName) {\n const namedAdapter = this.namedAdapters.get(adapterName);\n if (!namedAdapter) {\n throw new DatabasePackageError(\n `Named adapter '${adapterName}' not found. Available adapters: ${Array.from(this.namedAdapters.keys()).join(', ')}`,\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return namedAdapter;\n }\n\n if (!this.databaseService) {\n throw new DatabasePackageError(\n 'Database not initialized. Call DbService.initialize() first.',\n DATABASE_ERROR_CODES.INIT_FAILED\n );\n }\n return this.databaseService;\n }\n\n /**\n * Gets a named adapter by name\n *\n * @param {string} name - The name of the adapter\n * @returns {DatabaseServiceInterface} The named adapter instance\n * @throws {DatabasePackageError} When adapter not found\n */\n getAdapter(name: string): DatabaseServiceInterface {\n return this.getDatabase(name);\n }\n\n /**\n * Lists all available named adapters\n *\n * @returns {string[]} Array of adapter names\n */\n getAvailableAdapters(): string[] {\n return ['default', ...Array.from(this.namedAdapters.keys())];\n }\n\n /**\n * Executes a database transaction with automatic rollback on failure\n *\n * @template T The return type of the transaction callback\n * @param {Function} callback - Function that receives transaction object\n * @returns {Promise<T>} The result of the transaction callback\n * @throws {DatabasePackageError} When transaction fails\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\n if (!result.success) {\n const errorMessage = result.error?.message ?? 'Transaction failed';\n const error = new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.TRANSACTION_FAILED);\n // Emit database error event for global error handling\n this.emitDatabaseError(error, 'transaction', { recoverable: true });\n throw error;\n }\n\n if (result.value === undefined || result.value === null) {\n const error = new DatabasePackageError(\n 'Transaction returned no value',\n DATABASE_ERROR_CODES.INVALID_RESULT\n );\n this.emitDatabaseError(error, 'transaction', { recoverable: false });\n throw error;\n }\n\n return result.value;\n }\n\n /**\n * Sets audit context for subsequent operations\n *\n * @param context - Audit context (userId, requestId, etc.)\n */\n async setAuditContext(context: {\n userId?: string;\n requestId?: string;\n ipAddress?: string;\n userAgent?: string;\n }): Promise<void> {\n const db = this.getDatabase();\n await db.setAuditContext(context);\n }\n\n /**\n * Performs a health check on the database connection\n *\n * @returns Health check result\n */\n async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n try {\n const db = this.getDatabase();\n const result = await db.healthCheck();\n\n if (result.success && result.value) {\n return {\n isHealthy: result.value.isHealthy,\n responseTime: result.value.responseTime,\n };\n }\n\n // Health check failed - emit error event\n const errorMessage = result.error?.message ?? 'Health check failed';\n this.emitDatabaseError(\n new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.CONNECTION_ERROR),\n 'healthCheck',\n { recoverable: true }\n );\n\n return {\n isHealthy: false,\n error: errorMessage,\n };\n } catch (error) {\n // Exception during health check - emit error event\n this.emitDatabaseError(error, 'healthCheck', { recoverable: true });\n\n return {\n isHealthy: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Gets the table registry with all known tables and their ID columns\n *\n * @returns The complete table registry\n */\n static getTableRegistry(): typeof TABLE_REGISTRY {\n return TABLE_REGISTRY;\n }\n\n /**\n * Gets ID column for a specific table\n *\n * @param tableName - Name of the table\n * @returns ID column name or 'id' as default\n */\n static getTableIdColumn(tableName: string): string {\n return TABLE_REGISTRY[tableName]?.idColumn ?? 'id';\n }\n\n /**\n * Reinitializes the database connection with new config\n *\n * @param {DbServiceConfig} [config] - New configuration\n * @returns {Promise<DbService>} The reinitialized DbService instance\n */\n static async reinitialize(config?: DbServiceConfig): Promise<DbService> {\n const instance = DbService.getInstance();\n await instance.close();\n instance.initialized = false;\n return DbService.initialize(config);\n }\n\n /**\n * Closes the database connection and cleans up resources\n */\n async close(): Promise<void> {\n this.databaseService = null;\n this.initialized = false;\n this.config = null;\n }\n\n /**\n * Gets the current configuration\n *\n * @returns {DbServiceConfig | null} Current config or null if not initialized\n */\n getConfig(): DbServiceConfig | null {\n return this.config;\n }\n\n /**\n * Gets the current adapter type\n *\n * @returns The adapter type or null if not initialized\n */\n getAdapterType(): 'drizzle' | 'supabase' | 'sql' | null {\n return this.config?.adapter ?? null;\n }\n\n /**\n * Creates a dedicated database service instance (NOT the singleton)\n *\n * Use this when you need an isolated database connection with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param config - Database service configuration\n * @returns Promise that resolves to a new dedicated DbService instance\n *\n * @example\n * ```typescript\n * // Create a dedicated instance for analytics database\n * const analyticsDb = await DbService.createInstance({\n * adapter: 'sql',\n * sql: { connectionString: process.env.ANALYTICS_DB_URL },\n * cache: { enabled: false }, // No caching for analytics\n * });\n *\n * // This instance is independent from DbService.getInstance()\n * const data = await analyticsDb.getDatabase().list('events');\n *\n * // Clean up when done\n * await analyticsDb.close();\n * ```\n */\n // eslint-disable-next-line complexity\n static async createInstance(config: DbServiceConfig): Promise<DbService> {\n // Create a new instance (not the singleton)\n const dedicatedInstance = new DbService();\n\n // Build encryption config if key provided\n const encryptionKey = config.encryption?.key;\n const encryptionConfig = encryptionKey\n ? {\n enabled: config.encryption?.enabled ?? true,\n key: encryptionKey,\n fields: config.encryption?.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n algorithm: config.encryption?.algorithm ?? ('aes-256-gcm' as const),\n }\n : undefined;\n\n const mergedConfig = {\n ...DEFAULT_CONFIG,\n ...config,\n // Deep merge extensions\n softDelete: { ...DEFAULT_CONFIG.softDelete, ...config.softDelete },\n cache: { ...DEFAULT_CONFIG.cache, ...config.cache },\n audit: { ...DEFAULT_CONFIG.audit, ...config.audit },\n // Encryption only if key is available\n encryption: encryptionConfig,\n } as DbServiceConfig;\n\n dedicatedInstance.config = mergedConfig;\n\n // Build adapter configuration based on adapter type\n const dbConfig = dedicatedInstance.buildDatabaseConfig(mergedConfig);\n\n dedicatedInstance.databaseService = await createDatabaseService(dbConfig);\n\n // Initialize named adapters if configured\n if (mergedConfig.adapters) {\n for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n const namedDbConfig = dedicatedInstance.buildDatabaseConfig({\n ...mergedConfig,\n adapter: adapterConfig.adapter,\n drizzle: adapterConfig.drizzle,\n supabase: adapterConfig.supabase,\n sql: adapterConfig.sql,\n });\n\n const namedService = await createDatabaseService(namedDbConfig);\n dedicatedInstance.namedAdapters.set(name, namedService);\n }\n }\n\n dedicatedInstance.initialized = true;\n\n return dedicatedInstance;\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 {\n API_ERROR_CODES,\n PACKAGE_STATUS_CODES,\n OPERATIONS,\n ERROR_CODES,\n ERROR_CATEGORY,\n HTTP_STATUS,\n CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\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 CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG as Partial<ApiConfig>;\n case 'staging':\n return STAGING_CONFIG as Partial<ApiConfig>;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\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 `CoreApiEnvironmentConfig` 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 CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: CoreApiEnvironmentConfig,\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 CoreApiEnvironmentConfig.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: CoreApiEnvironmentConfig\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: CoreApiEnvironmentConfig,\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: CoreApiEnvironmentConfig,\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 // eslint-disable-next-line max-lines-per-function, complexity\n private static async createClient(\n envConfig: CoreApiEnvironmentConfig,\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: Create onError handler to emit errors to Core\n const coreErrorHandler = async (\n error: ResponseError<unknown, unknown, unknown, unknown>\n // eslint-disable-next-line complexity\n ): Promise<void> => {\n const requestId = generateRequestId();\n const method = error.config?.method ?? 'UNKNOWN';\n const url = error.config?.url ?? 'unknown';\n\n // CRITICAL: Emit error event to Core\n // Core will handle updating the appropriate store based on runtime context:\n // - Backend: In-memory store (ServerErrorMiddleware)\n // - Frontend: Zustand store (useRootStore)\n try {\n // API returns ErrorResponse (array of error details)\n const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n // If no error details from API, create a fallback error\n if (errorDetails.length === 0) {\n const serializedError = {\n id: requestId,\n code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n },\n };\n\n // Emit single error to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n } else {\n // Convert ErrorResponse (API error details array) to SerializedError[]\n const serializedErrors = errorDetails.map(\n (detail: Record<string, unknown>, index: number) => ({\n id: `${requestId}-${index}`,\n code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: (detail.message as string) ?? error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status\n ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR\n : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n field: detail.field as string | undefined,\n valueGiven: detail.valueGiven,\n allowedValues: detail.allowedValues,\n constraints: detail.constraints,\n },\n })\n );\n\n // Emit array of errors to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n }\n } catch (e) {\n // If event emission fails, log but don't break the error flow\n console.error('[ApiClientService] Failed to emit error event:', e);\n }\n\n // Also emit API-specific error event for logging, monitoring, etc.\n ApiClientService.emitApiError(error, {\n method,\n url,\n requestId,\n status: error.status,\n duration: 0,\n });\n };\n\n // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n ) as ApiClientOptions;\n\n // Step 5: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 6: 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: CoreApiEnvironmentConfig,\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 * Emits an API error event via CoreEventManager.\n * Called when API operations fail to integrate with global error handling.\n *\n * **CRITICAL**: This event emission triggers automatic error state updates.\n * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n * 1. Capture all API errors automatically\n * 2. Update global error state for UI display\n * 3. Ensure individual domain stores remain error-free (only domain data)\n *\n * This is the unified error hook that:\n * - On frontend: Emits event that global error store subscribes to\n * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n *\n * @param error - The error that occurred\n * @param options - Additional context for the error\n * @param options.method - HTTP method (GET, POST, etc.)\n * @param options.url - Request URL\n * @param options.requestId - Unique request identifier\n * @param options.status - HTTP status code (if available)\n * @param options.duration - Request duration in ms\n * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n *\n * @example\n * ```typescript\n * // Global error store setup (in @plyaz/store)\n * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n * errorStore.setError({\n * message: payload.error.message,\n * status: payload.status,\n * url: payload.url,\n * requestId: payload.requestId,\n * });\n * });\n *\n * // Frontend usage - emit to store\n * ApiClientService.emitApiError(error, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * duration: 500,\n * });\n *\n * // Backend usage - emit and rethrow\n * ApiClientService.emitApiError(error, {\n * method: 'POST',\n * url: '/api/orders',\n * requestId: '456',\n * duration: 1200,\n * rethrow: true,\n * });\n * ```\n */\n static emitApiError(\n error: unknown,\n options: {\n method: string;\n url: string;\n requestId: string;\n status?: number;\n duration: number;\n rethrow?: boolean;\n }\n ): void {\n const payload: CoreApiRequestErrorPayload = {\n method: options.method,\n url: options.url,\n requestId: options.requestId,\n status: options.status,\n error,\n duration: options.duration,\n };\n\n CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n // Optionally rethrow for backend error propagation\n if (options.rethrow && error instanceof Error) {\n throw error;\n }\n }\n\n /**\n * Create a dedicated API client instance (NOT the singleton)\n *\n * Use this when you need an isolated client with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n * @returns Promise that resolves to a new dedicated client instance\n *\n * @example\n * ```typescript\n * // Create a dedicated client for feature flags service\n * const flagsClient = await ApiClientService.createInstance(\n * { env: 'production' },\n * {\n * baseURL: 'https://flags.example.com',\n * timeout: 5000,\n * }\n * );\n *\n * // This client is independent from ApiClientService.getClient()\n * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n * ```\n */\n static async createInstance(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\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,\n envMetadataMapped,\n apiConfig ?? {}\n ) as ApiClientOptions;\n\n // Step 4: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 5: Create a NEW client instance (not stored as singleton)\n const dedicatedClient = await createApiClient(mergedOptions);\n\n // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n // that should not become the default client for @plyaz/api services\n\n return dedicatedClient;\n } catch (error) {\n throw new ApiPackageError(\n 'service.instance_creation.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// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createInstance(envConfig, apiConfig);\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 { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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 CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\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 CorePackageError(\n `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ERROR_CODES.DB_CONNECTION_FAILED\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 Key Builder Utility\n *\n * Provides standardized methods for building cache keys with consistent patterns.\n * All keys are designed to be prefixed by the service (handled by service layer).\n *\n * Key pattern: {prefix}:{type}:{identifier}:{params}\n * Example: \"example:entity:123\" or \"user:list:page:1\"\n *\n * @fileoverview Cache key building utilities\n */\n\n/**\n * Cache key builder for standardized cache key generation.\n *\n * All methods return un-prefixed keys that should be prefixed by the service layer.\n * This allows each service to namespace their cache keys.\n *\n * @example\n * ```typescript\n * // In a service with cachePrefix = 'user'\n * const key = CacheKeyBuilder.entity('123');\n * // Returns: \"entity:123\"\n * // After service prefixing: \"user:entity:123\"\n * ```\n */\nexport class CacheKeyBuilder {\n /**\n * Build cache key for a single entity by ID\n *\n * @param id - Entity ID\n * @returns Cache key (unprefixed)\n *\n * @example\n * ```typescript\n * CacheKeyBuilder.entity('123')\n * // Returns: \"entity:123\"\n * // With prefix \"user\": \"user:entity:123\"\n * ```\n */\n static entity(id: string): string {\n return `entity:${id}`;\n }\n\n /**\n * Build cache key for a list/collection query\n *\n * @param params - Query parameters (page, limit, filters, etc.)\n * @returns Cache key (unprefixed)\n *\n * @example\n * ```typescript\n * CacheKeyBuilder.list({ page: 1, limit: 10 })\n * // Returns: \"list:limit:10:page:1\"\n * // With prefix: \"user:list:limit:10:page:1\"\n *\n * CacheKeyBuilder.list() // No params\n * // Returns: \"list:all\"\n * ```\n */\n static list(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return 'list:all';\n }\n\n // Sort keys for deterministic cache keys\n const sortedKeys = Object.keys(params).sort();\n const keyParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n return `list:${keyParts.join(':')}`;\n }\n\n /**\n * Build cache key for a named query/filter\n *\n * @param queryName - Name of the query (e.g., 'active', 'byStatus', 'search')\n * @param params - Query parameters\n * @returns Cache key (unprefixed)\n *\n * @example\n * ```typescript\n * CacheKeyBuilder.query('active', { status: 'published' })\n * // Returns: \"query:active:status:\\\"published\\\"\"\n *\n * CacheKeyBuilder.query('search', { q: 'hello', limit: 10 })\n * // Returns: \"query:search:limit:10:q:\\\"hello\\\"\"\n * ```\n */\n static query(queryName: string, params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return `query:${queryName}`;\n }\n\n const sortedKeys = Object.keys(params).sort();\n const keyParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n return `query:${queryName}:${keyParts.join(':')}`;\n }\n\n /**\n * Build cache key for aggregate/count operations\n *\n * @param operation - Operation name (e.g., 'count', 'sum', 'avg')\n * @param field - Field name (optional)\n * @param params - Additional parameters (optional)\n * @returns Cache key (unprefixed)\n *\n * @example\n * ```typescript\n * CacheKeyBuilder.aggregate('count')\n * // Returns: \"aggregate:count\"\n *\n * CacheKeyBuilder.aggregate('sum', 'amount')\n * // Returns: \"aggregate:sum:amount\"\n *\n * CacheKeyBuilder.aggregate('count', 'users', { status: 'active' })\n * // Returns: \"aggregate:count:users:status:\\\"active\\\"\"\n * ```\n */\n static aggregate(operation: string, field?: string, params?: Record<string, unknown>): string {\n const baseParts = field ? [operation, field] : [operation];\n\n if (!params || Object.keys(params).length === 0) {\n return `aggregate:${baseParts.join(':')}`;\n }\n\n const sortedKeys = Object.keys(params).sort();\n const paramParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n return `aggregate:${baseParts.join(':')}:${paramParts.join(':')}`;\n }\n\n /**\n * Build a custom cache key with type and identifier\n *\n * @param type - Cache key type\n * @param identifier - Unique identifier for this cache entry\n * @param params - Additional parameters (optional)\n * @returns Cache key (unprefixed)\n *\n * @example\n * ```typescript\n * CacheKeyBuilder.custom('session', 'abc123')\n * // Returns: \"session:abc123\"\n *\n * CacheKeyBuilder.custom('report', 'monthly', { year: 2025, month: 1 })\n * // Returns: \"report:monthly:month:1:year:2025\"\n * ```\n */\n static custom(type: string, identifier: string, params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return `${type}:${identifier}`;\n }\n\n const sortedKeys = Object.keys(params).sort();\n const paramParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n return `${type}:${identifier}:${paramParts.join(':')}`;\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 { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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 CorePackageError(\n 'Redis configuration is required for Redis cache strategy',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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';\nexport { CacheKeyBuilder } from './CacheKeyBuilder';\n","/**\n * CacheService - Singleton Cache Manager\n *\n * @description Manages cache instance for the entire application using a singleton pattern.\n * This service wraps the CacheManager from @plyaz/core/base/cache and provides a centralized\n * way to initialize and access caching across all backend services.\n *\n * **Architecture:**\n * - Supports multiple strategies: Memory (in-process), Redis (distributed)\n * - Configurable TTL, key prefixing, and strategy-specific options\n * - Singleton pattern ensures single cache instance across application\n *\n * **Strategy Configuration:**\n * - **Memory**: In-process LRU cache, no external dependencies\n * - **Redis**: Distributed cache using ioredis, requires Redis server\n *\n * **Required Environment Variables (Redis):**\n * - REDIS_URL: Redis connection string (e.g., redis://localhost:6379)\n * - Or REDIS_HOST, REDIS_PORT, REDIS_PASSWORD for individual config\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * cache: {\n * strategy: 'memory',\n * isEnabled: true,\n * ttl: 300, // 5 minutes default\n * },\n * });\n *\n * // Access via Core.cache\n * const cache = Core.cache.getCacheManager();\n * await cache.set('user:123', userData, 600); // 10 minutes TTL\n * const cached = await cache.get('user:123');\n * ```\n *\n * @example With Redis Strategy\n * ```typescript\n * await Core.initialize({\n * envPath: '.env',\n * cache: {\n * strategy: 'redis',\n * isEnabled: true,\n * ttl: 300,\n * prefix: 'myapp',\n * redis: {\n * url: process.env.REDIS_URL,\n * // Or individual options:\n * // host: process.env.REDIS_HOST,\n * // port: parseInt(process.env.REDIS_PORT),\n * // password: process.env.REDIS_PASSWORD,\n * },\n * },\n * });\n * ```\n *\n * @example Direct Usage\n * ```typescript\n * import { CacheService } from '@plyaz/core/services';\n *\n * await CacheService.initialize({\n * strategy: 'memory',\n * isEnabled: true,\n * ttl: 300,\n * });\n *\n * const cache = CacheService.getInstance().getCacheManager();\n * await cache.set('key', value);\n * ```\n *\n * @example Skip Cache (Disable Caching)\n * ```typescript\n * await Core.initialize({\n * skipCache: true, // Cache will not be initialized\n * });\n * ```\n *\n * @fileoverview Cache service singleton\n * @module services/CacheService\n */\n\nimport { CacheManager } from '../base/cache';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type { CoreCacheConfig } from '@plyaz/types/core';\nimport type { CacheConfig } from '@plyaz/types';\nimport { CACHE_STRATEGIES } from '@plyaz/types/features';\nimport { CoreLogger } from '@plyaz/logger';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Singleton service for managing application-wide cache\n *\n * Provides centralized access to cache functionality across all backend services.\n * Automatically integrates with BaseBackendDomainService when initialized.\n */\nexport class CacheService {\n /** Singleton instance */\n private static instance: CacheService | null = null;\n\n /** Cache manager instance */\n private cacheManager: CacheManager | null = null;\n\n /** Configuration used to initialize cache */\n private config: CoreCacheConfig | null = null;\n\n /** Logger instance */\n private logger = new CoreLogger({ service: 'CacheService' });\n\n /** Private constructor to enforce singleton */\n private constructor() {}\n\n /**\n * Initialize the cache service with configuration\n *\n * @param config - Cache configuration\n * @throws {CorePackageError} If already initialized or config is invalid\n *\n * @example\n * ```typescript\n * await CacheService.initialize({\n * strategy: 'redis',\n * isEnabled: true,\n * ttl: 300,\n * prefix: 'app',\n * redis: { url: process.env.REDIS_URL },\n * });\n * ```\n */\n static async initialize(config: CoreCacheConfig): Promise<void> {\n if (this.instance?.cacheManager) {\n throw new CorePackageError(\n 'CacheService is already initialized. Call reset() first if you need to reinitialize.',\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n const service = this.instance ?? new CacheService();\n this.instance = service;\n\n try {\n service.logger.info('[CacheService] Initializing cache...', {\n strategy: config.strategy,\n isEnabled: config.isEnabled,\n ttl: config.ttl,\n });\n\n // Validate configuration\n service.validateConfig(config);\n\n // Create cache manager with validated config (ensure required fields)\n const cacheConfig: CacheConfig = {\n ...config,\n ttl: config.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n };\n service.cacheManager = new CacheManager(cacheConfig);\n service.config = config;\n\n service.logger.info('[CacheService] Cache initialized successfully', {\n strategy: config.strategy,\n });\n } catch (error) {\n service.logger.error('[CacheService] Failed to initialize cache', { error });\n throw new CorePackageError(\n `Failed to initialize cache: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.VALIDATION_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n }\n\n /**\n * Get the singleton instance\n *\n * @throws {CorePackageError} If not initialized\n * @returns CacheService singleton instance\n *\n * @example\n * ```typescript\n * const cacheService = CacheService.getInstance();\n * const cache = cacheService.getCacheManager();\n * ```\n */\n static getInstance(): CacheService {\n if (!this.instance) {\n throw new CorePackageError(\n 'CacheService not initialized. Call CacheService.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return this.instance;\n }\n\n /**\n * Get the cache manager instance\n *\n * @throws {CorePackageError} If cache not initialized\n * @returns CacheManager instance\n *\n * @example\n * ```typescript\n * const cache = CacheService.getInstance().getCacheManager();\n * await cache.set('user:123', userData);\n * const user = await cache.get('user:123');\n * ```\n */\n getCacheManager(): CacheManager {\n if (!this.cacheManager) {\n throw new CorePackageError(\n 'Cache manager not initialized. Call CacheService.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return this.cacheManager;\n }\n\n /**\n * Get current cache configuration\n *\n * @returns Current cache configuration or null if not initialized\n */\n getConfig(): CoreCacheConfig | null {\n return this.config;\n }\n\n /**\n * Check if cache is initialized and enabled\n *\n * @returns True if cache is ready to use\n */\n isInitialized(): boolean {\n return this.cacheManager !== null && (this.config?.isEnabled ?? false);\n }\n\n /**\n * Reset the cache service (useful for testing)\n *\n * @internal\n */\n static reset(): void {\n if (this.instance?.cacheManager) {\n this.instance.logger.info('[CacheService] Resetting cache service');\n // Clear cache manager\n this.instance.cacheManager.clear().catch(error => {\n this.instance?.logger.error('[CacheService] Error clearing cache during reset', { error });\n });\n }\n this.instance = null;\n }\n\n /**\n * Validate cache configuration\n *\n * @param config - Configuration to validate\n * @throws {CorePackageError} If configuration is invalid\n * @private\n */\n // eslint-disable-next-line complexity\n private validateConfig(config: CoreCacheConfig): void {\n // Validate strategy\n if (!CACHE_STRATEGIES.includes(config.strategy as (typeof CACHE_STRATEGIES)[number])) {\n throw new CorePackageError(\n `Invalid cache strategy: ${config.strategy}. Must be one of: ${CACHE_STRATEGIES.join(', ')}`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n // Validate TTL\n if (config.ttl !== undefined && (config.ttl < 0 || !Number.isFinite(config.ttl))) {\n throw new CorePackageError(\n `Invalid TTL value: ${config.ttl}. Must be a positive number.`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n // Validate Redis config when strategy is redis\n if (config.strategy === 'redis') {\n if (!config.redis?.url && !config.redis?.host) {\n throw new CorePackageError(\n 'Redis strategy requires either redis.url or redis.host configuration',\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n }\n\n this.logger.debug('[CacheService] Configuration validated successfully');\n }\n}\n\n// Export singleton instance getter for convenience\nexport const getCacheService = (): CacheService => CacheService.getInstance();\n","/**\n * StorageService - Singleton File Storage Manager\n *\n * @description Manages file storage operations for the entire application using a singleton pattern.\n * This service wraps @plyaz/storage and provides a centralized way to initialize and access\n * file storage across all domains (media uploads, compliance documents, user avatars, etc.).\n *\n * **Architecture:**\n * - Uses `StorageService` from @plyaz/storage which supports multi-provider setup\n * - Supports Cloudflare R2 (compliance documents) and Supabase Storage (assets/media)\n * - Automatic failover between providers based on health status\n * - Event-driven architecture with 40+ event types\n * - **Proxy-based method forwarding**: All methods from the underlying service are\n * automatically available with error handling - no manual wrapping needed\n *\n * **Provider Configuration:**\n * - **Cloudflare R2**: For compliance documents (tax, invoices, KYC) with zero egress fees\n * - **Supabase Storage**: For assets like images, user avatars, media files\n *\n * **Required Environment Variables (Cloudflare R2):**\n * - CLOUDFLARE_ACCOUNT_ID: Your Cloudflare account ID\n * - R2_ACCESS_KEY_ID: R2 access key\n * - R2_SECRET_ACCESS_KEY: R2 secret key\n * - R2_BUCKET_NAME: Default bucket name\n *\n * **Required Environment Variables (Supabase Storage):**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for storage operations\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * storage: {\n * adapters: [r2Adapter, supabaseAdapter],\n * plugins: [virusScanPlugin, sharpImagePlugin],\n * },\n * });\n *\n * // Access via Core.storage - all methods automatically available\n * const result = await Core.storage.uploadFile({\n * file: buffer,\n * filename: 'document.pdf',\n * category: FILE_CATEGORY.COMPLIANCE_DOCUMENT,\n * });\n * ```\n *\n * @module services\n */\n\nimport type { BaseStorageAdapter } from '@plyaz/storage';\nimport { StorageService as StorageServiceImpl } from '@plyaz/storage';\nimport { StoragePackageError } from '@plyaz/errors';\nimport type { CoreStorageConfig } from '@plyaz/types/core';\nimport type { StorageServiceConfig } from '@plyaz/types/storage';\nimport { CORE_EVENTS, type CoreStorageErrorPayload } from '@plyaz/types/core';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CoreEventManager } from '../events/CoreEventManager';\n\n// Re-export types for convenience\nexport type { CoreStorageConfig } from '@plyaz/types/core';\n\n/** Internal type for properly typed storage config */\ntype TypedStorageConfig = StorageServiceConfig<BaseStorageAdapter>;\n\n/** Error context options for storage operations */\ninterface StorageErrorOptions {\n fileId?: string;\n filename?: string;\n recoverable?: boolean;\n}\n\n/**\n * StorageService - Singleton File Storage Manager with Proxy-based method forwarding\n *\n * Provides centralized file storage management for all domains.\n * Uses @plyaz/storage under the hood with configurable providers and plugins.\n *\n * All methods from the underlying StorageServiceImpl are automatically available\n * via Proxy - when new methods are added to @plyaz/storage, they're instantly\n * accessible here with automatic error handling.\n */\nexport class StorageService {\n private static instance: StorageService | null = null;\n private storageService: StorageServiceImpl | null = null;\n private config: CoreStorageConfig | null = null;\n private initialized = false;\n\n private constructor() {}\n\n // ─────────────────────────────────────────────────────────────────\n // Error Handling\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Emits a storage error event via CoreEventManager.\n * Called when storage operations fail to integrate with global error handling.\n */\n private emitStorageError(error: unknown, operation: string, options?: StorageErrorOptions): void {\n const payload: CoreStorageErrorPayload = {\n error,\n operation,\n fileId: options?.fileId,\n filename: options?.filename,\n recoverable: options?.recoverable ?? false,\n };\n CoreEventManager.emit(CORE_EVENTS.STORAGE.ERROR, payload);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Singleton Management\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the singleton instance of StorageService\n */\n static getInstance(): StorageService {\n StorageService.instance ??= new StorageService();\n return StorageService.instance;\n }\n\n /**\n * Checks if the storage service has been initialized\n */\n static isInitialized(): boolean {\n return StorageService.instance?.initialized ?? false;\n }\n\n /**\n * Resets the storage service by clearing the singleton instance\n */\n static async reset(): Promise<void> {\n if (StorageService.instance) {\n StorageService.instance.storageService = null;\n StorageService.instance.config = null;\n StorageService.instance.initialized = false;\n StorageService.instance = null;\n }\n }\n\n /**\n * Initializes the storage service\n *\n * @param config - Storage service configuration\n * @returns The initialized StorageService instance\n */\n static async initialize(config: CoreStorageConfig): Promise<StorageService> {\n const instance = StorageService.getInstance();\n\n if (instance.initialized) {\n return instance;\n }\n\n instance.config = config;\n // Cast to properly typed config (CoreStorageConfig is the user-facing type,\n // TypedStorageConfig ensures proper generic parameter for StorageServiceImpl)\n instance.storageService = new StorageServiceImpl(config as TypedStorageConfig);\n instance.initialized = true;\n\n return instance;\n }\n\n /**\n * Gets the raw underlying storage service instance without error handling wrapper.\n * Use this only if you need direct access to the underlying service.\n *\n * @returns The raw StorageService instance from @plyaz/storage\n * @throws {StoragePackageError} When storage is not initialized\n */\n private getRawStorage(): StorageServiceImpl {\n if (!this.storageService) {\n throw new StoragePackageError(\n 'Storage not initialized. Call StorageService.initialize() first or use Core.initialize() with storage config.',\n STORAGE_ERROR_CODES.INITIALIZATION_FAILED\n );\n }\n return this.storageService;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the storage service with automatic error handling.\n * All method calls are wrapped with try/catch and emit error events on failure.\n * Any method added to @plyaz/storage will be automatically available.\n *\n * @example\n * ```typescript\n * const storage = StorageService.getInstance().getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * await storage.deleteFile({ fileId: '123' });\n * ```\n *\n * @returns StorageServiceImpl with automatic error handling\n */\n getStorage(): StorageServiceImpl {\n const self = this;\n\n return new Proxy({} as StorageServiceImpl, {\n get(_, prop: string | symbol) {\n // Skip symbol properties\n if (typeof prop === 'symbol') {\n return undefined;\n }\n\n const storage = self.getRawStorage();\n const value = storage[prop as keyof StorageServiceImpl];\n\n // If it's not a function, return the value directly\n if (typeof value !== 'function') {\n return value;\n }\n\n // Wrap function calls with error handling\n return (...args: unknown[]) => {\n try {\n const result = (value as Function).apply(storage, args);\n\n // Handle async methods\n if (result instanceof Promise) {\n return result.catch((error: unknown) => {\n self.emitStorageError(error, prop, { recoverable: true });\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n self.emitStorageError(error, prop, { recoverable: true });\n throw error;\n }\n };\n },\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Health Check (special handling for response transformation)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Performs a health check on the storage service by checking all adapter health.\n * This method has special handling to transform the response format.\n */\n async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const storage = this.getRawStorage();\n // Use checkAllAdaptersHealth and getHealthSummary if available\n if (typeof storage.checkAllAdaptersHealth === 'function') {\n await storage.checkAllAdaptersHealth();\n }\n\n const summary =\n typeof storage.getHealthSummary === 'function' ? storage.getHealthSummary() : null;\n const responseTime = Date.now() - startTime;\n\n return {\n // Check if all adapters are healthy (healthy count equals total count)\n isHealthy: summary ? summary.healthy === summary.total : true,\n responseTime,\n error: undefined,\n };\n } catch (error) {\n this.emitStorageError(error, 'healthCheck', { recoverable: true });\n\n return {\n isHealthy: false,\n responseTime: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the current configuration\n */\n getConfig(): CoreStorageConfig | null {\n return this.config;\n }\n\n /**\n * Closes the storage service and cleans up resources\n */\n async close(): Promise<void> {\n if (this.storageService) {\n await this.storageService.destroy();\n }\n this.storageService = null;\n this.initialized = false;\n this.config = null;\n }\n\n /**\n * Creates a dedicated storage service instance (NOT the singleton)\n *\n * Use this when you need an isolated storage connection with its own configuration.\n *\n * @param config - Storage service configuration\n * @returns Promise that resolves to a new dedicated StorageService instance\n */\n static async createInstance(config: CoreStorageConfig): Promise<StorageService> {\n const dedicatedInstance = new StorageService();\n dedicatedInstance.config = config;\n // Cast to properly typed config (CoreStorageConfig is the user-facing type,\n // TypedStorageConfig ensures proper generic parameter for StorageServiceImpl)\n dedicatedInstance.storageService = new StorageServiceImpl(config as TypedStorageConfig);\n dedicatedInstance.initialized = true;\n return dedicatedInstance;\n }\n}\n","/**\n * NotificationService - Singleton Notification Manager\n *\n * @description Manages notification delivery for the entire application using a singleton pattern.\n * This service wraps @plyaz/notifications and provides a centralized way to initialize and access\n * notification capabilities across all domains (transactional, marketing, system alerts, etc.).\n *\n * **Architecture:**\n * - Uses `NotificationService` from @plyaz/notifications which supports multi-provider setup\n * - Supports email (Infobip primary, SendGrid fallback), SMS, and push notifications\n * - Automatic failover between providers based on health status\n * - Event-driven architecture for tracking delivery, opens, clicks\n * - **Proxy-based method forwarding**: All methods from the underlying service are\n * automatically available with error handling - no manual wrapping needed\n *\n * **Provider Configuration:**\n * - **Infobip**: Primary email provider (unified omnichannel platform)\n * - **SendGrid**: Fallback email provider for transactional emails\n *\n * **Required Environment Variables (Infobip):**\n * - INFOBIP_API_KEY: Your Infobip API key\n * - INFOBIP_BASE_URL: Infobip API base URL\n * - FROM_EMAIL: Default sender email address\n *\n * **Required Environment Variables (SendGrid):**\n * - SENDGRID_API_KEY: Your SendGrid API key\n * - FROM_EMAIL: Default sender email address\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * notifications: {\n * providers: {\n * email: [infobipAdapter, sendGridAdapter],\n * sms: [],\n * push: [],\n * },\n * events: {\n * onSent: (event) => console.log('Notification sent:', event),\n * onFailed: (event) => console.error('Notification failed:', event),\n * },\n * },\n * });\n *\n * // Access via Core.notifications - all methods automatically available\n * await Core.notifications.sendEmail({\n * recipientId: 'user-123',\n * to: 'user@example.com',\n * templateId: 'welcome',\n * templateData: { userName: 'John' },\n * });\n * ```\n *\n * @module services\n */\n\nimport { NotificationService as NotificationServiceImpl } from '@plyaz/notifications';\nimport { NotificationPackageError } from '@plyaz/errors';\nimport type { CoreNotificationConfig } from '@plyaz/types/core';\nimport { CORE_EVENTS, type CoreNotificationErrorPayload } from '@plyaz/types/core';\nimport { NOTIFICATION_ERROR_CODES } from '@plyaz/types/errors';\nimport { CoreEventManager } from '../events/CoreEventManager';\n\n// Re-export types for convenience\nexport type { CoreNotificationConfig } from '@plyaz/types/core';\n\n/** Error context options for notification operations */\ninterface NotificationErrorOptions {\n recipientId?: string;\n channel?: string;\n recoverable?: boolean;\n}\n\n/**\n * NotificationService - Singleton Notification Manager with Proxy-based method forwarding\n *\n * Provides centralized notification management for all domains.\n * Uses @plyaz/notifications under the hood with configurable providers and templates.\n *\n * All methods from the underlying NotificationServiceImpl are automatically available\n * via Proxy - when new methods are added to @plyaz/notifications, they're instantly\n * accessible here with automatic error handling.\n */\nexport class NotificationService {\n private static instance: NotificationService | null = null;\n private notificationService: NotificationServiceImpl | null = null;\n private config: CoreNotificationConfig | null = null;\n private initialized = false;\n\n private constructor() {}\n\n // ─────────────────────────────────────────────────────────────────\n // Error Handling\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Emits a notification error event via CoreEventManager.\n * Called when notification operations fail to integrate with global error handling.\n */\n private emitNotificationError(\n error: unknown,\n operation: string,\n options?: NotificationErrorOptions\n ): void {\n const payload: CoreNotificationErrorPayload = {\n error,\n operation,\n recipientId: options?.recipientId,\n channel: options?.channel,\n recoverable: options?.recoverable ?? false,\n };\n CoreEventManager.emit(CORE_EVENTS.NOTIFICATION.ERROR, payload);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Singleton Management\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the singleton instance of NotificationService\n */\n static getInstance(): NotificationService {\n NotificationService.instance ??= new NotificationService();\n return NotificationService.instance;\n }\n\n /**\n * Checks if the notification service has been initialized\n */\n static isInitialized(): boolean {\n return NotificationService.instance?.initialized ?? false;\n }\n\n /**\n * Resets the notification service by clearing the singleton instance\n */\n static async reset(): Promise<void> {\n if (NotificationService.instance) {\n NotificationService.instance.notificationService = null;\n NotificationService.instance.config = null;\n NotificationService.instance.initialized = false;\n NotificationService.instance = null;\n }\n }\n\n /**\n * Initializes the notification service\n *\n * @param config - Notification service configuration\n * @returns The initialized NotificationService instance\n */\n static async initialize(config: CoreNotificationConfig): Promise<NotificationService> {\n const instance = NotificationService.getInstance();\n\n if (instance.initialized) {\n return instance;\n }\n\n instance.config = config;\n instance.notificationService = new NotificationServiceImpl(config);\n instance.initialized = true;\n\n return instance;\n }\n\n /**\n * Gets the raw underlying notification service instance without error handling wrapper.\n * Use this only if you need direct access to the underlying service.\n *\n * @returns The raw NotificationService instance from @plyaz/notifications\n * @throws {NotificationsPackageError} When notifications is not initialized\n */\n private getRawNotifications(): NotificationServiceImpl {\n if (!this.notificationService) {\n throw new NotificationPackageError(\n 'Notifications not initialized. Call NotificationService.initialize() first or use Core.initialize() with notifications config.',\n NOTIFICATION_ERROR_CODES.INITIALIZATION_FAILED\n );\n }\n return this.notificationService;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the notification service with automatic error handling.\n * All method calls are wrapped with try/catch and emit error events on failure.\n * Any method added to @plyaz/notifications will be automatically available.\n *\n * @example\n * ```typescript\n * const notifications = NotificationService.getInstance().getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * await notifications.sendSMS({ to: '+1234567890', message: 'Hello!' });\n * ```\n *\n * @returns NotificationServiceImpl with automatic error handling\n */\n getNotifications(): NotificationServiceImpl {\n const self = this;\n\n return new Proxy({} as NotificationServiceImpl, {\n get(_, prop: string | symbol) {\n // Skip symbol properties\n if (typeof prop === 'symbol') {\n return undefined;\n }\n\n const notifications = self.getRawNotifications();\n const value = notifications[prop as keyof NotificationServiceImpl];\n\n // If it's not a function, return the value directly\n if (typeof value !== 'function') {\n return value;\n }\n\n // Wrap function calls with error handling\n return (...args: unknown[]) => {\n try {\n const result = (value as Function).apply(notifications, args);\n\n // Handle async methods\n if (result instanceof Promise) {\n return result.catch((error: unknown) => {\n self.emitNotificationError(error, prop, { recoverable: true });\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n self.emitNotificationError(error, prop, { recoverable: true });\n throw error;\n }\n };\n },\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Health Check (special handling for response transformation)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Performs a health check on the notification service.\n * This method has special handling to transform the response format.\n */\n async healthCheck(): Promise<{ isHealthy: boolean; providers?: unknown[]; error?: string }> {\n try {\n const notifications = this.getRawNotifications();\n const result = await notifications.healthCheck();\n\n return {\n isHealthy: result.healthy,\n providers: result.providers,\n // Use optional chaining since error may not exist on all health check results\n error: 'error' in result ? (result as { error?: string }).error : undefined,\n };\n } catch (error) {\n this.emitNotificationError(error, 'healthCheck', { recoverable: true });\n\n return {\n isHealthy: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Gets the current configuration\n */\n getConfig(): CoreNotificationConfig | null {\n return this.config;\n }\n\n /**\n * Closes the notification service and cleans up resources\n */\n async close(): Promise<void> {\n this.notificationService = null;\n this.initialized = false;\n this.config = null;\n }\n\n /**\n * Creates a dedicated notification service instance (NOT the singleton)\n *\n * Use this when you need an isolated notification service with its own configuration.\n *\n * @param config - Notification service configuration\n * @returns Promise that resolves to a new dedicated NotificationService instance\n */\n static async createInstance(config: CoreNotificationConfig): Promise<NotificationService> {\n const dedicatedInstance = new NotificationService();\n dedicatedInstance.config = config;\n dedicatedInstance.notificationService = new NotificationServiceImpl(config);\n dedicatedInstance.initialized = true;\n return dedicatedInstance;\n }\n}\n","/**\n * Example Repository\n *\n * Data access layer for Example entities.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n * Falls back to in-memory dummy data when DbService is not initialized.\n *\n * @example\n * ```typescript\n * // With DbService initialized\n * const db = DbService.getInstance().getDatabase();\n * const repository = new ExampleRepository(db);\n *\n * // Get all entities\n * const result = await repository.findMany();\n * if (result.success) {\n * console.log('Entities:', result.value.data);\n * }\n *\n * // Get by ID\n * const entity = await repository.findById('123');\n * ```\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport { generateId } from '../../utils/common';\nimport type {\n DatabaseResult,\n PaginatedResult,\n QueryOptions,\n DatabaseServiceInterface,\n OperationConfig,\n} from '@plyaz/types/db';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Database row type for Example entity (snake_case for DB)\n */\nexport interface ExampleDatabaseRow {\n id: string;\n name: string;\n description: string | null;\n amount: number;\n owner_id: string;\n status: string;\n is_visible: boolean;\n created_at: string;\n updated_at: string;\n deleted_at?: string | null;\n [key: string]: unknown;\n}\n\n/**\n * Create input for Example entity\n */\nexport type ExampleCreateInput = Omit<\n ExampleDatabaseRow,\n 'id' | 'created_at' | 'updated_at' | 'deleted_at'\n>;\n\n/**\n * Update input for Example entity\n */\nexport type ExampleUpdateInput = Partial<Omit<ExampleDatabaseRow, 'id' | 'created_at'>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default table name for examples */\nconst EXAMPLE_TABLE = 'examples';\n\n/** Default pagination limit for list queries */\nconst DEFAULT_PAGINATION_LIMIT = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dummy Data (fallback when DbService not available)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DUMMY_DATA: ExampleDatabaseRow[] = [\n {\n id: 'example-001',\n name: 'Premium Subscription',\n description: 'Monthly premium subscription plan',\n amount: 9999,\n owner_id: 'user-001',\n status: 'active',\n is_visible: true,\n created_at: '2024-01-15T10:00:00Z',\n updated_at: '2024-01-15T10:00:00Z',\n },\n {\n id: 'example-002',\n name: 'Basic Plan',\n description: 'Free tier with limited features',\n amount: 0,\n owner_id: 'user-001',\n status: 'active',\n is_visible: true,\n created_at: '2024-01-10T08:30:00Z',\n updated_at: '2024-01-12T14:20:00Z',\n },\n {\n id: 'example-003',\n name: 'Enterprise License',\n description: 'Custom enterprise solution',\n amount: 99999,\n owner_id: 'user-002',\n status: 'draft',\n is_visible: false,\n created_at: '2024-02-01T09:00:00Z',\n updated_at: '2024-02-01T09:00:00Z',\n },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Repository\n *\n * Extends BaseRepository for consistent data access patterns.\n * When DbService is not initialized, falls back to in-memory dummy data.\n *\n * @example\n * ```typescript\n * // Create repository (auto-detects DbService availability)\n * const repo = ExampleRepository.create();\n *\n * // Or with explicit database service\n * const db = DbService.getInstance().getDatabase();\n * const repo = new ExampleRepository(db);\n *\n * // Use CRUD operations\n * const result = await repo.findById('example-001');\n * ```\n */\nexport class ExampleRepository extends BaseRepository<ExampleDatabaseRow> {\n private readonly useDummyData: boolean;\n private dummyStore: ExampleDatabaseRow[];\n\n constructor(db: DatabaseServiceInterface, useDummyData = false) {\n super(db, EXAMPLE_TABLE);\n this.useDummyData = useDummyData;\n this.dummyStore = [...DUMMY_DATA];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Factory\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create repository instance.\n * Uses DbService if initialized, otherwise creates a dummy-data repository.\n */\n static create(): ExampleRepository {\n if (DbService.isInitialized()) {\n const db = DbService.getInstance().getDatabase();\n return new ExampleRepository(db, false);\n }\n\n // Create with dummy mode - db won't be used\n // We pass a mock db that won't be called when useDummyData is true\n const mockDb = {} as DatabaseServiceInterface;\n return new ExampleRepository(mockDb, true);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Override Base Methods to Support Dummy Data Fallback\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Find entity by ID\n */\n override async findById(\n id: string,\n config?: OperationConfig\n ): Promise<DatabaseResult<ExampleDatabaseRow | null>> {\n if (this.useDummyData) {\n const row = this.dummyStore.find(r => r.id === id && !r.deleted_at);\n return { success: true, value: row ?? null };\n }\n return super.findById(id, config);\n }\n\n /**\n * Find multiple entities\n */\n // eslint-disable-next-line complexity\n override async findMany(\n options?: QueryOptions<ExampleDatabaseRow>,\n config?: OperationConfig\n ): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n if (this.useDummyData) {\n let data = this.dummyStore.filter(r => !r.deleted_at);\n\n // Apply basic filtering if provided\n if (options?.filter && 'field' in options.filter) {\n const { field, value } = options.filter;\n data = data.filter(r => r[field as keyof ExampleDatabaseRow] === value);\n }\n\n // Apply pagination\n const offset = options?.pagination?.offset ?? 0;\n const limit = options?.pagination?.limit ?? DEFAULT_PAGINATION_LIMIT;\n const paginatedData = data.slice(offset, offset + limit);\n\n return {\n success: true,\n value: {\n data: paginatedData,\n total: data.length,\n pagination: {\n page: Math.floor(offset / limit) + 1,\n limit,\n },\n },\n };\n }\n return super.findMany(options, config);\n }\n\n /**\n * Create new entity\n */\n override async create(\n data: Partial<ExampleDatabaseRow>,\n config?: OperationConfig\n ): Promise<DatabaseResult<ExampleDatabaseRow>> {\n const now = new Date().toISOString();\n const id = generateId();\n\n const row: ExampleDatabaseRow = {\n id,\n name: data.name ?? '',\n description: data.description ?? null,\n amount: data.amount ?? 0,\n owner_id: data.owner_id ?? 'user-system',\n status: data.status ?? 'draft',\n is_visible: data.is_visible ?? true,\n created_at: now,\n updated_at: now,\n };\n\n if (this.useDummyData) {\n this.dummyStore.push(row);\n return { success: true, value: row };\n }\n\n return super.create(row, config);\n }\n\n /**\n * Update entity\n */\n override async update(\n id: string,\n data: Partial<ExampleDatabaseRow>,\n config?: OperationConfig\n ): Promise<DatabaseResult<ExampleDatabaseRow>> {\n const updateData = {\n ...data,\n updated_at: new Date().toISOString(),\n };\n\n if (this.useDummyData) {\n const index = this.dummyStore.findIndex(r => r.id === id && !r.deleted_at);\n if (index === -1) {\n return {\n success: false,\n value: null as unknown as ExampleDatabaseRow,\n error: new DatabasePackageError(\n `Example not found: ${id}`,\n DATABASE_ERROR_CODES.ENTITY_NOT_FOUND\n ),\n };\n }\n this.dummyStore[index] = { ...this.dummyStore[index], ...updateData };\n return { success: true, value: this.dummyStore[index] };\n }\n\n return super.update(id, updateData, config);\n }\n\n /**\n * Soft delete entity\n */\n override async softDelete(id: string, config?: OperationConfig): Promise<DatabaseResult<void>> {\n if (this.useDummyData) {\n const index = this.dummyStore.findIndex(r => r.id === id && !r.deleted_at);\n if (index !== -1) {\n this.dummyStore[index].deleted_at = new Date().toISOString();\n }\n return { success: true, value: undefined };\n }\n return super.softDelete(id, config);\n }\n\n /**\n * Hard delete entity\n */\n override async delete(id: string, config?: OperationConfig): Promise<DatabaseResult<void>> {\n if (this.useDummyData) {\n const index = this.dummyStore.findIndex(r => r.id === id);\n if (index !== -1) {\n this.dummyStore.splice(index, 1);\n }\n return { success: true, value: undefined };\n }\n return super.delete(id, config);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Domain-Specific Query Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Find entities by status\n */\n async findByStatus(status: string): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n return this.findMany({\n filter: { field: 'status', operator: 'eq', value: status },\n });\n }\n\n /**\n * Find entities by owner\n */\n async findByOwner(ownerId: string): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n return this.findMany({\n filter: { field: 'owner_id', operator: 'eq', value: ownerId },\n });\n }\n\n /**\n * Find visible entities only\n */\n async findVisible(): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n return this.findMany({\n filter: { field: 'is_visible', operator: 'eq', value: true },\n });\n }\n\n /**\n * Check if entity exists by ID\n */\n override async exists(id: string, config?: OperationConfig): Promise<DatabaseResult<boolean>> {\n if (this.useDummyData) {\n const exists = this.dummyStore.some(r => r.id === id && !r.deleted_at);\n return { success: true, value: exists };\n }\n return super.exists(id, config);\n }\n\n /**\n * Get the table name for this repository\n * Used for transaction operations\n */\n override getTableName(): string {\n return EXAMPLE_TABLE;\n }\n}\n","/**\n * Example Mapper\n *\n * Demonstrates extending BaseMapper for a domain entity.\n * Uses types from @plyaz/types/examples.\n *\n * Note: Validation is handled by ExampleValidator, not here.\n */\n\nimport { BaseMapper, trimString } from '../../base';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n ExampleStoreItem,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/** Default pagination values */\nconst PAGINATION_DEFAULTS = {\n PAGE: 1,\n LIMIT: 20,\n} as const;\n\n/**\n * Example Mapper implementation\n *\n * Supports:\n * - toDomain: API response → Domain\n * - toCreateDTO: Domain → POST body\n * - toPatchDTO: Domain → PATCH body\n * - toStoreState: Domain → Zustand store\n */\nclass ExampleMapperClass extends BaseMapper<\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem\n> {\n /**\n * API DTO → Domain Model\n */\n toDomain(dto: ExampleResponseDTO): ExampleEntity {\n return {\n id: dto.id,\n name: dto.name,\n description: dto.description,\n ownerId: dto.owner_id,\n status: dto.status,\n amount: dto.amount,\n isVisible: dto.is_visible,\n createdAt: new Date(dto.created_at),\n updatedAt: new Date(dto.updated_at),\n\n // Computed properties\n isActive: dto.status === 'active',\n hasDescription: () => Boolean(dto.description),\n };\n }\n\n /**\n * Domain data → Create DTO (POST body)\n */\n toCreateDTO(data: Partial<ExampleEntity>): CreateExampleDTO {\n return {\n name: trimString(data.name) ?? '',\n amount: data.amount ?? 0,\n description: data.description ?? '',\n is_visible: data.isVisible ?? true,\n };\n }\n\n /**\n * Domain data → Update DTO (PUT body - full)\n */\n toUpdateDTO(data: Partial<ExampleEntity>): UpdateExampleDTO {\n return this.toCreateDTO(data);\n }\n\n /**\n * Domain data → Patch DTO (PATCH body - partial)\n */\n toPatchDTO(data: Partial<ExampleEntity>): PatchExampleDTO {\n const dto: PatchExampleDTO = {};\n\n if (data.name !== undefined) {\n dto.name = trimString(data.name);\n }\n if (data.amount !== undefined) {\n dto.amount = data.amount;\n }\n if (data.description !== undefined) {\n dto.description = data.description ?? undefined;\n }\n if (data.isVisible !== undefined) {\n dto.is_visible = data.isVisible;\n }\n\n return dto;\n }\n\n /**\n * Filters → Query params DTO (GET)\n */\n toQueryDTO(filters: Partial<QueryExampleDTO>): QueryExampleDTO {\n return {\n page: filters.page ?? PAGINATION_DEFAULTS.PAGE,\n limit: filters.limit ?? PAGINATION_DEFAULTS.LIMIT,\n sort_by: filters.sort_by ?? 'created_at',\n sort_order: filters.sort_order ?? 'desc',\n status: filters.status,\n is_visible: filters.is_visible,\n min_amount: filters.min_amount,\n max_amount: filters.max_amount,\n search: filters.search,\n };\n }\n\n /**\n * Domain → Store state (serializable)\n */\n toStoreState(domain: ExampleEntity): ExampleStoreItem {\n return {\n id: domain.id,\n name: domain.name,\n description: domain.description,\n ownerId: domain.ownerId,\n status: domain.status,\n amount: domain.amount,\n isVisible: domain.isVisible,\n createdAt: domain.createdAt.toISOString(),\n updatedAt: domain.updatedAt.toISOString(),\n isActive: domain.isActive,\n isSelected: false,\n };\n }\n\n /**\n * Store state → Domain (restore computed props)\n */\n fromStoreState(state: ExampleStoreItem): ExampleEntity {\n return {\n id: state.id,\n name: state.name,\n description: state.description,\n ownerId: state.ownerId,\n status: state.status,\n amount: state.amount,\n isVisible: state.isVisible,\n createdAt: new Date(state.createdAt),\n updatedAt: new Date(state.updatedAt),\n isActive: state.isActive,\n hasDescription: () => Boolean(state.description),\n };\n }\n\n /**\n * Database row → Response DTO\n * Maps repository output to API response format\n */\n toResponseDTO(row: {\n id: string;\n name: string;\n description: string | null;\n amount: number;\n owner_id: string;\n status: string;\n is_visible: boolean;\n created_at: string;\n updated_at: string;\n }): ExampleResponseDTO {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n amount: row.amount,\n owner_id: row.owner_id,\n status: row.status as 'draft' | 'active' | 'archived',\n is_visible: row.is_visible,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n}\n\n// Export class for BaseDomainService.MapperClass\nexport { ExampleMapperClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleMapper = new ExampleMapperClass();\n","/**\n * Example Validator\n *\n * Demonstrates extending BaseValidator for a domain entity.\n * Uses schemas and types from @plyaz/types/examples.\n */\n\nimport { BaseValidator } from '../../base';\nimport {\n CreateExampleSchema,\n UpdateExampleSchema,\n PatchExampleSchema,\n DeleteExampleSchema,\n QueryExampleSchema,\n} from '@plyaz/types/examples';\nimport type {\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n DeleteExampleDTO,\n QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/**\n * Example Validator implementation\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT)\n * - patch (PATCH)\n * - delete (DELETE)\n * - query (GET)\n */\nclass ExampleValidatorClass extends BaseValidator<\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n DeleteExampleDTO,\n QueryExampleDTO\n> {\n constructor() {\n super({\n createSchema: CreateExampleSchema,\n updateSchema: UpdateExampleSchema,\n patchSchema: PatchExampleSchema,\n deleteSchema: DeleteExampleSchema,\n querySchema: QueryExampleSchema,\n });\n }\n\n /**\n * Custom validation: check if name is not reserved\n * Use for business logic validation beyond schema validation\n */\n validateNameNotReserved(name: string): boolean {\n const reserved = ['admin', 'system', 'root', 'test'];\n return !reserved.includes(name.toLowerCase());\n }\n\n /**\n * Custom validation: check if amount is within budget\n */\n validateAmountWithinBudget(amount: number, budget: number): boolean {\n return amount <= budget;\n }\n}\n\n// Export class for BaseDomainService.ValidatorClass\nexport { ExampleValidatorClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleValidator = new ExampleValidatorClass();\n","/**\n * Backend Example Domain Service\n *\n * Demonstrates extending BaseBackendDomainService which provides:\n * - Automatic validation → mapper → repository/API → mapper flow\n * - Event emission throughout CRUD lifecycle\n * - Dual mode: Repository (DbService/dummy) OR HTTP API\n * - Configurable error throwing behavior\n *\n * This service only needs to:\n * - Initialize repository in constructor\n * - Set eventPrefix for event emission\n * - Implement isAvailable() and dispose()\n * - Add any custom domain methods\n *\n * All standard CRUD operations are inherited with cache support:\n * - create(data, options?) - Create with optional caching\n * - patch(id, data, options?) - Update with automatic cache invalidation\n * - delete(id, deleteOptions?, crudOptions?) - Delete with automatic cache invalidation\n * - getById(id, options?) - Read with cache-aside pattern\n *\n * Runtime: Backend (NestJS, Express, Node.js)\n * - Uses repository (DbService or dummy data fallback)\n * - Auto-initialized by Core.initialize() as part of DomainServices\n * - For HTTP API calls, use fetchers from @plyaz/api directly\n *\n * @example\n * ```tsx\n * // Create service\n * const service = await BackendExampleDomainService.create({\n * throwOnValidationError: true, // Throw on validation errors (default)\n * throwOnRepositoryError: true, // Throw on repository errors (default)\n * });\n *\n * // Use inherited CRUD methods\n * const entity = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.patch(entity.id, { amount: 200 });\n * await service.delete(entity.id, { soft: true });\n * ```\n */\n\nimport { BaseBackendDomainService } from '../base';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n DeleteExampleDTO,\n ExampleStoreItem,\n ExampleDomainServiceConfig as _ExampleDomainServiceConfig,\n} from '@plyaz/types/examples';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type { CoreServiceCreateOptions, CoreInjectedServices } from '@plyaz/types/core';\nimport { ExampleRepository, type ExampleDatabaseRow } from '../../models/example';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\nimport { ExampleValidatorClass } from './validators/ExampleValidator';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Mapper type for this service\n */\ntype ExampleMapper = InstanceType<typeof ExampleMapperClass>;\n\n/**\n * Validator type for this service\n */\ntype ExampleValidator = InstanceType<typeof ExampleValidatorClass>;\n\n/**\n * Example event types (for subscription)\n */\nexport type ExampleEventType =\n // Lifecycle events\n | 'example:creating'\n | 'example:created'\n | 'example:updating'\n | 'example:updated'\n | 'example:deleting'\n | 'example:deleted'\n | 'example:complete'\n | 'example:error'\n // Validation events\n | 'example:validation:started'\n | 'example:validation:success'\n | 'example:validation:failed'\n // Sanitization events\n | 'example:sanitization:started'\n | 'example:sanitization:complete';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Backend Example Domain Service\n *\n * Extends BaseBackendDomainService with all generic types:\n * - TConfig: ExampleDomainServiceConfig\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TUpdateDTO: CreateExampleDTO (same as create)\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TDeleteOptions: DeleteExampleDTO\n * - TRepository: ExampleRepository\n * - TDatabaseRow: ExampleDatabaseRow\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n * - TValidator: ExampleValidator\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class BackendExampleDomainService extends BaseBackendDomainService<\n _ExampleDomainServiceConfig,\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n CreateExampleDTO, // Update same as create\n PatchExampleDTO,\n QueryExampleDTO, // Query/filter type for getAll()\n DeleteExampleDTO,\n ExampleDatabaseRow,\n ExampleRepository,\n ExampleStoreItem,\n ExampleMapper,\n ExampleValidator\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Repository instance for data access\n * Required by BaseBackendDomainService\n */\n protected repository: ExampleRepository;\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseBackendDomainService\n */\n protected eventPrefix = 'example';\n\n /**\n * Cache prefix for namespacing cache keys\n * Optional: defaults to serviceName.toLowerCase() if not set\n */\n protected cachePrefix = 'example';\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static: Service Registry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Unique key for this service (used by ServiceRegistry)\n */\n static readonly serviceKey = SERVICE_KEYS.EXAMPLE;\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n * Creates and initializes the service instance.\n *\n * @param config - Service configuration\n * @param options - Global options from the registry (includes cache, db, api instances)\n * @returns Promise resolving to the initialized service instance\n */\n static async create(\n config: _ExampleDomainServiceConfig,\n options?: CoreServiceCreateOptions\n ): Promise<BackendExampleDomainService> {\n // Build injected services from options (all injected by ServiceRegistry)\n const injected: CoreInjectedServices = {\n cache: options?.cache?.instance,\n db: options?.db?.instance,\n api: options?.apiClient?.instance,\n };\n\n const service = new BackendExampleDomainService(config, injected);\n return service;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(config: _ExampleDomainServiceConfig = {}, injected?: CoreInjectedServices) {\n const serviceConfig: _ExampleDomainServiceConfig = {\n enabled: true,\n throwOnValidationError: true,\n throwOnRepositoryError: true,\n emitEvents: true,\n cache: {\n enabled: true, // Enable cache by default\n defaultTtl: 300, // 5 minutes default TTL\n },\n ...config,\n };\n\n super({\n serviceName: 'BackendExampleDomainService',\n supportedRuntimes: ['backend'] as const,\n serviceConfig,\n mapperClass: ExampleMapperClass,\n validatorClass: ExampleValidatorClass,\n injected, // Pass all injected services (cache, db, api)\n });\n\n // Initialize repository (uses DbService if available, else dummy data)\n this.repository = ExampleRepository.create();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Implementations (Required by BaseDomainService)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if service is available\n * Service is available if enabled (repository is always available)\n */\n isAvailable(): boolean {\n return this.isServiceEnabled;\n }\n\n /**\n * Dispose/cleanup the service\n */\n dispose(): void {\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Custom Domain Methods (Optional)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Configure the service (mutates config)\n * Use this to update configuration at runtime\n */\n configure(updates: Partial<_ExampleDomainServiceConfig>): void {\n Object.assign(this.config, updates);\n this.logDebug('Service configured', { config: this.config });\n }\n\n /**\n * Subscribe to service events\n * Uses CoreEventManager under the hood\n *\n * @param event - Event type to listen for\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n // eslint-disable-next-line no-unused-vars\n on(event: ExampleEventType, handler: (data: unknown) => void): () => void {\n // Note: Events are emitted with prefix by BaseBackendDomainService\n // E.g., 'creating' becomes 'example:creating'\n return this.emitEvent as never; // Placeholder - actual implementation would use CoreEventManager\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - Error Handling Examples\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Single validation error\n * Validates data with ONE field invalid to trigger single validation error in array\n *\n * @throws ValidationError[] (array with 1 error)\n */\n demoSingleValidationError(): void {\n // Pass data with only ONE invalid field - validator throws [ValidationError]\n this.validator.validateCreateOrThrow({\n name: '', // Empty - required field (SINGLE ERROR)\n amount: 100, // Valid\n description: 'Valid description',\n is_visible: true,\n });\n }\n\n /**\n * Demo: Multiple validation errors\n * Validates data with MULTIPLE fields invalid to trigger array of validation errors\n *\n * @throws ValidationError[] (array with multiple errors)\n */\n demoMultipleValidationErrors(): void {\n // Pass data with MULTIPLE invalid fields - validator throws [ValidationError, ValidationError, ...]\n this.validator.validateCreateOrThrow({\n name: '', // Empty - required field (ERROR 1)\n amount: -100, // Negative - must be non-negative (ERROR 2)\n description: '', // Empty - if required (ERROR 3)\n is_visible: undefined, // Missing/invalid (ERROR 4)\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - getAll() Examples\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Get all examples with optional filters\n * Demonstrates the getAll() method with typed query parameters\n *\n * @param filters - Optional query filters (status, pagination, sorting)\n * @returns Promise resolving to array of ExampleEntity\n *\n * @example\n * ```typescript\n * // Get all active examples\n * const activeExamples = await service.getExamples({ status: 'active' });\n *\n * // Get archived examples with pagination\n * const archivedExamples = await service.getExamples({\n * status: 'archived',\n * page: 2,\n * limit: 10\n * });\n *\n * // Get all examples sorted by name\n * const sortedExamples = await service.getExamples({\n * sort_by: 'name',\n * sort_order: 'asc'\n * });\n * ```\n */\n async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n return this.getAll(filters); // Properly typed!\n }\n\n /**\n * Demo: Get active examples only\n * Convenience method demonstrating filtering\n */\n async getActiveExamples(): Promise<ExampleEntity[]> {\n return this.getAll({ status: 'active' });\n }\n\n /**\n * Demo: Get draft examples only\n * Convenience method demonstrating filtering\n */\n async getDraftExamples(): Promise<ExampleEntity[]> {\n return this.getAll({ status: 'draft' });\n }\n\n /**\n * Demo: Get archived examples only\n * Convenience method demonstrating filtering\n */\n async getArchivedExamples(): Promise<ExampleEntity[]> {\n return this.getAll({ status: 'archived' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - Bulk Operations & Existence Checks\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Check if an example exists\n * More efficient than fetching the full entity when you only need existence\n *\n * @param id - Example ID to check\n * @returns Promise resolving to boolean\n *\n * @example\n * ```typescript\n * const exists = await service.checkExampleExists('123');\n * if (exists) {\n * console.log('Example exists!');\n * }\n * ```\n */\n async checkExampleExists(id: string): Promise<boolean> {\n return this.exists(id);\n }\n\n /**\n * Demo: Create multiple examples at once\n * More efficient than calling create() multiple times\n *\n * @param dataArray - Array of example data to create\n * @returns Promise resolving to array of created entities\n *\n * @example\n * ```typescript\n * const examples = await service.createMultipleExamples([\n * { name: 'Example 1', amount: 100 },\n * { name: 'Example 2', amount: 200 },\n * { name: 'Example 3', amount: 300 },\n * ]);\n * console.log(`Created ${examples.length} examples`);\n * ```\n */\n async createMultipleExamples(dataArray: CreateExampleDTO[]): Promise<ExampleEntity[]> {\n return this.bulkCreate(dataArray);\n }\n\n /**\n * Demo: Delete multiple examples at once\n * More efficient than calling delete() multiple times\n *\n * @param ids - Array of example IDs to delete\n * @param soft - Whether to soft delete (default: true)\n * @returns Promise resolving when all deletions complete\n *\n * @example\n * ```typescript\n * // Soft delete multiple examples\n * await service.deleteMultipleExamples(['id1', 'id2', 'id3'], true);\n *\n * // Hard delete multiple examples\n * await service.deleteMultipleExamples(['id1', 'id2', 'id3'], false);\n * ```\n */\n async deleteMultipleExamples(ids: string[], soft = true): Promise<void> {\n return this.bulkDelete(ids, { soft });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // NOTE: CRUD Methods Are Inherited from BaseBackendDomainService\n // ─────────────────────────────────────────────────────────────────────────\n //\n // The following methods are available but NOT implemented here:\n //\n // Basic CRUD:\n // - create(data: unknown): Promise<ExampleEntity>\n // - getById(id: string, options?): Promise<ExampleEntity | null>\n // - getAll(query?: QueryExampleDTO, options?): Promise<ExampleEntity[]>\n // - patch(id: string, data: unknown, options?): Promise<ExampleEntity>\n // - delete(id: string, deleteOptions?, crudOptions?): Promise<void>\n //\n // Utility Methods:\n // - exists(id: string, options?): Promise<boolean>\n //\n // Bulk Operations:\n // - bulkCreate(dataArray: unknown[], options?): Promise<ExampleEntity[]>\n // - bulkDelete(ids: string[], deleteOptions?, crudOptions?): Promise<void>\n //\n // All validation → mapper → repository → mapper flow is handled automatically!\n // All events are emitted automatically with 'example:' prefix!\n // All cache operations are handled automatically (cache-aside, invalidation)!\n // Bulk operations process sequentially (first error stops execution)!\n // ─────────────────────────────────────────────────────────────────────────\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Default Singleton Instance (for backward compatibility)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Default instance of BackendExampleDomainService\n * Use this for singleton pattern usage\n *\n * @example\n * ```tsx\n * import { backendExampleDomainService } from '@plyaz/core';\n *\n * const entity = await backendExampleDomainService.create({ name: 'Test', amount: 100 });\n * ```\n */\nexport const backendExampleDomainService = new BackendExampleDomainService();\n\n// Legacy aliases for backward compatibility\nexport { backendExampleDomainService as backendExampleService };\nexport { backendExampleDomainService as exampleService };\n","/**\n * Example Frontend Service\n *\n * Demonstrates extending BaseFrontendDomainService which provides:\n * - Automatic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Store integration (Zustand-compatible)\n * - Error handling with @plyaz/errors\n * - Event emission and subscription\n * - Loading/error state management\n * - Automatic DTO validation and mapping via validator and mapper\n *\n * This service only needs to:\n * - Set eventPrefix for event emission\n * - Add any custom domain methods (e.g., polling)\n * - Override lifecycle hooks if needed\n *\n * All standard CRUD operations are inherited:\n * - fetchAll(query?) - Inherited from BaseFrontendDomainService\n * - fetchById(id) - Inherited from BaseFrontendDomainService\n * - create(data) - Inherited from BaseFrontendDomainService\n * - update(id, data) - Inherited from BaseFrontendDomainService\n * - delete(id) - Inherited from BaseFrontendDomainService\n *\n * Runtime: Frontend only (Browser/React/Next.js)\n *\n * @example\n * ```tsx\n * // Service automatically gets stores via ServiceRegistry injection\n * const service = await ServiceRegistry.getAsync<FrontendExampleDomainService>('example');\n *\n * // Or create directly (stores injected if configured)\n * const service = new FrontendExampleDomainService({\n * enabled: true,\n * apiBasePath: '/api/examples',\n * });\n *\n * // Use inherited CRUD methods\n * const items = await service.fetchAll();\n * const activeItems = await service.fetchAll({ status: 'active' });\n * const item = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.update(item.id, { amount: 200 });\n * await service.delete(item.id);\n * ```\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n} from '@plyaz/types/examples';\nimport { BaseFrontendDomainService } from '../base';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default polling interval in milliseconds (30 seconds) */\nconst DEFAULT_POLLING_INTERVAL_MS = 30000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Store/Config/Event Types - Re-exported from @plyaz/types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Re-export types from @plyaz/types\nexport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\n\n// Import for local use\nimport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig as _ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\nimport type { CoreServiceCreateOptions } from '@plyaz/types/core';\nimport type { CoreBaseValidatorInstance } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Frontend Service\n *\n * Extends BaseFrontendDomainService with all generic types:\n * - TConfig: ExampleFrontendServiceConfig\n * - TStore: ExampleFrontendStoreSlice\n * - TData: ExampleFrontendStoreData\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class FrontendExampleDomainService extends BaseFrontendDomainService<\n _ExampleFrontendServiceConfig,\n ExampleFrontendStoreSlice,\n ExampleFrontendStoreData,\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n InstanceType<typeof ExampleMapperClass>,\n CoreBaseValidatorInstance,\n void // TDeleteResult - delete returns void (no response body)\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'example';\n\n /**\n * Primary store key - the store this service can mutate\n */\n protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n\n /**\n * Read-only store keys - inherits error and featureFlags from base\n * No need to redeclare them - they're always included by default\n */\n // protected readStoreKeys = [...super.readStoreKeys]; // Already includes ERROR, FEATURE_FLAGS\n\n // ─────────────────────────────────────────────────────────────────────────\n // Domain-Specific Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static: Service Registry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.EXAMPLE_FRONTEND;\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n * Creates and initializes the service instance.\n */\n static async create(\n config: _ExampleFrontendServiceConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendExampleDomainService> {\n const mergedConfig: _ExampleFrontendServiceConfig = {\n ...config,\n apiBasePath: config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/api/examples',\n };\n\n const service = new FrontendExampleDomainService(mergedConfig, options);\n\n if (mergedConfig.autoFetch) {\n await service.fetchAll();\n }\n\n return service;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(config: _ExampleFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n const apiBasePath = config.apiBasePath ?? '/api/examples';\n\n super({\n serviceName: 'ExampleFrontendService',\n supportedRuntimes: ['frontend'],\n serviceConfig: {\n enabled: true,\n apiBasePath,\n autoFetch: false,\n pollingInterval: 0,\n ...config,\n // Fetchers - using apiClient directly for testing/example purposes\n // In production, these would be imported from @plyaz/api services\n // Note: Validation is handled by validator class, mapping by mapper class\n fetchers: {\n fetchAll: async query => {\n // Pass query parameters to the API endpoint\n return this.apiClient.get<ExampleResponseDTO[]>(apiBasePath, {\n params: query,\n }) as ReturnType<typeof this.apiClient.get<ExampleResponseDTO[]>>;\n },\n fetchById: async id => {\n return this.apiClient.get<ExampleResponseDTO>(`${apiBasePath}/${id}`) as ReturnType<\n typeof this.apiClient.get<ExampleResponseDTO>\n >;\n },\n create: async data => {\n return this.apiClient.post<ExampleResponseDTO>(apiBasePath, data) as ReturnType<\n typeof this.apiClient.post<ExampleResponseDTO>\n >;\n },\n update: async payload => {\n const { id, data } = payload!; // Validated & mapped by base class\n return this.apiClient.patch<ExampleResponseDTO>(\n `${apiBasePath}/${id}`,\n data\n ) as ReturnType<typeof this.apiClient.patch<ExampleResponseDTO>>;\n },\n delete: async id => {\n return this.apiClient.delete(`${apiBasePath}/${id}`);\n },\n },\n // Store handlers - customize how data syncs to store\n // Use domain-specific methods or call other stores:\n // storeHandlers: {\n // setData: (store, data) => {\n // store.setData(data);\n // // Can also call domain-specific methods or other stores\n // // store.selectItem(data.selectedId);\n // },\n // updateData: (store, data) => store.updateData(data),\n // setLoading: (store, isLoading) => store.setLoading(isLoading),\n // addData: (store, item) => store.addData(item),\n // updateDataById: (store, id, item) => store.updateDataById(id, item),\n // removeData: (store, id) => store.removeData(id),\n // },\n // Or disable store sync: storeHandlers: { disabled: true }\n },\n mapperClass: ExampleMapperClass,\n injected: options?.injected,\n });\n\n // Start polling if configured\n if (this.config.pollingInterval && this.config.pollingInterval > 0) {\n this.startPolling();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Implementations (Required by BaseDomainService)\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && typeof window !== 'undefined';\n }\n\n dispose(): void {\n this.stopPolling();\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional Override Examples)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * After fetchAll - emit event (store sync handled automatically)\n * Note: Base class automatically calls syncToStores() which uses storeHandlers\n */\n protected override async afterFetchAll(entities: ExampleEntity[]): Promise<void> {\n // Store sync happens automatically via base class + storeHandlers\n // Just emit domain-specific event\n CoreEventManager.emit('example:store:synced', { items: entities });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional: Manual Store Updates (Alternative to storeHandlers)\n // ─────────────────────────────────────────────────────────────────────────\n //\n // Uncomment these for fine-grained control over store updates:\n //\n // protected override async afterCreate(entity: ExampleEntity): Promise<void> {\n // // Manual optimistic update for immediate UI feedback\n // this.primaryStore.addItem?.(entity);\n // }\n //\n // protected override async afterUpdate(id: string, entity: ExampleEntity): Promise<void> {\n // // Targeted update using domain-specific method\n // this.primaryStore.updateItem?.(id, entity);\n // }\n //\n // protected override async afterDelete<TInput>(id: TInput): Promise<void> {\n // // Remove from store using domain-specific method\n // this.primaryStore.removeItem?.(String(id));\n // }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Custom Domain Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to service events\n *\n * @example\n * ```tsx\n * const unsubscribe = service.on('example:created', (data) => {\n * console.log('Item created:', data.entity);\n * });\n *\n * // Later: cleanup\n * unsubscribe();\n * ```\n */\n on(event: ExampleFrontendEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Polling (Domain-Specific Feature)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Start polling for updates\n * Domain-specific feature - not part of base class\n */\n startPolling(): void {\n if (this.pollingTimer) return;\n\n const interval = this.config.pollingInterval ?? DEFAULT_POLLING_INTERVAL_MS;\n this.pollingTimer = setInterval(() => {\n this.fetchAll().catch(error => {\n this.logError('Polling fetch failed', { error });\n });\n }, interval);\n\n this.logDebug('Polling started', { interval });\n }\n\n /**\n * Stop polling\n */\n stopPolling(): void {\n if (this.pollingTimer) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n this.logDebug('Polling stopped');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - fetchAll() with Query Examples\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Fetch all examples with optional filters\n * Demonstrates the fetchAll() method with typed query parameters\n *\n * @param filters - Optional query filters (status, pagination, sorting)\n * @returns Promise resolving to array of ExampleEntity\n *\n * @example\n * ```typescript\n * // Fetch all active examples\n * const activeExamples = await service.getExamples({ status: 'active' });\n *\n * // Fetch archived examples with pagination\n * const archivedExamples = await service.getExamples({\n * status: 'archived',\n * page: 2,\n * limit: 10\n * });\n *\n * // Fetch all examples sorted by name\n * const sortedExamples = await service.getExamples({\n * sort_by: 'name',\n * sort_order: 'asc'\n * });\n * ```\n */\n async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n return this.fetchAll(filters); // Properly typed!\n }\n\n /**\n * Demo: Fetch active examples only\n * Convenience method demonstrating filtering\n */\n async getActiveExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'active' });\n }\n\n /**\n * Demo: Fetch draft examples only\n * Convenience method demonstrating filtering\n */\n async getDraftExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'draft' });\n }\n\n /**\n * Demo: Fetch archived examples only\n * Convenience method demonstrating filtering\n */\n async getArchivedExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'archived' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // NOTE: CRUD Methods Are Inherited from BaseFrontendDomainService\n // ─────────────────────────────────────────────────────────────────────────\n //\n // The following methods are available but NOT implemented here:\n // - fetchAll(query?: QueryExampleDTO): Promise<ExampleEntity[]>\n // - fetchById(id: string): Promise<ExampleEntity | null>\n // - create(data: unknown): Promise<ExampleEntity>\n // - update(id: string, data: unknown): Promise<ExampleEntity>\n // - delete(id: string): Promise<void>\n //\n // All API calls → validator → mapper → store sync → events are handled automatically!\n // All events are emitted automatically with 'example:' prefix!\n // ─────────────────────────────────────────────────────────────────────────\n}\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n ObservabilityProvider,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n abstract readonly provider: ObservabilityProvider;\n abstract readonly name: string;\n\n protected _isInitialized = false;\n protected _config: ObservabilityAdapterConfig | null = null;\n protected readonly logger: PackageLogger;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityAdapter',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get config(): ObservabilityAdapterConfig | null {\n return this._config;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn(`${this.name} already initialized`);\n return;\n }\n\n this._config = config;\n\n if (config.enabled === false) {\n this.logger.info(`${this.name} disabled by configuration`);\n return;\n }\n\n await this.doInitialize(config);\n this._isInitialized = true;\n this.logger.info(`${this.name} initialized`, {\n provider: this.provider,\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n\n async shutdown(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n\n await this.flush();\n await this.doShutdown();\n this._isInitialized = false;\n this.logger.info(`${this.name} shut down`);\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this._isInitialized) {\n return false;\n }\n return this.doHealthCheck();\n }\n\n // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n protected abstract doShutdown(): Promise<void>;\n protected abstract doHealthCheck(): Promise<boolean>;\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const metricWithDefaults = this.applyDefaultTags(metric);\n await this.doRecordMetric(metricWithDefaults);\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.recordMetric({\n type: 'counter',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'gauge',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'histogram',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n if (!this._isInitialized || this._config?.enabled === false) {\n return this.createNoopSpan(options);\n }\n\n // Apply sampling\n if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n if (Math.random() > this._config.samplingRate) {\n return this.createNoopSpan(options);\n }\n }\n\n return this.doStartSpan(options);\n }\n\n getActiveSpan(): Span | null {\n if (!this._isInitialized) {\n return null;\n }\n return this.doGetActiveSpan();\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const span = this.startSpan(options);\n try {\n const result = await fn(span);\n span.setStatus('ok');\n return result;\n } catch (error) {\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n protected abstract doStartSpan(options: SpanOptions): Span;\n protected abstract doGetActiveSpan(): Span | null;\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const entryWithDefaults = {\n ...entry,\n timestamp: entry.timestamp ?? Date.now(),\n service: entry.service ?? this._config?.serviceName,\n };\n\n await this.doLog(entryWithDefaults);\n }\n\n protected abstract doLog(entry: LogEntry): Promise<void>;\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const eventWithDefaults = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n tags: { ...this._config?.defaultTags, ...event.tags },\n };\n\n await this.doSendEvent(eventWithDefaults);\n }\n\n protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n // ─── Flush ─────────────────────────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n await this.doFlush();\n }\n\n protected abstract doFlush(): Promise<void>;\n\n // ─── Helpers ───────────────────────────────────────────────────────────────\n\n /**\n * Apply default tags to a metric\n */\n protected applyDefaultTags(metric: Metric): Metric {\n if (!this._config?.defaultTags) {\n return metric;\n }\n\n return {\n ...metric,\n tags: {\n ...this._config.defaultTags,\n ...metric.tags,\n },\n };\n }\n\n /**\n * Create a no-op span (for disabled/sampled-out traces)\n */\n // eslint-disable-next-line no-unused-vars\n protected createNoopSpan(_options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n\n return {\n context,\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n readonly provider = 'noop' as const;\n readonly name = 'NoopAdapter';\n\n protected async doInitialize(): Promise<void> {}\n protected async doShutdown(): Promise<void> {}\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n protected async doRecordMetric(): Promise<void> {}\n protected doStartSpan(options: SpanOptions): Span {\n return this.createNoopSpan(options);\n }\n protected doGetActiveSpan(): Span | null {\n return null;\n }\n protected async doLog(): Promise<void> {}\n protected async doSendEvent(): Promise<void> {}\n protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n SpanAttributes,\n SpanEvent,\n SpanStatus,\n ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n readonly provider = 'console' as const;\n readonly name = 'LoggerAdapter';\n\n private observabilityLogger!: PackageLogger;\n private logMetrics = true;\n private logSpans = true;\n private logEvents = true;\n\n protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n const consoleConfig = config as ConsoleAdapterConfig;\n\n // Create dedicated logger for observability output\n this.observabilityLogger = new PackageLogger({\n packageName: 'observability',\n service: config.serviceName ?? 'LoggerAdapter',\n environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n minLevel: consoleConfig.logLevel ?? 'debug',\n });\n\n // All logging enabled by default\n this.logMetrics = true;\n this.logSpans = true;\n this.logEvents = true;\n }\n\n protected async doShutdown(): Promise<void> {\n // Logger doesn't need explicit shutdown\n }\n\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n\n protected async doRecordMetric(metric: Metric): Promise<void> {\n if (!this.logMetrics) return;\n\n this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n metricType: metric.type,\n metricName: metric.name,\n value: 'value' in metric ? metric.value : undefined,\n unit: metric.unit,\n tags: metric.tags,\n });\n }\n\n protected doStartSpan(options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: options.parentContext?.spanId,\n };\n\n const startTime = options.startTime ?? Date.now();\n\n if (this.logSpans) {\n this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n parentSpanId: context.parentSpanId,\n kind: options.kind,\n attributes: options.attributes,\n });\n }\n\n const events: SpanEvent[] = [];\n let attributes: SpanAttributes = { ...options.attributes };\n let status: SpanStatus = 'unset';\n let statusMessage: string | undefined;\n\n const logSpans = this.logSpans;\n const logger = this.observabilityLogger;\n\n return {\n context,\n setAttribute: (key, value) => {\n attributes[key] = value;\n },\n setAttributes: attrs => {\n attributes = { ...attributes, ...attrs };\n },\n addEvent: event => {\n events.push(event);\n if (logSpans) {\n logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n eventAttributes: event.attributes,\n });\n }\n },\n setStatus: (s, message) => {\n status = s;\n statusMessage = message;\n },\n end: endTime => {\n const duration = (endTime ?? Date.now()) - startTime;\n if (logSpans) {\n const logMethod = status === 'error' ? 'warn' : 'debug';\n logger[logMethod](`[SPAN END] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n durationMs: duration,\n status,\n statusMessage,\n attributes,\n eventCount: events.length,\n });\n }\n },\n recordException: error => {\n if (logSpans) {\n logger.error(`[SPAN ERROR] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n error: error.message,\n stack: error.stack,\n });\n }\n },\n };\n }\n\n protected doGetActiveSpan(): Span | null {\n return null; // Logger adapter doesn't track active spans\n }\n\n protected async doLog(entry: LogEntry): Promise<void> {\n const meta = {\n service: entry.service,\n traceId: entry.traceId,\n spanId: entry.spanId,\n ...entry.context,\n };\n\n // Map observability log levels to logger methods\n switch (entry.level) {\n case 'debug':\n this.observabilityLogger.debug(entry.message, meta);\n break;\n case 'info':\n this.observabilityLogger.info(entry.message, meta);\n break;\n case 'warn':\n this.observabilityLogger.warn(entry.message, meta);\n break;\n case 'error':\n this.observabilityLogger.error(entry.message, meta);\n break;\n case 'fatal':\n this.observabilityLogger.fatal(entry.message, meta);\n break;\n }\n }\n\n protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this.logEvents) return;\n\n this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n eventName: event.name,\n properties: event.properties,\n tags: event.tags,\n });\n }\n\n protected async doFlush(): Promise<void> {\n // Logger handles its own buffering/flushing\n }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n OperationContext,\n MonitoringOperationResult,\n AdapterWithPriority,\n AdapterEntry,\n ObservabilityServiceConfig,\n ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n * mode: 'parallel',\n * adapters: [datadogAdapter], // Logger added automatically\n * serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n readonly provider = 'custom' as const;\n readonly name = 'ObservabilityService';\n\n private _isInitialized = false;\n private _config: ObservabilityServiceConfig | null = null;\n private readonly logger: PackageLogger;\n private readonly adapterEntries: AdapterEntry[] = [];\n private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n private readonly noopAdapter = new NoopAdapter();\n private loggerAdapter: LoggerAdapter | null = null;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityService',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Check if service has at least one working adapter\n */\n get isReady(): boolean {\n return this.adapterEntries.some(e => e.adapter.isInitialized);\n }\n\n /**\n * Get all adapters (for compatibility)\n */\n private get adapters(): ObservabilityAdapter[] {\n return this.adapterEntries.map(e => e.adapter);\n }\n\n /**\n * Get initialized adapter entries\n */\n private get initializedEntries(): AdapterEntry[] {\n return this.adapterEntries.filter(e => e.adapter.isInitialized);\n }\n\n /**\n * Get primary (non-failover) initialized adapters\n */\n private get primaryEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => !e.failover);\n }\n\n /**\n * Get failover initialized adapters\n */\n private get failoverEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => e.failover);\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /**\n * Check if input is an adapter with priority config\n */\n private isAdapterWithPriority(\n input: ObservabilityAdapter | AdapterWithPriority\n ): input is AdapterWithPriority {\n return (\n 'adapter' in input &&\n typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n );\n }\n\n /**\n * Normalize adapter input to adapter with priority and failover config\n */\n private normalizeAdapter(\n input: ObservabilityAdapter | AdapterWithPriority,\n defaultPriority: number\n ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n if (this.isAdapterWithPriority(input)) {\n return {\n adapter: input.adapter,\n priority: input.priority ?? defaultPriority,\n failover: input.failover ?? false,\n };\n }\n return { adapter: input, priority: defaultPriority, failover: false };\n }\n\n /**\n * Initialize the observability service.\n * Logger adapter is always added by default unless explicitly disabled.\n * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n */\n async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn('ObservabilityService already initialized');\n return;\n }\n\n this._config = config;\n this.mode = config.mode ?? 'parallel';\n\n // Collect adapters with priorities\n const entries: AdapterEntry[] = [];\n\n // Add provided adapters\n if (config.adapter) {\n entries.push(this.normalizeAdapter(config.adapter, 0));\n }\n if (config.adapters) {\n config.adapters.forEach((a, index) => {\n // Default priority decreases with array position for stable sorting\n entries.push(this.normalizeAdapter(a, -index));\n });\n }\n\n // Always add logger adapter by default (for console output)\n // Unless there's already a console/logger adapter\n const hasLoggerAdapter = entries.some(\n e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n );\n if (!hasLoggerAdapter) {\n this.loggerAdapter = new LoggerAdapter();\n await this.loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: config.environment,\n defaultTags: config.defaultTags,\n });\n // Logger is a failover by default with lowest priority\n entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n }\n\n // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n entries.sort((a, b) => {\n // Primary adapters come before failover\n if (a.failover !== b.failover) {\n return a.failover ? 1 : -1;\n }\n // Within same category, sort by priority (higher first)\n return b.priority - a.priority;\n });\n\n // Store sorted entries\n this.adapterEntries.push(...entries);\n\n this._isInitialized = true;\n\n this.logger.debug('ObservabilityService initialized', {\n mode: this.mode,\n adapterCount: this.adapterEntries.length,\n primaryCount: this.primaryEntries.length,\n failoverCount: this.failoverEntries.length,\n adapters: this.adapterEntries.map(e => ({\n name: e.adapter.name,\n provider: e.adapter.provider,\n priority: e.priority,\n failover: e.failover,\n initialized: e.adapter.isInitialized,\n })),\n });\n }\n\n async shutdown(): Promise<void> {\n await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n this._isInitialized = false;\n this.logger.info('ObservabilityService shut down');\n }\n\n async isHealthy(): Promise<boolean> {\n if (this.adapters.length === 0) {\n return false;\n }\n\n const results = await Promise.all(\n this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n );\n\n // For parallel mode, all must be healthy; for priority/single, at least one\n return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n }\n\n async flush(): Promise<void> {\n await this.executeOnAdapters('flush', adapter => adapter.flush());\n }\n\n // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n private get config(): ObservabilityServiceConfig {\n return this._config ?? {};\n }\n\n private async executeOnAdapters<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>\n ): Promise<void> {\n const entries = this.initializedEntries;\n if (entries.length === 0) {\n return;\n }\n\n const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n switch (this.mode) {\n case 'parallel':\n await this.executeParallelWithFailover(operation, fn, timeout);\n break;\n case 'priority':\n await this.executePriorityWithFailover(operation, fn, timeout);\n break;\n case 'single':\n default:\n await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n break;\n }\n }\n\n private async executeSingle<T>(\n operation: string,\n adapter: ObservabilityAdapter,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n try {\n await this.withTimeout(fn(adapter), timeout);\n } catch (error) {\n this.logger.error(`${operation} failed on ${adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Execute on primary adapters in parallel.\n * If all primary adapters fail, execute on failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executeParallelWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Execute on primary adapters\n if (primary.length > 0) {\n const results = await Promise.allSettled(\n primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n )\n .filter(Boolean);\n\n const allFailed = errors.length === primary.length;\n\n if (errors.length > 0 && !allFailed) {\n this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n }\n\n // If all primary adapters failed, use failover\n if (allFailed && failover.length > 0) {\n this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n return;\n }\n\n if (this.config.failOnAnyError && errors.length > 0) {\n throw new CorePackageError(\n `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n } else if (failover.length > 0) {\n // No primary adapters, use failover directly\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n }\n }\n\n private async executeParallel<T>(\n operation: string,\n adapters: ObservabilityAdapter[],\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const results = await Promise.allSettled(\n adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n )\n .filter(Boolean);\n\n if (errors.length > 0) {\n this.logger.warn(`${operation} failed on some adapters`, { errors });\n }\n }\n\n /**\n * Execute on primary adapters in priority order.\n * If all primary adapters fail, try failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executePriorityWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Try primary adapters first\n for (const entry of primary) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success - stop trying\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Error';\n const shouldFallback =\n !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n if (shouldFallback) {\n this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n throw error;\n }\n }\n\n // All primary failed, try failover adapters\n for (const entry of failover) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success\n } catch (error) {\n this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n // Continue to next failover adapter\n }\n }\n\n this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n }\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.executeOnAdapters('incrementCounter', adapter =>\n adapter.incrementCounter(name, value, tags)\n );\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('recordHistogram', adapter =>\n adapter.recordHistogram(name, value, tags)\n );\n }\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n // For tracing, use first initialized adapter\n const entry = this.initializedEntries[0];\n return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const entry = this.initializedEntries[0];\n if (!entry) {\n return fn(this.noopAdapter.startSpan(options));\n }\n return entry.adapter.withSpan(options, fn);\n }\n\n getActiveSpan(): Span | null {\n const entry = this.initializedEntries[0];\n return entry?.adapter.getActiveSpan() ?? null;\n }\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n await this.executeOnAdapters('log', adapter => adapter.log(entry));\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n }\n\n // ─── Service Operation Tracking ────────────────────────────────────────────\n\n /**\n * Track a service operation with automatic metrics and tracing.\n *\n * @example\n * ```typescript\n * const { result, metrics } = await observability.trackOperation(\n * {\n * serviceName: 'UserService',\n * operation: 'create',\n * entityType: 'user',\n * startTime: Date.now(),\n * },\n * async () => {\n * return await this.repository.create(userData);\n * }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async trackOperation<T>(\n context: OperationContext,\n operation: () => Promise<T>\n ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n const startTime = context.startTime ?? Date.now();\n\n // Start span\n const span = this.startSpan({\n name: `${context.serviceName}.${context.operation}`,\n attributes: {\n 'service.name': context.serviceName,\n 'operation.name': context.operation,\n ...(context.entityType && { 'entity.type': context.entityType }),\n ...(context.entityId && { 'entity.id': context.entityId }),\n ...context.attributes,\n },\n parentContext: context.parentContext,\n });\n\n // Increment operation counter\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n service: context.serviceName,\n operation: context.operation,\n ...(context.entityType && { entity_type: context.entityType }),\n });\n\n try {\n const result = await operation();\n const duration = Date.now() - startTime;\n\n span.setStatus('ok');\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'success',\n });\n\n return {\n result,\n metrics: { success: true, duration, data: result },\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n service: context.serviceName,\n operation: context.operation,\n error_type: error instanceof Error ? error.name : 'UnknownError',\n });\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter],\n * serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n * mode: 'priority',\n * adapters: [datadogAdapter, grafanaAdapter],\n * serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n const service = new ObservabilityService();\n await service.initialize(config);\n return service;\n}\n","/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n * ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport type { CacheConfig } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type { CoreDbServiceConfig } from '../services/DbService';\nimport type {\n CoreDomainServiceInstance,\n CoreServiceCreateOptions,\n CoreServiceEntry,\n CoreServiceInitConfig,\n CoreServiceRegistryConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreRuntimeEnvironment,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { CacheManager } from '../base/cache';\nimport { createObservabilityService } from '../base/observability';\nimport { CacheService } from '../services/CacheService';\nimport { DbService } from '../services/DbService';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { StorageService, type CoreStorageConfig } from '../services/StorageService';\nimport { NotificationService, type CoreNotificationConfig } from '../services/NotificationService';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n entry: CoreServiceEntry;\n initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n entry: CoreServiceEntry;\n isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n private static readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'ServiceRegistry',\n });\n\n /** Initialized singleton service instances by key */\n private static _services = new Map<string, CoreDomainServiceInstance>();\n\n /** Pending services for lazy initialization */\n private static _pending = new Map<string, PendingService>();\n\n /** Service metadata (config, singleton flag) by key */\n private static _metadata = new Map<string, ServiceMetadata>();\n\n /** Global environment */\n private static _environment: 'production' | 'staging' | 'development' | 'test' = 'development';\n\n /** Runtime environment (node, browser, bun, etc.) */\n private static _runtime: CoreRuntimeEnvironment = 'node';\n\n /** Global API client options */\n private static _apiClientOptions: ApiClientOptions | null = null;\n\n /** Global database config */\n private static _dbConfig: Partial<CoreDbServiceConfig> | null = null;\n\n /** Global cache config */\n private static _cacheConfig: CoreCacheConfig | null = null;\n\n /** Global observability config */\n private static _observabilityConfig: CoreObservabilityConfig | null = null;\n\n /** Global observability adapter instance */\n private static _observabilityInstance: ObservabilityAdapter | null = null;\n\n /** Global storage config */\n private static _storageConfig: CoreStorageConfig | null = null;\n\n /** Global notifications config */\n private static _notificationsConfig: CoreNotificationConfig | null = null;\n\n /** Store registry interface from Core (type-safe) */\n private static _storeRegistry: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null = null;\n\n /** Initialization promises (for concurrent access during lazy init) */\n private static _initPromises = new Map<string, Promise<CoreDomainServiceInstance>>();\n\n // ─────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the service registry with the provided configuration.\n *\n * @param config - Registry configuration with services to initialize\n *\n * @example\n * ```typescript\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n * ],\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n ServiceRegistry._environment = config.environment ?? 'development';\n ServiceRegistry._runtime = config.runtime ?? 'node';\n ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n ServiceRegistry._dbConfig = config.db ?? null;\n ServiceRegistry._cacheConfig = config.cache ?? null;\n ServiceRegistry._observabilityConfig = config.observability ?? null;\n ServiceRegistry._storageConfig = config.storage ?? null;\n ServiceRegistry._notificationsConfig = config.notifications ?? null;\n ServiceRegistry._storeRegistry = config.stores ?? null;\n\n const immediatePromises: Promise<void>[] = [];\n\n for (const entry of config.services) {\n const serviceKey = entry.service.serviceKey;\n const initWhen = entry.config.initWhen ?? 'immediate';\n const enabled = entry.config.enabled !== false;\n const isSingleton = entry.config.singleton !== false; // Default: true\n\n // Store metadata for all services (even disabled)\n ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n // Skip disabled services\n if (!enabled) {\n ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n continue;\n }\n\n // Handle initialization timing\n if (initWhen === 'immediate' && isSingleton) {\n // Only auto-initialize singletons\n immediatePromises.push(\n ServiceRegistry.initializeService(entry).then(() => {\n ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n })\n );\n } else if (isSingleton) {\n // Store for lazy/conditional initialization\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n } else {\n // Non-singleton: just store metadata, create on demand via create()\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered (non-singleton, use create())`\n );\n }\n }\n\n // Wait for all immediate initializations\n await Promise.all(immediatePromises);\n\n const initializedKeys = [...ServiceRegistry._services.keys()];\n const pendingKeys = [...ServiceRegistry._pending.keys()];\n const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n\n ServiceRegistry.logger.info('Service registry initialized', {\n initialized: initializedKeys,\n pending: pendingKeys,\n nonSingleton: nonSingletonKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a singleton service instance by key (synchronous).\n * Throws if the service is not initialized or is non-singleton.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws CorePackageError if service not found, not initialized, or non-singleton\n *\n * @example\n * ```typescript\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n return service as T;\n }\n\n // Check if non-singleton (must use create())\n const metadata = ServiceRegistry._metadata.get(key);\n if (metadata && !metadata.isSingleton) {\n throw new CorePackageError(\n `Service '${key}' is configured as non-singleton. ` +\n `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n throw new CorePackageError(\n `Service '${key}' is configured for lazy initialization. ` +\n `Use await ServiceRegistry.getAsync('${key}') instead.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Create a new instance of a service.\n * Use this for non-singleton services or when you need a fresh instance.\n *\n * Note: The caller is responsible for disposing the returned instance.\n *\n * @param key - Service key\n * @param configOverrides - Optional config overrides for this instance\n * @returns Promise resolving to a new service instance\n *\n * @example\n * ```typescript\n * // Non-singleton service - always creates new instance\n * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n * instance1 !== instance2; // true\n *\n * // With config overrides\n * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n * apiClient: { baseURL: 'https://custom-api.com' },\n * });\n *\n * // Don't forget to dispose when done!\n * instance1.dispose();\n * instance2.dispose();\n * ```\n */\n static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string,\n configOverrides?: Partial<CoreServiceInitConfig>\n ): Promise<T> {\n const metadata = ServiceRegistry._metadata.get(key);\n if (!metadata) {\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Merge config with overrides\n const mergedEntry: CoreServiceEntry = {\n service: metadata.entry.service,\n config: { ...metadata.entry.config, ...configOverrides },\n };\n\n // Create new instance (don't store in registry)\n return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n }\n\n /**\n * Get a service instance by key with async initialization if needed.\n * Use this for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n *\n * @example\n * ```typescript\n * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n * const entities = await example.getAll();\n * ```\n */\n static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n // Return immediately if already initialized\n const existing = ServiceRegistry._services.get(key);\n if (existing) {\n return existing as T;\n }\n\n // Check for in-progress initialization\n const inProgress = ServiceRegistry._initPromises.get(key);\n if (inProgress) {\n return (await inProgress) as T;\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n // Handle conditional initialization\n if (typeof pending.initWhen === 'function') {\n const shouldInit = await pending.initWhen();\n if (!shouldInit) {\n throw new CorePackageError(\n `Service '${key}' initialization condition returned false`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // Initialize and return\n const service = await ServiceRegistry.initializeService(pending.entry);\n ServiceRegistry._pending.delete(key);\n return service as T;\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Check if a service is registered (either initialized or pending).\n *\n * @param key - Service key\n */\n static has(key: string): boolean {\n return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n }\n\n /**\n * Check if a service is initialized and ready.\n *\n * @param key - Service key\n */\n static isInitialized(key: string): boolean {\n return ServiceRegistry._services.has(key);\n }\n\n /**\n * Get all initialized service keys.\n */\n static getInitializedKeys(): string[] {\n return [...ServiceRegistry._services.keys()];\n }\n\n /**\n * Get all pending (lazy) service keys.\n */\n static getPendingKeys(): string[] {\n return [...ServiceRegistry._pending.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Service Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Build API client options and instance for service */\n // eslint-disable-next-line complexity\n private static async buildApiClientOptions(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n const dedicatedApiClient = config.dedicatedApiClient;\n const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const options: ApiClientOptions | undefined = isDedicated\n ? typeof dedicatedApiClient === 'object'\n ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n : (ServiceRegistry._apiClientOptions ?? undefined)\n : (ServiceRegistry._apiClientOptions ?? undefined);\n\n if (!options) {\n return undefined;\n }\n\n // Get or create API client instance\n let apiInstance: unknown;\n if (isDedicated && options) {\n // Create dedicated API client instance for this service\n try {\n // Use the global environment from initialization\n const envConfig = {\n env: ServiceRegistry._environment,\n setAsDefault: false, // Dedicated instances should not become default\n };\n apiInstance = await ApiClientService.createInstance(envConfig, options);\n ServiceRegistry.logger.debug(\n `Created dedicated API client instance for service '${serviceKey}'`,\n {\n environment: ServiceRegistry._environment,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated API client for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared API client\n try {\n apiInstance = ApiClientService.getClient();\n } catch {\n ServiceRegistry.logger.debug(\n `Global API client not initialized, service '${serviceKey}' will not have API`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n options,\n instance: apiInstance,\n };\n }\n\n /** Build DB config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildDbConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n { dedicated: boolean; config?: Partial<CoreDbServiceConfig>; instance?: DbService } | undefined\n > {\n const dedicatedDb = config.dedicatedDb;\n const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: DB should only be injected for backend services\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have database access.`\n );\n return undefined; // Skip DB injection for non-backend runtimes\n }\n\n const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n ? typeof dedicatedDb === 'object'\n ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n : (ServiceRegistry._dbConfig ?? undefined)\n : (ServiceRegistry._dbConfig ?? undefined);\n\n if (!dbConfig) {\n return undefined;\n }\n\n // Get or create DB instance\n let dbInstance: DbService | undefined;\n if (isDedicated && dbConfig) {\n // Create dedicated database instance for this service\n try {\n dbInstance = await DbService.createInstance(dbConfig as CoreDbServiceConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated database instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated database instance for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared database\n try {\n dbInstance = DbService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global DB not initialized, service '${serviceKey}' will not have DB`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: dbConfig,\n instance: dbInstance,\n };\n }\n\n /** Build cache config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static buildCacheConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): { dedicated: boolean; config?: CoreCacheConfig; instance?: CacheManager } | undefined {\n const dedicatedCache = config.dedicatedCache;\n const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const cacheConfig: CoreCacheConfig | undefined = isDedicated\n ? typeof dedicatedCache === 'object'\n ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n : (ServiceRegistry._cacheConfig ?? undefined)\n : (ServiceRegistry._cacheConfig ?? undefined);\n\n if (!cacheConfig) {\n return undefined;\n }\n\n // Runtime validation: Cache on frontend is less common (store + react-query preferred)\n const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if (isFrontendRuntime && cacheConfig.strategy === 'redis') {\n ServiceRegistry.logger.info(\n `Service '${serviceKey}' is requesting Redis cache in '${ServiceRegistry._runtime}' runtime. ` +\n `Note: Frontend services typically use Zustand store + react-query for caching. ` +\n `Redis cache requires backend connection. Consider using 'memory' strategy or state management instead.`\n );\n }\n\n // Create or get cache manager instance\n let cacheInstance: CacheManager | undefined;\n if (isDedicated) {\n // Create dedicated cache manager for this service\n try {\n const completeCacheConfig: CacheConfig = {\n ...cacheConfig,\n ttl: cacheConfig.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n };\n cacheInstance = new CacheManager(completeCacheConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated cache instance for service '${serviceKey}'`,\n {\n strategy: cacheConfig.strategy,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated cache for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Try to get global cache manager\n try {\n cacheInstance = CacheService.getInstance().getCacheManager();\n } catch {\n ServiceRegistry.logger.debug(\n `Global cache not initialized, service '${serviceKey}' will not have cache`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: cacheConfig,\n instance: cacheInstance,\n };\n }\n\n /** Build observability config and instance for service */\n // eslint-disable-next-line complexity\n private static buildObservabilityConfig(\n config: CoreServiceInitConfig,\n // eslint-disable-next-line no-unused-vars\n _entry: CoreServiceEntry\n ):\n | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n | undefined {\n const dedicatedObservability = config.dedicatedObservability;\n const isDedicated =\n dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n ? typeof dedicatedObservability === 'object'\n ? ({\n ...ServiceRegistry._observabilityConfig,\n ...dedicatedObservability,\n } as CoreObservabilityConfig)\n : (ServiceRegistry._observabilityConfig ?? undefined)\n : (ServiceRegistry._observabilityConfig ?? undefined);\n\n if (!observabilityConfig) {\n return undefined;\n }\n\n // Instance will be set async if dedicated\n return {\n dedicated: isDedicated,\n config: observabilityConfig,\n instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n };\n }\n\n /** Build storage config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildStorageConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n { dedicated: boolean; config?: CoreStorageConfig; instance?: StorageService } | undefined\n > {\n const dedicatedStorage = config.dedicatedStorage;\n const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Storage is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have storage access.`\n );\n return undefined;\n }\n\n const storageConfig: CoreStorageConfig | undefined = isDedicated\n ? typeof dedicatedStorage === 'object'\n ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n : (ServiceRegistry._storageConfig ?? undefined)\n : (ServiceRegistry._storageConfig ?? undefined);\n\n if (!storageConfig) {\n return undefined;\n }\n\n // Get or create storage instance\n let storageInstance: StorageService | undefined;\n if (isDedicated && storageConfig) {\n try {\n storageInstance = await StorageService.createInstance(storageConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated storage instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated storage instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n storageInstance = StorageService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global storage not initialized, service '${serviceKey}' will not have storage`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: storageConfig,\n instance: storageInstance,\n };\n }\n\n /** Build notifications config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildNotificationsConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreNotificationConfig; instance?: NotificationService }\n | undefined\n > {\n const dedicatedNotifications = config.dedicatedNotifications;\n const isDedicated =\n dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Notifications is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have notifications access.`\n );\n return undefined;\n }\n\n const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n ? typeof dedicatedNotifications === 'object'\n ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n : (ServiceRegistry._notificationsConfig ?? undefined)\n : (ServiceRegistry._notificationsConfig ?? undefined);\n\n if (!notificationsConfig) {\n return undefined;\n }\n\n // Get or create notifications instance\n let notificationsInstance: NotificationService | undefined;\n if (isDedicated && notificationsConfig) {\n try {\n notificationsInstance = await NotificationService.createInstance(notificationsConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated notifications instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n notificationsInstance = NotificationService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: notificationsConfig,\n instance: notificationsInstance,\n };\n }\n\n /**\n * Create a dedicated ObservabilityService instance for a service.\n * Uses the same adapter pattern as global observability but with service-specific config.\n */\n private static async createDedicatedObservability(\n serviceKey: string,\n config: CoreObservabilityConfig\n ): Promise<ObservabilityAdapter | undefined> {\n // Skip if explicitly disabled\n if (config.enabled === false) {\n return undefined;\n }\n\n try {\n // createObservabilityService auto-adds LoggerAdapter as failover\n const dedicatedService = await createObservabilityService({\n mode: config.mode ?? 'parallel',\n serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n environment: config.environment,\n adapters: config.adapters,\n });\n\n ServiceRegistry.logger.debug(\n `Created dedicated ObservabilityService for service '${serviceKey}'`\n );\n\n return dedicatedService;\n } catch (err) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n { error: err instanceof Error ? err.message : String(err) }\n );\n return ServiceRegistry._observabilityInstance ?? undefined;\n }\n }\n\n /**\n * Set the global observability adapter instance.\n * Called by Core.initialize() after creating the adapter.\n */\n static setObservabilityInstance(instance: ObservabilityAdapter): void {\n ServiceRegistry._observabilityInstance = instance;\n ServiceRegistry.logger.debug('Global observability instance set');\n }\n\n /**\n * Get the global observability adapter instance.\n */\n static getObservabilityInstance(): ObservabilityAdapter | null {\n return ServiceRegistry._observabilityInstance;\n }\n\n /**\n * Initialize a single service from an entry.\n * Uses the service class's static create() method.\n * Merges per-service config with global config.\n */\n private static async initializeService(\n entry: CoreServiceEntry,\n storeSingleton = true\n ): Promise<CoreDomainServiceInstance> {\n const { service: ServiceClass, config } = entry;\n const serviceKey = ServiceClass.serviceKey;\n const isSingleton = config.singleton !== false;\n\n // For singletons, check for concurrent initialization\n if (storeSingleton && isSingleton) {\n const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n if (existingPromise) return existingPromise;\n }\n\n const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.set(serviceKey, initPromise);\n }\n\n return initPromise;\n }\n\n /** Build stores for service injection */\n private static buildStoresForService(\n config: CoreServiceInitConfig\n ): Partial<RootStoreSlice> | undefined {\n const allKeys = new Set<keyof RootStoreSlice>();\n\n // Add primary store\n if (config.store) {\n allKeys.add(config.store);\n }\n\n // Add read stores\n if (config.readStores) {\n config.readStores.forEach(key => allKeys.add(key));\n }\n\n if (allKeys.size === 0) {\n return undefined;\n }\n\n if (!ServiceRegistry._storeRegistry) {\n ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n return undefined;\n }\n\n const stores: Partial<RootStoreSlice> = {};\n for (const key of allKeys) {\n const store = ServiceRegistry._storeRegistry.getStore(key);\n if (store) {\n (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n } else {\n ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n }\n }\n\n return Object.keys(stores).length > 0 ? stores : undefined;\n }\n\n /** Perform the actual service initialization */\n // eslint-disable-next-line complexity\n private static async doInitializeService(\n entry: CoreServiceEntry,\n options: { isSingleton: boolean; storeSingleton: boolean }\n ): Promise<CoreDomainServiceInstance> {\n const { service: serviceClass, config } = entry;\n const serviceKey = serviceClass.serviceKey;\n const { isSingleton, storeSingleton } = options;\n\n try {\n ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n // Build dependencies (async operations) with runtime validation\n const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n const db = await ServiceRegistry.buildDbConfig(config, entry);\n const cache = ServiceRegistry.buildCacheConfig(config, entry);\n const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n const stores = ServiceRegistry.buildStoresForService(config);\n\n // Create dedicated observability instance if requested\n let observabilityInstance = observability?.instance;\n if (observability?.dedicated && observability.config) {\n observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n serviceKey,\n observability.config\n );\n }\n\n const createOptions: CoreServiceCreateOptions = {\n apiClient,\n db,\n cache,\n observability: observability\n ? { ...observability, instance: observabilityInstance }\n : undefined,\n storage,\n notifications,\n injected: {\n ...(stores ? { stores } : {}),\n cache: cache?.instance,\n db: db?.instance,\n api: apiClient?.instance,\n observability: observabilityInstance,\n storage: storage?.instance,\n notifications: notifications?.instance,\n },\n isSingleton,\n };\n\n ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n apiClientDedicated: createOptions.apiClient?.dedicated,\n dbDedicated: createOptions.db?.dedicated,\n observabilityDedicated: createOptions.observability?.dedicated,\n storageDedicated: createOptions.storage?.dedicated,\n notificationsDedicated: createOptions.notifications?.dedicated,\n injected: {\n hasCache: !!createOptions.injected?.cache,\n hasDb: !!createOptions.injected?.db,\n hasApi: !!createOptions.injected?.api,\n hasObservability: !!createOptions.injected?.observability,\n hasStorage: !!createOptions.injected?.storage,\n hasNotifications: !!createOptions.injected?.notifications,\n hasStores: !!createOptions.injected?.stores,\n },\n });\n\n const instance = await serviceClass.create(config, createOptions);\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._services.set(serviceKey, instance);\n ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n } else {\n ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n }\n\n return instance;\n } catch (error) {\n ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.delete(serviceKey);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disposal\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose a specific service by key.\n *\n * @param key - Service key to dispose\n */\n static dispose(key: string): void {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n service.dispose();\n ServiceRegistry._services.delete(key);\n ServiceRegistry.logger.info(`Service disposed: ${key}`);\n }\n ServiceRegistry._pending.delete(key);\n }\n\n /**\n * Dispose all services and clear the registry.\n */\n static disposeAll(): void {\n // Dispose all initialized services\n for (const [key, service] of ServiceRegistry._services) {\n try {\n service.dispose();\n ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n } catch (error) {\n ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Clear all state\n ServiceRegistry._services.clear();\n ServiceRegistry._pending.clear();\n ServiceRegistry._metadata.clear();\n ServiceRegistry._initPromises.clear();\n ServiceRegistry._apiClientOptions = null;\n ServiceRegistry._dbConfig = null;\n ServiceRegistry._cacheConfig = null;\n ServiceRegistry._observabilityConfig = null;\n ServiceRegistry._observabilityInstance = null;\n ServiceRegistry._storageConfig = null;\n ServiceRegistry._notificationsConfig = null;\n\n ServiceRegistry.logger.info('Service registry disposed');\n }\n\n /**\n * Check if a service is configured as singleton.\n *\n * @param key - Service key\n * @returns true if singleton (default), false if non-singleton\n */\n static isSingleton(key: string): boolean {\n const metadata = ServiceRegistry._metadata.get(key);\n return metadata?.isSingleton ?? true;\n }\n\n /**\n * Get all non-singleton service keys.\n * These services must be created via `create()` method.\n */\n static getNonSingletonKeys(): string[] {\n return [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Dynamic Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a new service dynamically after initialization.\n *\n * @param entry - Service entry to register\n * @param initNow - Whether to initialize immediately (default: true)\n *\n * @example\n * ```typescript\n * // Register and initialize immediately\n * await ServiceRegistry.register({\n * service: NewDomainService,\n * config: { enabled: true },\n * });\n *\n * // Register for lazy initialization\n * ServiceRegistry.register({\n * service: LazyService,\n * config: { enabled: true, initWhen: 'lazy' },\n * }, false);\n * ```\n */\n static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n const serviceKey = entry.service.serviceKey;\n\n // Check if already registered\n if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n return;\n }\n\n const initWhen = entry.config.initWhen ?? 'immediate';\n\n if (initNow && initWhen === 'immediate') {\n await ServiceRegistry.initializeService(entry);\n } else {\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n }\n }\n\n /**\n * Unregister a service (dispose if initialized).\n *\n * @param key - Service key to unregister\n */\n static unregister(key: string): void {\n ServiceRegistry.dispose(key);\n }\n}\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.Deno !== 'undefined') return 'deno';\n if (typeof globalThis.Bun !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.EdgeRuntime !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * db: { adapter: 'drizzle' },\n * api: {\n * env: 'production',\n * baseURL: 'https://api.example.com',\n * },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * skipDb: true,\n * api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n * FeatureFlagModule.forRoot({ provider: 'database' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport {\n DbService,\n type CoreDbServiceConfig,\n DEFAULT_ENCRYPTION_FIELDS,\n} from '../services/DbService';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CacheService } from '../services/CacheService';\nimport { StorageService, type CoreStorageConfig } from '../services/StorageService';\nimport { NotificationService, type CoreNotificationConfig } from '../services/NotificationService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { BackendExampleDomainService, FrontendExampleDomainService } from '../domain/example';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport type {\n CoreRuntimeEnvironment,\n CoreRuntimeContext,\n CoreEnvVars,\n CoreAppEnvironment,\n CoreAppContext,\n CoreApiInitOptions,\n CoreServiceRuntime,\n CoreInitOptions as BaseCoreInitOptions,\n CoreServicesResultBase,\n CoreServiceEntry,\n CoreDomainServiceInstance,\n CoreSystemErrorPayload,\n CoreFeatureFlagInitConfig,\n CoreErrorHandlerInitConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\nimport {\n initializeGlobalErrorHandler,\n setEventEmitter,\n clearEventEmitter,\n ServerErrorMiddleware,\n} from '@plyaz/errors/middleware';\nimport type { ErrorStoreActions, GlobalErrorHandler } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport {\n createStandaloneFeatureFlagStore,\n useRootStore,\n STORE_KEYS,\n type StoreKey,\n} from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n extends Omit<\n BaseCoreInitOptions<\n Partial<CoreDbServiceConfig>,\n CoreApiInitOptions,\n CoreCacheConfig,\n CoreStorageConfig,\n CoreNotificationConfig\n >,\n 'observability' | 'skipObservability'\n > {\n /** Observability configuration */\n observability?: CoreObservabilityConfig;\n /** Skip observability initialization */\n skipObservability?: boolean;\n /**\n * Global error handler configuration.\n * Auto-initializes by default to catch all uncaught errors.\n * Set `enabled: false` to disable if you want to use your own error handling.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * errorHandler: {\n * enabled: true,\n * logToConsole: true,\n * maxErrors: 200,\n * filter: (error) => error instanceof MyError,\n * },\n * });\n * ```\n */\n errorHandler?: CoreErrorHandlerInitConfig;\n\n /** Feature flags configuration */\n featureFlags?: CoreFeatureFlagInitConfig;\n\n /**\n * Domain services to auto-initialize (frontend pattern).\n * Uses ServiceRegistry for automatic initialization.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n * ],\n * });\n *\n * // Access via ServiceRegistry\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * ```\n */\n services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n DbService,\n typeof ApiClientService,\n CacheService,\n ObservabilityAdapter,\n StorageService,\n NotificationService\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Default service configurations for auto-initialization\n * These services are always initialized unless explicitly disabled\n */\nconst CORE_DOMAIN_SERVICES: CoreServiceEntry[] = [\n { service: BackendExampleDomainService, config: { enabled: true } },\n { service: FrontendExampleDomainService, config: { enabled: true } },\n // Add more core domain services here\n];\n\nexport class Core {\n private static initialized = false;\n private static _coreServices: CoreServicesResult = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n\n /**\n * Logger for Core initialization (created lazily)\n */\n private static _logger: PackageLogger | null = null;\n\n /**\n * Get or create the Core logger\n */\n private static get logger(): PackageLogger {\n Core._logger ??= new PackageLogger({\n packageName: 'core',\n service: 'Core',\n });\n return Core._logger;\n }\n\n /**\n * Log a message during initialization.\n * Uses PackageLogger, respects verbose flag.\n */\n private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n if (!verbose) return;\n if (data) {\n Core.logger.info(message, data);\n } else {\n Core.logger.info(message);\n }\n }\n\n /**\n * Log a debug message during initialization.\n */\n private static logDebug(\n message: string,\n verbose?: boolean,\n data?: Record<string, unknown>\n ): void {\n if (!verbose) return;\n if (data) {\n Core.logger.debug(message, data);\n } else {\n Core.logger.debug(message);\n }\n }\n\n /**\n * Observability configuration\n */\n private static _observabilityConfig: CoreObservabilityConfig = {};\n\n /**\n * Global error handler instance\n */\n private static _errorHandler: GlobalErrorHandler | null = null;\n\n /**\n * Error handler configuration\n */\n private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n /**\n * HTTP error handler/middleware based on runtime.\n * Auto-created during initialization.\n */\n private static _httpErrorHandler: unknown = null;\n\n /**\n * Event listener cleanup functions\n */\n private static _eventCleanupFns: (() => void)[] = [];\n\n /**\n * Feature flag configuration\n */\n private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n /**\n * Root store instance (contains errors, feature flags, and all other slices)\n * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n * All store access should go through Core.rootStore - no separate stores needed\n */\n private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n /**\n * Setup environment and context\n */\n private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n const { envPath, environment, appContext, env, verbose } = options;\n\n Core._coreServices.appContext = appContext ?? 'webapp';\n Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n const globalEnvironment: CoreAppEnvironment =\n environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n Core._coreServices.runtime = detectRuntime();\n Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n if (envPath) await loadEnvFile(envPath, verbose);\n Core._coreServices.env = { ...process.env, ...env };\n\n return globalEnvironment;\n }\n\n /**\n * Initialize a service with error handling\n */\n private static async initService<T>(\n name: string,\n init: () => Promise<T>,\n verbose?: boolean\n ): Promise<T | undefined> {\n try {\n return await init();\n } catch (error) {\n Core.logger.error(`Failed to initialize ${name}`, { error: (error as Error).message });\n if (verbose) Core.logger.error('Full error', { error });\n return undefined;\n }\n }\n\n /** Initialize error handler if enabled */\n private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n const { errorHandler: config, verbose } = options;\n if (config?.enabled === false) {\n Core.log('Global error handler disabled by configuration', verbose);\n return;\n }\n await Core.initService(\n 'error handler',\n async () => {\n await Core.initializeErrorHandler(config, verbose);\n Core.subscribeToErrorEvents(verbose);\n },\n verbose\n );\n }\n\n /** Initialize API client if not skipped */\n private static async initApiIfEnabled(\n options: CoreInitOptions,\n env: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, skipApi, verbose } = options;\n if (skipApi) return;\n\n await Core.initService(\n 'API client',\n async () => {\n await Core.initializeApi(apiConfig, env, verbose);\n Core._coreServices.api = ApiClientService;\n Core.log('API client service initialized', verbose);\n },\n verbose\n );\n Core._coreServices.api = ApiClientService;\n }\n\n /** Initialize cache service if not skipped */\n private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n const { cache: cacheConfig, skipCache, verbose } = options;\n if (skipCache) {\n Core.log('Cache service skipped (skipCache: true)', verbose);\n return;\n }\n\n // Skip cache initialization if no config provided\n if (!cacheConfig) {\n Core.log('Cache service skipped (no config provided)', verbose);\n return;\n }\n\n await Core.initService(\n 'cache',\n async () => {\n await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n Core._coreServices.cache = CacheService.getInstance();\n Core.log('Cache service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize observability if not skipped */\n private static async initObservabilityIfEnabled(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { observability: observabilityConfig, skipObservability, verbose } = options;\n if (skipObservability) {\n Core.log('Observability service skipped (skipObservability: true)', verbose);\n return;\n }\n\n // Always use ObservabilityService - it adds LoggerAdapter by default\n const config = observabilityConfig ?? { enabled: true };\n\n await Core.initService(\n 'observability',\n async () => {\n await Core.initializeObservability(config, verbose, globalEnvironment);\n Core.log('Observability service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize storage service if not skipped (backend-only) */\n private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n const { storage: storageConfig, skipStorage, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStorage) {\n Core.log('Storage service skipped (skipStorage: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!storageConfig) {\n Core.log('Storage service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (storage is backend-only)\n if (Core.isFrontend) {\n Core.log('Storage service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'storage',\n async () => {\n await StorageService.initialize(storageConfig);\n Core._coreServices.storage = StorageService.getInstance();\n Core.log('Storage service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize notifications service if not skipped (backend-only) */\n private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipNotifications) {\n Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!notificationsConfig) {\n Core.log('Notifications service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (notifications is backend-only)\n if (Core.isFrontend) {\n Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'notifications',\n async () => {\n await NotificationService.initialize(notificationsConfig);\n Core._coreServices.notifications = NotificationService.getInstance();\n Core.log('Notifications service initialized', verbose);\n },\n verbose\n );\n }\n\n /**\n * Initialize domain services\n *\n * Always initializes CORE_DOMAIN_SERVICES (like BackendExampleService),\n * then merges with any user-provided services.\n * User-provided service configs override core defaults.\n */\n private static async initDomainServicesIfConfigured(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, services: userServices, verbose } = options;\n const runtime = Core._coreServices.runtime;\n\n // Merge core services with user-provided services\n // User services can override core service configs by using the same service class\n const coreServiceKeys = new Set(CORE_DOMAIN_SERVICES.map(s => s.service.serviceKey));\n const userOverrides = (userServices ?? []).filter(s =>\n coreServiceKeys.has(s.service.serviceKey)\n );\n const additionalUserServices = (userServices ?? []).filter(\n s => !coreServiceKeys.has(s.service.serviceKey)\n );\n\n // Build merged services: core (with overrides applied) + additional user services\n const mergedServices: CoreServiceEntry[] = CORE_DOMAIN_SERVICES.map(coreService => {\n const override = userOverrides.find(\n u => u.service.serviceKey === coreService.service.serviceKey\n );\n return override\n ? { ...coreService, config: { ...coreService.config, ...override.config } }\n : coreService;\n }).concat(additionalUserServices);\n\n // Skip if somehow no services (shouldn't happen since CORE_DOMAIN_SERVICES is not empty)\n if (mergedServices.length === 0) return;\n\n await Core.initService(\n 'domain services',\n async () => {\n Core.log('Initializing domain services via ServiceRegistry...', verbose);\n Core.logDebug('Core services', verbose, {\n services: CORE_DOMAIN_SERVICES.map(s => s.service.serviceKey),\n });\n if (userServices?.length) {\n Core.logDebug('User services', verbose, {\n services: userServices.map(s => s.service.serviceKey),\n });\n }\n await ServiceRegistry.initialize({\n environment: globalEnvironment,\n runtime,\n apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n services: mergedServices,\n stores: {\n // Returns specific slice from namespaced root store (type-safe)\n getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n Core.getDomainStore(key),\n },\n });\n Core.log('Domain services initialized', verbose, {\n keys: ServiceRegistry.getInitializedKeys(),\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize all core services\n */\n\n static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n if (Core.initialized) {\n Core.log('Already initialized, returning existing services', options.verbose);\n return Core._coreServices;\n }\n\n const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n const globalEnvironment = await Core.setupEnvironment(options);\n\n await Core.initErrorHandlerIfEnabled(options);\n\n if (!Core.shouldSkipDbService(skipDb, verbose)) {\n const db = await Core.initService(\n 'database',\n () => Core.initializeDb(dbConfig, verbose),\n verbose\n );\n Core._coreServices.db = db ?? null;\n }\n\n await Core.initApiIfEnabled(options, globalEnvironment);\n\n await Core.initCacheIfEnabled(options);\n\n await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n await Core.initStorageIfEnabled(options);\n\n await Core.initNotificationsIfEnabled(options);\n\n if (featureFlagsConfig?.enabled !== false) {\n await Core.initService(\n 'feature flags',\n () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n verbose\n );\n }\n\n await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n Core.initialized = true;\n Core.log('Initialization complete', verbose);\n return Core._coreServices;\n }\n\n /**\n * Domain services for business logic\n * @example Core.services.ExampleService.create(data)\n */\n static get services(): typeof CORE_DOMAIN_SERVICES {\n return CORE_DOMAIN_SERVICES;\n }\n\n /**\n * All stores - unified access to ALL slices from single root store\n * All stores (global + domain) are slices of ONE Zustand store instance.\n *\n * **Auto-generated from STORE_KEYS** - No manual registration needed!\n *\n * **Benefits:**\n * - ✅ Access without hooks (store.getState())\n * - ✅ Cross-slice subscriptions work automatically\n * - ✅ Single source of truth\n * - ✅ Automatically scales with new stores\n *\n * @example\n * const errorStore = Core.stores.error; // Global slice\n * const flagsStore = Core.stores.featureFlags; // Global slice\n * const exampleStore = Core.stores.example; // Domain slice\n */\n static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n const rootState = Core._rootStore?.getState();\n\n // Dynamically generate store accessors from STORE_KEYS\n return Object.values(STORE_KEYS).reduce(\n (acc, key) => {\n Object.defineProperty(acc, key, {\n get: () => rootState,\n enumerable: true,\n });\n return acc;\n },\n {} as Record<StoreKey, RootStoreSlice | undefined>\n );\n }\n\n /**\n * Get a specific store slice by key (for ServiceRegistry injection).\n * Returns the actual slice from the namespaced root store.\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice or undefined\n *\n * @example\n * ```typescript\n * const exampleSlice = Core.getDomainStore('example'); // ✅ Returns ExampleFrontendStoreSlice\n * const errorSlice = Core.getDomainStore('errors'); // ✅ Returns ErrorStoreSlice\n * const invalid = Core.getDomainStore('invalid'); // ❌ TypeScript error!\n * ```\n */\n static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n static getDomainStore<T = RootStoreSlice>(): T | undefined;\n static getDomainStore<K extends keyof RootStoreSlice>(\n key?: K\n ): RootStoreSlice[K] | RootStoreSlice | undefined {\n const rootState = Core._rootStore?.getState();\n if (!rootState) return undefined;\n\n // If no key provided, return entire root store\n if (!key) return rootState;\n\n // Return specific slice from namespaced store (type-safe)\n return rootState[key];\n }\n\n /**\n * Event manager for subscribing to domain events\n * @example Core.events.on('example:created', handler)\n */\n static get events(): typeof CoreEventManager {\n return CoreEventManager;\n }\n\n /**\n * Get database service instance\n * @throws Error if not initialized\n */\n static get db(): DbService {\n if (!Core._coreServices.db) {\n throw new CorePackageError(\n 'Database service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.db;\n }\n\n /**\n * Get API client service\n */\n static get api(): typeof ApiClientService {\n if (!Core._coreServices.api) {\n throw new CorePackageError(\n 'API client service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.api;\n }\n\n /**\n * Get cache service instance\n * @throws Error if not initialized\n */\n static get cache(): CacheService {\n if (!Core._coreServices.cache) {\n throw new CorePackageError(\n 'Cache service not initialized. Call Core.initialize() with cache config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.cache;\n }\n\n /**\n * Get observability adapter instance\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * // Record a metric\n * await Core.observability.recordMetric({\n * type: 'counter',\n * name: 'api.requests',\n * value: 1,\n * tags: { endpoint: '/users' },\n * });\n *\n * // Start a span\n * const span = Core.observability.startSpan({ name: 'processOrder' });\n * try {\n * // ... do work\n * span.setStatus('ok');\n * } catch (e) {\n * span.recordException(e);\n * span.setStatus('error');\n * } finally {\n * span.end();\n * }\n * ```\n */\n static get observability(): ObservabilityAdapter {\n if (!Core._coreServices.observability) {\n throw new CorePackageError(\n 'Observability service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.observability;\n }\n\n /**\n * Check if observability is initialized\n */\n static get isObservabilityInitialized(): boolean {\n return Core._coreServices.observability !== null;\n }\n\n /**\n * Get observability configuration\n */\n static get observabilityConfig(): CoreObservabilityConfig {\n return Core._observabilityConfig;\n }\n\n /**\n * Get storage service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const storage = Core.storage.getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * ```\n */\n static get storage(): StorageService {\n if (!Core._coreServices.storage) {\n throw new CorePackageError(\n 'Storage service not initialized. Call Core.initialize() with storage config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.storage;\n }\n\n /**\n * Check if storage is initialized\n */\n static get isStorageInitialized(): boolean {\n return Core._coreServices.storage !== null;\n }\n\n /**\n * Get notifications service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const notifications = Core.notifications.getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * ```\n */\n static get notifications(): NotificationService {\n if (!Core._coreServices.notifications) {\n throw new CorePackageError(\n 'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.notifications;\n }\n\n /**\n * Check if notifications is initialized\n */\n static get isNotificationsInitialized(): boolean {\n return Core._coreServices.notifications !== null;\n }\n\n /**\n * Get root store (contains all slices: errors, feature flags, etc.)\n * Use this to access the full store state and all slice actions globally.\n *\n * @example\n * ```typescript\n * // Access error actions\n * const state = Core.rootStore.getState();\n * state.addError({ ... });\n *\n * // Access flags\n * console.log(state.flags);\n *\n * // Subscribe to store changes\n * Core.rootStore.subscribe((state) => {\n * console.log('Errors:', state.errors);\n * console.log('Flags:', state.flags);\n * });\n * ```\n */\n static get rootStore(): StoreApi<RootStoreSlice> {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore;\n }\n\n /**\n * Get global error store actions.\n * Provides access to the error store for querying and managing errors.\n *\n * @example\n * ```typescript\n * // Get all errors\n * const allErrors = useErrorStore.getState().errors;\n *\n * // Clear all errors\n * Core.errors.clearErrors();\n *\n * // Dismiss an error\n * Core.errors.dismissError(errorId);\n * ```\n */\n static get errors(): ErrorStoreActions {\n if (!Core._errorHandler) {\n throw new CorePackageError(\n 'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._errorHandler.getStore();\n }\n\n /**\n * Get feature flags store\n * Provides synchronous access to feature flag values from the store.\n *\n * @example\n * ```typescript\n * // Check if a flag is enabled\n * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n *\n * // Get a flag value\n * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n *\n * // Refresh flags from source\n * await Core.flags.refresh();\n * ```\n */\n static get flags(): FeatureFlagStoreSlice {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n // Return the feature flag slice from root store\n // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n }\n\n /**\n * Check if error handler is initialized\n */\n static get isErrorHandlerInitialized(): boolean {\n return Core._errorHandler !== null;\n }\n\n /**\n * Get the HTTP error handler/middleware based on runtime.\n * Returns different types based on detected runtime:\n *\n * - **Express**: Error handler middleware function\n * ```typescript\n * app.use(Core.httpErrorHandler);\n * ```\n *\n * - **NestJS**: Exception filter class\n * ```typescript\n * app.useGlobalFilters(new (Core.httpErrorHandler)());\n * ```\n *\n * - **Next.js**: Object with App Router and Pages Router handlers\n * ```typescript\n * // App Router\n * export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n * // Pages Router\n * export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n * ```\n *\n * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n * ```typescript\n * Core.httpErrorHandler.handleError(error, req, res);\n * ```\n *\n * - **Browser**: null (no HTTP handler needed)\n *\n * @returns The HTTP error handler for the current runtime\n */\n static get httpErrorHandler(): unknown {\n return Core._httpErrorHandler;\n }\n\n /**\n * Check if feature flags are initialized\n */\n static get isFlagsInitialized(): boolean {\n return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n }\n\n /**\n * Get error handler configuration\n */\n static get errorConfig(): CoreErrorHandlerInitConfig {\n return Core._errorConfig;\n }\n\n /**\n * Get feature flag configuration\n */\n static get flagConfig(): CoreFeatureFlagInitConfig {\n return Core._flagConfig;\n }\n\n /**\n * Get loaded environment variables\n */\n static get env(): CoreEnvVars {\n return Core._coreServices.env;\n }\n\n /**\n * Get detected runtime environment\n */\n static get runtime(): CoreRuntimeEnvironment {\n return Core._coreServices.runtime;\n }\n\n /**\n * Get current app context\n */\n static get appContext(): CoreAppContext {\n return Core._coreServices.appContext;\n }\n\n /**\n * Check if Core is initialized\n */\n static get isInitialized(): boolean {\n return Core.initialized;\n }\n\n /**\n * Check if running on a backend runtime\n */\n static get isBackend(): boolean {\n return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Check if running on a frontend runtime\n */\n static get isFrontend(): boolean {\n return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Get runtime context (backend, frontend, or universal)\n * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n */\n static getRuntimeContext(): CoreRuntimeContext {\n if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'backend';\n }\n if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'frontend';\n }\n return 'universal';\n }\n\n /**\n * Assert that the current runtime matches the expected runtime(s)\n * Throws an error if the runtime doesn't match\n *\n * @param expected - Expected runtime(s) to check against\n * @param serviceName - Name of the service for error message\n * @throws CorePackageError if runtime doesn't match\n *\n * @example\n * ```typescript\n * // Assert backend-only\n * Core.assertRuntime('backend', 'DatabaseService');\n *\n * // Assert multiple runtimes\n * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n * ```\n */\n static assertRuntime(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n serviceName: string\n ): void {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n // Check if current context matches any of the expected runtimes\n const isAllowed = runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n // Universal context (SSR) can run both frontend and backend code\n if (currentContext === 'universal') return true;\n return false;\n });\n\n if (!isAllowed) {\n throw new CorePackageError(\n `${serviceName} cannot run in ${currentContext} runtime. ` +\n `Allowed runtimes: ${runtimes.join(', ')}. ` +\n `Current runtime: ${Core._coreServices.runtime}`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Check if a service runtime is compatible with current runtime\n * Returns true/false instead of throwing\n *\n * @param expected - Expected runtime(s) to check against\n */\n static isRuntimeCompatible(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n ): boolean {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n return runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n if (currentContext === 'universal') return true;\n return false;\n });\n }\n\n /**\n * Get a registered domain service by key.\n * Convenience method that wraps ServiceRegistry.get().\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n *\n * @example\n * ```typescript\n * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): T {\n return ServiceRegistry.get<T>(key);\n }\n\n /**\n * Get a registered domain service by key with async initialization if needed.\n * Convenience method that wraps ServiceRegistry.getAsync().\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n */\n static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n return ServiceRegistry.getAsync<T>(key);\n }\n\n /**\n * Check if a domain service is registered.\n */\n static hasService(key: string): boolean {\n return ServiceRegistry.has(key);\n }\n\n /**\n * Reset Core (useful for testing)\n */\n // eslint-disable-next-line complexity\n static async reset(): Promise<void> {\n // Close database\n if (Core._coreServices.db) {\n await Core._coreServices.db.getDatabase()?.close?.();\n }\n\n // Dispose cache\n if (Core._coreServices.cache) {\n CacheService.reset();\n }\n\n // Dispose observability\n if (Core._coreServices.observability) {\n await Core._coreServices.observability.shutdown();\n }\n Core._observabilityConfig = {};\n\n // Dispose storage\n if (Core._coreServices.storage) {\n await Core._coreServices.storage.close();\n await StorageService.reset();\n }\n\n // Dispose notifications\n if (Core._coreServices.notifications) {\n await Core._coreServices.notifications.close();\n await NotificationService.reset();\n }\n\n // Dispose error handler\n if (Core._errorHandler) {\n Core._errorHandler.destroy();\n Core._errorHandler = null;\n clearEventEmitter(); // Clean up CoreEventManager integration\n }\n Core._errorConfig = {};\n Core._httpErrorHandler = null;\n\n // Cleanup event listeners\n for (const cleanup of Core._eventCleanupFns) {\n cleanup();\n }\n Core._eventCleanupFns = [];\n\n // Dispose feature flags slice from root store\n if (Core._rootStore) {\n const state = Core._rootStore.getState();\n if (state.featureFlags?.dispose) {\n state.featureFlags.dispose();\n }\n Core._rootStore = null;\n }\n Core._flagConfig = {};\n\n // Dispose all registered services via ServiceRegistry\n ServiceRegistry.disposeAll();\n\n // Dispose event manager\n CoreEventManager.dispose();\n\n Core._coreServices = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n Core.initialized = false;\n }\n\n /**\n * Determines whether to skip DbService initialization.\n *\n * DbService is backend-only and should never be initialized on frontend runtimes.\n * This method:\n * - Returns true (skip) if skipDb was explicitly set to true\n * - Returns true (skip) if running on frontend, with a warning\n * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n *\n * @param skipDb - User-provided skipDb option\n * @param verbose - Enable verbose logging\n * @returns true if DbService should be skipped\n */\n private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n // User explicitly requested to skip\n if (skipDb === true) {\n if (verbose) {\n console.log('[Core] Database service skipped (skipDb: true)');\n }\n return true;\n }\n\n // Check if running on frontend\n const isFrontend = Core.isFrontend;\n\n if (isFrontend) {\n // User explicitly tried to init DbService on frontend (skipDb: false)\n if (skipDb === false) {\n console.warn(\n '[Core] Warning: DbService cannot be initialized on frontend runtime. ' +\n 'DbService is backend-only and requires Node.js. ' +\n 'Use API calls from frontend instead. Skipping database initialization.'\n );\n } else if (verbose) {\n // skipDb was undefined (default) - just log that we're skipping\n console.log(\n '[Core] Database service skipped (frontend runtime detected). ' +\n 'DbService is only available on backend.'\n );\n }\n return true;\n }\n\n // Backend or universal runtime - don't skip\n return false;\n }\n\n /**\n * Initialize database service\n * Config validation is handled by DbService\n */\n private static async initializeDb(\n config?: Partial<CoreDbServiceConfig>,\n verbose?: boolean\n ): Promise<DbService> {\n if (verbose) {\n console.log(`[Core] Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`);\n }\n\n return DbService.initialize({\n adapter: 'drizzle',\n ...config,\n });\n }\n\n /**\n * Initialize API client service\n * Config validation is handled by ApiClientService\n */\n private static async initializeApi(\n config?: CoreApiInitOptions,\n globalEnvironment?: CoreAppEnvironment,\n verbose?: boolean\n ): Promise<void> {\n const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n if (verbose) {\n console.log(`[Core] Initializing API client for environment: ${resolvedEnv}`);\n }\n\n await ApiClientService.init(\n {\n env: resolvedEnv,\n setAsDefault: setAsDefault ?? true,\n },\n apiClientOptions\n );\n }\n\n /**\n * Initialize cache service\n * Config validation is handled by CacheService\n */\n private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n if (verbose) {\n console.log(`[Core] Initializing cache with strategy: ${config.strategy}`);\n }\n\n await CacheService.initialize(config);\n }\n\n /**\n * Initialize observability service based on config.\n * Always includes LoggerAdapter as failover for console output.\n */\n private static async initializeObservability(\n config: CoreObservabilityConfig,\n verbose?: boolean,\n environment?: CoreAppEnvironment\n ): Promise<void> {\n if (verbose) {\n console.log(`[Core] Initializing observability with provider: ${config.provider ?? 'auto'}`);\n }\n\n // Use environment from config or passed parameter\n const env = config.environment ?? environment ?? 'development';\n Core._observabilityConfig = { ...config, environment: env };\n\n // Collect adapters with priorities\n const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n // Always add LoggerAdapter as failover for console output\n const loggerAdapter = new LoggerAdapter();\n await loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n });\n adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n // TODO: Add DatadogAdapter when configured (high priority, primary)\n // if (config.provider === 'datadog' || config.datadog) {\n // const datadogAdapter = new DatadogAdapter();\n // await datadogAdapter.initialize({\n // ...config,\n // ...config.datadog,\n // environment: env,\n // });\n // adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n // }\n\n // Create ObservabilityService with all adapters\n const observability = new ObservabilityService();\n await observability.initialize({\n mode: config.mode ?? 'parallel',\n adapters,\n enabled: config.enabled,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n samplingRate: config.samplingRate,\n flushInterval: config.flushInterval,\n adapterTimeout: config.flushInterval,\n });\n\n if (verbose) {\n console.log(\n `[Core] ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`\n );\n }\n\n Core._coreServices.observability = observability;\n // Set on ServiceRegistry for injection\n ServiceRegistry.setObservabilityInstance(observability);\n }\n\n /**\n * Initialize global error handler\n */\n /** Create and initialize root store (includes error store + all other slices) */\n private static initializeRootStore(config?: CoreErrorHandlerInitConfig, verbose?: boolean): void {\n const isFrontend = typeof window !== 'undefined';\n\n if (isFrontend) {\n if (verbose) console.log('[Core] Using frontend root store (Zustand)');\n // Frontend: use the React hook store's vanilla store API\n Core._rootStore = useRootStore as unknown as StoreApi<RootStoreSlice>;\n } else {\n if (verbose) console.log('[Core] Creating backend composite store (in-memory)');\n // Backend: create in-memory error store + feature flag store (NOT Zustand)\n const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n onErrorAdded: config?.onError,\n });\n\n // Create standalone feature flag store for backend\n const backendFlagStore = createStandaloneFeatureFlagStore();\n\n // Combine error + feature flag stores to match RootStoreSlice interface\n const compositeStore = {\n // Error store methods\n ...backendErrorStore,\n // Feature flag store methods\n ...backendFlagStore,\n };\n\n // Wrap backend composite store to match root store interface (getState() pattern)\n Core._rootStore = {\n getState: () => compositeStore,\n subscribe: () => () => {}, // No-op for backend\n destroy: () => {\n backendErrorStore.reset();\n backendFlagStore.dispose?.();\n },\n } as unknown as StoreApi<RootStoreSlice>;\n }\n }\n\n /** Get error store actions from root store */\n private static getErrorStoreActions(): ErrorStoreActions {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore.getState().errors;\n }\n\n /** Build global error handler config */\n // eslint-disable-next-line complexity\n private static buildErrorHandlerConfig(\n config?: CoreErrorHandlerInitConfig\n ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n return {\n source: config?.source ?? 'global',\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n filter: config?.filter,\n onError: config?.onError,\n logToConsole: config?.logToConsole ?? false,\n };\n }\n\n // eslint-disable-next-line complexity\n private static async initializeErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n if (verbose) console.log('[Core] Error handler disabled by configuration');\n return;\n }\n\n Core._errorConfig = config ?? {};\n if (verbose) console.log('[Core] Initializing global error handler...');\n\n // Initialize error system (translations, catalogs)\n // This is safe to call multiple times - it checks if already initialized\n initializeErrorSystem({\n defaultLocale: Core._errorConfig.localization?.defaultLocale,\n fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n });\n\n // Initialize root store (contains error store + all slices)\n Core.initializeRootStore(Core._errorConfig, verbose);\n\n // Wire up CoreEventManager for automatic error event emission\n // This allows errors captured by the global handler to emit events\n setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n const errorStore = Core.getErrorStoreActions();\n Core._errorHandler = initializeGlobalErrorHandler(\n errorStore,\n Core.buildErrorHandlerConfig(Core._errorConfig)\n );\n\n // Subscribe to SYSTEM.ERROR events from ApiClientService and other sources\n // Core handles updating the appropriate store based on runtime context\n const errorEventCleanup = CoreEventManager.on(\n CORE_EVENTS.SYSTEM.ERROR,\n (event: CoreEvent<CoreSystemErrorPayload>) => {\n if (!Core._rootStore) return;\n\n try {\n const { errors } = event.data;\n if (errors && errors.length > 0) {\n // Update the appropriate store based on runtime\n // Frontend: Zustand store, Backend: In-memory store (both via root store)\n Core._rootStore.getState().errors.addErrors(errors);\n if (verbose) console.log(`[Core] Added ${errors.length} error(s) to store`);\n }\n } catch (e) {\n console.error('[Core] Failed to handle error event:', e);\n }\n }\n );\n\n // Store cleanup function\n Core._eventCleanupFns.push(errorEventCleanup);\n\n if (verbose)\n console.log('[Core] Global error handler initialized with CoreEventManager integration');\n\n // Auto-create HTTP error handler based on runtime (unless disabled)\n if (Core._errorConfig.httpHandler !== false) {\n Core.createHttpErrorHandler(Core._errorConfig, verbose);\n }\n }\n\n /**\n * Create HTTP error handler based on detected runtime.\n * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n */\n // eslint-disable-next-line complexity\n private static createHttpErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): void {\n const runtime = Core._coreServices.runtime;\n const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n // Build common config for all HTTP handlers\n const httpConfig = {\n source: runtime,\n includeStack: config?.includeStack ?? !isProduction,\n logErrors: config?.logger ?? config?.logToConsole ?? true,\n errorHandler: Core._errorHandler ?? undefined,\n };\n\n switch (runtime) {\n case 'express':\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n if (verbose) console.log('[Core] Created Express error handler middleware');\n break;\n\n case 'nestjs':\n Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n if (verbose) console.log('[Core] Created NestJS exception filter');\n break;\n\n case 'nextjs':\n // For Next.js, provide both App Router and Pages Router handlers\n Core._httpErrorHandler = {\n /** For App Router: export const GET = withErrorHandler(handler) */\n withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n ServerErrorMiddleware.withErrorHandler(\n handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n { ...httpConfig, ...overrideConfig }\n ),\n /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n createNextApiErrorHandler: (overrideConfig = {}) =>\n ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n };\n if (verbose) console.log('[Core] Created Next.js error handlers');\n break;\n\n case 'node':\n case 'bun':\n case 'deno':\n // Generic Node.js handler\n Core._httpErrorHandler = {\n /** Handle error: handleNodeError(error, req, res) */\n handleError: (error: unknown, req: unknown, res: unknown) =>\n ServerErrorMiddleware.handleNodeError(\n error,\n req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n httpConfig\n ),\n /** Create middleware for use with native http */\n createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n };\n if (verbose) console.log(`[Core] Created ${runtime} error handler`);\n break;\n\n case 'browser':\n // Browser doesn't need HTTP error handler\n Core._httpErrorHandler = null;\n if (verbose) console.log('[Core] Skipping HTTP handler for browser runtime');\n break;\n\n default:\n // For unknown runtimes, provide generic handler\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n if (verbose) console.log(`[Core] Created generic HTTP error handler for ${runtime}`);\n }\n }\n\n /**\n * Subscribe to CoreEventManager error events\n * Forwards system, entity, API, validation, database, and auth errors to the global error handler.\n *\n * Note: Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n * DbService is backend-only (skipDb: true on frontend).\n */\n private static subscribeToErrorEvents(verbose?: boolean): void {\n if (!Core._errorHandler) {\n return;\n }\n\n if (verbose) {\n console.log('[Core] Subscribing to error events...');\n }\n\n // Subscribe to system errors (universal)\n const cleanupSystemError = CoreEventManager.on(CORE_EVENTS.SYSTEM.ERROR, event => {\n if (Core._errorHandler && event.data?.errors?.length) {\n // Capture each error in the array\n for (const err of event.data.errors) {\n Core._errorHandler.captureError(err, 'system');\n }\n }\n });\n\n // Subscribe to entity errors (universal)\n const cleanupEntityError = CoreEventManager.on(CORE_EVENTS.ENTITY.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'entity');\n }\n });\n\n // Subscribe to API errors (universal)\n const cleanupApiError = CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'api');\n }\n });\n\n // Subscribe to validation errors (universal)\n const cleanupValidationError = CoreEventManager.on(CORE_EVENTS.VALIDATION.FAILED, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'validation');\n }\n });\n\n // Subscribe to auth errors (universal - can happen on both frontend and backend)\n const cleanupAuthUnauthorized = CoreEventManager.on(CORE_EVENTS.AUTH.UNAUTHORIZED, event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n });\n\n const cleanupAuthSessionExpired = CoreEventManager.on(\n CORE_EVENTS.AUTH.SESSION_EXPIRED,\n event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n }\n );\n\n // Store universal cleanup functions\n Core._eventCleanupFns.push(\n cleanupSystemError,\n cleanupEntityError,\n cleanupApiError,\n cleanupValidationError,\n cleanupAuthUnauthorized,\n cleanupAuthSessionExpired\n );\n\n // Subscribe to database errors (backend-only)\n // Database events only fire when DbService is initialized (skipDb: false)\n if (Core.isRuntimeCompatible('backend')) {\n const cleanupDatabaseError = CoreEventManager.on(CORE_EVENTS.DATABASE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'database');\n }\n });\n Core._eventCleanupFns.push(cleanupDatabaseError);\n\n // Subscribe to storage errors (backend-only)\n const cleanupStorageError = CoreEventManager.on(CORE_EVENTS.STORAGE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'storage');\n }\n });\n Core._eventCleanupFns.push(cleanupStorageError);\n\n // Subscribe to notification errors (backend-only)\n const cleanupNotificationError = CoreEventManager.on(\n CORE_EVENTS.NOTIFICATION.ERROR,\n event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'notification');\n }\n }\n );\n Core._eventCleanupFns.push(cleanupNotificationError);\n\n if (verbose) {\n console.log('[Core] Subscribed to backend error events (database, storage, notification)');\n }\n }\n\n if (verbose) {\n const eventTypes = ['system', 'entity', 'api', 'validation', 'auth'];\n if (Core.isRuntimeCompatible('backend')) {\n eventTypes.push('database', 'storage', 'notification');\n }\n console.log(`[Core] Subscribed to error events: ${eventTypes.join(', ')}`);\n }\n }\n\n /** Handle fetch flags error and return empty flags */\n private static handleFetchFlagsError(\n error: unknown,\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Record<string, FeatureFlagValue> {\n if (verbose) console.error('[Core] Failed to fetch feature flags:', error);\n\n // If already a package error, use as-is; otherwise wrap it\n const packageError =\n error instanceof BaseError\n ? (error as CorePackageError)\n : new CorePackageError(\n error instanceof Error ? error.message : String(error),\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n config?.onError?.(packageError);\n return {};\n }\n\n /** Create fetch flags function */\n private static createFetchFlagsFn(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): () => Promise<Record<string, FeatureFlagValue>> {\n // eslint-disable-next-line complexity\n return async () => {\n try {\n const client = ApiClientService.getClient();\n const endpoint = config?.apiEndpoint ?? '/feature-flags';\n const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to fetch feature flags',\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n );\n }\n\n return response.data?.flags ?? {};\n } catch (error) {\n return Core.handleFetchFlagsError(error, config, verbose);\n }\n };\n }\n\n /**\n * Initialize feature flags slice within root store\n */\n\n private static async initializeFeatureFlags(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n if (verbose) console.log('[Core] Feature flags disabled by configuration');\n return;\n }\n\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initializeErrorHandler() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n Core._flagConfig = config ?? {};\n if (verbose) console.log('[Core] Initializing feature flags from root store...');\n\n // Initialize the feature flag slice within the root store\n const state = Core._rootStore.getState();\n await state.featureFlags.initialize({\n defaults: Core._flagConfig.defaults,\n polling: Core._flagConfig.polling,\n fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n onFlagChange: Core._flagConfig.onFlagChange,\n onError: Core._flagConfig.onError,\n });\n\n if (verbose) console.log('[Core] Feature flags initialized');\n }\n}\n\n// Export for convenience\nexport {\n DbService,\n ApiClientService,\n CacheService,\n StorageService,\n NotificationService,\n DEFAULT_ENCRYPTION_FIELDS,\n};\n","/**\n * Base Frontend Domain Service\n *\n * Extends BaseDomainService with common frontend patterns:\n * - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)\n * - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store\n * - **Automatic Loading State**: Managed via setStoresLoading() on primary store\n * - **Generic CRUD Operations**: With fetchers from @plyaz/api\n * - **Event Emission**: Typed event payloads via CoreEventManager\n * - **Automatic DTO Mapping**: Via mapper classes\n *\n * ## Store Architecture (NEW)\n *\n * ### Primary Store (Mutate)\n * - Service has ONE primary store defined by `store: 'campaigns'` config\n * - Can call: setData(), updateData(), setLoading()\n * - syncToStores() syncs ONLY to primary store\n * - Access via: this.primaryStore\n *\n * ### Read Stores (Read-Only)\n * - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`\n * - Can read state but should NOT call mutation methods\n * - Used for cross-domain data access (e.g., campaign service reading user data)\n * - Access via: this.getReadStore('users')\n *\n * ### All Stores from Root Store\n * - All stores (domain + global) are slices of ONE root Zustand store\n * - Automatically reactive - changes propagate to subscribers (React components)\n * - Error/featureFlags are built-in, domain stores added dynamically\n *\n * Frontend domain services should extend this class instead of BaseDomainService\n * to get automatic store integration and CRUD capabilities.\n *\n * All generic type parameters for full type safety:\n * - TConfig: Service configuration type\n * - TStore: Store interface type\n * - TData: Data type for store sync\n * - TEntity: Domain entity type\n * - TResponseDTO: API response DTO type (snake_case)\n * - TCreateDTO: Create request DTO type\n * - TPatchDTO: Patch request DTO type (partial update)\n * - TQueryDTO: Query/filter DTO type for fetchAll\n * - TStoreState: Serializable store state type\n * - TMapper: Mapper instance type\n * - TValidator: Optional validator type\n *\n * @example\n * ```typescript\n * class MyFrontendService extends BaseFrontendDomainService<\n * MyConfig,\n * MyStore,\n * MyStoreData,\n * MyEntity,\n * MyResponseDTO,\n * CreateMyDTO,\n * PatchMyDTO,\n * QueryMyDTO,\n * MyStoreState,\n * MyMapper\n * > {\n * protected eventPrefix = 'myDomain';\n * protected mapper: MyMapper;\n *\n * constructor(config: MyConfig) {\n * super({ ... mapperClass: MyMapperClass });\n * this.mapper = new MyMapperClass();\n * }\n *\n * // All CRUD methods inherited!\n * // - fetchAll(query?)\n * // - fetchById(id)\n * // - create(data)\n * // - update(id, data)\n * // - delete(id)\n * }\n * ```\n */\n\nimport { BaseDomainService } from '../../domain/base';\nimport { STORE_KEYS } from '@plyaz/store';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { Core } from '../../init/CoreInitializer';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreEntityCreatingPayload,\n CoreEntityCreatedPayload,\n CoreEntityPatchingPayload,\n CoreEntityPatchedPayload,\n CoreEntityDeletingPayload,\n CoreEntityDeletedPayload,\n CoreEntityErrorPayload,\n CoreEntityCompletePayload,\n} from '@plyaz/types/core';\n\n// Re-export types\nexport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreStoreHandlers,\n} from '@plyaz/types/core';\n\n// Import types for local use\nimport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreStoreHandlers,\n CoreOptimisticUpdateConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base Event Payload Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Base type for frontend event payloads\n * All frontend event payloads should extend this\n */\ntype BaseFrontendEventPayload =\n | CoreEntityCreatingPayload<unknown>\n | CoreEntityCreatedPayload<unknown, unknown>\n | CoreEntityPatchingPayload<unknown>\n | CoreEntityPatchedPayload<unknown, unknown>\n | CoreEntityDeletingPayload\n | CoreEntityDeletedPayload\n | CoreEntityErrorPayload\n | CoreEntityCompletePayload\n | Record<string, unknown>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for frontend domain services with store integration and CRUD operations.\n *\n * Extends BaseDomainService with:\n * - Multi-store connection management\n * - Automatic sync to connected stores\n * - Loading/error state propagation\n * - Generic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Event emission with typed payloads\n * - Automatic DTO mapping via mapper\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TStore - Store interface type\n * @typeParam TData - Data type for store sync\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create request DTO type\n * @typeParam TPatchDTO - Patch request DTO type\n * @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)\n * @typeParam TStoreState - Serializable store state type\n * @typeParam TMapper - Mapper instance type\n * @typeParam TValidator - Optional validator type\n * @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)\n */\nexport abstract class BaseFrontendDomainService<\n TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>,\n TStore extends CoreBaseFrontendStore<TData>,\n TData = Record<string, unknown>,\n TEntity = unknown,\n TResponseDTO = unknown,\n TCreateDTO = unknown,\n TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TEntity,\n TMapper extends CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n > = CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n TDeleteResult = void,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties (Subclasses must provide)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * E.g., 'example' → emits 'example:creating', 'example:created', etc.\n *\n * Required by subclasses\n */\n protected abstract eventPrefix: string;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Primary store - the main store this service can mutate */\n private _primaryStore: TStore | null = null;\n\n /**\n * Primary store key - override in subclass to set default\n * @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n */\n protected primaryStoreKey?: string;\n\n /** Read-only stores - can read but not mutate */\n private readonly _readStores = new Map<string, unknown>();\n\n /**\n * Read-only store keys - always includes error and featureFlags by default\n * Override in subclass to add additional read stores\n * @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];\n */\n protected readStoreKeys: string[] = [STORE_KEYS.ERROR, STORE_KEYS.FEATURE_FLAGS];\n\n /** Store handlers for custom store synchronization */\n protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Optimistic update configuration */\n protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;\n\n /** Stack of previous states for rollback (LIFO) */\n private readonly _rollbackStack: Array<{\n operation: string;\n previousState: TData | null;\n timestamp: number;\n }> = [];\n\n /** Maximum rollback stack size */\n private readonly _maxRollbackStackSize = 10;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line complexity\n constructor(\n config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>\n ) {\n super(config);\n\n this.storeHandlers = config.serviceConfig.storeHandlers;\n this.optimisticConfig = config.serviceConfig.optimisticUpdates;\n\n // Initialize mapper if class provided\n if (config.mapperClass) {\n this.mapper = new config.mapperClass() as TMapper;\n }\n\n const serviceConfig = config.serviceConfig;\n\n // New pattern: store (primary) + readStores (read-only)\n // Use config if provided, otherwise use class property defaults\n if (serviceConfig.store !== undefined) {\n this.primaryStoreKey = serviceConfig.store;\n }\n if (serviceConfig.readStores !== undefined) {\n // Merge config readStores with base defaults (error, featureFlags)\n // Use Set to avoid duplicates\n this.readStoreKeys = Array.from(\n new Set([\n ...this.readStoreKeys, // Base defaults: error, featureFlags\n ...serviceConfig.readStores, // Additional from config\n ])\n );\n }\n\n // Get injected stores from ServiceRegistry\n const injectedStores = config.injected?.stores;\n\n // Connect primary store (can mutate)\n if (this.primaryStoreKey) {\n const primaryStore = injectedStores?.[this.primaryStoreKey] as TStore;\n if (primaryStore) {\n this._primaryStore = primaryStore;\n this.logDebug(`Connected primary store: '${this.primaryStoreKey}'`);\n } else {\n throw new CorePackageError(\n `Primary store '${this.primaryStoreKey}' not found. ` +\n `Ensure the store is registered in DomainStores or root store.`,\n ERROR_CODES.CORE_INITIALIZATION_FAILED,\n {\n context: { serviceName: this.serviceName },\n metadata: { primaryStoreKey: this.primaryStoreKey },\n }\n );\n }\n }\n\n // Connect read-only stores (can only read)\n for (const key of this.readStoreKeys) {\n const readStore = injectedStores?.[key];\n if (readStore) {\n this._readStores.set(key, readStore);\n this.logDebug(`Connected read-only store: '${key}'`);\n } else {\n this.logDebug(`Read-only store '${key}' not found in injected stores`);\n }\n }\n\n // Log warning if no primary store configured\n if (!this.primaryStoreKey) {\n console.warn(\n `[${this.serviceName}] Warning: No primary store configured. ` +\n `Set 'store' in config to enable store mutations (setData/updateData/setLoading).`\n );\n }\n\n this.logDebug('Frontend service initialized', {\n primaryStore: this.primaryStoreKey,\n readStores: this.readStoreKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Management (Public API)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the number of connected stores (primary + read stores).\n */\n get connectedStoreCount(): number {\n return (this._primaryStore ? 1 : 0) + this._readStores.size;\n }\n\n /**\n * Check if any stores are connected (primary or read).\n */\n get hasConnectedStores(): boolean {\n return !!this._primaryStore || this._readStores.size > 0;\n }\n\n /**\n * Get primary store (protected).\n * This is the store the service can mutate.\n */\n protected get primaryStore(): TStore | null {\n return this._primaryStore;\n }\n\n /**\n * Get a read-only store by key (protected).\n * Can read state but should not call mutation methods.\n *\n * @param key - Store key (type-safe)\n * @returns Store slice or undefined (auto-typed based on key)\n */\n protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n return this._readStores.get(key) as RootStoreSlice[K] | undefined;\n }\n\n /**\n * Get a specific store slice by key (protected).\n *\n * **Namespaced Root Store Architecture:**\n * - All stores are slices merged into ONE Zustand root store\n * - Each slice is namespaced (e.g., store.example, store.errors)\n * - This returns the SPECIFIC slice for the given key\n * - Type-safe: only valid store keys allowed\n *\n * **Usage Guidelines:**\n * - Can mutate stores that are NOT in readStoreKeys\n * - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)\n * - Useful for cross-domain updates (e.g., campaign service updating user stats)\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice (fully typed based on key)\n *\n * @example\n * ```typescript\n * // In CampaignService\n * protected async afterCreate(id: string, campaign: Campaign) {\n * // Update primary store (campaigns)\n * this.primaryStore.addItem(campaign);\n *\n * // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice\n * const flagsSlice = this.getStore('featureFlags'); // ✅ Type-safe!\n * if (flagsSlice?.flags?.['update-user-stats']) {\n * // Update user store (cross-domain mutation - OK since not read-only)\n * const userSlice = this.getStore('users'); // ✅ Auto-typed!\n * userSlice?.incrementCampaignCount(campaign.userId);\n * }\n * }\n * ```\n */\n protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n // Returns specific slice from namespaced root store (type-safe)\n return Core.getDomainStore(key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Sync (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Sync data to primary store only (read stores are NOT updated).\n * Uses setData (replace) or updateData (merge) based on `replace` parameter.\n * If custom store handlers are configured, uses those instead of default behavior.\n *\n * @param data - Data to sync to primary store\n * @param replace - If true, calls setData; if false, calls updateData\n */\n // eslint-disable-next-line complexity\n protected syncToStores(data: TData, replace = false): void {\n if (!this._primaryStore) {\n this.logDebug('No primary store to sync to');\n return;\n }\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n this.logDebug('Store sync disabled via storeHandlers.disabled');\n return;\n }\n\n try {\n // Priority 1: Use custom handlers if configured\n if (replace && this.storeHandlers?.setData) {\n this.storeHandlers.setData(this._primaryStore, data);\n } else if (!replace && this.storeHandlers?.updateData) {\n this.storeHandlers.updateData(this._primaryStore, data as Partial<TData>);\n }\n // Priority 2: Use standard store methods\n else if (replace && this._primaryStore.setData) {\n this._primaryStore.setData(data);\n } else if (!replace && this._primaryStore.updateData) {\n this._primaryStore.updateData(data as Partial<TData>);\n } else if (this._primaryStore.setData) {\n // Fallback to setData if updateData not available\n this._primaryStore.setData(data);\n }\n\n this.logDebug('Synced to primary store', {\n primaryStore: this.primaryStoreKey,\n replace,\n });\n } catch (error) {\n this.logError('Failed to sync to primary store', { error });\n }\n }\n\n /**\n * Set loading state on primary store only.\n * Read stores are NOT affected.\n *\n * Automatically called by CRUD methods before and after API calls.\n *\n * @param isLoading - Loading state\n */\n protected setStoresLoading(isLoading: boolean): void {\n if (!this._primaryStore) return;\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n return;\n }\n\n // Use custom handler if configured\n if (this.storeHandlers?.setLoading) {\n this.storeHandlers.setLoading(this._primaryStore, isLoading);\n }\n // Fallback to default behavior\n else if (this._primaryStore.setLoading) {\n this._primaryStore.setLoading(isLoading);\n }\n }\n\n /**\n * Add entity to store (for create operations).\n * Priority: storeHandlers.addData > store.addData\n *\n * @param entity - Entity to add\n * @returns The converted store state (for reuse in event payloads)\n */\n protected addEntityToStore(entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.addData) {\n this.storeHandlers.addData(this._primaryStore, storeState);\n } else if (this._primaryStore.addData) {\n this._primaryStore.addData(storeState);\n } else {\n this.logDebug('Store does not support addData - skipping create sync');\n }\n } catch (error) {\n this.logError('Failed to add entity to store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Update entity in store (for update operations).\n * Priority: storeHandlers.updateDataById > store.updateDataById\n *\n * @param id - Entity ID\n * @param entity - Updated entity\n * @returns The converted store state (for reuse in event payloads)\n */\n protected updateEntityInStore(id: string, entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.updateDataById) {\n this.storeHandlers.updateDataById(this._primaryStore, id, storeState);\n } else if (this._primaryStore.updateDataById) {\n this._primaryStore.updateDataById(id, storeState);\n } else {\n this.logDebug('Store does not support updateDataById - skipping update sync');\n }\n } catch (error) {\n this.logError('Failed to update entity in store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Sync multiple entities to store using mapper.toStoreStateList.\n * Converts entities to store format and syncs via setData (full replacement).\n *\n * @param entities - Entities to sync\n * @returns Array of converted store states\n */\n protected syncEntitiesToStore(entities: TEntity[]): TStoreState[] {\n const storeStates = entities.map(entity => this.mapper.toStoreState(entity));\n\n if (this._primaryStore && !this.storeHandlers?.disabled && this.mapper.toStoreStateList) {\n // mapper.toStoreStateList returns full store data structure\n const storeData = this.mapper.toStoreStateList(entities);\n this.syncToStores(storeData as TData, true); // Replace with full list\n }\n\n return storeStates;\n }\n\n /**\n * Remove entity from store by ID.\n * Priority: storeHandlers.removeData > store.removeData\n *\n * @param id - Entity ID to remove\n */\n protected removeEntityFromStore(id: string): void {\n if (!this._primaryStore || this.storeHandlers?.disabled) return;\n\n try {\n // Priority 1: Custom handler for removeData\n if (this.storeHandlers?.removeData) {\n this.storeHandlers.removeData(this._primaryStore, id);\n }\n // Priority 2: Store's removeData method\n else if (this._primaryStore.removeData) {\n this._primaryStore.removeData(id);\n } else {\n this.logDebug('Store does not support removeData - skipping delete sync');\n return;\n }\n\n this.logDebug('Removed entity from store', { entityId: id });\n } catch (error) {\n this.logError('Failed to remove entity from store', { error, entityId: id });\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if optimistic updates are enabled for an operation.\n */\n protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean {\n if (!this.optimisticConfig?.enabled) return false;\n const ops = this.optimisticConfig.operations ?? ['create', 'update', 'delete'];\n return ops.includes(operation);\n }\n\n /**\n * Save current store state for potential rollback.\n * Call this BEFORE making optimistic changes.\n */\n protected saveStateForRollback(operation: string): void {\n if (!this._primaryStore?.getData) return;\n\n const previousState = this._primaryStore.getData();\n this._rollbackStack.push({\n operation,\n previousState: previousState ? { ...previousState } : null,\n timestamp: Date.now(),\n });\n\n // Limit stack size\n if (this._rollbackStack.length > this._maxRollbackStackSize) {\n this._rollbackStack.shift();\n }\n\n this.logDebug('Saved state for rollback', { operation, stackSize: this._rollbackStack.length });\n }\n\n /**\n * Rollback to previous state on error.\n * Call this when an optimistic update fails.\n */\n protected rollbackState(operation: string, error: Error): void {\n const entry = this._rollbackStack.pop();\n if (!entry || !this._primaryStore) {\n this.logWarn('No state to rollback', { operation });\n return;\n }\n\n try {\n if (entry.previousState && this._primaryStore.setData) {\n this._primaryStore.setData(entry.previousState);\n this.logInfo('Rolled back optimistic update', { operation });\n }\n\n // Call onRollback callback if configured\n if (this.optimisticConfig?.onRollback) {\n this.optimisticConfig.onRollback(operation, error, entry.previousState);\n }\n\n // Emit rollback event\n this.emitEvent('optimistic:rollback', {\n operation,\n error: error.message,\n previousState: entry.previousState,\n } as Record<string, unknown>);\n } catch (rollbackError) {\n this.logError('Failed to rollback state', { error: rollbackError, operation });\n }\n }\n\n /**\n * Clear rollback state after successful operation.\n * Call this when API succeeds.\n */\n protected clearRollbackState(operation: string): void {\n // Remove the most recent entry for this operation\n const index = this._rollbackStack.findIndex(e => e.operation === operation);\n if (index >= 0) {\n this._rollbackStack.splice(index, 1);\n }\n }\n\n /**\n * Resolve conflict between optimistic and server state.\n */\n // eslint-disable-next-line complexity\n protected resolveConflict<T>(optimistic: T, server: T): T {\n const resolution = this.optimisticConfig?.conflictResolution ?? 'server-wins';\n\n switch (resolution) {\n case 'server-wins':\n return server;\n case 'client-wins':\n return optimistic;\n case 'merge':\n // Deep merge (simple implementation)\n if (typeof optimistic === 'object' && typeof server === 'object') {\n return { ...optimistic, ...server } as T;\n }\n return server;\n case 'manual':\n if (this.optimisticConfig?.onConflict) {\n return this.optimisticConfig.onConflict(optimistic, server);\n }\n return server;\n default:\n return server;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Generic CRUD Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all entities from API\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'fetching' event\n * 5. Lifecycle hook: beforeFetchAll\n * 6. Call fetcher (from @plyaz/api)\n * 7. Map response DTOs to domain entities\n * 8. Lifecycle hook: afterFetchAll\n * 9. Emit 'fetched' event\n * 10. Return entities\n *\n * Error Handling:\n * - On API error: wrap and emit error event\n * - Set error on all stores\n * - Re-throw wrapped error\n *\n * @param query - Optional query/filter parameters (e.g., { status: 'active' })\n * @param options - Optional service options for fetcher\n * @returns Promise resolving to array of entities\n * @throws CorePackageError if fetcher not configured or API call fails\n *\n * @example\n * ```typescript\n * // Fetch all entities\n * const allItems = await service.fetchAll();\n *\n * // Fetch with filters\n * const activeItems = await service.fetchAll({ status: 'active' });\n *\n * // Fetch with pagination\n * const pagedItems = await service.fetchAll({ page: 2, limit: 10 });\n * ```\n */\n // eslint-disable-next-line complexity\n async fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchAll) {\n throw new CorePackageError(\n 'fetchAll fetcher not configured. Pass fetchers.fetchAll in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n this.setStoresLoading(true);\n this.emitEvent('fetching', { query } as Record<string, unknown>);\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchAll?.(query);\n\n // 2. Call fetcher with query\n const response = await this.config.fetchers.fetchAll(query, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n 'Failed to fetch entities',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'fetchAll', query },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 3. Map DTOs to domain entities\n const entities = (response.data ?? []).map(dto => this.mapper.toDomain(dto as TResponseDTO));\n\n // 4. Sync to store and get converted store states (no duplicate toStoreState)\n this.syncEntitiesToStore(entities);\n\n // 5. Lifecycle hook\n await this.afterFetchAll?.(entities, query);\n\n // 6. Emit success event\n this.emitEvent('fetched', {\n count: entities.length,\n query,\n } as Record<string, unknown>);\n\n // Record success metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, true);\n\n this.logInfo('Fetched entities', { count: entities.length, query });\n return entities;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchAll', { query });\n // Note: Errors are thrown and caught by global error handler\n // Individual stores should NOT have error state - only global error store\n this.emitEvent('fetch:error', {\n error: pkgError,\n data: { query },\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Fetch single entity by ID from API\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Entity or null if not found\n * @throws CorePackageError if fetcher not configured or API call fails\n */\n // eslint-disable-next-line complexity\n async fetchById<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TEntity | null> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchById) {\n throw new CorePackageError(\n 'fetchById fetcher not configured. Pass fetchers.fetchById in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchById?.(id);\n\n // 2. Call fetcher\n const response = await this.config.fetchers.fetchById(String(id), options);\n\n if (!response.isSuccess) {\n if (response.error?.message?.includes('404')) {\n return null;\n }\n throw new CorePackageError('Failed to fetch entity', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n context: { operation: 'fetchById', entityId: String(id) },\n cause: response.error ?? undefined,\n });\n }\n\n // 3. Map DTO to domain entity\n const entity = response.data ? this.mapper.toDomain(response.data as TResponseDTO) : null;\n\n // 4. Lifecycle hook\n if (entity) {\n await this.afterFetchById?.(entity);\n }\n\n // Record success metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchById', { entityId: String(id) });\n throw pkgError;\n }\n }\n\n /**\n * Create new entity\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'creating' event\n * 5. Lifecycle hook: beforeCreate\n * 6. Map input data to create DTO (if mapper available)\n * 7. [Optimistic] Save state and add to store BEFORE API call\n * 8. Call create fetcher (from @plyaz/api)\n * 9. Map response DTO to domain entity\n * 10. [Optimistic] Resolve conflicts if needed\n * 11. Lifecycle hook: afterCreate\n * 12. Emit 'created' event\n * 13. Return entity\n *\n * @param data - Create data (can be partial domain entity or DTO)\n * @param options - Optional service options for fetcher\n * @returns Created entity\n * @throws CorePackageError if fetcher not configured or creation fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async create<TInput = unknown, TOptions = unknown>(\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.create) {\n throw new CorePackageError(\n 'create fetcher not configured. Pass fetchers.create in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('create');\n\n this.setStoresLoading(true);\n this.emitEvent('creating', {\n request: data,\n } satisfies CoreEntityCreatingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('create');\n }\n\n // Create optimistic entity for immediate UI update\n let optimisticEntity: TEntity | null = null;\n let optimisticStoreState: TStoreState | null = null;\n\n try {\n // 1. Lifecycle hook\n await this.beforeCreate?.(data);\n\n // 2. Map to DTO if mapper available (optional - data might already be DTO)\n const createDTO = this.mapper?.toCreateDTO\n ? this.mapper.toCreateDTO(data as Partial<TEntity>)\n : (data as unknown as TCreateDTO);\n\n // 3. [Optimistic] Add to store BEFORE API call\n if (isOptimistic) {\n // Create a temporary entity for optimistic display\n optimisticEntity = {\n ...(data as object),\n id: `temp-${Date.now()}`, // Temporary ID\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.addEntityToStore(optimisticEntity);\n\n this.emitEvent('optimistic:create', {\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call create fetcher\n const response = await this.config.fetchers.create(createDTO, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to create entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'create' },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Map response to domain entity\n const entity = this.mapper.toDomain(response.data as TResponseDTO);\n\n // 6. Update store with real entity (replaces optimistic if used)\n let storeState: TStoreState;\n if (isOptimistic && optimisticEntity) {\n // Remove optimistic entity and add real one\n const tempId = (optimisticEntity as { id?: string }).id;\n if (tempId) {\n this.removeEntityFromStore(tempId);\n }\n storeState = this.addEntityToStore(entity);\n this.clearRollbackState('create');\n } else {\n storeState = this.addEntityToStore(entity);\n }\n\n // 7. Lifecycle hook\n await this.afterCreate?.(entity);\n\n // 8. Emit created event (reuse storeState from sync)\n this.emitEvent('created', {\n entity,\n storeState,\n } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n this.logInfo('Entity created', { entityId: (entity as { id?: string }).id });\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('create', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'create');\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('create:error', {\n error: pkgError,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Update entity (partial update - PATCH)\n *\n * @param id - Entity ID\n * @param data - Partial update data\n * @param options - Optional service options for fetcher\n * @returns Updated entity\n * @throws CorePackageError if fetcher not configured or update fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async update<TInput = unknown, TOptions = unknown>(\n id: string,\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.update) {\n throw new CorePackageError(\n 'update fetcher not configured. Pass fetchers.update in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('update');\n\n this.setStoresLoading(true);\n this.emitEvent('patching', {\n id,\n request: data,\n } satisfies CoreEntityPatchingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('update');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeUpdate?.(id, data);\n\n // 2. Map to DTO if mapper available\n const patchDTO = this.mapper?.toPatchDTO\n ? this.mapper.toPatchDTO(data as Partial<TEntity>)\n : (data as unknown as TPatchDTO);\n\n // 3. [Optimistic] Update store BEFORE API call\n let optimisticStoreState: TStoreState | null = null;\n if (isOptimistic) {\n // Create optimistic entity with merged data\n const optimisticEntity = {\n id,\n ...(data as object),\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.updateEntityInStore(id, optimisticEntity);\n\n this.emitEvent('optimistic:update', {\n id,\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call update fetcher\n const response = await this.config.fetchers.update({ id, data: patchDTO }, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to update entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'update', entityId: id },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Map response to domain entity\n const serverEntity = this.mapper.toDomain(response.data as TResponseDTO);\n\n // 6. Resolve conflicts and update store with final entity\n let finalEntity = serverEntity;\n if (isOptimistic && optimisticStoreState) {\n // Resolve any conflicts between optimistic and server response\n finalEntity = this.resolveConflict({ id, ...(data as object) } as TEntity, serverEntity);\n this.clearRollbackState('update');\n }\n\n // 7. Update in store with final entity\n const storeState = this.updateEntityInStore(id, finalEntity);\n\n // 8. Lifecycle hook\n await this.afterUpdate?.(id, finalEntity);\n\n // 9. Emit updated event (reuse storeState from sync)\n this.emitEvent('patched', {\n entity: finalEntity,\n storeState,\n } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n entityId: id,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n this.logInfo('Entity updated', { entityId: id });\n return finalEntity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('update', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'update', { entityId: id });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('update:error', {\n error: pkgError,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Delete entity\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Delete operation result (type specified by TDeleteResult generic)\n * @throws CorePackageError if fetcher not configured or deletion fails\n */\n // eslint-disable-next-line complexity\n async delete<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TDeleteResult> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.delete) {\n throw new CorePackageError(\n 'delete fetcher not configured. Pass fetchers.delete in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('delete');\n\n this.setStoresLoading(true);\n this.emitEvent('deleting', {\n id: String(id),\n } satisfies CoreEntityDeletingPayload);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('delete');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeDelete?.(id);\n\n // 2. [Optimistic] Remove from store BEFORE API call\n if (isOptimistic) {\n this.removeEntityFromStore(String(id));\n\n this.emitEvent('optimistic:delete', {\n id: String(id),\n } as Record<string, unknown>);\n }\n\n // 3. Call delete fetcher\n const response = await this.config.fetchers.delete(String(id), options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to delete entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'delete', entityId: String(id) },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 4. Remove from store (if not already done optimistically)\n if (!isOptimistic) {\n this.removeEntityFromStore(String(id));\n } else {\n this.clearRollbackState('delete');\n }\n\n // 5. Lifecycle hook\n await this.afterDelete?.(id);\n\n // 6. Emit deleted event\n this.emitEvent('deleted', {\n id: String(id),\n soft: false,\n } satisfies CoreEntityDeletedPayload);\n\n this.emitEvent('complete', {\n success: true,\n entityId: String(id),\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n\n this.logInfo('Entity deleted', { entityId: String(id) });\n\n // 7. Return delete result\n return response.data as TDeleteResult;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('delete', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'delete', { entityId: String(id) });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('delete:error', {\n error: pkgError,\n entityId: String(id),\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Event Emission (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Emit event with automatic prefix\n * Uses CoreEventManager under the hood\n *\n * @param event - Event name (without prefix)\n * @param payload - Event payload\n *\n * @example\n * ```typescript\n * // If eventPrefix is 'example', this emits 'example:created'\n * this.emitEvent('created', { entity, storeState });\n * ```\n */\n protected emitEvent<TPayload extends BaseFrontendEventPayload>(\n event: string,\n payload: TPayload\n ): void {\n const eventName = `${this.eventPrefix}:${event}`;\n CoreEventManager.emit(eventName, payload);\n this.logDebug(`Event emitted: ${eventName}`, payload as unknown as Record<string, unknown>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional - Override in subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before fetchAll API call\n * Override to add custom logic (e.g., cache check, validate query)\n *\n * @param query - Optional query/filter parameters\n */\n protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called after fetchAll success\n * Override to add custom logic (e.g., cache set, transform entities)\n *\n * @param entities - Fetched entities\n * @param query - Optional query/filter parameters that were used\n */\n protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called before fetchById API call\n */\n protected beforeFetchById?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after fetchById success\n */\n protected afterFetchById?(entity: TEntity): Promise<void>;\n\n /**\n * Called before create API call\n * Use this to modify data or validate before sending to API\n */\n protected beforeCreate?<TInput>(data: TInput): Promise<void>;\n\n /**\n * Called after create success\n * Use this to update stores, show notifications, etc.\n */\n protected afterCreate?(entity: TEntity): Promise<void>;\n\n /**\n * Called before update API call\n */\n protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;\n\n /**\n * Called after update success\n */\n protected afterUpdate?(id: string, entity: TEntity): Promise<void>;\n\n /**\n * Called before delete API call\n */\n protected beforeDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after delete success\n */\n protected afterDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called before OPTIONS request\n *\n * Use for custom logic before checking allowed methods/CORS headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after OPTIONS request success\n *\n * Use for processing allowed methods/headers or logging.\n *\n * @param resource - Optional resource identifier or URL\n * @param result - The OPTIONS response (allowed methods, CORS headers, etc.)\n */\n protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;\n\n /**\n * Called before HEAD request\n *\n * Use for custom logic before checking resource existence/headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeHead?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after HEAD request success\n *\n * Use for processing response headers or logging.\n * Note: HEAD requests return no body, only headers.\n *\n * @param resource - Optional resource identifier or URL\n * @param headers - Response headers (if available)\n */\n protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Error Handling Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Wrap error in CorePackageError with context\n *\n * @param error - Original error\n * @param operation - Operation that failed\n * @param context - Additional context\n * @returns Wrapped error\n */\n protected wrapError(\n error: unknown,\n operation: string,\n context?: Record<string, unknown>\n ): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n\n // Wrap other errors in CorePackageError\n return new CorePackageError(\n error instanceof Error ? error.message : 'An unexpected error occurred',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation, ...context },\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Track a frontend operation with observability (span + metrics).\n * Wraps an operation with automatic span creation, duration recording, and error tracking.\n *\n * @param operation - Operation name (fetchAll, fetchById, create, delete)\n * @param entityId - Optional entity ID for context\n * @param fn - The operation function to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const entity = await this.trackOperation('create', undefined, async () => {\n * return await this.config.fetchers.create(data);\n * });\n * ```\n */\n protected async trackOperation<T>(\n operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete',\n entityId: string | undefined,\n fn: () => Promise<T>\n ): Promise<T> {\n const startTime = Date.now();\n const spanName = `${this.eventPrefix}.${operation}`;\n\n return this.withSpan(spanName, async span => {\n if (entityId) {\n span.setAttribute('entity.id', entityId);\n }\n span.setAttribute('service.name', this.serviceName);\n span.setAttribute('operation.name', operation);\n\n try {\n const result = await fn();\n\n // Record success metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, true);\n\n span.setStatus('ok');\n return result;\n } catch (error) {\n // Record error metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, false);\n\n span.recordException(error as Error);\n span.setStatus('error', (error as Error).message);\n throw error;\n }\n });\n }\n\n /**\n * Record operation metrics (duration and count).\n */\n private async recordOperationMetrics(\n operation: string,\n duration: number,\n success: boolean\n ): Promise<void> {\n if (!this.hasObservability) return;\n\n const tags = {\n service: this.serviceName,\n operation,\n entity: this.eventPrefix,\n runtime: 'frontend',\n };\n\n // Record duration\n await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n // Record count\n await this.incrementCounter(\n success\n ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n 1,\n tags\n );\n }\n}\n","/**\n * Base Backend Domain Service\n *\n * Extends BaseDomainService with common backend patterns:\n * - Automatic validation → mapper → repository → mapper flow\n * - Event emission throughout CRUD lifecycle\n * - Repository-based data access\n * - Configurable error throwing behavior\n * - Template methods with lifecycle hooks\n *\n * Backend domain services should extend this class to get automatic\n * CRUD operation handling with standardized validation, mapping, and events.\n *\n * Note: This class ONLY handles repository operations. If you need HTTP API\n * calls, import and use fetchers from `@plyaz/api` directly in your service.\n *\n * @example\n * ```typescript\n * import { BaseBackendDomainService } from '@plyaz/core/domain/base';\n * import type { BaseRepository } from '@plyaz/db';\n *\n * class MyBackendService extends BaseBackendDomainService<\n * MyBackendServiceConfig,\n * MyEntity,\n * MyResponseDTO,\n * CreateMyDTO,\n * UpdateMyDTO,\n * PatchMyDTO,\n * QueryMyDTO,\n * DeleteMyOptions,\n * MyRepository,\n * MyDatabaseRow,\n * MyMapper,\n * MyValidator\n * > {\n * protected repository: MyRepository;\n * protected eventPrefix = 'my-entity';\n *\n * constructor(config: MyBackendServiceConfig) {\n * super({\n * serviceName: 'MyBackendService',\n * supportedRuntimes: ['backend'],\n * serviceConfig: config,\n * mapperClass: MyMapperClass,\n * validatorClass: MyValidatorClass,\n * });\n * this.repository = MyRepository.create();\n * }\n * }\n * ```\n */\n\nimport { CoreEventManager } from '@/events';\nimport { CorePackageError } from '@plyaz/errors';\nimport { BaseDomainService } from './BaseDomainService';\nimport { type CacheManager, CacheKeyBuilder } from '@/base/cache';\nimport type {\n CoreBaseBackendServiceConfig,\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreServiceCreateOptions,\n CoreBaseServiceConfig,\n CrudOperationOptions,\n} from '@plyaz/types/core';\nimport type {\n DatabaseResult,\n PaginatedResult,\n QueryOptions,\n OperationConfig,\n TransactionFn,\n TransactionOptions,\n} from '@plyaz/types/db';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type {\n CoreValidationStartedPayload,\n CoreValidationSuccessPayload,\n CoreValidationFailedPayload,\n CoreSanitizationStartedPayload,\n CoreSanitizationSuccessPayload,\n CoreEntityCreatingPayload,\n CoreEntityCreatedPayload,\n CoreEntityPatchingPayload,\n CoreEntityPatchedPayload,\n CoreEntityDeletingPayload,\n CoreEntityDeletedPayload,\n CoreEntityErrorPayload,\n CoreEntityCompletePayload,\n} from '@plyaz/types/core';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\n\n// Re-export types\nexport type { CoreBaseBackendServiceConfig } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Payload Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Union type of all event payloads used in BaseBackendDomainService\n */\ntype BaseBackendEventPayload =\n | CoreValidationStartedPayload\n | CoreValidationSuccessPayload\n | CoreValidationFailedPayload\n | CoreSanitizationStartedPayload\n | CoreSanitizationSuccessPayload\n | CoreEntityCreatingPayload<unknown>\n | CoreEntityCreatedPayload<unknown>\n | CoreEntityPatchingPayload<unknown>\n | CoreEntityPatchedPayload<unknown>\n | CoreEntityDeletingPayload\n | CoreEntityDeletedPayload\n | CoreEntityErrorPayload\n | CoreEntityCompletePayload;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for backend domain services with automatic CRUD handling.\n *\n * Provides:\n * - Template methods for create/patch/delete/getById\n * - Automatic validation → mapper → repository → mapper flow\n * - Event emission throughout lifecycle\n * - Repository-based data access only\n * - Configurable error throwing\n * - Lifecycle hooks for customization\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create DTO type (POST)\n * @typeParam TUpdateDTO - Update DTO type (PUT)\n * @typeParam TPatchDTO - Patch DTO type (PATCH)\n * @typeParam TQueryDTO - Query DTO type for listing/filtering (defaults to Record<string, unknown>)\n * @typeParam TDeleteOptions - Delete options type\n * @typeParam TRepository - Repository type (must have create/update/delete/findById/findMany methods)\n * @typeParam TDatabaseRow - Database row type\n * @typeParam TStoreState - Store state type (serializable)\n * @typeParam TMapper - Mapper type\n * @typeParam TValidator - Validator type\n */\nexport abstract class BaseBackendDomainService<\n TConfig extends CoreBaseBackendServiceConfig,\n TEntity,\n TResponseDTO,\n // TCreateDTO must be a Record so it can be used in DB transactions\n TCreateDTO extends Record<string, unknown>,\n TUpdateDTO extends Record<string, unknown> = TCreateDTO,\n TPatchDTO extends Partial<Record<string, unknown>> = Partial<TCreateDTO>,\n TQueryDTO extends Record<string, unknown> = Record<string, unknown>,\n TDeleteOptions = { soft: boolean },\n // TDatabaseRow should be compatible with TCreateDTO (create input becomes row output)\n TDatabaseRow extends Record<string, unknown> = TCreateDTO & { id: string },\n TRepository extends {\n create(data: TCreateDTO): Promise<DatabaseResult<TDatabaseRow>>;\n update(id: string, data: TPatchDTO): Promise<DatabaseResult<TDatabaseRow>>;\n softDelete(id: string): Promise<DatabaseResult<void>>;\n delete(id: string): Promise<DatabaseResult<void>>;\n findById(id: string): Promise<DatabaseResult<TDatabaseRow | null>>;\n findMany(\n options?: QueryOptions<TDatabaseRow>,\n config?: OperationConfig\n ): Promise<DatabaseResult<PaginatedResult<TDatabaseRow>>>;\n /** Get table name for transaction operations */\n getTableName(): string;\n } = never,\n TStoreState = TEntity,\n TMapper extends CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n > = CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n >,\n TValidator extends CoreBaseValidatorInstance<\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n TDeleteOptions\n > = CoreBaseValidatorInstance<TCreateDTO, TUpdateDTO, TPatchDTO, TDeleteOptions>,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Properties - Must be implemented by subclasses\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Repository instance for database operations.\n * Subclasses must initialize this in constructor.\n */\n protected abstract repository: TRepository;\n\n /**\n * Event prefix for event emission (e.g., 'example', 'user', 'product').\n * Used to construct event names like '{prefix}:creating', '{prefix}:created'.\n */\n protected abstract eventPrefix: string;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional Properties - Can be overridden by subclasses\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Whether to use cache by default for all CRUD operations.\n * Set from config.cache.enabled or defaults to true.\n * Individual operations can override this via options.cache.useCache.\n * Only applies if cacheManager is available.\n */\n protected useCacheByDefault: boolean;\n\n /**\n * Default TTL for cache entries (in seconds).\n * Set from config.cache.defaultTtl or defaults to 300 (5 minutes).\n */\n protected defaultCacheTtl: number;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Configuration Getters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if should throw on validation errors (default: true)\n */\n protected get throwOnValidationError(): boolean {\n return this.config.throwOnValidationError ?? true;\n }\n\n /**\n * Check if should throw on repository errors (default: true)\n */\n protected get throwOnRepositoryError(): boolean {\n return this.config.throwOnRepositoryError ?? true;\n }\n\n /**\n * Check if should emit events (default: true)\n */\n protected get emitEvents(): boolean {\n return this.config.emitEvents ?? true;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(baseConfig: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n super(baseConfig);\n\n // Initialize cache settings from config\n const config = baseConfig.serviceConfig;\n this.useCacheByDefault = config?.cache?.enabled ?? true;\n this.defaultCacheTtl = config?.cache?.defaultTtl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Public CRUD Methods (Template Pattern)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new entity (POST)\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Emit validation:started event\n * 3. Validate data using validator\n * 4. Emit validation:success event\n * 5. Emit sanitization:started event (Zod transforms already applied)\n * 6. Map to create DTO using mapper\n * 7. Emit creating event\n * 8. Call repository.create()\n * 9. Map response to domain entity\n * 10. Cache the new entity (if enabled)\n * 11. Emit created event\n *\n * @param data - Raw data to validate and create\n * @param options - Operation options (cache, etc.)\n * @returns Created entity\n * @throws ValidationError[] if validation fails (array of errors)\n * @throws CorePackageError if repository call fails\n */\n // eslint-disable-next-line complexity\n async create<TInput = unknown>(data: TInput, options?: CrudOperationOptions): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Creating entity', { data });\n\n // 1. Validation phase\n this.emitEvent('validation:started', {\n operation: 'create',\n data,\n } satisfies CoreValidationStartedPayload);\n\n let validatedData: TCreateDTO;\n try {\n validatedData = this.validator.validateCreateOrThrow(data);\n this.emitEvent('validation:success', {\n operation: 'create',\n validatedData,\n } satisfies CoreValidationSuccessPayload<TCreateDTO>);\n } catch (error) {\n this.emitEvent('validation:failed', {\n error,\n operation: 'create',\n } satisfies CoreValidationFailedPayload);\n throw error;\n }\n\n // 2. Sanitization phase (Zod transforms already applied)\n this.emitEvent('sanitization:started', {\n operation: 'create',\n data: validatedData,\n } satisfies CoreSanitizationStartedPayload);\n\n // 3. Map to DTO (BEFORE insert)\n const requestDTO = this.mapper.toCreateDTO!(validatedData as Partial<TEntity>);\n this.emitEvent('sanitization:complete', {\n operation: 'create',\n sanitizedData: requestDTO,\n } satisfies CoreSanitizationSuccessPayload<TCreateDTO>);\n\n // 4. Lifecycle hook\n await this.beforeCreate(requestDTO);\n\n // 5. Emit creating event\n this.emitEvent('creating', {\n request: requestDTO,\n } satisfies CoreEntityCreatingPayload<TCreateDTO>);\n\n try {\n // 6. Call repository\n const result = await this.repository.create(requestDTO);\n\n if (!result.success || !result.value) {\n throw (\n result.error ??\n new CorePackageError('Failed to create entity', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n // 7. Map response to domain (BEFORE return)\n const responseDTO = this.mapper.toResponseDTO!(result.value);\n const entity = this.mapper.toDomain(responseDTO);\n\n // 8. Lifecycle hook\n await this.afterCreate(entity);\n\n // 9. Cache the new entity (if custom key provided in options)\n const shouldCache = options?.cache?.useCache ?? this.useCacheByDefault;\n if (shouldCache && this.hasCacheManager && options?.cache?.customKey) {\n try {\n const cacheTtl = options.cache.cacheTtl ?? this.defaultCacheTtl;\n await this.cacheSet(options.cache.customKey, entity, cacheTtl);\n this.logDebug('Cached new entity', {\n cacheKey: this.buildCacheKey(options.cache.customKey),\n ttl: cacheTtl,\n });\n } catch (error) {\n this.logWarn('Failed to cache new entity', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 10. Emit created event\n const storeState = this.mapper.toStoreState(entity);\n this.emitEvent('created', {\n entity,\n storeState,\n } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n this.emitEvent('error', {\n error,\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Patch an entity (PATCH - partial update)\n *\n * Flow similar to create but for partial updates\n *\n * @param id - Entity ID\n * @param data - Raw data to validate and patch\n * @param options - Operation options (cache, etc.)\n * @returns Updated entity\n * @throws ValidationError[] if validation fails\n * @throws CorePackageError if repository call fails\n */\n // eslint-disable-next-line complexity\n async patch<TInput = unknown>(\n id: string,\n data: TInput,\n options?: CrudOperationOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Patching entity', { id, data });\n\n // 1. Validation phase\n this.emitEvent('validation:started', {\n operation: 'patch',\n entityId: id,\n data,\n } satisfies CoreValidationStartedPayload);\n\n let validatedData: TPatchDTO;\n try {\n validatedData = this.validator.validatePatchOrThrow(data);\n this.emitEvent('validation:success', {\n operation: 'patch',\n entityId: id,\n validatedData,\n } satisfies CoreValidationSuccessPayload<TPatchDTO>);\n } catch (error) {\n this.emitEvent('validation:failed', {\n error,\n entityId: id,\n operation: 'patch',\n } satisfies CoreValidationFailedPayload);\n throw error;\n }\n\n // 2. Sanitization phase\n this.emitEvent('sanitization:started', {\n operation: 'patch',\n entityId: id,\n data: validatedData,\n } satisfies CoreSanitizationStartedPayload);\n\n // 3. Map to DTO\n const requestDTO = this.mapper.toPatchDTO!(validatedData as Partial<TEntity>);\n this.emitEvent('sanitization:complete', {\n operation: 'patch',\n entityId: id,\n sanitizedData: requestDTO,\n } satisfies CoreSanitizationSuccessPayload<TPatchDTO>);\n\n // 4. Lifecycle hook\n await this.beforePatch(id, requestDTO);\n\n // 5. Emit updating event\n this.emitEvent('patching', {\n id,\n request: requestDTO,\n } satisfies CoreEntityPatchingPayload<TPatchDTO>);\n\n try {\n // 6. Call repository\n const result = await this.repository.update(id, requestDTO);\n\n if (!result.success || !result.value) {\n throw (\n result.error ??\n new CorePackageError('Failed to update entity', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n // 7. Map response to domain\n const responseDTO = this.mapper.toResponseDTO!(result.value);\n const entity = this.mapper.toDomain(responseDTO);\n\n // 8. Lifecycle hook\n await this.afterPatch(id, entity);\n\n // 9. Invalidate cache for this entity (unless disabled)\n const shouldInvalidate = options?.cache?.invalidateCache ?? true;\n if (shouldInvalidate && this.hasCacheManager) {\n try {\n const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n await this.cacheDelete(cacheKey);\n this.logDebug('Invalidated cache after patch', {\n id,\n cacheKey: this.buildCacheKey(cacheKey),\n });\n } catch (error) {\n this.logWarn('Failed to invalidate cache after patch', {\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 10. Emit updated event\n const storeState = this.mapper.toStoreState(entity);\n this.emitEvent('patched', {\n entity,\n storeState,\n } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n entityId: id,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n this.emitEvent('error', {\n error,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Delete an entity (DELETE)\n *\n * @param id - Entity ID\n * @param deleteOptions - Delete options (e.g., soft delete)\n * @param crudOptions - CRUD operation options (cache, etc.)\n * @returns void\n * @throws ValidationError[] if options validation fails\n * @throws CorePackageError if repository call fails\n */\n // eslint-disable-next-line complexity\n async delete<TInput = TDeleteOptions>(\n id: string,\n deleteOptions?: TInput,\n crudOptions?: CrudOperationOptions\n ): Promise<void> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Deleting entity', { id, deleteOptions, crudOptions });\n\n // 1. Validate options if provided\n const validatedOptions = deleteOptions\n ? this.validator.validateDeleteOrThrow(deleteOptions)\n : this.getDefaultDeleteOptions();\n\n // 2. Lifecycle hook\n await this.beforeDelete(id, validatedOptions);\n\n // 3. Emit deleting event\n const isSoftDelete = (validatedOptions as { soft?: boolean })?.soft ?? false;\n this.emitEvent('deleting', {\n id,\n options: { soft: isSoftDelete },\n } satisfies CoreEntityDeletingPayload);\n\n try {\n // 4. Call repository (soft or hard delete)\n const result = isSoftDelete\n ? await this.repository.softDelete(id)\n : await this.repository.delete(id);\n\n if (!result.success) {\n throw (\n result.error ??\n new CorePackageError('Failed to delete entity', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n // 5. Lifecycle hook\n await this.afterDelete(id, validatedOptions);\n\n // 6. Invalidate cache for this entity (unless disabled)\n const shouldInvalidate = crudOptions?.cache?.invalidateCache ?? true;\n if (shouldInvalidate && this.hasCacheManager) {\n try {\n const cacheKey = crudOptions?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n await this.cacheDelete(cacheKey);\n this.logDebug('Invalidated cache after delete', {\n id,\n cacheKey: this.buildCacheKey(cacheKey),\n });\n } catch (error) {\n this.logWarn('Failed to invalidate cache after delete', {\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 7. Emit deleted event\n this.emitEvent('deleted', {\n id,\n soft: isSoftDelete,\n } satisfies CoreEntityDeletedPayload);\n\n this.emitEvent('complete', {\n success: true,\n entityId: id,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n this.emitEvent('error', {\n error,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Get entity by ID (GET) with cache-aside pattern\n *\n * Cache-aside flow:\n * 1. Check cache first (if enabled)\n * 2. If cache hit, return cached entity\n * 3. If cache miss, fetch from DB\n * 4. Cache the result (if enabled)\n *\n * @param id - Entity ID\n * @param options - Operation options (cache, pagination, etc.)\n * @returns Entity or null if not found\n * @throws CorePackageError if repository call fails\n *\n * @example\n * ```typescript\n * // With cache\n * const entity = await service.getById('123', {\n * cache: { useCache: true, cacheTtl: 300 }\n * });\n *\n * // Without cache\n * const entity = await service.getById('123', {\n * cache: { useCache: false }\n * });\n *\n * // With custom cache key (still prefixed with cachePrefix)\n * const entity = await service.getById('123', {\n * cache: { customKey: 'user:active:123' }\n * });\n * // Final cache key will be: 'example:user:active:123'\n * ```\n */\n // eslint-disable-next-line complexity\n async getById(id: string, options?: CrudOperationOptions): Promise<TEntity | null> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Fetching entity by ID', { id, options });\n\n // Use cache if: (explicit option OR default setting) AND cache manager available\n const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n const useCache = useCacheOption && this.hasCacheManager;\n // Use custom key if provided, otherwise use default entity key\n const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n const cacheTtl = options?.cache?.cacheTtl ?? this.defaultCacheTtl;\n\n // 1. Try cache first (cache-aside pattern)\n if (useCache) {\n try {\n const cached = await this.cacheGet<TEntity>(cacheKey);\n if (cached) {\n this.logDebug('Cache hit for entity', { id, cacheKey: this.buildCacheKey(cacheKey) });\n await this.recordCacheMetric(true, 'getById');\n await this.recordOperationMetrics('getById', Date.now() - startTime, true);\n return cached;\n }\n this.logDebug('Cache miss for entity', { id, cacheKey: this.buildCacheKey(cacheKey) });\n await this.recordCacheMetric(false, 'getById');\n } catch (error) {\n this.logWarn('Cache read failed, falling back to DB', {\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 2. Fetch from database\n try {\n const result = await this.repository.findById(id);\n\n if (!result.success) {\n throw (\n result.error ??\n new CorePackageError('Failed to fetch entity', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n if (!result.value) {\n return null;\n }\n\n // 3. Map response to domain\n const responseDTO = this.mapper.toResponseDTO!(result.value);\n const entity = this.mapper.toDomain(responseDTO);\n\n // 4. Cache the result\n if (useCache && entity) {\n try {\n await this.cacheSet(cacheKey, entity, cacheTtl);\n this.logDebug('Cached entity', {\n id,\n cacheKey: this.buildCacheKey(cacheKey),\n ttl: cacheTtl,\n });\n } catch (error) {\n this.logWarn('Cache write failed', {\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Record success metrics\n await this.recordOperationMetrics('getById', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('getById', Date.now() - startTime, false);\n\n this.emitEvent('error', {\n error,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Get all entities (list/query)\n *\n * Flow:\n * 1. Check cache (if enabled)\n * 2. If cache miss, fetch from repository\n * 3. Map response to domain entities\n * 4. Cache the result\n * 5. Return entities\n *\n * @param query - Query parameters for filtering/pagination\n * @param options - Operation options (cache, etc.)\n * @returns Array of entities\n *\n * @example\n * ```typescript\n * // Basic list\n * const users = await service.getAll();\n *\n * // With filters\n * const users = await service.getAll({ status: 'active', page: 1, limit: 10 });\n *\n * // With cache options\n * const users = await service.getAll(\n * { status: 'active' },\n * { cache: { useCache: true, cacheTtl: 600 } }\n * );\n *\n * // With custom cache key\n * const users = await service.getAll(\n * { status: 'active' },\n * { cache: { customKey: CacheKeyBuilder.query('active', { status: 'active' }) } }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async getAll(query?: Partial<TQueryDTO>, options?: CrudOperationOptions): Promise<TEntity[]> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Fetching all entities', { query, options });\n\n // Lifecycle hook\n await this.beforeGetAll(query);\n\n // Use cache if: (explicit option OR default setting) AND cache manager available\n const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n const useCache = useCacheOption && this.hasCacheManager;\n // Use custom key if provided, otherwise use list key with query params\n const cacheKey =\n options?.cache?.customKey ?? CacheKeyBuilder.list(query as Record<string, unknown>);\n const cacheTtl = options?.cache?.cacheTtl ?? this.defaultCacheTtl;\n\n // 1. Try cache first (cache-aside pattern)\n if (useCache) {\n try {\n const cached = await this.cacheGet<TEntity[]>(cacheKey);\n if (cached) {\n this.logDebug('Cache hit for list', { query, cacheKey: this.buildCacheKey(cacheKey) });\n await this.recordCacheMetric(true, 'getAll');\n await this.recordOperationMetrics('getAll', Date.now() - startTime, true);\n await this.afterGetAll(cached, query);\n return cached;\n }\n this.logDebug('Cache miss for list', { query, cacheKey: this.buildCacheKey(cacheKey) });\n await this.recordCacheMetric(false, 'getAll');\n } catch (error) {\n this.logWarn('Cache read failed, falling back to DB', {\n query,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 2. Fetch from database\n try {\n const result = await this.repository.findMany(query);\n\n if (!result.success) {\n throw (\n result.error ??\n new CorePackageError('Failed to fetch entities', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n // 3. Map response to domain entities\n const data = result.value?.data ?? result.value ?? [];\n const entities = (Array.isArray(data) ? data : []).map((item: unknown) => {\n const responseDTO = this.mapper.toResponseDTO!(item);\n return this.mapper.toDomain(responseDTO);\n });\n\n // 4. Cache the result\n if (useCache) {\n try {\n await this.cacheSet(cacheKey, entities, cacheTtl);\n this.logDebug('Cached entity list', {\n query,\n count: entities.length,\n cacheKey: this.buildCacheKey(cacheKey),\n ttl: cacheTtl,\n });\n } catch (error) {\n this.logWarn('Cache write failed', {\n query,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Lifecycle hook\n await this.afterGetAll(entities, query);\n\n // Record success metrics\n await this.recordOperationMetrics('getAll', Date.now() - startTime, true);\n\n return entities;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('getAll', Date.now() - startTime, false);\n\n this.emitEvent('error', {\n error,\n data: { query },\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Check if an entity exists by ID\n *\n * More efficient than getById when you only need to check existence.\n * Uses cache if available, falls back to repository.findById.\n *\n * @param id - Entity ID to check\n * @param options - Optional CRUD operation options\n * @returns Promise resolving to boolean (true if exists, false otherwise)\n *\n * @example\n * ```typescript\n * const exists = await service.exists('123');\n * if (exists) {\n * // Entity exists\n * }\n * ```\n */\n // eslint-disable-next-line complexity\n async exists(id: string, options?: CrudOperationOptions): Promise<boolean> {\n this.assertReady();\n this.logDebug('Checking entity existence', { id, options });\n\n // Lifecycle hook\n await this.beforeExists(id);\n\n // Use cache if enabled\n const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n const useCache = useCacheOption && this.hasCacheManager;\n const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n\n // 1. Try cache first\n if (useCache) {\n try {\n const cached = await this.cacheGet<TEntity>(cacheKey);\n if (cached) {\n this.logDebug('Cache hit for exists check', {\n id,\n cacheKey: this.buildCacheKey(cacheKey),\n });\n await this.afterExists(id, true);\n return true;\n }\n this.logDebug('Cache miss for exists check', {\n id,\n cacheKey: this.buildCacheKey(cacheKey),\n });\n } catch (error) {\n this.logWarn('Cache read failed during exists check, falling back to DB', {\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // 2. Check repository\n try {\n const result = await this.repository.findById(id);\n\n if (!result.success) {\n throw (\n result.error ??\n new CorePackageError(\n 'Failed to check entity existence',\n ERROR_CODES.CORE_OPERATION_FAILED\n )\n );\n }\n\n const exists = result.value !== null;\n\n // Lifecycle hook\n await this.afterExists(id, exists);\n\n return exists;\n } catch (error) {\n this.emitEvent('error', {\n error,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw error;\n }\n }\n\n /**\n * Create multiple entities at once (bulk operation)\n *\n * **Transaction Support (Default: ON)**\n * - Uses database transaction by default for atomic operations\n * - All entities created successfully or none (rollback on failure)\n * - Falls back to sequential creation if transactions not supported\n * - Disable with `options.transaction.useTransaction: false`\n *\n * @param dataArray - Array of data to create entities from\n * @param options - Optional CRUD operation options (includes transaction config)\n * @returns Promise resolving to array of created entities\n *\n * @example\n * ```typescript\n * // Default: Uses transaction (atomic)\n * const entities = await service.bulkCreate([\n * { name: 'Entity 1', amount: 100 },\n * { name: 'Entity 2', amount: 200 },\n * ]);\n *\n * // Explicit: Disable transaction (sequential, partial failures possible)\n * const entities = await service.bulkCreate(data, {\n * transaction: { useTransaction: false }\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n async bulkCreate<TInput = unknown>(\n dataArray: TInput[],\n options?: CrudOperationOptions\n ): Promise<TEntity[]> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Bulk creating entities', { count: dataArray.length, options });\n\n if (!Array.isArray(dataArray)) {\n throw new CorePackageError('Data must be an array', ERROR_CODES.VALIDATION_ERROR);\n }\n\n if (dataArray.length === 0) {\n return [];\n }\n\n // Lifecycle hook - handle errors from hooks\n try {\n await this.beforeBulkCreate(dataArray);\n } catch (error) {\n this.logError('beforeBulkCreate hook failed', { error });\n throw error;\n }\n\n // Determine if we should use transaction (default: true)\n const useTransaction = options?.transaction?.useTransaction !== false;\n const canUseTransaction = useTransaction && this.supportsTransactions;\n\n let createdEntities: TEntity[];\n\n if (canUseTransaction) {\n // Use transaction for atomic bulk create\n this.logDebug('Using transaction for bulk create', { count: dataArray.length });\n\n const txResult = await this.withTransaction(async trx => {\n const entities: TEntity[] = [];\n\n for (const data of dataArray) {\n // Validate\n const validatedData = this.validator.validateCreateOrThrow(data);\n\n // Map to DTO\n const requestDTO = this.mapper.toCreateDTO!(validatedData as Partial<TEntity>);\n\n // Create via transaction using repository's table name\n // Transaction.create<T>(table, data: T) returns DatabaseResult<T>\n const tableName = this.repository.getTableName();\n const createResult = await trx.create(tableName, requestDTO);\n\n if (!createResult.success || !createResult.value) {\n throw (\n createResult.error ??\n new CorePackageError(\n 'Failed to create entity in transaction',\n ERROR_CODES.CORE_OPERATION_FAILED\n )\n );\n }\n\n // Map the created row to domain entity\n // The DB returns the created row which we map through responseDTO to domain\n // Use unknown intermediate cast since DB result matches TDatabaseRow structure\n const responseDTO = this.mapper.toResponseDTO!(\n createResult.value as unknown as TDatabaseRow\n );\n const entity = this.mapper.toDomain(responseDTO);\n entities.push(entity);\n }\n\n return entities;\n }, options?.transaction);\n\n if (!txResult.success || !txResult.value) {\n throw (\n txResult.error ??\n new CorePackageError('Bulk create transaction failed', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n createdEntities = txResult.value;\n\n // Cache all entities after successful transaction\n for (const entity of createdEntities) {\n const entityId = (entity as { id?: string }).id;\n if (entityId) {\n const cacheKey = CacheKeyBuilder.entity(entityId);\n await this.cacheSet(cacheKey, entity, this.defaultCacheTtl);\n }\n }\n } else {\n // Fallback: Sequential creation (no transaction support or disabled)\n if (useTransaction && !this.supportsTransactions) {\n this.logWarn('Transaction requested but not supported, falling back to sequential');\n }\n\n createdEntities = [];\n for (const data of dataArray) {\n const entity = await this.create(data, options);\n createdEntities.push(entity);\n }\n }\n\n // Lifecycle hook - handle errors from hooks\n try {\n await this.afterBulkCreate(createdEntities, dataArray);\n } catch (error) {\n this.logError('afterBulkCreate hook failed', { error });\n throw error;\n }\n\n this.logDebug('Bulk create completed', {\n count: createdEntities.length,\n usedTransaction: canUseTransaction,\n });\n\n // Record success metrics\n await this.recordOperationMetrics('bulkCreate', Date.now() - startTime, true);\n\n return createdEntities;\n }\n\n /**\n * Delete multiple entities at once (bulk operation)\n *\n * **Transaction Support (Default: ON)**\n * - Uses database transaction by default for atomic operations\n * - All entities deleted successfully or none (rollback on failure)\n * - Falls back to sequential deletion if transactions not supported\n * - Disable with `crudOptions.transaction.useTransaction: false`\n *\n * @param ids - Array of entity IDs to delete\n * @param deleteOptions - Optional delete options (soft/hard delete)\n * @param crudOptions - Optional CRUD operation options (includes transaction config)\n * @returns Promise resolving when all deletions complete\n *\n * @example\n * ```typescript\n * // Default: Uses transaction (atomic)\n * await service.bulkDelete(['id1', 'id2', 'id3'], { soft: true });\n *\n * // Explicit: Disable transaction\n * await service.bulkDelete(ids, { soft: true }, {\n * transaction: { useTransaction: false }\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n async bulkDelete<TInput = TDeleteOptions>(\n ids: string[],\n deleteOptions?: TInput,\n crudOptions?: CrudOperationOptions\n ): Promise<void> {\n this.assertReady();\n const startTime = Date.now();\n this.logDebug('Bulk deleting entities', { count: ids.length, deleteOptions, crudOptions });\n\n if (!Array.isArray(ids)) {\n throw new CorePackageError('IDs must be an array', ERROR_CODES.VALIDATION_ERROR);\n }\n\n if (ids.length === 0) {\n return;\n }\n\n // Lifecycle hook - handle errors from hooks\n try {\n await this.beforeBulkDelete(ids, deleteOptions);\n } catch (error) {\n this.logError('beforeBulkDelete hook failed', { error });\n throw error;\n }\n\n // Determine if we should use transaction (default: true)\n const useTransaction = crudOptions?.transaction?.useTransaction !== false;\n const canUseTransaction = useTransaction && this.supportsTransactions;\n\n // Check if soft delete\n const isSoftDelete = (deleteOptions as { soft?: boolean })?.soft !== false;\n\n if (canUseTransaction) {\n // Use transaction for atomic bulk delete\n this.logDebug('Using transaction for bulk delete', { count: ids.length, isSoftDelete });\n\n const txResult = await this.withTransaction(async trx => {\n // Get table name from repository\n const tableName = this.repository.getTableName();\n\n for (const id of ids) {\n // Validate delete options if validator supports it\n if (deleteOptions && this.validator.validateDeleteOrThrow) {\n this.validator.validateDeleteOrThrow(deleteOptions);\n }\n\n // Delete via transaction\n const result = await trx.delete(tableName, id);\n\n if (!result.success) {\n throw (\n result.error ??\n new CorePackageError(\n `Failed to delete entity ${id} in transaction`,\n ERROR_CODES.CORE_OPERATION_FAILED\n )\n );\n }\n }\n\n return ids;\n }, crudOptions?.transaction);\n\n if (!txResult.success) {\n throw (\n txResult.error ??\n new CorePackageError('Bulk delete transaction failed', ERROR_CODES.CORE_OPERATION_FAILED)\n );\n }\n\n // Invalidate cache for all deleted entities after successful transaction\n for (const id of ids) {\n const cacheKey = CacheKeyBuilder.entity(id);\n await this.cacheDelete(cacheKey);\n }\n } else {\n // Fallback: Sequential deletion (no transaction support or disabled)\n if (useTransaction && !this.supportsTransactions) {\n this.logWarn('Transaction requested but not supported, falling back to sequential');\n }\n\n for (const id of ids) {\n await this.delete(id, deleteOptions, crudOptions);\n }\n }\n\n // Lifecycle hook - handle errors from hooks\n try {\n await this.afterBulkDelete(ids, deleteOptions);\n } catch (error) {\n this.logError('afterBulkDelete hook failed', { error });\n throw error;\n }\n\n this.logDebug('Bulk delete completed', {\n count: ids.length,\n usedTransaction: canUseTransaction,\n });\n\n // Record success metrics\n await this.recordOperationMetrics('bulkDelete', Date.now() - startTime, true);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Transaction Support\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Execute operations within a database transaction\n *\n * Provides atomic operations with automatic rollback on failure.\n * Uses the underlying database adapter's transaction support.\n *\n * @param fn - Function containing operations to execute within transaction\n * @param options - Optional transaction configuration\n * @returns Promise resolving to the transaction result\n * @throws Error if transaction fails (auto-rollback occurs)\n *\n * @example\n * ```typescript\n * // Single service transaction\n * const result = await userService.withTransaction(async (trx) => {\n * const user = await trx.create('users', userData);\n * const profile = await trx.create('profiles', { userId: user.id, ...profileData });\n * return { user, profile };\n * });\n *\n * // Cross-service transaction (using shared db instance)\n * const db = Core.db.getDatabase();\n * const result = await db.transaction(async (trx) => {\n * await trx.create('users', userData);\n * await trx.create('audit_logs', { action: 'user_created', ... });\n * });\n * ```\n */\n async withTransaction<T>(\n fn: TransactionFn<T>,\n options?: TransactionOptions\n ): Promise<DatabaseResult<T>> {\n this.assertReady();\n this.logDebug('Starting transaction', { options });\n\n // Get the database service from injected services (typed in BaseDomainService)\n const db = this.dbService;\n if (!db) {\n throw new CorePackageError(\n 'Database service not available for transactions. Ensure DbService is initialized.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n // Check if adapter supports transactions\n if (typeof db.transaction !== 'function') {\n throw new CorePackageError(\n 'Database adapter does not support transactions',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n try {\n // DatabaseServiceInterface.transaction returns DatabaseResult<T>\n const result = await db.transaction(fn, options);\n\n if (result.success) {\n this.logDebug('Transaction completed successfully');\n } else {\n this.logWarn('Transaction failed', { error: result.error });\n }\n\n return result;\n } catch (error) {\n this.logError('Transaction error', { error });\n throw error;\n }\n }\n\n /**\n * Check if transaction support is available\n *\n * @returns true if the database adapter supports transactions\n */\n get supportsTransactions(): boolean {\n return this.dbService !== undefined && typeof this.dbService.transaction === 'function';\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Protected Lifecycle Hooks (Override for custom behavior)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before create operation\n * Override to add custom logic before creating\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforeCreate(_data: TCreateDTO): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after create operation\n * Override to add custom logic after creating\n */\n // eslint-disable-next-line no-unused-vars\n protected async afterCreate(_entity: TEntity): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before bulk create operation\n * Override to add custom logic before bulk creating\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforeBulkCreate<TInput = unknown>(_dataArray: TInput[]): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after bulk create operation\n * Override to add custom logic after bulk creating\n */\n protected async afterBulkCreate<TInput = unknown>(\n // eslint-disable-next-line no-unused-vars\n _entities: TEntity[],\n // eslint-disable-next-line no-unused-vars\n _dataArray: TInput[]\n ): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before getAll operation\n * Override to add custom logic before fetching list\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforeGetAll(_query?: Partial<TQueryDTO>): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after getAll operation\n * Override to add custom logic after fetching list (e.g., invalidate related caches)\n */\n // eslint-disable-next-line no-unused-vars\n protected async afterGetAll(_entities: TEntity[], _query?: Partial<TQueryDTO>): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before patch operation\n * Override to add custom logic before patching\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforePatch(_id: string, _data: TPatchDTO): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after patch operation\n * Override to add custom logic after patching\n */\n // eslint-disable-next-line no-unused-vars\n protected async afterPatch(_id: string, _entity: TEntity): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before delete operation\n * Override to add custom logic before deleting\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforeDelete(_id: string, _options: TDeleteOptions): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after delete operation\n * Override to add custom logic after deleting\n */\n // eslint-disable-next-line no-unused-vars\n protected async afterDelete(_id: string, _options: TDeleteOptions): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before bulk delete operation\n * Override to add custom logic before bulk deleting\n */\n protected async beforeBulkDelete<TInput = TDeleteOptions>(\n // eslint-disable-next-line no-unused-vars\n _ids: string[],\n // eslint-disable-next-line no-unused-vars\n _deleteOptions?: TInput\n ): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after bulk delete operation\n * Override to add custom logic after bulk deleting\n */\n protected async afterBulkDelete<TInput = TDeleteOptions>(\n // eslint-disable-next-line no-unused-vars\n _ids: string[],\n // eslint-disable-next-line no-unused-vars\n _deleteOptions?: TInput\n ): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called before exists check\n * Override to add custom logic before checking existence\n */\n // eslint-disable-next-line no-unused-vars\n protected async beforeExists(_id: string): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Called after exists check\n * Override to add custom logic after checking existence\n */\n // eslint-disable-next-line no-unused-vars\n protected async afterExists(_id: string, _exists: boolean): Promise<void> {\n // Default: no-op\n }\n\n /**\n * Get default delete options\n * Override to customize default behavior\n */\n protected getDefaultDeleteOptions(): TDeleteOptions {\n return { soft: true } as TDeleteOptions;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Protected Event Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Emit event with prefix\n * Only emits if emitEvents is true\n */\n protected emitEvent<TPayload extends BaseBackendEventPayload>(\n event: string,\n payload: TPayload\n ): void {\n if (this.emitEvents) {\n CoreEventManager.emit(`${this.eventPrefix}:${event}`, payload);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Cache Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Build cache key with service prefix.\n * ALWAYS applies the cachePrefix. Override this method to customize key structure.\n *\n * @param key - Cache key (without prefix)\n * @returns Prefixed cache key (e.g., 'example:entity:123')\n *\n * @example\n * ```typescript\n * // Default behavior\n * buildCacheKey('entity:123') // Returns: 'example:entity:123'\n *\n * // Override for custom namespacing\n * protected buildCacheKey(key: string): string {\n * const baseKey = super.buildCacheKey(key);\n * return `${baseKey}:tenant:${this.tenantId}`;\n * }\n * ```\n */\n protected buildCacheKey(key: string): string {\n return `${this.cachePrefix}:${key}`;\n }\n\n /**\n * Get value from cache with automatic prefix.\n * Prefix is ALWAYS applied via buildCacheKey().\n *\n * @param key - Cache key (will be prefixed automatically)\n * @returns Cached value or null\n */\n protected async cacheGet<T = unknown>(key: string): Promise<T | null> {\n if (!this.cacheManager) return null;\n const cache = this.cacheManager as CacheManager;\n const finalKey = this.buildCacheKey(key);\n return cache.get<T>(finalKey);\n }\n\n /**\n * Set value in cache with automatic prefix.\n * Prefix is ALWAYS applied via buildCacheKey().\n *\n * @param key - Cache key (will be prefixed automatically)\n * @param value - Value to cache\n * @param ttl - TTL in seconds (optional)\n */\n protected async cacheSet<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.cacheManager) return;\n const cache = this.cacheManager as CacheManager;\n const finalKey = this.buildCacheKey(key);\n await cache.set(finalKey, value, ttl);\n }\n\n /**\n * Delete value from cache with automatic prefix.\n * Prefix is ALWAYS applied via buildCacheKey().\n *\n * @param key - Cache key (will be prefixed automatically)\n */\n protected async cacheDelete(key: string): Promise<void> {\n if (!this.cacheManager) return;\n const cache = this.cacheManager as CacheManager;\n const finalKey = this.buildCacheKey(key);\n await cache.delete(finalKey);\n }\n\n /**\n * Clear all cache for this service (by prefix pattern)\n */\n protected async cacheClear(): Promise<void> {\n if (!this.cacheManager) return;\n const cache = this.cacheManager as CacheManager;\n await cache.clear();\n }\n\n /**\n * Check if cache is available\n */\n protected get hasCacheManager(): boolean {\n return !!this.cacheManager;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get cache manager instance from create options.\n * The cache instance is injected by ServiceRegistry, not created here.\n *\n * @param options - Service create options from ServiceRegistry\n * @returns CacheManager instance or undefined if not available\n */\n static getCacheManager(options?: CoreServiceCreateOptions): CacheManager | undefined {\n // Cache instance is already created/injected by ServiceRegistry\n return options?.cache?.instance as CacheManager | undefined;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Track a CRUD operation with observability (span + metrics).\n * Wraps an operation with automatic span creation, duration recording, and error tracking.\n *\n * @param operation - Operation name (create, patch, delete, getById, getAll)\n * @param entityId - Optional entity ID for context\n * @param fn - The operation function to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const entity = await this.trackOperation('create', undefined, async () => {\n * return await this.repository.create(data);\n * });\n * ```\n */\n protected async trackOperation<T>(\n operation:\n | 'create'\n | 'patch'\n | 'delete'\n | 'getById'\n | 'getAll'\n | 'bulkCreate'\n | 'bulkDelete'\n | 'transaction',\n entityId: string | undefined,\n fn: () => Promise<T>\n ): Promise<T> {\n const startTime = Date.now();\n const spanName = `${this.eventPrefix}.${operation}`;\n\n return this.withSpan(spanName, async span => {\n if (entityId) {\n span.setAttribute('entity.id', entityId);\n }\n span.setAttribute('service.name', this.serviceName);\n span.setAttribute('operation.name', operation);\n\n try {\n const result = await fn();\n\n // Record success metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, true);\n\n span.setStatus('ok');\n return result;\n } catch (error) {\n // Record error metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, false);\n\n span.recordException(error as Error);\n span.setStatus('error', (error as Error).message);\n throw error;\n }\n });\n }\n\n /**\n * Record operation metrics (duration and count).\n * Called automatically by CRUD methods when observability is enabled.\n */\n protected async recordOperationMetrics(\n operation: string,\n duration: number,\n success: boolean\n ): Promise<void> {\n if (!this.hasObservability) return;\n\n const tags = {\n service: this.serviceName,\n operation,\n entity: this.eventPrefix,\n };\n\n // Record duration\n await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n // Record count\n await this.incrementCounter(\n success\n ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n 1,\n tags\n );\n }\n\n /**\n * Record cache hit/miss metric.\n */\n protected async recordCacheMetric(hit: boolean, operation: string): Promise<void> {\n if (!this.hasObservability) return;\n\n const tags = {\n service: this.serviceName,\n operation,\n entity: this.eventPrefix,\n };\n\n await this.incrementCounter(\n hit ? OBSERVABILITY_METRICS.CACHE_HIT : OBSERVABILITY_METRICS.CACHE_MISS,\n 1,\n tags\n );\n }\n}\n","/**\n * Base Mapper\n *\n * Abstract base class for domain mappers handling data transformation.\n * Supports all HTTP operations with corresponding mapping methods.\n *\n * Mapping concerns:\n * - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)\n * - Response mapping (API DTO → domain)\n * - Store mapping (domain ↔ Zustand state)\n * - Query mapping (filters → query params)\n *\n * Note: Validation is handled by BaseValidator, not here.\n *\n * @example\n * ```typescript\n * class ExampleMapper extends BaseMapper<\n * ExampleEntity, // Domain model\n * ExampleResponseDTO, // API response\n * CreateExampleDTO, // POST body\n * UpdateExampleDTO, // PUT body\n * PatchExampleDTO, // PATCH body\n * QueryExampleDTO, // GET params\n * ExampleStoreItem // Store state\n * > {\n * toDomain(dto) { ... }\n * toCreateDTO(data) { ... }\n * // ... implement needed methods\n * }\n * ```\n */\n// Import for local use\nimport type { CoreBaseMapperInstance } from '@plyaz/types/core';\n\n/**\n * Abstract base mapper with default implementations\n *\n * Required to implement:\n * - toDomain(dto): Convert API response to domain model\n *\n * Optional to implement (based on your needs):\n * - toCreateDTO(data): For POST requests\n * - toUpdateDTO(data): For PUT requests\n * - toPatchDTO(data): For PATCH requests\n * - toQueryDTO(filters): For GET query params\n * - toStoreState(domain): Custom store state shape\n * - fromStoreState(state): Restore domain from store\n */\nexport abstract class BaseMapper<\n TDomain,\n TResponseDTO,\n TCreateDTO = unknown,\n TUpdateDTO = TCreateDTO,\n TPatchDTO = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TDomain,\n> implements\n CoreBaseMapperInstance<\n TDomain,\n TResponseDTO,\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n TQueryDTO,\n TStoreState\n >\n{\n // ─────────────────────────────────────────────────────────────────\n // Abstract methods - must be implemented\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert API response DTO to domain model\n * Handle snake_case → camelCase, add computed properties\n */\n abstract toDomain(dto: TResponseDTO): TDomain;\n\n // ─────────────────────────────────────────────────────────────────\n // Request Mapping - override as needed\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain data to create DTO (POST body)\n * Handle camelCase → snake_case, pick required fields\n */\n toCreateDTO?(data: Partial<TDomain>): TCreateDTO;\n\n /**\n * Convert domain data to update DTO (PUT body - full replacement)\n * Default: same as toCreateDTO\n */\n toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;\n\n /**\n * Convert domain data to patch DTO (PATCH body - partial)\n * Default: picks only defined fields\n */\n toPatchDTO?(data: Partial<TDomain>): TPatchDTO;\n\n /**\n * Convert filter object to query params DTO (GET)\n * Handle pagination, sorting, filtering\n */\n toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;\n\n // ─────────────────────────────────────────────────────────────────\n // Response Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert database row/repository result to response DTO\n * Override to map repository output to API response format\n * Useful when repository returns different format than API expects\n */\n toResponseDTO?(row: unknown): TResponseDTO;\n\n /**\n * Map array of DTOs to domain models\n */\n toDomainList(dtos: TResponseDTO[]): TDomain[] {\n return dtos.map(dto => this.toDomain(dto));\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Store Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain model to store state (serializable)\n * Default: strips functions, keeps data\n */\n toStoreState(domain: TDomain): TStoreState {\n const state = {} as Record<string, unknown>;\n for (const [key, value] of Object.entries(domain as Record<string, unknown>)) {\n if (typeof value !== 'function') {\n // Convert Date to ISO string for serialization\n if (value instanceof Date) {\n state[key] = value.toISOString();\n } else {\n state[key] = value;\n }\n }\n }\n return state as TStoreState;\n }\n\n /**\n * Convert array of domain models to aggregated store state\n * Override to customize how multiple items map to store\n * Default: returns array of individual store states (as Partial since shape may differ)\n */\n toStoreStateList?(domains: TDomain[]): Partial<TStoreState> {\n // Default: map each domain to store state and return as array\n // Subclasses should override for custom aggregation (e.g., flags → Record<key, value>)\n return domains.map(d => this.toStoreState(d)) as unknown as Partial<TStoreState>;\n }\n\n /**\n * Restore domain model from store state\n * Override to restore computed properties/methods\n */\n fromStoreState(state: TStoreState): TDomain {\n return state as unknown as TDomain;\n }\n}\n","/**\n * Base Validator\n *\n * Abstract base class for domain validators.\n * Handles validation AND sanitization using Zod schemas from @plyaz/types.\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT - full replacement)\n * - patch (PATCH - partial update)\n * - delete (DELETE with options)\n * - query (GET params)\n *\n * @example\n * ```typescript\n * import { CreateExampleSchema, PatchExampleSchema } from '@plyaz/types/examples';\n *\n * class ExampleValidator extends BaseValidator<\n * CreateExampleDTO, // create\n * UpdateExampleDTO, // update (full)\n * PatchExampleDTO, // patch (partial)\n * DeleteExampleDTO, // delete options\n * QueryExampleDTO // query params\n * > {\n * constructor() {\n * super({\n * createSchema: CreateExampleSchema,\n * patchSchema: PatchExampleSchema,\n * // ... other schemas\n * });\n * }\n * }\n * ```\n */\n\nimport { ValidateAndFormatErrors, ValidationError } from '@plyaz/errors';\nimport type {\n ValidationIssue,\n BaseErrorContext,\n InternalValidationSchema,\n} from '@plyaz/types/errors';\nimport { API_ERROR_CODES } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/config';\nimport type {\n CoreValidationResult,\n CoreValidatorConfig,\n CoreBaseValidatorInstance,\n} from '@plyaz/types/core';\n\n/**\n * Abstract base validator with default implementations\n */\nexport abstract class BaseValidator<\n TCreate = unknown,\n TUpdate = TCreate,\n TPatch = Partial<TCreate>,\n TDelete = unknown,\n TQuery = unknown,\n> implements CoreBaseValidatorInstance<TCreate, TUpdate, TPatch, TDelete, TQuery>\n{\n protected readonly config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery>;\n\n constructor(config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery> = {}) {\n this.config = config;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Validation Methods (return ValidationResult)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate data for create operation (POST)\n */\n validateCreate(data: unknown): CoreValidationResult<TCreate> {\n if (!this.config.createSchema) {\n return { success: true, data: data as TCreate };\n }\n return this.validate(data, this.config.createSchema);\n }\n\n /**\n * Validate data for full update operation (PUT)\n */\n validateUpdate(data: unknown): CoreValidationResult<TUpdate> {\n if (!this.config.updateSchema) {\n return { success: true, data: data as TUpdate };\n }\n return this.validate(data, this.config.updateSchema);\n }\n\n /**\n * Validate data for partial update operation (PATCH)\n */\n validatePatch(data: unknown): CoreValidationResult<TPatch> {\n if (!this.config.patchSchema) {\n return { success: true, data: data as TPatch };\n }\n return this.validate(data, this.config.patchSchema);\n }\n\n /**\n * Validate data for delete operation (DELETE with options)\n */\n validateDelete(data: unknown): CoreValidationResult<TDelete> {\n if (!this.config.deleteSchema) {\n return { success: true, data: data as TDelete };\n }\n return this.validate(data, this.config.deleteSchema);\n }\n\n /**\n * Validate query parameters (GET list)\n */\n validateQuery(data: unknown): CoreValidationResult<TQuery> {\n if (!this.config.querySchema) {\n return { success: true, data: data as TQuery };\n }\n return this.validate(data, this.config.querySchema);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // OrThrow Methods (throw ValidationError on failure)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate and throw if invalid (for create)\n * @throws ValidationError[] (array) if validation fails\n */\n validateCreateOrThrow(data: unknown): TCreate {\n const result = this.validateCreate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for update)\n * @throws ValidationError[] (array) if validation fails\n */\n validateUpdateOrThrow(data: unknown): TUpdate {\n const result = this.validateUpdate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for patch)\n * @throws ValidationError[] (array) if validation fails\n */\n validatePatchOrThrow(data: unknown): TPatch {\n const result = this.validatePatch(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for delete)\n * @throws ValidationError[] (array) if validation fails\n */\n validateDeleteOrThrow(data: unknown): TDelete {\n const result = this.validateDelete(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for query)\n * @throws ValidationError[] (array) if validation fails\n */\n validateQueryOrThrow(data: unknown): TQuery {\n const result = this.validateQuery(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Protected Methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Internal validation using ValidateAndFormatErrors from @plyaz/errors\n * This handles both validation AND sanitization (via Zod transforms)\n */\n protected validate<T>(\n data: unknown,\n schema: InternalValidationSchema<T>\n ): CoreValidationResult<T> {\n const result = ValidateAndFormatErrors(schema, data);\n\n if (!result.success) {\n return {\n success: false,\n errors: result.errors,\n };\n }\n\n return {\n success: true,\n data: result.data as T,\n };\n }\n\n /**\n * Convert ValidationIssue[] to array of ValidationError objects\n * Each validation issue becomes a separate ValidationError\n */\n protected toValidationErrorArray(issues?: ValidationIssue[]): ValidationError[] {\n if (!issues || issues.length === 0) {\n return [];\n }\n\n return issues.map(issue => {\n const field = issue.path.join('.');\n return new ValidationError(\n API_ERROR_CODES.VALIDATION_FAILED,\n HTTP_STATUS.BAD_REQUEST,\n issue.message,\n {\n field,\n path: issue.path,\n code: issue.code,\n }\n );\n });\n }\n\n /**\n * Convert ValidationIssue[] to BaseErrorContext (legacy)\n * @deprecated Use toValidationErrorArray instead\n */\n protected toErrorContext(issues?: ValidationIssue[]): BaseErrorContext {\n if (!issues || issues.length === 0) {\n return {};\n }\n return {\n errors: issues.map(issue => ({\n errorCode: issue.code,\n message: issue.message,\n field: issue.path.join('.'),\n context: {\n path: issue.path,\n },\n })),\n };\n }\n}\n","/**\n * Mapper Utility Functions\n *\n * Common utilities for data transformation in mappers.\n */\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Parse ISO date string to Date object\n */\nexport function parseDate(dateString: string | null | undefined): Date | null {\n if (!dateString) return null;\n const date = new Date(dateString);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format Date to ISO string for API\n */\nexport function formatDate(date: Date | null | undefined): string | null {\n return date?.toISOString() ?? null;\n}\n\n/**\n * Trim string if defined\n */\nexport function trimString(str: string | undefined): string | undefined {\n return str?.trim();\n}\n\n/**\n * Pick only defined values from object (for PATCH requests)\n */\nexport function pickDefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Convert object keys from snake_case to camelCase\n */\nexport function keysToCamel<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[snakeToCamel(key)] = value;\n }\n return result;\n}\n\n/**\n * Convert object keys from camelCase to snake_case\n */\nexport function keysToSnake<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[camelToSnake(key)] = value;\n }\n return result;\n}\n","/**\n * Feature Flag Service\n *\n * Domain service that wraps the provider and provides a unified API\n * for feature flag operations. This is the main entry point for\n * feature flag functionality.\n *\n * @fileoverview Domain service for feature flags\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\n\n/**\n * Feature Flag Service\n *\n * The main service for feature flag operations. Wraps the provider\n * and adds logging, error handling, and lifecycle management.\n *\n * @example\n * ```typescript\n * // Create via factory\n * const service = await FeatureFlagServiceFactory.createAndInitialize(config, FEATURES);\n *\n * // Use directly\n * const isEnabled = await service.isEnabled('MY_FEATURE');\n * const flag = await service.createFlag({ key: 'NEW_FLAG', value: true, name: 'New Flag' });\n * ```\n */\nexport class FeatureFlagService<FeatureFlagKey extends string> {\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagService',\n });\n\n private isInitialized = false;\n\n constructor(\n private readonly provider: FeatureFlagProvider<FeatureFlagKey>,\n private readonly config: FeatureFlagConfig<FeatureFlagKey>\n ) {}\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initializes the service and underlying provider.\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n await this.provider.initialize();\n this.isInitialized = true;\n this.logger.info(`Feature flag service initialized with ${this.config.provider} provider`);\n } catch (error) {\n this.logger.error('Failed to initialize feature flag service', { error });\n throw error;\n }\n }\n\n /**\n * Disposes the service and underlying provider.\n */\n dispose(): void {\n this.provider.dispose();\n this.isInitialized = false;\n this.logger.info('Feature flag service disposed');\n }\n\n /**\n * Refreshes the provider cache.\n */\n async refresh(): Promise<void> {\n await this.provider.refresh();\n this.logger.debug('Feature flag cache refreshed');\n }\n\n /**\n * Gets whether the service is initialized.\n */\n getIsInitialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Gets the provider type.\n */\n getProviderType(): string {\n return this.config.provider;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Read Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Evaluates a feature flag.\n */\n async getFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n return this.provider.getFlag(key, context);\n }\n\n /**\n * Gets all feature flag evaluations.\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n return this.provider.getAllFlags(context);\n }\n\n /**\n * Checks if a feature flag is enabled.\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n return this.provider.isEnabled(key, context);\n }\n\n /**\n * Gets the value of a feature flag.\n */\n async getValue<T = FeatureFlagValue>(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n return this.provider.getValue<T>(key, context);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag.\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n const flag = await this.provider.createFlag(data);\n this.logger.info('Feature flag created', { key: data.key });\n return flag;\n }\n\n /**\n * Updates an existing feature flag.\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const flag = await this.provider.updateFlag(key, data);\n this.logger.info('Feature flag updated', { key });\n return flag;\n }\n\n /**\n * Deletes a feature flag.\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n await this.provider.deleteFlag(key);\n this.logger.info('Feature flag deleted', { key });\n }\n\n /**\n * Gets all rules for a specific flag.\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.provider.getRules(key);\n }\n\n /**\n * Gets all enabled rules.\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.provider.getAllRules();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Override Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Sets a runtime override for a flag.\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.provider.setOverride(key, value);\n this.logger.debug('Override set', { key, value });\n }\n\n /**\n * Removes a runtime override for a flag.\n */\n removeOverride(key: FeatureFlagKey): void {\n this.provider.removeOverride(key);\n this.logger.debug('Override removed', { key });\n }\n\n /**\n * Clears all runtime overrides.\n */\n clearOverrides(): void {\n this.provider.clearOverrides();\n this.logger.debug('All overrides cleared');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribes to flag changes.\n */\n subscribe(callback: () => void): () => void {\n return this.provider.subscribe(callback);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Provider Access (for advanced use cases)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Gets the underlying provider instance.\n * Use with caution - prefer service methods.\n */\n getProvider(): FeatureFlagProvider<FeatureFlagKey> {\n return this.provider;\n }\n}\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\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';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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 CorePackageError(\n `Invalid condition: ${validation.errors.join(', ')}`,\n ERROR_CODES.VALIDATION_ERROR\n );\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 { PackageLogger } from '@plyaz/logger';\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 /** Logger instance */\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagEngine',\n });\n\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 * Gets all targeting rules.\n *\n * @returns Array of all feature flag rules\n */\n getRules(): FeatureFlagRule<FeatureFlagKey>[] {\n const allRules: FeatureFlagRule<FeatureFlagKey>[] = [];\n for (const rules of this.rules.values()) {\n allRules.push(...rules);\n }\n return allRules;\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 this.logger.debug(args.map(arg => String(arg)).join(' '));\n }\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 FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\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 // Flag Management Operations\n // Each provider implements these based on its storage backend:\n // - Memory: in-memory storage (ephemeral)\n // - File: JSON/YAML file storage\n // - Redis: Redis storage\n // - API: External API calls\n // - Database: Database storage\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n abstract createFlag(\n data: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Updates an existing feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n abstract updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Deletes a feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to delete\n */\n abstract deleteFlag(key: FeatureFlagKey): Promise<void>;\n\n /**\n * Gets all rules for a specific flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n abstract getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n /**\n * Gets all enabled rules across all flags.\n * Abstract - each provider implements based on its storage backend.\n *\n * @returns Array of all enabled rules\n */\n abstract getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional Extensions\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 CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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 CorePackageError(\n 'Memory provider requires provider to be set to \"memory\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (this.config.memoryRules && !Array.isArray(this.config.memoryRules)) {\n throw new CorePackageError(\n 'memoryRules must be an array if provided',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 // Flag Management Operations (implements abstract methods)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag in memory.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n if (this.flags.some(f => f.key === data.key)) {\n throw new CorePackageError(\n `Flag with key ${data.key} already exists`,\n ERROR_CODES.DB_DUPLICATE_ENTRY\n );\n }\n\n const currentTime = new Date();\n const newFlag: FeatureFlag<FeatureFlagKey> = {\n key: data.key,\n name: data.name,\n description: data.description ?? '',\n value: data.value,\n isEnabled: data.isEnabled ?? true,\n type: this.inferFlagType(data.value),\n environment: data.environment ?? 'all',\n rolloutPercentage: data.rolloutPercentage,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'memory-runtime',\n updatedBy: 'memory-runtime',\n };\n\n this.flags.push(newFlag);\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n\n this.log(`Created flag: ${data.key}`);\n return newFlag;\n }\n\n /**\n * Updates an existing feature flag in memory.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const flagIndex = this.flags.findIndex(f => f.key === key);\n if (flagIndex === -1) {\n throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n }\n\n const existingFlag = this.flags[flagIndex];\n const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n ...existingFlag,\n ...data,\n key, // Ensure key doesn't change\n type: data.value !== undefined ? this.inferFlagType(data.value) : existingFlag.type,\n updatedAt: new Date(),\n updatedBy: 'memory-runtime',\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 return updatedFlag;\n }\n\n /**\n * Deletes a feature flag from memory.\n *\n * @param key - Flag key to delete\n */\n async deleteFlag(key: FeatureFlagKey): Promise<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 throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n }\n\n this.engine.setFlags(this.flags);\n void this.cacheManager.clear();\n this.notifySubscribers();\n this.log(`Deleted flag: ${key}`);\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.rules.filter(rule => rule.flagKey === key);\n }\n\n /**\n * Gets all enabled rules.\n *\n * @returns Array of all enabled rules\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.rules.filter(rule => rule.isEnabled);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Memory-specific methods (beyond abstract interface)\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 CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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\nconst FORMAT_JSON_INDENT = 2;\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 flags: FeatureFlag<FeatureFlagKey>[] = [];\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 flags and rules for CRUD operations\n this.flags = data.flags || [];\n this.rules = data.rules || [];\n\n return {\n flags: this.flags,\n rules: this.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 CorePackageError(\n `Unsupported file format: ${format}`,\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 CorePackageError(\n 'File provider requires provider to be set to \"file\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (!this.config.fileConfig) {\n throw new CorePackageError(\n 'File configuration is required for file provider',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n const { filePath, format } = this.config.fileConfig;\n\n if (!filePath) {\n throw new CorePackageError('File path is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n }\n\n if (!format || !['json', 'yaml'].includes(format)) {\n throw new CorePackageError(\n 'File format must be either \"json\" or \"yaml\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 CorePackageError(\n `Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.VALIDATION_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 CorePackageError(\n `Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.VALIDATION_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 CorePackageError('File must contain a valid object', ERROR_CODES.VALIDATION_ERROR);\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 CorePackageError('\"flags\" must be an array', ERROR_CODES.VALIDATION_ERROR);\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 CorePackageError('\"rules\" must be an array', ERROR_CODES.VALIDATION_ERROR);\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 CorePackageError(\n `Flag at index ${index} must be an object`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n const flagObj = flag as Record<string, unknown>;\n if (!flagObj.key || typeof flagObj.key !== 'string') {\n throw new CorePackageError(\n `Flag at index ${index} must have a \"key\" property`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n if (flagObj.value === undefined) {\n throw new CorePackageError(\n `Flag \"${flagObj.key}\" must have a \"value\" property`,\n ERROR_CODES.VALIDATION_ERROR\n );\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 CorePackageError(\n `Rule at index ${index} must be an object`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n const ruleObj = rule as Record<string, unknown>;\n if (!ruleObj.id || typeof ruleObj.id !== 'string') {\n throw new CorePackageError(\n `Rule at index ${index} must have an \"id\" property`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n if (!ruleObj.flagKey || typeof ruleObj.flagKey !== 'string') {\n throw new CorePackageError(\n `Rule \"${ruleObj.id}\" must have a \"flagKey\" property`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n if (!Array.isArray(ruleObj.conditions)) {\n throw new CorePackageError(\n `Rule \"${ruleObj.id}\" must have a \"conditions\" array`,\n ERROR_CODES.VALIDATION_ERROR\n );\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 // Flag Management Operations (implements abstract methods)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag and persists to file.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n if (this.flags.some(f => f.key === data.key)) {\n throw new CorePackageError(\n `Flag with key ${data.key} already exists`,\n ERROR_CODES.DB_DUPLICATE_ENTRY\n );\n }\n\n const currentTime = new Date();\n const newFlag: FeatureFlag<FeatureFlagKey> = {\n key: data.key,\n name: data.name,\n description: data.description ?? '',\n value: data.value,\n isEnabled: data.isEnabled ?? true,\n type: this.inferFlagType(data.value),\n environment: data.environment ?? 'all',\n rolloutPercentage: data.rolloutPercentage,\n createdAt: currentTime,\n updatedAt: currentTime,\n createdBy: 'file-provider',\n updatedBy: 'file-provider',\n };\n\n this.flags.push(newFlag);\n await this.persistToFile();\n this.log(`Created flag: ${data.key}`);\n return newFlag;\n }\n\n /**\n * Updates an existing feature flag and persists to file.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const flagIndex = this.flags.findIndex(f => f.key === key);\n if (flagIndex === -1) {\n throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n }\n\n const existingFlag = this.flags[flagIndex];\n const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n ...existingFlag,\n ...data,\n key, // Ensure key doesn't change\n type: data.value !== undefined ? this.inferFlagType(data.value) : existingFlag.type,\n updatedAt: new Date(),\n updatedBy: 'file-provider',\n };\n\n this.flags[flagIndex] = updatedFlag;\n await this.persistToFile();\n this.log(`Updated flag: ${key}`);\n return updatedFlag;\n }\n\n /**\n * Deletes a feature flag and persists to file.\n *\n * @param key - Flag key to delete\n */\n async deleteFlag(key: FeatureFlagKey): Promise<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 throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n }\n\n await this.persistToFile();\n this.log(`Deleted flag: ${key}`);\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.rules.filter(rule => rule.flagKey === key);\n }\n\n /**\n * Gets all enabled rules.\n *\n * @returns Array of all enabled rules\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n return this.rules.filter(rule => rule.isEnabled);\n }\n\n /**\n * Persists current flags and rules to file.\n *\n * @private\n */\n private async persistToFile(): Promise<void> {\n const { filePath, format } = this.config.fileConfig!;\n const resolvedPath = this.resolveFilePath(filePath);\n\n const fileData: FileData<FeatureFlagKey> = {\n flags: this.flags,\n rules: this.rules,\n };\n\n let content: string;\n if (format === 'json') {\n content = JSON.stringify(fileData, null, FORMAT_JSON_INDENT);\n } else {\n content = yaml.stringify(fileData);\n }\n\n await writeFile(resolvedPath, content, 'utf-8');\n this.lastFileContent = content;\n\n // Update engine with new flags\n this.engine.setFlags(this.flags);\n this.engine.setRules(this.rules);\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Infers the flag type from its value.\n *\n * @private\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 // File-specific methods (beyond abstract interface)\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 CorePackageError(\n `Failed to sync features to file: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.STORAGE_FILE_WRITE_FAILED\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 CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\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 CorePackageError(\n 'Redis provider requires @plyaz/core on Cache implementation',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\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 CorePackageError(\n 'Redis Provider is not yet fully implemented. Requires integration with cache layer.',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\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 CorePackageError(\n 'Redis provider requires provider to be set to \"redis\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (!this.config.redisConfig) {\n throw new CorePackageError(\n 'Redis configuration is required for Redis provider',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (!this.config.redisConfig.url) {\n throw new CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n }\n\n if (!this.isValidRedisUrl(this.config.redisConfig.url)) {\n throw new CorePackageError(\n 'Redis URL must be a valid Redis connection string (redis:// or rediss://)',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 // Flag Management Operations (stub implementations)\n // ─────────────────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line no-unused-vars\n async createFlag(_data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n throw new CorePackageError(\n 'Redis provider not yet implemented',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\n }\n\n async updateFlag(\n // eslint-disable-next-line no-unused-vars\n _key: FeatureFlagKey,\n // eslint-disable-next-line no-unused-vars\n _data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n throw new CorePackageError(\n 'Redis provider not yet implemented',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n async deleteFlag(_key: FeatureFlagKey): Promise<void> {\n throw new CorePackageError(\n 'Redis provider not yet implemented',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n async getRules(_key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n throw new CorePackageError(\n 'Redis provider not yet implemented',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\n }\n\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n throw new CorePackageError(\n 'Redis provider not yet implemented',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n );\n }\n}\n","/**\n * API Feature Flag Provider\n *\n * Provider adapter that uses @plyaz/api services with an injected API client\n * to fetch feature flags from a remote API. This provider extends the base\n * FeatureFlagProvider and implements fetchData() using the API services.\n *\n * @fileoverview API provider adapter for feature flags\n * @version 2.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagValue,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n// Import API services from @plyaz/api\nimport {\n createFeatureFlag as apiCreateFlag,\n updateFeatureFlag as apiUpdateFlag,\n deleteFeatureFlag as apiDeleteFlag,\n evaluateAllFeatureFlags as apiEvaluateAllFlags,\n fetchFeatureFlagRules as apiFetchRules,\n} from '@plyaz/api';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport type { ApiFeatureFlagConfig as _ApiFeatureFlagConfig } from '@plyaz/types/features';\n\n// API client type from ServiceOptions\ntype ApiClientType = NonNullable<ServiceOptions['apiClient']>;\n\n/**\n * API response type for fetching flags and rules\n */\ninterface ApiFetchResponse<TKey extends string> {\n flags: FeatureFlag<TKey>[];\n rules: FeatureFlagRule<TKey>[];\n}\n\n/**\n * API-based feature flag provider\n *\n * Uses @plyaz/api services with an injected API client to communicate with the backend.\n * Pass your configured API client via the config.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // Get client from ApiClientService\n * const apiClient = ApiClientService.getClient();\n *\n * const provider = new ApiFeatureFlagProvider({\n * provider: 'api',\n * apiClient,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('new-feature');\n * ```\n */\nexport class ApiFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n protected readonly apiClient: ApiClientType;\n\n /**\n * Creates a new API feature flag provider.\n *\n * @param config - Provider configuration with API client\n * @param features - Record of feature flag keys to default values\n */\n constructor(\n config: _ApiFeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n\n if (!config.apiClient) {\n throw new CorePackageError(\n 'API provider requires apiClient in config',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.apiClient = config.apiClient;\n this.validateConfig();\n }\n\n /**\n * Get service options with injected client\n */\n private getServiceOptions(): ServiceOptions {\n return { apiClient: this.apiClient };\n }\n\n /** Wrap error in CorePackageError if not already a package error */\n private wrapError(error: unknown): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n // Wrap other errors\n return new CorePackageError(\n `API request failed: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.NETWORK_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n\n /** Transform API response to flags/rules */\n private transformResponse(data: ApiFetchResponse<FeatureFlagKey> | undefined): {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n } {\n const flags = data?.flags ?? [];\n const rules = data?.rules ?? [];\n this.log(`Fetched ${flags.length} flags and ${rules.length} rules from API`);\n return { flags, rules };\n }\n\n /**\n * Fetches flags and rules from the API endpoint using @plyaz/api services.\n *\n * @protected\n * @returns Promise resolving to flags and rules data\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n try {\n const apiConfig = this.config as _ApiFeatureFlagConfig<FeatureFlagKey>;\n const response = await apiEvaluateAllFlags<FeatureFlagKey>(\n { context: apiConfig.context },\n this.getServiceOptions()\n );\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to fetch feature flags: ${response.error?.message}`,\n ERROR_CODES.NETWORK_ERROR\n );\n }\n\n const data = response.data as unknown as ApiFetchResponse<FeatureFlagKey>;\n return this.transformResponse(data);\n } catch (error) {\n throw this.wrapError(error);\n }\n }\n\n /**\n * Validates the API provider configuration.\n *\n * @private\n */\n private validateConfig(): void {\n if (this.config.provider !== 'api') {\n throw new CorePackageError(\n 'API provider requires provider to be set to \"api\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.log('API provider configured');\n }\n\n /**\n * Gets API provider status and configuration info.\n */\n getApiInfo(): {\n hasApiClient: boolean;\n } {\n return {\n hasApiClient: Boolean(this.apiClient),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management Operations (using @plyaz/api services)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag via API\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n const requestData = {\n ...data,\n isEnabled: data.isEnabled ?? true,\n environment: data.environment ?? 'development',\n description: data.description ?? '',\n };\n const response = await apiCreateFlag<FeatureFlagKey>(requestData, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to create flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Updates a feature flag via API\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const response = await apiUpdateFlag<FeatureFlagKey>({ key, data }, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to update flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Deletes a feature flag via API\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n const response = await apiDeleteFlag<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to delete flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n }\n\n /**\n * Gets rules for a specific flag via API\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n const response = await apiFetchRules<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to get rules: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n return (response.data as unknown as { rules: FeatureFlagRule<FeatureFlagKey>[] })?.rules ?? [];\n }\n\n /**\n * Gets all rules via API\n * Note: This requires fetching rules for all flags individually or a dedicated endpoint\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n // For now, return the rules from the engine (populated by fetchData)\n // A dedicated API endpoint would be needed for a direct call\n return this.engine.getRules();\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 { generateId } from '../../utils/common';\nimport {\n type FeatureFlag,\n type FeatureFlagRule,\n type FeatureFlagValue,\n type CreateFlagRequest,\n type FeatureFlagContext,\n} from '@plyaz/types';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { DbService } from '../../services/DbService';\nimport {\n SORT_DIRECTION,\n FEATURE_FLAG_TABLE,\n FEATURE_FLAG_FIELD,\n FEATURE_FLAG_RULE_FIELD,\n type CoreDatabaseFeatureFlagRow,\n type CoreDatabaseFeatureFlagRuleRow,\n type CoreDatabaseOverrideRow,\n type CoreDatabaseEvaluationRow,\n type CoreEnvironmentFilterRow,\n type CoreFeatureFlagTableConfig,\n} from '@plyaz/types/core';\nimport {\n DATABASE_FIELDS,\n SYSTEM_USERS,\n EVALUATION_REASONS,\n FEATURE_FLAG_TYPES,\n} from '@plyaz/types/core';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\n\n/**\n * Default table configuration using standard table names.\n */\nconst DEFAULT_TABLE_CONFIG: CoreFeatureFlagTableConfig = {\n flagsTable: FEATURE_FLAG_TABLE.FeatureFlags,\n rulesTable: FEATURE_FLAG_TABLE.FeatureFlagRules,\n evaluationsTable: FEATURE_FLAG_TABLE.FeatureFlagEvaluations,\n overridesTable: FEATURE_FLAG_TABLE.FeatureFlagOverrides,\n evaluationsSchema: 'public',\n};\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.fromOptions()\n * 3. → DbService.initialize()\n * 4. → **THIS REPOSITORY USED** ← YOU ARE HERE\n * 5. → Database queries executed via @plyaz/db\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 readonly tableConfig: CoreFeatureFlagTableConfig;\n\n /**\n * Creates a new repository with optional custom table names.\n *\n * @param tableConfig - Optional custom table configuration\n *\n * @example Default tables\n * ```typescript\n * const repo = new FeatureFlagDatabaseRepository();\n * // Uses: feature_flags, feature_flag_rules, feature_flag_evaluations, feature_flag_overrides\n * ```\n *\n * @example Custom test tables\n * ```typescript\n * const repo = new FeatureFlagDatabaseRepository({\n * flagsTable: 'test_feature_flags',\n * rulesTable: 'test_feature_flag_rules',\n * evaluationsTable: 'test_feature_flag_evaluations',\n * overridesTable: 'test_feature_flag_overrides',\n * evaluationsSchema: 'audit',\n * });\n * ```\n */\n constructor(tableConfig?: Partial<CoreFeatureFlagTableConfig>) {\n this.tableConfig = {\n ...DEFAULT_TABLE_CONFIG,\n ...tableConfig,\n };\n }\n\n /**\n * Gets the current table configuration.\n */\n getTableConfig(): CoreFeatureFlagTableConfig {\n return { ...this.tableConfig };\n }\n\n /**\n * Gets the full table name including schema if needed.\n */\n private getEvaluationsTableName(): string {\n const { evaluationsSchema, evaluationsTable } = this.tableConfig;\n return evaluationsSchema && evaluationsSchema !== 'public'\n ? `${evaluationsSchema}.${evaluationsTable}`\n : evaluationsTable;\n }\n\n /**\n * Gets the database service from DbService singleton\n */\n private getDb(): DatabaseServiceInterface {\n return DbService.getInstance().getDatabase();\n }\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.getDb();\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(this.tableConfig.flagsTable, options);\n\n if (!result.success) {\n console.warn('Query failed, returning empty array:', result.error?.message);\n return [];\n }\n\n const flags = result.value?.data ?? [];\n\n const filteredFlags = environment\n ? (flags as unknown as CoreEnvironmentFilterRow[]).filter(flag => {\n return Boolean(flag.environments?.includes(environment));\n })\n : flags;\n\n return filteredFlags.map(flag =>\n this.mapToFeatureFlag(flag as unknown as CoreDatabaseFeatureFlagRow)\n );\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.getDb();\n\n // Feature flag tables use 'key' as primary key, not 'id'\n const result = await db.get(this.tableConfig.flagsTable, key, {\n idColumn: 'key',\n });\n\n if (!result.success) {\n throw new DatabasePackageError(\n `Failed to get flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.NO_DATA\n );\n }\n\n return result.value\n ? this.mapToFeatureFlag(result.value as unknown as CoreDatabaseFeatureFlagRow)\n : 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.getDb();\n\n const flagData = {\n [FEATURE_FLAG_FIELD.Key]: data.key,\n [FEATURE_FLAG_FIELD.Name]: data.name || data.key,\n [FEATURE_FLAG_FIELD.Value]: data.value,\n [FEATURE_FLAG_FIELD.Type]: this.toTypeField(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(this.tableConfig.flagsTable, flagData);\n\n if (!result.success || !result.value) {\n throw new DatabasePackageError(\n `Failed to create flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.CREATE_FAILED\n );\n }\n\n return this.mapToFeatureFlag(result.value as unknown as CoreDatabaseFeatureFlagRow);\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 // eslint-disable-next-line complexity\n async updateFlag(key: TKey, data: Partial<CreateFlagRequest<TKey>>): Promise<FeatureFlag<TKey>> {\n const db = this.getDb();\n\n // Map camelCase properties to snake_case database columns\n const updateData: Record<string, unknown> = {\n [FEATURE_FLAG_FIELD.UpdatedAt]: new Date().toISOString(),\n };\n\n // Only include fields that are actually being updated\n if (data.value !== undefined) {\n updateData[FEATURE_FLAG_FIELD.Value] = data.value;\n updateData[FEATURE_FLAG_FIELD.Type] = this.toTypeField(data.value);\n }\n if (data.isEnabled !== undefined) {\n updateData[FEATURE_FLAG_FIELD.IsEnabled] = data.isEnabled;\n }\n if (data.description !== undefined) {\n updateData[FEATURE_FLAG_FIELD.Description] = data.description;\n }\n if (data.name !== undefined) {\n updateData[FEATURE_FLAG_FIELD.Name] = data.name;\n }\n if (data.environment !== undefined) {\n updateData[FEATURE_FLAG_FIELD.Environments] = [data.environment];\n }\n\n // Feature flag tables use 'key' as primary key, not 'id'\n const result = await db.update(this.tableConfig.flagsTable, key, updateData, {\n idColumn: 'key',\n });\n\n if (!result.success || !result.value) {\n throw new DatabasePackageError(\n `Failed to update flag: ${result.error?.message}`,\n DATABASE_ERROR_CODES.UPDATE_FAILED\n );\n }\n\n return this.mapToFeatureFlag(result.value as unknown as CoreDatabaseFeatureFlagRow);\n }\n\n /**\n * Infers the type of a given value as a string for the type field\n * @param value Unknown value\n * @returns Inferred type as string\n */\n private toTypeField(value: unknown): string {\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 * 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.getDb();\n\n // Feature flag tables use 'key' as primary key, not 'id'\n const result = await db.delete(this.tableConfig.flagsTable, key, {\n idColumn: 'key',\n });\n\n if (!result.success) {\n throw new DatabasePackageError(\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.getDb();\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 this.tableConfig.rulesTable,\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 =>\n this.mapToFeatureFlagRule(rule as unknown as CoreDatabaseFeatureFlagRuleRow)\n );\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.getDb();\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 this.tableConfig.rulesTable,\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 =>\n this.mapToFeatureFlagRule(rule as unknown as CoreDatabaseFeatureFlagRuleRow)\n );\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.getDb();\n\n const evaluationData: CoreDatabaseEvaluationRow = {\n id: generateId(),\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 value: params.result, // Map result to value column\n is_enabled: typeof params.result === 'boolean' ? params.result : !!params.result, // Infer is_enabled\n reason: EVALUATION_REASONS.Default, // General evaluation uses default reason\n evaluated_at: new Date().toISOString(),\n };\n\n const result = await db.create(\n this.getEvaluationsTableName(),\n evaluationData as unknown as Record<string, unknown>\n );\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.getDb();\n\n const overrideData: CoreDatabaseOverrideRow = {\n id: generateId(),\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(\n this.tableConfig.overridesTable,\n overrideData as unknown as Record<string, unknown>\n );\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.getDb();\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 this.tableConfig.overridesTable,\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 unknown as CoreDatabaseOverrideRow[];\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.getDb();\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 this.tableConfig.overridesTable,\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 unknown as CoreDatabaseOverrideRow[];\n const overridesToDelete = typedOverrides.filter(override => override.user_id === userId);\n\n for (const override of overridesToDelete) {\n await db.delete(this.tableConfig.overridesTable, 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: CoreDatabaseFeatureFlagRow): 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: CoreDatabaseFeatureFlagRow): 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: CoreDatabaseFeatureFlagRow): 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: CoreDatabaseFeatureFlagRow): 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: CoreDatabaseFeatureFlagRuleRow): 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 using DbService for persistent storage.\n * Requires Core.initialize() to be called first with database config.\n *\n * @fileoverview Database provider for feature flags\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagConfig,\n FeatureFlagValue,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\nimport { DbService } from '../../../services/DbService';\nimport { FeatureFlagDatabaseRepository } from '@models/featureFlags';\nimport type { CoreFeatureFlagTableConfig } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n/**\n * Database-based feature flag provider with @plyaz/db integration.\n *\n * Uses DbService (configured via Core.initialize()) for database operations.\n * No connection string needed here - DbService handles all connection details.\n *\n * @class DatabaseFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // First: Initialize Core with database config\n * await Core.initialize({\n * db: { adapter: 'sql', sql: { connectionString: '...' } }\n * });\n *\n * // Then: Create database provider\n * const provider = new DatabaseFeatureFlagProvider({\n * provider: 'database',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n * await provider.initialize();\n * ```\n */\nexport class DatabaseFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n private repository: FeatureFlagDatabaseRepository<FeatureFlagKey>;\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'DatabaseFeatureFlagProvider',\n });\n\n /**\n * Creates a new database feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Default feature flag values\n */\n constructor(\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n\n // Build table config from databaseConfig (only include defined values)\n // This prevents undefined values from overriding defaults in the repository\n const tableConfig: Partial<CoreFeatureFlagTableConfig> | undefined = config.databaseConfig\n ? (Object.fromEntries(\n Object.entries({\n flagsTable: config.databaseConfig.tableName,\n rulesTable: config.databaseConfig.rulesTableName,\n evaluationsTable: config.databaseConfig.evaluationsTableName,\n overridesTable: config.databaseConfig.overridesTableName,\n evaluationsSchema: config.databaseConfig.evaluationsSchema,\n }).filter(([, value]) => value !== undefined)\n ) as Partial<CoreFeatureFlagTableConfig>)\n : undefined;\n\n // Create repository with custom table names if provided\n this.repository = new FeatureFlagDatabaseRepository<FeatureFlagKey>(tableConfig);\n }\n\n /**\n * Initialize database connection via DbService\n */\n async initialize(): Promise<void> {\n // Ensure DbService is initialized (via Core.initialize())\n if (!DbService.isInitialized()) {\n throw new CorePackageError(\n 'DbService not initialized. Call Core.initialize() with db config before using database provider.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n this.logger.info('Database feature flag provider initializing');\n await super.initialize();\n this.logger.info('Database feature flag provider initialized');\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 try {\n const [flags, rules] = await Promise.all([\n this.repository.getAllFlags(),\n this.repository.getAllRules(),\n ]);\n\n this.logger.debug(`Fetched ${flags.length} flags and ${rules.length} rules from database`);\n\n return { flags, rules };\n } catch (error) {\n this.logger.error('Failed to fetch feature flag data from database', { error });\n throw error;\n }\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n super.dispose();\n // DbService cleanup is handled at application level, not per-provider\n }\n\n /**\n * Gets database provider status and configuration info.\n *\n * @returns Database provider status information\n */\n getDatabaseInfo(): {\n tableName: string;\n isImplemented: boolean;\n dbServiceInitialized: boolean;\n } {\n return {\n tableName: this.config.databaseConfig?.tableName ?? 'feature_flags',\n isImplemented: true,\n dbServiceInitialized: DbService.isInitialized(),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // CRUD Operations (supported by database provider)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag in the database.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.debug('Creating feature flag', { key: data.key });\n const flag = await this.repository.createFlag(data);\n await this.refresh();\n this.logger.info('Feature flag created', { key: data.key });\n return flag;\n }\n\n /**\n * Updates an existing feature flag in the database.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n this.logger.debug('Updating feature flag', { key });\n const flag = await this.repository.updateFlag(key, data);\n await this.refresh();\n this.logger.info('Feature flag updated', { key });\n return flag;\n }\n\n /**\n * Deletes a feature flag from the database.\n *\n * @param key - Flag key to delete\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n this.logger.debug('Deleting feature flag', { key });\n await this.repository.deleteFlag(key);\n await this.refresh();\n this.logger.info('Feature flag deleted', { key });\n }\n\n /**\n * Gets all rules for a specific flag.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n this.logger.debug('Getting rules for flag', { key });\n return this.repository.getFlagRules(key);\n }\n\n /**\n * Gets all enabled rules across all flags.\n *\n * @returns Array of all enabled rules\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n this.logger.debug('Getting all rules');\n return this.repository.getAllRules();\n }\n}\n","/**\n * Feature Flag Service Factory\n *\n * Factory class for creating feature flag services with configured providers.\n *\n * @fileoverview Service factory for feature flag system\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagConfig,\n FeatureFlagProvider,\n FeatureFlagValue,\n FeatureFlagProviderType,\n} from '@plyaz/types/features';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagService } from '../service';\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 * Note: Some providers (like ApiFeatureFlagProvider) have extended config requirements.\n */\nconst PROVIDER_REGISTRY = {\n memory: MemoryFeatureFlagProvider,\n file: FileFeatureFlagProvider,\n redis: RedisFeatureFlagProvider,\n api: ApiFeatureFlagProvider,\n database: DatabaseFeatureFlagProvider,\n} as const;\n\n/**\n * Feature flag service factory for creating service instances with providers.\n *\n * @class FeatureFlagServiceFactory\n *\n * @example\n * ```typescript\n * // Create and initialize service\n * const service = await FeatureFlagServiceFactory.createAndInitialize({\n * provider: 'database',\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * // Use the service\n * const isEnabled = await service.isEnabled('MY_FEATURE');\n * await service.createFlag({ key: 'NEW', value: true, name: 'New Flag' });\n * ```\n */\nexport class FeatureFlagServiceFactory {\n /**\n * Creates a new feature flag service with the configured provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Configured service instance (not yet initialized)\n */\n static createService<K extends string>(\n config: FeatureFlagConfig<K>,\n features: Record<K, FeatureFlagValue>\n ): FeatureFlagService<K> {\n const provider = FeatureFlagProviderFactory.create(config, features);\n return new FeatureFlagService(provider, config);\n }\n\n /**\n * Creates and initializes a feature flag service.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n * @returns Promise resolving to initialized service instance\n */\n static async createAndInitialize<K extends string>(\n config: FeatureFlagConfig<K>,\n features: Record<K, FeatureFlagValue>\n ): Promise<FeatureFlagService<K>> {\n const service = this.createService(config, features);\n await service.initialize();\n return service;\n }\n\n /**\n * Creates a default service with memory provider.\n *\n * @param features - Record of feature flag keys to their default values\n * @param overrides - Optional configuration overrides\n * @returns Service instance\n */\n static createDefaultService<K extends string>(\n features: Record<K, FeatureFlagValue>,\n overrides?: Partial<FeatureFlagConfig<K>>\n ): FeatureFlagService<K> {\n const config: FeatureFlagConfig<K> = {\n provider: 'memory',\n isCacheEnabled: true,\n cacheTtl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n refreshInterval: 0,\n isLoggingEnabled: false,\n shouldFallbackToDefaults: true,\n ...overrides,\n };\n return this.createService(config, features);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Factory (internal use, or for advanced use cases)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature flag provider factory for creating provider instances directly.\n * For most use cases, use FeatureFlagServiceFactory instead.\n *\n * @class FeatureFlagProviderFactory\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 CorePackageError(\n `Unsupported provider type: ${config.provider}. Supported: ${this.getSupportedProviders().join(', ')}`,\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n try {\n // Cast to any to allow provider-specific config extensions (e.g., ApiFeatureFlagConfig)\n return new (ProviderClass as new (\n config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) => FeatureFlagProvider<FeatureFlagKey>)(config, features);\n } catch (error) {\n throw new CorePackageError(\n `Failed to create ${config.provider} provider: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\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(): FeatureFlagProviderType[] {\n return Object.keys(PROVIDER_REGISTRY) as FeatureFlagProviderType[];\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 FeatureFlagProviderType {\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 FeatureFlagProviderType,\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 FeatureFlagProviderType,\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 CorePackageError(\n 'Provider type does not support feature syncing. Only MemoryProvider and FileProvider support this.',\n ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\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 CorePackageError(\n 'Provider configuration is required',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (!config.provider) {\n throw new CorePackageError(\n 'Provider type is required in configuration',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n if (!this.isProviderSupported(config.provider)) {\n throw new CorePackageError(\n `Unsupported provider type: ${config.provider}. Supported: ${this.getSupportedProviders().join(', ')}`,\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n // Validate cache configuration\n if (config.isCacheEnabled && config.cacheTtl <= 0) {\n throw new CorePackageError(\n 'Cache TTL must be greater than 0 when caching is enabled',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n // Validate refresh interval\n if (config.refreshInterval < 0) {\n throw new CorePackageError(\n 'Refresh interval cannot be negative',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 CorePackageError(\n `Unknown provider type: ${config.provider}`,\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\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 CorePackageError(\n 'File format must be either \"json\" or \"yaml\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n }\n }\n\n private static validateRedisConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.redisConfig) {\n throw new CorePackageError(\n 'Redis configuration is required for Redis provider',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n }\n\n private static validateApiConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.apiEndpoint) {\n throw new CorePackageError(\n 'API endpoint is required for API provider',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n }\n\n private static validateDatabaseConfig<FeatureFlagKey extends string>(\n config: FeatureFlagConfig<FeatureFlagKey>\n ): void {\n if (!config.databaseConfig) {\n throw new CorePackageError(\n 'Database configuration is required for database provider',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n }\n}\n","/**\n * Feature Flag Module - Shared Service Factory\n *\n * Provides the service factory used by the NestJS FeatureFlagModule.\n * For NestJS usage, import from '@plyaz/core/backend/featureFlags'.\n */\n\nimport type { FeatureFlagConfig } from '@plyaz/types';\nimport type { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';\nimport { FeatureFlagServiceFactory } from './providers/factory';\nimport type { FeatureFlagService } from './service';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES, FEATURE_FLAG_CACHE_TTL_DEFAULT } from '@plyaz/config';\nimport { CorePackageError } from '@plyaz/errors';\n\nconst defaultConfig: CoreFeatureFlagModuleConfig = {\n provider: 'memory',\n refreshInterval: 0,\n loggingEnabled: false,\n cache: {\n enabled: true,\n ttl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n },\n};\n\ntype ProviderConfig = Partial<FeatureFlagConfig<FeatureFlagKey>>;\n\n/** Build base config shared by all providers */\nfunction buildBaseConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n return {\n provider: config.provider ?? 'memory',\n isCacheEnabled: config.cache?.enabled ?? true,\n cacheTtl: config.cache?.ttl ?? FEATURE_FLAG_CACHE_TTL_DEFAULT,\n refreshInterval: config.refreshInterval ?? 0,\n isLoggingEnabled: config.loggingEnabled ?? false,\n };\n}\n\n/** Build database provider config */\nfunction buildDatabaseProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n return {\n databaseConfig: {\n connectionString: '', // Not needed, DbService is already initialized\n tableName: config.db?.tableName ?? 'feature_flags',\n rulesTableName: config.db?.rulesTableName,\n evaluationsTableName: config.db?.evaluationsTableName,\n overridesTableName: config.db?.overridesTableName,\n evaluationsSchema: config.db?.evaluationsSchema,\n },\n };\n}\n\n/** Build redis provider config */\nfunction buildRedisProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n if (!config.redis?.url) {\n throw new Error(\n 'Redis URL is required when using redis provider. Provide redis: { url: \"redis://...\" }'\n );\n }\n return {\n redisConfig: {\n url: config.redis.url,\n keyPrefix: config.redis.keyPrefix ?? 'feature_flags:',\n },\n };\n}\n\n/** Build API provider config */\n// eslint-disable-next-line complexity\nfunction buildApiProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n if (!config.api?.client && !config.api?.clientConfig?.baseURL) {\n throw new CorePackageError(\n 'API provider requires either api.client (ApiClientService instance) or api.clientConfig.baseURL'\n );\n }\n return {\n apiEndpoint: config.api?.clientConfig?.baseURL ?? 'injected-client',\n };\n}\n\n/** Build file provider config */\nfunction buildFileProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n return {\n fileConfig: {\n filePath: config.file?.path ?? './feature-flags.json',\n format: config.file?.format ?? 'json',\n shouldWatchForChanges: config.file?.watch ?? false,\n },\n };\n}\n\n/** Provider config builders map */\nconst providerConfigBuilders: Record<\n string,\n (config: CoreFeatureFlagModuleConfig) => ProviderConfig\n> = {\n database: buildDatabaseProviderConfig,\n redis: buildRedisProviderConfig,\n api: buildApiProviderConfig,\n file: buildFileProviderConfig,\n};\n\nfunction toServiceConfig(\n config: CoreFeatureFlagModuleConfig\n): Partial<FeatureFlagConfig<FeatureFlagKey>> {\n const baseConfig = buildBaseConfig(config);\n const providerBuilder = providerConfigBuilders[config.provider ?? 'memory'];\n\n if (!providerBuilder) {\n return baseConfig;\n }\n\n return { ...baseConfig, ...providerBuilder(config) };\n}\n\n/**\n * Injection token for NestJS DI\n */\nexport const FEATURE_FLAG_SERVICE = 'FEATURE_FLAG_SERVICE';\n\n/**\n * Creates the FeatureFlagService\n * Used by NestJS FeatureFlagModule internally\n */\nexport async function createFeatureFlagService(\n config: CoreFeatureFlagModuleConfig = defaultConfig\n): Promise<FeatureFlagService<FeatureFlagKey>> {\n const serviceConfig = toServiceConfig(config);\n return FeatureFlagServiceFactory.createAndInitialize(\n serviceConfig as FeatureFlagConfig<FeatureFlagKey>,\n FEATURES\n );\n}\n\n// Re-export service for direct access\nexport { FeatureFlagService } from './service';\n","/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagKey,\n FeatureFlagRule,\n FeatureFlagContext,\n FeatureFlagValue,\n FeatureFlagEvaluation,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { createApiClient } from '@plyaz/api';\nimport { ApiFeatureFlagProvider } from '../../domain/featureFlags/providers/api';\nimport { BaseFrontendDomainService } from '../base';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n CoreFrontendFeatureFlagEventType,\n CoreFeatureFlagStore,\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagServiceInitConfig,\n CoreFeatureFlagServiceInterface,\n CoreServiceCreateOptions,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default cache TTL in seconds (5 minutes) */\nconst DEFAULT_CACHE_TTL_SECONDS = 300;\n/** Default refresh interval in milliseconds (1 minute) */\nconst DEFAULT_REFRESH_INTERVAL_MS = 60000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\nexport class FrontendFeatureFlagDomainService\n extends BaseFrontendDomainService<\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagStore,\n Record<string, FeatureFlagValue>\n >\n implements CoreFeatureFlagServiceInterface\n{\n // ─────────────────────────────────────────────────────────────────────────\n // Static: ServiceRegistry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.FEATURE_FLAGS;\n\n /** Build API client for feature flags */\n private static async buildApiClient(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<ReturnType<typeof createApiClient>> {\n const apiBasePath =\n config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/feature-flags';\n return createApiClient({ ...options?.apiClient?.options, baseURL: apiBasePath });\n }\n\n /** Build feature flag provider */\n private static buildProvider(\n config: CoreFeatureFlagServiceInitConfig,\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n ): ApiFeatureFlagProvider<FeatureFlagKey> {\n return new ApiFeatureFlagProvider<FeatureFlagKey>(\n {\n provider: 'api',\n apiClient,\n isCacheEnabled: true,\n cacheTtl: config.cacheTtl ?? DEFAULT_CACHE_TTL_SECONDS,\n context: config.defaultContext,\n refreshInterval: config.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_MS,\n shouldFallbackToDefaults: config.shouldFallbackToDefaults ?? true,\n },\n config.featureKeys ?? {}\n );\n }\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n */\n static async create(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendFeatureFlagDomainService> {\n const apiClient = await FrontendFeatureFlagDomainService.buildApiClient(config, options);\n const provider = FrontendFeatureFlagDomainService.buildProvider(config, apiClient);\n await provider.initialize();\n\n return new FrontendFeatureFlagDomainService({\n enabled: config.enabled ?? true,\n provider,\n defaultContext: config.defaultContext,\n defaults: config.defaults,\n store: config.store,\n readStores: config.readStores,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Instance\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'featureFlag';\n\n private readonly provider: CoreFeatureFlagServiceConfig['provider'];\n\n constructor(config: CoreFeatureFlagServiceConfig) {\n super({\n serviceName: 'FeatureFlagDomainService',\n supportedRuntimes: ['frontend', 'universal'],\n serviceConfig: { enabled: true, defaults: {}, ...config },\n });\n\n this.provider = config.provider;\n this._initialized = true;\n\n this.logInfo('Service initialized', { storeCount: this.connectedStoreCount });\n CoreEventManager.emit('featureFlag:provider:initialized', { providerType: 'api' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Lifecycle\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && this.provider !== null;\n }\n\n dispose(): void {\n this.provider?.dispose();\n CoreEventManager.emit('featureFlag:provider:disposed', {});\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Provider Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n async refresh(): Promise<void> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n await this.provider.refresh();\n CoreEventManager.emit('featureFlag:provider:refreshed', {});\n\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations));\n }\n\n this.logDebug('Provider refreshed and synced');\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Evaluation\n // ─────────────────────────────────────────────────────────────────────────\n\n async evaluate<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<TKey>> {\n this.assertReady();\n const ctx = context ?? this.config.defaultContext;\n\n CoreEventManager.emit('featureFlag:evaluating', { key, context: ctx });\n\n try {\n const result = await this.provider.getFlag(key, ctx);\n CoreEventManager.emit('featureFlag:evaluated', { key, result });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: result.value });\n }\n\n return result as FeatureFlagEvaluation<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:evaluate:error', { key, error });\n throw error;\n }\n }\n\n async isEnabled<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<boolean> {\n this.assertReady();\n return this.provider.isEnabled(key, context ?? this.config.defaultContext);\n }\n\n async getValue<T = FeatureFlagValue, TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n this.assertReady();\n return this.provider.getValue<T>(key, context ?? this.config.defaultContext);\n }\n\n async evaluateAll<TKey extends string = string>(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<TKey>>> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n const result = await this.provider.getAllFlags(context ?? this.config.defaultContext);\n\n if (this.hasConnectedStores) {\n this.syncToStores(this.toValues(result));\n }\n\n return result as Record<string, FeatureFlagEvaluation<TKey>>;\n } catch (error) {\n this.logError('Failed to evaluate all flags', { error });\n throw error;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n async fetchAndSyncAll(context?: FeatureFlagContext): Promise<Record<string, FeatureFlagValue>> {\n const evaluations = await this.evaluateAll(context);\n return this.toValues(evaluations);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: CRUD (renamed to avoid base class conflicts)\n // ─────────────────────────────────────────────────────────────────────────\n\n async createFlag<TKey extends string = string>(\n data: CreateFlagRequest<TKey>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:creating', { data });\n\n try {\n const flag = await this.provider.createFlag(data);\n CoreEventManager.emit('featureFlag:created', { flag });\n this.logInfo('Flag created', { key: data.key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [data.key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:create:error', { error, data });\n throw error;\n }\n }\n\n async updateFlag<TKey extends string = string>(\n key: TKey,\n data: Partial<CreateFlagRequest<TKey>>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:updating', { key, data });\n\n try {\n const flag = await this.provider.updateFlag(key, data);\n CoreEventManager.emit('featureFlag:updated', { flag });\n this.logInfo('Flag updated', { key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:update:error', { error, key });\n throw error;\n }\n }\n\n async deleteFlag<TKey extends string = string>(key: TKey): Promise<void> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:deleting', { key });\n\n try {\n await this.provider.deleteFlag(key);\n CoreEventManager.emit('featureFlag:deleted', { key });\n this.logInfo('Flag deleted', { key });\n\n // Refresh all to remove deleted flag from stores\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations), true);\n }\n } catch (error) {\n CoreEventManager.emit('featureFlag:delete:error', { error, key });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Rules\n // ─────────────────────────────────────────────────────────────────────────\n\n async getRules<TKey extends string = string>(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getRules(key) as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n async getAllRules<TKey extends string = string>(): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getAllRules() as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Overrides\n // ─────────────────────────────────────────────────────────────────────────\n\n setOverride<TKey extends string = string>(key: TKey, value: FeatureFlagValue): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:setting', { key, value });\n this.provider.setOverride(key, value);\n CoreEventManager.emit('featureFlag:override:set', { key, value });\n }\n\n removeOverride<TKey extends string = string>(key: TKey): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:removing', { key });\n this.provider.removeOverride(key);\n CoreEventManager.emit('featureFlag:override:removed', { key });\n }\n\n clearOverrides(): void {\n this.assertReady();\n this.provider.clearOverrides();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n subscribe(callback: () => void): () => void {\n this.assertReady();\n return this.provider.subscribe(callback);\n }\n\n on(event: CoreFrontendFeatureFlagEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Protected: Store Sync Override\n // ─────────────────────────────────────────────────────────────────────────\n\n protected override syncToStores(flags: Record<string, FeatureFlagValue>, replace = false): void {\n if (!this.primaryStore) return;\n\n try {\n if (!replace && this.primaryStore.updateFlags) {\n this.primaryStore.updateFlags(flags);\n } else {\n this.primaryStore.setFlags(flags);\n }\n } catch (error) {\n this.logError('Store sync failed', { error });\n }\n\n this.logDebug('Synced to stores', {\n count: this.connectedStoreCount,\n flags: Object.keys(flags).length,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private toValues(\n evaluations: Record<string, FeatureFlagEvaluation<string>>\n ): Record<string, FeatureFlagValue> {\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(evaluations)) {\n values[key] = evaluation.value;\n }\n return values;\n }\n}\n","/**\n * Feature Flag Mapper\n *\n * Handles transformation between different feature flag data representations:\n * - API Response (DTO) → Domain Entity\n * - Domain Entity → Store State\n * - Domain → API Request (DTO)\n *\n * @fileoverview Feature flag data mapper\n * @version 1.0.0\n */\n\nimport { BaseMapper } from '../../base/BaseMapper';\nimport type {\n FeatureFlag,\n FeatureFlagValue,\n FeatureFlagRule,\n FeatureFlagEvaluation,\n CreateFlagRequest,\n FetchFeatureFlagDataResponse,\n FeatureFlagStoreState,\n FeatureFlagStoreMetadata,\n // DTO types\n FeatureFlagResponseDTO,\n FeatureFlagRuleDTO,\n FeatureFlagEvaluationDTO,\n FetchAllFlagsResponseDTO,\n} from '@plyaz/types/features';\n\n// Re-export DTO types for backwards compatibility\nexport type {\n FeatureFlagResponseDTO,\n FeatureFlagRuleDTO,\n FeatureFlagEvaluationDTO,\n FetchAllFlagsResponseDTO,\n} from '@plyaz/types/features';\n\n/**\n * Feature Flag Mapper\n *\n * Transforms feature flag data between API, domain, and store representations.\n */\nexport class FeatureFlagMapper extends BaseMapper<\n FeatureFlag<string>,\n FeatureFlagResponseDTO,\n unknown,\n unknown,\n Partial<unknown>,\n unknown,\n Partial<FeatureFlagStoreState>\n> {\n /**\n * Transform API response DTO to domain entity\n */\n toDomain(dto: FeatureFlagResponseDTO): FeatureFlag<string> {\n return {\n key: dto.key,\n value: dto.value,\n name: dto.name,\n description: dto.description ?? '',\n isEnabled: dto.is_enabled,\n type: dto.type,\n environment: dto.environment,\n rolloutPercentage: dto.rollout_percentage,\n metadata: dto.metadata,\n tags: dto.tags,\n createdAt: new Date(dto.created_at),\n updatedAt: new Date(dto.updated_at),\n createdBy: dto.created_by,\n updatedBy: dto.updated_by,\n };\n }\n\n /**\n * Transform domain entity to API request DTO\n */\n toCreateDTO(entity: Partial<FeatureFlag<string>>): CreateFlagRequest<string> {\n return {\n key: entity.key!,\n value: entity.value!,\n name: entity.name!,\n description: entity.description,\n isEnabled: entity.isEnabled ?? true,\n environment: entity.environment,\n rolloutPercentage: entity.rolloutPercentage,\n };\n }\n\n /**\n * Transform domain entity to patch request DTO\n */\n toPatchDTO(entity: Partial<FeatureFlag<string>>): Partial<CreateFlagRequest<string>> {\n const dto: Partial<CreateFlagRequest<string>> = {};\n\n if (entity.value !== undefined) dto.value = entity.value;\n if (entity.name !== undefined) dto.name = entity.name;\n if (entity.description !== undefined) dto.description = entity.description;\n if (entity.isEnabled !== undefined) dto.isEnabled = entity.isEnabled;\n if (entity.environment !== undefined) dto.environment = entity.environment;\n if (entity.rolloutPercentage !== undefined) dto.rolloutPercentage = entity.rolloutPercentage;\n\n return dto;\n }\n\n /**\n * Transform API rule DTO to domain rule\n */\n toRuleDomain(dto: FeatureFlagRuleDTO): FeatureFlagRule<string> {\n return {\n id: dto.id,\n name: dto.name,\n flagKey: dto.flag_key,\n conditions: dto.conditions.map(c => ({\n field: c.field as FeatureFlagRule<string>['conditions'][0]['field'],\n operator: c.operator as FeatureFlagRule<string>['conditions'][0]['operator'],\n value: c.value,\n })),\n value: dto.value,\n priority: dto.priority,\n isEnabled: dto.is_enabled,\n rolloutPercentage: dto.rollout_percentage,\n metadata: dto.metadata,\n };\n }\n\n /**\n * Transform API evaluation DTO to domain evaluation\n */\n toEvaluationDomain(dto: FeatureFlagEvaluationDTO): FeatureFlagEvaluation<string> {\n return {\n flagKey: dto.key,\n value: dto.value,\n isEnabled: dto.is_enabled,\n reason: dto.reason,\n source: dto.source,\n matchedRuleId: dto.matched_rule_id,\n evaluatedAt: new Date(dto.evaluated_at),\n };\n }\n\n /**\n * Transform API fetch response to domain response\n */\n toFetchDataResponse(dto: FetchAllFlagsResponseDTO): FetchFeatureFlagDataResponse<string> {\n return {\n flags: dto.flags.map(f => this.toDomain(f)),\n rules: dto.rules?.map(r => this.toRuleDomain(r)) ?? [],\n };\n }\n\n /**\n * Transform single domain flag to partial store state format\n * Returns partial state that can be merged with existing store state\n */\n override toStoreState(flag: FeatureFlag<string>): Partial<FeatureFlagStoreState> {\n return {\n flags: { [flag.key]: flag.isEnabled ? flag.value : false },\n metadata: {\n [flag.key]: {\n updatedAt: flag.updatedAt,\n source: 'api',\n },\n },\n lastFetched: Date.now(),\n };\n }\n\n /**\n * Transform domain flags array to store state format\n */\n override toStoreStateList(flags: FeatureFlag<string>[]): Partial<FeatureFlagStoreState> {\n const flagsMap: Record<string, FeatureFlagValue> = {};\n const metadata: Record<string, FeatureFlagStoreMetadata> = {};\n\n for (const flag of flags) {\n // Store the value if enabled, false otherwise\n flagsMap[flag.key] = flag.isEnabled ? flag.value : false;\n\n // Store metadata\n metadata[flag.key] = {\n updatedAt: flag.updatedAt,\n source: 'api',\n };\n }\n\n return {\n flags: flagsMap,\n metadata,\n lastFetched: Date.now(),\n };\n }\n\n /**\n * Transform evaluation results to store flags format\n */\n evaluationsToStoreFlags(\n evaluations: Record<string, FeatureFlagEvaluation<string>>\n ): Record<string, FeatureFlagValue> {\n const flags: Record<string, FeatureFlagValue> = {};\n\n for (const [key, evaluation] of Object.entries(evaluations)) {\n flags[key] = evaluation.isEnabled ? evaluation.value : false;\n }\n\n return flags;\n }\n\n /**\n * Transform simple flags record to domain flags array\n * (for providers that return simple key-value pairs)\n */\n simpleFlagsToDomain(\n flags: Record<string, FeatureFlagValue>,\n environment: string = 'production'\n ): FeatureFlag<string>[] {\n const now = new Date();\n\n return Object.entries(flags).map(([key, value]) => ({\n key,\n value,\n name: key,\n description: '',\n isEnabled: Boolean(value),\n type: this.inferType(value),\n environment,\n createdAt: now,\n updatedAt: now,\n createdBy: 'system',\n updatedBy: 'system',\n }));\n }\n\n /**\n * Infer flag type from value\n */\n private inferType(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/**\n * Singleton instance for convenience\n */\nexport const featureFlagMapper = new FeatureFlagMapper();\n","/**\n * Feature Flags Domain - Main Exports\n *\n * This module provides the main exports for the feature flags domain logic.\n *\n * @fileoverview Main feature flags domain exports\n * @version 1.0.0\n */\nimport type { FeatureFlagConfig, FeatureFlagOverrides } from '@plyaz/types';\nimport { FeatureFlagServiceFactory } from './providers/factory';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES } from '@plyaz/config';\n\n// Service factory (shared between NestJS and direct usage)\nexport { createFeatureFlagService, FEATURE_FLAG_SERVICE } from './module';\n\n// Domain service (main entry point)\nexport { FeatureFlagService } from './service';\n\n// Frontend domain service\nexport { FrontendFeatureFlagDomainService } from './FrontendFeatureFlagDomainService';\n\n// Service factory (creates service with configured provider)\nexport { FeatureFlagServiceFactory } from './providers/factory';\n\n// Provider base class and factory (for advanced use cases)\nexport { FeatureFlagProvider } from './provider';\nexport { FeatureFlagProviderFactory } 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// Repositories (data access layer for providers)\nexport { FeatureFlagDatabaseRepository } from '@models/featureFlags';\n\n// Mappers\nexport * from './mappers';\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 * Returns a FeatureFlagService instance for all 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 return FeatureFlagServiceFactory.createAndInitialize(finalConfig, FEATURES);\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 return FeatureFlagServiceFactory.createAndInitialize(finalConfig, FEATURES);\n },\n\n /**\n * Initialize for testing environments.\n */\n initializeForTesting: async (overrides: FeatureFlagOverrides<FeatureFlagKey> = {}) => {\n const service = await FeatureFlagServiceFactory.createAndInitialize(\n {\n ...DEFAULT_FEATURE_FLAG_CONFIG,\n provider: 'memory',\n isCacheEnabled: false,\n isLoggingEnabled: false,\n },\n FEATURES\n );\n\n // Apply test overrides\n Object.entries(overrides).forEach(([key, value]) => {\n service.setOverride(key as FeatureFlagKey, value);\n });\n\n return service;\n },\n} as const;\n","/**\n * Package version - single source of truth\n *\n * Reads version from package.json to ensure consistency across:\n * - Health check endpoints\n * - API headers (X-Version)\n * - Observability tags\n * - Logging metadata\n */\n\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { readFileSync } from 'node:fs';\n\nlet cachedVersion: string = '';\n\n/**\n * Get the package version from package.json\n * Caches the result for subsequent calls\n */\nexport function getPackageVersion(): string {\n if (cachedVersion) return cachedVersion;\n\n try {\n // Try ESM approach first\n const require = createRequire(import.meta.url);\n const pkg = require('../package.json');\n cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n try {\n // Fallback: read file directly\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n const pkgPath = join(currentDir, '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n // Last resort fallback\n cachedVersion = '0.0.0';\n }\n }\n\n return cachedVersion;\n}\n\n/**\n * Package version constant\n * Use this for static contexts where async/dynamic loading isn't needed\n */\nexport const VERSION = getPackageVersion();\n\n/**\n * Package name\n */\nexport const PACKAGE_NAME = '@plyaz/core';\n","/**\n * Backend Layer Exports\n *\n * NestJS-specific implementations.\n * For framework-agnostic modules, use domain exports:\n * - import { FeatureFlagModule } from '@plyaz/core/domain/featureFlags';\n */\n\n// Example Module (reference implementation)\nexport * from './example';\n\n// Feature Flags (NestJS module)\nexport * from './featureFlags';\n","/**\n * Example Controller\n *\n * Simple NestJS controller demonstrating Core + BackendExampleDomainService integration.\n * Use as reference for building your own backend modules.\n *\n * Demonstrates:\n * - Standard CRUD operations with error handling\n * - Single error throwing (standard pattern)\n * - Array error throwing (multiple validation errors)\n * - Standard API response format using SuccessResponseStandard\n * - How errors are automatically captured and returned as ErrorResponse\n */\n\nimport {\n Controller,\n Get,\n Post,\n Patch,\n Delete,\n Body,\n Param,\n HttpCode,\n HttpStatus,\n Inject,\n} from '@nestjs/common';\nimport { BackendExampleDomainService } from '../../domain/example';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport type { ExampleEntity, CreateExampleDTO, PatchExampleDTO } from '@plyaz/types/examples';\nimport type { ReturnResponseType } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\n\n// Injection token for BackendExampleDomainService\nexport const BACKEND_EXAMPLE_DOMAIN_SERVICE = 'BACKEND_EXAMPLE_DOMAIN_SERVICE';\n\n/**\n * Example Controller\n *\n * Routes:\n * - GET /example/health - Health check\n * - GET /example/entities/:id - Get entity by ID\n * - POST /example/entities - Create entity\n * - PATCH /example/entities/:id - Update entity\n * - DELETE /example/entities/:id - Delete entity\n * - POST /example/entities/validated - Create with full validation (array errors example)\n * - GET /example/errors/single - Demo: Single error response\n * - GET /example/errors/array - Demo: Array of errors response\n */\n@Controller('example')\nexport class ExampleController {\n constructor(\n @Inject(BACKEND_EXAMPLE_DOMAIN_SERVICE)\n private readonly exampleService: BackendExampleDomainService\n ) {}\n\n /**\n * Health check endpoint\n * GET /example/health\n */\n @Get('health')\n health(): ReturnResponseType<{ service: boolean; timestamp: string }> {\n return SuccessResponseStandard('Service is healthy', {\n service: this.exampleService.isAvailable(),\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Get entity by ID\n * GET /example/entities/:id\n */\n @Get('entities/:id')\n async getEntity(@Param('id') id: string): Promise<ReturnResponseType<ExampleEntity | null>> {\n const entity = await this.exampleService.getById(id);\n return SuccessResponseStandard('Entity retrieved successfully', entity);\n }\n\n /**\n * Create a new entity\n * POST /example/entities\n *\n * Example success response:\n * ```json\n * {\n * \"success\": true,\n * \"message\": \"Entity created successfully\",\n * \"data\": { ... },\n * \"codeStatus\": 201\n * }\n * ```\n */\n @Post('entities')\n @HttpCode(HttpStatus.CREATED)\n async createEntity(@Body() dto: CreateExampleDTO): Promise<ReturnResponseType<ExampleEntity>> {\n const entity = await this.exampleService.create(dto);\n return SuccessResponseStandard('Entity created successfully', entity, HTTP_STATUS.CREATED);\n }\n\n /**\n * Update an entity (partial)\n * PATCH /example/entities/:id\n */\n @Patch('entities/:id')\n async updateEntity(\n @Param('id') id: string,\n @Body() dto: PatchExampleDTO\n ): Promise<ReturnResponseType<ExampleEntity>> {\n const entity = await this.exampleService.patch(id, dto);\n return SuccessResponseStandard('Entity updated successfully', entity);\n }\n\n /**\n * Delete an entity\n * DELETE /example/entities/:id\n */\n @Delete('entities/:id')\n @HttpCode(HttpStatus.OK)\n async deleteEntity(@Param('id') id: string): Promise<ReturnResponseType<null>> {\n await this.exampleService.delete(id);\n return SuccessResponseStandard('Entity deleted successfully', null);\n }\n\n /**\n * Create entity with full validation (array errors pattern)\n * POST /example/entities/validated\n *\n * Demonstrates validator throwing validation errors.\n * The validator.validateCreateOrThrow() will automatically throw all validation errors as an array.\n *\n * Example success response:\n * ```json\n * {\n * \"success\": true,\n * \"message\": \"Entity created successfully\",\n * \"data\": { ... },\n * \"codeStatus\": 201\n * }\n * ```\n */\n @Post('entities/validated')\n @HttpCode(HttpStatus.CREATED)\n async createEntityWithValidation(\n @Body() dto: unknown\n ): Promise<ReturnResponseType<ExampleEntity>> {\n // Validator handles all validation and throws automatically\n // No need to manually check - validator.validateCreateOrThrow() does it all\n const entity = await this.exampleService.create(dto);\n return SuccessResponseStandard('Entity created successfully', entity, HTTP_STATUS.CREATED);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Error Demonstration Endpoints\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Single validation error response\n * GET /example/errors/single\n *\n * Demonstrates validator throwing a SINGLE validation error.\n * Service uses validateCreateOrThrow() with ONE invalid field.\n *\n * Response: HTTP 400\n * ```json\n * [{ \"code\": \"VALIDATION_FAILED\", \"message\": \"Name is required\", \"field\": \"name\" }]\n * ```\n */\n @Get('errors/single')\n async demoSingleError(): Promise<void> {\n // Validator throws single error for one invalid field\n return await this.exampleService.demoSingleValidationError();\n }\n\n /**\n * Demo: Multiple validation errors response\n * GET /example/errors/array\n *\n * Demonstrates validator throwing MULTIPLE validation errors.\n * Service uses validateCreateOrThrow() with MULTIPLE invalid fields.\n *\n * Response: HTTP 400\n * ```json\n * [\n * { \"code\": \"VALIDATION_FAILED\", \"message\": \"Name is required\", \"field\": \"name\" },\n * { \"code\": \"VALIDATION_FAILED\", \"message\": \"Amount must be non-negative\", \"field\": \"amount\" },\n * { \"code\": \"VALIDATION_FAILED\", \"message\": \"Description is required\", \"field\": \"description\" }\n * ]\n * ```\n */\n @Get('errors/array')\n async demoArrayErrors(): Promise<void> {\n // Validator throws array of errors for multiple invalid fields\n return await this.exampleService.demoMultipleValidationErrors();\n }\n}\n","/**\n * Example Module\n *\n * NestJS module demonstrating the proper pattern using domain service directly:\n * Module → Controller → BackendExampleService\n *\n * The BackendExampleService is auto-initialized by Core.initialize() and\n * can be injected via ServiceRegistry or provided directly to controllers.\n *\n * @example Usage in app.module.ts\n * ```typescript\n * import { CoreModule } from '@plyaz/core/nestjs';\n * import { ExampleModule } from '@plyaz/core';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env' }),\n * ExampleModule,\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { Module } from '@nestjs/common';\nimport { ExampleController, BACKEND_EXAMPLE_DOMAIN_SERVICE } from './example.controller';\nimport { BackendExampleDomainService, backendExampleDomainService } from '../../domain/example';\n\n@Module({\n controllers: [ExampleController],\n providers: [\n // Provide BackendExampleDomainService via factory using the singleton instance\n // This ensures the service is shared across the application\n {\n provide: BACKEND_EXAMPLE_DOMAIN_SERVICE,\n useFactory: () => backendExampleDomainService,\n },\n ],\n exports: [BACKEND_EXAMPLE_DOMAIN_SERVICE],\n})\nexport class ExampleModule {}\n\n// Re-export for convenience\nexport { BackendExampleDomainService, BACKEND_EXAMPLE_DOMAIN_SERVICE };\n","/**\n * Feature Flag Domain Service (Backend)\n *\n * Backend-specific domain service that extends BaseDomainService and\n * uses providers (database, redis, memory, etc.) to manage feature flags.\n *\n * Runtime: Backend only (uses providers, no API calls)\n *\n * @example\n * ```typescript\n * // Create service instance with a provider\n * const provider = new DatabaseFeatureFlagProvider(config, FEATURES);\n * await provider.initialize();\n *\n * const flagService = new FeatureFlagDomainService({\n * enabled: true,\n * provider,\n * });\n *\n * // Use the service\n * const isEnabled = await flagService.isEnabled('new-feature', { userId: 'user-123' });\n * ```\n */\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagContext,\n FeatureFlagValue,\n FeatureFlagEvaluation,\n CreateFlagRequest,\n FeatureFlagProvider,\n} from '@plyaz/types';\nimport { BaseDomainService } from '../../domain/base';\nimport { CoreEventManager } from '../../events/CoreEventManager';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Import for local use\nimport type {\n FeatureFlagDomainServiceConfig as _FeatureFlagDomainServiceConfig,\n FeatureFlagDomainEventType,\n} from '@plyaz/types/features';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Backend Service\n *\n * Extends BaseDomainService with generics for strong typing.\n * Uses an injected provider (database, redis, memory, etc.) for data access.\n *\n * No mapper/validator as this service handles simple flag values.\n * No API client - uses provider directly for data access.\n */\nexport class FeatureFlagDomainService extends BaseDomainService<_FeatureFlagDomainServiceConfig> {\n /** The feature flag provider */\n private readonly provider: FeatureFlagProvider<string>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(config: _FeatureFlagDomainServiceConfig) {\n const serviceConfig: _FeatureFlagDomainServiceConfig = {\n enabled: true,\n defaults: {},\n ...config,\n };\n\n super({\n serviceName: 'FeatureFlagDomainService',\n supportedRuntimes: ['backend'],\n serviceConfig,\n // No API client for backend - uses provider directly\n });\n\n // Store the provider\n this.provider = config.provider;\n\n // Mark as initialized (provider should already be initialized)\n this._initialized = true;\n\n this.logInfo('Service initialized with provider');\n CoreEventManager.emit('featureFlag:backend:provider:initialized', { providerType: 'unknown' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Implementations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if service is available\n */\n isAvailable(): boolean {\n return this.isServiceEnabled && this.provider !== null;\n }\n\n /**\n * Dispose/cleanup the service\n */\n dispose(): void {\n if (this.provider) {\n this.provider.dispose();\n CoreEventManager.emit('featureFlag:backend:provider:disposed', {});\n }\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Provider Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Refresh the provider cache\n */\n async refresh(): Promise<void> {\n this.assertReady();\n await this.provider.refresh();\n CoreEventManager.emit('featureFlag:backend:provider:refreshed', {});\n this.logDebug('Provider cache refreshed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Evaluation Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Evaluate a single feature flag\n *\n * @param key - Feature flag key\n * @param context - Evaluation context (user, environment, etc.)\n * @returns Full evaluation result\n */\n async evaluate(\n key: string,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<string>> {\n this.assertReady();\n const evalContext = context ?? this.config.defaultContext;\n\n CoreEventManager.emit('featureFlag:backend:evaluating', { key, context: evalContext });\n\n try {\n const result = await this.provider.getFlag(key, evalContext);\n CoreEventManager.emit('featureFlag:backend:evaluated', { key, result });\n return result;\n } catch (error) {\n CoreEventManager.emit('featureFlag:backend:evaluate:error', { key, error });\n throw error;\n }\n }\n\n /**\n * Check 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: string, context?: FeatureFlagContext): Promise<boolean> {\n this.assertReady();\n const evalContext = context ?? this.config.defaultContext;\n return this.provider.isEnabled(key, evalContext);\n }\n\n /**\n * Get the value of a feature flag\n *\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns The flag value\n */\n async getValue<T = FeatureFlagValue>(key: string, context?: FeatureFlagContext): Promise<T> {\n this.assertReady();\n const evalContext = context ?? this.config.defaultContext;\n return this.provider.getValue<T>(key, evalContext);\n }\n\n /**\n * Evaluate all feature flags for a context\n *\n * @param context - Evaluation context\n * @returns Record of all flag evaluations\n */\n async evaluateAll(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<string>>> {\n this.assertReady();\n const evalContext = context ?? this.config.defaultContext;\n\n try {\n const result = await this.provider.getAllFlags(evalContext);\n return result;\n } catch (error) {\n this.logError('Failed to evaluate all flags', { error });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // CRUD Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new feature flag\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n async create(data: CreateFlagRequest<string>): Promise<FeatureFlag<string>> {\n this.assertReady();\n\n CoreEventManager.emit('featureFlag:backend:creating', { data });\n\n try {\n const flag = await this.provider.createFlag(data);\n CoreEventManager.emit('featureFlag:backend:created', { flag });\n this.logInfo('Feature flag created', { key: data.key });\n return flag;\n } catch (error) {\n CoreEventManager.emit('featureFlag:backend:create:error', { error, data });\n throw error;\n }\n }\n\n /**\n * Update an existing feature flag\n *\n * @param key - Flag key to update\n * @param data - Partial update data\n * @returns The updated feature flag\n */\n async update(\n key: string,\n data: Partial<CreateFlagRequest<string>>\n ): Promise<FeatureFlag<string>> {\n this.assertReady();\n\n CoreEventManager.emit('featureFlag:backend:updating', { key, data });\n\n try {\n const flag = await this.provider.updateFlag(key, data);\n CoreEventManager.emit('featureFlag:backend:updated', { flag });\n this.logInfo('Feature flag updated', { key });\n return flag;\n } catch (error) {\n CoreEventManager.emit('featureFlag:backend:update:error', { error, key });\n throw error;\n }\n }\n\n /**\n * Delete a feature flag\n *\n * @param key - Flag key to delete\n */\n async delete(key: string): Promise<void> {\n this.assertReady();\n\n CoreEventManager.emit('featureFlag:backend:deleting', { key });\n\n try {\n await this.provider.deleteFlag(key);\n CoreEventManager.emit('featureFlag:backend:deleted', { key });\n this.logInfo('Feature flag deleted', { key });\n } catch (error) {\n CoreEventManager.emit('featureFlag:backend:delete:error', { error, key });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Rules Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get rules for a specific flag\n *\n * @param key - Flag key\n * @returns Array of rules\n */\n async getRules(key: string): Promise<FeatureFlagRule<string>[]> {\n this.assertReady();\n\n try {\n const rules = await this.provider.getRules(key);\n return rules;\n } catch (error) {\n this.logError('Failed to get rules', { key, error });\n throw error;\n }\n }\n\n /**\n * Get all rules\n *\n * @returns Array of all rules\n */\n async getAllRules(): Promise<FeatureFlagRule<string>[]> {\n this.assertReady();\n\n try {\n const rules = await this.provider.getAllRules();\n return rules;\n } catch (error) {\n this.logError('Failed to get all rules', { error });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Override Operations (Runtime Overrides)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Set a runtime override for a flag (in-memory, not persisted)\n *\n * @param key - Flag key\n * @param value - Override value\n */\n setOverride(key: string, value: FeatureFlagValue): void {\n this.assertReady();\n\n CoreEventManager.emit('featureFlag:backend:override:setting', { key, value });\n this.provider.setOverride(key, value);\n CoreEventManager.emit('featureFlag:backend:override:set', { key, value });\n this.logDebug('Override set', { key, value });\n }\n\n /**\n * Remove a runtime override for a flag\n *\n * @param key - Flag key\n */\n removeOverride(key: string): void {\n this.assertReady();\n\n CoreEventManager.emit('featureFlag:backend:override:removing', { key });\n this.provider.removeOverride(key);\n CoreEventManager.emit('featureFlag:backend:override:removed', { key });\n this.logDebug('Override removed', { key });\n }\n\n /**\n * Clear all runtime overrides\n */\n clearOverrides(): void {\n this.assertReady();\n this.provider.clearOverrides();\n this.logDebug('All overrides cleared');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to provider changes\n *\n * @param callback - Callback when flags change\n * @returns Unsubscribe function\n */\n subscribe(callback: () => void): () => void {\n this.assertReady();\n return this.provider.subscribe(callback);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Event Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to feature flag events\n *\n * @param event - Event type to subscribe to\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event: FeatureFlagDomainEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n}\n","/**\n * Feature Flag Controller\n *\n * NestJS controller for feature flag management.\n * Uses the domain FeatureFlagService directly.\n *\n * @fileoverview NestJS controller for feature flags\n */\n\nimport { Controller, Get, Post, Put, Delete, Param, Body, Inject } from '@nestjs/common';\nimport type {\n FeatureFlagValue,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES, HTTP_STATUS } from '@plyaz/types';\nimport { BaseError } from '@plyaz/errors';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\nimport type { FeatureFlagKey } from '@domain/types';\n\n/**\n * Request DTO for flag evaluation.\n */\ninterface EvaluateFlagRequest {\n context?: FeatureFlagContext;\n}\n\n/**\n * Feature Flag Controller\n *\n * Provides REST endpoints for feature flag management and evaluation.\n * Uses the domain FeatureFlagService directly.\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(\n @Inject(FEATURE_FLAG_SERVICE)\n private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n ) {}\n\n /**\n * Evaluates a feature flag for the given context.\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.getFlag(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 @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 @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 @Post()\n async createFlag(\n @Body() createData: CreateFlagRequest<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 @Put(':key')\n async updateFlag(\n @Param('key') key: FeatureFlagKey,\n @Body() updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\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 @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 @Post(':key/override')\n async setOverride(\n @Param('key') key: FeatureFlagKey,\n @Body('value') value: FeatureFlagValue\n ): Promise<{ isSuccessful: boolean }> {\n try {\n 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 @Delete(':key/override')\n async removeOverride(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n try {\n 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 rules for a specific 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.getRules(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.refresh();\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 * Gets service health status.\n */\n @Get('health')\n async getHealth(): Promise<{\n isInitialized: boolean;\n provider: string;\n }> {\n return {\n isInitialized: this.featureFlagService.getIsInitialized(),\n provider: this.featureFlagService.getProviderType(),\n };\n }\n}\n","/**\n * Feature Flag NestJS Module\n *\n * NestJS wrapper around the unified FeatureFlagModule.\n * Adds the controller for REST API endpoints.\n *\n * @example\n * ```typescript\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [FeatureFlagModule.forRoot({ provider: 'database' })],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport {\n Module,\n Global,\n type DynamicModule,\n type OnModuleDestroy,\n type Type,\n type ForwardReference,\n type InjectionToken,\n} from '@nestjs/common';\nimport { FeatureFlagController } from './feature-flag.controller';\nimport { createFeatureFlagService, FEATURE_FLAG_SERVICE } from '../../domain/featureFlags/module';\nimport { FeatureFlagService } from '../../domain/featureFlags/service';\nimport type { FeatureFlagKey } from '../../domain/types';\nimport { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';\n\n/**\n * Feature Flag Module\n *\n * Provides feature flag functionality as a NestJS module.\n * Uses the domain FeatureFlagService directly - no NestJS wrapper needed.\n *\n * @example\n * ```typescript\n * // In your app.module.ts\n * @Module({\n * imports: [\n * FeatureFlagModule.forRoot({ provider: 'database' })\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // In your service - inject the domain service\n * @Injectable()\n * export class MyService {\n * constructor(\n * @Inject(FEATURE_FLAG_SERVICE)\n * private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n * ) {}\n *\n * async doSomething() {\n * const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');\n * }\n * }\n * ```\n */\n@Global()\n@Module({\n controllers: [FeatureFlagController],\n})\nexport class FeatureFlagModule implements OnModuleDestroy {\n private static serviceInstance: FeatureFlagService<FeatureFlagKey> | null = null;\n\n onModuleDestroy(): void {\n if (FeatureFlagModule.serviceInstance) {\n FeatureFlagModule.serviceInstance.dispose();\n FeatureFlagModule.serviceInstance = null;\n }\n }\n\n /**\n * Creates the module with configuration.\n *\n * @param options - Module configuration options\n * @returns Configured dynamic module\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * FeatureFlagModule.forRoot({\n * provider: 'database',\n * cacheEnabled: true,\n * cacheTtl: 600,\n * })\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n static forRoot(options: CoreFeatureFlagModuleConfig = {}): DynamicModule {\n return {\n module: FeatureFlagModule,\n providers: [\n {\n provide: FEATURE_FLAG_SERVICE,\n useFactory: async (): Promise<FeatureFlagService<FeatureFlagKey>> => {\n FeatureFlagModule.serviceInstance = await createFeatureFlagService(options);\n return FeatureFlagModule.serviceInstance;\n },\n },\n ],\n exports: [FEATURE_FLAG_SERVICE],\n };\n }\n\n /**\n * Creates the module with async configuration.\n * Useful when configuration depends on other services.\n *\n * @param options - Async module configuration options\n * @returns Configured async dynamic 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?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;\n inject?: InjectionToken[];\n useFactory: (\n ...args: unknown[]\n ) => CoreFeatureFlagModuleConfig | Promise<CoreFeatureFlagModuleConfig>;\n }): DynamicModule {\n return {\n module: FeatureFlagModule,\n imports: options.imports ?? [],\n providers: [\n {\n provide: FEATURE_FLAG_SERVICE,\n inject: options.inject ?? [],\n useFactory: async (...args: unknown[]): Promise<FeatureFlagService<FeatureFlagKey>> => {\n const moduleOptions = await options.useFactory(...args);\n FeatureFlagModule.serviceInstance = await createFeatureFlagService(moduleOptions);\n return FeatureFlagModule.serviceInstance;\n },\n },\n ],\n exports: [FEATURE_FLAG_SERVICE],\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, Inject } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { Reflector } from '@nestjs/core';\nimport {\n type FeatureFlagValue,\n type FeatureFlagEvaluation,\n ERROR_CODES,\n HTTP_STATUS,\n FEATURE_FLAG_METADATA,\n} from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\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 * @example\n * ```typescript\n * @Controller('premium')\n * @UseGuards(FeatureFlagGuard)\n * export class PremiumController {\n * @Get()\n * @FeatureEnabled('PREMIUM_FEATURE')\n * getPremiumData() {\n * // Only accessible if PREMIUM_FEATURE is enabled\n * }\n * }\n * ```\n */\n@Injectable()\nexport class FeatureFlagGuard implements CanActivate {\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagGuard',\n });\n\n constructor(\n private readonly reflector: Reflector,\n @Inject(FEATURE_FLAG_SERVICE)\n private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\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()\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 using domain service\n const evaluation: FeatureFlagEvaluation<FeatureFlagKey> =\n await this.featureFlagService.getFlag(key);\n\n const actual = evaluation.value ?? evaluation.isEnabled;\n\n if (!this.matches(expected, actual)) {\n this.logger.info(\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, Inject } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { BaseError } from '@plyaz/errors';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\nimport type { FeatureFlagKey } from '@domain/types';\nimport type { CoreFeatureFlagRequest } from '@plyaz/types/core';\nimport { FEATURES, HTTP_STATUS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\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 PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagMiddleware',\n });\n\n constructor(\n @Inject(FEATURE_FLAG_SERVICE)\n private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n ) {}\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 {CoreFeatureFlagRequest} 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: CoreFeatureFlagRequest,\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.getFlag(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 } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\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 PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagLoggingInterceptor',\n });\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.info(`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.info(`Feature \"${flag}\" used on endpoint \"${path}\"`);\n }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\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 PackageLogger({\n packageName: 'core',\n service: 'ErrorHandlingInterceptor',\n });\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 * 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 type CoreFeatureFlagEnvironmentConfig,\n type CoreFeatureFlagValidationResult,\n} from '@plyaz/types/core';\nimport { ERROR_CODES, HTTP_STATUS, NODE_ENVIRONMENTS } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport { isString, isDefined, getValidProviders } from '@/utils/common/validation';\nimport { FEATURE_FLAG_PROVIDERS, NUMERIC_CONSTANTS } from '@plyaz/config';\n\n// Module-level logger for static validation methods\nconst logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagConfigValidator',\n});\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: CoreFeatureFlagEnvironmentConfig): CoreFeatureFlagValidationResult {\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: CoreFeatureFlagEnvironmentConfig): 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: CoreFeatureFlagEnvironmentConfig): 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: CoreFeatureFlagEnvironmentConfig): 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(\n config: CoreFeatureFlagEnvironmentConfig,\n environment?: string\n ): never[] {\n // Use provided environment or fallback to config-based detection\n const env =\n environment ??\n (config.isLoggingEnabled ? NODE_ENVIRONMENTS.DEVELOPMENT : NODE_ENVIRONMENTS.PRODUCTION);\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 {DatabasePackageError} When validation fails with detailed error messages\n *\n * @example Startup Validation\n * ```typescript\n * // In FeatureFlagService.onModuleInit()\n * try {\n * const config = FeatureFlagConfigFactory.fromOptions();\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 DatabasePackageError 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: CoreFeatureFlagEnvironmentConfig): 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 { FeatureFlagConfigValidator } from './validation';\nimport {\n NODE_ENVIRONMENTS,\n FEATURE_FLAG_DEFAULTS,\n FEATURE_FLAG_PROVIDERS,\n type CoreFeatureFlagEnvironmentConfig,\n} from '@plyaz/types/core';\nimport { Core } from '../../../init/CoreInitializer';\n\n// Import for local use\nimport type { FeatureFlagConfigOptions as _FeatureFlagConfigOptions } from '@plyaz/types/features';\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.fromOptions({ environment: Core.env.NODE_ENV });\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 required options are missing or invalid\n */\n /**\n * Creates configuration from explicit options\n *\n * All options have sensible defaults - only provide what you need to override.\n * Environment is automatically read from Core.env.NODE_ENV.\n *\n * Note: For 'database' provider, DbService must be initialized first via Core.initialize().\n * The database provider uses the already-configured DbService, no connection string needed here.\n *\n * @example Basic usage with defaults (memory provider)\n * ```typescript\n * const config = FeatureFlagConfigFactory.fromOptions();\n * // Uses memory provider, cache enabled, default TTL\n * ```\n *\n * @example Database provider (requires Core.initialize() first)\n * ```typescript\n * // First: Core.initialize() with db config\n * await Core.initialize({ db: { adapter: 'sql', sql: { connectionString: '...' } } });\n *\n * // Then: Use database provider for feature flags\n * const config = FeatureFlagConfigFactory.fromOptions({ provider: 'database' });\n * ```\n *\n * @example Custom cache settings\n * ```typescript\n * const config = FeatureFlagConfigFactory.fromOptions({\n * cacheEnabled: true,\n * cacheTtl: 600, // 10 minutes\n * refreshInterval: 30,\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static fromOptions(options: _FeatureFlagConfigOptions = {}): CoreFeatureFlagEnvironmentConfig {\n // Resolve provider with default\n const provider = options.provider ?? FEATURE_FLAG_PROVIDERS.MEMORY;\n\n // Get environment from Core.env (set during Core.initialize())\n const environment = Core.isInitialized ? Core.env.NODE_ENV : NODE_ENVIRONMENTS.DEVELOPMENT;\n const isDevelopment = environment === NODE_ENVIRONMENTS.DEVELOPMENT;\n\n const config: CoreFeatureFlagEnvironmentConfig = {\n provider,\n isCacheEnabled: options.cacheEnabled ?? true,\n cacheTtl: options.cacheTtl ?? FEATURE_FLAG_DEFAULTS.CACHE_TTL,\n refreshInterval: options.refreshInterval ?? FEATURE_FLAG_DEFAULTS.REFRESH_INTERVAL,\n shouldFallbackToDefaults: options.fallbackToDefaults ?? true,\n isLoggingEnabled: options.loggingEnabled ?? isDevelopment,\n };\n\n // Add database config if using database provider\n // Note: Connection is handled by DbService, we just need table name\n if (provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n config.databaseConfig = {\n connectionString: '', // Not used - DbService handles connection\n tableName: options.tableName ?? FEATURE_FLAG_DEFAULTS.TABLE_NAME,\n poolSize: FEATURE_FLAG_DEFAULTS.POOL_SIZE,\n timeout: FEATURE_FLAG_DEFAULTS.TIMEOUT,\n };\n }\n\n FeatureFlagConfigValidator.validateOrThrow(config);\n return config;\n }\n}\n","export * from './base';\nexport * from './components';\nexport * from './example';\nexport * from './featureFlags';\nexport * from './providers';\nexport * from './store';\n","/**\n * InitializationError Component\n *\n * Default error display when Plyaz initialization fails.\n * Can be overridden via the `error` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationErrorProps as InitializationErrorProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the error container\n */\nconst errorContainerStyle: CSSProperties = {\n padding: '20px',\n color: 'red',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the error heading\n */\nconst errorHeadingStyle: CSSProperties = {\n margin: '0 0 10px 0',\n fontSize: '1.25rem',\n fontWeight: 600,\n};\n\n/**\n * Default styles for the error message\n */\nconst errorMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n};\n\n/**\n * Renders an initialization error state.\n *\n * @example\n * ```tsx\n * // Using default error display\n * <InitializationError error={new Error('Failed to connect')} />\n *\n * // Using custom error component\n * <InitializationError\n * error={error}\n * errorComponent={(err) => <CustomErrorBoundary error={err} />}\n * />\n * ```\n */\nexport function InitializationError({\n error,\n errorComponent,\n}: InitializationErrorProps): ReactElement {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n\n return (\n <div style={errorContainerStyle}>\n <h2 style={errorHeadingStyle}>Plyaz Initialization Failed</h2>\n <p style={errorMessageStyle}>{error.message}</p>\n </div>\n );\n}\n","/**\n * InitializationLoading Component\n *\n * Default loading display while Plyaz is initializing.\n * Can be overridden via the `loading` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationLoadingProps as InitializationLoadingProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the loading container\n */\nconst loadingContainerStyle: CSSProperties = {\n padding: '20px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the loading message\n */\nconst loadingMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n color: '#666',\n};\n\n/**\n * Renders an initialization loading state.\n *\n * @example\n * ```tsx\n * // Using default loading display\n * <InitializationLoading />\n *\n * // Using custom loading component\n * <InitializationLoading loading={<Skeleton />} />\n * ```\n */\nexport function InitializationLoading({ loading }: InitializationLoadingProps): ReactElement {\n if (loading) {\n return <>{loading}</>;\n }\n\n return (\n <div style={loadingContainerStyle}>\n <p style={loadingMessageStyle}>Initializing...</p>\n </div>\n );\n}\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 { CoreApiProviderProps } 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}: CoreApiProviderProps): 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","/**\n * PlyazProvider - Unified React Provider for Plyaz Core Services\n *\n * A single provider that initializes and provides access to all frontend-safe\n * Plyaz services. Designed for ease of use without unnecessary limitations.\n *\n * @module frontend/providers/PlyazProvider\n *\n * @example Basic usage\n * ```tsx\n * import { PlyazProvider } from '@plyaz/core/frontend';\n *\n * export default function App({ children }) {\n * return (\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: process.env.NEXT_PUBLIC_API_URL!,\n * env: 'production',\n * },\n * }}\n * >\n * {children}\n * </PlyazProvider>\n * );\n * }\n * ```\n *\n * @example With all options\n * ```tsx\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: 'https://api.example.com',\n * env: 'production',\n * apiKey: process.env.NEXT_PUBLIC_API_KEY,\n * },\n * featureFlags: {\n * provider: 'api',\n * refreshInterval: 60000,\n * },\n * appContext: 'webapp',\n * verbose: process.env.NODE_ENV === 'development',\n * }}\n * onReady={(services) => console.log('Services ready:', services)}\n * onError={(error) => Sentry.captureException(error)}\n * loading={<Skeleton />}\n * error={(err) => <ErrorBoundary error={err} />}\n * >\n * {children}\n * </PlyazProvider>\n * ```\n *\n * @example Accessing services in components\n * ```tsx\n * import { usePlyaz, useApi, useEvents, useFeatureFlag } from '@plyaz/core/frontend';\n *\n * function MyComponent() {\n * // Full access to all services\n * const { api, events, isReady } = usePlyaz();\n *\n * // Or use specific hooks\n * const apiClient = useApi();\n * const events = useEvents();\n * const { value: darkMode } = useFeatureFlag('DARK_MODE');\n *\n * // Make API calls\n * const fetchData = async () => {\n * const response = await apiClient.get('/users');\n * return response.data;\n * };\n *\n * // Subscribe to events\n * useEffect(() => {\n * const unsubscribe = events.on('user:updated', (event) => {\n * console.log('User updated:', event.data);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\n\n'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactElement,\n} from 'react';\nimport { ApiProvider } from '@plyaz/api';\nimport { Core } from '../../init/CoreInitializer';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport type {\n CoreAppContext,\n CoreAppEnvironment,\n CorePlyazConfig,\n CorePlyazFeatureFlagConfig,\n CorePlyazServices,\n CorePlyazContextValue,\n CorePlyazProviderProps as PlyazProviderProps,\n CoreDomainServiceInstance,\n} from '@plyaz/types/core';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createEncryptionConfig } from '@plyaz/config/api';\nimport { InitializationError } from '../components/InitializationError';\nimport { InitializationLoading } from '../components/InitializationLoading';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Implementation-specific context value.\n * Extends CorePlyazContextValue with concrete implementation references.\n */\ninterface PlyazContextValue extends Omit<CorePlyazContextValue, 'api' | 'events' | 'core'> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n/**\n * Implementation-specific services for callbacks.\n */\ninterface PlyazServices extends Omit<CorePlyazServices, never> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PlyazContext = createContext<PlyazContextValue | null>(null);\n\n// ============================================================================\n// Feature Flag Store (Simple in-memory implementation for frontend)\n// ============================================================================\n\n/**\n * Frontend Feature Flag Store\n *\n * Manages feature flags in frontend context with two provider options:\n * - 'memory': Flags stored in-memory (default, resets on refresh)\n * - 'api': Flags fetched from API endpoint\n *\n * For backend/server-side feature flags, use Core.initialize() with\n * database, redis, or file providers instead.\n */\nclass FeatureFlagStore {\n private flags: Record<string, boolean> = {};\n private config: CorePlyazFeatureFlagConfig;\n private apiClient: typeof ApiClientService | null = null;\n private refreshTimer: ReturnType<typeof globalThis.setInterval> | null = null;\n\n constructor(config: CorePlyazFeatureFlagConfig = {}) {\n this.config = config;\n this.flags = config.defaults ?? {};\n }\n\n setApiClient(client: typeof ApiClientService | null): void {\n this.apiClient = client;\n }\n\n get(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n getAll(): Record<string, boolean> {\n return { ...this.flags };\n }\n\n set(key: string, value: boolean): void {\n this.flags[key] = value;\n }\n\n setAll(flags: Record<string, boolean>): void {\n this.flags = { ...this.flags, ...flags };\n }\n\n async refresh(): Promise<void> {\n // Only 'api' provider needs refresh - 'memory' is local only\n if (this.config.provider === 'api' && this.apiClient?.isInitialized()) {\n try {\n const endpoint = this.config.apiEndpoint ?? '/feature-flags';\n const client = this.apiClient.getClient();\n const response = await client.get<{ flags?: Record<string, boolean> }>(endpoint);\n if (response.data?.flags) {\n this.flags = { ...this.flags, ...response.data.flags };\n }\n } catch (error) {\n globalThis.console.warn('[PlyazProvider] Failed to refresh feature flags:', error);\n }\n }\n // 'memory' provider: no-op, flags are managed locally\n }\n\n startAutoRefresh(): void {\n // Only start auto-refresh for 'api' provider\n if (\n this.config.provider === 'api' &&\n this.config.refreshInterval &&\n this.config.refreshInterval > 0\n ) {\n this.refreshTimer = globalThis.setInterval(() => {\n this.refresh().catch(() => {});\n }, this.config.refreshInterval);\n }\n }\n\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n globalThis.clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n dispose(): void {\n this.stopAutoRefresh();\n this.flags = {};\n }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * PlyazProvider - Unified provider for all Plyaz frontend services\n *\n * Initializes and provides access to:\n * - API Client (HTTP requests)\n * - Event Manager (pub/sub)\n * - Feature Flags\n * - Core utilities\n */\n\n/**\n * Build API client configuration from provider config\n */\nfunction buildApiConfig(config: CorePlyazConfig): Partial<ApiClientOptions> {\n return {\n baseURL: config.api.baseURL,\n timeout: config.api.timeout,\n headers: config.api.headers ? { static: config.api.headers } : undefined,\n retry: config.api.retry,\n encryption:\n config.api.encryption?.enabled && config.api.encryption?.key\n ? createEncryptionConfig(config.api.encryption.key)\n : undefined,\n };\n}\n\n/** Initialize Core with frontend config */\nasync function initializeCore(config: CorePlyazConfig): Promise<void> {\n const apiConfig = buildApiConfig(config);\n\n await Core.initialize({\n skipDb: true,\n appContext: config.appContext ?? 'webapp',\n verbose: config.verbose,\n api: {\n env: config.api.env ?? 'development',\n apiKey: config.api.apiKey,\n setAsDefault: true,\n ...apiConfig,\n },\n });\n}\n\n/** Initialize ServiceRegistry if services are configured */\nasync function initializeServices(config: CorePlyazConfig): Promise<void> {\n if (!config.services || config.services.length === 0) return;\n\n if (config.verbose) {\n globalThis.console.log('[PlyazProvider] Initializing domain services...');\n }\n\n await ServiceRegistry.initialize({\n apiClient: { baseURL: config.api.baseURL },\n services: config.services,\n });\n\n if (config.verbose) {\n globalThis.console.log(\n '[PlyazProvider] Services initialized:',\n ServiceRegistry.getInitializedKeys()\n );\n }\n}\n\n/** Initialize feature flags store */\nasync function initializeFeatureFlags(featureFlagStore: FeatureFlagStore): Promise<void> {\n featureFlagStore.setApiClient(ApiClientService);\n await featureFlagStore.refresh();\n featureFlagStore.startAutoRefresh();\n}\n\n/**\n * Create PlyazServices object for callbacks\n */\nfunction createServicesObject(\n config: CorePlyazConfig,\n featureFlagStore: FeatureFlagStore\n): PlyazServices {\n return {\n api: ApiClientService,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n };\n}\n\nexport function PlyazProvider({\n children,\n config,\n loading,\n error: errorComponent,\n onReady,\n onError,\n skipLoadingState = false,\n}: PlyazProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [featureFlagStore] = useState(() => new FeatureFlagStore(config.featureFlags));\n\n // Initialize services\n const initialize = useCallback(async () => {\n try {\n setError(null);\n\n await initializeCore(config);\n await initializeServices(config);\n await initializeFeatureFlags(featureFlagStore);\n\n setIsReady(true);\n onReady?.(createServicesObject(config, featureFlagStore));\n } catch (err) {\n const initError = err instanceof Error ? err : new Error(String(err));\n setError(initError);\n onError?.(initError);\n globalThis.console.error('[PlyazProvider] Initialization failed:', initError);\n }\n }, [config, featureFlagStore, onReady, onError]);\n\n // Reinitialize function\n const reinitialize = useCallback(async () => {\n setIsReady(false);\n ServiceRegistry.disposeAll();\n await Core.reset();\n await initialize();\n }, [initialize]);\n\n // Initialize on mount\n useEffect(() => {\n void initialize();\n\n return () => {\n featureFlagStore.dispose();\n ServiceRegistry.disposeAll();\n };\n }, []); // Only run once on mount\n\n // Build context value\n const contextValue = useMemo<PlyazContextValue>(\n () => ({\n api: isReady ? ApiClientService : null,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n isReady,\n error,\n reinitialize,\n // ServiceRegistry access\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n }),\n [isReady, error, config.appContext, config.api.env, featureFlagStore, reinitialize]\n );\n\n // Handle error state\n if (error && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationError error={error} errorComponent={errorComponent} />\n </ApiProvider>\n );\n }\n\n // Handle loading state\n if (!isReady && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationLoading loading={loading} />\n </ApiProvider>\n );\n }\n\n // Render children with context and React Query\n return (\n <ApiProvider>\n <PlyazContext.Provider value={contextValue}>{children}</PlyazContext.Provider>\n </ApiProvider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access all Plyaz services\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { api, events, isReady, featureFlags } = usePlyaz();\n *\n * if (!isReady) return <Loading />;\n *\n * const handleClick = async () => {\n * const response = await api.getClient().get('/data');\n * events.emit('data:fetched', { data: response.data });\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function usePlyaz(): PlyazContextValue {\n const context = useContext(PlyazContext);\n if (!context) {\n throw new Error(\n 'usePlyaz must be used within a PlyazProvider. ' +\n 'Wrap your app with <PlyazProvider config={...}>...</PlyazProvider>'\n );\n }\n return context;\n}\n\n/**\n * Access API client directly\n *\n * @example\n * ```tsx\n * function UserList() {\n * const api = useApi();\n * const [users, setUsers] = useState([]);\n *\n * useEffect(() => {\n * api.getClient().get('/users').then(res => setUsers(res.data));\n * }, [api]);\n *\n * return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;\n * }\n * ```\n */\nexport function useApi(): typeof ApiClientService {\n const { api, isReady } = usePlyaz();\n if (!isReady || !api) {\n throw new Error('API client is not ready. Make sure PlyazProvider has finished initializing.');\n }\n return api;\n}\n\n/**\n * Access API client safely (returns null if not ready)\n */\nexport function useApiSafe(): typeof ApiClientService | null {\n const { api } = usePlyaz();\n return api;\n}\n\n/**\n * Access event manager\n *\n * @example\n * ```tsx\n * function NotificationListener() {\n * const events = useEvents();\n *\n * useEffect(() => {\n * const unsubscribe = events.on('notification:received', (event) => {\n * toast.show(event.data.message);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return null;\n * }\n * ```\n */\nexport function useEvents(): typeof CoreEventManager {\n const { events } = usePlyaz();\n return events;\n}\n\n/**\n * Check if a feature flag is enabled\n *\n * @example\n * ```tsx\n * function FeatureComponent() {\n * const isEnabled = useFlag('NEW_DASHBOARD');\n *\n * if (!isEnabled) return null;\n * return <NewDashboard />;\n * }\n * ```\n */\nexport function useFlag(key: string, defaultValue = false): boolean {\n const { featureFlags } = usePlyaz();\n return featureFlags.get(key, defaultValue);\n}\n\n/**\n * Access feature flag utilities\n *\n * @example\n * ```tsx\n * function FlagManager() {\n * const flags = useFeatureFlags();\n * const allFlags = flags.getAll();\n *\n * return (\n * <div>\n * <pre>{JSON.stringify(allFlags, null, 2)}</pre>\n * <button onClick={flags.refresh}>Refresh Flags</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFeatureFlags(): PlyazContextValue['featureFlags'] {\n const { featureFlags } = usePlyaz();\n return featureFlags;\n}\n\n/**\n * Check if Plyaz services are ready\n *\n * @example\n * ```tsx\n * function LoadingAwareComponent() {\n * const isReady = usePlyazReady();\n *\n * if (!isReady) return <Skeleton />;\n * return <ActualContent />;\n * }\n * ```\n */\nexport function usePlyazReady(): boolean {\n const { isReady } = usePlyaz();\n return isReady;\n}\n\n/**\n * Get current app context\n */\nexport function useAppContext(): CoreAppContext {\n const { appContext } = usePlyaz();\n return appContext;\n}\n\n/**\n * Get current environment\n */\nexport function useEnvironment(): CoreAppEnvironment {\n const { environment } = usePlyaz();\n return environment;\n}\n\n/**\n * Get a domain service by key.\n * Services must be registered in the `services` config.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws If service is not initialized or not found\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const flagService = useService<FeatureFlagDomainService>('featureFlags');\n *\n * useEffect(() => {\n * flagService.isEnabled('my-flag').then(console.log);\n * }, [flagService]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): T {\n const { getService, isReady } = usePlyaz();\n\n if (!isReady) {\n throw new Error(`PlyazProvider not ready. Cannot get service '${key}'.`);\n }\n\n return useMemo(() => getService<T>(key), [getService, key]);\n}\n\n/**\n * Get a domain service by key with loading state.\n * Useful for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Object with service, loading state, and error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { service, isLoading, error } = useServiceAsync<ExampleDomainService>('example');\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{service?.serviceName}</div>;\n * }\n * ```\n */\nexport function useServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): { service: T | null; isLoading: boolean; error: Error | null } {\n const { getServiceAsync, isReady } = usePlyaz();\n const [service, setService] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!isReady) return;\n\n let mounted = true;\n\n const loadService = async (): Promise<void> => {\n try {\n setIsLoading(true);\n const svc = await getServiceAsync<T>(key);\n if (mounted) {\n setService(svc);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n void loadService();\n\n return () => {\n mounted = false;\n };\n }, [key, getServiceAsync, isReady]);\n\n return { service, isLoading, error };\n}\n\n/**\n * Check if a service is registered and available\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const hasFlags = useHasService('featureFlags');\n *\n * if (!hasFlags) {\n * return <div>Feature flags not configured</div>;\n * }\n *\n * return <FeatureFlagUI />;\n * }\n * ```\n */\nexport function useHasService(key: string): boolean {\n const { hasService } = usePlyaz();\n return hasService(key);\n}\n\n/**\n * Get all initialized service keys\n *\n * @example\n * ```tsx\n * function DebugPanel() {\n * const serviceKeys = useServiceKeys();\n *\n * return (\n * <div>\n * <h3>Loaded Services:</h3>\n * <ul>\n * {serviceKeys.map(key => <li key={key}>{key}</li>)}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useServiceKeys(): string[] {\n const { getServiceKeys } = usePlyaz();\n return getServiceKeys();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { PlyazContext };\n","/**\n * Service Accessors (Generic)\n *\n * Generic utilities for accessing services from stores.\n * These work with any domain service, not just feature flags.\n */\n\nimport type { CoreDomainServiceInstance } from '@plyaz/types/core';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Accessors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service accessor function for use in stores.\n *\n * @param serviceKey - Key of the service in the registry\n * @returns Async function that returns the service instance\n *\n * @example\n * ```typescript\n * const getExampleService = createServiceAccessor<ExampleDomainService>('example');\n *\n * const myStoreSlice = {\n * async createEntity(data) {\n * const service = await getExampleService();\n * return service.create(data);\n * },\n * };\n * ```\n */\nexport function createServiceAccessor<T extends CoreDomainServiceInstance>(\n serviceKey: string\n): () => Promise<T> {\n return () => ServiceRegistry.getAsync<T>(serviceKey);\n}\n\n/**\n * Create multiple service accessors at once.\n *\n * @param keys - Object mapping accessor names to service keys\n * @returns Object with accessor functions\n *\n * @example\n * ```typescript\n * const services = createServiceAccessors({\n * flags: 'featureFlags',\n * examples: 'example',\n * users: 'users',\n * });\n *\n * const flags = await services.flags();\n * const example = await services.examples();\n * ```\n */\nexport function createServiceAccessors<T extends Record<string, string>>(\n keys: T\n): { [K in keyof T]: () => Promise<CoreDomainServiceInstance> } {\n const accessors = {} as { [K in keyof T]: () => Promise<CoreDomainServiceInstance> };\n\n for (const [name, key] of Object.entries(keys)) {\n accessors[name as keyof T] = createServiceAccessor(key);\n }\n\n return accessors;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Zustand Middleware\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a Zustand middleware that injects services into store actions.\n *\n * @param serviceKeys - Service keys to inject\n * @returns Zustand middleware function\n *\n * @example\n * ```typescript\n * import { create } from 'zustand';\n * import { withServices } from '@plyaz/core/frontend';\n *\n * interface MyStore {\n * items: Item[];\n * services: { example: ExampleDomainService };\n * fetchItems: () => Promise<void>;\n * }\n *\n * const useMyStore = create<MyStore>(\n * withServices(['example'], (set, get, services) => ({\n * items: [],\n * services,\n * fetchItems: async () => {\n * const items = await services.example.getAll();\n * set({ items });\n * },\n * }))\n * );\n * ```\n */\nexport function withServices<TServices extends Record<string, CoreDomainServiceInstance>>(\n serviceKeys: string[],\n createStore: (set: (partial: unknown) => void, get: () => unknown, services: TServices) => unknown\n): (set: (partial: unknown) => void, get: () => unknown) => unknown {\n return (set: (partial: unknown) => void, get: () => unknown): unknown => {\n // Create lazy service proxies\n const services = {} as TServices;\n\n for (const key of serviceKeys) {\n Object.defineProperty(services, key, {\n get: () => ServiceRegistry.get(key),\n enumerable: true,\n });\n }\n\n return createStore(set, get, services);\n };\n}\n","/**\n * Feature Flag Store Integration\n *\n * Utilities for integrating feature flags with Zustand stores.\n * Implements the \"pull\" pattern where stores fetch from services.\n */\n\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FeatureFlagValue, FeatureFlagContext } from '@plyaz/types/features';\n\n// Re-export types from @plyaz/types/core\nexport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// Import for local use\nimport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fetcher Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a fetchFn for feature flag store that uses ServiceRegistry.\n *\n * This bridges the ServiceRegistry with the store's callback-based pattern.\n * Use this for polling or manual refresh scenarios.\n *\n * @param options - Fetcher options\n * @returns A function compatible with store initialization\n *\n * @example\n * ```typescript\n * // Basic usage\n * const fetchFn = createFeatureFlagFetcher();\n *\n * // With context\n * const fetchFn = createFeatureFlagFetcher({\n * context: { userId: currentUser.id },\n * });\n *\n * // Use in store initializer\n * useFeatureFlagInitializer({ fetchFn });\n * ```\n */\nexport function createFeatureFlagFetcher(\n options: CoreFeatureFlagFetcherOptions = {}\n): () => Promise<Record<string, FeatureFlagValue>> {\n const { serviceKey = 'featureFlags', context, transform } = options;\n\n return async (): Promise<Record<string, FeatureFlagValue>> => {\n const service = await ServiceRegistry.getAsync<CoreFeatureFlagServiceLike>(serviceKey);\n const flags = await service.evaluateAll(context);\n\n // Extract values from evaluations\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(flags)) {\n if (evaluation && typeof evaluation === 'object' && 'value' in evaluation) {\n values[key] = (evaluation as { value: FeatureFlagValue }).value;\n } else {\n values[key] = evaluation as FeatureFlagValue;\n }\n }\n\n return transform ? transform(values) : values;\n };\n}\n\n/**\n * Create full store initialization config with ServiceRegistry integration.\n *\n * @param options - Configuration options\n * @returns Config object for store initialization\n *\n * @example\n * ```typescript\n * const storeConfig = createFeatureFlagStoreConfig({\n * context: { userId: user.id },\n * defaults: { 'MY_FLAG': false },\n * polling: { enabled: true, interval: 30000 },\n * onFlagChange: (key, prev, next) => console.log(`${key}: ${prev} → ${next}`),\n * });\n *\n * useFeatureFlagInitializer(storeConfig);\n * ```\n */\nexport function createFeatureFlagStoreConfig(options: {\n serviceKey?: string;\n context?: FeatureFlagContext;\n defaults?: Record<string, FeatureFlagValue>;\n polling?: { enabled?: boolean; interval?: number };\n onFlagChange?: (\n key: string,\n prevValue: FeatureFlagValue | undefined,\n newValue: FeatureFlagValue\n ) => void;\n onError?: (error: unknown) => void;\n}): CoreFeatureFlagStoreInitConfig {\n const { serviceKey, context, defaults, polling, onFlagChange, onError } = options;\n\n return {\n fetchFn: createFeatureFlagFetcher({ serviceKey, context }),\n defaults,\n polling,\n onFlagChange,\n onError,\n };\n}\n"]}