@zudojs/feature-flags 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/evaluator/evaluator.core.d.ts +20 -0
- package/dist/evaluator/evaluator.core.d.ts.map +1 -0
- package/dist/evaluator/evaluator.core.js +86 -0
- package/dist/evaluator/evaluator.core.js.map +1 -0
- package/dist/evaluator/evaluatorAttribute.d.ts +26 -0
- package/dist/evaluator/evaluatorAttribute.d.ts.map +1 -0
- package/dist/evaluator/evaluatorAttribute.js +84 -0
- package/dist/evaluator/evaluatorAttribute.js.map +1 -0
- package/dist/evaluator/evaluatorRule.core.d.ts +29 -0
- package/dist/evaluator/evaluatorRule.core.d.ts.map +1 -0
- package/dist/evaluator/evaluatorRule.core.js +73 -0
- package/dist/evaluator/evaluatorRule.core.js.map +1 -0
- package/dist/evaluator/index.d.ts +10 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +9 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/featureFlagErrors/featureFlagError.base.d.ts +24 -0
- package/dist/featureFlagErrors/featureFlagError.base.d.ts.map +1 -0
- package/dist/featureFlagErrors/featureFlagError.base.js +24 -0
- package/dist/featureFlagErrors/featureFlagError.base.js.map +1 -0
- package/dist/featureFlagErrors/featureFlagError.types.d.ts +38 -0
- package/dist/featureFlagErrors/featureFlagError.types.d.ts.map +1 -0
- package/dist/featureFlagErrors/featureFlagError.types.js +79 -0
- package/dist/featureFlagErrors/featureFlagError.types.js.map +1 -0
- package/dist/featureFlagErrors/index.d.ts +9 -0
- package/dist/featureFlagErrors/index.d.ts.map +1 -0
- package/dist/featureFlagErrors/index.js +8 -0
- package/dist/featureFlagErrors/index.js.map +1 -0
- package/dist/featureFlagTypes/featureFlag.interface.d.ts +50 -0
- package/dist/featureFlagTypes/featureFlag.interface.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlag.interface.js +9 -0
- package/dist/featureFlagTypes/featureFlag.interface.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagContext.d.ts +21 -0
- package/dist/featureFlagTypes/featureFlagContext.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagContext.js +9 -0
- package/dist/featureFlagTypes/featureFlagContext.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagEvaluation.d.ts +26 -0
- package/dist/featureFlagTypes/featureFlagEvaluation.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagEvaluation.js +9 -0
- package/dist/featureFlagTypes/featureFlagEvaluation.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagProvider.d.ts +24 -0
- package/dist/featureFlagTypes/featureFlagProvider.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagProvider.js +9 -0
- package/dist/featureFlagTypes/featureFlagProvider.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.d.ts +60 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.js +9 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.d.ts +14 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.js +9 -0
- package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.js.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/index.d.ts +8 -0
- package/dist/featureFlagTypes/featureFlagRule/index.d.ts.map +1 -0
- package/dist/featureFlagTypes/featureFlagRule/index.js +8 -0
- package/dist/featureFlagTypes/featureFlagRule/index.js.map +1 -0
- package/dist/featureFlagTypes/index.d.ts +9 -0
- package/dist/featureFlagTypes/index.d.ts.map +1 -0
- package/dist/featureFlagTypes/index.js +5 -0
- package/dist/featureFlagTypes/index.js.map +1 -0
- package/dist/featureFlags/featureFlags.core.d.ts +37 -0
- package/dist/featureFlags/featureFlags.core.d.ts.map +1 -0
- package/dist/featureFlags/featureFlags.core.js +101 -0
- package/dist/featureFlags/featureFlags.core.js.map +1 -0
- package/dist/featureFlags/featureFlags.resolve.d.ts +21 -0
- package/dist/featureFlags/featureFlags.resolve.d.ts.map +1 -0
- package/dist/featureFlags/featureFlags.resolve.js +44 -0
- package/dist/featureFlags/featureFlags.resolve.js.map +1 -0
- package/dist/featureFlags/index.d.ts +8 -0
- package/dist/featureFlags/index.d.ts.map +1 -0
- package/dist/featureFlags/index.js +7 -0
- package/dist/featureFlags/index.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/index.d.ts +12 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +10 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/providerCached.core.d.ts +22 -0
- package/dist/provider/providerCached.core.d.ts.map +1 -0
- package/dist/provider/providerCached.core.js +45 -0
- package/dist/provider/providerCached.core.js.map +1 -0
- package/dist/provider/providerComposite.core.d.ts +19 -0
- package/dist/provider/providerComposite.core.d.ts.map +1 -0
- package/dist/provider/providerComposite.core.js +48 -0
- package/dist/provider/providerComposite.core.js.map +1 -0
- package/dist/provider/providerEnvironment.core.d.ts +25 -0
- package/dist/provider/providerEnvironment.core.d.ts.map +1 -0
- package/dist/provider/providerEnvironment.core.js +63 -0
- package/dist/provider/providerEnvironment.core.js.map +1 -0
- package/dist/provider/providerMemory.core.d.ts +17 -0
- package/dist/provider/providerMemory.core.d.ts.map +1 -0
- package/dist/provider/providerMemory.core.js +36 -0
- package/dist/provider/providerMemory.core.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +7 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.core.d.ts +35 -0
- package/dist/registry/registry.core.d.ts.map +1 -0
- package/dist/registry/registry.core.js +47 -0
- package/dist/registry/registry.core.js.map +1 -0
- package/dist/rollout/index.d.ts +8 -0
- package/dist/rollout/index.d.ts.map +1 -0
- package/dist/rollout/index.js +8 -0
- package/dist/rollout/index.js.map +1 -0
- package/dist/rollout/rolloutBucketing.d.ts +27 -0
- package/dist/rollout/rolloutBucketing.d.ts.map +1 -0
- package/dist/rollout/rolloutBucketing.js +42 -0
- package/dist/rollout/rolloutBucketing.js.map +1 -0
- package/dist/rollout/rolloutHashing.d.ts +15 -0
- package/dist/rollout/rolloutHashing.d.ts.map +1 -0
- package/dist/rollout/rolloutHashing.js +26 -0
- package/dist/rollout/rolloutHashing.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/utils.helper.d.ts +15 -0
- package/dist/utils/utils.helper.d.ts.map +1 -0
- package/dist/utils/utils.helper.js +27 -0
- package/dist/utils/utils.helper.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag error classes.
|
|
3
|
+
*
|
|
4
|
+
* @module featureFlagErrors
|
|
5
|
+
*/
|
|
6
|
+
export { FeatureFlagError } from "./featureFlagError.base.js";
|
|
7
|
+
export { FeatureFlagNotFoundError, FeatureFlagProviderError, FeatureFlagEvaluationError, FeatureFlagRuleError, FeatureFlagDependencyError, FeatureFlagConfigurationError, FeatureFlagTypeError, } from "./featureFlagError.types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/featureFlagErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag definition interface.
|
|
3
|
+
*
|
|
4
|
+
* Represents a complete feature flag with rules, metadata, and configuration.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlag
|
|
7
|
+
*/
|
|
8
|
+
import type { FeatureFlagValue, FeatureFlagState, FeatureFlagVisibility } from "./featureFlagRule/featureFlagValue.type.js";
|
|
9
|
+
import type { FeatureFlagRule, FeatureFlagVariant } from "./featureFlagRule/featureFlagRule.type.js";
|
|
10
|
+
/** Metadata about a feature flag. */
|
|
11
|
+
export interface FeatureFlagMetadata {
|
|
12
|
+
/** Owner team or individual. */
|
|
13
|
+
readonly owner?: string;
|
|
14
|
+
/** Team responsible. */
|
|
15
|
+
readonly team?: string;
|
|
16
|
+
/** When the flag was created. */
|
|
17
|
+
readonly createdAt?: Date;
|
|
18
|
+
/** When the flag was last updated. */
|
|
19
|
+
readonly updatedAt?: Date;
|
|
20
|
+
/** When the flag expires. */
|
|
21
|
+
readonly expiresAt?: Date;
|
|
22
|
+
/** Associated ticket or issue. */
|
|
23
|
+
readonly ticket?: string;
|
|
24
|
+
/** Tags for categorization. */
|
|
25
|
+
readonly tags?: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
/** A complete feature flag definition. */
|
|
28
|
+
export interface FeatureFlag {
|
|
29
|
+
/** Unique key identifying this flag. */
|
|
30
|
+
readonly key: string;
|
|
31
|
+
/** Default value when no rule matches. */
|
|
32
|
+
readonly defaultValue: FeatureFlagValue;
|
|
33
|
+
/** Whether the flag is globally enabled. */
|
|
34
|
+
readonly enabled: boolean;
|
|
35
|
+
/** Human-readable description. */
|
|
36
|
+
readonly description?: string;
|
|
37
|
+
/** Lifecycle state. */
|
|
38
|
+
readonly state?: FeatureFlagState;
|
|
39
|
+
/** Visibility scope. */
|
|
40
|
+
readonly visibility?: FeatureFlagVisibility;
|
|
41
|
+
/** Targeting rules evaluated in order. */
|
|
42
|
+
readonly rules?: readonly FeatureFlagRule[];
|
|
43
|
+
/** Variant definitions for A/B testing. */
|
|
44
|
+
readonly variants?: readonly FeatureFlagVariant[];
|
|
45
|
+
/** Feature flags this flag depends on. */
|
|
46
|
+
readonly dependencies?: readonly string[];
|
|
47
|
+
/** Additional metadata. */
|
|
48
|
+
readonly metadata?: FeatureFlagMetadata;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=featureFlag.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlag.interface.d.ts","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlag.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,2CAA2C,CAAC;AAEnD,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,wBAAwB;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAC5C,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAClD,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlag.interface.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlag.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag evaluation context.
|
|
3
|
+
*
|
|
4
|
+
* Provides the execution context used to evaluate targeting rules.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagContext
|
|
7
|
+
*/
|
|
8
|
+
/** Context passed to flag evaluators for targeting decisions. */
|
|
9
|
+
export interface FeatureFlagContext {
|
|
10
|
+
/** Unique identifier for the user. */
|
|
11
|
+
readonly userId?: string;
|
|
12
|
+
/** Unique identifier for the tenant/organization. */
|
|
13
|
+
readonly tenantId?: string;
|
|
14
|
+
/** Unique identifier for the session. */
|
|
15
|
+
readonly sessionId?: string;
|
|
16
|
+
/** Current environment name. */
|
|
17
|
+
readonly environment?: string;
|
|
18
|
+
/** Custom attributes for attribute-based targeting. */
|
|
19
|
+
readonly attributes?: Readonly<Record<string, unknown>>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=featureFlagContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagContext.d.ts","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagContext.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag evaluation result types.
|
|
3
|
+
*
|
|
4
|
+
* Every evaluation produces a structured result with reasoning.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagEvaluation
|
|
7
|
+
*/
|
|
8
|
+
import type { FeatureFlagValue } from "./featureFlagRule/featureFlagValue.type.js";
|
|
9
|
+
/** Why a flag evaluation produced its result. */
|
|
10
|
+
export type FeatureFlagEvaluationReason = "default" | "static" | "rule_match" | "target_match" | "percentage_rollout" | "variant_assignment" | "disabled" | "not_found" | "error" | "dependency_disabled" | "expired";
|
|
11
|
+
/** The result of evaluating a feature flag. */
|
|
12
|
+
export interface FeatureFlagEvaluation<TValue = FeatureFlagValue> {
|
|
13
|
+
/** The flag key that was evaluated. */
|
|
14
|
+
readonly key: string;
|
|
15
|
+
/** The resolved value. */
|
|
16
|
+
readonly value: TValue;
|
|
17
|
+
/** Why this value was chosen. */
|
|
18
|
+
readonly reason: FeatureFlagEvaluationReason;
|
|
19
|
+
/** The matched rule index, if any. */
|
|
20
|
+
readonly matchedRule?: number;
|
|
21
|
+
/** The assigned variant key, if any. */
|
|
22
|
+
readonly variant?: string;
|
|
23
|
+
/** Whether the default value was used. */
|
|
24
|
+
readonly defaulted: boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=featureFlagEvaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagEvaluation.d.ts","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagEvaluation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAEnF,iDAAiD;AACjD,MAAM,MAAM,2BAA2B,GACnC,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,UAAU,GACV,WAAW,GACX,OAAO,GACP,qBAAqB,GACrB,SAAS,CAAC;AAEd,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB,CAAC,MAAM,GAAG,gBAAgB;IAC9D,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,sCAAsC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagEvaluation.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagEvaluation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Providers supply flag definitions from any source — memory, environment, database, or remote API.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagProvider
|
|
7
|
+
*/
|
|
8
|
+
import type { FeatureFlag } from "./featureFlag.interface.js";
|
|
9
|
+
/** Listener called when flags change. */
|
|
10
|
+
export type FeatureFlagChangeListener = (flags: readonly FeatureFlag[]) => void;
|
|
11
|
+
/** Unsubscribe function for flag change listeners. */
|
|
12
|
+
export type Unsubscribe = () => void;
|
|
13
|
+
/** Abstract provider for feature flag definitions. */
|
|
14
|
+
export interface FeatureFlagProvider {
|
|
15
|
+
/** Retrieve a single flag by key. */
|
|
16
|
+
get(key: string): Promise<FeatureFlag | undefined>;
|
|
17
|
+
/** Retrieve all flags. */
|
|
18
|
+
getAll(): Promise<readonly FeatureFlag[]>;
|
|
19
|
+
/** Optional: refresh flags from the source. */
|
|
20
|
+
refresh?(): Promise<void>;
|
|
21
|
+
/** Optional: subscribe to flag changes. */
|
|
22
|
+
subscribe?(listener: FeatureFlagChangeListener): Unsubscribe;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=featureFlagProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagProvider.d.ts","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,yCAAyC;AACzC,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;AAEhF,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACnD,0BAA0B;IAC1B,MAAM,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAC1C,+CAA+C;IAC/C,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,2CAA2C;IAC3C,SAAS,CAAC,CAAC,QAAQ,EAAE,yBAAyB,GAAG,WAAW,CAAC;CAC9D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Providers supply flag definitions from any source — memory, environment, database, or remote API.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagProvider
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=featureFlagProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagProvider.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag rule types.
|
|
3
|
+
*
|
|
4
|
+
* Rules determine how a flag evaluates against a given context.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagRule
|
|
7
|
+
*/
|
|
8
|
+
import type { FeatureFlagValue } from "./featureFlagValue.type.js";
|
|
9
|
+
/** Operators for attribute-based targeting. */
|
|
10
|
+
export type FeatureFlagOperator = "equals" | "not_equals" | "contains" | "starts_with" | "ends_with" | "in" | "not_in" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "exists" | "matches";
|
|
11
|
+
/** A static rule — always returns its value. */
|
|
12
|
+
export interface FeatureFlagStaticRule {
|
|
13
|
+
readonly type: "static";
|
|
14
|
+
readonly value: FeatureFlagValue;
|
|
15
|
+
}
|
|
16
|
+
/** Target specific users by ID. */
|
|
17
|
+
export interface FeatureFlagUserRule {
|
|
18
|
+
readonly type: "user";
|
|
19
|
+
readonly users: readonly string[];
|
|
20
|
+
readonly value: FeatureFlagValue;
|
|
21
|
+
}
|
|
22
|
+
/** Target specific tenants by ID. */
|
|
23
|
+
export interface FeatureFlagTenantRule {
|
|
24
|
+
readonly type: "tenant";
|
|
25
|
+
readonly tenants: readonly string[];
|
|
26
|
+
readonly value: FeatureFlagValue;
|
|
27
|
+
}
|
|
28
|
+
/** Target by attribute matching. */
|
|
29
|
+
export interface FeatureFlagAttributeRule {
|
|
30
|
+
readonly type: "attribute";
|
|
31
|
+
readonly attribute: string;
|
|
32
|
+
readonly operator: FeatureFlagOperator;
|
|
33
|
+
readonly value: unknown;
|
|
34
|
+
}
|
|
35
|
+
/** Percentage-based rollout — deterministic per subject. */
|
|
36
|
+
export interface FeatureFlagPercentageRule {
|
|
37
|
+
readonly type: "percentage";
|
|
38
|
+
readonly percentage: number;
|
|
39
|
+
readonly value: FeatureFlagValue;
|
|
40
|
+
}
|
|
41
|
+
/** Time-windowed rule — enabled only within a date range. */
|
|
42
|
+
export interface FeatureFlagScheduleRule {
|
|
43
|
+
readonly type: "schedule";
|
|
44
|
+
readonly startAt: string;
|
|
45
|
+
readonly endAt: string;
|
|
46
|
+
readonly value: FeatureFlagValue;
|
|
47
|
+
}
|
|
48
|
+
/** Variant assignment rule — assigns a variant key based on weight. */
|
|
49
|
+
export interface FeatureFlagVariantRule {
|
|
50
|
+
readonly type: "variant";
|
|
51
|
+
readonly variants: readonly FeatureFlagVariant[];
|
|
52
|
+
}
|
|
53
|
+
/** A variant with a weight for percentage-based assignment. */
|
|
54
|
+
export interface FeatureFlagVariant {
|
|
55
|
+
readonly key: string;
|
|
56
|
+
readonly weight: number;
|
|
57
|
+
}
|
|
58
|
+
/** Union of all feature flag rule types. */
|
|
59
|
+
export type FeatureFlagRule = FeatureFlagStaticRule | FeatureFlagUserRule | FeatureFlagTenantRule | FeatureFlagAttributeRule | FeatureFlagPercentageRule | FeatureFlagScheduleRule | FeatureFlagVariantRule;
|
|
60
|
+
//# sourceMappingURL=featureFlagRule.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagRule.type.d.ts","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/featureFlagRule.type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,+CAA+C;AAC/C,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,aAAa,GACb,WAAW,GACX,IAAI,GACJ,QAAQ,GACR,cAAc,GACd,uBAAuB,GACvB,WAAW,GACX,oBAAoB,GACpB,QAAQ,GACR,SAAS,CAAC;AAEd,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAED,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAED,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAED,oCAAoC;AACpC,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAED,uEAAuE;AACvE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,4CAA4C;AAC5C,MAAM,MAAM,eAAe,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,yBAAyB,GACzB,uBAAuB,GACvB,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagRule.type.js","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/featureFlagRule.type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag value types.
|
|
3
|
+
*
|
|
4
|
+
* A feature flag can return boolean, string, number, null, or a structured object.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlagTypes/featureFlagValue
|
|
7
|
+
*/
|
|
8
|
+
/** A feature flag value — boolean for simple toggles, string/number for variants. */
|
|
9
|
+
export type FeatureFlagValue = boolean | string | number | null | Record<string, unknown>;
|
|
10
|
+
/** Feature flag lifecycle state. */
|
|
11
|
+
export type FeatureFlagState = "active" | "disabled" | "archived" | "draft";
|
|
12
|
+
/** Feature flag visibility scope. */
|
|
13
|
+
export type FeatureFlagVisibility = "server" | "client";
|
|
14
|
+
//# sourceMappingURL=featureFlagValue.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagValue.type.d.ts","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/featureFlagValue.type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GAC1B,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7D,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5E,qCAAqC;AACrC,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlagValue.type.js","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/featureFlagValue.type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/featureFlagTypes/featureFlagRule/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag type definitions.
|
|
3
|
+
*/
|
|
4
|
+
export type { FeatureFlagValue, FeatureFlagState, FeatureFlagVisibility, FeatureFlagOperator, FeatureFlagStaticRule, FeatureFlagUserRule, FeatureFlagTenantRule, FeatureFlagAttributeRule, FeatureFlagPercentageRule, FeatureFlagScheduleRule, FeatureFlagVariantRule, FeatureFlagVariant, FeatureFlagRule, } from "./featureFlagRule/index.js";
|
|
5
|
+
export type { FeatureFlagContext } from "./featureFlagContext.js";
|
|
6
|
+
export type { FeatureFlagMetadata, FeatureFlag, } from "./featureFlag.interface.js";
|
|
7
|
+
export type { FeatureFlagEvaluationReason, FeatureFlagEvaluation, } from "./featureFlagEvaluation.js";
|
|
8
|
+
export type { FeatureFlagProvider, FeatureFlagChangeListener, Unsubscribe, } from "./featureFlagProvider.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/featureFlagTypes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,YAAY,EACV,mBAAmB,EACnB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/featureFlagTypes/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeatureFlags — the main public API.
|
|
3
|
+
*
|
|
4
|
+
* Provides isEnabled, get, evaluate, and snapshot methods.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlags/featureFlags
|
|
7
|
+
*/
|
|
8
|
+
import type { FeatureFlag } from "../featureFlagTypes/featureFlag.interface.js";
|
|
9
|
+
import type { FeatureFlagContext } from "../featureFlagTypes/featureFlagContext.js";
|
|
10
|
+
import type { FeatureFlagValue } from "../featureFlagTypes/featureFlagRule/featureFlagValue.type.js";
|
|
11
|
+
import type { FeatureFlagEvaluation } from "../featureFlagTypes/featureFlagEvaluation.js";
|
|
12
|
+
import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
|
|
13
|
+
/** Options for creating a FeatureFlags instance. */
|
|
14
|
+
export interface FeatureFlagsOptions {
|
|
15
|
+
/** Provider to load flag definitions from. */
|
|
16
|
+
readonly provider: FeatureFlagProvider;
|
|
17
|
+
/** Default context applied to all evaluations. */
|
|
18
|
+
readonly defaultContext?: FeatureFlagContext;
|
|
19
|
+
/** Whether to throw on missing flags (default: false, returns default value). */
|
|
20
|
+
readonly throwOnMissing?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a FeatureFlags instance.
|
|
24
|
+
*
|
|
25
|
+
* @param options - Configuration options.
|
|
26
|
+
* @returns A FeatureFlags API object.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createFeatureFlags(options: FeatureFlagsOptions): {
|
|
29
|
+
isEnabled(key: string, context?: FeatureFlagContext): Promise<boolean>;
|
|
30
|
+
get<T extends FeatureFlagValue = FeatureFlagValue>(key: string, context?: FeatureFlagContext): Promise<T | undefined>;
|
|
31
|
+
getBoolean(key: string, defaultValue: boolean, context?: FeatureFlagContext): Promise<boolean>;
|
|
32
|
+
evaluate<T extends FeatureFlagValue = FeatureFlagValue>(key: string, context?: FeatureFlagContext): Promise<FeatureFlagEvaluation<T>>;
|
|
33
|
+
snapshot(context?: FeatureFlagContext): Promise<ReadonlyMap<string, FeatureFlagEvaluation>>;
|
|
34
|
+
refresh(): Promise<void>;
|
|
35
|
+
getAll(): Promise<readonly FeatureFlag[]>;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=featureFlags.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags.core.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAOtF,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,kDAAkD;IAClD,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAC7C,iFAAiF;IACjF,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;IAuBrD,SAAS,MACR,MAAM,YACD,kBAAkB,GAC3B,OAAO,CAAC,OAAO,CAAC;IAKb,GAAG,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,OAChD,MAAM,YACD,kBAAkB,GAC3B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKnB,UAAU,MACT,MAAM,gBACG,OAAO,YACX,kBAAkB,GAC3B,OAAO,CAAC,OAAO,CAAC;IAMb,QAAQ,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,OACrD,MAAM,YACD,kBAAkB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IA8B9B,QAAQ,WACF,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAgBhD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,MAAM,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC;EAKlD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeatureFlags — the main public API.
|
|
3
|
+
*
|
|
4
|
+
* Provides isEnabled, get, evaluate, and snapshot methods.
|
|
5
|
+
*
|
|
6
|
+
* @module featureFlags/featureFlags
|
|
7
|
+
*/
|
|
8
|
+
import { createFeatureFlagRegistry } from "../registry/registry.core.js";
|
|
9
|
+
import { evaluateFlag } from "../evaluator/evaluator.core.js";
|
|
10
|
+
import { FeatureFlagNotFoundError } from "../featureFlagErrors/featureFlagError.types.js";
|
|
11
|
+
import { resolveDependencies, mergeContext } from "./featureFlags.resolve.js";
|
|
12
|
+
/**
|
|
13
|
+
* Create a FeatureFlags instance.
|
|
14
|
+
*
|
|
15
|
+
* @param options - Configuration options.
|
|
16
|
+
* @returns A FeatureFlags API object.
|
|
17
|
+
*/
|
|
18
|
+
export function createFeatureFlags(options) {
|
|
19
|
+
const { provider, defaultContext = {}, throwOnMissing = false } = options;
|
|
20
|
+
let registry = createFeatureFlagRegistry();
|
|
21
|
+
async function load() {
|
|
22
|
+
const flags = await provider.getAll();
|
|
23
|
+
registry = createFeatureFlagRegistry(flags);
|
|
24
|
+
}
|
|
25
|
+
async function ensureLoaded() {
|
|
26
|
+
if (registry.size === 0)
|
|
27
|
+
await load();
|
|
28
|
+
}
|
|
29
|
+
async function resolveFlag(key) {
|
|
30
|
+
let flag = registry.get(key);
|
|
31
|
+
if (!flag) {
|
|
32
|
+
flag = await provider.get(key);
|
|
33
|
+
if (flag)
|
|
34
|
+
registry.set(flag);
|
|
35
|
+
}
|
|
36
|
+
return flag;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
async isEnabled(key, context) {
|
|
40
|
+
const result = await this.evaluate(key, context);
|
|
41
|
+
return result.value;
|
|
42
|
+
},
|
|
43
|
+
async get(key, context) {
|
|
44
|
+
const result = await this.evaluate(key, context);
|
|
45
|
+
return result.value;
|
|
46
|
+
},
|
|
47
|
+
async getBoolean(key, defaultValue, context) {
|
|
48
|
+
const result = await this.evaluate(key, context);
|
|
49
|
+
if (result.reason === "not_found")
|
|
50
|
+
return defaultValue;
|
|
51
|
+
return result.value;
|
|
52
|
+
},
|
|
53
|
+
async evaluate(key, context) {
|
|
54
|
+
await ensureLoaded();
|
|
55
|
+
const mergedCtx = mergeContext(defaultContext, context);
|
|
56
|
+
const flag = await resolveFlag(key);
|
|
57
|
+
if (!flag) {
|
|
58
|
+
if (throwOnMissing)
|
|
59
|
+
throw new FeatureFlagNotFoundError(key);
|
|
60
|
+
return {
|
|
61
|
+
key,
|
|
62
|
+
value: undefined,
|
|
63
|
+
reason: "not_found",
|
|
64
|
+
defaulted: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (flag.dependencies && flag.dependencies.length > 0) {
|
|
68
|
+
if (!resolveDependencies(key, registry)) {
|
|
69
|
+
return {
|
|
70
|
+
key,
|
|
71
|
+
value: flag.defaultValue,
|
|
72
|
+
reason: "dependency_disabled",
|
|
73
|
+
defaulted: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return evaluateFlag(flag, mergedCtx);
|
|
78
|
+
},
|
|
79
|
+
async snapshot(context) {
|
|
80
|
+
await ensureLoaded();
|
|
81
|
+
const mergedCtx = mergeContext(defaultContext, context);
|
|
82
|
+
const flags = registry.getAll();
|
|
83
|
+
const results = new Map();
|
|
84
|
+
for (const flag of flags) {
|
|
85
|
+
if (flag.visibility === "client") {
|
|
86
|
+
results.set(flag.key, evaluateFlag(flag, mergedCtx));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
},
|
|
91
|
+
async refresh() {
|
|
92
|
+
await provider.refresh?.();
|
|
93
|
+
await load();
|
|
94
|
+
},
|
|
95
|
+
async getAll() {
|
|
96
|
+
await ensureLoaded();
|
|
97
|
+
return registry.getAll();
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=featureFlags.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags.core.js","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution and context merging for FeatureFlags.
|
|
3
|
+
*
|
|
4
|
+
* @module featureFlags/featureFlags.resolve
|
|
5
|
+
*/
|
|
6
|
+
import type { FeatureFlagContext } from "../featureFlagTypes/featureFlagContext.js";
|
|
7
|
+
import type { FeatureFlagRegistry } from "../registry/registry.core.js";
|
|
8
|
+
/**
|
|
9
|
+
* Resolve dependencies for a flag, detecting cycles.
|
|
10
|
+
*
|
|
11
|
+
* @param key - The flag key to resolve.
|
|
12
|
+
* @param registry - The flag registry.
|
|
13
|
+
* @param visited - Set of already-visited keys (for cycle detection).
|
|
14
|
+
* @returns True if all dependencies are enabled.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveDependencies(key: string, registry: FeatureFlagRegistry, visited?: Set<string>): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Merge default context with provided context.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeContext(defaultContext: FeatureFlagContext, context?: FeatureFlagContext): FeatureFlagContext;
|
|
21
|
+
//# sourceMappingURL=featureFlags.resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags.resolve.d.ts","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,OAAO,CAcT;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,cAAc,EAAE,kBAAkB,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,kBAAkB,CAUpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution and context merging for FeatureFlags.
|
|
3
|
+
*
|
|
4
|
+
* @module featureFlags/featureFlags.resolve
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Resolve dependencies for a flag, detecting cycles.
|
|
8
|
+
*
|
|
9
|
+
* @param key - The flag key to resolve.
|
|
10
|
+
* @param registry - The flag registry.
|
|
11
|
+
* @param visited - Set of already-visited keys (for cycle detection).
|
|
12
|
+
* @returns True if all dependencies are enabled.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveDependencies(key, registry, visited = new Set()) {
|
|
15
|
+
if (visited.has(key))
|
|
16
|
+
return false;
|
|
17
|
+
visited.add(key);
|
|
18
|
+
const flag = registry.get(key);
|
|
19
|
+
if (!flag || !flag.enabled)
|
|
20
|
+
return false;
|
|
21
|
+
if (!flag.dependencies || flag.dependencies.length === 0)
|
|
22
|
+
return true;
|
|
23
|
+
for (const dep of flag.dependencies) {
|
|
24
|
+
if (!resolveDependencies(dep, registry, visited))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Merge default context with provided context.
|
|
31
|
+
*/
|
|
32
|
+
export function mergeContext(defaultContext, context) {
|
|
33
|
+
if (!context)
|
|
34
|
+
return defaultContext;
|
|
35
|
+
return {
|
|
36
|
+
...defaultContext,
|
|
37
|
+
...context,
|
|
38
|
+
attributes: {
|
|
39
|
+
...defaultContext.attributes,
|
|
40
|
+
...context.attributes,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=featureFlags.resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags.resolve.js","sourceRoot":"","sources":["../../src/featureFlags/featureFlags.resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,QAA6B,EAC7B,OAAO,GAAgB,IAAI,GAAG,EAAE;IAEhC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IACjE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,cAAkC,EAClC,OAA4B;IAE5B,IAAI,CAAC,OAAO;QAAE,OAAO,cAAc,CAAC;IACpC,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,OAAO;QACV,UAAU,EAAE;YACV,GAAG,cAAc,CAAC,UAAU;YAC5B,GAAG,OAAO,CAAC,UAAU;SACtB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
|