|
| 1 | +import * as dotenv from 'dotenv'; |
| 2 | +import * as fs from 'fs'; |
| 3 | +import { envValidationSchema, ENV_VALIDATION_OPTIONS, NON_PRODUCTION_DEFAULTS } from './src/config/env.schema'; |
| 4 | + |
| 5 | +function run(label: string, env: Record<string, unknown>) { |
| 6 | + const { error, value } = envValidationSchema.validate(env, ENV_VALIDATION_OPTIONS); |
| 7 | + console.log('---', label); |
| 8 | + if (error) console.log(' ERROR:', error.message); |
| 9 | + else console.log(' OK ', JSON.stringify({ |
| 10 | + NODE_ENV: value.NODE_ENV, PORT: value.PORT, CORS_ORIGIN: value.CORS_ORIGIN, |
| 11 | + DATABASE_URL: value.DATABASE_URL, REDIS_HOST: value.REDIS_HOST, REDIS_PORT: value.REDIS_PORT, |
| 12 | + JWT_SECRET: value.JWT_SECRET, ASSET_SIGNING_SECRET: value.ASSET_SIGNING_SECRET, |
| 13 | + AI_PROVIDER: value.AI_PROVIDER, ASSETS_MAX_SIZE_MB: value.ASSETS_MAX_SIZE_MB, |
| 14 | + })); |
| 15 | +} |
| 16 | + |
| 17 | +run('empty (development)', {}); |
| 18 | +run('test', { NODE_ENV: 'test' }); |
| 19 | +run('example env file', dotenv.parse(fs.readFileSync('.env.example'))); |
| 20 | +run('production empty', { NODE_ENV: 'production' }); |
| 21 | +run('production with placeholder secrets', { |
| 22 | + NODE_ENV: 'production', |
| 23 | + DATABASE_URL: 'postgresql://u:supersecretpw@db:5432/app', |
| 24 | + REDIS_HOST: 'redis', |
| 25 | + JWT_SECRET: 'change_me_in_production', |
| 26 | + ASSET_SIGNING_SECRET: NON_PRODUCTION_DEFAULTS.development.ASSET_SIGNING_SECRET, |
| 27 | +}); |
| 28 | +run('production short secret', { |
| 29 | + NODE_ENV: 'production', |
| 30 | + DATABASE_URL: 'postgresql://u:supersecretpw@db:5432/app', |
| 31 | + REDIS_HOST: 'redis', |
| 32 | + JWT_SECRET: 'tooshort-abc', |
| 33 | + ASSET_SIGNING_SECRET: 'x'.repeat(40), |
| 34 | +}); |
| 35 | +run('production bad db url', { |
| 36 | + NODE_ENV: 'production', |
| 37 | + DATABASE_URL: 'ftp://user:supersecretpw@db/app', |
| 38 | + REDIS_HOST: 'redis', |
| 39 | + JWT_SECRET: 'a'.repeat(40), |
| 40 | + ASSET_SIGNING_SECRET: 'b'.repeat(40), |
| 41 | +}); |
| 42 | +run('production valid', { |
| 43 | + NODE_ENV: 'production', |
| 44 | + DATABASE_URL: 'postgresql://u:pw@db:5432/app', |
| 45 | + REDIS_HOST: 'redis', |
| 46 | + JWT_SECRET: 'a'.repeat(40), |
| 47 | + ASSET_SIGNING_SECRET: 'b'.repeat(40), |
| 48 | + CORS_ORIGIN: 'https://a.example, https://b.example', |
| 49 | +}); |
| 50 | +run('claude without key', { AI_PROVIDER: 'claude' }); |
| 51 | +run('unknown vars', { PATH: '/usr/bin', SOME_RANDOM: 'x' }); |
| 52 | +run('bad node env', { NODE_ENV: 'staging' }); |
| 53 | +run('bad redis port', { REDIS_PORT: -1 }); |
0 commit comments