@plyaz/core 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/adapters/index.d.ts +16 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/nestjs.d.ts +79 -0
  4. package/dist/adapters/nestjs.d.ts.map +1 -0
  5. package/dist/adapters/nextjs.d.ts +28 -0
  6. package/dist/adapters/nextjs.d.ts.map +1 -0
  7. package/dist/backend/example/example.controller.d.ts +121 -0
  8. package/dist/backend/example/example.controller.d.ts.map +1 -0
  9. package/dist/backend/example/example.module.d.ts +29 -0
  10. package/dist/backend/example/example.module.d.ts.map +1 -0
  11. package/dist/backend/example/index.d.ts +8 -0
  12. package/dist/backend/example/index.d.ts.map +1 -0
  13. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
  14. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
  15. package/dist/backend/featureFlags/config/feature-flag.config.d.ts +89 -0
  16. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
  17. package/dist/backend/featureFlags/config/validation.d.ts +181 -0
  18. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
  19. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
  20. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
  21. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
  22. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
  23. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
  24. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
  25. package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -56
  26. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  27. package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -44
  28. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  29. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +33 -0
  30. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
  31. package/dist/backend/featureFlags/index.d.ts +14 -41
  32. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  33. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
  34. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
  35. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
  36. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
  37. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +162 -0
  38. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
  39. package/dist/backend/index.d.ts +5 -0
  40. package/dist/backend/index.d.ts.map +1 -1
  41. package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
  42. package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
  43. package/dist/base/cache/feature/caching.d.ts +16 -0
  44. package/dist/base/cache/feature/caching.d.ts.map +1 -0
  45. package/dist/base/cache/index.d.ts +2 -0
  46. package/dist/base/cache/index.d.ts.map +1 -1
  47. package/dist/base/cache/strategies/redis.d.ts.map +1 -1
  48. package/dist/base/observability/BaseAdapter.d.ts +79 -0
  49. package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
  50. package/dist/base/observability/CompositeAdapter.d.ts +72 -0
  51. package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
  52. package/dist/base/observability/DatadogAdapter.d.ts +117 -0
  53. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
  54. package/dist/base/observability/LoggerAdapter.d.ts +54 -0
  55. package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
  56. package/dist/base/observability/ObservabilityService.d.ts +160 -0
  57. package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
  58. package/dist/base/observability/index.d.ts +17 -0
  59. package/dist/base/observability/index.d.ts.map +1 -0
  60. package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
  61. package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
  62. package/dist/domain/base/BaseDomainService.d.ts +284 -0
  63. package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
  64. package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
  65. package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
  66. package/dist/domain/base/BaseMapper.d.ts +100 -0
  67. package/dist/domain/base/BaseMapper.d.ts.map +1 -0
  68. package/dist/domain/base/BaseValidator.d.ts +105 -0
  69. package/dist/domain/base/BaseValidator.d.ts.map +1 -0
  70. package/dist/domain/base/index.d.ts +10 -0
  71. package/dist/domain/base/index.d.ts.map +1 -0
  72. package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
  73. package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
  74. package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
  75. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
  76. package/dist/domain/example/index.d.ts +10 -0
  77. package/dist/domain/example/index.d.ts.map +1 -0
  78. package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
  79. package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
  80. package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
  81. package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
  82. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
  83. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
  84. package/dist/domain/featureFlags/index.d.ts +10 -5
  85. package/dist/domain/featureFlags/index.d.ts.map +1 -1
  86. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
  87. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
  88. package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
  89. package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
  90. package/dist/domain/featureFlags/module.d.ts +20 -0
  91. package/dist/domain/featureFlags/module.d.ts.map +1 -0
  92. package/dist/domain/featureFlags/provider.d.ts +40 -1
  93. package/dist/domain/featureFlags/provider.d.ts.map +1 -1
  94. package/dist/domain/featureFlags/providers/api.d.ts +59 -34
  95. package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
  96. package/dist/domain/featureFlags/providers/database.d.ts +59 -52
  97. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  98. package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
  99. package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
  100. package/dist/domain/featureFlags/providers/file.d.ts +48 -1
  101. package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
  102. package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
  103. package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
  104. package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
  105. package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
  106. package/dist/domain/featureFlags/service.d.ts +112 -0
  107. package/dist/domain/featureFlags/service.d.ts.map +1 -0
  108. package/dist/domain/index.d.ts +2 -0
  109. package/dist/domain/index.d.ts.map +1 -1
  110. package/dist/engine/featureFlags/engine.d.ts +8 -0
  111. package/dist/engine/featureFlags/engine.d.ts.map +1 -1
  112. package/dist/entry-backend.d.ts +24 -0
  113. package/dist/entry-backend.d.ts.map +1 -0
  114. package/dist/entry-backend.js +15635 -0
  115. package/dist/entry-backend.js.map +1 -0
  116. package/dist/entry-backend.mjs +15506 -0
  117. package/dist/entry-backend.mjs.map +1 -0
  118. package/dist/entry-frontend.d.ts +23 -0
  119. package/dist/entry-frontend.d.ts.map +1 -0
  120. package/dist/entry-frontend.js +11152 -0
  121. package/dist/entry-frontend.js.map +1 -0
  122. package/dist/entry-frontend.mjs +11089 -0
  123. package/dist/entry-frontend.mjs.map +1 -0
  124. package/dist/events/CoreEventManager.d.ts +116 -0
  125. package/dist/events/CoreEventManager.d.ts.map +1 -0
  126. package/dist/events/index.d.ts +27 -0
  127. package/dist/events/index.d.ts.map +1 -0
  128. package/dist/frontend/base/index.d.ts +8 -0
  129. package/dist/frontend/base/index.d.ts.map +1 -0
  130. package/dist/frontend/components/InitializationError.d.ts +25 -0
  131. package/dist/frontend/components/InitializationError.d.ts.map +1 -0
  132. package/dist/frontend/components/InitializationLoading.d.ts +22 -0
  133. package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
  134. package/dist/frontend/components/index.d.ts +9 -0
  135. package/dist/frontend/components/index.d.ts.map +1 -0
  136. package/dist/frontend/example/index.d.ts +9 -0
  137. package/dist/frontend/example/index.d.ts.map +1 -0
  138. package/dist/frontend/featureFlags/index.d.ts +28 -7
  139. package/dist/frontend/featureFlags/index.d.ts.map +1 -1
  140. package/dist/frontend/index.d.ts +5 -0
  141. package/dist/frontend/index.d.ts.map +1 -1
  142. package/dist/frontend/providers/ApiProvider.d.ts +41 -0
  143. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
  144. package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
  145. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
  146. package/dist/frontend/providers/index.d.ts +8 -0
  147. package/dist/frontend/providers/index.d.ts.map +1 -0
  148. package/dist/frontend/store/feature-flags.d.ts +63 -0
  149. package/dist/frontend/store/feature-flags.d.ts.map +1 -0
  150. package/dist/frontend/store/index.d.ts +14 -0
  151. package/dist/frontend/store/index.d.ts.map +1 -0
  152. package/dist/frontend/store/integrations.d.ts +36 -0
  153. package/dist/frontend/store/integrations.d.ts.map +1 -0
  154. package/dist/frontend/store/service-accessors.d.ts +78 -0
  155. package/dist/frontend/store/service-accessors.d.ts.map +1 -0
  156. package/dist/index.d.ts +6 -2
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +15450 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/index.mjs +13461 -2440
  161. package/dist/index.mjs.map +1 -1
  162. package/dist/init/CoreInitializer.d.ts +582 -0
  163. package/dist/init/CoreInitializer.d.ts.map +1 -0
  164. package/dist/init/ServiceRegistry.d.ts +256 -0
  165. package/dist/init/ServiceRegistry.d.ts.map +1 -0
  166. package/dist/init/index.d.ts +14 -0
  167. package/dist/init/index.d.ts.map +1 -0
  168. package/dist/init/nestjs/CoreModule.d.ts +63 -0
  169. package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
  170. package/dist/init/nestjs/index.d.ts +5 -0
  171. package/dist/init/nestjs/index.d.ts.map +1 -0
  172. package/dist/init/nestjs/index.js +9059 -0
  173. package/dist/init/nestjs/index.js.map +1 -0
  174. package/dist/init/nestjs/index.mjs +9055 -0
  175. package/dist/init/nestjs/index.mjs.map +1 -0
  176. package/dist/init/react.d.ts +33 -0
  177. package/dist/init/react.d.ts.map +1 -0
  178. package/dist/models/example/ExampleRepository.d.ts +124 -0
  179. package/dist/models/example/ExampleRepository.d.ts.map +1 -0
  180. package/dist/models/example/index.d.ts +7 -0
  181. package/dist/models/example/index.d.ts.map +1 -0
  182. package/dist/models/featureFlags/FeatureFlagRepository.d.ts +560 -0
  183. package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
  184. package/dist/models/featureFlags/index.d.ts +7 -0
  185. package/dist/models/featureFlags/index.d.ts.map +1 -0
  186. package/dist/models/index.d.ts +9 -0
  187. package/dist/models/index.d.ts.map +1 -0
  188. package/dist/services/ApiClientService.d.ts +178 -0
  189. package/dist/services/ApiClientService.d.ts.map +1 -0
  190. package/dist/services/CacheService.d.ts +176 -0
  191. package/dist/services/CacheService.d.ts.map +1 -0
  192. package/dist/services/DbService.d.ts +391 -0
  193. package/dist/services/DbService.d.ts.map +1 -0
  194. package/dist/services/NotificationService.d.ts +151 -0
  195. package/dist/services/NotificationService.d.ts.map +1 -0
  196. package/dist/services/StorageService.d.ts +144 -0
  197. package/dist/services/StorageService.d.ts.map +1 -0
  198. package/dist/services/index.d.ts +12 -0
  199. package/dist/services/index.d.ts.map +1 -0
  200. package/dist/utils/common/id.d.ts +83 -0
  201. package/dist/utils/common/id.d.ts.map +1 -0
  202. package/dist/utils/common/index.d.ts +3 -1
  203. package/dist/utils/common/index.d.ts.map +1 -1
  204. package/dist/utils/common/object.d.ts +70 -0
  205. package/dist/utils/common/object.d.ts.map +1 -0
  206. package/dist/utils/common/validation.d.ts +20 -0
  207. package/dist/utils/common/validation.d.ts.map +1 -0
  208. package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
  209. package/dist/utils/featureFlags/context.d.ts +0 -1
  210. package/dist/utils/featureFlags/context.d.ts.map +1 -1
  211. package/dist/utils/index.d.ts +1 -0
  212. package/dist/utils/index.d.ts.map +1 -1
  213. package/dist/utils/mapperUtils.d.ts +38 -0
  214. package/dist/utils/mapperUtils.d.ts.map +1 -0
  215. package/dist/utils/runtime.d.ts +15 -0
  216. package/dist/utils/runtime.d.ts.map +1 -0
  217. package/dist/version.d.ts +24 -0
  218. package/dist/version.d.ts.map +1 -0
  219. package/dist/web_app/auth/add_user.d.ts +3 -0
  220. package/dist/web_app/auth/add_user.d.ts.map +1 -0
  221. package/dist/web_app/auth/update_user.d.ts +2 -0
  222. package/dist/web_app/auth/update_user.d.ts.map +1 -0
  223. package/package.json +102 -15
  224. package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
  225. package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
  226. package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -123
  227. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
  228. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
  229. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
  230. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
  231. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
  232. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
  233. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
  234. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
  235. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
  236. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
  237. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
  238. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
  239. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
  240. package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
  241. package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
  242. package/dist/index.cjs +0 -4383
  243. package/dist/index.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling-interceptor.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/interceptors/error-handling-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK5F,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGlC;;;;;;;;GAQG;AACH,qBACa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;IAEH,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAwB7E"}
