@zudojs/feature-flags 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -13
  3. package/dist/evaluator/evaluator.core.d.ts +15 -1
  4. package/dist/evaluator/evaluator.core.js +28 -9
  5. package/dist/evaluator/evaluatorAttribute.d.ts +5 -0
  6. package/dist/evaluator/evaluatorAttribute.js +62 -4
  7. package/dist/evaluator/evaluatorRule.core.js +32 -7
  8. package/dist/featureFlagTypes/featureFlagProvider.d.ts +10 -0
  9. package/dist/featureFlagTypes/index.d.ts +1 -1
  10. package/dist/featureFlags/featureFlags.core.d.ts +28 -8
  11. package/dist/featureFlags/featureFlags.core.js +96 -33
  12. package/dist/featureFlags/featureFlags.resolve.d.ts +4 -3
  13. package/dist/featureFlags/featureFlags.resolve.js +29 -12
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.js +1 -0
  16. package/dist/provider/providerCached.core.d.ts +3 -3
  17. package/dist/provider/providerCached.core.js +1 -1
  18. package/dist/provider/providerComposite.core.d.ts +2 -2
  19. package/dist/provider/providerEnvironment.core.d.ts +3 -3
  20. package/dist/provider/providerEnvironment.core.js +1 -1
  21. package/dist/provider/providerMemory.core.d.ts +18 -2
  22. package/dist/provider/providerMemory.core.js +38 -4
  23. package/package.json +22 -14
  24. package/dist/evaluator/evaluator.core.d.ts.map +0 -1
  25. package/dist/evaluator/evaluator.core.js.map +0 -1
  26. package/dist/evaluator/evaluatorAttribute.d.ts.map +0 -1
  27. package/dist/evaluator/evaluatorAttribute.js.map +0 -1
  28. package/dist/evaluator/evaluatorRule.core.d.ts.map +0 -1
  29. package/dist/evaluator/evaluatorRule.core.js.map +0 -1
  30. package/dist/evaluator/index.d.ts.map +0 -1
  31. package/dist/evaluator/index.js.map +0 -1
  32. package/dist/featureFlagErrors/featureFlagError.base.d.ts.map +0 -1
  33. package/dist/featureFlagErrors/featureFlagError.base.js.map +0 -1
  34. package/dist/featureFlagErrors/featureFlagError.types.d.ts.map +0 -1
  35. package/dist/featureFlagErrors/featureFlagError.types.js.map +0 -1
  36. package/dist/featureFlagErrors/index.d.ts.map +0 -1
  37. package/dist/featureFlagErrors/index.js.map +0 -1
  38. package/dist/featureFlagTypes/featureFlag.interface.d.ts.map +0 -1
  39. package/dist/featureFlagTypes/featureFlag.interface.js.map +0 -1
  40. package/dist/featureFlagTypes/featureFlagContext.d.ts.map +0 -1
  41. package/dist/featureFlagTypes/featureFlagContext.js.map +0 -1
  42. package/dist/featureFlagTypes/featureFlagEvaluation.d.ts.map +0 -1
  43. package/dist/featureFlagTypes/featureFlagEvaluation.js.map +0 -1
  44. package/dist/featureFlagTypes/featureFlagProvider.d.ts.map +0 -1
  45. package/dist/featureFlagTypes/featureFlagProvider.js.map +0 -1
  46. package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.d.ts.map +0 -1
  47. package/dist/featureFlagTypes/featureFlagRule/featureFlagRule.type.js.map +0 -1
  48. package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.d.ts.map +0 -1
  49. package/dist/featureFlagTypes/featureFlagRule/featureFlagValue.type.js.map +0 -1
  50. package/dist/featureFlagTypes/featureFlagRule/index.d.ts.map +0 -1
  51. package/dist/featureFlagTypes/featureFlagRule/index.js.map +0 -1
  52. package/dist/featureFlagTypes/index.d.ts.map +0 -1
  53. package/dist/featureFlagTypes/index.js.map +0 -1
  54. package/dist/featureFlags/featureFlags.core.d.ts.map +0 -1
  55. package/dist/featureFlags/featureFlags.core.js.map +0 -1
  56. package/dist/featureFlags/featureFlags.resolve.d.ts.map +0 -1
  57. package/dist/featureFlags/featureFlags.resolve.js.map +0 -1
  58. package/dist/featureFlags/index.d.ts.map +0 -1
  59. package/dist/featureFlags/index.js.map +0 -1
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/index.js.map +0 -1
  62. package/dist/provider/index.d.ts.map +0 -1
  63. package/dist/provider/index.js.map +0 -1
  64. package/dist/provider/providerCached.core.d.ts.map +0 -1
  65. package/dist/provider/providerCached.core.js.map +0 -1
  66. package/dist/provider/providerComposite.core.d.ts.map +0 -1
  67. package/dist/provider/providerComposite.core.js.map +0 -1
  68. package/dist/provider/providerEnvironment.core.d.ts.map +0 -1
  69. package/dist/provider/providerEnvironment.core.js.map +0 -1
  70. package/dist/provider/providerMemory.core.d.ts.map +0 -1
  71. package/dist/provider/providerMemory.core.js.map +0 -1
  72. package/dist/registry/index.d.ts.map +0 -1
  73. package/dist/registry/index.js.map +0 -1
  74. package/dist/registry/registry.core.d.ts.map +0 -1
  75. package/dist/registry/registry.core.js.map +0 -1
  76. package/dist/rollout/index.d.ts.map +0 -1
  77. package/dist/rollout/index.js.map +0 -1
  78. package/dist/rollout/rolloutBucketing.d.ts.map +0 -1
  79. package/dist/rollout/rolloutBucketing.js.map +0 -1
  80. package/dist/rollout/rolloutHashing.d.ts.map +0 -1
  81. package/dist/rollout/rolloutHashing.js.map +0 -1
  82. package/dist/utils/index.d.ts.map +0 -1
  83. package/dist/utils/index.js.map +0 -1
  84. package/dist/utils/utils.helper.d.ts.map +0 -1
  85. package/dist/utils/utils.helper.js.map +0 -1
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { createFeatureFlagRegistry } from "../registry/registry.core.js";
9
9
  import { evaluateFlag } from "../evaluator/evaluator.core.js";
