fix: restore feature boolean logic (#671)

Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com>
This commit is contained in:
Igor Monadical
2025-09-24 11:57:49 -04:00
committed by GitHub
parent 5bf64b5a41
commit 36608849ec
2 changed files with 29 additions and 31 deletions

View File

@@ -21,8 +21,10 @@ const FEATURE_ENV_NAMES = [
FEATURE_ROOMS_ENV_NAME, FEATURE_ROOMS_ENV_NAME,
] as const; ] as const;
export type FeatureEnvName = (typeof FEATURE_ENV_NAMES)[number];
export type EnvFeaturePartial = { export type EnvFeaturePartial = {
[key in (typeof FEATURE_ENV_NAMES)[number]]: boolean; [key in FeatureEnvName]: boolean | null;
}; };
// CONTRACT: isomorphic with JSON.stringify // CONTRACT: isomorphic with JSON.stringify
@@ -51,7 +53,8 @@ export const getClientEnvClient = (): ClientEnvCommon => {
return clientEnv!; return clientEnv!;
}; };
const parseBooleanString = (str: string | undefined): boolean => { const parseBooleanString = (str: string | undefined): boolean | null => {
if (str === undefined) return null;
return str === "true"; return str === "true";
}; };

View File

@@ -4,6 +4,8 @@ import {
FEATURE_REQUIRE_LOGIN_ENV_NAME, FEATURE_REQUIRE_LOGIN_ENV_NAME,
FEATURE_ROOMS_ENV_NAME, FEATURE_ROOMS_ENV_NAME,
FEATURE_SEND_TO_ZULIP_ENV_NAME, FEATURE_SEND_TO_ZULIP_ENV_NAME,
FeatureEnvName,
getClientEnv,
} from "./clientEnv"; } from "./clientEnv";
export const FEATURES = [ export const FEATURES = [
@@ -26,37 +28,30 @@ export const DEFAULT_FEATURES: Features = {
rooms: true, rooms: true,
} as const; } as const;
function parseBooleanEnv( export const ENV_TO_FEATURE: {
value: string | undefined, [k in FeatureEnvName]: FeatureName;
defaultValue: boolean = false, } = {
): boolean { FEATURE_REQUIRE_LOGIN: "requireLogin",
if (!value) return defaultValue; FEATURE_PRIVACY: "privacy",
return value.toLowerCase() === "true"; FEATURE_BROWSE: "browse",
} FEATURE_SEND_TO_ZULIP: "sendToZulip",
FEATURE_ROOMS: "rooms",
} as const;
const features: Features = { export const FEATURE_TO_ENV: {
requireLogin: parseBooleanEnv( [k in FeatureName]: FeatureEnvName;
process.env[FEATURE_REQUIRE_LOGIN_ENV_NAME], } = {
DEFAULT_FEATURES.requireLogin, requireLogin: "FEATURE_REQUIRE_LOGIN",
), privacy: "FEATURE_PRIVACY",
privacy: parseBooleanEnv( browse: "FEATURE_BROWSE",
process.env[FEATURE_PRIVACY_ENV_NAME], sendToZulip: "FEATURE_SEND_TO_ZULIP",
DEFAULT_FEATURES.privacy, rooms: "FEATURE_ROOMS",
),
browse: parseBooleanEnv(
process.env[FEATURE_BROWSE_ENV_NAME],
DEFAULT_FEATURES.browse,
),
sendToZulip: parseBooleanEnv(
process.env[FEATURE_SEND_TO_ZULIP_ENV_NAME],
DEFAULT_FEATURES.sendToZulip,
),
rooms: parseBooleanEnv(
process.env[FEATURE_ROOMS_ENV_NAME],
DEFAULT_FEATURES.rooms,
),
}; };
const features = getClientEnv();
export const featureEnabled = (featureName: FeatureName): boolean => { export const featureEnabled = (featureName: FeatureName): boolean => {
return features[featureName]; const isSet = features[FEATURE_TO_ENV[featureName]];
if (isSet === null) return DEFAULT_FEATURES[featureName];
return isSet;
}; };