make envOptions dynamic

This commit is contained in:
Hazelnoot 2025-10-08 10:35:53 -04:00
parent 6e36462c80
commit 21a8cfef65

View file

@ -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<EnvOption> = {
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<EnvOption> = {
...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<Record<string, string>>): 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;
},
});
}