10
- import { FeatureFlagNotFoundError } from "../featureFlagErrors/featureFlagError.types.js";
10
+ import { FeatureFlagNotFoundError, FeatureFlagProviderError, } from "../featureFlagErrors/featureFlagError.types.js";
11
11
  import { resolveDependencies, mergeContext } from "./featureFlags.resolve.js";
12
12
  /**
13
13
  * Create a FeatureFlags instance.
@@ -16,45 +16,99 @@ import { resolveDependencies, mergeContext } from "./featureFlags.resolve.js";
16
16
  * @returns A FeatureFlags API object.
17
17
  */
18
18
  export function createFeatureFlags(options) {
19
- const { provider, defaultContext = {}, throwOnMissing = false } = options;
19
+ const { provider, defaultContext = {}, throwOnMissing = false, onError, throwOnProviderError = false, } = options;
20
20
  let registry = createFeatureFlagRegistry();
21
+ let loaded = false;
22
+ /**
23
+ * Report a provider failure, or rethrow it when the caller asked to own it.
24
+ *
25
+ * @returns `false` when the failure was contained.
26
+ */
27
+ function handleProviderError(error, source) {
28
+ if (throwOnProviderError)
29
+ throw error;
30
+ onError?.(error instanceof Error
31
+ ? error
32
+ : new FeatureFlagProviderError(`Provider ${source} failed.`, {
33
+ cause: error,
34
+ }), source);
35
+ return false;
36
+ }
21
37
  async function load() {
22
- const flags = await provider.getAll();
23
- registry = createFeatureFlagRegistry(flags);
38
+ try {
39
+ const flags = await provider.getAll();
40
+ registry = createFeatureFlagRegistry(flags);
41
+ loaded = true;
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ return handleProviderError(error, "FeatureFlagProvider.getAll");
46
+ }
24
47
  }
25
48
  async function ensureLoaded() {
26
- if (registry.size === 0)
27
- await load();
49
+ // Keyed on whether a load has ever succeeded, not on `registry.size`: a
50
+ // provider that legitimately holds no flags used to be re-queried on
51
+ // every single evaluation.
52
+ if (loaded)
53
+ return true;
54
+ return load();
28
55
  }
29
56
  async function resolveFlag(key) {
30
- let flag = registry.get(key);
31
- if (!flag) {
32
- flag = await provider.get(key);
57
+ const known = registry.get(key);
58
+ if (known)
59
+ return known;
60
+ try {
61
+ const flag = await provider.get(key);
33
62
  if (flag)
34
63
  registry.set(flag);
64
+ return flag;
65
+ }
66
+ catch (error) {
67
+ handleProviderError(error, "FeatureFlagProvider.get");
68
+ return undefined;
35
69
  }
36
- return flag;
37
70
  }
38
- return {
71
+ // A provider that can announce changes is asked to: without this, a flag
72
+ // flipped at the source never reached an already-loaded instance until
73
+ // somebody called refresh() by hand.
74
+ let unsubscribe = provider.subscribe?.((flags) => {
75
+ registry = createFeatureFlagRegistry(flags);
76
+ loaded = true;
77
+ });
78
+ const api = {
39
79
  async isEnabled(key, context) {
40
- const result = await this.evaluate(key, context);
41
- return result.value;
80
+ const result = await api.evaluate(key, context);
81
+ // Strictly `true`. Returning the raw value meant a flag holding a
82
+ // string or a number — "off", 0.5, a config object — came back truthy
83
+ // from a method whose whole contract is a boolean.
84
+ return result.value === true;
42
85
  },
43
86
  async get(key, context) {
44
- const result = await this.evaluate(key, context);
87
+ const result = await api.evaluate(key, context);
45
88
  return result.value;
46
89
  },
47
90
  async getBoolean(key, defaultValue, context) {
48
- const result = await this.evaluate(key, context);
49
- if (result.reason === "not_found")
91
+ const result = await api.evaluate(key, context);
92
+ if (result.reason === "not_found" || result.reason === "error") {
50
93
  return defaultValue;
51
- return result.value;
94
+ }
95
+ return typeof result.value === "boolean" ? result.value : defaultValue;
52
96
  },
53
97
  async evaluate(key, context) {
54
- await ensureLoaded();
98
+ const available = await ensureLoaded();
55
99
  const mergedCtx = mergeContext(defaultContext, context);
56
100
  const flag = await resolveFlag(key);
57
101
  if (!flag) {
102
+ if (!available) {
103
+ // The store could not be reached and nothing is known about this
104
+ // flag. Report it as an error, not as a decision.
105
+ return {
106
+ key,
107
+ value: undefined,
108
+ reason: "error",
109
+ defaulted: true,
110
+ };
111
+ }
58
112
  if (throwOnMissing)
59
113
  throw new FeatureFlagNotFoundError(key);
60
114
  return {
@@ -64,17 +118,10 @@ export function createFeatureFlags(options) {
64
118
  defaulted: true,
65
119
  };
66
120
  }
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);
121
+ const dependenciesSatisfied = !flag.dependencies ||
122
+ flag.dependencies.length === 0 ||
123
+ resolveDependencies(key, registry);
124
+ return evaluateFlag(flag, mergedCtx, { dependenciesSatisfied });
78
125
  },
79
126
  async snapshot(context) {
80
127
  await ensureLoaded();
@@ -82,20 +129,36 @@ export function createFeatureFlags(options) {
82
129
  const flags = registry.getAll();
83
130
  const results = new Map();
84
131
  for (const flag of flags) {
85
- if (flag.visibility === "client") {
86
- results.set(flag.key, evaluateFlag(flag, mergedCtx));
87
- }
132
+ // Only flags explicitly marked client-visible. A flag that declares
133
+ // no visibility stays server-side: a snapshot is shipped to a
134
+ // browser, so the safe default is to withhold.
135
+ if (flag.visibility !== "client")
136
+ continue;
137
+ const dependenciesSatisfied = !flag.dependencies ||
138
+ flag.dependencies.length === 0 ||
139
+ resolveDependencies(flag.key, registry);
140
+ results.set(flag.key, evaluateFlag(flag, mergedCtx, { dependenciesSatisfied }));
88
141
  }
89
142
  return results;
90
143
  },
91
144
  async refresh() {
92
- await provider.refresh?.();
145
+ try {
146
+ await provider.refresh?.();
147
+ }
148
+ catch (error) {
149
+ handleProviderError(error, "FeatureFlagProvider.refresh");
150
+ }
93
151
  await load();
94
152
  },
95
153
  async getAll() {
96
154
  await ensureLoaded();
97
155
  return registry.getAll();
98
156
  },
157
+ close() {
158
+ unsubscribe?.();
159
+ unsubscribe = undefined;
160
+ },
99
161
  };
162
+ return api;
100
163
  }
101
164
  //# sourceMappingURL=featureFlags.core.js.map
@@ -10,10 +10,11 @@ import type { FeatureFlagRegistry } from "../registry/registry.core.js";
10
10
  *
11
11
  * @param key - The flag key to resolve.
12
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.
13
+ * @param chain - Keys on the current resolution path, for cycle detection.
14
+ * @param satisfied - Keys already proved satisfied, to avoid re-walking them.
15
+ * @returns True if the flag and all its transitive dependencies are enabled.
15
16
  */
16
- export declare function resolveDependencies(key: string, registry: FeatureFlagRegistry, visited?: Set<string>): boolean;
17
+ export declare function resolveDependencies(key: string, registry: FeatureFlagRegistry, chain?: Set<string>, satisfied?: Set<string>): boolean;
17
18
  /**
18
19
  * Merge default context with provided context.
19
20
  */
@@ -8,23 +8,40 @@
8
8
  *
9
9
  * @param key - The flag key to resolve.
10
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.
11
+ * @param chain - Keys on the current resolution path, for cycle detection.
12
+ * @param satisfied - Keys already proved satisfied, to avoid re-walking them.
13
+ * @returns True if the flag and all its transitive dependencies are enabled.
13
14
  */
14
- export function resolveDependencies(key, registry, visited = new Set()) {
15
- if (visited.has(key))
15
+ export function resolveDependencies(key, registry, chain = new Set(), satisfied = new Set()) {
16
+ // A key already proved good on another branch is good here too. Reusing one
17
+ // "visited" set for both jobs meant a diamond — A depends on B and C, both
18
+ // of which depend on D — reported D as a cycle the second time it was
19
+ // reached and disabled A.
20
+ if (satisfied.has(key))
21
+ return true;
22
+ if (chain.has(key))
16
23
  return false;
17
- visited.add(key);
24
+ chain.add(key);
18
25
  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))
26
+ try {
27
+ if (!flag || !flag.enabled)
25
28
  return false;
29
+ if (!flag.dependencies || flag.dependencies.length === 0) {
30
+ satisfied.add(key);
31
+ return true;
32
+ }
33
+ for (const dep of flag.dependencies) {
34
+ if (!resolveDependencies(dep, registry, chain, satisfied))
35
+ return false;
36
+ }
37
+ satisfied.add(key);
38
+ return true;
39
+ }
40
+ finally {
41
+ // Leaving the key in the chain would make a sibling branch see a cycle
42
+ // that is not there.
43
+ chain.delete(key);
26
44
  }
27
- return true;
28
45
  }
29
46
  /**
30
47
  * Merge default context with provided context.
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { FeatureFlagNotFoundError, FeatureFlagProviderError, FeatureFlagEvaluati
12
12
  export { hashString } from "./rollout/rolloutHashing.js";
13
13
  export { getBucket, isInRollout } from "./rollout/rolloutBucketing.js";
14
14
  export { createMemoryProvider } from "./provider/providerMemory.core.js";
15
+ export type { MemoryFeatureFlagProvider } from "./provider/providerMemory.core.js";
15
16
  export { createEnvironmentProvider } from "./provider/providerEnvironment.core.js";
16
17
  export type { EnvironmentProviderOptions } from "./provider/providerEnvironment.core.js";
17
18
  export { createCompositeProvider } from "./provider/providerComposite.core.js";
@@ -21,9 +22,11 @@ export { resolvePath, matchAttribute } from "./evaluator/evaluatorAttribute.js";
21
22
  export { evaluateRule } from "./evaluator/evaluatorRule.core.js";
22
23
  export type { RuleEvaluationResult } from "./evaluator/evaluatorRule.core.js";
23
24
  export { evaluateFlag } from "./evaluator/evaluator.core.js";
25
+ export type { EvaluateFlagOptions } from "./evaluator/evaluator.core.js";
24
26
  export { createFeatureFlagRegistry } from "./registry/registry.core.js";
25
27
  export type { FeatureFlagRegistry } from "./registry/registry.core.js";
26
28
  export { createFeatureFlags } from "./featureFlags/featureFlags.core.js";
27
- export type { FeatureFlagsOptions } from "./featureFlags/featureFlags.core.js";
29
+ export type { FeatureFlags, FeatureFlagsOptions, } from "./featureFlags/featureFlags.core.js";
30
+ export { resolveDependencies, mergeContext, } from "./featureFlags/featureFlags.resolve.js";
28
31
  export { isPlainObject, valuesEqual } from "./utils/utils.helper.js";
29
32
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ export { evaluateFlag } from "./evaluator/evaluator.core.js";
24
24
  export { createFeatureFlagRegistry } from "./registry/registry.core.js";
25
25
  // ─── FeatureFlags ─────────────────────────────────────────────────────────
26
26
  export { createFeatureFlags } from "./featureFlags/featureFlags.core.js";
27
+ export { resolveDependencies, mergeContext, } from "./featureFlags/featureFlags.resolve.js";
27
28
  // ─── Utils ────────────────────────────────────────────────────────────────
28
29
  export { isPlainObject, valuesEqual } from "./utils/utils.helper.js";
29
30
  //# sourceMappingURL=index.js.map
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @module provider/providerCached
7
7
  */
8
- import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
8
+ import type { FeatureFlagProvider, RefreshableFeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
9
9
  /** Options for the cached provider. */
10
10
  export interface CachedProviderOptions {
11
11
  /** Time-to-live in milliseconds (default: 30,000). */
@@ -16,7 +16,7 @@ export interface CachedProviderOptions {
16
16
  *
17
17
  * @param inner - The upstream provider to cache.
18
18
  * @param options - Caching options.
19
- * @returns A FeatureFlagProvider with in-memory TTL caching.
19
+ * @returns A provider with in-memory TTL caching.
20
20
  */
21
- export declare function createCachedProvider(inner: FeatureFlagProvider, options?: CachedProviderOptions): FeatureFlagProvider;
21
+ export declare function createCachedProvider(inner: FeatureFlagProvider, options?: CachedProviderOptions): RefreshableFeatureFlagProvider;
22
22
  //# sourceMappingURL=providerCached.core.d.ts.map
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * @param inner - The upstream provider to cache.
12
12
  * @param options - Caching options.
13
- * @returns A FeatureFlagProvider with in-memory TTL caching.
13
+ * @returns A provider with in-memory TTL caching.
14
14
  */
15
15
  export function createCachedProvider(inner, options = {}) {
16
16
  const ttl = options.ttl ?? 30_000;
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @module provider/providerComposite
7
7
  */
8
- import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
8
+ import type { FeatureFlagProvider, RefreshableFeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
9
9
  /**
10
10
  * Create a composite provider that queries providers in order.
11
11
  *
@@ -15,5 +15,5 @@ import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvide
15
15
  * @param providers - Providers to chain, in priority order.
16
16
  * @returns A composite FeatureFlagProvider.
17
17
  */
18
- export declare function createCompositeProvider(providers: readonly FeatureFlagProvider[]): FeatureFlagProvider;
18
+ export declare function createCompositeProvider(providers: readonly FeatureFlagProvider[]): RefreshableFeatureFlagProvider;
19
19
  //# sourceMappingURL=providerComposite.core.d.ts.map
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module provider/providerEnvironment
9
9
  */
10
- import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
10
+ import type { RefreshableFeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
11
11
  /** Options for the environment provider. */
12
12
  export interface EnvironmentProviderOptions {
13
13
  /** Prefix for environment variable names (default: "FEATURE_"). */
@@ -19,7 +19,7 @@ export interface EnvironmentProviderOptions {
19
19
  * Create an environment-variable feature flag provider.
20
20
  *
21
21
  * @param options - Configuration options.
22
- * @returns A FeatureFlagProvider that reads from environment variables.
22
+ * @returns A provider that reads from environment variables.
23
23
  */
24
- export declare function createEnvironmentProvider(options?: EnvironmentProviderOptions): FeatureFlagProvider;
24
+ export declare function createEnvironmentProvider(options?: EnvironmentProviderOptions): RefreshableFeatureFlagProvider;
25
25
  //# sourceMappingURL=providerEnvironment.core.d.ts.map
@@ -24,7 +24,7 @@ function parseEnvValue(raw) {
24
24
  * Create an environment-variable feature flag provider.
25
25
  *
26
26
  * @param options - Configuration options.
27
- * @returns A FeatureFlagProvider that reads from environment variables.
27
+ * @returns A provider that reads from environment variables.
28
28
  */
29
29
  export function createEnvironmentProvider(options = {}) {
30
30
  const prefix = options.prefix ?? "FEATURE_";
@@ -6,12 +6,28 @@
6
6
  * @module provider/providerMemory
7
7
  */
8
8
  import type { FeatureFlag } from "../featureFlagTypes/featureFlag.interface.js";
9
- import type { FeatureFlagProvider } from "../featureFlagTypes/featureFlagProvider.js";
9
+ import type { FeatureFlagChangeListener, FeatureFlagProvider, Unsubscribe } from "../featureFlagTypes/featureFlagProvider.js";
10
+ /**
11
+ * An in-memory provider, with the mutation methods it actually has.
12
+ *
13
+ * `createMemoryProvider` used to return `FeatureFlagProvider` through a cast,
14
+ * so `set` and `delete` existed at runtime and were invisible to the type
15
+ * system — callers had to cast to reach them.
16
+ */
17
+ export interface MemoryFeatureFlagProvider extends FeatureFlagProvider {
18
+ /** Add or update a flag at runtime, notifying subscribers. */
19
+ set(flag: FeatureFlag): void;
20
+ /** Remove a flag by key, notifying subscribers. Returns whether it existed. */
21
+ delete(key: string): boolean;
22
+ /** Replace every flag at once, notifying subscribers. */
23
+ setAll(flags: readonly FeatureFlag[]): void;
24
+ subscribe(listener: FeatureFlagChangeListener): Unsubscribe;
25
+ }
10
26
  /**
11
27
  * Create an in-memory feature flag provider.
12
28
  *
13
29
  * @param flags - Initial flag definitions.
14
30
  * @returns A FeatureFlagProvider backed by a Map.
15
31
  */
16
- export declare function createMemoryProvider(flags?: readonly FeatureFlag[]): FeatureFlagProvider;
32
+ export declare function createMemoryProvider(flags?: readonly FeatureFlag[]): MemoryFeatureFlagProvider;
17
33
  //# sourceMappingURL=providerMemory.core.d.ts.map
@@ -13,23 +13,57 @@
13
13
  */
14
14
  export function createMemoryProvider(flags = []) {
15
15
  const store = new Map();
16
+ const listeners = new Set();
16
17
  for (const flag of flags) {
17
18
  store.set(flag.key, Object.freeze({ ...flag }));
18
19
  }
20
+ function snapshot() {
21
+ return [...store.values()];
22
+ }
23
+ /** Announce a change so an already-loaded consumer picks it up. */
24
+ function notify() {
25
+ if (listeners.size === 0)
26
+ return;
27
+ const current = snapshot();
28
+ for (const listener of listeners) {
29
+ // A broken listener must not stop the others, or the mutation itself.
30
+ try {
31
+ listener(current);
32
+ }
33
+ catch {
34
+ /* listener failures are the listener's problem */
35
+ }
36
+ }
37
+ }
19
38
  return {
20
39
  async get(key) {
21
40
  return store.get(key);
22
41
  },
23
42
  async getAll() {
24
- return [...store.values()];
43
+ return snapshot();
25
44
  },
26
- /** Add or update a flag at runtime. */
27
45
  set(flag) {
28
46
  store.set(flag.key, Object.freeze({ ...flag }));
47
+ notify();
29
48
  },
30
- /** Remove a flag by key. */
31
49
  delete(key) {
32
- return store.delete(key);
50
+ const existed = store.delete(key);
51
+ if (existed)
52
+ notify();
53
+ return existed;
54
+ },
55
+ setAll(next) {
56
+ store.clear();
57
+ for (const flag of next) {
58
+ store.set(flag.key, Object.freeze({ ...flag }));
59
+ }
60
+ notify();
61
+ },
62
+ subscribe(listener) {
63
+ listeners.add(listener);
64
+ return () => {
65
+ listeners.delete(listener);
66
+ };
33
67
  },
34
68
  };
35
69
  }
package/package.json CHANGED
@@ -1,32 +1,29 @@
1
1
  {
2
2
  "name": "@zudojs/feature-flags",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Feature flag system with deterministic rollouts, rule engine, providers, variants, snapshots, and evaluation context.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
8
8
  ".": {
9
- "import": "./dist/index.js",
10
- "types": "./dist/index.d.ts"
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
11
  }
12
12
  },
13
- "scripts": {
14
- "build": "tsc -p tsconfig.json",
15
- "typecheck": "tsc -p tsconfig.json --noEmit",
16
- "test": "vitest run",
17
- "test:watch": "vitest"
18
- },
19
13
  "dependencies": {
20
- "@zudojs/errors": "0.1.0"
14
+ "@zudojs/errors": "1.0.0"
21
15
  },
22
16
  "devDependencies": {
23
- "typescript": "^7.0.2",
17
+ "typescript": "7.0.2",
24
18
  "vitest": "^4.1.11"
25
19
  },
26
20
  "license": "MIT",
27
21
  "type": "module",
28
22
  "files": [
29
- "dist"
23
+ "dist",
24
+ "!dist/**/*.map",
25
+ "!dist/**/*.tsbuildinfo",
26
+ "!dist/.tsbuildinfo"
30
27
  ],
31
28
  "publishConfig": {
32
29
  "access": "public"
@@ -42,8 +39,19 @@
42
39
  "a-b-testing"
43
40
  ],
44
41
  "homepage": "https://github.com/oyinlola-tech/zudo#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/oyinlola-tech/zudo/issues"
44
+ },
45
45
  "repository": {
46
46
  "type": "git",
47
- "url": "https://github.com/oyinlola-tech/zudo"
47
+ "url": "https://github.com/oyinlola-tech/zudo",
48
+ "directory": "packages/feature-flags"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.json",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest",
55
+ "clean": "rm -rf dist *.tsbuildinfo"
48
56
  }
49
- }
57
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluator.core.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluator.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,EACV,qBAAqB,EAEtB,MAAM,8CAA8C,CAAC;AAGtD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,EAElD,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,kBAAuB,GAC/B,qBAAqB,CAAC,MAAM,CAAC,CA8E/B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluator.core.js","sourceRoot":"","sources":["../../src/evaluator/evaluator.core.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluatorAttribute.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluatorAttribute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAEvG;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAgB/D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,OAAO,GAChB,OAAO,CA4ET"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluatorAttribute.js","sourceRoot":"","sources":["../../src/evaluator/evaluatorAttribute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAY,GAAG,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,OAAO,KAAK,IAAI;YAChB,OAAO,KAAK,SAAS;YACrB,OAAO,OAAO,KAAK,QAAQ,EAC3B,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAe,EACf,QAA6B,EAC7B,QAAiB;IAEjB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,QAAQ,CAAC;QAE7B,KAAK,YAAY;YACf,OAAO,MAAM,KAAK,QAAQ,CAAC;QAE7B,KAAK,UAAU;YACb,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC1B,CAAC;QAEJ,KAAK,aAAa;YAChB,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC5B,CAAC;QAEJ,KAAK,WAAW;YACd,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC1B,CAAC;QAEJ,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9D,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/D,KAAK,cAAc;YACjB,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,GAAG,QAAQ,CAClB,CAAC;QAEJ,KAAK,uBAAuB;YAC1B,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,IAAI,QAAQ,CACnB,CAAC;QAEJ,KAAK,WAAW;YACd,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,GAAG,QAAQ,CAClB,CAAC;QAEJ,KAAK,oBAAoB;YACvB,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,IAAI,QAAQ,CACnB,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;QAEjD,KAAK,SAAS;YACZ,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAClC,CAAC;QAEJ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluatorRule.core.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluatorRule.core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AACnG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAIrG,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,MAAM,GACd,oBAAoB,CAkEtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluatorRule.core.js","sourceRoot":"","sources":["../../src/evaluator/evaluatorRule.core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYtE;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAqB,EACrB,OAA2B,EAC3B,OAAe;IAEf,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9C,KAAK,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,WAAW,EAAE,CAAC;YACjB,IAAI,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACxD,CAAC;QAED,KAAK,YAAY,EAAE,CAAC;YAClB,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,IAAI,WAAW,CAAC;YACzE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,IAAI,WAAW,CAAC;YACzE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACtC,CAAC,GAAW,EAAE,CAAqB,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EACtD,CAAC,CACF,CAAC;YACF,IAAI,WAAW,IAAI,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAEhD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;gBACnD,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;oBACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACrE,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evaluator/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evaluator/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagError.base.d.ts","sourceRoot":"","sources":["../../src/featureFlagErrors/featureFlagError.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,YAAmB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,EAUxE;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagError.base.js","sourceRoot":"","sources":["../../src/featureFlagErrors/featureFlagError.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAiB7D;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IACpD,YAAmB,OAAe,EAAE,OAAO,GAA4B,EAAE;QACvE,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,OAAO;YACvC,QAAQ,EAAE,OAAO,CAAC,QAAqC;YACvD,QAAQ,EAAE,OAAO,CAAC,QAAqC;YACvD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagError.types.d.ts","sourceRoot":"","sources":["../../src/featureFlagErrors/featureFlagError.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,2DAA2D;AAC3D,qBAAa,wBAAyB,SAAQ,gBAAgB;IAC5D,YAAmB,GAAG,EAAE,MAAM,EAO7B;CACF;AAED,iDAAiD;AACjD,qBAAa,wBAAyB,SAAQ,gBAAgB;IAC5D,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAQnE;CACF;AAED,uDAAuD;AACvD,qBAAa,0BAA2B,SAAQ,gBAAgB;IAC9D,YAAmB,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAM7C;CACF;AAED,0CAA0C;AAC1C,qBAAa,oBAAqB,SAAQ,gBAAgB;IACxD,YAAmB,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAM7C;CACF;AAED,kDAAkD;AAClD,qBAAa,0BAA2B,SAAQ,gBAAgB;IAC9D,YAAmB,KAAK,EAAE,SAAS,MAAM,EAAE,EAM1C;CACF;AAED,iDAAiD;AACjD,qBAAa,6BAA8B,SAAQ,gBAAgB;IACjE,YAAmB,OAAO,EAAE,MAAM,EAKjC;CACF;AAED,uDAAuD;AACvD,qBAAa,oBAAqB,SAAQ,gBAAgB;IACxD,YAAmB,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAM/D;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagError.types.js","sourceRoot":"","sources":["../../src/featureFlagErrors/featureFlagError.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,2DAA2D;AAC3D,MAAM,OAAO,wBAAyB,SAAQ,gBAAgB;IAC5D,YAAmB,GAAW;QAC5B,KAAK,CAAC,4BAA4B,GAAG,IAAI,EAAE;YACzC,IAAI,EAAE,SAAS,CAAC,sBAAsB;YACtC,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,EAAE,GAAG,EAAE;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,OAAO,wBAAyB,SAAQ,gBAAgB;IAC5D,YACE,OAAe,EACf,OAAkE;QAElE,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,SAAS,CAAC,qBAAqB;YACrC,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,YAAmB,GAAW,EAAE,MAAc;QAC5C,KAAK,CAAC,+BAA+B,GAAG,MAAM,MAAM,GAAG,EAAE;YACvD,IAAI,EAAE,SAAS,CAAC,uBAAuB;YACvC,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,0CAA0C;AAC1C,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IACxD,YAAmB,GAAW,EAAE,MAAc;QAC5C,KAAK,CAAC,0BAA0B,GAAG,MAAM,MAAM,GAAG,EAAE;YAClD,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,kDAAkD;AAClD,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,YAAmB,KAAwB;QACzC,KAAK,CAAC,2CAA2C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACrE,IAAI,EAAE,SAAS,CAAC,uBAAuB;YACvC,QAAQ,EAAE,EAAE,KAAK,EAAE;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,OAAO,6BAA8B,SAAQ,gBAAgB;IACjE,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,SAAS,CAAC,0BAA0B;SAC3C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IACxD,YAAmB,GAAW,EAAE,QAAgB,EAAE,MAAc;QAC9D,KAAK,CAAC,SAAS,GAAG,cAAc,QAAQ,YAAY,MAAM,GAAG,EAAE;YAC7D,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/featureFlagErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,6BAA6B,CAAC"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlag.interface.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlag.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagContext.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagEvaluation.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagEvaluation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"featureFlagProvider.js","sourceRoot":"","sources":["../../src/featureFlagTypes/featureFlagProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}