Skip to content

Commit 40a34b9

Browse files
feat: implement FlagStore for centralized flag management
Introduced a new FlagStore module to encapsulate flag management logic.
1 parent 2cbe74c commit 40a34b9

File tree

2 files changed

+135
-72
lines changed

2 files changed

+135
-72
lines changed

src/FlagStore.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
const utils = require('./utils');
2+
3+
function FlagStore() {
4+
let flags = {};
5+
let flagOverrides;
6+
7+
function get(key) {
8+
// Check overrides first, then real flags
9+
if (flagOverrides && utils.objectHasOwnProperty(flagOverrides, key) && flagOverrides[key]) {
10+
return flagOverrides[key];
11+
}
12+
13+
if (flags && utils.objectHasOwnProperty(flags, key) && flags[key] && !flags[key].deleted) {
14+
return flags[key];
15+
}
16+
17+
return null;
18+
}
19+
20+
function getFlagsWithOverrides() {
21+
const result = {};
22+
23+
// Add all flags first
24+
for (const key in flags) {
25+
const flag = get(key);
26+
if (flag) {
27+
result[key] = flag;
28+
}
29+
}
30+
31+
// Override with any flagOverrides (they take precedence)
32+
if (flagOverrides) {
33+
for (const key in flagOverrides) {
34+
const override = get(key);
35+
if (override) {
36+
result[key] = override;
37+
}
38+
}
39+
}
40+
41+
return result;
42+
}
43+
44+
function setFlags(newFlags) {
45+
flags = { ...newFlags };
46+
}
47+
48+
function setOverride(key, value) {
49+
if (!flagOverrides) {
50+
flagOverrides = {};
51+
}
52+
flagOverrides[key] = { value };
53+
}
54+
55+
function removeOverride(key) {
56+
if (!flagOverrides || !flagOverrides[key]) {
57+
return; // No override to remove
58+
}
59+
60+
delete flagOverrides[key];
61+
62+
// If no more overrides, reset to undefined for performance
63+
if (Object.keys(flagOverrides).length === 0) {
64+
flagOverrides = undefined;
65+
}
66+
}
67+
68+
function clearAllOverrides() {
69+
if (!flagOverrides) {
70+
return {}; // No overrides to clear, return empty object for consistency
71+
}
72+
73+
const clearedOverrides = { ...flagOverrides };
74+
flagOverrides = undefined; // Reset to undefined
75+
return clearedOverrides;
76+
}
77+
78+
function getFlags() {
79+
return flags;
80+
}
81+
82+
function getFlagOverrides() {
83+
return flagOverrides || {};
84+
}
85+
86+
return {
87+
clearAllOverrides,
88+
get,
89+
getFlagOverrides,
90+
getFlags,
91+
getFlagsWithOverrides,
92+
removeOverride,
93+
setFlags,
94+
setOverride,
95+
};
96+
}
97+
98+
module.exports = FlagStore;

0 commit comments

Comments
 (0)