@plyaz/core 1.2.0 → 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 (238) 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 +28 -50
  16. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -1
  17. package/dist/backend/featureFlags/config/validation.d.ts +6 -6
  18. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -1
  19. package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -55
  20. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  21. package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -43
  22. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  23. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +16 -2
  24. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -1
  25. package/dist/backend/featureFlags/index.d.ts +6 -7
  26. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  27. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -1
  28. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -1
  29. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +6 -11
  30. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -1
  31. package/dist/backend/index.d.ts +5 -0
  32. package/dist/backend/index.d.ts.map +1 -1
  33. package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
  34. package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
  35. package/dist/base/cache/index.d.ts +1 -0
  36. package/dist/base/cache/index.d.ts.map +1 -1
  37. package/dist/base/cache/strategies/redis.d.ts.map +1 -1
  38. package/dist/base/observability/BaseAdapter.d.ts +79 -0
  39. package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
  40. package/dist/base/observability/CompositeAdapter.d.ts +72 -0
  41. package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
  42. package/dist/base/observability/DatadogAdapter.d.ts +117 -0
  43. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
  44. package/dist/base/observability/LoggerAdapter.d.ts +54 -0
  45. package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
  46. package/dist/base/observability/ObservabilityService.d.ts +160 -0
  47. package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
  48. package/dist/base/observability/index.d.ts +17 -0
  49. package/dist/base/observability/index.d.ts.map +1 -0
  50. package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
  51. package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
  52. package/dist/domain/base/BaseDomainService.d.ts +284 -0
  53. package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
  54. package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
  55. package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
  56. package/dist/domain/base/BaseMapper.d.ts +100 -0
  57. package/dist/domain/base/BaseMapper.d.ts.map +1 -0
  58. package/dist/domain/base/BaseValidator.d.ts +105 -0
  59. package/dist/domain/base/BaseValidator.d.ts.map +1 -0
  60. package/dist/domain/base/index.d.ts +10 -0
  61. package/dist/domain/base/index.d.ts.map +1 -0
  62. package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
  63. package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
  64. package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
  65. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
  66. package/dist/domain/example/index.d.ts +10 -0
  67. package/dist/domain/example/index.d.ts.map +1 -0
  68. package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
  69. package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
  70. package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
  71. package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
  72. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
  73. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
  74. package/dist/domain/featureFlags/index.d.ts +10 -5
  75. package/dist/domain/featureFlags/index.d.ts.map +1 -1
  76. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
  77. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
  78. package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
  79. package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
  80. package/dist/domain/featureFlags/module.d.ts +20 -0
  81. package/dist/domain/featureFlags/module.d.ts.map +1 -0
  82. package/dist/domain/featureFlags/provider.d.ts +40 -1
  83. package/dist/domain/featureFlags/provider.d.ts.map +1 -1
  84. package/dist/domain/featureFlags/providers/api.d.ts +59 -34
  85. package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
  86. package/dist/domain/featureFlags/providers/database.d.ts +48 -46
  87. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  88. package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
  89. package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
  90. package/dist/domain/featureFlags/providers/file.d.ts +48 -1
  91. package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
  92. package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
  93. package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
  94. package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
  95. package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
  96. package/dist/domain/featureFlags/service.d.ts +112 -0
  97. package/dist/domain/featureFlags/service.d.ts.map +1 -0
  98. package/dist/domain/index.d.ts +2 -0
  99. package/dist/domain/index.d.ts.map +1 -1
  100. package/dist/engine/featureFlags/engine.d.ts +8 -0
  101. package/dist/engine/featureFlags/engine.d.ts.map +1 -1
  102. package/dist/entry-backend.d.ts +24 -0
  103. package/dist/entry-backend.d.ts.map +1 -0
  104. package/dist/entry-backend.js +15635 -0
  105. package/dist/entry-backend.js.map +1 -0
  106. package/dist/entry-backend.mjs +15506 -0
  107. package/dist/entry-backend.mjs.map +1 -0
  108. package/dist/entry-frontend.d.ts +23 -0
  109. package/dist/entry-frontend.d.ts.map +1 -0
  110. package/dist/entry-frontend.js +11152 -0
  111. package/dist/entry-frontend.js.map +1 -0
  112. package/dist/entry-frontend.mjs +11089 -0
  113. package/dist/entry-frontend.mjs.map +1 -0
  114. package/dist/events/CoreEventManager.d.ts +116 -0
  115. package/dist/events/CoreEventManager.d.ts.map +1 -0
  116. package/dist/events/index.d.ts +27 -0
  117. package/dist/events/index.d.ts.map +1 -0
  118. package/dist/frontend/base/index.d.ts +8 -0
  119. package/dist/frontend/base/index.d.ts.map +1 -0
  120. package/dist/frontend/components/InitializationError.d.ts +25 -0
  121. package/dist/frontend/components/InitializationError.d.ts.map +1 -0
  122. package/dist/frontend/components/InitializationLoading.d.ts +22 -0
  123. package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
  124. package/dist/frontend/components/index.d.ts +9 -0
  125. package/dist/frontend/components/index.d.ts.map +1 -0
  126. package/dist/frontend/example/index.d.ts +9 -0
  127. package/dist/frontend/example/index.d.ts.map +1 -0
  128. package/dist/frontend/featureFlags/index.d.ts +28 -7
  129. package/dist/frontend/featureFlags/index.d.ts.map +1 -1
  130. package/dist/frontend/index.d.ts +4 -0
  131. package/dist/frontend/index.d.ts.map +1 -1
  132. package/dist/frontend/providers/ApiProvider.d.ts +2 -2
  133. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -1
  134. package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
  135. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
  136. package/dist/frontend/providers/index.d.ts +1 -0
  137. package/dist/frontend/providers/index.d.ts.map +1 -1
  138. package/dist/frontend/store/feature-flags.d.ts +63 -0
  139. package/dist/frontend/store/feature-flags.d.ts.map +1 -0
  140. package/dist/frontend/store/index.d.ts +14 -0
  141. package/dist/frontend/store/index.d.ts.map +1 -0
  142. package/dist/frontend/store/integrations.d.ts +36 -0
  143. package/dist/frontend/store/integrations.d.ts.map +1 -0
  144. package/dist/frontend/store/service-accessors.d.ts +78 -0
  145. package/dist/frontend/store/service-accessors.d.ts.map +1 -0
  146. package/dist/index.d.ts +5 -2
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +15450 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/index.mjs +13678 -4697
  151. package/dist/index.mjs.map +1 -1
  152. package/dist/init/CoreInitializer.d.ts +582 -0
  153. package/dist/init/CoreInitializer.d.ts.map +1 -0
  154. package/dist/init/ServiceRegistry.d.ts +256 -0
  155. package/dist/init/ServiceRegistry.d.ts.map +1 -0
  156. package/dist/init/index.d.ts +14 -0
  157. package/dist/init/index.d.ts.map +1 -0
  158. package/dist/init/nestjs/CoreModule.d.ts +63 -0
  159. package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
  160. package/dist/init/nestjs/index.d.ts +5 -0
  161. package/dist/init/nestjs/index.d.ts.map +1 -0
  162. package/dist/init/nestjs/index.js +9059 -0
  163. package/dist/init/nestjs/index.js.map +1 -0
  164. package/dist/init/nestjs/index.mjs +9055 -0
  165. package/dist/init/nestjs/index.mjs.map +1 -0
  166. package/dist/init/react.d.ts +33 -0
  167. package/dist/init/react.d.ts.map +1 -0
  168. package/dist/models/example/ExampleRepository.d.ts +124 -0
  169. package/dist/models/example/ExampleRepository.d.ts.map +1 -0
  170. package/dist/models/example/index.d.ts +7 -0
  171. package/dist/models/example/index.d.ts.map +1 -0
  172. package/dist/{backend/featureFlags/database/repository.d.ts → models/featureFlags/FeatureFlagRepository.d.ts} +47 -5
  173. package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
  174. package/dist/models/featureFlags/index.d.ts +7 -0
  175. package/dist/models/featureFlags/index.d.ts.map +1 -0
  176. package/dist/models/index.d.ts +9 -0
  177. package/dist/models/index.d.ts.map +1 -0
  178. package/dist/services/ApiClientService.d.ts +92 -4
  179. package/dist/services/ApiClientService.d.ts.map +1 -1
  180. package/dist/services/CacheService.d.ts +176 -0
  181. package/dist/services/CacheService.d.ts.map +1 -0
  182. package/dist/services/DbService.d.ts +391 -0
  183. package/dist/services/DbService.d.ts.map +1 -0
  184. package/dist/services/NotificationService.d.ts +151 -0
  185. package/dist/services/NotificationService.d.ts.map +1 -0
  186. package/dist/services/StorageService.d.ts +144 -0
  187. package/dist/services/StorageService.d.ts.map +1 -0
  188. package/dist/services/index.d.ts +4 -0
  189. package/dist/services/index.d.ts.map +1 -1
  190. package/dist/utils/common/id.d.ts +83 -0
  191. package/dist/utils/common/id.d.ts.map +1 -0
  192. package/dist/utils/common/index.d.ts +2 -0
  193. package/dist/utils/common/index.d.ts.map +1 -1
  194. package/dist/utils/common/object.d.ts +70 -0
  195. package/dist/utils/common/object.d.ts.map +1 -0
  196. package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
  197. package/dist/utils/featureFlags/context.d.ts +0 -1
  198. package/dist/utils/featureFlags/context.d.ts.map +1 -1
  199. package/dist/utils/index.d.ts +1 -0
  200. package/dist/utils/index.d.ts.map +1 -1
  201. package/dist/utils/mapperUtils.d.ts +38 -0
  202. package/dist/utils/mapperUtils.d.ts.map +1 -0
  203. package/dist/utils/runtime.d.ts +15 -0
  204. package/dist/utils/runtime.d.ts.map +1 -0
  205. package/dist/version.d.ts +24 -0
  206. package/dist/version.d.ts.map +1 -0
  207. package/dist/web_app/auth/add_user.d.ts +2 -2
  208. package/dist/web_app/auth/add_user.d.ts.map +1 -1
  209. package/dist/web_app/auth/update_user.d.ts +1 -1
  210. package/dist/web_app/auth/update_user.d.ts.map +1 -1
  211. package/package.json +89 -15
  212. package/dist/backend/featureFlags/database/connection.d.ts +0 -321
  213. package/dist/backend/featureFlags/database/connection.d.ts.map +0 -1
  214. package/dist/backend/featureFlags/database/repository.d.ts.map +0 -1
  215. package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
  216. package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
  217. package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -264
  218. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
  219. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
  220. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
  221. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
  222. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
  223. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
  224. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
  225. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
  226. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
  227. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
  228. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
  229. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
  230. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
  231. package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
  232. package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
  233. package/dist/index.cjs +0 -6435
  234. package/dist/index.cjs.map +0 -1
  235. package/dist/utils/db/databaseService.d.ts +0 -6
  236. package/dist/utils/db/databaseService.d.ts.map +0 -1
  237. package/dist/utils/db/index.d.ts +0 -2
  238. package/dist/utils/db/index.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/common/id.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/domain/base/BaseDomainService.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/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/init/nestjs/CoreModule.ts"],"names":["EventEmitter","CORE_EVENTS","createDatabaseService","DatabasePackageError","DATABASE_ERROR_CODES","PRODUCTION_CONFIG","STAGING_CONFIG","DEVELOPMENT_CONFIG","setDefaultApiClient","ApiPackageError","PACKAGE_STATUS_CODES","API_ERROR_CODES","OPERATIONS","generateRequestId","ERROR_CODES","ERROR_CATEGORY","HTTP_STATUS","mergeConfigs","createApiClient","config","CACHE_MAX_SIZE_DEFAULT","CACHE_CLEANUP_INTERVAL_DEFAULT","CorePackageError","TIME_CONSTANTS","of","tap","Injectable","CoreLogger","CACHE_STRATEGIES","StorageServiceImpl","StoragePackageError","STORAGE_ERROR_CODES","NotificationServiceImpl","NotificationPackageError","NOTIFICATION_ERROR_CODES","PackageLogger","STORE_KEYS","BaseError","OBSERVABILITY_METRICS","ValidateAndFormatErrors","ValidationError","BaseRepository","CreateExampleSchema","UpdateExampleSchema","PatchExampleSchema","DeleteExampleSchema","QueryExampleSchema","SERVICE_KEYS","logger","errors","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","clearEventEmitter","useRootStore","ServerErrorMiddleware","createStandaloneFeatureFlagStore","initializeErrorSystem","setEventEmitter","initializeGlobalErrorHandler"],"mappings":"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","file":"index.js","sourcesContent":["/**\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","/**\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 * 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 * 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 * 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 * NestJS Module for @plyaz/core\n *\n * Provides dependency injection integration for NestJS applications.\n *\n * @example\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/nestjs';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({\n * envPath: '.env',\n * db: { adapter: 'sql' },\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example Async configuration\n * ```typescript\n * CoreModule.forRootAsync({\n * imports: [ConfigModule],\n * useFactory: (config: ConfigService) => ({\n * db: {\n * adapter: 'sql',\n * sql: { connectionString: config.get('DATABASE_URL') },\n * },\n * }),\n * inject: [ConfigService],\n * })\n * ```\n */\n\nimport type { DynamicModule, Provider } from '@nestjs/common';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\nimport { DbService } from '../../services/DbService';\nimport type { CoreNestJsCoreModuleAsyncOptions } from '@plyaz/types/core';\n\n/**\n * Injection tokens for Core services\n */\nexport const CORE_OPTIONS = Symbol('CORE_OPTIONS');\nexport const DB_SERVICE = Symbol('DB_SERVICE');\n\n/**\n * Async configuration options for CoreModule\n * Uses CoreInitOptions for type safety with Core.initialize()\n */\ntype CoreModuleAsyncOptions = CoreNestJsCoreModuleAsyncOptions;\n\n/**\n * CoreModule - NestJS DI module for @plyaz/core\n */\nexport class CoreModule {\n /**\n * Register CoreModule with static configuration\n */\n static forRoot(options: CoreInitOptions = {}): DynamicModule {\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useValue: options,\n },\n {\n provide: DbService,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n {\n provide: DB_SERVICE,\n useFactory: async () => {\n await Core.initialize(options);\n return Core.db;\n },\n },\n ];\n\n return {\n module: CoreModule,\n global: true,\n providers,\n exports: [DbService, DB_SERVICE, CORE_OPTIONS],\n };\n }\n\n /**\n * Register CoreModule with async configuration\n */\n static forRootAsync(options: CoreModuleAsyncOptions): DynamicModule {\n const providers: Provider[] = [\n {\n provide: CORE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n },\n {\n provide: DbService,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n {\n provide: DB_SERVICE,\n useFactory: async (coreOptions: CoreInitOptions) => {\n await Core.initialize(coreOptions);\n return Core.db;\n },\n inject: [CORE_OPTIONS],\n },\n ];\n\n return {\n module: CoreModule,\n global: true,\n imports: options.imports ?? [],\n providers,\n exports: [DbService, DB_SERVICE, CORE_OPTIONS],\n };\n }\n}\n"]}