mirror of https://github.com/MaxLeiter/Drift
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
type Config = {
 | 
						|
	is_production: boolean
 | 
						|
	enable_admin: boolean
 | 
						|
	registration_password: string
 | 
						|
	welcome_content: string
 | 
						|
	welcome_title: string
 | 
						|
	url: string
 | 
						|
	github_client_id: string
 | 
						|
	github_client_secret: string
 | 
						|
}
 | 
						|
 | 
						|
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}`)
 | 
						|
		}
 | 
						|
 | 
						|
		return value
 | 
						|
	}
 | 
						|
 | 
						|
	const defaultIfUndefined = (
 | 
						|
		str: string,
 | 
						|
		defaultValue: string
 | 
						|
	): string => {
 | 
						|
		const value = env[str]
 | 
						|
		if (value === undefined) {
 | 
						|
			return defaultValue
 | 
						|
		}
 | 
						|
		return value
 | 
						|
	}
 | 
						|
 | 
						|
	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)
 | 
						|
	}
 | 
						|
 | 
						|
	validNodeEnvs(env.NODE_ENV)
 | 
						|
 | 
						|
	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 ?? "",
 | 
						|
		url: process.env.VERCEL_URL ?? throwIfUndefined("DRIFT_URL"),
 | 
						|
		github_client_id: env.GITHUB_CLIENT_ID ?? "",
 | 
						|
		github_client_secret: env.GITHUB_CLIENT_SECRET ?? "",
 | 
						|
	}
 | 
						|
	return config
 | 
						|
}
 | 
						|
 | 
						|
export default config(process.env)
 |