@rudderstack/integrations-lib 0.2.43 → 0.2.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +110 -1
  2. package/build/auth-types/index.d.ts +62 -0
  3. package/build/auth-types/index.d.ts.map +1 -0
  4. package/build/auth-types/index.js +3 -0
  5. package/build/feature-flags/core/config.d.ts +14 -0
  6. package/build/feature-flags/core/config.d.ts.map +1 -0
  7. package/build/feature-flags/core/config.js +111 -0
  8. package/build/feature-flags/core/index.d.ts +4 -0
  9. package/build/feature-flags/core/index.d.ts.map +1 -0
  10. package/build/feature-flags/core/index.js +10 -0
  11. package/build/feature-flags/core/service.d.ts +19 -0
  12. package/build/feature-flags/core/service.d.ts.map +1 -0
  13. package/build/feature-flags/core/service.js +106 -0
  14. package/build/feature-flags/core/utils.d.ts +8 -0
  15. package/build/feature-flags/core/utils.d.ts.map +1 -0
  16. package/build/feature-flags/core/utils.js +40 -0
  17. package/build/feature-flags/flags/defaults.d.ts +3 -0
  18. package/build/feature-flags/flags/defaults.d.ts.map +1 -0
  19. package/build/feature-flags/flags/defaults.js +24 -0
  20. package/build/feature-flags/flags/index.d.ts +5 -0
  21. package/build/feature-flags/flags/index.d.ts.map +1 -0
  22. package/build/feature-flags/flags/index.js +10 -0
  23. package/build/feature-flags/flags/interfaces.d.ts +12 -0
  24. package/build/feature-flags/flags/interfaces.d.ts.map +1 -0
  25. package/build/feature-flags/flags/interfaces.js +3 -0
  26. package/build/feature-flags/flags/loader.d.ts +14 -0
  27. package/build/feature-flags/flags/loader.d.ts.map +1 -0
  28. package/build/feature-flags/flags/loader.js +37 -0
  29. package/build/feature-flags/flags/registry.d.ts +12 -0
  30. package/build/feature-flags/flags/registry.d.ts.map +1 -0
  31. package/build/feature-flags/flags/registry.js +38 -0
  32. package/build/feature-flags/index.d.ts +9 -0
  33. package/build/feature-flags/index.d.ts.map +1 -0
  34. package/build/feature-flags/index.js +19 -0
  35. package/build/feature-flags/providers/factory.d.ts +7 -0
  36. package/build/feature-flags/providers/factory.d.ts.map +1 -0
  37. package/build/feature-flags/providers/factory.js +25 -0
  38. package/build/feature-flags/providers/flagsmith/index.d.ts +2 -0
  39. package/build/feature-flags/providers/flagsmith/index.d.ts.map +1 -0
  40. package/build/feature-flags/providers/flagsmith/index.js +6 -0
  41. package/build/feature-flags/providers/flagsmith/provider.d.ts +13 -0
  42. package/build/feature-flags/providers/flagsmith/provider.d.ts.map +1 -0
  43. package/build/feature-flags/providers/flagsmith/provider.js +73 -0
  44. package/build/feature-flags/providers/flagsmith/types.d.ts +1 -0
  45. package/build/feature-flags/providers/flagsmith/types.d.ts.map +1 -0
  46. package/build/feature-flags/providers/flagsmith/types.js +4 -0
  47. package/build/feature-flags/providers/index.d.ts +5 -0
  48. package/build/feature-flags/providers/index.d.ts.map +1 -0
  49. package/build/feature-flags/providers/index.js +10 -0
  50. package/build/feature-flags/providers/interfaces.d.ts +11 -0
  51. package/build/feature-flags/providers/interfaces.d.ts.map +1 -0
  52. package/build/feature-flags/providers/interfaces.js +3 -0
  53. package/build/feature-flags/providers/local/config.d.ts +4 -0
  54. package/build/feature-flags/providers/local/config.d.ts.map +1 -0
  55. package/build/feature-flags/providers/local/config.js +11 -0
  56. package/build/feature-flags/providers/local/index.d.ts +3 -0
  57. package/build/feature-flags/providers/local/index.d.ts.map +1 -0
  58. package/build/feature-flags/providers/local/index.js +6 -0
  59. package/build/feature-flags/providers/local/provider.d.ts +17 -0
  60. package/build/feature-flags/providers/local/provider.d.ts.map +1 -0
  61. package/build/feature-flags/providers/local/provider.js +105 -0
  62. package/build/feature-flags/providers/local/types.d.ts +4 -0
  63. package/build/feature-flags/providers/local/types.d.ts.map +1 -0
  64. package/build/feature-flags/providers/local/types.js +3 -0
  65. package/build/feature-flags/types.d.ts +96 -0
  66. package/build/feature-flags/types.d.ts.map +1 -0
  67. package/build/feature-flags/types.js +11 -0
  68. package/build/index.d.ts +2 -0
  69. package/build/index.d.ts.map +1 -1
  70. package/build/index.js +3 -1
  71. package/package.json +3 -2