@@ -0,0 +1,18 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ /**
4
+ * Interceptor for feature flag usage analytics.
5
+ *
6
+ * FLOW:
7
+ * 1. Runs AFTER middleware attaches feature flags.
8
+ * 2. Dynamically tracks which feature flags are enabled for this request.
9
+ * 3. Can send metrics to analytics service or database.
10
+ * 4. Calls the next handler (controller/service).
11
+ * 5. After controller/service finishes, optionally track request completion.
12
+ */
13
+ export declare class FeatureFlagLoggingInterceptor implements NestInterceptor {
14
+ private readonly logger;
15
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
16
+ private trackFeatureUsage;
17
+ }
18
+ //# sourceMappingURL=feature-flag-logging-interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flag-logging-interceptor.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/interceptors/feature-flag-logging-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AAEvC;;;;;;;;;GASG;AAEH,qBACa,6BAA8B,YAAW,eAAe;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;IAEH,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;IA0B5E,OAAO,CAAC,iBAAiB;CAI1B"}
@@ -0,0 +1,162 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { FeatureFlagService } from '@domain/featureFlags';
3
+ import type { FeatureFlagKey } from '@domain/types';
4
+ import type { CoreFeatureFlagRequest } from '@plyaz/types/core';
5
+ /**
6
+ * FeatureFlagMiddleware - Evaluates and attaches feature flags to every request
7
+ *
8
+ * @description This middleware runs early in the request lifecycle to evaluate feature flags
9
+ * and attach them to the request object. It allows controllers and services to access
10
+ * pre-evaluated flags without making additional service calls, improving performance.
11
+ *
12
+ * **Execution Flow:**
13
+ * 1. Middleware executes first for every incoming HTTP request
14
+ * 2. Extracts flag key from query params, headers, or uses default
15
+ * 3. Calls FeatureFlagService to evaluate the specified flag
16
+ * 4. Attaches evaluated flags to `req.featureFlags` object
17
+ * 5. Passes control to next middleware/interceptor/controller
18
+ *
19
+ * **Flag Key Priority:**
20
+ * 1. Query parameter: `?flag=FEATURE_NAME`
21
+ * 2. HTTP header: `X-Feature-Flag: FEATURE_NAME`
22
+ * 3. Default: `AUTH_GOOGLE`
23
+ *
24
+ * **Use Cases:**
25
+ * - Global feature flag evaluation for all requests
26
+ * - Performance optimization (evaluate once, use many times)
27
+ * - Request-scoped feature flag context
28
+ * - Dynamic flag selection via client parameters
29
+ *
30
+ * @example Setup - Register middleware globally
31
+ * ```typescript
32
+ * // app.module.ts
33
+ * import { MiddlewareConsumer, Module } from '@nestjs/common';
34
+ * import { FeatureFlagMiddleware } from './middleware/feature-flag-middleware';
35
+ *
36
+ * @Module({
37
+ * // ... other config
38
+ * })
39
+ * export class AppModule {
40
+ * configure(consumer: MiddlewareConsumer) {
41
+ * consumer
42
+ * .apply(FeatureFlagMiddleware)
43
+ * .forRoutes('*'); // Apply to all routes
44
+ * }
45
+ * }
46
+ * ```
47
+ *
48
+ * @example Client Usage - Query Parameter
49
+ * ```bash
50
+ * # Client specifies which flag to evaluate
51
+ * curl "https://api.example.com/users?flag=PREMIUM_FEATURES"
52
+ *
53
+ * # Middleware evaluates PREMIUM_FEATURES and attaches to request
54
+ * # req.featureFlags = { PREMIUM_FEATURES: true }
55
+ * ```
56
+ *
57
+ * @example Client Usage - HTTP Header
58
+ * ```bash
59
+ * # Alternative: Use HTTP header
60
+ * curl -H "X-Feature-Flag: NEW_DASHBOARD" "https://api.example.com/dashboard"
61
+ *
62
+ * # Middleware evaluates NEW_DASHBOARD
63
+ * # req.featureFlags = { NEW_DASHBOARD: false }
64
+ * ```
65
+ *
66
+ * @example Controller Access - Use pre-evaluated flags
67
+ * ```typescript
68
+ * @Controller('api')
69
+ * export class ApiController {
70
+ * @Get('dashboard')
71
+ * async getDashboard(@Req() req: Request) {
72
+ * // Access pre-evaluated flags (no service call needed)
73
+ * const flags = req.featureFlags;
74
+ *
75
+ * if (flags?.NEW_DASHBOARD) {
76
+ * return this.dashboardService.getNewDashboard();
77
+ * } else {
78
+ * return this.dashboardService.getLegacyDashboard();
79
+ * }
80
+ * }
81
+ * }
82
+ * ```
83
+ *
84
+ * @example Service Access - Inject flags into services
85
+ * ```typescript
86
+ * @Injectable()
87
+ * export class UserService {
88
+ * async getUsers(@Req() req: Request) {
89
+ * const flags = req.featureFlags;
90
+ *
91
+ * // Use flags to modify service behavior
92
+ * if (flags?.ENHANCED_USER_DATA) {
93
+ * return this.getUsersWithEnhancedData();
94
+ * }
95
+ *
96
+ * return this.getBasicUsers();
97
+ * }
98
+ * }
99
+ * ```
100
+ *
101
+ * @example Error Handling - Invalid flag keys
102
+ * ```typescript
103
+ * // Request with invalid flag:
104
+ * // GET /api/users?flag=INVALID_FLAG
105
+ * //
106
+ * // Response:
107
+ * // HTTP 404 Not Found
108
+ * // {
109
+ * // "error": "Invalid feature flag key: INVALID_FLAG",
110
+ * // "statusCode": 404
111
+ * // }
112
+ * ```
113
+ *
114
+ * @example Multiple Flags - Accumulate flags across requests
115
+ * ```typescript
116
+ * // First request adds AUTH_GOOGLE: true
117
+ * // Second request adds PREMIUM_FEATURES: false
118
+ * // req.featureFlags = {
119
+ * // AUTH_GOOGLE: true,
120
+ * // PREMIUM_FEATURES: false
121
+ * // }
122
+ * ```
123
+ */
124
+ export declare class FeatureFlagMiddleware implements NestMiddleware {
125
+ private readonly featureFlagService;
126
+ private readonly logger;
127
+ constructor(featureFlagService: FeatureFlagService<FeatureFlagKey>);
128
+ /**
129
+ * Main middleware execution method
130
+ *
131
+ * @description Processes incoming requests to evaluate and attach feature flags.
132
+ * Handles flag key extraction from multiple sources and graceful error handling.
133
+ *
134
+ * @param {CoreFeatureFlagRequest} req - Express request object with feature flag extensions
135
+ * @param {unknown} res - Express response object (not used in this middleware)
136
+ * @param {Function} next - Next middleware function in the chain
137
+ *
138
+ * @throws {BaseError} When flag key is invalid or evaluation fails
139
+ *
140
+ * @example Request Processing Flow
141
+ * ```typescript
142
+ * // 1. Extract flag key from request
143
+ * const flagKey = req.query.flag || req.headers['x-feature-flag'] || 'AUTH_GOOGLE';
144
+ *
145
+ * // 2. Validate flag key exists in system
146
+ * if (!isFeatureFlagKey(flagKey)) {
147
+ * throw new Error('Invalid flag key');
148
+ * }
149
+ *
150
+ * // 3. Evaluate flag using service
151
+ * const evaluation = await this.featureFlagService.evaluateFlag(flagKey);
152
+ *
153
+ * // 4. Attach to request object
154
+ * req.featureFlags = { [flagKey]: evaluation.isEnabled };
155
+ *
156
+ * // 5. Continue to next middleware
157
+ * next();
158
+ * ```
159
+ */
160
+ use(req: CoreFeatureFlagRequest, res: unknown, next: (...args: unknown[]) => void): Promise<void>;
161
+ }
162
+ //# sourceMappingURL=feature-flag-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flag-middleware.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/middleware/feature-flag-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAU,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EAAwB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAShE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsHG;AACH,qBACa,qBAAsB,YAAW,cAAc;IAQxD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAPrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;gBAIgB,kBAAkB,EAAE,kBAAkB,CAAC,cAAc,CAAC;IAGzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IAEG,GAAG,CACP,GAAG,EAAE,sBAAsB,EAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC;CAoCjB"}
@@ -1,5 +1,10 @@
1
1
  /**
2
2
  * Backend Layer Exports
3
+ *
4
+ * NestJS-specific implementations.
5
+ * For framework-agnostic modules, use domain exports:
6
+ * - import { FeatureFlagModule } from '@plyaz/core/domain/featureFlags';
3
7
  */
