51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { config } from 'dotenv'
|
|
import { validate } from 'node-cron'
|
|
|
|
config()
|
|
|
|
function getEnv(key: string, fallback: string, parse?: undefined, validator?: (s: string) => boolean): string
|
|
function getEnv<T>(key: string, fallback: T, parse: (value: string) => T, validator?: (T: string) => boolean): T
|
|
function getEnv<T>(
|
|
key: string,
|
|
fallback: T,
|
|
parse?: (value: string) => T,
|
|
validator?: (s: string | T) => boolean
|
|
): T | string {
|
|
const value = process.env[key]
|
|
const parsed = value === undefined ? fallback : parse ? parse(value) : value
|
|
if (validator && !validator(parsed)) {
|
|
console.error(`Invalid or missing value for ${key}: ${value}`)
|
|
process.exit(1)
|
|
}
|
|
return parsed
|
|
}
|
|
|
|
function parseBoolean(value: string): boolean {
|
|
value = value.toLowerCase()
|
|
const truthy = ['true', 'yes', '1']
|
|
return truthy.includes(value)
|
|
}
|
|
|
|
function isPresent(s: string): boolean {
|
|
return s.length > 0
|
|
}
|
|
|
|
export const Config = {
|
|
version: getEnv('npm_package_version', 'unknown'),
|
|
logging: {
|
|
level: getEnv('LOG_LEVEL', 'info'),
|
|
},
|
|
auth: {
|
|
token: getEnv('TOKEN', '', undefined, isPresent),
|
|
},
|
|
dns: {
|
|
zone: getEnv('ZONE', '', undefined, isPresent),
|
|
record: getEnv('DNS_RECORD', '', undefined, isPresent),
|
|
proxied: getEnv('PROXIED', false, parseBoolean),
|
|
},
|
|
runner: {
|
|
cron: getEnv('CRON', '*/5 * * * *', undefined, (s) => validate(s)),
|
|
resolver: getEnv('RESOLVER', 'https://api.ipify.org'),
|
|
},
|
|
}
|