@plyaz/core 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/backend/featureFlags/config/feature-flag.config.d.ts +111 -0
  2. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
  3. package/dist/backend/featureFlags/config/validation.d.ts +181 -0
  4. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
  5. package/dist/backend/featureFlags/database/connection.d.ts +321 -0
  6. package/dist/backend/featureFlags/database/connection.d.ts.map +1 -0
  7. package/dist/backend/featureFlags/database/repository.d.ts +518 -0
  8. package/dist/backend/featureFlags/database/repository.d.ts.map +1 -0
  9. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
  10. package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
  11. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
  12. package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
  13. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
  14. package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
  15. package/dist/backend/featureFlags/feature-flag.controller.d.ts +1 -2
  16. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  17. package/dist/backend/featureFlags/feature-flag.module.d.ts +2 -3
  18. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  19. package/dist/backend/featureFlags/feature-flag.service.d.ts +149 -8
  20. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +1 -1
  21. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +19 -0
  22. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
  23. package/dist/backend/featureFlags/index.d.ts +10 -36
  24. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  25. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
  26. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
  27. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
  28. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
  29. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +167 -0
  30. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
  31. package/dist/base/cache/feature/caching.d.ts +16 -0
  32. package/dist/base/cache/feature/caching.d.ts.map +1 -0
  33. package/dist/base/cache/index.d.ts +1 -0
  34. package/dist/base/cache/index.d.ts.map +1 -1
  35. package/dist/domain/featureFlags/providers/database.d.ts +17 -12
  36. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  37. package/dist/frontend/index.d.ts +1 -0
  38. package/dist/frontend/index.d.ts.map +1 -1
  39. package/dist/frontend/providers/ApiProvider.d.ts +41 -0
  40. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
  41. package/dist/frontend/providers/index.d.ts +7 -0
  42. package/dist/frontend/providers/index.d.ts.map +1 -0
  43. package/dist/index.cjs +2325 -273
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.mjs +2315 -275
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/services/ApiClientService.d.ts +90 -0
  50. package/dist/services/ApiClientService.d.ts.map +1 -0
  51. package/dist/services/index.d.ts +8 -0
  52. package/dist/services/index.d.ts.map +1 -0
  53. package/dist/utils/common/index.d.ts +1 -1
  54. package/dist/utils/common/index.d.ts.map +1 -1
  55. package/dist/utils/common/validation.d.ts +20 -0
  56. package/dist/utils/common/validation.d.ts.map +1 -0
  57. package/dist/utils/db/databaseService.d.ts +6 -0
  58. package/dist/utils/db/databaseService.d.ts.map +1 -0
  59. package/dist/utils/db/index.d.ts +2 -0
  60. package/dist/utils/db/index.d.ts.map +1 -0
  61. package/dist/web_app/auth/add_user.d.ts +3 -0
  62. package/dist/web_app/auth/add_user.d.ts.map +1 -0
  63. package/dist/web_app/auth/update_user.d.ts +2 -0
  64. package/dist/web_app/auth/update_user.d.ts.map +1 -0
  65. package/package.json +20 -7
@@ -5,25 +5,93 @@
5
5
  * Orchestrates between providers, repositories, and external systems.
6
6
  *
7
7
  * @fileoverview NestJS service for feature flags
8
- * @version 1.0.0
9
8
  */
