Improve feature flags (#3027)
* Fix checking if env flag is enabled * Restrict flag value to string * Flagsmit to string value
This commit is contained in:
parent
1b51a978ec
commit
0c704cf1d7
8 changed files with 55 additions and 7 deletions
2
src/hooks/useFlags/env/helpers.ts
vendored
2
src/hooks/useFlags/env/helpers.ts
vendored
|
@ -30,3 +30,5 @@ export const readAllFlagsFromEnv = (): Record<string, string> => {
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isFlagEnabled = (flag: string) => flag !== "" && flag !== "false";
|
||||||
|
|
22
src/hooks/useFlags/env/useAllEnvFlags.test.tsx
vendored
22
src/hooks/useFlags/env/useAllEnvFlags.test.tsx
vendored
|
@ -37,4 +37,26 @@ describe("useAllEnvFlags hook", () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(result.current).toEqual([]);
|
expect(result.current).toEqual([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("should return array with disabled flags", () => {
|
||||||
|
// Arrange && Act
|
||||||
|
FLAGS.FF_FLAG_ONE = "";
|
||||||
|
FLAGS.FF_FLAG_TWO = "false";
|
||||||
|
|
||||||
|
const { result } = renderHook(() => useAllEnvFlags());
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result.current).toEqual([
|
||||||
|
{
|
||||||
|
name: "flagOne",
|
||||||
|
enabled: false,
|
||||||
|
value: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "flagTwo",
|
||||||
|
enabled: false,
|
||||||
|
value: "false",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
8
src/hooks/useFlags/env/useAllEnvFlags.ts
vendored
8
src/hooks/useFlags/env/useAllEnvFlags.ts
vendored
|
@ -1,12 +1,16 @@
|
||||||
import { FlagWithName } from "../types";
|
import { FlagWithName } from "../types";
|
||||||
import { envNameToFlagName, readAllFlagsFromEnv } from "./helpers";
|
import {
|
||||||
|
envNameToFlagName,
|
||||||
|
isFlagEnabled,
|
||||||
|
readAllFlagsFromEnv,
|
||||||
|
} from "./helpers";
|
||||||
|
|
||||||
export const useAllEnvFlags = (): FlagWithName[] => {
|
export const useAllEnvFlags = (): FlagWithName[] => {
|
||||||
const flags = readAllFlagsFromEnv();
|
const flags = readAllFlagsFromEnv();
|
||||||
|
|
||||||
return Object.entries(flags).map(([flagKey, flagValue]) => ({
|
return Object.entries(flags).map(([flagKey, flagValue]) => ({
|
||||||
name: envNameToFlagName(flagKey),
|
name: envNameToFlagName(flagKey),
|
||||||
enabled: flagValue !== "",
|
enabled: isFlagEnabled(flagValue),
|
||||||
value: flagValue,
|
value: flagValue,
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
20
src/hooks/useFlags/env/useEnvFlags.test.tsx
vendored
20
src/hooks/useFlags/env/useEnvFlags.test.tsx
vendored
|
@ -54,4 +54,24 @@ describe("useEnvFlags hook", () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(result.current).toEqual({});
|
expect(result.current).toEqual({});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("should return array with disabled flags", () => {
|
||||||
|
// Arrange && Act
|
||||||
|
FLAGS.FF_FLAG_ONE = "";
|
||||||
|
FLAGS.FF_FLAG_TWO = "false";
|
||||||
|
|
||||||
|
const { result } = renderHook(() => useEnvFlags(["flagOne", "flag_two"]));
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result.current).toEqual({
|
||||||
|
flagOne: {
|
||||||
|
enabled: false,
|
||||||
|
value: "",
|
||||||
|
},
|
||||||
|
flag_two: {
|
||||||
|
enabled: false,
|
||||||
|
value: "false",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
4
src/hooks/useFlags/env/useEnvFlags.ts
vendored
4
src/hooks/useFlags/env/useEnvFlags.ts
vendored
|
@ -1,5 +1,5 @@
|
||||||
import { FlagsResults } from "../types";
|
import { FlagsResults } from "../types";
|
||||||
import { flagNameToEnvName, readFlagFromEnv } from "./helpers";
|
import { flagNameToEnvName, isFlagEnabled, readFlagFromEnv } from "./helpers";
|
||||||
|
|
||||||
export const useEnvFlags = <T extends readonly string[]>(
|
export const useEnvFlags = <T extends readonly string[]>(
|
||||||
flags: readonly [...T],
|
flags: readonly [...T],
|
||||||
|
@ -9,7 +9,7 @@ export const useEnvFlags = <T extends readonly string[]>(
|
||||||
|
|
||||||
if (envFlag) {
|
if (envFlag) {
|
||||||
acc[flag] = {
|
acc[flag] = {
|
||||||
enabled: envFlag !== "",
|
enabled: isFlagEnabled(envFlag),
|
||||||
value: envFlag,
|
value: envFlag,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -9,7 +9,7 @@ export const useAllServiceFlags = (): FlagWithName[] => {
|
||||||
|
|
||||||
return Object.entries(flags).map(([name, { value, enabled }]) => ({
|
return Object.entries(flags).map(([name, { value, enabled }]) => ({
|
||||||
name: camelCase(name),
|
name: camelCase(name),
|
||||||
value: value ?? "",
|
value: value.toString() ?? "",
|
||||||
enabled,
|
enabled,
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,7 +14,7 @@ export const useServiceFlags = <T extends readonly string[]>(
|
||||||
if (flagsmithFlags[flagName]) {
|
if (flagsmithFlags[flagName]) {
|
||||||
acc[flag] = {
|
acc[flag] = {
|
||||||
enabled: flagsmithFlags[flagName].enabled,
|
enabled: flagsmithFlags[flagName].enabled,
|
||||||
value: flagsmithFlags[flagName].value ?? "",
|
value: flagsmithFlags[flagName].value.toString() ?? "",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export interface Flag {
|
export interface Flag {
|
||||||
value: string | number | boolean;
|
value: string;
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue