@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.
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/nestjs.d.ts +79 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.d.ts +28 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/backend/example/example.controller.d.ts +121 -0
- package/dist/backend/example/example.controller.d.ts.map +1 -0
- package/dist/backend/example/example.module.d.ts +29 -0
- package/dist/backend/example/example.module.d.ts.map +1 -0
- package/dist/backend/example/index.d.ts +8 -0
- package/dist/backend/example/index.d.ts.map +1 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
- package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts +89 -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/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 +14 -56
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -44
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +33 -0
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -0
- package/dist/backend/featureFlags/index.d.ts +14 -41
- 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 +162 -0
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -0
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -1
- package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
- package/dist/base/cache/CacheKeyBuilder.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 +2 -0
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/base/cache/strategies/redis.d.ts.map +1 -1
- package/dist/base/observability/BaseAdapter.d.ts +79 -0
- package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
- package/dist/base/observability/CompositeAdapter.d.ts +72 -0
- package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
- package/dist/base/observability/DatadogAdapter.d.ts +117 -0
- package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
- package/dist/base/observability/LoggerAdapter.d.ts +54 -0
- package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
- package/dist/base/observability/ObservabilityService.d.ts +160 -0
- package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
- package/dist/base/observability/index.d.ts +17 -0
- package/dist/base/observability/index.d.ts.map +1 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
- package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseDomainService.d.ts +284 -0
- package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
- package/dist/domain/base/BaseMapper.d.ts +100 -0
- package/dist/domain/base/BaseMapper.d.ts.map +1 -0
- package/dist/domain/base/BaseValidator.d.ts +105 -0
- package/dist/domain/base/BaseValidator.d.ts.map +1 -0
- package/dist/domain/base/index.d.ts +10 -0
- package/dist/domain/base/index.d.ts.map +1 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
- package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
- package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
- package/dist/domain/example/index.d.ts +10 -0
- package/dist/domain/example/index.d.ts.map +1 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
- package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
- package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
- package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
- package/dist/domain/featureFlags/index.d.ts +10 -5
- package/dist/domain/featureFlags/index.d.ts.map +1 -1
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
- package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
- package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
- package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
- package/dist/domain/featureFlags/module.d.ts +20 -0
- package/dist/domain/featureFlags/module.d.ts.map +1 -0
- package/dist/domain/featureFlags/provider.d.ts +40 -1
- package/dist/domain/featureFlags/provider.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/api.d.ts +59 -34
- package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/database.d.ts +59 -52
- package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
- package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/file.d.ts +48 -1
- package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
- package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
- package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
- package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
- package/dist/domain/featureFlags/service.d.ts +112 -0
- package/dist/domain/featureFlags/service.d.ts.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/engine/featureFlags/engine.d.ts +8 -0
- package/dist/engine/featureFlags/engine.d.ts.map +1 -1
- package/dist/entry-backend.d.ts +24 -0
- package/dist/entry-backend.d.ts.map +1 -0
- package/dist/entry-backend.js +15635 -0
- package/dist/entry-backend.js.map +1 -0
- package/dist/entry-backend.mjs +15506 -0
- package/dist/entry-backend.mjs.map +1 -0
- package/dist/entry-frontend.d.ts +23 -0
- package/dist/entry-frontend.d.ts.map +1 -0
- package/dist/entry-frontend.js +11152 -0
- package/dist/entry-frontend.js.map +1 -0
- package/dist/entry-frontend.mjs +11089 -0
- package/dist/entry-frontend.mjs.map +1 -0
- package/dist/events/CoreEventManager.d.ts +116 -0
- package/dist/events/CoreEventManager.d.ts.map +1 -0
- package/dist/events/index.d.ts +27 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/frontend/base/index.d.ts +8 -0
- package/dist/frontend/base/index.d.ts.map +1 -0
- package/dist/frontend/components/InitializationError.d.ts +25 -0
- package/dist/frontend/components/InitializationError.d.ts.map +1 -0
- package/dist/frontend/components/InitializationLoading.d.ts +22 -0
- package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
- package/dist/frontend/components/index.d.ts +9 -0
- package/dist/frontend/components/index.d.ts.map +1 -0
- package/dist/frontend/example/index.d.ts +9 -0
- package/dist/frontend/example/index.d.ts.map +1 -0
- package/dist/frontend/featureFlags/index.d.ts +28 -7
- package/dist/frontend/featureFlags/index.d.ts.map +1 -1
- package/dist/frontend/index.d.ts +5 -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/PlyazProvider.d.ts +305 -0
- package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
- package/dist/frontend/providers/index.d.ts +8 -0
- package/dist/frontend/providers/index.d.ts.map +1 -0
- package/dist/frontend/store/feature-flags.d.ts +63 -0
- package/dist/frontend/store/feature-flags.d.ts.map +1 -0
- package/dist/frontend/store/index.d.ts +14 -0
- package/dist/frontend/store/index.d.ts.map +1 -0
- package/dist/frontend/store/integrations.d.ts +36 -0
- package/dist/frontend/store/integrations.d.ts.map +1 -0
- package/dist/frontend/store/service-accessors.d.ts +78 -0
- package/dist/frontend/store/service-accessors.d.ts.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15450 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13461 -2440
- package/dist/index.mjs.map +1 -1
- package/dist/init/CoreInitializer.d.ts +582 -0
- package/dist/init/CoreInitializer.d.ts.map +1 -0
- package/dist/init/ServiceRegistry.d.ts +256 -0
- package/dist/init/ServiceRegistry.d.ts.map +1 -0
- package/dist/init/index.d.ts +14 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/nestjs/CoreModule.d.ts +63 -0
- package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
- package/dist/init/nestjs/index.d.ts +5 -0
- package/dist/init/nestjs/index.d.ts.map +1 -0
- package/dist/init/nestjs/index.js +9059 -0
- package/dist/init/nestjs/index.js.map +1 -0
- package/dist/init/nestjs/index.mjs +9055 -0
- package/dist/init/nestjs/index.mjs.map +1 -0
- package/dist/init/react.d.ts +33 -0
- package/dist/init/react.d.ts.map +1 -0
- package/dist/models/example/ExampleRepository.d.ts +124 -0
- package/dist/models/example/ExampleRepository.d.ts.map +1 -0
- package/dist/models/example/index.d.ts +7 -0
- package/dist/models/example/index.d.ts.map +1 -0
- package/dist/models/featureFlags/FeatureFlagRepository.d.ts +560 -0
- package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
- package/dist/models/featureFlags/index.d.ts +7 -0
- package/dist/models/featureFlags/index.d.ts.map +1 -0
- package/dist/models/index.d.ts +9 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/services/ApiClientService.d.ts +178 -0
- package/dist/services/ApiClientService.d.ts.map +1 -0
- package/dist/services/CacheService.d.ts +176 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/DbService.d.ts +391 -0
- package/dist/services/DbService.d.ts.map +1 -0
- package/dist/services/NotificationService.d.ts +151 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/StorageService.d.ts +144 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/utils/common/id.d.ts +83 -0
- package/dist/utils/common/id.d.ts.map +1 -0
- package/dist/utils/common/index.d.ts +3 -1
- package/dist/utils/common/index.d.ts.map +1 -1
- package/dist/utils/common/object.d.ts +70 -0
- package/dist/utils/common/object.d.ts.map +1 -0
- package/dist/utils/common/validation.d.ts +20 -0
- package/dist/utils/common/validation.d.ts.map +1 -0
- package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
- package/dist/utils/featureFlags/context.d.ts +0 -1
- package/dist/utils/featureFlags/context.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/mapperUtils.d.ts +38 -0
- package/dist/utils/mapperUtils.d.ts.map +1 -0
- package/dist/utils/runtime.d.ts +15 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/version.d.ts +24 -0
- package/dist/version.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 +102 -15
- package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
- package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
- package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -123
- package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
- package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
- package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
- package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
- package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
- package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
- package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
- package/dist/index.cjs +0 -4383
- package/dist/index.cjs.map +0 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Validation utilities for feature flag configuration in NestJS applications.
|
|
5
|
+
* Provides error reporting and environment-specific validation.
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
import { type CoreFeatureFlagEnvironmentConfig, type CoreFeatureFlagValidationResult } from '@plyaz/types/core';
|
|
9
|
+
/**
|
|
10
|
+
* FeatureFlagConfigValidator - Comprehensive configuration validation for feature flags
|
|
11
|
+
*
|
|
12
|
+
* @description Validates feature flag configuration objects to ensure they meet system requirements
|
|
13
|
+
* and best practices. Provides detailed error reporting and warnings for potential issues.
|
|
14
|
+
*
|
|
15
|
+
* **Validation Categories:**
|
|
16
|
+
* - Provider validation (memory, file, redis, api, database)
|
|
17
|
+
* - Cache configuration validation
|
|
18
|
+
* - Database connection validation
|
|
19
|
+
* - Environment-specific settings validation
|
|
20
|
+
*
|
|
21
|
+
* **Usage Flow:**
|
|
22
|
+
* 1. Configuration is loaded from environment variables
|
|
23
|
+
* 2. Validator checks all settings for correctness
|
|
24
|
+
* 3. Errors prevent system startup
|
|
25
|
+
* 4. Warnings are logged but don't block startup
|
|
26
|
+
*
|
|
27
|
+
* @example Basic Validation
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const config = {
|
|
30
|
+
* provider: 'database',
|
|
31
|
+
* isCacheEnabled: true,
|
|
32
|
+
* cacheTtl: 300,
|
|
33
|
+
* databaseConfig: {
|
|
34
|
+
* connectionString: 'https://project.supabase.co',
|
|
35
|
+
* tableName: 'feature_flags'
|
|
36
|
+
* }
|
|
37
|
+
* };
|
|
38
|
+
*
|
|
39
|
+
* const result = FeatureFlagConfigValidator.validate(config);
|
|
40
|
+
*
|
|
41
|
+
* if (result.isValid) {
|
|
42
|
+
* console.log('Configuration is valid!');
|
|
43
|
+
* } else {
|
|
44
|
+
* console.error('Configuration errors:', result.errors);
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example Error Handling
|
|
49
|
+
* ```typescript
|
|
50
|
+
* try {
|
|
51
|
+
* FeatureFlagConfigValidator.validateOrThrow(config);
|
|
52
|
+
* // Configuration is valid, proceed with initialization
|
|
53
|
+
* } catch (error) {
|
|
54
|
+
* console.error('Invalid configuration:', error.message);
|
|
55
|
+
* process.exit(1);
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare class FeatureFlagConfigValidator {
|
|
60
|
+
/**
|
|
61
|
+
* Validates feature flag configuration and returns detailed results
|
|
62
|
+
*
|
|
63
|
+
* @description Performs comprehensive validation of feature flag configuration,
|
|
64
|
+
* checking all aspects including provider settings, cache configuration,
|
|
65
|
+
* database connections, and environment-specific settings.
|
|
66
|
+
*
|
|
67
|
+
* @param {FeatureFlagEnvironmentConfig} config - Configuration object to validate
|
|
68
|
+
* @returns {ValidationResult} Validation result with errors and warnings
|
|
69
|
+
*
|
|
70
|
+
* @example Successful Validation
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const validConfig = {
|
|
73
|
+
* provider: 'memory',
|
|
74
|
+
* isCacheEnabled: true,
|
|
75
|
+
* cacheTtl: 300,
|
|
76
|
+
* refreshInterval: 60
|
|
77
|
+
* };
|
|
78
|
+
*
|
|
79
|
+
* const result = FeatureFlagConfigValidator.validate(validConfig);
|
|
80
|
+
* // result.isValid = true
|
|
81
|
+
* // result.errors = []
|
|
82
|
+
* // result.warnings = []
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @example Validation with Errors
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const invalidConfig = {
|
|
88
|
+
* provider: 'invalid_provider', // Error: invalid provider
|
|
89
|
+
* cacheTtl: -100, // Error: negative TTL
|
|
90
|
+
* databaseConfig: { // Error: missing connection string
|
|
91
|
+
* tableName: 'flags'
|
|
92
|
+
* }
|
|
93
|
+
* };
|
|
94
|
+
*
|
|
95
|
+
* const result = FeatureFlagConfigValidator.validate(invalidConfig);
|
|
96
|
+
* // result.isValid = false
|
|
97
|
+
* // result.errors = [
|
|
98
|
+
* // { field: 'provider', message: 'Invalid provider...', code: 'INVALID_PROVIDER' },
|
|
99
|
+
* // { field: 'cacheTtl', message: 'Cache TTL must be non-negative', code: 'INVALID_CACHE_TTL' }
|
|
100
|
+
* // ]
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @example Validation with Warnings
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const configWithWarnings = {
|
|
106
|
+
* provider: 'database',
|
|
107
|
+
* cacheTtl: 7200, // Warning: very high TTL
|
|
108
|
+
* isLoggingEnabled: true, // Warning: logging in production
|
|
109
|
+
* databaseConfig: {
|
|
110
|
+
* connectionString: 'https://project.supabase.co',
|
|
111
|
+
* tableName: 'feature_flags'
|
|
112
|
+
* }
|
|
113
|
+
* };
|
|
114
|
+
*
|
|
115
|
+
* process.env.NODE_ENV = 'production';
|
|
116
|
+
* const result = FeatureFlagConfigValidator.validate(configWithWarnings);
|
|
117
|
+
* // result.isValid = true (warnings don't fail validation)
|
|
118
|
+
* // result.warnings = [
|
|
119
|
+
* // { field: 'cacheTtl', message: 'Cache TTL is very high...', code: 'HIGH_CACHE_TTL' },
|
|
120
|
+
* // { field: 'isLoggingEnabled', message: 'Logging is enabled in production...', code: 'PRODUCTION_LOGGING_ENABLED' }
|
|
121
|
+
* // ]
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
static validate(config: CoreFeatureFlagEnvironmentConfig): CoreFeatureFlagValidationResult;
|
|
125
|
+
private static validateProvider;
|
|
126
|
+
private static validateCacheSettings;
|
|
127
|
+
private static validateDatabaseConfig;
|
|
128
|
+
private static validateConnectionString;
|
|
129
|
+
private static validateTableName;
|
|
130
|
+
private static validatePoolSize;
|
|
131
|
+
private static validateTimeout;
|
|
132
|
+
private static getWarnings;
|
|
133
|
+
/**
|
|
134
|
+
* Validates configuration and throws error if validation fails
|
|
135
|
+
*
|
|
136
|
+
* @description Convenience method that validates configuration and throws a detailed
|
|
137
|
+
* error if validation fails. This is typically used during application startup
|
|
138
|
+
* to ensure the system doesn't start with invalid configuration.
|
|
139
|
+
*
|
|
140
|
+
* @param {FeatureFlagEnvironmentConfig} config - Configuration to validate
|
|
141
|
+
* @throws {DatabasePackageError} When validation fails with detailed error messages
|
|
142
|
+
*
|
|
143
|
+
* @example Startup Validation
|
|
144
|
+
* ```typescript
|
|
145
|
+
* // In FeatureFlagService.onModuleInit()
|
|
146
|
+
* try {
|
|
147
|
+
* const config = FeatureFlagConfigFactory.fromOptions();
|
|
148
|
+
* FeatureFlagConfigValidator.validateOrThrow(config);
|
|
149
|
+
*
|
|
150
|
+
* // Configuration is valid, proceed with initialization
|
|
151
|
+
* this.provider = FeatureFlagProviderFactory.create(config, FEATURES);
|
|
152
|
+
* await this.provider.initialize();
|
|
153
|
+
* } catch (error) {
|
|
154
|
+
* this.logger.error('Configuration validation failed:', error.message);
|
|
155
|
+
* throw error; // Prevent service from starting
|
|
156
|
+
* }
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* @example Error Output
|
|
160
|
+
* ```typescript
|
|
161
|
+
* // When validation fails, throws DatabasePackageError with message:
|
|
162
|
+
* // "Configuration validation failed:
|
|
163
|
+
* // provider: Invalid provider: invalid_type. Must be one of: memory, file, redis, api, database
|
|
164
|
+
* // cacheTtl: Cache TTL must be non-negative
|
|
165
|
+
* // databaseConfig.connectionString: Database connection string is required"
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @example Environment Variable Validation
|
|
169
|
+
* ```bash
|
|
170
|
+
* # Missing required environment variables:
|
|
171
|
+
* # SUPABASE_URL= # Empty/missing
|
|
172
|
+
* # FEATURE_FLAG_PROVIDER=database
|
|
173
|
+
*
|
|
174
|
+
* # Results in error:
|
|
175
|
+
* # "Configuration validation failed:
|
|
176
|
+
* # databaseConfig.connectionString: Database connection string is required"
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
static validateOrThrow(config: CoreFeatureFlagEnvironmentConfig): void;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/config/validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACrC,MAAM,mBAAmB,CAAC;AAY3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,qBAAa,0BAA0B;IACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+DG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,GAAG,+BAA+B;IAiC1F,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAkBpC,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiBrC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoBvC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAa/B,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B,OAAO,CAAC,MAAM,CAAC,WAAW;IAqC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,gCAAgC,GAAG,IAAI;CAYvE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
2
|
+
/**
|
|
3
|
+
* Shortcut decorator to require a feature flag to be disabled (false).
|
|
4
|
+
*/
|
|
5
|
+
export declare function FeatureDisabled(key: FeatureFlagKey): MethodDecorator;
|
|
6
|
+
//# sourceMappingURL=feature-disabled.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-disabled.decorator.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/decorators/feature-disabled.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,CAEpE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
2
|
+
/**
|
|
3
|
+
* FeatureEnabled decorator
|
|
4
|
+
* Shorthand for enabling a feature flag with `true`
|
|
5
|
+
*/
|
|
6
|
+
export declare function FeatureEnabled(key: FeatureFlagKey): MethodDecorator;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=feature-enabled.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-enabled.decorator.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/decorators/feature-enabled.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,CAEnE;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FeatureFlagValue } from '@plyaz/types';
|
|
2
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
3
|
+
/**
|
|
4
|
+
* Decorator to require a feature flag to be in a specific state
|
|
5
|
+
* before allowing access to the route handler.
|
|
6
|
+
*
|
|
7
|
+
* @param key - The feature flag key
|
|
8
|
+
* @param expected - Expected flag value (default: true)
|
|
9
|
+
*/
|
|
10
|
+
export declare function FeatureFlag(key: FeatureFlagKey, expected?: FeatureFlagValue): MethodDecorator;
|
|
11
|
+
//# sourceMappingURL=feature-flag.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flag.decorator.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/decorators/feature-flag.decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,QAAQ,GAAE,gBAAuB,GAChC,eAAe,CAEjB"}
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* Feature Flag Controller
|
|
3
3
|
*
|
|
4
4
|
* NestJS controller for feature flag management.
|
|
5
|
-
*
|
|
5
|
+
* Uses the domain FeatureFlagService directly.
|
|
6
6
|
*
|
|
7
7
|
* @fileoverview NestJS controller for feature flags
|
|
8
|
-
* @version 1.0.0
|
|
9
8
|
*/
|
|
10
|
-
import type { FeatureFlagValue, FeatureFlagContext, FeatureFlagEvaluation, FeatureFlag, FeatureFlagRule } from '@plyaz/types';
|
|
11
|
-
import
|
|
9
|
+
import type { FeatureFlagValue, FeatureFlagContext, FeatureFlagEvaluation, FeatureFlag, FeatureFlagRule, CreateFlagRequest } from '@plyaz/types';
|
|
10
|
+
import { FeatureFlagService } from '@domain/featureFlags';
|
|
12
11
|
import type { FeatureFlagKey } from '@domain/types';
|
|
13
12
|
/**
|
|
14
13
|
* Request DTO for flag evaluation.
|
|
@@ -16,21 +15,11 @@ import type { FeatureFlagKey } from '@domain/types';
|
|
|
16
15
|
interface EvaluateFlagRequest {
|
|
17
16
|
context?: FeatureFlagContext;
|
|
18
17
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Request DTO for creating/updating flags.
|
|
21
|
-
*/
|
|
22
|
-
interface CreateFlagRequest {
|
|
23
|
-
name: string;
|
|
24
|
-
description?: string;
|
|
25
|
-
value: FeatureFlagValue;
|
|
26
|
-
isEnabled?: boolean;
|
|
27
|
-
environment?: 'all' | 'development' | 'staging' | 'production';
|
|
28
|
-
rolloutPercentage?: number;
|
|
29
|
-
}
|
|
30
18
|
/**
|
|
31
19
|
* Feature Flag Controller
|
|
32
20
|
*
|
|
33
21
|
* Provides REST endpoints for feature flag management and evaluation.
|
|
22
|
+
* Uses the domain FeatureFlagService directly.
|
|
34
23
|
*
|
|
35
24
|
* @example
|
|
36
25
|
* ```typescript
|
|
@@ -41,87 +30,49 @@ interface CreateFlagRequest {
|
|
|
41
30
|
*/
|
|
42
31
|
export declare class FeatureFlagController {
|
|
43
32
|
private readonly featureFlagService;
|
|
44
|
-
constructor(featureFlagService: FeatureFlagService);
|
|
33
|
+
constructor(featureFlagService: FeatureFlagService<FeatureFlagKey>);
|
|
45
34
|
/**
|
|
46
35
|
* Evaluates a feature flag for the given context.
|
|
47
|
-
*
|
|
48
|
-
* @param key - Feature flag key
|
|
49
|
-
* @param body - Evaluation context
|
|
50
|
-
* @returns Feature flag evaluation result
|
|
51
36
|
*/
|
|
52
37
|
evaluateFlag(key: FeatureFlagKey, body?: EvaluateFlagRequest): Promise<FeatureFlagEvaluation<FeatureFlagKey>>;
|
|
53
38
|
/**
|
|
54
39
|
* Checks if a feature flag is enabled.
|
|
55
|
-
*
|
|
56
|
-
* @param key - Feature flag key
|
|
57
|
-
* @param body - Evaluation context
|
|
58
|
-
* @returns Boolean indicating if flag is enabled
|
|
59
40
|
*/
|
|
60
41
|
isEnabled(key: FeatureFlagKey, body?: EvaluateFlagRequest): Promise<{
|
|
61
42
|
isEnabled: boolean;
|
|
62
43
|
}>;
|
|
63
44
|
/**
|
|
64
45
|
* Gets all feature flags with their evaluations.
|
|
65
|
-
*
|
|
66
|
-
* @param body - Evaluation context
|
|
67
|
-
* @returns All feature flag evaluations
|
|
68
46
|
*/
|
|
69
47
|
evaluateAllFlags(body?: EvaluateFlagRequest): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>>;
|
|
70
48
|
/**
|
|
71
49
|
* Creates a new feature flag.
|
|
72
|
-
*
|
|
73
|
-
* @param key - Feature flag key
|
|
74
|
-
* @param createData - Flag creation data
|
|
75
|
-
* @returns Created feature flag
|
|
76
50
|
*/
|
|
77
|
-
createFlag(createData: CreateFlagRequest
|
|
78
|
-
key: FeatureFlagKey;
|
|
79
|
-
}): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
51
|
+
createFlag(createData: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
80
52
|
/**
|
|
81
53
|
* Updates an existing feature flag.
|
|
82
|
-
*
|
|
83
|
-
* @param key - Feature flag key
|
|
84
|
-
* @param updateData - Flag update data
|
|
85
|
-
* @returns Updated feature flag
|
|
86
54
|
*/
|
|
87
|
-
updateFlag(key: FeatureFlagKey, updateData: Partial<CreateFlagRequest
|
|
55
|
+
updateFlag(key: FeatureFlagKey, updateData: Partial<CreateFlagRequest<FeatureFlagKey>>): Promise<FeatureFlag<FeatureFlagKey>>;
|
|
88
56
|
/**
|
|
89
57
|
* Deletes a feature flag.
|
|
90
|
-
*
|
|
91
|
-
* @param key - Feature flag key
|
|
92
58
|
*/
|
|
93
59
|
deleteFlag(key: FeatureFlagKey): Promise<{
|
|
94
60
|
isSuccessful: boolean;
|
|
95
61
|
}>;
|
|
96
62
|
/**
|
|
97
63
|
* Sets a manual override for a flag.
|
|
98
|
-
*
|
|
99
|
-
* @param key - Feature flag key
|
|
100
|
-
* @param value - Override value
|
|
101
64
|
*/
|
|
102
65
|
setOverride(key: FeatureFlagKey, value: FeatureFlagValue): Promise<{
|
|
103
66
|
isSuccessful: boolean;
|
|
104
67
|
}>;
|
|
105
68
|
/**
|
|
106
69
|
* Removes a manual override for a flag.
|
|
107
|
-
*
|
|
108
|
-
* @param key - Feature flag key
|
|
109
70
|
*/
|
|
110
71
|
removeOverride(key: FeatureFlagKey): Promise<{
|
|
111
72
|
isSuccessful: boolean;
|
|
112
73
|
}>;
|
|
113
|
-
/**
|
|
114
|
-
* Gets all available feature flags.
|
|
115
|
-
*
|
|
116
|
-
* @param environment - Filter by environment
|
|
117
|
-
* @returns List of feature flags
|
|
118
|
-
*/
|
|
119
|
-
getAllFeatureFlags(environment?: string): Promise<FeatureFlag<FeatureFlagKey>[]>;
|
|
120
74
|
/**
|
|
121
75
|
* Gets all rules for a specific flag.
|
|
122
|
-
*
|
|
123
|
-
* @param key - Feature flag key
|
|
124
|
-
* @returns List of rules for the flag
|
|
125
76
|
*/
|
|
126
77
|
getFlagRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;
|
|
127
78
|
/**
|
|
@@ -130,6 +81,13 @@ export declare class FeatureFlagController {
|
|
|
130
81
|
refreshCache(): Promise<{
|
|
131
82
|
isSuccessful: boolean;
|
|
132
83
|
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Gets service health status.
|
|
86
|
+
*/
|
|
87
|
+
getHealth(): Promise<{
|
|
88
|
+
isInitialized: boolean;
|
|
89
|
+
provider: string;
|
|
90
|
+
}>;
|
|
133
91
|
}
|
|
134
92
|
export {};
|
|
135
93
|
//# sourceMappingURL=feature-flag.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag.controller.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.controller.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"feature-flag.controller.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAwB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,qBACa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,kBAAkB,CAAC,cAAc,CAAC;IAGzE;;OAEG;IAEG,YAAY,CACF,GAAG,EAAE,cAAc,EACzB,IAAI,GAAE,mBAAwB,GACrC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAYjD;;OAEG;IAEG,SAAS,CACC,GAAG,EAAE,cAAc,EACzB,IAAI,GAAE,mBAAwB,GACrC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAalC;;OAEG;IAEG,gBAAgB,CACZ,IAAI,GAAE,mBAAwB,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC;IAYjE;;OAEG;IAEG,UAAU,CACN,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,GACpD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAYvC;;OAEG;IAEG,UAAU,CACA,GAAG,EAAE,cAAc,EACzB,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAC7D,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAYvC;;OAEG;IAEG,UAAU,CAAe,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAavF;;OAEG;IAEG,WAAW,CACD,GAAG,EAAE,cAAc,EAClB,KAAK,EAAE,gBAAgB,GACrC,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAarC;;OAEG;IAEG,cAAc,CAAe,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAa3F;;OAEG;IAEG,YAAY,CACF,GAAG,EAAE,cAAc,GAChC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IAY7C;;OAEG;IAEG,YAAY,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAaxD;;OAEG;IAEG,SAAS,IAAI,OAAO,CAAC;QACzB,aAAa,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CAMH"}
|
|
@@ -1,62 +1,69 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Feature Flag Module
|
|
2
|
+
* Feature Flag NestJS Module
|
|
3
3
|
*
|
|
4
|
-
* NestJS
|
|
5
|
-
*
|
|
4
|
+
* NestJS wrapper around the unified FeatureFlagModule.
|
|
5
|
+
* Adds the controller for REST API endpoints.
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
8
|
-
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';
|
|
10
|
+
*
|
|
11
|
+
* @Module({
|
|
12
|
+
* imports: [FeatureFlagModule.forRoot({ provider: 'database' })],
|
|
13
|
+
* })
|
|
14
|
+
* export class AppModule {}
|
|
15
|
+
* ```
|
|
9
16
|
*/
|
|
17
|
+
import { type DynamicModule, type OnModuleDestroy, type Type, type ForwardReference, type InjectionToken } from '@nestjs/common';
|
|
18
|
+
import { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';
|
|
10
19
|
/**
|
|
11
20
|
* Feature Flag Module
|
|
12
21
|
*
|
|
13
22
|
* Provides feature flag functionality as a NestJS module.
|
|
14
|
-
*
|
|
23
|
+
* Uses the domain FeatureFlagService directly - no NestJS wrapper needed.
|
|
15
24
|
*
|
|
16
25
|
* @example
|
|
17
26
|
* ```typescript
|
|
18
27
|
* // In your app.module.ts
|
|
19
|
-
* import { FeatureFlagModule } from '@plyaz/config/backend/featureFlags';
|
|
20
|
-
*
|
|
21
28
|
* @Module({
|
|
22
|
-
* imports: [
|
|
23
|
-
*
|
|
29
|
+
* imports: [
|
|
30
|
+
* FeatureFlagModule.forRoot({ provider: 'database' })
|
|
31
|
+
* ],
|
|
24
32
|
* })
|
|
25
33
|
* export class AppModule {}
|
|
26
34
|
* ```
|
|
27
35
|
*
|
|
28
36
|
* @example
|
|
29
37
|
* ```typescript
|
|
30
|
-
* // In your service
|
|
31
|
-
* import { FeatureFlagService } from '@plyaz/config/backend/featureFlags';
|
|
32
|
-
*
|
|
38
|
+
* // In your service - inject the domain service
|
|
33
39
|
* @Injectable()
|
|
34
40
|
* export class MyService {
|
|
35
|
-
* constructor(
|
|
41
|
+
* constructor(
|
|
42
|
+
* @Inject(FEATURE_FLAG_SERVICE)
|
|
43
|
+
* private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>
|
|
44
|
+
* ) {}
|
|
36
45
|
*
|
|
37
46
|
* async doSomething() {
|
|
38
47
|
* const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');
|
|
39
|
-
* if (isEnabled) {
|
|
40
|
-
* // Execute new feature logic
|
|
41
|
-
* }
|
|
42
48
|
* }
|
|
43
49
|
* }
|
|
44
50
|
* ```
|
|
45
51
|
*/
|
|
46
|
-
export declare class FeatureFlagModule {
|
|
52
|
+
export declare class FeatureFlagModule implements OnModuleDestroy {
|
|
53
|
+
private static serviceInstance;
|
|
54
|
+
onModuleDestroy(): void;
|
|
47
55
|
/**
|
|
48
|
-
*
|
|
49
|
-
* This allows customization of the feature flag system.
|
|
56
|
+
* Creates the module with configuration.
|
|
50
57
|
*
|
|
51
58
|
* @param options - Module configuration options
|
|
52
|
-
* @returns Configured module
|
|
59
|
+
* @returns Configured dynamic module
|
|
53
60
|
*
|
|
54
61
|
* @example
|
|
55
62
|
* ```typescript
|
|
56
63
|
* @Module({
|
|
57
64
|
* imports: [
|
|
58
65
|
* FeatureFlagModule.forRoot({
|
|
59
|
-
* provider: '
|
|
66
|
+
* provider: 'database',
|
|
60
67
|
* cacheEnabled: true,
|
|
61
68
|
* cacheTtl: 600,
|
|
62
69
|
* })
|
|
@@ -65,23 +72,13 @@ export declare class FeatureFlagModule {
|
|
|
65
72
|
* export class AppModule {}
|
|
66
73
|
* ```
|
|
67
74
|
*/
|
|
68
|
-
static forRoot(options?:
|
|
69
|
-
provider?: 'memory' | 'database' | 'redis' | 'api' | 'file';
|
|
70
|
-
isCacheEnabled?: boolean;
|
|
71
|
-
cacheTtl?: number;
|
|
72
|
-
refreshInterval?: number;
|
|
73
|
-
isLoggingEnabled?: boolean;
|
|
74
|
-
}): {
|
|
75
|
-
module: typeof FeatureFlagModule;
|
|
76
|
-
providers: unknown[];
|
|
77
|
-
exports: unknown[];
|
|
78
|
-
};
|
|
75
|
+
static forRoot(options?: CoreFeatureFlagModuleConfig): DynamicModule;
|
|
79
76
|
/**
|
|
80
|
-
*
|
|
77
|
+
* Creates the module with async configuration.
|
|
81
78
|
* Useful when configuration depends on other services.
|
|
82
79
|
*
|
|
83
80
|
* @param options - Async module configuration options
|
|
84
|
-
* @returns Configured async module
|
|
81
|
+
* @returns Configured async dynamic module
|
|
85
82
|
*
|
|
86
83
|
* @example
|
|
87
84
|
* ```typescript
|
|
@@ -101,14 +98,9 @@ export declare class FeatureFlagModule {
|
|
|
101
98
|
* ```
|
|
102
99
|
*/
|
|
103
100
|
static forRootAsync(options: {
|
|
104
|
-
imports?: unknown
|
|
105
|
-
inject?:
|
|
106
|
-
useFactory
|
|
107
|
-
}):
|
|
108
|
-
module: typeof FeatureFlagModule;
|
|
109
|
-
imports: unknown[];
|
|
110
|
-
providers: unknown[];
|
|
111
|
-
exports: unknown[];
|
|
112
|
-
};
|
|
101
|
+
imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
|
|
102
|
+
inject?: InjectionToken[];
|
|
103
|
+
useFactory: (...args: unknown[]) => CoreFeatureFlagModuleConfig | Promise<CoreFeatureFlagModuleConfig>;
|
|
104
|
+
}): DynamicModule;
|
|
113
105
|
}
|
|
114
106
|
//# sourceMappingURL=feature-flag.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flag.module.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.module.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"feature-flag.module.d.ts","sourceRoot":"","sources":["../../../src/backend/featureFlags/feature-flag.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAIa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAmD;IAEjF,eAAe,IAAI,IAAI;IAOvB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,2BAAgC,GAAG,aAAa;IAgBxE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;QAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAC3F,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAC1B,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,OAAO,EAAE,KACf,2BAA2B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;KACzE,GAAG,aAAa;CAkBlB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
4
|
+
import { FeatureFlagService } from '@domain/featureFlags';
|
|
5
|
+
/**
|
|
6
|
+
* Guard that ensures a feature flag is in the expected state
|
|
7
|
+
* before allowing access to a route handler.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* @Controller('premium')
|
|
12
|
+
* @UseGuards(FeatureFlagGuard)
|
|
13
|
+
* export class PremiumController {
|
|
14
|
+
* @Get()
|
|
15
|
+
* @FeatureEnabled('PREMIUM_FEATURE')
|
|
16
|
+
* getPremiumData() {
|
|
17
|
+
* // Only accessible if PREMIUM_FEATURE is enabled
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class FeatureFlagGuard implements CanActivate {
|
|
23
|
+
private readonly reflector;
|
|
24
|
+
private readonly featureFlagService;
|
|
25
|
+
private readonly logger;
|
|
26
|
+
constructor(reflector: Reflector, featureFlagService: FeatureFlagService<FeatureFlagKey>);
|
|
27
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Compare expected vs actual values.
|
|
30
|
+
*/
|
|
31
|
+
private matches;
|
|
32
|
+
}
|
|
33
|
+
//# 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;AAEnF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAwB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGhF;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,gBAAiB,YAAW,WAAW;IAOhD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IARrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;gBAGgB,SAAS,EAAE,SAAS,EAEpB,kBAAkB,EAAE,kBAAkB,CAAC,cAAc,CAAC;IAGnE,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B9D;;OAEG;IACH,OAAO,CAAC,OAAO;CAUhB"}
|
|
@@ -1,49 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Feature Flag Backend -
|
|
2
|
+
* Feature Flag Backend - NestJS Exports
|
|
3
3
|
*
|
|
4
|
-
* NestJS
|
|
5
|
-
*
|
|
4
|
+
* NestJS module with controller, guards, decorators, and interceptors.
|
|
5
|
+
* Uses shared service factory from domain.
|
|
6
6
|
*
|
|
7
7
|
* @fileoverview Backend feature flags exports
|
|
8
|
-
* @version 1.0.0
|
|
9
8
|
*/
|
|
9
|
+
export { FeatureFlagDomainService } from './FeatureFlagDomainService';
|
|
10
10
|
export { FeatureFlagModule } from './feature-flag.module';
|
|
11
|
-
export { FeatureFlagService } from './feature-flag.service';
|
|
12
|
-
export { FeatureFlagRepository } from './feature-flag.repository';
|
|
13
11
|
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;
|
|
12
|
+
export { FeatureFlagService, FeatureFlagServiceFactory } from '@domain/featureFlags';
|
|
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 { FeatureFlagDatabaseRepository } from '@models/featureFlags';
|
|
49
22
|
//# 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,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGrF,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;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,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
|