@plyaz/core 1.2.0 → 1.3.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/README.md +248 -183
- 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 +28 -50
- package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -1
- package/dist/backend/featureFlags/config/validation.d.ts +6 -6
- package/dist/backend/featureFlags/config/validation.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -55
- package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
- package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -43
- package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +16 -2
- package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -1
- package/dist/backend/featureFlags/index.d.ts +6 -7
- package/dist/backend/featureFlags/index.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -1
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +6 -11
- package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -1
- 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/index.d.ts +1 -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 +54 -47
- 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 +26 -0
- package/dist/entry-backend.d.ts.map +1 -0
- package/dist/entry-backend.js +15455 -0
- package/dist/entry-backend.js.map +1 -0
- package/dist/entry-backend.mjs +15339 -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 +11340 -0
- package/dist/entry-frontend.js.map +1 -0
- package/dist/entry-frontend.mjs +11278 -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 +4 -0
- package/dist/frontend/index.d.ts.map +1 -1
- package/dist/frontend/providers/ApiProvider.d.ts +2 -2
- package/dist/frontend/providers/ApiProvider.d.ts.map +1 -1
- 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 +1 -0
- package/dist/frontend/providers/index.d.ts.map +1 -1
- 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 +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15262 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13667 -4861
- package/dist/index.mjs.map +1 -1
- package/dist/init/CoreInitializer.d.ts +583 -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 +9234 -0
- package/dist/init/nestjs/index.js.map +1 -0
- package/dist/init/nestjs/index.mjs +9230 -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 +166 -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 +161 -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 +92 -4
- package/dist/services/ApiClientService.d.ts.map +1 -1
- package/dist/services/CacheService.d.ts +176 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/DbService.d.ts +393 -0
- package/dist/services/DbService.d.ts.map +1 -0
- package/dist/services/NotificationService.d.ts +153 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/StorageService.d.ts +146 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -1
- 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 +2 -0
- 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/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 +2 -2
- package/dist/web_app/auth/add_user.d.ts.map +1 -1
- package/dist/web_app/auth/update_user.d.ts +1 -1
- package/dist/web_app/auth/update_user.d.ts.map +1 -1
- package/package.json +89 -15
- package/dist/backend/featureFlags/database/connection.d.ts +0 -321
- package/dist/backend/featureFlags/database/connection.d.ts.map +0 -1
- package/dist/backend/featureFlags/database/repository.d.ts +0 -518
- package/dist/backend/featureFlags/database/repository.d.ts.map +0 -1
- 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 -264
- 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 -6435
- package/dist/index.cjs.map +0 -1
- package/dist/utils/db/databaseService.d.ts +0 -6
- package/dist/utils/db/databaseService.d.ts.map +0 -1
- package/dist/utils/db/index.d.ts +0 -2
- package/dist/utils/db/index.d.ts.map +0 -1
|
@@ -1,54 +1,62 @@
|
|
|
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
|
-
* @
|
|
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
|
+
* ```
|
|
8
16
|
*/
|
|
17
|
+
import { type DynamicModule, type OnModuleDestroy, type Type, type ForwardReference, type InjectionToken } from '@nestjs/common';
|
|
18
|
+
import { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';
|
|
9
19
|
/**
|
|
10
20
|
* Feature Flag Module
|
|
11
21
|
*
|
|
12
22
|
* Provides feature flag functionality as a NestJS module.
|
|
13
|
-
*
|
|
23
|
+
* Uses the domain FeatureFlagService directly - no NestJS wrapper needed.
|
|
14
24
|
*
|
|
15
25
|
* @example
|
|
16
26
|
* ```typescript
|
|
17
27
|
* // In your app.module.ts
|
|
18
|
-
* import { FeatureFlagModule } from '@plyaz/config/backend/featureFlags';
|
|
19
|
-
*
|
|
20
28
|
* @Module({
|
|
21
|
-
* imports: [
|
|
22
|
-
*
|
|
29
|
+
* imports: [
|
|
30
|
+
* FeatureFlagModule.forRoot({ provider: 'database' })
|
|
31
|
+
* ],
|
|
23
32
|
* })
|
|
24
33
|
* export class AppModule {}
|
|
25
34
|
* ```
|
|
26
35
|
*
|
|
27
36
|
* @example
|
|
28
37
|
* ```typescript
|
|
29
|
-
* // In your service
|
|
30
|
-
* import { FeatureFlagService } from '@plyaz/config/backend/featureFlags';
|
|
31
|
-
*
|
|
38
|
+
* // In your service - inject the domain service
|
|
32
39
|
* @Injectable()
|
|
33
40
|
* export class MyService {
|
|
34
|
-
* constructor(
|
|
41
|
+
* constructor(
|
|
42
|
+
* @Inject(FEATURE_FLAG_SERVICE)
|
|
43
|
+
* private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>
|
|
44
|
+
* ) {}
|
|
35
45
|
*
|
|
36
46
|
* async doSomething() {
|
|
37
47
|
* const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');
|
|
38
|
-
* if (isEnabled) {
|
|
39
|
-
* // Execute new feature logic
|
|
40
|
-
* }
|
|
41
48
|
* }
|
|
42
49
|
* }
|
|
43
50
|
* ```
|
|
44
51
|
*/
|
|
45
|
-
export declare class FeatureFlagModule {
|
|
52
|
+
export declare class FeatureFlagModule implements OnModuleDestroy {
|
|
53
|
+
private static serviceInstance;
|
|
54
|
+
onModuleDestroy(): void;
|
|
46
55
|
/**
|
|
47
|
-
*
|
|
48
|
-
* This allows customization of the feature flag system.
|
|
56
|
+
* Creates the module with configuration.
|
|
49
57
|
*
|
|
50
58
|
* @param options - Module configuration options
|
|
51
|
-
* @returns Configured module
|
|
59
|
+
* @returns Configured dynamic module
|
|
52
60
|
*
|
|
53
61
|
* @example
|
|
54
62
|
* ```typescript
|
|
@@ -56,7 +64,7 @@ export declare class FeatureFlagModule {
|
|
|
56
64
|
* imports: [
|
|
57
65
|
* FeatureFlagModule.forRoot({
|
|
58
66
|
* provider: 'database',
|
|
59
|
-
*
|
|
67
|
+
* cacheEnabled: true,
|
|
60
68
|
* cacheTtl: 600,
|
|
61
69
|
* })
|
|
62
70
|
* ],
|
|
@@ -64,23 +72,13 @@ export declare class FeatureFlagModule {
|
|
|
64
72
|
* export class AppModule {}
|
|
65
73
|
* ```
|
|
66
74
|
*/
|
|
67
|
-
static forRoot(options?:
|
|
68
|
-
provider?: 'memory' | 'database' | 'redis' | 'api' | 'file';
|
|
69
|
-
isCacheEnabled?: boolean;
|
|
70
|
-
cacheTtl?: number;
|
|
71
|
-
refreshInterval?: number;
|
|
72
|
-
isLoggingEnabled?: boolean;
|
|
73
|
-
}): {
|
|
74
|
-
module: typeof FeatureFlagModule;
|
|
75
|
-
providers: unknown[];
|
|
76
|
-
exports: unknown[];
|
|
77
|
-
};
|
|
75
|
+
static forRoot(options?: CoreFeatureFlagModuleConfig): DynamicModule;
|
|
78
76
|
/**
|
|
79
|
-
*
|
|
77
|
+
* Creates the module with async configuration.
|
|
80
78
|
* Useful when configuration depends on other services.
|
|
81
79
|
*
|
|
82
80
|
* @param options - Async module configuration options
|
|
83
|
-
* @returns Configured async module
|
|
81
|
+
* @returns Configured async dynamic module
|
|
84
82
|
*
|
|
85
83
|
* @example
|
|
86
84
|
* ```typescript
|
|
@@ -100,14 +98,9 @@ export declare class FeatureFlagModule {
|
|
|
100
98
|
* ```
|
|
101
99
|
*/
|
|
102
100
|
static forRootAsync(options: {
|
|
103
|
-
imports?: unknown
|
|
104
|
-
inject?:
|
|
105
|
-
useFactory
|
|
106
|
-
}):
|
|
107
|
-
module: typeof FeatureFlagModule;
|
|
108
|
-
imports: unknown[];
|
|
109
|
-
providers: unknown[];
|
|
110
|
-
exports: unknown[];
|
|
111
|
-
};
|
|
101
|
+
imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
|
|
102
|
+
inject?: InjectionToken[];
|
|
103
|
+
useFactory: (...args: unknown[]) => CoreFeatureFlagModuleConfig | Promise<CoreFeatureFlagModuleConfig>;
|
|
104
|
+
}): DynamicModule;
|
|
112
105
|
}
|
|
113
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"}
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import { Reflector } from '@nestjs/core';
|
|
3
|
-
import {
|
|
3
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
4
|
+
import { FeatureFlagService } from '@domain/featureFlags';
|
|
4
5
|
/**
|
|
5
6
|
* Guard that ensures a feature flag is in the expected state
|
|
6
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
|
+
* ```
|
|
7
21
|
*/
|
|
8
22
|
export declare class FeatureFlagGuard implements CanActivate {
|
|
9
23
|
private readonly reflector;
|
|
10
24
|
private readonly featureFlagService;
|
|
11
25
|
private readonly logger;
|
|
12
|
-
constructor(reflector: Reflector, featureFlagService: FeatureFlagService);
|
|
26
|
+
constructor(reflector: Reflector, featureFlagService: FeatureFlagService<FeatureFlagKey>);
|
|
13
27
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
14
28
|
/**
|
|
15
29
|
* Compare expected vs actual values.
|
|
@@ -1 +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;
|
|
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,15 +1,15 @@
|
|
|
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
8
|
*/
|
|
9
|
+
export { FeatureFlagDomainService } from './FeatureFlagDomainService';
|
|
9
10
|
export { FeatureFlagModule } from './feature-flag.module';
|
|
10
|
-
export { FeatureFlagService } from './feature-flag.service';
|
|
11
|
-
export { FeatureFlagRepository } from './feature-flag.repository';
|
|
12
11
|
export { FeatureFlagController } from './feature-flag.controller';
|
|
12
|
+
export { FeatureFlagService, FeatureFlagServiceFactory } from '@domain/featureFlags';
|
|
13
13
|
export { FeatureDisabled } from './decorators/feature-disabled.decorator';
|
|
14
14
|
export { FeatureEnabled } from './decorators/feature-enabled.decorator';
|
|
15
15
|
export { FeatureFlagGuard } from './guards/feature-flag.guard';
|
|
@@ -18,6 +18,5 @@ export { FeatureFlagLoggingInterceptor } from './interceptors/feature-flag-loggi
|
|
|
18
18
|
export { ErrorHandlingInterceptor } from './interceptors/error-handling-interceptor';
|
|
19
19
|
export { FeatureFlagConfigFactory } from './config/feature-flag.config';
|
|
20
20
|
export { FeatureFlagConfigValidator } from './config/validation';
|
|
21
|
-
export {
|
|
22
|
-
export { FeatureFlagDatabaseRepository } from './database/repository';
|
|
21
|
+
export { FeatureFlagDatabaseRepository } from '@models/featureFlags';
|
|
23
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;;;;;;;GAOG;AAGH,OAAO,EAAE,
|
|
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"}
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"error-handling-interceptor.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/interceptors/error-handling-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK5F,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGlC;;;;;;;;GAQG;AACH,qBACa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;IAEH,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAwB7E"}
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"feature-flag-logging-interceptor.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/interceptors/feature-flag-logging-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AAEvC;;;;;;;;;GASG;AAEH,qBACa,6BAA8B,YAAW,eAAe;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;IAEH,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;IA0B5E,OAAO,CAAC,iBAAiB;CAI1B"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { NestMiddleware } from '@nestjs/common';
|
|
2
|
-
import { FeatureFlagService } from '
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
query?: Record<string, unknown> | URLSearchParams;
|
|
6
|
-
headers?: Record<string, string | string[] | undefined>;
|
|
7
|
-
url?: string;
|
|
8
|
-
};
|
|
2
|
+
import { FeatureFlagService } from '@domain/featureFlags';
|
|
3
|
+
import type { FeatureFlagKey } from '@domain/types';
|
|
4
|
+
import type { CoreFeatureFlagRequest } from '@plyaz/types/core';
|
|
9
5
|
/**
|
|
10
6
|
* FeatureFlagMiddleware - Evaluates and attaches feature flags to every request
|
|
11
7
|
*
|
|
@@ -128,14 +124,14 @@ type FeatureFlagRequest = {
|
|
|
128
124
|
export declare class FeatureFlagMiddleware implements NestMiddleware {
|
|
129
125
|
private readonly featureFlagService;
|
|
130
126
|
private readonly logger;
|
|
131
|
-
constructor(featureFlagService: FeatureFlagService);
|
|
127
|
+
constructor(featureFlagService: FeatureFlagService<FeatureFlagKey>);
|
|
132
128
|
/**
|
|
133
129
|
* Main middleware execution method
|
|
134
130
|
*
|
|
135
131
|
* @description Processes incoming requests to evaluate and attach feature flags.
|
|
136
132
|
* Handles flag key extraction from multiple sources and graceful error handling.
|
|
137
133
|
*
|
|
138
|
-
* @param {
|
|
134
|
+
* @param {CoreFeatureFlagRequest} req - Express request object with feature flag extensions
|
|
139
135
|
* @param {unknown} res - Express response object (not used in this middleware)
|
|
140
136
|
* @param {Function} next - Next middleware function in the chain
|
|
141
137
|
*
|
|
@@ -161,7 +157,6 @@ export declare class FeatureFlagMiddleware implements NestMiddleware {
|
|
|
161
157
|
* next();
|
|
162
158
|
* ```
|
|
163
159
|
*/
|
|
164
|
-
use(req:
|
|
160
|
+
use(req: CoreFeatureFlagRequest, res: unknown, next: (...args: unknown[]) => void): Promise<void>;
|
|
165
161
|
}
|
|
166
|
-
export {};
|
|
167
162
|
//# sourceMappingURL=feature-flag-middleware.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"feature-flag-middleware.d.ts","sourceRoot":"","sources":["../../../../src/backend/featureFlags/middleware/feature-flag-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAU,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EAAwB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAShE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsHG;AACH,qBACa,qBAAsB,YAAW,cAAc;IAQxD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAPrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGpB;gBAIgB,kBAAkB,EAAE,kBAAkB,CAAC,cAAc,CAAC;IAGzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IAEG,GAAG,CACP,GAAG,EAAE,sBAAsB,EAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC;CAoCjB"}
|
package/dist/backend/index.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Backend Layer Exports
|
|
3
|
+
*
|
|
4
|
+
* NestJS-specific implementations.
|
|
5
|
+
* For framework-agnostic modules, use domain exports:
|
|
6
|
+
* - import { FeatureFlagModule } from '@plyaz/core/domain/featureFlags';
|
|
3
7
|
*/
|
|
8
|
+
export * from './example';
|
|
4
9
|
export * from './featureFlags';
|
|
5
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Key Builder Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized methods for building cache keys with consistent patterns.
|
|
5
|
+
* All keys are designed to be prefixed by the service (handled by service layer).
|
|
6
|
+
*
|
|
7
|
+
* Key pattern: {prefix}:{type}:{identifier}:{params}
|
|
8
|
+
* Example: "example:entity:123" or "user:list:page:1"
|
|
9
|
+
*
|
|
10
|
+
* @fileoverview Cache key building utilities
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Cache key builder for standardized cache key generation.
|
|
14
|
+
*
|
|
15
|
+
* All methods return un-prefixed keys that should be prefixed by the service layer.
|
|
16
|
+
* This allows each service to namespace their cache keys.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // In a service with cachePrefix = 'user'
|
|
21
|
+
* const key = CacheKeyBuilder.entity('123');
|
|
22
|
+
* // Returns: "entity:123"
|
|
23
|
+
* // After service prefixing: "user:entity:123"
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class CacheKeyBuilder {
|
|
27
|
+
/**
|
|
28
|
+
* Build cache key for a single entity by ID
|
|
29
|
+
*
|
|
30
|
+
* @param id - Entity ID
|
|
31
|
+
* @returns Cache key (unprefixed)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* CacheKeyBuilder.entity('123')
|
|
36
|
+
* // Returns: "entity:123"
|
|
37
|
+
* // With prefix "user": "user:entity:123"
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
static entity(id: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Build cache key for a list/collection query
|
|
43
|
+
*
|
|
44
|
+
* @param params - Query parameters (page, limit, filters, etc.)
|
|
45
|
+
* @returns Cache key (unprefixed)
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* CacheKeyBuilder.list({ page: 1, limit: 10 })
|
|
50
|
+
* // Returns: "list:limit:10:page:1"
|
|
51
|
+
* // With prefix: "user:list:limit:10:page:1"
|
|
52
|
+
*
|
|
53
|
+
* CacheKeyBuilder.list() // No params
|
|
54
|
+
* // Returns: "list:all"
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
static list(params?: Record<string, unknown>): string;
|
|
58
|
+
/**
|
|
59
|
+
* Build cache key for a named query/filter
|
|
60
|
+
*
|
|
61
|
+
* @param queryName - Name of the query (e.g., 'active', 'byStatus', 'search')
|
|
62
|
+
* @param params - Query parameters
|
|
63
|
+
* @returns Cache key (unprefixed)
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* CacheKeyBuilder.query('active', { status: 'published' })
|
|
68
|
+
* // Returns: "query:active:status:\"published\""
|
|
69
|
+
*
|
|
70
|
+
* CacheKeyBuilder.query('search', { q: 'hello', limit: 10 })
|
|
71
|
+
* // Returns: "query:search:limit:10:q:\"hello\""
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
static query(queryName: string, params?: Record<string, unknown>): string;
|
|
75
|
+
/**
|
|
76
|
+
* Build cache key for aggregate/count operations
|
|
77
|
+
*
|
|
78
|
+
* @param operation - Operation name (e.g., 'count', 'sum', 'avg')
|
|
79
|
+
* @param field - Field name (optional)
|
|
80
|
+
* @param params - Additional parameters (optional)
|
|
81
|
+
* @returns Cache key (unprefixed)
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* CacheKeyBuilder.aggregate('count')
|
|
86
|
+
* // Returns: "aggregate:count"
|
|
87
|
+
*
|
|
88
|
+
* CacheKeyBuilder.aggregate('sum', 'amount')
|
|
89
|
+
* // Returns: "aggregate:sum:amount"
|
|
90
|
+
*
|
|
91
|
+
* CacheKeyBuilder.aggregate('count', 'users', { status: 'active' })
|
|
92
|
+
* // Returns: "aggregate:count:users:status:\"active\""
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
static aggregate(operation: string, field?: string, params?: Record<string, unknown>): string;
|
|
96
|
+
/**
|
|
97
|
+
* Build a custom cache key with type and identifier
|
|
98
|
+
*
|
|
99
|
+
* @param type - Cache key type
|
|
100
|
+
* @param identifier - Unique identifier for this cache entry
|
|
101
|
+
* @param params - Additional parameters (optional)
|
|
102
|
+
* @returns Cache key (unprefixed)
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* CacheKeyBuilder.custom('session', 'abc123')
|
|
107
|
+
* // Returns: "session:abc123"
|
|
108
|
+
*
|
|
109
|
+
* CacheKeyBuilder.custom('report', 'monthly', { year: 2025, month: 1 })
|
|
110
|
+
* // Returns: "report:monthly:month:1:year:2025"
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
static custom(type: string, identifier: string, params?: Record<string, unknown>): string;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=CacheKeyBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheKeyBuilder.d.ts","sourceRoot":"","sources":["../../../src/base/cache/CacheKeyBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIjC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAWrD;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAUzE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAY7F;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAS1F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAiB,WAAW,EAAc,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IAQX,OAAO,CAAC,MAAM;IAP1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;OAIG;gBACiB,MAAM,EAAE,WAAW;IAIvC;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAe5C;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAexC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAK5F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAgB1C,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;OAIG;gBACiB,MAAM,EAAE,gBAAgB;IAO5C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAuBxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAqBrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;;OAKG;YACW,eAAe;IAc7B;;;;;OAKG;YACW,mBAAmB;IA4BjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Observability Adapter
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for all observability adapters.
|
|
5
|
+
* Provides common functionality and enforces the adapter interface.
|
|
6
|
+
*
|
|
7
|
+
* @module base/observability
|
|
8
|
+
*/
|
|
9
|
+
import { PackageLogger } from '@plyaz/logger';
|
|
10
|
+
import type { ObservabilityAdapter, ObservabilityAdapterConfig, ObservabilityProvider, Metric, SpanOptions, Span, LogEntry, ObservabilityEvent } from '@plyaz/types/observability';
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for observability adapters.
|
|
13
|
+
*
|
|
14
|
+
* Provides common functionality:
|
|
15
|
+
* - Initialization lifecycle
|
|
16
|
+
* - Default tag management
|
|
17
|
+
* - Error handling
|
|
18
|
+
* - Logging
|
|
19
|
+
*
|
|
20
|
+
* Subclasses must implement provider-specific methods.
|
|
21
|
+
*/
|
|
22
|
+
export declare abstract class BaseAdapter implements ObservabilityAdapter {
|
|
23
|
+
abstract readonly provider: ObservabilityProvider;
|
|
24
|
+
abstract readonly name: string;
|
|
25
|
+
protected _isInitialized: boolean;
|
|
26
|
+
protected _config: ObservabilityAdapterConfig | null;
|
|
27
|
+
protected readonly logger: PackageLogger;
|
|
28
|
+
constructor();
|
|
29
|
+
get isInitialized(): boolean;
|
|
30
|
+
get config(): ObservabilityAdapterConfig | null;
|
|
31
|
+
initialize(config: ObservabilityAdapterConfig): Promise<void>;
|
|
32
|
+
shutdown(): Promise<void>;
|
|
33
|
+
isHealthy(): Promise<boolean>;
|
|
34
|
+
protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;
|
|
35
|
+
protected abstract doShutdown(): Promise<void>;
|
|
36
|
+
protected abstract doHealthCheck(): Promise<boolean>;
|
|
37
|
+
recordMetric(metric: Metric): Promise<void>;
|
|
38
|
+
incrementCounter(name: string, value?: number, tags?: Record<string, string>): Promise<void>;
|
|
39
|
+
setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void>;
|
|
40
|
+
recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void>;
|
|
41
|
+
protected abstract doRecordMetric(metric: Metric): Promise<void>;
|
|
42
|
+
startSpan(options: SpanOptions): Span;
|
|
43
|
+
getActiveSpan(): Span | null;
|
|
44
|
+
withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T>;
|
|
45
|
+
protected abstract doStartSpan(options: SpanOptions): Span;
|
|
46
|
+
protected abstract doGetActiveSpan(): Span | null;
|
|
47
|
+
log(entry: LogEntry): Promise<void>;
|
|
48
|
+
protected abstract doLog(entry: LogEntry): Promise<void>;
|
|
49
|
+
sendEvent(event: ObservabilityEvent): Promise<void>;
|
|
50
|
+
protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;
|
|
51
|
+
flush(): Promise<void>;
|
|
52
|
+
protected abstract doFlush(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Apply default tags to a metric
|
|
55
|
+
*/
|
|
56
|
+
protected applyDefaultTags(metric: Metric): Metric;
|
|
57
|
+
/**
|
|
58
|
+
* Create a no-op span (for disabled/sampled-out traces)
|
|
59
|
+
*/
|
|
60
|
+
protected createNoopSpan(_options: SpanOptions): Span;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* No-op adapter that does nothing.
|
|
64
|
+
* Use when observability is disabled.
|
|
65
|
+
*/
|
|
66
|
+
export declare class NoopAdapter extends BaseAdapter {
|
|
67
|
+
readonly provider: "noop";
|
|
68
|
+
readonly name = "NoopAdapter";
|
|
69
|
+
protected doInitialize(): Promise<void>;
|
|
70
|
+
protected doShutdown(): Promise<void>;
|
|
71
|
+
protected doHealthCheck(): Promise<boolean>;
|
|
72
|
+
protected doRecordMetric(): Promise<void>;
|
|
73
|
+
protected doStartSpan(options: SpanOptions): Span;
|
|
74
|
+
protected doGetActiveSpan(): Span | null;
|
|
75
|
+
protected doLog(): Promise<void>;
|
|
76
|
+
protected doSendEvent(): Promise<void>;
|
|
77
|
+
protected doFlush(): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=BaseAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/base/observability/BaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite Adapter
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple observability providers running in parallel or priority (fallback) modes.
|
|
5
|
+
*
|
|
6
|
+
* - **Parallel mode**: Sends data to all adapters simultaneously
|
|
7
|
+
* - **Priority mode**: Tries first adapter, falls back to next on failure
|
|
8
|
+
*
|
|
9
|
+
* @module base/observability
|
|
10
|
+
*/
|
|
11
|
+
import type { ObservabilityAdapter, ObservabilityAdapterConfig, Metric, SpanOptions, Span, LogEntry, ObservabilityEvent } from '@plyaz/types/observability';
|
|
12
|
+
/**
|
|
13
|
+
* Composite adapter that delegates to multiple child adapters.
|
|
14
|
+
*
|
|
15
|
+
* @example Parallel mode (send to all - e.g., Datadog + Console)
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const composite = new CompositeAdapter();
|
|
18
|
+
* await composite.initialize({
|
|
19
|
+
* mode: 'parallel',
|
|
20
|
+
* adapters: [datadogAdapter, loggerAdapter],
|
|
21
|
+
* failOnAnyError: false,
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example Priority mode (fallback chain)
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const composite = new CompositeAdapter();
|
|
28
|
+
* await composite.initialize({
|
|
29
|
+
* mode: 'priority',
|
|
30
|
+
* adapters: [datadogAdapter, grafanaAdapter, loggerAdapter],
|
|
31
|
+
* adapterTimeout: 5000,
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class CompositeAdapter implements ObservabilityAdapter {
|
|
36
|
+
readonly provider: "custom";
|
|
37
|
+
readonly name = "CompositeAdapter";
|
|
38
|
+
private _isInitialized;
|
|
39
|
+
private _config;
|
|
40
|
+
private adapters;
|
|
41
|
+
private mode;
|
|
42
|
+
private adapterTimeout;
|
|
43
|
+
private failOnAnyError;
|
|
44
|
+
private fallbackOnErrors;
|
|
45
|
+
private readonly logger;
|
|
46
|
+
constructor();
|
|
47
|
+
get isInitialized(): boolean;
|
|
48
|
+
initialize(config: ObservabilityAdapterConfig): Promise<void>;
|
|
49
|
+
shutdown(): Promise<void>;
|
|
50
|
+
isHealthy(): Promise<boolean>;
|
|
51
|
+
recordMetric(metric: Metric): Promise<void>;
|
|
52
|
+
incrementCounter(name: string, value?: number, tags?: Record<string, string>): Promise<void>;
|
|
53
|
+
setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void>;
|
|
54
|
+
recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void>;
|
|
55
|
+
startSpan(options: SpanOptions): Span;
|
|
56
|
+
getActiveSpan(): Span | null;
|
|
57
|
+
withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T>;
|
|
58
|
+
log(entry: LogEntry): Promise<void>;
|
|
59
|
+
sendEvent(event: ObservabilityEvent): Promise<void>;
|
|
60
|
+
flush(): Promise<void>;
|
|
61
|
+
private executeOnAdapters;
|
|
62
|
+
private executeParallel;
|
|
63
|
+
private executePriority;
|
|
64
|
+
private withTimeout;
|
|
65
|
+
/**
|
|
66
|
+
* Check if we should fallback on this error type
|
|
67
|
+
*/
|
|
68
|
+
private shouldFallbackOnError;
|
|
69
|
+
private createCompositeSpan;
|
|
70
|
+
private createNoopSpan;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=CompositeAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompositeAdapter.d.ts","sourceRoot":"","sources":["../../../src/base/observability/CompositeAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,MAAM,EACN,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,kBAAkB,EAInB,MAAM,4BAA4B,CAAC;AAUpC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,YAAW,oBAAoB;IAC3D,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,QAAQ,CAAC,IAAI,sBAAsB;IAEnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;;IASvC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAIK,UAAU,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAazB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB7B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAMV,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IA2BrC,aAAa,IAAI,IAAI,GAAG,IAAI;IAUtB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmB7E,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,iBAAiB;YAoBjB,eAAe;YAyBf,eAAe;YAgCf,WAAW;IAgBzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,cAAc;CAiBvB"}
|