- monorepo: pnpm workspace + go.work + pyproject.toml + commitlint/husky - infra: docker-compose (minimal + full profiles) + init-sql + prometheus - arch-scan: multi-language scanner skeleton (TS/Go/Python/Proto) - shared-proto: buf v2 + classes.proto (ClassService CRUD contract) - api-gateway: Go/Gin + JWT HS256 auth + reverse proxy + request ID - classes: NestJS golden template (error system + observability + middleware + CRUD + tests) - teacher-portal: Next.js + paper-feel UI design system - CI/CD: 4 workflows (go/ts/py/proto) - docs: migration guide + project_rules + coding-standards + git-workflow + ui-design-system + 004 + 9 module READMEs + known-issues + spec/plan migration + roadmap
26 lines
848 B
TypeScript
26 lines
848 B
TypeScript
import { z } from 'zod';
|
|
|
|
const envSchema = z.object({
|
|
PORT: z.string().default('3001'),
|
|
DATABASE_URL: z.string().url(),
|
|
REDIS_URL: z.string().url().optional(),
|
|
JWT_SECRET: z.string(),
|
|
JWT_ISSUER: z.string().default('next-edu-cloud'),
|
|
OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),
|
|
LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),
|
|
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
});
|
|
|
|
export type Env = z.infer<typeof envSchema>;
|
|
|
|
export function loadEnv(): Env {
|
|
const result = envSchema.safeParse(process.env);
|
|
if (!result.success) {
|
|
console.error('❌ Invalid environment variables:', result.error.flatten().fieldErrors);
|
|
throw new Error('Invalid environment configuration');
|
|
}
|
|
return result.data;
|
|
}
|
|
|
|
export const env = loadEnv();
|