ls-deno/config.ts

89 lines
1.9 KiB
TypeScript

import {
type LevelName,
LogLevels,
} from "https://deno.land/std@0.159.0/log/mod.ts";
export interface LogConfig {
consoleLevelName: LevelName;
}
export interface PostgresConfig {
url: string;
}
export interface MailgunConfig {
apiKey?: string;
domain?: string;
}
export interface Config {
log: LogConfig;
postgres: PostgresConfig;
mailgun: MailgunConfig;
isDevelopmentMode: boolean;
}
function truthyEnv(key: string): boolean {
return (Deno.env.get(key) || "").toString().toLowerCase().trim() in
["true", "1"];
}
function isLogLevelName(s: string): s is LevelName {
return s in LogLevels;
}
export let config: Readonly<Config>;
type Logger = { warning: (s: string, ...opts: unknown[]) => void };
export function setAll(newConfig: Config) {
config = newConfig;
}
export function reload(): [
Config,
((logger: Logger) => void)[],
] {
// since we want configuration to be setup before any logging, lets save logs here until the logger is setup
const logCalls = [];
const envOrWarn = (key: string, fallback: string): string => {
const val = Deno.env.get(key);
if (!val) {
logCalls.push((logger: Logger) =>
logger.warning(`${key} is not set! Using fallback: ${fallback}`)
);
}
return val || fallback;
};
const desiredLogLevel = envOrWarn("LOG_LEVEL", "INFO").toUpperCase();
if (!isLogLevelName(desiredLogLevel)) {
logCalls.push((logger: Logger) =>
logger.warning(
`Specified LOG_LEVEL '${desiredLogLevel}' is invalid. Falling back to INFO`,
)
);
}
const logLevel: LevelName = isLogLevelName(desiredLogLevel)
? desiredLogLevel
: "INFO";
const config: Config = {
log: {
consoleLevelName: logLevel,
},
postgres: {
url: envOrWarn(
"POSTGRES_URL",
"postgresql://postgres:@127.0.0.1:5432/lyricscreen",
),
},
mailgun: {},
isDevelopmentMode: truthyEnv("DEVELOPMENT_MODE"),
};
return [config, logCalls];
}