UNPKG

@misterzik/espressojs

Version:

EspressoJS Introducing Espresso.JS, your ultimate Express configuration starting point and boilerplate. With its simplicity and lack of opinionation, EspressoJS offers plug-and-play configurations built on top of Express.

91 lines (76 loc) 2.77 kB
/* * _| _| _| _| _|_|_| * _| _| _|_| _|_| _| _| * _| _| _| _| _| _| _| * _| _| _| _| _| _| * _| _| _| _|_|_| * EspressoJS - Configuration Validator */ const Joi = require("joi"); const logger = require("./logger"); const apiSchema = Joi.object({ enabled: Joi.boolean().default(true), uri: Joi.string().uri().allow("").default(""), url: Joi.string().allow("").default(""), method: Joi.string() .valid("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS") .default("GET"), headers: Joi.object().default({ "Content-Type": "application/json" }), timeout: Joi.number().integer().min(0).default(30000), retries: Joi.number().integer().min(0).max(5).default(0), }); const configSchema = Joi.object({ instance: Joi.string() .valid("development", "production", "global") .default("development"), port: Joi.number().port().default(8080), hostname: Joi.string().hostname().allow("").default(""), publicDirectory: Joi.string().default("/public"), mongoDB: Joi.object({ enabled: Joi.boolean().default(false), port: Joi.number().port().allow(null).default(null), uri: Joi.string().allow("").default(""), instance: Joi.string().default("database"), }).default(), api: apiSchema.default(), }).unknown(true); const validateConfig = (config) => { const { error, value } = configSchema.validate(config, { abortEarly: false, allowUnknown: true, }); if (error) { const errorMessages = error.details.map((detail) => detail.message); logger.error(`Configuration validation failed: ${errorMessages.join(", ")}`); throw new Error(`Invalid configuration: ${errorMessages.join(", ")}`); } const validatedConfig = { ...value }; const apiKeys = Object.keys(config).filter(key => key.match(/^api\d*$/)); apiKeys.forEach(key => { const { error: apiError, value: apiValue } = apiSchema.validate(config[key], { abortEarly: false, }); if (apiError) { const errorMessages = apiError.details.map((detail) => detail.message); logger.warn(`API configuration '${key}' validation warning: ${errorMessages.join(", ")}`); } validatedConfig[key] = apiValue || config[key]; }); logger.info(`Configuration validated successfully with ${apiKeys.length} API endpoint(s)`); return validatedConfig; }; const validateEnvVariables = () => { const requiredEnvVars = []; const missingVars = requiredEnvVars.filter((varName) => !process.env[varName]); if (missingVars.length > 0) { logger.warn( `Missing optional environment variables: ${missingVars.join(", ")}` ); } return true; }; module.exports = { validateConfig, validateEnvVariables, configSchema, };