UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

146 lines (145 loc) 3.24 kB
function getEnvFieldType(options) { const optional = options.optional ? options.default !== void 0 ? false : true : false; let type; if (options.type === "enum") { type = options.values.map((v) => `'${v}'`).join(" | "); } else { type = options.type; } return `${type}${optional ? " | undefined" : ""}`; } const stringValidator = ({ max, min, length, url, includes, startsWith, endsWith }) => (input) => { if (typeof input !== "string") { return { ok: false, errors: ["type"] }; } const errors = []; if (max !== void 0 && !(input.length <= max)) { errors.push("max"); } if (min !== void 0 && !(input.length >= min)) { errors.push("min"); } if (length !== void 0 && !(input.length === length)) { errors.push("length"); } if (url !== void 0 && !URL.canParse(input)) { errors.push("url"); } if (includes !== void 0 && !input.includes(includes)) { errors.push("includes"); } if (startsWith !== void 0 && !input.startsWith(startsWith)) { errors.push("startsWith"); } if (endsWith !== void 0 && !input.endsWith(endsWith)) { errors.push("endsWith"); } if (errors.length > 0) { return { ok: false, errors }; } return { ok: true, value: input }; }; const numberValidator = ({ gt, min, lt, max, int }) => (input) => { const num = parseFloat(input ?? ""); if (isNaN(num)) { return { ok: false, errors: ["type"] }; } const errors = []; if (gt !== void 0 && !(num > gt)) { errors.push("gt"); } if (min !== void 0 && !(num >= min)) { errors.push("min"); } if (lt !== void 0 && !(num < lt)) { errors.push("lt"); } if (max !== void 0 && !(num <= max)) { errors.push("max"); } if (int !== void 0) { const isInt = Number.isInteger(num); if (!(int ? isInt : !isInt)) { errors.push("int"); } } if (errors.length > 0) { return { ok: false, errors }; } return { ok: true, value: num }; }; const booleanValidator = (input) => { const bool = input === "true" ? true : input === "false" ? false : void 0; if (typeof bool !== "boolean") { return { ok: false, errors: ["type"] }; } return { ok: true, value: bool }; }; const enumValidator = ({ values }) => (input) => { if (!(typeof input === "string" ? values.includes(input) : false)) { return { ok: false, errors: ["type"] }; } return { ok: true, value: input }; }; function selectValidator(options) { switch (options.type) { case "string": return stringValidator(options); case "number": return numberValidator(options); case "boolean": return booleanValidator; case "enum": return enumValidator(options); } } function validateEnvVariable(value, options) { const isOptional = options.optional || options.default !== void 0; if (isOptional && value === void 0) { return { ok: true, value: options.default }; } if (!isOptional && value === void 0) { return { ok: false, errors: ["missing"] }; } return selectValidator(options)(value); } export { getEnvFieldType, validateEnvVariable };