10
9
  import type { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
11
- import type { FeatureFlagValue, FeatureFlagContext, FeatureFlagEvaluation, FeatureFlag, FeatureFlagRule, CreateFlagRequest, ProviderHealthStatus } from '@plyaz/types';
10
+ import { type FeatureFlagValue, type FeatureFlagContext, type FeatureFlagEvaluation, type FeatureFlag, type FeatureFlagRule, type CreateFlagRequest, type ProviderHealthStatus } from '@plyaz/types';
12
11
  import type { FeatureFlagRepository } from './feature-flag.repository';
13
12
  import type { FeatureFlagKey } from '@domain/types';
14
13
  /**
15
14
  * Feature Flag Service
16
15
  *
16
+ * **MAIN ORCHESTRATOR** - This service coordinates the entire feature flag system.
17
+ *
18
+ * **EXECUTION FLOW:**
19
+ * 1. NestJS Module System → Instantiates this service
20
+ * 2. **onModuleInit()** ← ENTRY POINT - Called automatically by NestJS
21
+ * 3. initializeProvider() → Loads configuration and creates provider
22
+ * 4. Provider.initialize() → Establishes database connection
23
+ * 5. System ready to serve requests
24
+ *
25
+ * **RUNTIME FLOW:**
26
+ * Client Request → Controller → **This Service** → Provider → Database/Cache
27
+ *
28
+ * @example Basic Usage in Controller
29
+ * ```typescript
30
+ * @Controller('features')
31
+ * export class FeatureController {
32
+ * constructor(private readonly featureFlagService: FeatureFlagService) {}
33
+ *
34
+ * @Get(':key')
35
+ * async getFeature(@Param('key') key: string) {
36
+ * // This calls the service which orchestrates the entire evaluation
37
+ * return this.featureFlagService.evaluateFlag(key);
38
+ * }
39
+ * }
40
+ * ```
41
+ *
42
+ * @example Advanced Usage with Context
43
+ * ```typescript
44
+ * // Evaluate flag with user context for targeting rules
45
+ * const evaluation = await this.featureFlagService.evaluateFlag('PREMIUM_FEATURE', {
46
+ * userId: 'user123',
47
+ * userRole: 'premium',
48
+ * environment: 'production'
49
+ * });
50
+ *
51
+ * if (evaluation.isEnabled) {
52
+ * // Execute premium feature logic
53
+ * }
54
+ * ```
55
+ *
17
56
  * Provides business logic for feature flag operations.
18
57
  * Manages provider lifecycle, caching, and data persistence.
19
58
  */
20
59
  export declare class FeatureFlagService implements OnModuleInit, OnModuleDestroy {
21
60
  private readonly featureFlagRepository;
61
+ [x: string]: unknown;
22
62
  private readonly logger;
23
63
  private provider;
24
64
  constructor(featureFlagRepository: FeatureFlagRepository<FeatureFlagKey>);
25
65
  /**
26
- * Initializes the service on module startup.
66
+ * **FIRST METHOD CALLED** - NestJS lifecycle hook for module initialization
67
+ *
68
+ * **EXECUTION ORDER:**
69
+ * 1. NestJS creates FeatureFlagModule
70
+ * 2. NestJS instantiates FeatureFlagService
71
+ * 3. **THIS METHOD CALLED AUTOMATICALLY** ← YOU ARE HERE
72
+ * 4. → initializeProvider() called
73
+ * 5. → Configuration loaded from .env.local
74
+ * 6. → Database provider created and initialized
75
+ * 7. → Database connection established
76
+ * 8. → Initial data loaded from database
77
+ * 9. System ready to serve requests
78
+ *
79
+ * @throws {Error} If provider initialization fails
80
+ *
81
+ * @example What happens during initialization:
82
+ * ```typescript
83
+ * // 1. Load config from environment
84
+ * const config = FeatureFlagConfigFactory.fromEnvironment();
85
+ *
86
+ * // 2. Create database provider
87
+ * this.provider = FeatureFlagProviderFactory.create(config, FEATURES);
88
+ *
89
+ * // 3. Initialize database connection
90
+ * await this.provider.initialize();
91
+ *
92
+ * // 4. Load flags and rules from database
93
+ * const { flags, rules } = await this.provider.fetchData();
94
+ * ```
27
95
  */
28
96
  onModuleInit(): Promise<void>;
29
97
  /**
@@ -31,7 +99,34 @@ export declare class FeatureFlagService implements OnModuleInit, OnModuleDestroy
31
99
  */
32
100
  onModuleDestroy(): Promise<void>;
33
101
  /**
34
- * Initializes the feature flag provider.
102
+ * **SECOND METHOD CALLED** - Initializes the feature flag provider
103
+ *
104
+ * **EXECUTION FLOW:**
105
+ * 1. onModuleInit() called by NestJS
106
+ * 2. **THIS METHOD CALLED** ← YOU ARE HERE
107
+ * 3. → FeatureFlagConfigFactory.fromEnvironment() - Loads .env.local
108
+ * 4. → FeatureFlagProviderFactory.create() - Creates database provider
109
+ * 5. → provider.initialize() - Establishes database connection
110
+ *
111
+ * @private
112
+ * @throws {Error} If configuration is invalid or database connection fails
113
+ *
114
+ * @example Configuration Loading Process:
115
+ * ```typescript
116
+ * // Reads from .env.local:
117
+ * // SUPABASE_URL=https://your-project.supabase.co
118
+ * // FEATURE_FLAG_PROVIDER=database
119
+ * // FEATURE_FLAG_CACHE_ENABLED=true
120
+ *
121
+ * const config = {
122
+ * provider: 'database',
123
+ * isCacheEnabled: true,
124
+ * databaseConfig: {
125
+ * connectionString: 'https://your-project.supabase.co',
126
+ * tableName: 'feature_flags'
127
+ * }
128
+ * };
129
+ * ```
35
130
  */
36
131
  private initializeProvider;
37
132
  /**
@@ -39,11 +134,57 @@ export declare class FeatureFlagService implements OnModuleInit, OnModuleDestroy
39
134
  */
40
135
  private getProvider;
41
136
  /**
42
- * Evaluates a feature flag for the given context.
137
+ * **MAIN RUNTIME METHOD** - Evaluates a feature flag for the given context
43
138
  *
44
- * @param key - Feature flag key
45
- * @param context - Evaluation context
46
- * @returns Feature flag evaluation result
139
+ * **RUNTIME EXECUTION FLOW:**
140
+ * 1. Client makes HTTP request to controller
141
+ * 2. Controller calls **THIS METHOD** ← RUNTIME ENTRY POINT
142
+ * 3. → getProvider() - Gets initialized provider
143
+ * 4. → provider.getFlag() - Evaluates flag with context
144
+ * 5. → Provider checks cache, rules, overrides
145
+ * 6. → Database query if needed
146
+ * 7. ← Returns evaluation result
147
+ *
148
+ * @param key - Feature flag key (e.g., 'PREMIUM_FEATURE', 'NEW_UI')
149
+ * @param context - Evaluation context for targeting rules
150
+ * @returns Feature flag evaluation result with value, reason, and metadata
151
+ *
152
+ * @example Simple Usage:
153
+ * ```typescript
154
+ * const evaluation = await this.featureFlagService.evaluateFlag('NEW_CHECKOUT');
155
+ * console.log(evaluation.isEnabled); // true/false
156
+ * console.log(evaluation.reason); // 'default_value' | 'rule_match' | 'override'
157
+ * ```
158
+ *
159
+ * @example With User Context (for targeting rules):
160
+ * ```typescript
161
+ * const evaluation = await this.featureFlagService.evaluateFlag('BETA_FEATURE', {
162
+ * userId: 'user123',
163
+ * userRole: 'premium',
164
+ * environment: 'production',
165
+ * customAttributes: {
166
+ * subscriptionTier: 'pro',
167
+ * region: 'us-east'
168
+ * }
169
+ * });
170
+ *
171
+ * // Provider will:
172
+ * // 1. Check for user-specific overrides
173
+ * // 2. Evaluate targeting rules against context
174
+ * // 3. Return appropriate value with reason
175
+ * ```
176
+ *
177
+ * @example Evaluation Result:
178
+ * ```typescript
179
+ * {
180
+ * key: 'BETA_FEATURE',
181
+ * isEnabled: true,
182
+ * value: { enabled: true, variant: 'blue' },
183
+ * reason: 'rule_match',
184
+ * ruleId: 'premium-users-rule',
185
+ * evaluatedAt: '2024-01-15T10:30:00Z'
186
+ * }
187
+ * ```
47
188
  */
48
189
  evaluateFlag(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<FeatureFlagEvaluation<FeatureFlagKey>>;
49
190
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flag.service.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,eAAe,EAGf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;;;;GAKG;AACH,qBACa,kBAAmB,YAAW,YAAY,EAAE,eAAe;IAI1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAHlD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,qBAAqB,EAAE,qBAAqB,CAAC,cAAc,CAAC;IAEzF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;OAEG;YACW,kBAAkB;IAkBhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;IACG,YAAY,CAChB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAmBjD;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpF;;;;;OAKG;IACG,WAAW,CACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC;IAiBjE;;;;;OAKG;IACG,UAAU,CACd,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC5C,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;;;OAMG;IACG,UAAU,CACd,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,GACrD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;OAIG;IACG,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9E;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;OAKG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;IAStF;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IASnF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAOvD"}
1
+ {"version":3,"file":"feature-flag.service.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAI1B,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBACa,kBAAmB,YAAW,YAAY,EAAE,eAAe;IAK1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAJlD,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,qBAAqB,EAAE,qBAAqB,CAAC,cAAc,CAAC;IAEzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;YACW,kBAAkB;IAkBhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;IACG,YAAY,CAChB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAmBjD;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpF;;;;;OAKG;IACG,WAAW,CACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC;IAiBjE;;;;;OAKG;IACG,UAAU,CACd,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC5C,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;;;OAMG;IACG,UAAU,CACd,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,GACrD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAevC;;;;OAIG;IACG,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9E;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;;;;OAKG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;IAStF;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IASnF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAOvD"}
@@ -0,0 +1,19 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { FeatureFlagService } from '../feature-flag.service';
4
+ /**
5
+ * Guard that ensures a feature flag is in the expected state
6
+ * before allowing access to a route handler.
7
+ */
8
+ export declare class FeatureFlagGuard implements CanActivate {
9
+ private readonly reflector;
10
+ private readonly featureFlagService;
11
+ private readonly logger;
12
+ constructor(reflector: Reflector, featureFlagService: FeatureFlagService);
13
+ canActivate(context: ExecutionContext): Promise<boolean>;
14
+ /**
15
+ * Compare expected vs actual values.
16
+ */
17
+ private matches;
18
+ }
19
+ //# sourceMappingURL=feature-flag.guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flag.guard.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/guards/feature-flag.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,gBAAgB,EAAU,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D;;;GAGG;AACH,qBACa,gBAAiB,YAAW,WAAW;IAIhD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAJrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAGzC,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB;IAGnD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B9D;;OAEG;IACH,OAAO,CAAC,OAAO;CAUhB"}
@@ -5,45 +5,19 @@
5
5
  * Provides controllers, services, repositories, and module for easy integration.
6
6
  *
7
7
  * @fileoverview Backend feature flags exports
8
- * @version 1.0.0
9
8
  */
10
9
  export { FeatureFlagModule } from './feature-flag.module';
11
10
  export { FeatureFlagService } from './feature-flag.service';
12
11
  export { FeatureFlagRepository } from './feature-flag.repository';
13
12
  export { FeatureFlagController } from './feature-flag.controller';
14
- /**
15
- * NestJS Guard for feature flag protection.
16
- * Use this to protect routes based on feature flag status.
17
- *
18
- * @example
19
- * ```typescript
20
- * import { UseGuards } from '@nestjs/common';
21
- * import { FeatureFlagGuard } from '@plyaz/config/backend/featureFlags';
22
- *
23
- * @UseGuards(FeatureFlagGuard('BETA_API'))
24
- * @Get('beta-endpoint')
25
- * async betaEndpoint() {
26
- * // This endpoint is only accessible when BETA_API flag is enabled
27
- * }
28
- * ```
29
- */
30
- export declare function FeatureFlagGuard(): (_target: object, _propertyName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
31
- /**
32
- * NestJS Decorator for feature flag checking.
33
- * Use this to check feature flags within methods.
34
- *
35
- * @example
36
- * ```typescript
37
- * import { FeatureFlag } from '@plyaz/config/backend/featureFlags';
38
- *
39
- * @Injectable()
40
- * export class MyService {
41
- * @FeatureFlag('NEW_ALGORITHM')
42
- * async processData(data: any) {
43
- * // This method behavior can be controlled by the NEW_ALGORITHM flag
44
- * }
45
- * }
46
- * ```
47
- */
48
- export declare function FeatureFlag(): (_target: object, _propertyName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
13
+ export { FeatureDisabled } from './decorators/feature-disabled.decorator';
14
+ export { FeatureEnabled } from './decorators/feature-enabled.decorator';
15
+ export { FeatureFlagGuard } from './guards/feature-flag.guard';
16
+ export { FeatureFlagMiddleware } from './middleware/feature-flag-middleware';
17
+ export { FeatureFlagLoggingInterceptor } from './interceptors/feature-flag-logging-interceptor';
18
+ export { ErrorHandlingInterceptor } from './interceptors/error-handling-interceptor';
19
+ export { FeatureFlagConfigFactory } from './config/feature-flag.config';
20
+ export { FeatureFlagConfigValidator } from './config/validation';
21
+ export { DatabaseConnectionManager } from './database/connection';
22
+ export { FeatureFlagDatabaseRepository } from './database/repository';
49
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,KAI5B,SAAS,MAAM,EACf,eAAe,MAAM,EACrB,YAAY,kBAAkB,KAC7B,kBAAkB,CAKtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,KAIvB,SAAS,MAAM,EACf,eAAe,MAAM,EACrB,YAAY,kBAAkB,KAC7B,kBAAkB,CAKtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAG7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAGrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAIjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ /**
4
+ * Interceptor to enforce feature flag rules in real-time.
5
+ *
6
+ * FLOW:
7
+ * 1. Runs AFTER middleware has attached feature flags to the request.
8
+ * 2. Checks if the requested feature is enabled.
9
+ * 3. If disabled, blocks the request with an HTTP 403.
10
+ * 4. If enabled, passes the request to the controller/service.
11
+ */
12
+ export declare class ErrorHandlingInterceptor implements NestInterceptor {
13
+ private readonly logger;
14
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
15
+ }
16
+ //# sourceMappingURL=error-handling-interceptor.d.ts.map
@@ -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,EAAU,MAAM,gBAAgB,CAAC;AAIpG,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGlC;;;;;;;;GAQG;AACH,qBACa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IAEpE,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,EAAU,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AAEvC;;;;;;;;;GASG;AAEH,qBACa,6BAA8B,YAAW,eAAe;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IAEzE,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;IA0B5E,OAAO,CAAC,iBAAiB;CAI1B"}
@@ -0,0 +1,167 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { FeatureFlagService } from '../feature-flag.service';
3
+ type FeatureFlagRequest = {
4
+ featureFlags?: Record<string, boolean>;
5
+ query?: Record<string, unknown> | URLSearchParams;
6
+ headers?: Record<string, string | string[] | undefined>;
7
+ url?: string;
8
+ };
9
+ /**
10
+ * FeatureFlagMiddleware - Evaluates and attaches feature flags to every request
11
+ *
12
+ * @description This middleware runs early in the request lifecycle to evaluate feature flags
13
+ * and attach them to the request object. It allows controllers and services to access
14
+ * pre-evaluated flags without making additional service calls, improving performance.
15
+ *
16
+ * **Execution Flow:**
17
+ * 1. Middleware executes first for every incoming HTTP request
18
+ * 2. Extracts flag key from query params, headers, or uses default
19
+ * 3. Calls FeatureFlagService to evaluate the specified flag
20
+ * 4. Attaches evaluated flags to `req.featureFlags` object
21
+ * 5. Passes control to next middleware/interceptor/controller
22
+ *
23
+ * **Flag Key Priority:**
24
+ * 1. Query parameter: `?flag=FEATURE_NAME`
25
+ * 2. HTTP header: `X-Feature-Flag: FEATURE_NAME`
26
+ * 3. Default: `AUTH_GOOGLE`
27
+ *
28
+ * **Use Cases:**
29
+ * - Global feature flag evaluation for all requests
30
+ * - Performance optimization (evaluate once, use many times)
31
+ * - Request-scoped feature flag context
32
+ * - Dynamic flag selection via client parameters
33
+ *
34
+ * @example Setup - Register middleware globally
35
+ * ```typescript
36
+ * // app.module.ts
37
+ * import { MiddlewareConsumer, Module } from '@nestjs/common';
38
+ * import { FeatureFlagMiddleware } from './middleware/feature-flag-middleware';
39
+ *
40
+ * @Module({
41
+ * // ... other config
42
+ * })
43
+ * export class AppModule {
44
+ * configure(consumer: MiddlewareConsumer) {
45
+ * consumer
46
+ * .apply(FeatureFlagMiddleware)
47
+ * .forRoutes('*'); // Apply to all routes
48
+ * }
49
+ * }
50
+ * ```
51
+ *
52
+ * @example Client Usage - Query Parameter
53
+ * ```bash
54
+ * # Client specifies which flag to evaluate
55
+ * curl "https://api.example.com/users?flag=PREMIUM_FEATURES"
56
+ *
57
+ * # Middleware evaluates PREMIUM_FEATURES and attaches to request
58
+ * # req.featureFlags = { PREMIUM_FEATURES: true }
59
+ * ```
60
+ *
61
+ * @example Client Usage - HTTP Header
62
+ * ```bash
63
+ * # Alternative: Use HTTP header
64
+ * curl -H "X-Feature-Flag: NEW_DASHBOARD" "https://api.example.com/dashboard"
65
+ *
66
+ * # Middleware evaluates NEW_DASHBOARD
67
+ * # req.featureFlags = { NEW_DASHBOARD: false }
68
+ * ```
69
+ *
70
+ * @example Controller Access - Use pre-evaluated flags
71
+ * ```typescript
72
+ * @Controller('api')
73
+ * export class ApiController {
74
+ * @Get('dashboard')
75
+ * async getDashboard(@Req() req: Request) {
76
+ * // Access pre-evaluated flags (no service call needed)
77
+ * const flags = req.featureFlags;
78
+ *
79
+ * if (flags?.NEW_DASHBOARD) {
80
+ * return this.dashboardService.getNewDashboard();
81
+ * } else {
82
+ * return this.dashboardService.getLegacyDashboard();
83
+ * }
84
+ * }
85
+ * }
86
+ * ```
87
+ *
88
+ * @example Service Access - Inject flags into services
89
+ * ```typescript
90
+ * @Injectable()
91
+ * export class UserService {
92
+ * async getUsers(@Req() req: Request) {
93
+ * const flags = req.featureFlags;
94
+ *
95
+ * // Use flags to modify service behavior
96
+ * if (flags?.ENHANCED_USER_DATA) {
97
+ * return this.getUsersWithEnhancedData();
98
+ * }
99
+ *
100
+ * return this.getBasicUsers();
101
+ * }
102
+ * }
103
+ * ```
104
+ *
105
+ * @example Error Handling - Invalid flag keys
106
+ * ```typescript
107
+ * // Request with invalid flag:
108
+ * // GET /api/users?flag=INVALID_FLAG
109
+ * //
110
+ * // Response:
111
+ * // HTTP 404 Not Found
112
+ * // {
113
+ * // "error": "Invalid feature flag key: INVALID_FLAG",
114
+ * // "statusCode": 404
115
+ * // }
116
+ * ```
117
+ *
118
+ * @example Multiple Flags - Accumulate flags across requests
119
+ * ```typescript
120
+ * // First request adds AUTH_GOOGLE: true
121
+ * // Second request adds PREMIUM_FEATURES: false
122
+ * // req.featureFlags = {
123
+ * // AUTH_GOOGLE: true,
124
+ * // PREMIUM_FEATURES: false
125
+ * // }
126
+ * ```
127
+ */
128
+ export declare class FeatureFlagMiddleware implements NestMiddleware {
129
+ private readonly featureFlagService;
130
+ private readonly logger;
131
+ constructor(featureFlagService: FeatureFlagService);
132
+ /**
133
+ * Main middleware execution method
134
+ *
135
+ * @description Processes incoming requests to evaluate and attach feature flags.
136
+ * Handles flag key extraction from multiple sources and graceful error handling.
137
+ *
138
+ * @param {FeatureFlagRequest} req - Express request object with feature flag extensions
139
+ * @param {unknown} res - Express response object (not used in this middleware)
140
+ * @param {Function} next - Next middleware function in the chain
141
+ *
142
+ * @throws {BaseError} When flag key is invalid or evaluation fails
143
+ *
144
+ * @example Request Processing Flow
145
+ * ```typescript
146
+ * // 1. Extract flag key from request
147
+ * const flagKey = req.query.flag || req.headers['x-feature-flag'] || 'AUTH_GOOGLE';
148
+ *
149
+ * // 2. Validate flag key exists in system
150
+ * if (!isFeatureFlagKey(flagKey)) {
151
+ * throw new Error('Invalid flag key');
152
+ * }
153
+ *
154
+ * // 3. Evaluate flag using service
155
+ * const evaluation = await this.featureFlagService.evaluateFlag(flagKey);
156
+ *
157
+ * // 4. Attach to request object
158
+ * req.featureFlags = { [flagKey]: evaluation.isEnabled };
159
+ *
160
+ * // 5. Continue to next middleware
161
+ * next();
162
+ * ```
163
+ */
164
+ use(req: FeatureFlagRequest, res: unknown, next: (...args: unknown[]) => void): Promise<void>;
165
+ }
166
+ export {};
167
+ //# 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;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,KAAK,kBAAkB,GAAG;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAOF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsHG;AACH,qBACa,qBAAsB,YAAW,cAAc;IAG9C,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAF/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAEpC,kBAAkB,EAAE,kBAAkB;IAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IAEG,GAAG,CACP,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC;CAoCjB"}
@@ -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,5 @@ export declare class CacheManager {
95
95
  */
96
96
  dispose(): Promise<void>;
97
97
  }
98
+ export * from './feature/caching';
98
99
  //# 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;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;AAED,cAAc,mBAAmB,CAAC"}
@@ -1,27 +1,25 @@
1
1
  /**
2
- * Database Feature Flag Provider (Stub)
2
+ * Database Feature Flag Provider
3
3
  *
4
- * Database-based provider stub that requires @plyaz/db package implementation.
5
- * This will be moved to @plyaz/core when the package structure is finalized.
4
+ * Database-based provider with Drizzle ORM and Supabase integration.
5
+ * Provides persistent storage with caching and transaction support.
6
6
  *
7
- * @fileoverview Database provider stub for feature flags
8
- * @version 1.0.0
7
+ * @fileoverview Database provider for feature flags
9
8
  */
10
9
  import type { FeatureFlag, FeatureFlagRule, FeatureFlagConfig, FeatureFlagValue } from '@plyaz/types';
11
10
  import { FeatureFlagProvider } from '../provider';
12
11
  /**
13
- * Database-based feature flag provider requiring @plyaz/db implementation.
12
+ * Database-based feature flag provider with Drizzle ORM integration.
14
13
  *
15
14
  * @class DatabaseFeatureFlagProvider
16
15
  * @extends {FeatureFlagProvider}
17
16
  *
18
17
  * @example
19
18
  * ```typescript
20
- * // This will throw an error until @plyaz/db is implemented
21
19
  * const provider = new DatabaseFeatureFlagProvider({
22
20
  * provider: 'database',
23
21
  * databaseConfig: {
24
- * connectionString: process.env.DATABASE_URL,
22
+ * connectionString: process.env.SUPABASE_URL,
25
23
  * tableName: 'feature_flags',
26
24
  * },
27
25
  * isCacheEnabled: true,
@@ -30,25 +28,32 @@ import { FeatureFlagProvider } from '../provider';
30
28
  * ```
31
29
  */
32
30
  export declare class DatabaseFeatureFlagProvider<FeatureFlagKey extends string> extends FeatureFlagProvider<FeatureFlagKey> {
31
+ private connectionManager;
32
+ private repository;
33
33
  /**
34
34
  * Creates a new database feature flag provider.
35
35
  *
36
36
  * @param config - Provider configuration with database settings
37
- * @throws Error indicating that @plyaz/db implementation is required
38
37
  */
39
38
  constructor(config: FeatureFlagConfig<FeatureFlagKey>, features: Record<FeatureFlagKey, FeatureFlagValue>);
39
+ /**
40
+ * Initialize database connection
41
+ */
42
+ initialize(): Promise<void>;
40
43
  /**
41
44
  * Fetches flags and rules from the database.
42
- * Currently throws an error as the database implementation is not ready.
43
45
  *
44
46
  * @protected
45
- * @returns Promise that rejects with implementation error
46
- * @throws Error indicating missing database implementation
47
+ * @returns Promise with flags and rules from database
47
48
  */
48
49
  protected fetchData(): Promise<{
49
50
  flags: FeatureFlag<FeatureFlagKey>[];
50
51
  rules: FeatureFlagRule<FeatureFlagKey>[];
51
52
  }>;
53
+ /**
54
+ * Dispose resources
55
+ */
56
+ dispose(): void;
52
57
  /**
53
58
  * Validates the database provider configuration.
54
59
  *
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/domain/featureFlags/providers/database.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,2BAA2B,CACtC,cAAc,SAAS,MAAM,CAC7B,SAAQ,mBAAmB,CAAC,cAAc,CAAC;IAC3C;;;;;OAKG;gBAED,MAAM,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACzC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAOpD;;;;;;;OAOG;cACa,SAAS,IAAI,OAAO,CAAC;QACnC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;KAC1C,CAAC;IAyCF;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,sBAAsB;IAQ9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,eAAe,IAAI;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB;CAaF"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/domain/featureFlags/providers/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMlD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,2BAA2B,CACtC,cAAc,SAAS,MAAM,CAC7B,SAAQ,mBAAmB,CAAC,cAAc,CAAC;IAC3C,OAAO,CAAC,iBAAiB,CAA2C;IACpE,OAAO,CAAC,UAAU,CAAuD;IAEzE;;;;OAIG;gBAED,MAAM,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACzC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAQpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;;;OAKG;cACa,SAAS,IAAI,OAAO,CAAC;QACnC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;KAC1C,CAAC;IAeF;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,sBAAsB;IAQ9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,eAAe,IAAI;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB;CAaF"}
@@ -1,2 +1,3 @@
1
1
  export * from './featureFlags';
2
+ export * from './providers';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frontend/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frontend/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}