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:
poulch 2023-01-24 11:27:04 +01:00 committed by GitHub
parent 1b51a978ec
commit 0c704cf1d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 55 additions and 7 deletions

View file

@ -30,3 +30,5 @@ export const readAllFlagsFromEnv = (): Record<string, string> => {
return {}; return {};
}; };
export const isFlagEnabled = (flag: string) => flag !== "" && flag !== "false";

View file

@ -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",
},
]);
});
}); });

View file

@ -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,
})); }));
}; };

View file

@ -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",
},
});
});
}); });

View file

@ -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 {

View file

@ -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,
})); }));
}; };

View file

@ -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() ?? "",
}; };
} }

View file

@ -1,5 +1,5 @@
export interface Flag { export interface Flag {
value: string | number | boolean; value: string;
enabled: boolean; enabled: boolean;
} }