8
+ export * from './example';
4
9
  export * from './featureFlags';
5
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Cache Key Builder Utility
3
+ *
4
+ * Provides standardized methods for building cache keys with consistent patterns.
5
+ * All keys are designed to be prefixed by the service (handled by service layer).
6
+ *
7
+ * Key pattern: {prefix}:{type}:{identifier}:{params}
8
+ * Example: "example:entity:123" or "user:list:page:1"
9
+ *
10
+ * @fileoverview Cache key building utilities
11
+ */
12
+ /**
13
+ * Cache key builder for standardized cache key generation.
14
+ *
15
+ * All methods return un-prefixed keys that should be prefixed by the service layer.
16
+ * This allows each service to namespace their cache keys.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // In a service with cachePrefix = 'user'
21
+ * const key = CacheKeyBuilder.entity('123');
22
+ * // Returns: "entity:123"
23
+ * // After service prefixing: "user:entity:123"
24
+ * ```
25
+ */
26
+ export declare class CacheKeyBuilder {
27
+ /**
28
+ * Build cache key for a single entity by ID
29
+ *
30
+ * @param id - Entity ID
31
+ * @returns Cache key (unprefixed)
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * CacheKeyBuilder.entity('123')
36
+ * // Returns: "entity:123"
37
+ * // With prefix "user": "user:entity:123"
38
+ * ```
39
+ */
40
+ static entity(id: string): string;
41
+ /**
42
+ * Build cache key for a list/collection query
43
+ *
44
+ * @param params - Query parameters (page, limit, filters, etc.)
45
+ * @returns Cache key (unprefixed)
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * CacheKeyBuilder.list({ page: 1, limit: 10 })
50
+ * // Returns: "list:limit:10:page:1"
51
+ * // With prefix: "user:list:limit:10:page:1"
52
+ *
53
+ * CacheKeyBuilder.list() // No params
54
+ * // Returns: "list:all"
55
+ * ```
56
+ */
57
+ static list(params?: Record<string, unknown>): string;
58
+ /**
59
+ * Build cache key for a named query/filter
60
+ *
61
+ * @param queryName - Name of the query (e.g., 'active', 'byStatus', 'search')
62
+ * @param params - Query parameters
63
+ * @returns Cache key (unprefixed)
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * CacheKeyBuilder.query('active', { status: 'published' })
68
+ * // Returns: "query:active:status:\"published\""
69
+ *
70
+ * CacheKeyBuilder.query('search', { q: 'hello', limit: 10 })
71
+ * // Returns: "query:search:limit:10:q:\"hello\""
72
+ * ```
73
+ */
74
+ static query(queryName: string, params?: Record<string, unknown>): string;
75
+ /**
76
+ * Build cache key for aggregate/count operations
77
+ *
78
+ * @param operation - Operation name (e.g., 'count', 'sum', 'avg')
79
+ * @param field - Field name (optional)
80
+ * @param params - Additional parameters (optional)
81
+ * @returns Cache key (unprefixed)
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * CacheKeyBuilder.aggregate('count')
86
+ * // Returns: "aggregate:count"
87
+ *
88
+ * CacheKeyBuilder.aggregate('sum', 'amount')
89
+ * // Returns: "aggregate:sum:amount"
90
+ *
91
+ * CacheKeyBuilder.aggregate('count', 'users', { status: 'active' })
92
+ * // Returns: "aggregate:count:users:status:\"active\""
93
+ * ```
94
+ */
95
+ static aggregate(operation: string, field?: string, params?: Record<string, unknown>): string;
96
+ /**
97
+ * Build a custom cache key with type and identifier
98
+ *
99
+ * @param type - Cache key type
100
+ * @param identifier - Unique identifier for this cache entry
101
+ * @param params - Additional parameters (optional)
102
+ * @returns Cache key (unprefixed)
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * CacheKeyBuilder.custom('session', 'abc123')
107
+ * // Returns: "session:abc123"
108
+ *
109
+ * CacheKeyBuilder.custom('report', 'monthly', { year: 2025, month: 1 })
110
+ * // Returns: "report:monthly:month:1:year:2025"
111
+ * ```
112
+ */
113
+ static custom(type: string, identifier: string, params?: Record<string, unknown>): string;
114
+ }
115
+ //# sourceMappingURL=CacheKeyBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheKeyBuilder.d.ts","sourceRoot":"","sources":["../../../src/base/cache/CacheKeyBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIjC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAWrD;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAUzE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAY7F;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAS1F"}
@@ -0,0 +1,16 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ /**
4
+ * Caching interceptor for feature flag responses.
5
+ *
6
+ * FLOW:
7
+ * 1. Runs AFTER middleware attaches dynamic feature flags.
8
+ * 2. Generates a cache key based on request URL and enabled flags.
9
+ * 3. If a cached response exists for this combination, returns it immediately.
10
+ * 4. Otherwise, calls the next handler and caches the response.
11
+ */
12
+ export declare class Caching implements NestInterceptor {
13
+ private cache;
14
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
15
+ }
16
+ //# sourceMappingURL=caching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caching.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/feature/caching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAW,MAAM,MAAM,CAAC;AAE3C;;;;;;;;GAQG;AACH,qBACa,OAAQ,YAAW,eAAe;IAE7C,OAAO,CAAC,KAAK,CAA8B;IAE3C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAmB7E"}
@@ -95,4 +95,6 @@ export declare class CacheManager {
95
95
  */
96
96
  dispose(): Promise<void>;
97
97
  }
