Skip to content

Commit 11f992a

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

File tree

2 files changed

+147
-84
lines changed

2 files changed

+147
-84
lines changed

src/FlagStore.js

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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 getAllOverrides() {
79+
if (!flagOverrides) {
80+
return {}; // No overrides set
81+
}
82+
83+
const result = {};
84+
Object.keys(flagOverrides).forEach(key => {
85+
const override = flagOverrides[key];
86+
if (override) {
87+
result[key] = override.value;
88+
}
89+
});
90+
return result;
91+
}
92+
93+
function getFlags() {
94+
return flags;
95+
}
96+
97+
function getFlagOverrides() {
98+
return flagOverrides || {};
99+
}
100+
101+
return {
102+
get,
103+
getFlagsWithOverrides,
104+
setFlags,
105+
setOverride,
106+
removeOverride,
107+
clearAllOverrides,
108+
getAllOverrides,
109+
getFlags,
110+
getFlagOverrides,
111+
};
112+
}
113+
114+
module.exports = FlagStore;

0 commit comments

Comments
 (0)