Files
moeka-project/apps/server/src/libs/env.ts
T

43 lines
1.6 KiB
TypeScript

import type { InferOutput } from 'valibot'
import { env, exit } from 'node:process'
import { useLogger } from '@guiiai/logg'
import { injeca } from 'injeca'
import { nonEmpty, object, optional, parse, pipe, string, transform } from 'valibot'
const EnvSchema = object({
API_SERVER_URL: optional(string(), 'http://localhost:3000'),
DATABASE_URL: pipe(string(), nonEmpty('DATABASE_URL is required')),
AUTH_GOOGLE_CLIENT_ID: pipe(string(), nonEmpty('AUTH_GOOGLE_CLIENT_ID is required')),
AUTH_GOOGLE_CLIENT_SECRET: pipe(string(), nonEmpty('AUTH_GOOGLE_CLIENT_SECRET is required')),
AUTH_GITHUB_CLIENT_ID: pipe(string(), nonEmpty('AUTH_GITHUB_CLIENT_ID is required')),
AUTH_GITHUB_CLIENT_SECRET: pipe(string(), nonEmpty('AUTH_GITHUB_CLIENT_SECRET is required')),
STRIPE_SECRET_KEY: optional(string()),
STRIPE_WEBHOOK_SECRET: optional(string()),
CLIENT_URL: pipe(string(), nonEmpty('CLIENT_URL is required')),
FLUX_PER_CENT: optional(pipe(string(), transform(Number)), '1'),
FLUX_PER_REQUEST: optional(pipe(string(), transform(Number)), '1'),
BACKEND_LLM_API_KEY: pipe(string(), nonEmpty('BACKEND_LLM_API_KEY is required')),
BACKEND_LLM_BASE_URL: pipe(string(), nonEmpty('BACKEND_LLM_BASE_URL is required')),
})
export type Env = InferOutput<typeof EnvSchema>
export function parseEnv(inputEnv: Record<string, string> | typeof env): Env {
try {
return parse(EnvSchema, inputEnv)
}
catch (err) {
useLogger().withError(err).error('Invalid environment variables')
exit(1)
}
}
export const parsedEnv = injeca.provide('env', () => parseEnv(env))