UNPKG

dotenv-constraint

Version:

A lightweight package to enforce constraints on environment variables in JavaScript, ensuring required variables are defined and match expected types.

110 lines 2.74 kB
// src/index.ts import fs from "fs"; import path from "path"; var validateEnv = (config) => { var _a, _b; const appRoot = process.cwd(); let envFile; let envSchemaFile; try { envFile = fs.readFileSync( path.join(appRoot, (_a = config == null ? void 0 : config.dotenvPath) != null ? _a : ".env"), "utf8" ); envSchemaFile = fs.readFileSync( path.join(appRoot, (_b = config == null ? void 0 : config.schemaPath) != null ? _b : ".env.schema"), "utf8" ); } catch (error) { return { errors: [ { code: "file_not_found" } ], success: false }; } const envVariables = extractEnvVariables(envFile); const envSchema = extractEnvSchema(envSchemaFile); const result = checkConstraints(envVariables, envSchema); return { errors: result, success: result.length === 0 }; }; var extractEnvVariables = (dotenvFile) => { const envVariables = []; for (const line of dotenvFile.split("\n")) { if (line.includes("=")) { const [name, value] = line.split("="); envVariables.push({ name, value }); } } return envVariables; }; var extractEnvSchema = (schemaFile) => { const schema = []; for (const line of schemaFile.split("\n")) { if (line.includes("=")) { const name = line.split("=")[0]; const optional = line.includes("#optional"); const number = line.includes("#number"); schema.push({ name, constraints: { optional, number } }); } } return schema; }; var checkConstraints = (envVariables, envSchema) => { const errors = []; for (const { name, constraints } of envSchema) { const envVariable = envVariables.find((v) => v.name === name); if (!envVariable && !constraints.optional) { errors.push({ variable: name, code: "missing" }); } else if (envVariable) { if (constraints.number) { const result = isNumber(envVariable); if (result !== true) { errors.push(result); } } if (!constraints.optional) { const result = isRequired(envVariable); if (result !== true) { errors.push(result); } } } } return errors; }; var isRequired = (envVariable) => { if (!envVariable.value) { return { variable: envVariable.name, code: "empty" }; } return true; }; var isNumber = (envVariable) => { if (envVariable.value && isNaN(Number(envVariable.value))) { return { variable: envVariable.name, code: "invalid_type", expected: "number" }; } return true; }; var index_default = { validateEnv }; export { index_default as default, validateEnv }; //# sourceMappingURL=index.mjs.map