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 {};
};
export const isFlagEnabled = (flag: string) => flag !== "" && flag !== "false";

View file

@ -37,4 +37,26 @@ describe("useAllEnvFlags hook", () => {
// Assert
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 { envNameToFlagName, readAllFlagsFromEnv } from "./helpers";
import {
envNameToFlagName,
isFlagEnabled,
readAllFlagsFromEnv,
} from "./helpers";
export const useAllEnvFlags = (): FlagWithName[] => {
const flags = readAllFlagsFromEnv();
return Object.entries(flags).map(([flagKey, flagValue]) => ({
name: envNameToFlagName(flagKey),
enabled: flagValue !== "",
enabled: isFlagEnabled(flagValue),
value: flagValue,
}));
};

View file

@ -54,4 +54,24 @@ describe("useEnvFlags hook", () => {
// Assert
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 { flagNameToEnvName, readFlagFromEnv } from "./helpers";
import { flagNameToEnvName, isFlagEnabled, readFlagFromEnv } from "./helpers";
export const useEnvFlags = <T extends readonly string[]>(
flags: readonly [...T],
@ -9,7 +9,7 @@ export const useEnvFlags = <T extends readonly string[]>(
if (envFlag) {
acc[flag] = {
enabled: envFlag !== "",
enabled: isFlagEnabled(envFlag),
value: envFlag,
};
} else {

View file

@ -9,7 +9,7 @@ export const useAllServiceFlags = (): FlagWithName[] => {
return Object.entries(flags).map(([name, { value, enabled }]) => ({
name: camelCase(name),
value: value ?? "",
value: value.toString() ?? "",
enabled,
}));
};

View file

@ -14,7 +14,7 @@ export const useServiceFlags = <T extends readonly string[]>(
if (flagsmithFlags[flagName]) {
acc[flag] = {
enabled: flagsmithFlags[flagName].enabled,
value: flagsmithFlags[flagName].value ?? "",
value: flagsmithFlags[flagName].value.toString() ?? "",
};
}

View file

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