@plyaz/core 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts +111 -0
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -0
- package/dist/backend/featureFlags/config/validation.d.ts +181 -0
- package/dist/backend/featureFlags/config/validation.d.ts.map +1 -0
- package/dist/backend/featureFlags/database/connection.d.ts +321 -0
- package/dist/backend/featureFlags/database/connection.d.ts.map +1 -0
- package/dist/backend/featureFlags/database/repository.d.ts +518 -0
- package/dist/backend/featureFlags/database/repository.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts +6 -0
- package/dist/backend/featureFlags/decorators/feature-disabled.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts +8 -0
- package/dist/backend/featureFlags/decorators/feature-enabled.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts +11 -0
- package/dist/backend/featureFlags/decorators/feature-flag.decorator.d.ts.map +1 -0
- package/dist/backend/featureFlags/feature-flag.controller.d.ts +1 -2
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +2 -3
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.service.d.ts +149 -8
- package/dist/backend/featureFlags/feature-flag.service.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +19 -0
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
- package/dist/backend/featureFlags/index.d.ts +10 -36
- package/dist/backend/featureFlags/index.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts +16 -0
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -0
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts +18 -0
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -0
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +167 -0
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
- package/dist/base/cache/feature/caching.d.ts +16 -0
- package/dist/base/cache/feature/caching.d.ts.map +1 -0
- package/dist/base/cache/index.d.ts +1 -0
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/database.d.ts +17 -12
- package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
- package/dist/frontend/index.d.ts +1 -0
- package/dist/frontend/index.d.ts.map +1 -1
- package/dist/frontend/providers/ApiProvider.d.ts +41 -0
- package/dist/frontend/providers/ApiProvider.d.ts.map +1 -0
- package/dist/frontend/providers/index.d.ts +7 -0
- package/dist/frontend/providers/index.d.ts.map +1 -0
- package/dist/index.cjs +2325 -273
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +2315 -275
- package/dist/index.mjs.map +1 -1
- package/dist/services/ApiClientService.d.ts +90 -0
- package/dist/services/ApiClientService.d.ts.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/utils/common/index.d.ts +1 -1
- package/dist/utils/common/index.d.ts.map +1 -1
- package/dist/utils/common/validation.d.ts +20 -0
- package/dist/utils/common/validation.d.ts.map +1 -0
- package/dist/utils/db/databaseService.d.ts +6 -0
- package/dist/utils/db/databaseService.d.ts.map +1 -0
- package/dist/utils/db/index.d.ts +2 -0
- package/dist/utils/db/index.d.ts.map +1 -0
- package/dist/web_app/auth/add_user.d.ts +3 -0
- package/dist/web_app/auth/add_user.d.ts.map +1 -0
- package/dist/web_app/auth/update_user.d.ts +2 -0
- package/dist/web_app/auth/update_user.d.ts.map +1 -0
- package/package.json +20 -7
|
@@ -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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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"}
|
|
@@ -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
|
|
2
|
+
* Database Feature Flag Provider
|
|
3
3
|
*
|
|
4
|
-
* Database-based provider
|
|
5
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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"}
|
package/dist/frontend/index.d.ts
CHANGED
|
@@ -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"}
|