UNPKG

funval

Version:

A minimalist library for data validation using functions interfaces.

110 lines (87 loc) 13.5 kB
"use strict"; 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=