package/README.md CHANGED
@@ -1 +1,110 @@
1
- # rudder-integrations-lib
1
+ # RudderStack Integrations Library
2
+
3
+ A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
4
+
5
+ ## Features
6
+
7
+ - **SDK Integrations**: Pre-built SDKs for Google Ads, Zoho, Customer.io, Criteo, and SFMC
8
+ - **Feature Flags**: Multi-provider feature flag system with Flagsmith and Local support
9
+ - **Network Utilities**: HTTP client factory and request handling
10
+ - **Error Handling**: Comprehensive error types and handling utilities
11
+ - **Logging**: Structured logging with multiple levels and formats
12
+ - **Cluster Management**: Process clustering and management utilities
13
+ - **Utilities**: Common utilities for data manipulation, validation, and processing
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @rudderstack/integrations-lib
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import {
25
+ // Core utilities
26
+ logger,
27
+ structuredLogger,
28
+ setValue,
29
+
30
+ // SDKs
31
+ SFMC,
32
+ CustomerIOSegment,
33
+ ZOHO_SDK,
34
+ GoogleAdsSDK,
35
+ CriteoAudience,
36
+
37
+ // Feature flags
38
+ featureFlagService,
39
+ FeatureFlagService,
40
+
41
+ // Network
42
+ createHttpClient,
43
+
44
+ // Utils
45
+ deepFreeze,
46
+ batchProcess,
47
+ } from '@rudderstack/integrations-lib';
48
+
49
+ // Initialize feature flags
50
+ await featureFlagService.initialize();
51
+
52
+ // Use SDKs
53
+ const sfmc = new SFMC(config);
54
+ const googleAds = new GoogleAdsSDK.GoogleAdsRestAPI(config);
55
+
56
+ // Structured logging
57
+ structuredLogger.info('Integration started', {
58
+ destinationId: 'dest-123',
59
+ workspaceId: 'ws-456',
60
+ });
61
+ ```
62
+
63
+ ## SDKs
64
+
65
+ - **SFMC**: Salesforce Marketing Cloud integration
66
+ - **Customer.io**: Customer.io audience management
67
+ - **Zoho**: Zoho CRM and marketing tools
68
+ - **Google Ads**: Google Ads REST API client
69
+ - **Criteo**: Criteo audience management
70
+
71
+ ## Feature Flags
72
+
73
+ Multi-provider feature flag system supporting:
74
+
75
+ - Flagsmith for production
76
+ - Local provider for development
77
+ - Environment-based overrides
78
+ - Type-safe flag definitions
79
+
80
+ ```typescript
81
+ const user = {
82
+ workspaceId: 'ws-123',
83
+ traits: new Map([
84
+ ['organization_id', 'org-456'],
85
+ ['user_id', 'user-789'],
86
+ ]),
87
+ };
88
+
89
+ const result = await featureFlagService.isFeatureEnabled(user, 'my-feature');
90
+ ```
91
+
92
+ ## Development
93
+
94
+ ```bash
95
+ # Install dependencies
96
+ npm install
97
+
98
+ # Build
99
+ npm run build
100
+
101
+ # Test
102
+ npm test
103
+
104
+ # Lint
105
+ npm run lint
106
+ ```
107
+
108
+ ## License
109
+
110
+ MIT
@@ -0,0 +1,62 @@
1
+ export type AmazonDestinationAuthSecretT = {
2
+ accessToken: string;
3
+ refreshToken: string;
4
+ clientId: string;
5
+ };
6
+ export type BingAdsDestinationAuthSecretT = {
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ developer_token: string;
10
+ expirationDate: string;
11
+ };
12
+ export type CriteoDestinationAuthSecretT = {
13
+ accessToken: string;
14
+ refreshToken: string;
15
+ };
16
+ export type GoogleAdwordsDestinationAuthSecretT = {
17
+ access_token: string;
18
+ refresh_token: string;
19
+ developer_token: string;
20
+ };
21
+ export type IntercomDestinationAuthSecretT = {
22
+ accessToken: string;
23
+ refreshToken: string;
24
+ };
25
+ export type LinkedinDestinationAuthSecretT = {
26
+ accessToken: string;
27
+ refreshToken: string;
28
+ expirationDate: string;
29
+ };
30
+ export type RedditDestinationAuthSecretT = {
31
+ accessToken: string;
32
+ refreshToken: string;
33
+ };
34
+ export type SalesforceDestinationAuthSecretT = {
35
+ access_token: string;
36
+ refresh_token: string;
37
+ instance_url: string;
38
+ };
39
+ export type SnapchatDestinationAuthSecretT = {
40
+ accessToken: string;
41
+ refreshToken: string;
42
+ };
43
+ export type TiktokAudienceDestinationAuthSecretT = {
44
+ accessToken: string;
45
+ advertiserIds: string;
46
+ };
47
+ export type TwitterAdsDestinationAuthSecretT = {
48
+ accessToken: string;
49
+ accessTokenSecret: string;
50
+ consumerKey: string;
51
+ consumerSecret: string;
52
+ };
53
+ export type YandexMetricaDestinationAuthSecretT = {
54
+ accessToken: string;
55
+ refreshToken: string;
56
+ expirationDate: string;
57
+ };
58
+ export type ZohoDestinationAuthSecretT = {
59
+ accessToken: string;
60
+ refreshToken: string;
61
+ };
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth-types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC10eXBlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQW1hem9uRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBCaW5nQWRzRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGRldmVsb3Blcl90b2tlbjogc3RyaW5nO1xuICBleHBpcmF0aW9uRGF0ZTogc3RyaW5nOyAvLyBJU08gODYwMSBmb3JtYXRcbn07XG5cbmV4cG9ydCB0eXBlIENyaXRlb0Rlc3RpbmF0aW9uQXV0aFNlY3JldFQgPSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgR29vZ2xlQWR3b3Jkc0Rlc3RpbmF0aW9uQXV0aFNlY3JldFQgPSB7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gIGRldmVsb3Blcl90b2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgSW50ZXJjb21EZXN0aW5hdGlvbkF1dGhTZWNyZXRUID0ge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIExpbmtlZGluRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGV4cGlyYXRpb25EYXRlOiBzdHJpbmc7IC8vIElTTyA4NjAxIGZvcm1hdFxufTtcblxuZXhwb3J0IHR5cGUgUmVkZGl0RGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYWxlc2ZvcmNlRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbiAgaW5zdGFuY2VfdXJsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTbmFwY2hhdERlc3RpbmF0aW9uQXV0aFNlY3JldFQgPSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGlrdG9rQXVkaWVuY2VEZXN0aW5hdGlvbkF1dGhTZWNyZXRUID0ge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhZHZlcnRpc2VySWRzOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUd2l0dGVyQWRzRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjZXNzVG9rZW5TZWNyZXQ6IHN0cmluZztcbiAgY29uc3VtZXJLZXk6IHN0cmluZztcbiAgY29uc3VtZXJTZWNyZXQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFlhbmRleE1ldHJpY2FEZXN0aW5hdGlvbkF1dGhTZWNyZXRUID0ge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgZXhwaXJhdGlvbkRhdGU6IHN0cmluZzsgLy8gSVNPIDg2MDEgZm9ybWF0XG59O1xuXG5leHBvcnQgdHlwZSBab2hvRGVzdGluYXRpb25BdXRoU2VjcmV0VCA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG59O1xuIl19
@@ -0,0 +1,14 @@
1
+ import type { FeatureFlagConfig, ResolvedFeatureFlagConfig } from '../types';
2
+ export declare class ConfigResolver {
3
+ static resolveConfig(config: Partial<FeatureFlagConfig>): ResolvedFeatureFlagConfig;
4
+ static initializeFlagsmithSDK(config: ResolvedFeatureFlagConfig): void;
5
+ private static getConfigValue;
6
+ private static parseBoolean;
7
+ private static parseNumber;
8
+ static parseEnvKey(envKey: string): {
9
+ prefix: string;
10
+ workspace?: string;
11
+ flag?: string;
12
+ };
13
+ }
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE7E,qBAAa,cAAc;IACzB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,yBAAyB;IA2CnF,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAuBtE,OAAO,CAAC,MAAM,CAAC,cAAc;IAsB7B,OAAO,CAAC,MAAM,CAAC,YAAY;IAW3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAY1B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;CA4C1F"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigResolver = void 0;
4
+ const featureflag_sdk_node_1 = require("@rudderstack/featureflag-sdk-node");
5
+ class ConfigResolver {
6
+ static resolveConfig(config) {
7
+ return {
8
+ provider: this.getConfigValue(config.provider, 'FEATURE_FLAG_PROVIDER', 'local'),
9
+ apiKey: this.getConfigValue(config.apiKey, 'FEATURE_FLAG_API_KEY', undefined),
10
+ enableLocalEvaluation: this.getConfigValue(config.enableLocalEvaluation, 'FEATURE_FLAG_ENABLE_LOCAL_EVALUATION', false, this.parseBoolean),
11
+ enableCache: this.getConfigValue(config.enableCache, 'FEATURE_FLAG_ENABLE_CACHE', true, this.parseBoolean),
12
+ cacheTtlSeconds: this.getConfigValue(config.cacheTtlSeconds, 'FEATURE_FLAG_CACHE_TTL_SECONDS', 60, this.parseNumber),
13
+ timeoutSeconds: this.getConfigValue(config.timeoutSeconds, 'FEATURE_FLAG_TIMEOUT_SECONDS', 60, this.parseNumber),
14
+ retryAttempts: this.getConfigValue(config.retryAttempts, 'FEATURE_FLAG_RETRY_ATTEMPTS', 3, this.parseNumber),
15
+ enableAnalytics: this.getConfigValue(config.enableAnalytics, 'FEATURE_FLAG_ENABLE_ANALYTICS', true, this.parseBoolean),
16
+ };
17
+ }
18
+ static initializeFlagsmithSDK(config) {
19
+ if (config.provider !== 'flagsmith' || !config.apiKey) {
20
+ throw new Error('API key is required for Flagsmith provider. Set it via config.apiKey or FEATURE_FLAG_API_KEY environment variable.');
21
+ }
22
+ (0, featureflag_sdk_node_1.initFeatureFlagClient)({
23
+ provider: {
24
+ type: 'flagsmith',
25
+ apiKey: config.apiKey,
26
+ timeoutInSeconds: config.timeoutSeconds,
27
+ retryAttempts: config.retryAttempts,
28
+ enableLocalEvaluation: config.enableLocalEvaluation,
29
+ enableAnalytics: config.enableAnalytics,
30
+ },
31
+ cache: {
32
+ enabled: config.enableCache,
33
+ ttlInSeconds: config.cacheTtlSeconds,
34
+ },
35
+ });
36
+ }
37
+ static getConfigValue(configValue, envKey, defaultValue, parser) {
38
+ const envValue = process.env[envKey];
39
+ if (envValue !== undefined) {
40
+ if (parser) {
41
+ try {
42
+ return parser(envValue);
43
+ }
44
+ catch {
45
+ // Fall back to config/default on parse error
46
+ }
47
+ }
48
+ else {
49
+ return envValue;
50
+ }
51
+ }
52
+ return configValue !== undefined ? configValue : defaultValue;
53
+ }
54
+ static parseBoolean(value) {
55
+ const lowerValue = value.toLowerCase().trim();
56
+ if (lowerValue === 'true' || lowerValue === '1' || lowerValue === 'yes') {
57
+ return true;
58
+ }
59
+ if (lowerValue === 'false' || lowerValue === '0' || lowerValue === 'no') {
60
+ return false;
61
+ }
62
+ throw new Error(`Invalid boolean value: "${value}"`);
63
+ }
64
+ static parseNumber(value) {
65
+ const numValue = Number(value.trim());
66
+ if (Number.isNaN(numValue)) {
67
+ throw new Error(`Invalid number value: "${value}"`);
68
+ }
69
+ return numValue;
70
+ }
71
+ // Utility for parsing environment variables
72
+ // Supports both patterns:
73
+ // - FEATURE_FLAG_LOCAL_ENABLE_FEATURE (global flag with single underscore)
74
+ // - FEATURE_FLAG_LOCAL__workspace123__API__TIMEOUT__MS (workspace flag with double underscore)
75
+ static parseEnvKey(envKey) {
76
+ // Check for workspace-specific pattern first (contains double underscore)
77
+ if (envKey.includes('__')) {
78
+ const parts = envKey.split('__');
79
+ if (parts.length < 3) {
80
+ throw new Error(`Invalid workspace environment key format: "${envKey}". Expected format: PREFIX__WORKSPACE__FLAG`);
81
+ }
82
+ const prefix = parts[0];
83
+ const workspace = parts[1];
84
+ const flag = parts.slice(2).join('__');
85
+ return {
86
+ prefix,
87
+ workspace,
88
+ flag,
89
+ };
90
+ }
91
+ // Global pattern (single underscore)
92
+ const underscoreIndex = envKey.indexOf('_');
93
+ if (underscoreIndex === -1) {
94
+ throw new Error(`Invalid environment key format: "${envKey}". Expected format: PREFIX_FLAG or PREFIX__WORKSPACE__FLAG`);
95
+ }
96
+ // Find the last part after the prefix
97
+ const prefixParts = envKey.split('_');
98
+ if (prefixParts.length < 4) {
99
+ throw new Error(`Invalid global environment key format: "${envKey}". Expected format: FEATURE_FLAG_LOCAL_FLAG`);
100
+ }
101
+ // For FEATURE_FLAG_LOCAL_FLAG_NAME, prefix is "FEATURE_FLAG_LOCAL", flag is "FLAG_NAME"
102
+ const prefix = prefixParts.slice(0, 3).join('_'); // FEATURE_FLAG_LOCAL
103
+ const flag = prefixParts.slice(3).join('_'); // Everything after
104
+ return {
105
+ prefix,
106
+ flag,
107
+ };
108
+ }
109
+ }
110
+ exports.ConfigResolver = ConfigResolver;
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvY29yZS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEVBQTBFO0FBRzFFLE1BQWEsY0FBYztJQUN6QixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWtDO1FBQ3JELE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQztZQUNoRixNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQztZQUM3RSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUN4QyxNQUFNLENBQUMscUJBQXFCLEVBQzVCLHNDQUFzQyxFQUN0QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFlBQVksQ0FDbEI7WUFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDOUIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsMkJBQTJCLEVBQzNCLElBQUksRUFDSixJQUFJLENBQUMsWUFBWSxDQUNsQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNsQyxNQUFNLENBQUMsZUFBZSxFQUN0QixnQ0FBZ0MsRUFDaEMsRUFBRSxFQUNGLElBQUksQ0FBQyxXQUFXLENBQ2pCO1lBQ0QsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQ2pDLE1BQU0sQ0FBQyxjQUFjLEVBQ3JCLDhCQUE4QixFQUM5QixFQUFFLEVBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FDakI7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDaEMsTUFBTSxDQUFDLGFBQWEsRUFDcEIsNkJBQTZCLEVBQzdCLENBQUMsRUFDRCxJQUFJLENBQUMsV0FBVyxDQUNqQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNs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SSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBRWhFLE9BQU87WUFDTCxNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1SkQsd0NBNEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdEZlYXR1cmVGbGFnQ2xpZW50IH0gZnJvbSAnQHJ1ZGRlcnN0YWNrL2ZlYXR1cmVmbGFnLXNkay1ub2RlJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdDb25maWcsIFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdSZXNvbHZlciB7XG4gIHN0YXRpYyByZXNvbHZlQ29uZmlnKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4pOiBSZXNvbHZlZEZlYXR1cmVGbGFnQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXI6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLnByb3ZpZGVyLCAnRkVBVFVSRV9GTEFHX1BST1ZJREVSJywgJ2xvY2FsJyksXG4gICAgICBhcGlLZXk6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLmFwaUtleSwgJ0ZFQVRVUkVfRkxBR19BUElfS0VZJywgdW5kZWZpbmVkKSxcbiAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfTE9DQUxfRVZBTFVBVElPTicsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBhcnNlQm9vbGVhbixcbiAgICAgICksXG4gICAgICBlbmFibGVDYWNoZTogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUNhY2hlLFxuICAgICAgICAnRkVBVFVSRV9GTEFHX0VOQUJMRV9DQUNIRScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRoaXMucGFyc2VCb29sZWFuLFxuICAgICAgKSxcbiAgICAgIGNhY2hlVHRsU2Vjb25kczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmNhY2hlVHRsU2Vjb25kcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19DQUNIRV9UVExfU0VDT05EUycsXG4gICAgICAgIDYwLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aGlzLmdldENvbmZpZ1ZhbHVlKFxuICAgICAgICBjb25maWcudGltZW91dFNlY29uZHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfVElNRU9VVF9TRUNPTkRTJyxcbiAgICAgICAgNjAsXG4gICAgICAgIHRoaXMucGFyc2VOdW1iZXIsXG4gICAgICApLFxuICAgICAgcmV0cnlBdHRlbXB0czogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfUkVUUllfQVRURU1QVFMnLFxuICAgICAgICAzLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZUFuYWx5dGljczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUFuYWx5dGljcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfQU5BTFlUSUNTJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5wYXJzZUJvb2xlYW4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbGl6ZUZsYWdzbWl0aFNESyhjb25maWc6IFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnLnByb3ZpZGVyICE9PSAnZmxhZ3NtaXRoJyB8fCAhY29uZmlnLmFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQVBJIGtleSBpcyByZXF1aXJlZCBmb3IgRmxhZ3NtaXRoIHByb3ZpZGVyLiBTZXQgaXQgdmlhIGNvbmZpZy5hcGlLZXkgb3IgRkVBVFVSRV9GTEFHX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaW5pdEZlYXR1cmVGbGFnQ2xpZW50KHtcbiAgICAgIHByb3ZpZGVyOiB7XG4gICAgICAgIHR5cGU6ICdmbGFnc21pdGgnLFxuICAgICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHM6IGNvbmZpZy50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgZW5hYmxlQW5hbHl0aWNzOiBjb25maWcuZW5hYmxlQW5hbHl0aWNzLFxuICAgICAgfSxcbiAgICAgIGNhY2hlOiB7XG4gICAgICAgIGVuYWJsZWQ6IGNvbmZpZy5lbmFibGVDYWNoZSxcbiAgICAgICAgdHRsSW5TZWNvbmRzOiBjb25maWcuY2FjaGVUdGxTZWNvbmRzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENvbmZpZ1ZhbHVlPFQ+KFxuICAgIGNvbmZpZ1ZhbHVlOiBUIHwgdW5kZWZpbmVkLFxuICAgIGVudktleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCxcbiAgICBwYXJzZXI/OiAodmFsdWU6IHN0cmluZykgPT4gVCxcbiAgKTogVCB7XG4gICAgY29uc3QgZW52VmFsdWUgPSBwcm9jZXNzLmVudltlbnZLZXldO1xuICAgIGlmIChlbnZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGFyc2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlcihlbnZWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBjb25maWcvZGVmYXVsdCBvbiBwYXJzZSBlcnJvclxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW52VmFsdWUgYXMgVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnVmFsdWUgIT09IHVuZGVmaW5lZCA/IGNvbmZpZ1ZhbHVlIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGxvd2VyVmFsdWUgPT09ICd0cnVlJyB8fCBsb3dlclZhbHVlID09PSAnMScgfHwgbG93ZXJWYWx1ZSA9PT0gJ3llcycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobG93ZXJWYWx1ZSA9PT0gJ2ZhbHNlJyB8fCBsb3dlclZhbHVlID09PSAnMCcgfHwgbG93ZXJWYWx1ZSA9PT0gJ25vJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYm9vbGVhbiB2YWx1ZTogXCIke3ZhbHVlfVwiYCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IE51bWJlcih2YWx1ZS50cmltKCkpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIHZhbHVlOiBcIiR7dmFsdWV9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bVZhbHVlO1xuICB9XG5cbiAgLy8gVXRpbGl0eSBmb3IgcGFyc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgLy8gU3VwcG9ydHMgYm90aCBwYXR0ZXJuczpcbiAgLy8gLSBGRUFUVVJFX0ZMQUdfTE9DQUxfRU5BQkxFX0ZFQVRVUkUgKGdsb2JhbCBmbGFnIHdpdGggc2luZ2xlIHVuZGVyc2NvcmUpXG4gIC8vIC0gRkVBVFVSRV9GTEFHX0xPQ0FMX193b3Jrc3BhY2UxMjNfX0FQSV9fVElNRU9VVF9fTVMgKHdvcmtzcGFjZSBmbGFnIHdpdGggZG91YmxlIHVuZGVyc2NvcmUpXG4gIHN0YXRpYyBwYXJzZUVudktleShlbnZLZXk6IHN0cmluZyk6IHsgcHJlZml4OiBzdHJpbmc7IHdvcmtzcGFjZT86IHN0cmluZzsgZmxhZz86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBmb3Igd29ya3NwYWNlLXNwZWNpZmljIHBhdHRlcm4gZmlyc3QgKGNvbnRhaW5zIGRvdWJsZSB1bmRlcnNjb3JlKVxuICAgIGlmIChlbnZLZXkuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZW52S2V5LnNwbGl0KCdfXycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHdvcmtzcGFjZSBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZWZpeCA9IHBhcnRzWzBdO1xuICAgICAgY29uc3Qgd29ya3NwYWNlID0gcGFydHNbMV07XG4gICAgICBjb25zdCBmbGFnID0gcGFydHMuc2xpY2UoMikuam9pbignX18nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgd29ya3NwYWNlLFxuICAgICAgICBmbGFnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgcGF0dGVybiAoc2luZ2xlIHVuZGVyc2NvcmUpXG4gICAgY29uc3QgdW5kZXJzY29yZUluZGV4ID0gZW52S2V5LmluZGV4T2YoJ18nKTtcbiAgICBpZiAodW5kZXJzY29yZUluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9GTEFHIG9yIFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgbGFzdCBwYXJ0IGFmdGVyIHRoZSBwcmVmaXhcbiAgICBjb25zdCBwcmVmaXhQYXJ0cyA9IGVudktleS5zcGxpdCgnXycpO1xuICAgIGlmIChwcmVmaXhQYXJ0cy5sZW5ndGggPCA0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdsb2JhbCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHX05BTUUsIHByZWZpeCBpcyBcIkZFQVRVUkVfRkxBR19MT0NBTFwiLCBmbGFnIGlzIFwiRkxBR19OQU1FXCJcbiAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhQYXJ0cy5zbGljZSgwLCAzKS5qb2luKCdfJyk7IC8vIEZFQVRVUkVfRkxBR19MT0NBTFxuICAgIGNvbnN0IGZsYWcgPSBwcmVmaXhQYXJ0cy5zbGljZSgzKS5qb2luKCdfJyk7IC8vIEV2ZXJ5dGhpbmcgYWZ0ZXJcblxuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXgsXG4gICAgICBmbGFnLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export { FeatureFlagService } from './service';
2
+ export { ConfigResolver } from './config';
3
+ export { FeatureFlagUtils } from './utils';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FeatureFlagUtils = exports.ConfigResolver = exports.FeatureFlagService = void 0;
4
+ var service_1 = require("./service");
5
+ Object.defineProperty(exports, "FeatureFlagService", { enumerable: true, get: function () { return service_1.FeatureFlagService; } });
6
+ var config_1 = require("./config");
7
+ Object.defineProperty(exports, "ConfigResolver", { enumerable: true, get: function () { return config_1.ConfigResolver; } });
8
+ var utils_1 = require("./utils");
9
+ Object.defineProperty(exports, "FeatureFlagUtils", { enumerable: true, get: function () { return utils_1.FeatureFlagUtils; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9jb3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUErQztBQUF0Qyw2R0FBQSxrQkFBa0IsT0FBQTtBQUMzQixtQ0FBMEM7QUFBakMsd0dBQUEsY0FBYyxPQUFBO0FBQ3ZCLGlDQUEyQztBQUFsQyx5R0FBQSxnQkFBZ0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZlYXR1cmVGbGFnU2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XG5leHBvcnQgeyBDb25maWdSZXNvbHZlciB9IGZyb20gJy4vY29uZmlnJztcbmV4cG9ydCB7IEZlYXR1cmVGbGFnVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import type { FeatureFlagConfig, FeatureFlagUser, FeatureFlagResponse, FeatureFlagDefinition, IFeatureFlagService, IFeatureFlagRegistry } from '../types';
2
+ import { ErrorBehaviour } from '../types';
3
+ export declare class FeatureFlagService implements IFeatureFlagService {
4
+ private provider;
5
+ private flagRegistry;
6
+ constructor(registry?: IFeatureFlagRegistry);
7
+ static create(config?: Partial<FeatureFlagConfig>, flags?: FeatureFlagDefinition[]): Promise<FeatureFlagService>;
8
+ static create(config?: Partial<FeatureFlagConfig>, registry?: IFeatureFlagRegistry): Promise<FeatureFlagService>;
9
+ initialize(config?: Partial<FeatureFlagConfig>): Promise<void>;
10
+ isFeatureEnabled(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
11
+ isFeatureEnabledLatest(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
12
+ getFeatureValue(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
13
+ getFeatureValueLatest(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
14
+ registerFlags(flags: FeatureFlagDefinition[]): void;
15
+ getRegisteredFlag(key: string): FeatureFlagDefinition | undefined;
16
+ private processProviderResult;
17
+ private createDefaultResponse;
18
+ }
19
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EAEnB,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,OAAO,CAAC,QAAQ,CAAqC;IAErD,OAAO,CAAC,YAAY,CAAuB;gBAE/B,QAAQ,CAAC,EAAE,oBAAoB;WAOvB,MAAM,CACxB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,KAAK,CAAC,EAAE,qBAAqB,EAAE,GAC9B,OAAO,CAAC,kBAAkB,CAAC;WACV,MAAM,CACxB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAyBjB,UAAU,CAAC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,gBAAgB,CAC3B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,sBAAsB,CACjC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,eAAe,CAC1B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,qBAAqB,CAChC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAMxB,aAAa,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,IAAI;IAInD,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIxE,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,qBAAqB;CAU9B"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FeatureFlagService = void 0;
4
+ const types_1 = require("../types");
5
+ const registry_1 = require("../flags/registry");
6
+ const factory_1 = require("../providers/factory");
7
+ const config_1 = require("./config");
8
+ const defaults_1 = require("../flags/defaults");
9
+ class FeatureFlagService {
10
+ constructor(registry) {
11
+ this.provider = null;
12
+ this.flagRegistry = registry || new registry_1.FeatureFlagRegistry();
13
+ // Load default flags
14
+ this.flagRegistry.register(defaults_1.DEFAULT_FLAGS);
15
+ }
16
+ static async create(config = {}, flagsOrRegistry) {
17
+ let registry;
18
+ if (flagsOrRegistry) {
19
+ // Check if it's a registry (has register method) or flag definitions array
20
+ if (Array.isArray(flagsOrRegistry)) {
21
+ // It's an array of flag definitions
22
+ registry = new registry_1.FeatureFlagRegistry();
23
+ registry.register(flagsOrRegistry);
24
+ }
25
+ else {
26
+ // It's a registry instance
27
+ registry = flagsOrRegistry;
28
+ }
29
+ }
30
+ const service = new FeatureFlagService(registry);
31
+ await service.initialize(config);
32
+ return service;
33
+ }
34
+ // Strategy Pattern: Initialize provider once, use polymorphism
35
+ async initialize(config = {}) {
36
+ const resolvedConfig = config_1.ConfigResolver.resolveConfig(config);
37
+ // Factory creates the appropriate provider - NO CONDITIONALS
38
+ const factory = new factory_1.FeatureFlagProviderFactory(this.flagRegistry);
39
+ this.provider = factory.create(resolvedConfig);
40
+ // Initialize the provider
41
+ await this.provider.initialize();
42
+ }
43
+ async isFeatureEnabled(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
44
+ const providerResult = await this.provider.isFeatureEnabled(user, flagName);
45
+ return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
46
+ }
47
+ async isFeatureEnabledLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
48
+ const providerResult = await this.provider.isFeatureEnabledLatest(user, flagName);
49
+ return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
50
+ }
51
+ async getFeatureValue(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
52
+ const providerResult = await this.provider.getFeatureValue(user, flagName);
53
+ return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
54
+ }
55
+ async getFeatureValueLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
56
+ const providerResult = await this.provider.getFeatureValueLatest(user, flagName);
57
+ return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
58
+ }
59
+ // Registry methods
60
+ registerFlags(flags) {
61
+ this.flagRegistry.register(flags);
62
+ }
63
+ getRegisteredFlag(key) {
64
+ return this.flagRegistry.get(key);
65
+ }
66
+ processProviderResult(providerResult, flagName, onErrorBehaviour) {
67
+ if (providerResult.error) {
68
+ switch (onErrorBehaviour) {
69
+ case types_1.ErrorBehaviour.THROW_ERROR:
70
+ throw providerResult.error;
71
+ case types_1.ErrorBehaviour.RETURN_RICH_ERROR:
72
+ // Return the rich error response as-is with isDefault = false
73
+ return {
74
+ ...providerResult,
75
+ isDefault: false,
76
+ };
77
+ case types_1.ErrorBehaviour.RETURN_DEFAULT:
78
+ // Return default value from registry
79
+ return this.createDefaultResponse(flagName, providerResult);
80
+ default:
81
+ // Default to RETURN_RICH_ERROR behavior
82
+ return {
83
+ ...providerResult,
84
+ isDefault: false,
85
+ };
86
+ }
87
+ }
88
+ // Success case - pass through rich provider data
89
+ return {
90
+ ...providerResult,
91
+ isDefault: false,
92
+ };
93
+ }
94
+ createDefaultResponse(flagName, errorResult) {
95
+ const defaultValue = this.flagRegistry.getDefaultValue(flagName);
96
+ return {
97
+ name: flagName,
98
+ enabled: typeof defaultValue === 'boolean' ? defaultValue : Boolean(defaultValue),
99
+ value: defaultValue,
100
+ error: errorResult.error,
101
+ isDefault: true,
102
+ };
103
+ }
104
+ }
105
+ exports.FeatureFlagService = FeatureFlagService;
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlLWZsYWdzL2NvcmUvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxvQ0FBMEM7QUFDMUMsZ0RBQXdEO0FBQ3hELGtEQUFrRTtBQUNsRSxxQ0FBMEM7QUFDMUMsZ0RBQWtEO0FBRWxELE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksUUFBK0I7UUFKbkMsYUFBUSxHQUFnQyxJQUFJLENBQUM7UUFLbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLElBQUksSUFBSSw4QkFBbUIsRUFBRSxDQUFDO1FBQzFELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3QkFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVdNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN4QixTQUFxQyxFQUFFLEVBQ3ZDLGVBQWdFO1FBRWhFLElBQUksUUFBMEMsQ0FBQztRQUUvQyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLDJFQUEyRTtZQUMzRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsb0NBQW9DO2dCQUNwQyxRQUFRLEdBQUcsSUFBSSw4QkFBbUIsRUFBRSxDQUFDO2dCQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwyQkFBMkI7Z0JBQzNCLFFBQVEsR0FBRyxlQUFlLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsK0RBQStEO0lBQ3hELEtBQUssQ0FBQyxV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QyxDQUFDO2dCQUU5RDtvQkFDRSx3Q0FBd0M7b0JBQ3hDLE9BQU87d0JBQ0wsR0FBRyxjQUFjO3dCQUNqQixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU87WUFDTCxHQUFHLGNBQWM7WUFDakIsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLFdBQXlCO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxPQUFPLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNqRixLQUFLLEVBQUUsWUFBWTtZQUNuQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7WUFDeEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5KRCxnREFtSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ1VzZXIsXG4gIEZlYXR1cmVGbGFnUmVzcG9uc2UsXG4gIEZlYXR1cmVGbGFnRGVmaW5pdGlvbixcbiAgSUZlYXR1cmVGbGFnU2VydmljZSxcbiAgSUZlYXR1cmVGbGFnUHJvdmlkZXIsXG4gIElGZWF0dXJlRmxhZ1JlZ2lzdHJ5LFxuICBGZWF0dXJlVmFsdWUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yQmVoYXZpb3VyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWdSZWdpc3RyeSB9IGZyb20gJy4uL2ZsYWdzL3JlZ2lzdHJ5JztcbmltcG9ydCB7IEZlYXR1cmVGbGFnUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi4vcHJvdmlkZXJzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29uZmlnUmVzb2x2ZXIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBERUZBVUxUX0ZMQUdTIH0gZnJvbSAnLi4vZmxhZ3MvZGVmYXVsdHMnO1xuXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWdTZXJ2aWNlIGltcGxlbWVudHMgSUZlYXR1cmVGbGFnU2VydmljZSB7XG4gIHByaXZhdGUgcHJvdmlkZXI6IElGZWF0dXJlRmxhZ1Byb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBmbGFnUmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5PzogSUZlYXR1cmVGbGFnUmVnaXN0cnkpIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHJlZ2lzdHJ5IHx8IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgLy8gTG9hZCBkZWZhdWx0IGZsYWdzXG4gICAgdGhpcy5mbGFnUmVnaXN0cnkucmVnaXN0ZXIoREVGQVVMVF9GTEFHUyk7XG4gIH1cblxuICAvLyBGYWN0b3J5IG1ldGhvZCBvdmVybG9hZHM6IENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBzZXJ2aWNlIGluIG9uZSBzdGVwXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIGNvbmZpZz86IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+LFxuICAgIGZsYWdzPzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10sXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdTZXJ2aWNlPjtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgY29uZmlnPzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4sXG4gICAgcmVnaXN0cnk/OiBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+O1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICBjb25maWc6IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+ID0ge30sXG4gICAgZmxhZ3NPclJlZ2lzdHJ5PzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10gfCBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+IHtcbiAgICBsZXQgcmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZsYWdzT3JSZWdpc3RyeSkge1xuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlZ2lzdHJ5IChoYXMgcmVnaXN0ZXIgbWV0aG9kKSBvciBmbGFnIGRlZmluaXRpb25zIGFycmF5XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmbGFnc09yUmVnaXN0cnkpKSB7XG4gICAgICAgIC8vIEl0J3MgYW4gYXJyYXkgb2YgZmxhZyBkZWZpbml0aW9uc1xuICAgICAgICByZWdpc3RyeSA9IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKGZsYWdzT3JSZWdpc3RyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGEgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICAgICAgcmVnaXN0cnkgPSBmbGFnc09yUmVnaXN0cnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyBGZWF0dXJlRmxhZ1NlcnZpY2UocmVnaXN0cnkpO1xuICAgIGF3YWl0IHNlcnZpY2UuaW5pdGlhbGl6ZShjb25maWcpO1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgUGF0dGVybjogSW5pdGlhbGl6ZSBwcm92aWRlciBvbmNlLCB1c2UgcG9seW1vcnBoaXNtXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gQ29uZmlnUmVzb2x2ZXIucmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gRmFjdG9yeSBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBwcm92aWRlciAtIE5PIENPTkRJVElPTkFMU1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgRmVhdHVyZUZsYWdQcm92aWRlckZhY3RvcnkodGhpcy5mbGFnUmVnaXN0cnkpO1xuICAgIHRoaXMucHJvdmlkZXIgPSBmYWN0b3J5LmNyZWF0ZShyZXNvbHZlZENvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwcm92aWRlclxuICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzRmVhdHVyZUVuYWJsZWQoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5pc0ZlYXR1cmVFbmFibGVkKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc0ZlYXR1cmVFbmFibGVkTGF0ZXN0KFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuaXNGZWF0dXJlRW5hYmxlZExhdGVzdCh1c2VyLCBmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KHByb3ZpZGVyUmVzdWx0LCBmbGFnTmFtZSwgb25FcnJvckJlaGF2aW91cik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RmVhdHVyZVZhbHVlKFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuZ2V0RmVhdHVyZVZhbHVlKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGZWF0dXJlVmFsdWVMYXRlc3QoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5nZXRGZWF0dXJlVmFsdWVMYXRlc3QodXNlciwgZmxhZ05hbWUpO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NQcm92aWRlclJlc3VsdChwcm92aWRlclJlc3VsdCwgZmxhZ05hbWUsIG9uRXJyb3JCZWhhdmlvdXIpO1xuICB9XG5cbiAgLy8gUmVnaXN0cnkgbWV0aG9kc1xuICBwdWJsaWMgcmVnaXN0ZXJGbGFncyhmbGFnczogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeS5yZWdpc3RlcihmbGFncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVnaXN0ZXJlZEZsYWcoa2V5OiBzdHJpbmcpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeS5nZXQoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KFxuICAgIHByb3ZpZGVyUmVzdWx0OiBGZWF0dXJlVmFsdWUsXG4gICAgZmxhZ05hbWU6IHN0cmluZyxcbiAgICBvbkVycm9yQmVoYXZpb3VyOiBFcnJvckJlaGF2aW91cixcbiAgKTogRmVhdHVyZUZsYWdSZXNwb25zZSB7XG4gICAgaWYgKHByb3ZpZGVyUmVzdWx0LmVycm9yKSB7XG4gICAgICBzd2l0Y2ggKG9uRXJyb3JCZWhhdmlvdXIpIHtcbiAgICAgICAgY2FzZSBFcnJvckJlaGF2aW91ci5USFJPV19FUlJPUjpcbiAgICAgICAgICB0aHJvdyBwcm92aWRlclJlc3VsdC5lcnJvcjtcblxuICAgICAgICBjYXNlIEVycm9yQmVoYXZpb3VyLlJFVFVSTl9SSUNIX0VSUk9SOlxuICAgICAgICAgIC8vIFJldHVybiB0aGUgcmljaCBlcnJvciByZXNwb25zZSBhcy1pcyB3aXRoIGlzRGVmYXVsdCA9IGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgRXJyb3JCZWhhdmlvdXIuUkVUVVJOX0RFRkFVTFQ6XG4gICAgICAgICAgLy8gUmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSByZWdpc3RyeVxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURlZmF1bHRSZXNwb25zZShmbGFnTmFtZSwgcHJvdmlkZXJSZXN1bHQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRGVmYXVsdCB0byBSRVRVUk5fUklDSF9FUlJPUiBiZWhhdmlvclxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcm92aWRlclJlc3VsdCxcbiAgICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdWNjZXNzIGNhc2UgLSBwYXNzIHRocm91Z2ggcmljaCBwcm92aWRlciBkYXRhXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UmVzcG9uc2UoZmxhZ05hbWU6IHN0cmluZywgZXJyb3JSZXN1bHQ6IEZlYXR1cmVWYWx1ZSk6IEZlYXR1cmVGbGFnUmVzcG9uc2Uge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZmxhZ1JlZ2lzdHJ5LmdldERlZmF1bHRWYWx1ZShmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZsYWdOYW1lLFxuICAgICAgZW5hYmxlZDogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nID8gZGVmYXVsdFZhbHVlIDogQm9vbGVhbihkZWZhdWx0VmFsdWUpLFxuICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVycm9yOiBlcnJvclJlc3VsdC5lcnJvcixcbiAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ import type { FeatureFlagDefinition } from '../types';
2
+ export declare class FeatureFlagUtils {
3
+ static normalizeKey(key: string): string;
4
+ static validateDefinition(definition: FeatureFlagDefinition): void;
5
+ static createWorkspaceEnvKey(flagName: string, workspaceId: string): string;
6
+ static createGlobalEnvKey(flagName: string): string;
7
+ }
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIxC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IA0BlE,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAK3E,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAIpD"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FeatureFlagUtils = void 0;
4
+ class FeatureFlagUtils {
5
+ static normalizeKey(key) {
6
+ return key.toLowerCase().replace(/[^a-z0-9-_]/g, '-');
7
+ }
8
+ static validateDefinition(definition) {
9
+ if (!definition.key || typeof definition.key !== 'string') {
10
+ throw new Error('Flag definition must have a valid key');
11
+ }
12
+ if (!definition.name || typeof definition.name !== 'string') {
13
+ throw new Error('Flag definition must have a valid name');
14
+ }
15
+ if (!definition.description || typeof definition.description !== 'string') {
16
+ throw new Error('Flag definition must have a valid description');
17
+ }
18
+ if (definition.defaultValue === undefined) {
19
+ throw new Error('Flag definition must have a defaultValue');
20
+ }
21
+ if (!['boolean', 'string', 'number'].includes(definition.type)) {
22
+ throw new Error('Flag definition type must be boolean, string, or number');
23
+ }
24
+ // Validate defaultValue matches type
25
+ const actualType = typeof definition.defaultValue;
26
+ if (actualType !== definition.type) {
27
+ throw new Error(`Flag defaultValue type (${actualType}) does not match declared type (${definition.type})`);
28
+ }
29
+ }
30
+ static createWorkspaceEnvKey(flagName, workspaceId) {
31
+ const normalizedFlag = flagName.toUpperCase().replace(/-/g, '_');
32
+ return `FEATURE_FLAG_LOCAL__${workspaceId}__${normalizedFlag}`;
33
+ }
34
+ static createGlobalEnvKey(flagName) {
35
+ const normalizedFlag = flagName.toUpperCase().replace(/-/g, '_');
36
+ return `FEATURE_FLAG_LOCAL_${normalizedFlag}`;
37
+ }
38
+ }
39
+ exports.FeatureFlagUtils = FeatureFlagUtils;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9jb3JlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBVztRQUM3QixPQUFPLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBaUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksT0FBTyxVQUFVLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ2xELElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLDJCQUEyQixVQUFVLG1DQUFtQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQzNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sdUJBQXVCLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sc0JBQXNCLGNBQWMsRUFBRSxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQXhDRCw0Q0F3Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnRGVmaW5pdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnVXRpbHMge1xuICBzdGF0aWMgbm9ybWFsaXplS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktX10vZywgJy0nKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZURlZmluaXRpb24oZGVmaW5pdGlvbjogRmVhdHVyZUZsYWdEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFkZWZpbml0aW9uLmtleSB8fCB0eXBlb2YgZGVmaW5pdGlvbi5rZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYWcgZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSB2YWxpZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uLm5hbWUgfHwgdHlwZW9mIGRlZmluaXRpb24ubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxhZyBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uLmRlc2NyaXB0aW9uIHx8IHR5cGVvZiBkZWZpbml0aW9uLmRlc2NyaXB0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFnIGRlZmluaXRpb24gbXVzdCBoYXZlIGEgdmFsaWQgZGVzY3JpcHRpb24nKTtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxhZyBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGRlZmF1bHRWYWx1ZScpO1xuICAgIH1cbiAgICBpZiAoIVsnYm9vbGVhbicsICdzdHJpbmcnLCAnbnVtYmVyJ10uaW5jbHVkZXMoZGVmaW5pdGlvbi50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFnIGRlZmluaXRpb24gdHlwZSBtdXN0IGJlIGJvb2xlYW4sIHN0cmluZywgb3IgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGVmYXVsdFZhbHVlIG1hdGNoZXMgdHlwZVxuICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKGFjdHVhbFR5cGUgIT09IGRlZmluaXRpb24udHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmxhZyBkZWZhdWx0VmFsdWUgdHlwZSAoJHthY3R1YWxUeXBlfSkgZG9lcyBub3QgbWF0Y2ggZGVjbGFyZWQgdHlwZSAoJHtkZWZpbml0aW9uLnR5cGV9KWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVXb3Jrc3BhY2VFbnZLZXkoZmxhZ05hbWU6IHN0cmluZywgd29ya3NwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZsYWcgPSBmbGFnTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKTtcbiAgICByZXR1cm4gYEZFQVRVUkVfRkxBR19MT0NBTF9fJHt3b3Jrc3BhY2VJZH1fXyR7bm9ybWFsaXplZEZsYWd9YDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVHbG9iYWxFbnZLZXkoZmxhZ05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZsYWcgPSBmbGFnTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKTtcbiAgICByZXR1cm4gYEZFQVRVUkVfRkxBR19MT0NBTF8ke25vcm1hbGl6ZWRGbGFnfWA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { FeatureFlagDefinition } from '../types';
2
+ export declare const DEFAULT_FLAGS: FeatureFlagDefinition[];
3
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/flags/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,eAAO,MAAM,aAAa,EAAE,qBAAqB,EAmBhD,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_FLAGS = void 0;
4
+ exports.DEFAULT_FLAGS = [
5
+ {
6
+ key: 'enable-test-flag',
7
+ name: 'Test Flag',
8
+ description: 'A test flag for development and testing purposes',
9
+ defaultValue: false,
10
+ type: 'boolean',
11
+ category: 'testing',
12
+ tags: ['test', 'development'],
13
+ },
14
+ {
15
+ key: 'enable-test-flag-with-value',
16
+ name: 'Test Flag with Value',
17
+ description: 'A test flag that returns a value for testing purposes',
18
+ defaultValue: 'test-value',
19
+ type: 'string',
20
+ category: 'testing',
21
+ tags: ['test', 'development'],
22
+ },
23
+ ];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9mbGFncy9kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLGFBQWEsR0FBNEI7SUFDcEQ7UUFDRSxHQUFHLEVBQUUsa0JBQWtCO1FBQ3ZCLElBQUksRUFBRSxXQUFXO1FBQ2pCLFdBQVcsRUFBRSxrREFBa0Q7UUFDL0QsWUFBWSxFQUFFLEtBQUs7UUFDbkIsSUFBSSxFQUFFLFNBQVM7UUFDZixRQUFRLEVBQUUsU0FBUztRQUNuQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0tBQzlCO0lBQ0Q7UUFDRSxHQUFHLEVBQUUsNkJBQTZCO1FBQ2xDLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsV0FBVyxFQUFFLHVEQUF1RDtRQUNwRSxZQUFZLEVBQUUsWUFBWTtRQUMxQixJQUFJLEVBQUUsUUFBUTtRQUNkLFFBQVEsRUFBRSxTQUFTO1FBQ25CLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7S0FDOUI7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ0RlZmluaXRpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZMQUdTOiBGZWF0dXJlRmxhZ0RlZmluaXRpb25bXSA9IFtcbiAge1xuICAgIGtleTogJ2VuYWJsZS10ZXN0LWZsYWcnLFxuICAgIG5hbWU6ICdUZXN0IEZsYWcnLFxuICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGZsYWcgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzJyxcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBjYXRlZ29yeTogJ3Rlc3RpbmcnLFxuICAgIHRhZ3M6IFsndGVzdCcsICdkZXZlbG9wbWVudCddLFxuICB9LFxuICB7XG4gICAga2V5OiAnZW5hYmxlLXRlc3QtZmxhZy13aXRoLXZhbHVlJyxcbiAgICBuYW1lOiAnVGVzdCBGbGFnIHdpdGggVmFsdWUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGZsYWcgdGhhdCByZXR1cm5zIGEgdmFsdWUgZm9yIHRlc3RpbmcgcHVycG9zZXMnLFxuICAgIGRlZmF1bHRWYWx1ZTogJ3Rlc3QtdmFsdWUnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNhdGVnb3J5OiAndGVzdGluZycsXG4gICAgdGFnczogWyd0ZXN0JywgJ2RldmVsb3BtZW50J10sXG4gIH0sXG5dO1xuIl19
@@ -0,0 +1,5 @@
1
+ export { FeatureFlagRegistry } from './registry';
2
+ export { FeatureFlagLoader } from './loader';
3
+ export { DEFAULT_FLAGS } from './defaults';
4
+ export type { IFeatureFlagRegistry } from './interfaces';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_FLAGS = exports.FeatureFlagLoader = exports.FeatureFlagRegistry = void 0;
4
+ var registry_1 = require("./registry");
5
+ Object.defineProperty(exports, "FeatureFlagRegistry", { enumerable: true, get: function () { return registry_1.FeatureFlagRegistry; } });
6
+ var loader_1 = require("./loader");
7
+ Object.defineProperty(exports, "FeatureFlagLoader", { enumerable: true, get: function () { return loader_1.FeatureFlagLoader; } });
8
+ var defaults_1 = require("./defaults");
9
+ Object.defineProperty(exports, "DEFAULT_FLAGS", { enumerable: true, get: function () { return defaults_1.DEFAULT_FLAGS; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9mbGFncy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFDNUIsbUNBQTZDO0FBQXBDLDJHQUFBLGlCQUFpQixPQUFBO0FBQzFCLHVDQUEyQztBQUFsQyx5R0FBQSxhQUFhLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeSc7XG5leHBvcnQgeyBGZWF0dXJlRmxhZ0xvYWRlciB9IGZyb20gJy4vbG9hZGVyJztcbmV4cG9ydCB7IERFRkFVTFRfRkxBR1MgfSBmcm9tICcuL2RlZmF1bHRzJztcbmV4cG9ydCB0eXBlIHsgSUZlYXR1cmVGbGFnUmVnaXN0cnkgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuIl19