CoastalCommitsPastes/client/lib/config.ts

82 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-11-09 21:38:05 -05:00
type Config = {
is_production: boolean
enable_admin: boolean
registration_password: string
welcome_content: string
welcome_title: string
url: string
2022-11-14 22:00:21 -05:00
github_client_id: string
github_client_secret: string
2022-11-09 21:38:05 -05:00
}
type EnvironmentValue = string | undefined
type Environment = { [key: string]: EnvironmentValue }
export const config = (env: Environment): Config => {
const stringToBoolean = (str: EnvironmentValue): boolean => {
if (str === "true") {
return true
} else if (str === "false") {
return false
} else if (str) {
throw new Error(`Invalid boolean value: ${str}`)
} else {
return false
}
}
// TODO: improve `key` type
const throwIfUndefined = (key: keyof Environment): string => {
const value = env[key]
if (value === undefined) {
throw new Error(`Missing environment variable: ${key}`)
2022-11-09 21:38:05 -05:00
}
return value
2022-11-09 21:38:05 -05:00
}
2022-11-18 01:36:53 -05:00
const defaultIfUndefined = (str: string, defaultValue: string): string => {
const value = env[str]
if (value === undefined) {
2022-11-09 21:38:05 -05:00
return defaultValue
}
return value
2022-11-09 21:38:05 -05:00
}
const validNodeEnvs = (str: EnvironmentValue) => {
const valid = ["development", "production", "test"]
if (str && !valid.includes(str)) {
throw new Error(`Invalid NODE_ENV set: ${str}`)
} else if (!str) {
console.warn("No NODE_ENV specified, defaulting to development")
} else {
console.log(`Using NODE_ENV: ${str}`)
}
}
const is_production = env.NODE_ENV === "production"
2022-11-18 01:36:53 -05:00
const developmentDefault = (name: string, defaultValue: string): string => {
if (is_production) return throwIfUndefined(name)
return defaultIfUndefined(name, defaultValue)
2022-11-09 21:38:05 -05:00
}
validNodeEnvs(env.NODE_ENV)
2022-12-04 17:26:14 -05:00
throwIfUndefined("DATABASE_URL")
2022-11-28 23:59:30 -05:00
2022-11-09 21:38:05 -05:00
const config: Config = {
is_production,
enable_admin: stringToBoolean(env.ENABLE_ADMIN),
registration_password: env.REGISTRATION_PASSWORD ?? "",
welcome_content: env.WELCOME_CONTENT ?? "",
welcome_title: env.WELCOME_TITLE ?? "",
2022-11-14 22:00:21 -05:00
url: process.env.VERCEL_URL ?? throwIfUndefined("DRIFT_URL"),
github_client_id: env.GITHUB_CLIENT_ID ?? "",
2022-11-18 01:36:53 -05:00
github_client_secret: env.GITHUB_CLIENT_SECRET ?? ""
2022-11-09 21:38:05 -05:00
}
return config
}
export default config(process.env)