@rudderstack/integrations-lib 0.2.43 → 0.2.44
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/build/feature-flags/core/config.d.ts +14 -0
- package/build/feature-flags/core/config.d.ts.map +1 -0
- package/build/feature-flags/core/config.js +111 -0
- package/build/feature-flags/core/index.d.ts +4 -0
- package/build/feature-flags/core/index.d.ts.map +1 -0
- package/build/feature-flags/core/index.js +10 -0
- package/build/feature-flags/core/service.d.ts +19 -0
- package/build/feature-flags/core/service.d.ts.map +1 -0
- package/build/feature-flags/core/service.js +106 -0
- package/build/feature-flags/core/utils.d.ts +8 -0
- package/build/feature-flags/core/utils.d.ts.map +1 -0
- package/build/feature-flags/core/utils.js +40 -0
- package/build/feature-flags/flags/defaults.d.ts +3 -0
- package/build/feature-flags/flags/defaults.d.ts.map +1 -0
- package/build/feature-flags/flags/defaults.js +24 -0
- package/build/feature-flags/flags/index.d.ts +5 -0
- package/build/feature-flags/flags/index.d.ts.map +1 -0
- package/build/feature-flags/flags/index.js +10 -0
- package/build/feature-flags/flags/interfaces.d.ts +12 -0
- package/build/feature-flags/flags/interfaces.d.ts.map +1 -0
- package/build/feature-flags/flags/interfaces.js +3 -0
- package/build/feature-flags/flags/loader.d.ts +14 -0
- package/build/feature-flags/flags/loader.d.ts.map +1 -0
- package/build/feature-flags/flags/loader.js +37 -0
- package/build/feature-flags/flags/registry.d.ts +12 -0
- package/build/feature-flags/flags/registry.d.ts.map +1 -0
- package/build/feature-flags/flags/registry.js +38 -0
- package/build/feature-flags/index.d.ts +9 -0
- package/build/feature-flags/index.d.ts.map +1 -0
- package/build/feature-flags/index.js +19 -0
- package/build/feature-flags/providers/factory.d.ts +7 -0
- package/build/feature-flags/providers/factory.d.ts.map +1 -0
- package/build/feature-flags/providers/factory.js +25 -0
- package/build/feature-flags/providers/flagsmith/index.d.ts +2 -0
- package/build/feature-flags/providers/flagsmith/index.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/index.js +6 -0
- package/build/feature-flags/providers/flagsmith/provider.d.ts +13 -0
- package/build/feature-flags/providers/flagsmith/provider.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/provider.js +73 -0
- package/build/feature-flags/providers/flagsmith/types.d.ts +1 -0
- package/build/feature-flags/providers/flagsmith/types.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/types.js +4 -0
- package/build/feature-flags/providers/index.d.ts +5 -0
- package/build/feature-flags/providers/index.d.ts.map +1 -0
- package/build/feature-flags/providers/index.js +10 -0
- package/build/feature-flags/providers/interfaces.d.ts +11 -0
- package/build/feature-flags/providers/interfaces.d.ts.map +1 -0
- package/build/feature-flags/providers/interfaces.js +3 -0
- package/build/feature-flags/providers/local/config.d.ts +4 -0
- package/build/feature-flags/providers/local/config.d.ts.map +1 -0
- package/build/feature-flags/providers/local/config.js +11 -0
- package/build/feature-flags/providers/local/index.d.ts +3 -0
- package/build/feature-flags/providers/local/index.d.ts.map +1 -0
- package/build/feature-flags/providers/local/index.js +6 -0
- package/build/feature-flags/providers/local/provider.d.ts +17 -0
- package/build/feature-flags/providers/local/provider.d.ts.map +1 -0
- package/build/feature-flags/providers/local/provider.js +105 -0
- package/build/feature-flags/providers/local/types.d.ts +4 -0
- package/build/feature-flags/providers/local/types.d.ts.map +1 -0
- package/build/feature-flags/providers/local/types.js +3 -0
- package/build/feature-flags/types.d.ts +96 -0
- package/build/feature-flags/types.d.ts.map +1 -0
- package/build/feature-flags/types.js +11 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/package.json +3 -2
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FeatureFlagDefinition } from '../types';
|
|
2
|
+
export interface IFeatureFlagRegistry {
|
|
3
|
+
register(definition: FeatureFlagDefinition): void;
|
|
4
|
+
register(definitions: FeatureFlagDefinition[]): void;
|
|
5
|
+
get(key: string): FeatureFlagDefinition | undefined;
|
|
6
|
+
getAll(): FeatureFlagDefinition[];
|
|
7
|
+
getByCategory(category: string): FeatureFlagDefinition[];
|
|
8
|
+
getDefaultValue(key: string): boolean | string | number;
|
|
9
|
+
isRegistered(key: string): boolean;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/flags/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IACrD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IACpD,MAAM,IAAI,qBAAqB,EAAE,CAAC;IAClC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACzD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACxD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;CACf"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlLWZsYWdzL2ZsYWdzL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdEZWZpbml0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHtcbiAgcmVnaXN0ZXIoZGVmaW5pdGlvbjogRmVhdHVyZUZsYWdEZWZpbml0aW9uKTogdm9pZDtcbiAgcmVnaXN0ZXIoZGVmaW5pdGlvbnM6IEZlYXR1cmVGbGFnRGVmaW5pdGlvbltdKTogdm9pZDtcbiAgZ2V0KGtleTogc3RyaW5nKTogRmVhdHVyZUZsYWdEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuICBnZXRBbGwoKTogRmVhdHVyZUZsYWdEZWZpbml0aW9uW107XG4gIGdldEJ5Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IEZlYXR1cmVGbGFnRGVmaW5pdGlvbltdO1xuICBnZXREZWZhdWx0VmFsdWUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyO1xuICBpc1JlZ2lzdGVyZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuO1xuICBjbGVhcigpOiB2b2lkO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FeatureFlagDefinition } from '../types';
|
|
2
|
+
export interface FeatureFlagConfig {
|
|
3
|
+
flags: FeatureFlagDefinition[];
|
|
4
|
+
defaults?: {
|
|
5
|
+
category?: string;
|
|
6
|
+
type?: 'boolean' | 'string' | 'number';
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare class FeatureFlagLoader {
|
|
10
|
+
static fromJSON(json: string): FeatureFlagDefinition[];
|
|
11
|
+
static fromObject(config: FeatureFlagConfig): FeatureFlagDefinition[];
|
|
12
|
+
static fromEnvironment(): FeatureFlagDefinition[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/flags/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;KACxC,CAAC;CACH;AAED,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAStD,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,qBAAqB,EAAE;IAOrE,MAAM,CAAC,eAAe,IAAI,qBAAqB,EAAE;CAelD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagLoader = void 0;
|
|
4
|
+
class FeatureFlagLoader {
|
|
5
|
+
static fromJSON(json) {
|
|
6
|
+
try {
|
|
7
|
+
const config = JSON.parse(json);
|
|
8
|
+
return config.flags;
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
throw new Error(`Failed to parse flag configuration JSON: ${error}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
static fromObject(config) {
|
|
15
|
+
if (!config.flags || !Array.isArray(config.flags)) {
|
|
16
|
+
throw new Error('Configuration must have a flags array');
|
|
17
|
+
}
|
|
18
|
+
return config.flags;
|
|
19
|
+
}
|
|
20
|
+
static fromEnvironment() {
|
|
21
|
+
const configPath = process.env.FEATURE_FLAGS_CONFIG_PATH;
|
|
22
|
+
if (!configPath) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
// eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
29
|
+
return this.fromJSON(configContent);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new Error(`Failed to load flag configuration from ${configPath}: ${error}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.FeatureFlagLoader = FeatureFlagLoader;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvZmxhZ3MvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLE1BQWEsaUJBQWlCO0lBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWTtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUF5QjtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUksQ0FBQztZQUNILDhFQUE4RTtZQUM5RSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhDRCw4Q0FnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnRGVmaW5pdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlRmxhZ0NvbmZpZyB7XG4gIGZsYWdzOiBGZWF0dXJlRmxhZ0RlZmluaXRpb25bXTtcbiAgZGVmYXVsdHM/OiB7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgdHlwZT86ICdib29sZWFuJyB8ICdzdHJpbmcnIHwgJ251bWJlcic7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ0xvYWRlciB7XG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBzdHJpbmcpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb25bXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZzogRmVhdHVyZUZsYWdDb25maWcgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgcmV0dXJuIGNvbmZpZy5mbGFncztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgZmxhZyBjb25maWd1cmF0aW9uIEpTT046ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoY29uZmlnOiBGZWF0dXJlRmxhZ0NvbmZpZyk6IEZlYXR1cmVGbGFnRGVmaW5pdGlvbltdIHtcbiAgICBpZiAoIWNvbmZpZy5mbGFncyB8fCAhQXJyYXkuaXNBcnJheShjb25maWcuZmxhZ3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb24gbXVzdCBoYXZlIGEgZmxhZ3MgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5mbGFncztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRW52aXJvbm1lbnQoKTogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5GRUFUVVJFX0ZMQUdTX0NPTkZJR19QQVRIO1xuICAgIGlmICghY29uZmlnUGF0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmUsIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB0aGlzLmZyb21KU09OKGNvbmZpZ0NvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIGZsYWcgY29uZmlndXJhdGlvbiBmcm9tICR7Y29uZmlnUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FeatureFlagDefinition, IFeatureFlagRegistry } from '../types';
|
|
2
|
+
export declare class FeatureFlagRegistry implements IFeatureFlagRegistry {
|
|
3
|
+
private flags;
|
|
4
|
+
register(definitionOrDefinitions: FeatureFlagDefinition | FeatureFlagDefinition[]): void;
|
|
5
|
+
get(key: string): FeatureFlagDefinition | undefined;
|
|
6
|
+
getAll(): FeatureFlagDefinition[];
|
|
7
|
+
getByCategory(category: string): FeatureFlagDefinition[];
|
|
8
|
+
getDefaultValue(key: string): boolean | string | number;
|
|
9
|
+
isRegistered(key: string): boolean;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/flags/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG5E,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,KAAK,CAA4C;IAEzD,QAAQ,CAAC,uBAAuB,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,GAAG,IAAI;IAWxF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAInD,MAAM,IAAI,qBAAqB,EAAE;IAIjC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAIxD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM;IAIvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagRegistry = void 0;
|
|
4
|
+
const utils_1 = require("../core/utils");
|
|
5
|
+
class FeatureFlagRegistry {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.flags = new Map();
|
|
8
|
+
}
|
|
9
|
+
register(definitionOrDefinitions) {
|
|
10
|
+
const definitions = Array.isArray(definitionOrDefinitions)
|
|
11
|
+
? definitionOrDefinitions
|
|
12
|
+
: [definitionOrDefinitions];
|
|
13
|
+
definitions.forEach((def) => {
|
|
14
|
+
utils_1.FeatureFlagUtils.validateDefinition(def);
|
|
15
|
+
this.flags.set(def.key, def);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
get(key) {
|
|
19
|
+
return this.flags.get(key);
|
|
20
|
+
}
|
|
21
|
+
getAll() {
|
|
22
|
+
return Array.from(this.flags.values());
|
|
23
|
+
}
|
|
24
|
+
getByCategory(category) {
|
|
25
|
+
return this.getAll().filter((flag) => flag.category === category);
|
|
26
|
+
}
|
|
27
|
+
getDefaultValue(key) {
|
|
28
|
+
return this.flags.get(key)?.defaultValue ?? false;
|
|
29
|
+
}
|
|
30
|
+
isRegistered(key) {
|
|
31
|
+
return this.flags.has(key);
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.flags.clear();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.FeatureFlagRegistry = FeatureFlagRegistry;
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9mbGFncy9yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBaUQ7QUFFakQsTUFBYSxtQkFBbUI7SUFBaEM7UUFDVSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFvQzNELENBQUM7SUFsQ0MsUUFBUSxDQUFDLHVCQUF3RTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO1lBQ3hELENBQUMsQ0FBQyx1QkFBdUI7WUFDekIsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUU5QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDMUIsd0JBQWdCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxhQUFhLENBQUMsUUFBZ0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBVztRQUN6QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksSUFBSSxLQUFLLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQXJDRCxrREFxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnRGVmaW5pdGlvbiwgSUZlYXR1cmVGbGFnUmVnaXN0cnkgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBGZWF0dXJlRmxhZ1V0aWxzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IGltcGxlbWVudHMgSUZlYXR1cmVGbGFnUmVnaXN0cnkge1xuICBwcml2YXRlIGZsYWdzID0gbmV3IE1hcDxzdHJpbmcsIEZlYXR1cmVGbGFnRGVmaW5pdGlvbj4oKTtcblxuICByZWdpc3RlcihkZWZpbml0aW9uT3JEZWZpbml0aW9uczogRmVhdHVyZUZsYWdEZWZpbml0aW9uIHwgRmVhdHVyZUZsYWdEZWZpbml0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbk9yRGVmaW5pdGlvbnMpXG4gICAgICA/IGRlZmluaXRpb25PckRlZmluaXRpb25zXG4gICAgICA6IFtkZWZpbml0aW9uT3JEZWZpbml0aW9uc107XG5cbiAgICBkZWZpbml0aW9ucy5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgIEZlYXR1cmVGbGFnVXRpbHMudmFsaWRhdGVEZWZpbml0aW9uKGRlZik7XG4gICAgICB0aGlzLmZsYWdzLnNldChkZWYua2V5LCBkZWYpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogRmVhdHVyZUZsYWdEZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoa2V5KTtcbiAgfVxuXG4gIGdldEFsbCgpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5mbGFncy52YWx1ZXMoKSk7XG4gIH1cblxuICBnZXRCeUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsKCkuZmlsdGVyKChmbGFnKSA9PiBmbGFnLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG4gIH1cblxuICBnZXREZWZhdWx0VmFsdWUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoa2V5KT8uZGVmYXVsdFZhbHVlID8/IGZhbHNlO1xuICB9XG5cbiAgaXNSZWdpc3RlcmVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MuaGFzKGtleSk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdzLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FeatureFlagService } from './core/service';
|
|
2
|
+
export { FeatureFlagService } from './core/service';
|
|
3
|
+
export { FeatureFlagRegistry } from './flags/registry';
|
|
4
|
+
export { FeatureFlagLoader } from './flags/loader';
|
|
5
|
+
export type { IFeatureFlagService, IFeatureFlagRegistry, IFeatureFlagProvider, FeatureFlagUser, FeatureFlagConfig, FeatureFlagResponse, FeatureFlagDefinition, FeatureFlagProvider, FeatureValue, ErrorBehaviour, } from './types';
|
|
6
|
+
export { TRAIT_KEYS } from '@rudderstack/featureflag-sdk-node';
|
|
7
|
+
export { DEFAULT_FLAGS } from './flags/defaults';
|
|
8
|
+
export declare const featureFlagService: FeatureFlagService;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|