envase
Version:
Type-safe environment variable validation with Standard Schema compliance
43 lines • 1.81 kB
JavaScript
import { EnvaseError } from "./errors/envase-error.js";
export const detectNodeEnv = (env) => {
const nodeEnv = env.NODE_ENV;
return {
isProduction: nodeEnv === 'production',
isTest: nodeEnv === 'test',
isDevelopment: nodeEnv === 'development',
};
};
export const envvar = (name, schema) => [name, schema];
export const parseEnv = (env, envSchema) => {
const envvarValidationIssues = [];
// biome-ignore lint/suspicious/noExplicitAny: Explicit 'any' is required due to nature of recursive processing
const parseConfigObject = (schema) => {
return Object.fromEntries(Object.entries(schema).map(([key, value]) => {
if (Array.isArray(value)) {
const [envvarName, schema] = value;
const envvarValue = env[envvarName];
const result = schema['~standard'].validate(envvarValue);
if (result instanceof Promise ||
('then' in result && typeof result.then === 'function')) {
throw new Error(`Schema validation for envvar "${envvarName}" must be synchronous`);
}
if (result.issues) {
envvarValidationIssues.push({
name: envvarName,
value: envvarValue,
messages: result.issues.map(({ message }) => message),
});
return [key, null];
}
return [key, result.value];
}
return [key, parseConfigObject(value)];
}));
};
const config = parseConfigObject(envSchema);
if (envvarValidationIssues.length > 0) {
throw new EnvaseError(envvarValidationIssues);
}
return config;
};
//# sourceMappingURL=core.js.map