CoastalCommitsPastes/client/lib/config.ts

96 lines
2.4 KiB
TypeScript
Raw Normal View History

2022-11-09 21:38:05 -05:00
type Config = {
// port: number
jwt_secret: string
drift_home: string
is_production: boolean
memory_db: boolean
enable_admin: boolean
secret_key: string
registration_password: string
welcome_content: string
welcome_title: string
url: string
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
}
const defaultIfUndefined = (
str: string,
2022-11-09 21:38:05 -05:00
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"
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)
const config: Config = {
// port: env.PORT ? parseInt(env.PORT) : 3000,
jwt_secret: env.JWT_SECRET || "myjwtsecret",
drift_home: env.DRIFT_HOME || "~/.drift",
is_production,
memory_db: stringToBoolean(env.MEMORY_DB),
enable_admin: stringToBoolean(env.ENABLE_ADMIN),
secret_key: developmentDefault("SECRET_KEY", "secret"),
2022-11-09 21:38:05 -05:00
registration_password: env.REGISTRATION_PASSWORD ?? "",
welcome_content: env.WELCOME_CONTENT ?? "",
welcome_title: env.WELCOME_TITLE ?? "",
url: throwIfUndefined("DRIFT_URL"),
GITHUB_CLIENT_ID: env.GITHUB_CLIENT_ID ?? "",
GITHUB_CLIENT_SECRET: env.GITHUB_CLIENT_SECRET ?? "",
2022-11-09 21:38:05 -05:00
}
return config
}
export default config(process.env)