config.ts
1 import convict from 'convict'; 2 import dotenv from 'dotenv'; 3 import yaml from 'js-yaml'; 4 5 6 dotenv.config(); 7 8 const config = convict({ 9 env: { 10 doc: 'The application environment.', 11 format: ['production', 'development', 'test'], 12 default: 'development', 13 env: 'NODE_ENV', 14 }, 15 secrets: { 16 apiKey: { 17 doc: 'The API key for accessing external services.', 18 format: String, 19 default: 'default_api_key', 20 env: 'API_KEY', 21 }, 22 // Add other secrets here 23 }, 24 server: { 25 host: { 26 doc: 'The host name to listen on.', 27 format: String, 28 default: 'localhost', 29 env: 'HOST', 30 }, 31 port: { 32 doc: 'The port to listen on.', 33 format: 'port', 34 default: 3000, 35 env: 'PORT', 36 }, 37 }, 38 }); 39 40 // Load environment-specific configuration 41 const env = config.get('env'); 42 try { 43 const yamlFile = await Bun.file(`./config/${env}.yaml`).text(); 44 config.load(yaml.load(yamlFile)); 45 } catch (e) { 46 console.log(`Failed to load config file: ./config/${env}.yaml. Using defaults.`); 47 } 48 49 // Perform validation 50 config.validate({ allowed: 'strict' }); 51 52 export default config; 53