funval
Version:
A minimalist library for data validation using functions interfaces.
110 lines (87 loc) • 13.5 kB
JavaScript
exports.__esModule = true;
exports.default = Schema;
exports.Async = Async;
var _utils = require("./utils");
var _comparison = require("./validators/comparison");
var _Error = require("./Error");
var _string = require("./validators/string");
// exported functions
function Schema(schema, error) {
switch (typeof schema) {
case 'string':
case 'number':
case 'boolean':
case 'undefined':
case 'symbol':
case 'bigint':
return (0, _comparison.Equals)(schema, error);
case 'function':
return schema;
case 'object':
if (schema === null) {
return (0, _comparison.Equals)(schema, error);
}
if (schema instanceof RegExp) {
return (0, _string.StringMatch)(schema, error);
}
return input => {
if (typeof input !== 'object') {
throw (0, _Error.toError)(error || `Expecting value to be an object: ${typeof input}`);
}
if (input === null) {
throw (0, _Error.toError)(error || `Expecting value to be non-nullable`);
}
if (Array.isArray(schema)) {
if (!Array.isArray(input)) {
throw (0, _Error.toError)(error || `Expecting value to an array`);
}
if (schema.length !== input.length) {
throw (0, _Error.toError)(error || `Expecting array length to be ${schema.length} (actual: ${input.length})`);
}
}
const res = Array.isArray(schema) ? [] : {};
const promises = [];
const errors = [];
for (const key in schema) {
if (!Object.prototype.hasOwnProperty.call(schema, key)) continue;
const schemaProp = schema[key];
const inputProp = input[key];
try {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const value = Schema(schemaProp)(inputProp);
const resKey = key;
if (!(0, _utils.isPromiseLike)(value)) {
res[resKey] = value;
} else {
promises.push(value.then(value => {
res[resKey] = value;
}, err => {
errors.push(...(0, _Error.getErrorPaths)(err, [key]));
}));
}
} catch (e) {
errors.push(...(0, _Error.getErrorPaths)(e, [key]));
}
}
if (!promises.length) {
if (errors.length) {
throw (0, _Error.createValidationError)(errors, error);
}
return res;
}
return Promise.all(promises).then(() => {
if (errors.length) {
throw (0, _Error.createValidationError)(errors, error);
}
return res;
});
};
default:
throw new Error(`Unknown JavaScript type: ${typeof schema}`);
}
}
function Async(validator) {
return input => new Promise(resolve => resolve(validator(input)));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TY2hlbWEudHMiXSwibmFtZXMiOlsiU2NoZW1hIiwic2NoZW1hIiwiZXJyb3IiLCJSZWdFeHAiLCJpbnB1dCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInJlcyIsInByb21pc2VzIiwiZXJyb3JzIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic2NoZW1hUHJvcCIsImlucHV0UHJvcCIsInZhbHVlIiwicmVzS2V5IiwicHVzaCIsInRoZW4iLCJlcnIiLCJlIiwiUHJvbWlzZSIsImFsbCIsIkVycm9yIiwiQXN5bmMiLCJ2YWxpZGF0b3IiLCJyZXNvbHZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFRQTs7QUE2Q0E7QUFFZSxTQUFTQSxNQUFULENBQ2JDLE1BRGEsRUFFYkMsS0FGYSxFQUdPO0FBQ3BCLFVBQVEsT0FBT0QsTUFBZjtBQUNFLFNBQUssUUFBTDtBQUNBLFNBQUssUUFBTDtBQUNBLFNBQUssU0FBTDtBQUNBLFNBQUssV0FBTDtBQUNBLFNBQUssUUFBTDtBQUNBLFNBQUssUUFBTDtBQUNFLGFBQVEsd0JBQU9BLE1BQVAsRUFBZUMsS0FBZixDQUFSOztBQUVGLFNBQUssVUFBTDtBQUNFLGFBQVFELE1BQVI7O0FBRUYsU0FBSyxRQUFMO0FBQ0UsVUFBSUEsTUFBTSxLQUFLLElBQWYsRUFBcUI7QUFDbkIsZUFBUSx3QkFBT0EsTUFBUCxFQUFlQyxLQUFmLENBQVI7QUFDRDs7QUFFRCxVQUFJRCxNQUFNLFlBQVlFLE1BQXRCLEVBQThCO0FBQzVCLGVBQVEseUJBQVlGLE1BQVosRUFBb0JDLEtBQXBCLENBQVI7QUFDRDs7QUFFRCxhQUFRRSxLQUFELElBQXlDO0FBQzlDLFlBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QixnQkFBTSxvQkFDSkYsS0FBSyxJQUFLLG9DQUFtQyxPQUFPRSxLQUFNLEVBRHRELENBQU47QUFHRDs7QUFFRCxZ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QSxPQUFPLENBQUNELFNBQVMsQ0FBQ3hCLEtBQUQsQ0FBVixDQUFoQyxDQURGO0FBRUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlUeXBlLCBGdW5jdGlvblR5cGUsIGlzUHJvbWlzZUxpa2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEVxdWFscyB9IGZyb20gJy4vdmFsaWRhdG9ycy9jb21wYXJpc29uJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IsIHtcbiAgY3JlYXRlVmFsaWRhdGlvbkVycm9yLFxuICBnZXRFcnJvclBhdGhzLFxuICBFcnJvclBhdGgsXG4gIHRvRXJyb3IsXG4gIEVycm9yTGlrZSxcbn0gZnJvbSAnLi9FcnJvcic7XG5pbXBvcnQgeyBPdXRwdXQsIElucHV0IH0gZnJvbSAnLi9UeXBlJztcbmltcG9ydCB7IFN0cmluZ01hdGNoIH0gZnJvbSAnLi92YWxpZGF0b3JzL3N0cmluZyc7XG5cbmV4cG9ydCB0eXBlIFN5bmNGdW5jdGlvblZhbGlkYXRvcjxcbiAgVCA9IEFueVR5cGUsXG4gIEkgZXh0ZW5kcyBBcnJheTxBbnlUeXBlPiA9IFtJbnB1dDxUPl1cbj4gPSBGdW5jdGlvblR5cGU8VCwgST47XG5cbmV4cG9ydCB0eXBlIEFzeW5jRnVuY3Rpb25WYWxpZGF0b3I8XG4gIFQgPSBBbnlUeXBlLFxuICBJIGV4dGVuZHMgQXJyYXk8QW55VHlwZT4gPSBbSW5wdXQ8VD5dXG4+ID0gRnVuY3Rpb25UeXBlPFByb21pc2VMaWtlPFQ+LCBJPjtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25WYWxpZGF0b3I8XG4gIFQgPSBBbnlUeXBlLFxuICBJIGV4dGVuZHMgQXJyYXk8QW55VHlwZT4gPSBbSW5wdXQ8VD5dXG4+ID0gRnVuY3Rpb25UeXBlPFByb21pc2VMaWtlPFQ+IHwgVCwgST47XG5cbmV4cG9ydCB0eXBlIFNjaGVtYVR5cGU8VCA9IEFueVR5cGU+ID0gW1RdIGV4dGVuZHMgW0Z1bmN0aW9uVHlwZV1cbiAgPyBGdW5jdGlvblZhbGlkYXRvcjxUPlxuICA6IFtUXSBleHRlbmRzIFtvYmplY3RdXG4gID8geyBbSyBpbiBrZXlvZiBUXTogU2NoZW1hVHlwZTxUW0tdPiB9XG4gIDogRnVuY3Rpb25WYWxpZGF0b3I8VD4gfCBUO1xuXG5leHBvcnQgdHlwZSBTeW5jU2NoZW1hVHlwZTxUPiA9IFtUXSBleHRlbmRzIFtGdW5jdGlvblR5cGVdXG4gID8gU3luY0Z1bmN0aW9uVmFsaWRhdG9yPFQ+XG4gIDogW1RdIGV4dGVuZHMgW29iamVjdF1cbiAgPyB7IFtLIGluIGtleW9mIFRdOiBTeW5jU2NoZW1hVHlwZTxUW0tdPiB9XG4gIDogW1RdIGV4dGVuZHMgW3N0cmluZ11cbiAgPyBTeW5jRnVuY3Rpb25WYWxpZGF0b3I8VD4gfCBSZWdFeHAgfCBUXG4gIDogU3luY0Z1bmN0aW9uVmFsaWRhdG9yPFQ+IHwgVDtcblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yT3V0cHV0PFQ+ID0gVCBleHRlbmRzIFN5bmNTY2hlbWFUeXBlPE91dHB1dDxUPj5cbiAgPyBPdXRwdXQ8VD5cbiAgOiBQcm9taXNlTGlrZTxPdXRwdXQ8VD4+O1xuXG5leHBvcnQgdHlwZSBTY2hlbWFWYWxpZGF0b3I8XG4gIFQsXG4gIEkgZXh0ZW5kcyBBcnJheTxBbnlUeXBlPiA9IFtJbnB1dDxUPl1cbj4gPSBGdW5jdGlvblR5cGU8VmFsaWRhdG9yT3V0cHV0PFQ+LCBJPjtcblxuZXhwb3J0IHR5cGUgU2NoZW1hQXN5bmNWYWxpZGF0b3I8XG4gIFQsXG4gIEkgZXh0ZW5kcyBBcnJheTxBbnlUeXBlPiA9IFtJbnB1dDxUPl1cbj4gPSBGdW5jdGlvblR5cGU8UHJvbWlzZUxpa2U8T3V0cHV0PFQ+PiwgST47XG5cbi8vIGV4cG9ydGVkIGZ1bmN0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTY2hlbWE8VD4oXG4gIHNjaGVtYTogVCxcbiAgZXJyb3I/OiBFcnJvckxpa2UsXG4pOiBTY2hlbWFWYWxpZGF0b3I8VD4ge1xuICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWEpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICByZXR1cm4gKEVxdWFscyhzY2hlbWEsIGVycm9yKSBhcyB1bmtub3duKSBhcyBTY2hlbWFWYWxpZGF0b3I8VD47XG5cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICByZXR1cm4gKHNjaGVtYSBhcyB1bmtub3duKSBhcyBTY2hlbWFWYWxpZGF0b3I8VD47XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaWYgKHNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gKEVxdWFscyhzY2hlbWEsIGVycm9yKSBhcyB1bmtub3duKSBhcyBTY2hlbWFWYWxpZGF0b3I8VD47XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuIChTdHJpbmdNYXRjaChzY2hlbWEsIGVycm9yKSBhcyB1bmtub3duKSBhcyBTY2hlbWFWYWxpZGF0b3I8VD47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoaW5wdXQ6IElucHV0PFQ+KTogVmFsaWRhdG9yT3V0cHV0PFQ+ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyB0b0Vycm9yKFxuICAgICAgICAgICAgZXJyb3IgfHwgYEV4cGVjdGluZyB2YWx1ZSB0byBiZSBhbiBvYmplY3Q6ICR7dHlwZW9mIGlucHV0fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IHRvRXJyb3IoZXJyb3IgfHwgYEV4cGVjdGluZyB2YWx1ZSB0byBiZSBub24tbnVsbGFibGVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICB0aHJvdyB0b0Vycm9yKGVycm9yIHx8IGBFeHBlY3RpbmcgdmFsdWUgdG8gYW4gYXJyYXlgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2NoZW1hLmxlbmd0aCAhPT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyB0b0Vycm9yKFxuICAgICAgICAgICAgICBlcnJvciB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RpbmcgYXJyYXkgbGVuZ3RoIHRvIGJlICR7c2NoZW1hLmxlbmd0aH0gKGFjdHVhbDogJHtpbnB1dC5sZW5ndGh9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlczoge1xuICAgICAgICAgIFtLIGluIGtleW9mIE91dHB1dDxUPl0/OiBQcm9taXNlTGlrZTxPdXRwdXQ8VD5bS10+IHwgT3V0cHV0PFQ+W0tdO1xuICAgICAgICB9ID0gQXJyYXkuaXNBcnJheShzY2hlbWEpID8gKFtdIGFzIHt9KSA6IHt9O1xuXG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlTGlrZTx2b2lkPltdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogRXJyb3JQYXRoW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEpIHtcbiAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzY2hlbWEsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHNjaGVtYVtrZXkgYXMga2V5b2YgVF07XG4gICAgICAgICAgY29uc3QgaW5wdXRQcm9wID0gaW5wdXRba2V5IGFzIGtleW9mIElucHV0PFQ+XTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBTY2hlbWEoc2NoZW1hUHJvcCkoaW5wdXRQcm9wIGFzIGFueSkgYXNcbiAgICAgICAgICAgICAgfCBQcm9taXNlTGlrZTxPdXRwdXQ8VD5ba2V5b2YgT3V0cHV0PFQ+XT5cbiAgICAgICAgICAgICAgfCBPdXRwdXQ8VD5ba2V5b2YgT3V0cHV0PFQ+XTtcbiAgICAgICAgICAgIGNvbnN0IHJlc0tleSA9IGtleSBhcyBrZXlvZiBPdXRwdXQ8VD47XG5cbiAgICAgICAgICAgIGlmICghaXNQcm9taXNlTGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzW3Jlc0tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNbcmVzS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIChlcnI6IFZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCguLi5nZXRFcnJvclBhdGhzKGVyciwgW2tleV0pKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCguLi5nZXRFcnJvclBhdGhzKGUsIFtrZXldKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXMgYXMgVmFsaWRhdG9yT3V0cHV0PFQ+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXMgYXMgT3V0cHV0PFQ+O1xuICAgICAgICB9KSBhcyBWYWxpZGF0b3JPdXRwdXQ8VD47XG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBKYXZhU2NyaXB0IHR5cGU6ICR7dHlwZW9mIHNjaGVtYX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQXN5bmM8XG4gIFYsXG4gIFQgZXh0ZW5kcyBGdW5jdGlvblZhbGlkYXRvcjxWPixcbiAgSSBleHRlbmRzIFBhcmFtZXRlcnM8VD5bMF1cbj4odmFsaWRhdG9yOiBUKTogRnVuY3Rpb25UeXBlPFByb21pc2VMaWtlPFY+LCBbSV0+IHtcbiAgcmV0dXJuIChpbnB1dDogSSk6IFByb21pc2U8Vj4gPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVzb2x2ZSh2YWxpZGF0b3IoaW5wdXQpKSk7XG59XG4iXX0=
;