98
+ export * from './feature/caching';
99
+ export { CacheKeyBuilder } from './CacheKeyBuilder';
98
100
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAiB,WAAW,EAAc,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IAQX,OAAO,CAAC,MAAM;IAP1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;OAIG;gBACiB,MAAM,EAAE,WAAW;IAIvC;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAe5C;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAexC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IActB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAiB,WAAW,EAAc,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IAQX,OAAO,CAAC,MAAM;IAP1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;OAIG;gBACiB,MAAM,EAAE,WAAW;IAIvC;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAe5C;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAexC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAgB1C,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;OAIG;gBACiB,MAAM,EAAE,gBAAgB;IAO5C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAuBxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAqBrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;;OAKG;YACW,eAAe;IAc7B;;;;;OAKG;YACW,mBAAmB;IA4BjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAGtB"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAK5F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAgB1C,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;OAIG;gBACiB,MAAM,EAAE,gBAAgB;IAO5C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAuBxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAqBrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;;OAKG;YACW,eAAe;IAc7B;;;;;OAKG;YACW,mBAAmB;IA4BjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Base Observability Adapter
3
+ *
4
+ * Abstract base class for all observability adapters.
5
+ * Provides common functionality and enforces the adapter interface.
6
+ *
7
+ * @module base/observability
8
+ */
9
+ import { PackageLogger } from '@plyaz/logger';
10
+ import type { ObservabilityAdapter, ObservabilityAdapterConfig, ObservabilityProvider, Metric, SpanOptions, Span, LogEntry, ObservabilityEvent } from '@plyaz/types/observability';
11
+ /**
12
+ * Abstract base class for observability adapters.
13
+ *
14
+ * Provides common functionality:
15
+ * - Initialization lifecycle
16
+ * - Default tag management
17
+ * - Error handling
18
+ * - Logging
19
+ *
20
+ * Subclasses must implement provider-specific methods.
21
+ */
22
+ export declare abstract class BaseAdapter implements ObservabilityAdapter {
23
+ abstract readonly provider: ObservabilityProvider;
24
+ abstract readonly name: string;
25
+ protected _isInitialized: boolean;
26
+ protected _config: ObservabilityAdapterConfig | null;
27
+ protected readonly logger: PackageLogger;
28
+ constructor();
29
+ get isInitialized(): boolean;
30
+ get config(): ObservabilityAdapterConfig | null;
31
+ initialize(config: ObservabilityAdapterConfig): Promise<void>;
32
+ shutdown(): Promise<void>;
33
+ isHealthy(): Promise<boolean>;
34
+ protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;
35
+ protected abstract doShutdown(): Promise<void>;
36
+ protected abstract doHealthCheck(): Promise<boolean>;
37
+ recordMetric(metric: Metric): Promise<void>;
38
+ incrementCounter(name: string, value?: number, tags?: Record<string, string>): Promise<void>;
39
+ setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void>;
40
+ recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void>;
41
+ protected abstract doRecordMetric(metric: Metric): Promise<void>;
42
+ startSpan(options: SpanOptions): Span;
43
+ getActiveSpan(): Span | null;
44
+ withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T>;
45
+ protected abstract doStartSpan(options: SpanOptions): Span;
46
+ protected abstract doGetActiveSpan(): Span | null;
47
+ log(entry: LogEntry): Promise<void>;
48
+ protected abstract doLog(entry: LogEntry): Promise<void>;
49
+ sendEvent(event: ObservabilityEvent): Promise<void>;
50
+ protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;
51
+ flush(): Promise<void>;
52
+ protected abstract doFlush(): Promise<void>;
53
+ /**
54
+ * Apply default tags to a metric
55
+ */
56
+ protected applyDefaultTags(metric: Metric): Metric;
57
+ /**
58
+ * Create a no-op span (for disabled/sampled-out traces)
59
+ */
60
+ protected createNoopSpan(_options: SpanOptions): Span;
61
+ }
62
+ /**
63
+ * No-op adapter that does nothing.
64
+ * Use when observability is disabled.
65
+ */
66
+ export declare class NoopAdapter extends BaseAdapter {
67
+ readonly provider: "noop";
68
+ readonly name = "NoopAdapter";
69
+ protected doInitialize(): Promise<void>;
70
+ protected doShutdown(): Promise<void>;
71
+ protected doHealthCheck(): Promise<boolean>;
72
+ protected doRecordMetric(): Promise<void>;
73
+ protected doStartSpan(options: SpanOptions): Span;
74
+ protected doGetActiveSpan(): Span | null;
75
+ protected doLog(): Promise<void>;
76
+ protected doSendEvent(): Promise<void>;
77
+ protected doFlush(): Promise<void>;
78
+ }
79
+ //# sourceMappingURL=BaseAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/base/observability/BaseAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Composite Adapter
3
+ *
4
+ * Supports multiple observability providers running in parallel or priority (fallback) modes.
5
+ *
6
+ * - **Parallel mode**: Sends data to all adapters simultaneously
7
+ * - **Priority mode**: Tries first adapter, falls back to next on failure
8
+ *
9
+ * @module base/observability
10
+ */
11
+ import type { ObservabilityAdapter, ObservabilityAdapterConfig, Metric, SpanOptions, Span, LogEntry, ObservabilityEvent } from '@plyaz/types/observability';
12
+ /**
13
+ * Composite adapter that delegates to multiple child adapters.
14
+ *
15
+ * @example Parallel mode (send to all - e.g., Datadog + Console)
16
+ * ```typescript
17
+ * const composite = new CompositeAdapter();
18
+ * await composite.initialize({
19
+ * mode: 'parallel',
20
+ * adapters: [datadogAdapter, loggerAdapter],
21
+ * failOnAnyError: false,
22
+ * });
23
+ * ```
24
+ *
25
+ * @example Priority mode (fallback chain)
26
+ * ```typescript
27
+ * const composite = new CompositeAdapter();
28
+ * await composite.initialize({
29
+ * mode: 'priority',
30
+ * adapters: [datadogAdapter, grafanaAdapter, loggerAdapter],
31
+ * adapterTimeout: 5000,
32
+ * });
33
+ * ```
34
+ */
35
+ export declare class CompositeAdapter implements ObservabilityAdapter {
36
+ readonly provider: "custom";
37
+ readonly name = "CompositeAdapter";
38
+ private _isInitialized;
39
+ private _config;
40
+ private adapters;
41
+ private mode;
42
+ private adapterTimeout;
43
+ private failOnAnyError;
44
+ private fallbackOnErrors;
45
+ private readonly logger;
46
+ constructor();
47
+ get isInitialized(): boolean;
48
+ initialize(config: ObservabilityAdapterConfig): Promise<void>;
49
+ shutdown(): Promise<void>;
50
+ isHealthy(): Promise<boolean>;
51
+ recordMetric(metric: Metric): Promise<void>;
52
+ incrementCounter(name: string, value?: number, tags?: Record<string, string>): Promise<void>;
53
+ setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void>;
54
+ recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void>;
55
+ startSpan(options: SpanOptions): Span;
56
+ getActiveSpan(): Span | null;
57
+ withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T>;
58
+ log(entry: LogEntry): Promise<void>;
59
+ sendEvent(event: ObservabilityEvent): Promise<void>;
60
+ flush(): Promise<void>;
61
+ private executeOnAdapters;
62
+ private executeParallel;
63
+ private executePriority;
64
+ private withTimeout;
65
+ /**
66
+ * Check if we should fallback on this error type
67
+ */
68
+ private shouldFallbackOnError;
69
+ private createCompositeSpan;
70
+ private createNoopSpan;
71
+ }
72
+ //# sourceMappingURL=CompositeAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompositeAdapter.d.ts","sourceRoot":"","sources":["../../../src/base/observability/CompositeAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,MAAM,EACN,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,kBAAkB,EAInB,MAAM,4BAA4B,CAAC;AAUpC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,YAAW,oBAAoB;IAC3D,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,QAAQ,CAAC,IAAI,sBAAsB;IAEnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;;IASvC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAIK,UAAU,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAazB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB7B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAMV,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IA2BrC,aAAa,IAAI,IAAI,GAAG,IAAI;IAUtB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmB7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,iBAAiB;YAoBjB,eAAe;YAyBf,eAAe;YAgCf,WAAW;IAgBzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,cAAc;CAiBvB"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Datadog Adapter
3
+ *
4
+ * Adapter for sending metrics, traces, and logs to Datadog.
5
+ *
6
+ * Automatically uses:
7
+ * 1. **SDK** (dd-trace, hot-shots) when available
8
+ * 2. **API Client** (from @plyaz/api) as fallback
9
+ * 3. **Logger** for local debugging when neither is available
10
+ *
11
+ * @module base/observability
12
+ */
13
+ import type { ObservabilityAdapterConfig, Metric, SpanOptions, Span, LogEntry, ObservabilityEvent, DatadogAdapterConfig } from '@plyaz/types/observability';
14
+ import { BaseAdapter } from './BaseAdapter';
15
+ /**
16
+ * Interface for Datadog API client.
17
+ * Implemented in @plyaz/api package with proper endpoint definitions.
18
+ */
19
+ export interface DatadogApiClient {
20
+ submitMetrics(metrics: DatadogMetricPayload[]): Promise<void>;
21
+ submitLogs(logs: DatadogLogPayload[]): Promise<void>;
22
+ submitEvent(event: DatadogEventPayload): Promise<void>;
23
+ isHealthy?(): Promise<boolean>;
24
+ }
25
+ export interface DatadogMetricPayload {
26
+ metric: string;
27
+ type: 'count' | 'gauge' | 'rate';
28
+ points: Array<[number, number]>;
29
+ tags?: string[];
30
+ }
31
+ export interface DatadogLogPayload {
32
+ ddsource?: string;
33
+ ddtags?: string;
34
+ service?: string;
35
+ message: string;
36
+ status: string;
37
+ [key: string]: unknown;
38
+ }
39
+ export interface DatadogEventPayload {
40
+ title: string;
41
+ text: string;
42
+ tags?: string[];
43
+ date_happened?: number;
44
+ priority?: 'normal' | 'low';
45
+ alert_type?: 'error' | 'warning' | 'info' | 'success';
46
+ }
47
+ /**
48
+ * Extended Datadog adapter configuration
49
+ */
50
+ export interface DatadogAdapterConfigExtended extends DatadogAdapterConfig {
51
+ /**
52
+ * Datadog API client instance (from @plyaz/api).
53
+ * Used as fallback when SDK packages are not available.
54
+ */
55
+ apiClient?: DatadogApiClient;
56
+ /**
57
+ * DogStatsD host for metrics (when using SDK)
58
+ * @default 'localhost'
59
+ */
60
+ statsdHost?: string;
61
+ /**
62
+ * DogStatsD port for metrics (when using SDK)
63
+ * @default 8125
64
+ */
65
+ statsdPort?: number;
66
+ }
67
+ /**
68
+ * Datadog adapter for metrics, tracing, and logging.
69
+ *
70
+ * Automatically detects available integrations:
71
+ * - Uses dd-trace/hot-shots SDK when installed
72
+ * - Falls back to API client when SDK not available
73
+ * - Uses logger for debugging when neither is available
74
+ *
75
+ * @example Basic usage
76
+ * ```typescript
77
+ * const datadog = new DatadogAdapter();
78
+ * await datadog.initialize({
79
+ * apiKey: process.env.DD_API_KEY,
80
+ * site: 'datadoghq.com',
81
+ * serviceName: 'my-service',
82
+ * environment: 'production',
83
+ * });
84
+ * ```
85
+ *
86
+ * @example With API client fallback
87
+ * ```typescript
88
+ * import { createDatadogClient } from '@plyaz/api/datadog';
89
+ *
90
+ * const datadog = new DatadogAdapter();
91
+ * await datadog.initialize({
92
+ * apiKey: process.env.DD_API_KEY,
93
+ * apiClient: createDatadogClient({ ... }),
94
+ * serviceName: 'my-service',
95
+ * });
96
+ * ```
97
+ */
98
+ export declare class DatadogAdapter extends BaseAdapter {
99
+ readonly provider: "datadog";
100
+ readonly name = "DatadogAdapter";
101
+ private datadogConfig;
102
+ private apiClient?;
103
+ private metricsClient;
104
+ private tracer;
105
+ protected doInitialize(config: ObservabilityAdapterConfig): Promise<void>;
106
+ private initializeSdk;
107
+ protected doShutdown(): Promise<void>;
108
+ protected doHealthCheck(): Promise<boolean>;
109
+ protected doRecordMetric(metric: Metric): Promise<void>;
110
+ protected doStartSpan(options: SpanOptions): Span;
111
+ private createStubSpan;
112
+ protected doGetActiveSpan(): Span | null;
113
+ protected doLog(entry: LogEntry): Promise<void>;
114
+ protected doSendEvent(event: ObservabilityEvent): Promise<void>;
115
+ protected doFlush(): Promise<void>;
116
+ }
117
+ //# sourceMappingURL=DatadogAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatadogAdapter.d.ts","sourceRoot":"","sources":["../../../src/base/observability/DatadogAdapter.ts"],"names":[],"mappings":"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"}