77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
import { exit } from 'node:process';
|
|
import { type } from 'arktype';
|
|
import log from '~/utils/log';
|
|
|
|
// Custom type for boolean environment variables, allowing for values like
|
|
// 1, true, yes, and on to count as a truthy value.
|
|
const booleanEnv = type('string | undefined').pipe((v) => {
|
|
return ['1', 'true', 'yes', 'on'].includes(v?.toLowerCase() ?? '');
|
|
});
|
|
|
|
export const envVariables = {
|
|
debugLog: 'HEADPLANE_DEBUG_LOG',
|
|
envOverrides: 'HEADPLANE_LOAD_ENV_OVERRIDES',
|
|
configPath: 'HEADPLANE_CONFIG_PATH',
|
|
} as const;
|
|
|
|
export function configureLogger(env: string | undefined) {
|
|
const result = booleanEnv(env);
|
|
if (result instanceof type.errors) {
|
|
log.error(
|
|
'config',
|
|
'HEADPLANE_DEBUG_LOG value is invalid: %s',
|
|
result.summary,
|
|
);
|
|
log.info('config', 'Using a default value: false');
|
|
log.debug = () => {}; // Disable debug logging if the value is invalid
|
|
log.debugEnabled = false;
|
|
return;
|
|
}
|
|
|
|
if (result === false) {
|
|
log.debug = () => {}; // Disable debug logging if the value is false
|
|
log.debugEnabled = false;
|
|
return;
|
|
}
|
|
|
|
log.debug('config', 'Debug logging has been enabled');
|
|
log.debug('config', 'It is recommended this be disabled in production');
|
|
}
|
|
|
|
export interface EnvOverrides {
|
|
loadEnv: boolean;
|
|
path: string;
|
|
}
|
|
|
|
export function configureConfig(overrides: {
|
|
loadEnv: string | undefined;
|
|
path: string | undefined;
|
|
}): EnvOverrides {
|
|
const loadResult = booleanEnv(overrides.loadEnv);
|
|
if (loadResult instanceof type.errors) {
|
|
log.error(
|
|
'config',
|
|
'HEADPLANE_LOAD_ENV_OVERRIDES value is invalid: %s',
|
|
loadResult.summary,
|
|
);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
const pathResult = type('string | undefined')(overrides.path);
|
|
if (pathResult instanceof type.errors) {
|
|
log.error(
|
|
'config',
|
|
'HEADPLANE_CONFIG_PATH value is invalid: %s',
|
|
pathResult.summary,
|
|
);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
return {
|
|
loadEnv: loadResult,
|
|
path: pathResult ?? '/etc/headplane/config.yaml',
|
|
};
|
|
}
|