Skip to content

Commit 2cbe74c

Browse files
refactor: add lazy initialization for flagOverrides with optimizations
Initialize flagOverrides as undefined until needed, optimize getAll() iteration, and simplify setOverride() logic. Improves performance for common case where no overrides are used while maintaining full compatibility.
1 parent c40f020 commit 2cbe74c

File tree

1 file changed

+50
-21
lines changed

1 file changed

+50
-21
lines changed

src/index.js

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function initialize(env, context, specifiedOptions, platform, extraOptionDefs) {
8282
const requestor = Requestor(platform, options, environment);
8383

8484
let flags = {};
85-
let flagOverrides = {};
85+
let flagOverrides;
8686

8787
// Central flag store facade - single source of truth for all flag access
8888
const flagStore = {
@@ -100,15 +100,26 @@ function initialize(env, context, specifiedOptions, platform, extraOptionDefs) {
100100
},
101101

102102
getAll() {
103-
const allKeys = new Set([...Object.keys(flags || {}), ...Object.keys(flagOverrides || {})]);
104-
105103
const result = {};
106-
allKeys.forEach(key => {
104+
105+
// Add all flags first
106+
for (const key in flags) {
107107
const flag = this.get(key);
108108
if (flag) {
109109
result[key] = flag;
110110
}
111-
});
111+
}
112+
113+
// Override with any flagOverrides (they take precedence)
114+
if (flagOverrides) {
115+
for (const key in flagOverrides) {
116+
const override = this.get(key);
117+
if (override) {
118+
result[key] = override;
119+
}
120+
}
121+
}
122+
112123
return result;
113124
},
114125
};
@@ -910,42 +921,56 @@ function initialize(env, context, specifiedOptions, platform, extraOptionDefs) {
910921
registerPlugins(logger, pluginEnvironment, client, plugins);
911922

912923
function setOverride(key, value) {
913-
const data = { key, value };
914924
const mods = {};
915925

916-
const currentValue = flagStore.get(key);
926+
const currentFlag = flagStore.get(key);
927+
const currentValue = currentFlag ? currentFlag.value : null;
917928

918929
if (currentValue === value) {
919930
logger.debug(`setOverride: No change needed for ${key}, value already ${value}`);
920931
return;
921932
}
922933

923-
const newFlag = utils.extend({}, data);
924-
delete newFlag['key'];
925-
flagOverrides[data.key] = newFlag;
934+
const newFlag = { value };
935+
if (!flagOverrides) {
936+
flagOverrides = {};
937+
}
938+
flagOverrides[key] = newFlag;
926939
const newDetail = getFlagDetail(newFlag);
927940

928-
mods[data.key] = { previous: currentValue, current: newDetail };
941+
mods[key] = { previous: currentValue, current: newDetail };
929942

930-
notifyInspectionFlagChanged(data, newFlag);
943+
notifyInspectionFlagChanged({ key }, newFlag);
931944
handleFlagChanges(mods);
932945
}
933946

934947
function removeOverride(key) {
935-
if (flagOverrides[key]) {
936-
const mods = {};
937-
const oldOverride = flagOverrides[key];
938-
const realFlag = flags[key];
948+
if (!flagOverrides || !flagOverrides[key]) {
949+
return; // No override to remove
950+
}
939951

940-
mods[key] = { previous: oldOverride.value, current: realFlag ? getFlagDetail(realFlag) : undefined };
952+
const mods = {};
953+
const oldOverride = flagOverrides[key];
954+
const realFlag = flags[key];
941955

942-
delete flagOverrides[key];
943-
notifyInspectionFlagChanged({ key }, realFlag);
944-
handleFlagChanges(mods); // don't wait for this Promise to be resolved
956+
mods[key] = { previous: oldOverride.value, current: realFlag ? getFlagDetail(realFlag) : undefined };
957+
958+
delete flagOverrides[key];
959+
960+
// If no more overrides, reset to undefined
961+
if (Object.keys(flagOverrides).length === 0) {
962+
flagOverrides = undefined;
945963
}
964+
965+
notifyInspectionFlagChanged({ key }, realFlag);
966+
handleFlagChanges(mods); // don't wait for this Promise to be resolved
946967
}
947968

948969
function clearAllOverrides() {
970+
if (!flagOverrides) {
971+
return; // No overrides to clear
972+
}
973+
949974
const mods = {};
950975
Object.keys(flagOverrides).forEach(key => {
951976
const oldOverride = flagOverrides[key];
@@ -954,14 +979,18 @@ function initialize(env, context, specifiedOptions, platform, extraOptionDefs) {
954979
mods[key] = { previous: oldOverride.value, current: realFlag ? getFlagDetail(realFlag) : undefined };
955980
});
956981

957-
flagOverrides = {};
982+
flagOverrides = undefined; // Reset to undefined instead of empty object
958983

959984
if (Object.keys(mods).length > 0) {
960985
handleFlagChanges(mods); // don't wait for this Promise to be resolved
961986
}
962987
}
963988

964989
function getAllOverrides() {
990+
if (!flagOverrides) {
991+
return {}; // No overrides set
992+
}
993+
965994
const result = {};
966995
Object.keys(flagOverrides).forEach(key => {
967996
const override = flagOverrides[key];

0 commit comments

Comments
 (0)