From 21a8cfef65876b329c24d84bac732f8bfb8f5bb7 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Wed, 8 Oct 2025 10:35:53 -0400 Subject: [PATCH] make envOptions dynamic --- packages/backend/src/env.ts | 80 +++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/env.ts b/packages/backend/src/env.ts index 9a50eb8561..0b21ec35fa 100644 --- a/packages/backend/src/env.ts +++ b/packages/backend/src/env.ts @@ -3,7 +3,19 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -const envOption = { +export interface EnvOption { + onlyQueue: boolean; + onlyServer: boolean; + noDaemons: boolean; + disableClustering: boolean; + verbose: boolean; + withLogTime: boolean; + quiet: boolean; + hideWorkerId: boolean; + [key: string]: boolean; +} + +const defaultEnvOption: Readonly = { onlyQueue: false, onlyServer: false, noDaemons: false, @@ -14,12 +26,66 @@ const envOption = { hideWorkerId: false, }; -for (const key of Object.keys(envOption) as (keyof typeof envOption)[]) { - if (process.env['MK_' + key.replace(/[A-Z]/g, letter => `_${letter}`).toUpperCase()]) envOption[key] = true; +function translateKey(key: string): string { + return 'MK_' + key.replace(/[A-Z]/g, letter => `_${letter}`).toUpperCase(); } -if (process.env.NODE_ENV === 'test') envOption.disableClustering = true; -if (process.env.NODE_ENV === 'test') envOption.quiet = true; -if (process.env.NODE_ENV === 'test') envOption.noDaemons = true; +const testEnvOption: Readonly = { + ...defaultEnvOption, + disableClustering: true, + quiet: true, + noDaemons: true, +}; -export { envOption }; +/** @deprecated use EnvService when possible */ +export const envOption: EnvOption = createEnvOptions(() => process.env); + +export function createEnvOptions(getEnv: () => Partial>): EnvOption { + return new Proxy({} as EnvOption, { + get(target, key) { + if (typeof(key) !== 'string') { + return Reflect.get(target, key); + } + + const env = getEnv(); + const envKey = translateKey(key); + if (envKey in env) { + return !!env[envKey]; + } + + const def = env.NODE_ENV === 'test' ? testEnvOption : defaultEnvOption; + if (key in def) { + return def[key]; + } + + return false; + }, + set(target, key, value) { + if (typeof(key) !== 'string') { + return Reflect.set(target, key, value); + } + + const env = getEnv(); + const envKey = translateKey(key); + if (value) { + env[envKey] = '1'; + } else { + delete env[envKey]; + } + return true; + }, + has(target, key): boolean { + return typeof(key) === 'string' || key in target; + }, + deleteProperty(target, key): boolean { + if (typeof(key) !== 'string') { + return Reflect.deleteProperty(target, key); + } + + const env = getEnv(); + const envKey = translateKey(key); + delete env[envKey]; + return true; + }, + }); +}