UNPKG

funval

Version:

A minimalist library for data validation using functions interfaces.

149 lines (116 loc) 14.2 kB
"use strict"; exports.__esModule = true; exports.Maybe = Maybe; exports.Optional = Optional; exports.Default = Default; exports.Required = Required; exports.Truthy = Truthy; exports.Or = Or; exports.ArrayOf = ArrayOf; exports.TypeOf = TypeOf; exports.Any = Any; exports.Override = Override; exports.Test = Test; var _Schema = _interopRequireDefault(require("../Schema")); var _utils = require("../utils"); var _Error = require("../Error"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // exported functions function Maybe(schema, error) { return input => { if (input === undefined) { return undefined; } return (0, _Schema.default)(schema, error)(input); }; } function Optional(schema, error) { return input => { if (input == null) { return undefined; } return (0, _Schema.default)(schema, error)(input); }; } function Default(schema, defaultValue, error) { return input => { if (input === undefined) { return defaultValue; } return (0, _Schema.default)(schema, error)(input); }; } function Required(schema, error) { return input => { if (input === undefined) { throw (0, _Error.toError)(error || 'This value is required'); } return (0, _Schema.default)(schema, error)(input); }; } function Truthy(input, error) { if (!input) { throw (0, _Error.toError)(error || `This value is required`); } return input; } function Or(...candidates) { if (!candidates.length) { throw new RangeError(`Expecting at least one candidate`); } return input => { let i = 0; const next = () => { const curr = candidates[i++]; let res; try { res = (0, _Schema.default)(curr)(input); } catch (e) { if (i >= candidates.length) { throw e; } return next(); } if (!(0, _utils.isPromiseLike)(res) || i >= candidates.length) { return res; } return res.then(null, () => next()); }; return next(); }; } function ArrayOf(schema, error) { return input => { if (!Array.isArray(input)) { throw (0, _Error.toError)(error || `Expect value to be an array`); } const res = input.map((0, _Schema.default)(schema, error)); if (!res.find(_utils.isPromiseLike)) { return res; } return Promise.all(res); }; } function TypeOf(typeOf, error) { return input => { if (typeof input !== typeOf) { throw (0, _Error.toError)(error || `Got ${typeof input} instead of a ${typeOf}`); } return input; }; } function Any(input) { return input; } function Override(value) { return () => value; } function Test(test, error) { return input => { if (!test(input)) { throw (0, _Error.toError)(error || `Invalid input`); } return input; }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0b3JzL3NjaGVtYS50cyJdLCJuYW1lcyI6WyJNYXliZSIsInNjaGVtYSIsImVycm9yIiwiaW5wdXQiLCJ1bmRlZmluZWQiLCJPcHRpb25hbCIsIkRlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJSZXF1aXJlZCIsIlRydXRoeSIsIk9yIiwiY2FuZGlkYXRlcyIsImxlbmd0aCIsIlJhbmdlRXJyb3IiLCJpIiwibmV4dCIsImN1cnIiLCJyZXMiLCJlIiwidGhlbiIsIkFycmF5T2YiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJmaW5kIiwiaXNQcm9taXNlTGlrZSIsIlByb21pc2UiLCJhbGwiLCJUeXBlT2YiLCJ0eXBlT2YiLCJBbnkiLCJPdmVycmlkZSIsInZhbHVlIiwiVGVzdCIsInRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQU1BOztBQUNBOzs7O0FBa0JBO0FBRU8sU0FBU0EsS0FBVCxDQUNMQyxNQURLLEVBRUxDLEtBRkssRUFHd0M7QUFDN0MsU0FBUUMsS0FBRCxJQUFzRDtBQUMzRCxRQUFJQSxLQUFLLEtBQUtDLFNBQWQsRUFBeUI7QUFDdkIsYUFBT0EsU0FBUDtBQUNEOztBQUVELFdBQU8scUJBQU9ILE1BQVAsRUFBZUMsS0FBZixFQUFzQkMsS0FBdEIsQ0FBUDtBQUNELEdBTkQ7QUFPRDs7QUFFTSxTQUFTRSxRQUFULENBQ0xKLE1BREssRUFFTEMsS0FGSyxFQUdpRDtBQUN0RCxTQUFRQyxLQUFELElBQTZEO0FBQ2xFLFFBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO0FBQ2pCLGFBQU9DLFNBQVA7QUFDRDs7QUFFRCxXQUFPLHFCQUFPSCxNQUFQLEVBQWVDLEtBQWYsRUFBc0JDLEtBQXRCLENBQVA7QUFDRCxHQU5EO0FBT0Q7O0FBRU0sU0FBU0csT0FBVCxDQUNMTCxNQURLLEVBRUxNLFlBRkssRUFHTEwsS0FISyxFQUk4QztBQUNuRCxTQUFRQyxLQUFELElBQThDO0FBQ25ELFFBQUlBLEtB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QUVNLFNBQVM0QixRQUFULENBQXFCQyxLQUFyQixFQUFxRTtBQUMxRSxTQUFPLE1BQVNBLEtBQWhCO0FBQ0Q7O0FBRU0sU0FBU0MsSUFBVCxDQUNMQyxJQURLLEVBRUxoQyxLQUZLLEVBRzBCO0FBQy9CLFNBQVFDLEtBQUQsSUFBYztBQUNuQixRQUFJLENBQUMrQixJQUFJLENBQUMvQixLQUFELENBQVQsRUFBa0I7QUFDaEIsWUFBTSxvQkFBUUQsS0FBSyxJQUFLLGVBQWxCLENBQU47QUFDRDs7QUFFRCxXQUFPQyxLQUFQO0FBQ0QsR0FORDtBQU9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNjaGVtYSwge1xuICBTY2hlbWFWYWxpZGF0b3IsXG4gIFN5bmNGdW5jdGlvblZhbGlkYXRvcixcbiAgVmFsaWRhdG9yT3V0cHV0LFxufSBmcm9tICcuLi9TY2hlbWEnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuLi9UeXBlJztcbmltcG9ydCB7IEFueVR5cGUsIEZ1bmN0aW9uVHlwZSwgaXNQcm9taXNlTGlrZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEVycm9yTGlrZSwgdG9FcnJvciB9IGZyb20gJy4uL0Vycm9yJztcblxudHlwZSBUeXBlT2ZUeXBlPFQ+ID0gVCBleHRlbmRzICdzdHJpbmcnXG4gID8gc3RyaW5nXG4gIDogVCBleHRlbmRzICdudW1iZXInXG4gID8gbnVtYmVyXG4gIDogVCBleHRlbmRzICdvYmplY3QnXG4gID8gb2JqZWN0XG4gIDogVCBleHRlbmRzICdib29sZWFuJ1xuICA/IGJvb2xlYW5cbiAgOiBUIGV4dGVuZHMgJ3N5bWJvbCdcbiAgPyBzeW1ib2xcbiAgOiBUIGV4dGVuZHMgJ2JpZ2ludCdcbiAgPyBiaWdpbnRcbiAgOiBUIGV4dGVuZHMgJ3VuZGVmaW5lZCdcbiAgPyB1bmRlZmluZWRcbiAgOiBuZXZlcjtcblxuLy8gZXhwb3J0ZWQgZnVuY3Rpb25zXG5cbmV4cG9ydCBmdW5jdGlvbiBNYXliZTxUPihcbiAgc2NoZW1hOiBULFxuICBlcnJvcj86IEVycm9yTGlrZSxcbik6IFNjaGVtYVZhbGlkYXRvcjxUIHwgdW5kZWZpbmVkLCBbSW5wdXQ8VD4/XT4ge1xuICByZXR1cm4gKGlucHV0PzogSW5wdXQ8VD4pOiBWYWxpZGF0b3JPdXRwdXQ8VCB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBTY2hlbWEoc2NoZW1hLCBlcnJvcikoaW5wdXQpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gT3B0aW9uYWw8VD4oXG4gIHNjaGVtYTogVCxcbiAgZXJyb3I/OiBFcnJvckxpa2UsXG4pOiBTY2hlbWFWYWxpZGF0b3I8VCB8IHVuZGVmaW5lZCwgWyhJbnB1dDxUPiB8IG51bGwpP10+IHtcbiAgcmV0dXJuIChpbnB1dD86IElucHV0PFQ+IHwgbnVsbCk6IFZhbGlkYXRvck91dHB1dDxUIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFNjaGVtYShzY2hlbWEsIGVycm9yKShpbnB1dCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZWZhdWx0PFQsIFY+KFxuICBzY2hlbWE6IFQsXG4gIGRlZmF1bHRWYWx1ZTogVixcbiAgZXJyb3I/OiBFcnJvckxpa2UsXG4pOiBGdW5jdGlvblR5cGU8VmFsaWRhdG9yT3V0cHV0PFQ+IHwgViwgW0lucHV0PFQ+P10+IHtcbiAgcmV0dXJuIChpbnB1dD86IElucHV0PFQ+KTogVmFsaWRhdG9yT3V0cHV0PFQ+IHwgViA9PiB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFNjaGVtYShzY2hlbWEsIGVycm9yKShpbnB1dCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlZDxUPihcbiAgc2NoZW1hOiBULFxuICBlcnJvcj86IEVycm9yTGlrZSxcbik6IFNjaGVtYVZhbGlkYXRvcjxULCBbRXhjbHVkZTxJbnB1dDxUPiwgdW5kZWZpbmVkPl0+IHtcbiAgcmV0dXJuIChpbnB1dDogRXhjbHVkZTxJbnB1dDxUPiwgdW5kZWZpbmVkPik6IFZhbGlkYXRvck91dHB1dDxUPiA9PiB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IHRvRXJyb3IoZXJyb3IgfHwgJ1RoaXMgdmFsdWUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU2NoZW1hKHNjaGVtYSwgZXJyb3IpKChpbnB1dCBhcyB1bmtub3duKSBhcyBJbnB1dDxUPik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUcnV0aHk8VD4oaW5wdXQ6IFQsIGVycm9yPzogRXJyb3JMaWtlKTogVCB7XG4gIGlmICghaW5wdXQpIHtcbiAgICB0aHJvdyB0b0Vycm9yKGVycm9yIHx8IGBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPcjxBPihhOiBBKTogU2NoZW1hVmFsaWRhdG9yPEEsIFtJbnB1dDxBPl0+O1xuXG5leHBvcnQgZnVuY3Rpb24gT3I8QSwgQj4oXG4gIGE6IEEsXG4gIGI6IEIsXG4pOiBTY2hlbWFWYWxpZGF0b3I8QSB8IEIsIFtJbnB1dDxBPiB8IElucHV0PEI+XT47XG5cbmV4cG9ydCBmdW5jdGlvbiBPcjxBLCBCLCBDPihcbiAgYTogQSxcbiAgYjogQixcbiAgYzogQyxcbik6IFNjaGVtYVZhbGlkYXRvcjxBIHwgQiB8IEMsIFtJbnB1dDxBPiB8IElucHV0PEI+IHwgSW5wdXQ8Qz5dPjtcblxuZXhwb3J0IGZ1bmN0aW9uIE9yPEEsIEIsIEMsIEQ+KFxuICBhOiBBLFxuICBiOiBCLFxuICBjOiBDLFxuICBkOiBELFxuKTogU2NoZW1hVmFsaWRhdG9yPEEgfCBCIHwgQyB8IEQsIFtJbnB1dDxBPiB8IElucHV0PEI+IHwgSW5wdXQ8Qz4gfCBJbnB1dDxEPl0+O1xuXG5leHBvcnQgZnVuY3Rpb24gT3I8QSwgQiwgQywgRCwgRT4oXG4gIGE6IEEsXG4gIGI6IEIsXG4gIGM6IEMsXG4gIGQ6IEQsXG4gIGU6IEUsXG4pOiBTY2hlbWFWYWxpZGF0b3I8XG4gIEEgfCBCIHwgQyB8IEQgfCBFLFxuICBbSW5wdXQ8QT4gfCBJbnB1dDxCPiB8IElucHV0PEM+IHwgSW5wdXQ8RD4gfCBJbnB1dDxFPl1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBPcjxBLCBCLCBDLCBELCBFLCBGPihcbiAgYTogQSxcbiAgYjogQixcbiAgYzogQyxcbiAgZDogRCxcbiAgZTogRSxcbiAgZjogRixcbik6IFNjaGVtYVZhbGlkYXRvcjxcbiAgQSB8IEIgfCBDIHwgRCB8IEUgfCBGLFxuICBbSW5wdXQ8QT4gfCBJbnB1dDxCPiB8IElucHV0PEM+IHwgSW5wdXQ8RD4gfCBJbnB1dDxFPiB8IElucHV0PEY+XVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIE9yPEEsIEIsIEMsIEQsIEUsIEYsIEg+KFxuICBhOiBBLFxuICBiOiBCLFxuICBjOiBDLFxuICBkOiBELFxuICBlOiBFLFxuICBmOiBGLFxuICBoOiBILFxuKTogU2NoZW1hVmFsaWRhdG9yPFxuICBBIHwgQiB8IEMgfCBEIHwgRSB8IEYgfCBILFxuICBbSW5wdXQ8QT4gfCBJbnB1dDxCPiB8IElucHV0PEM+IHwgSW5wdXQ8RD4gfCBJbnB1dDxFPiB8IElucHV0PEY+IHwgSW5wdXQ8SD5dXG4+O1xuXG5leHBvcnQgZnVuY3Rpb24gT3I8QSwgQiwgQywgRCwgRSwgRiwgSCwgSj4oXG4gIGE6IEEsXG4gIGI6IEIsXG4gIGM6IEMsXG4gIGQ6IEQsXG4gIGU6IEUsXG4gIGY6IEYsXG4gIGg6IEgsXG4gIGo6IEosXG4pOiBTY2hlbWFWYWxpZGF0b3I8XG4gIEEgfCBCIHwgQyB8IEQgfCBFIHwgRiB8IEggfCBKLFxuICBbXG4gICAgfCBJbnB1dDxBPlxuICAgIHwgSW5wdXQ8Qj5cbiAgICB8IElucHV0PEM+XG4gICAgfCBJbnB1dDxEPlxuICAgIHwgSW5wdXQ8RT5cbiAgICB8IElucHV0PEY+XG4gICAgfCBJbnB1dDxIPlxuICAgIHwgSW5wdXQ8Sj4sXG4gIF1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBPcihcbiAgLi4uY2FuZGlkYXRlczogQW55VHlwZVtdXG4pOiBTY2hlbWFWYWxpZGF0b3I8QW55VHlwZSwgW0FueVR5cGU/XT4ge1xuICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdGluZyBhdCBsZWFzdCBvbmUgY2FuZGlkYXRlYCk7XG4gIH1cblxuICByZXR1cm4gKGlucHV0PzogQW55VHlwZSk6IFZhbGlkYXRvck91dHB1dDxBbnlUeXBlPiA9PiB7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgY29uc3QgbmV4dCA9ICgpOiBBbnlUeXBlID0+IHtcbiAgICAgIGNvbnN0IGN1cnIgPSBjYW5kaWRhdGVzW2krK107XG5cbiAgICAgIGxldCByZXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBTY2hlbWEoY3VycikoaW5wdXQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaSA+PSBjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocmVzKSB8fCBpID49IGNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXMudGhlbihudWxsLCAoKSA9PiBuZXh0KCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXJyYXlPZjxUPihcbiAgc2NoZW1hOiBULFxuICBlcnJvcj86IEVycm9yTGlrZSxcbik6IEZ1bmN0aW9uVHlwZTxWYWxpZGF0b3JPdXRwdXQ8VD5bXSwgW0lucHV0PFQ+W11dPiB7XG4gIHJldHVybiAoaW5wdXQ6IElucHV0PFQ+W10pOiBWYWxpZGF0b3JPdXRwdXQ8VD5bXSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgdGhyb3cgdG9FcnJvcihlcnJvciB8fCBgRXhwZWN0IHZhbHVlIHRvIGJlIGFuIGFycmF5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gaW5wdXQubWFwKFNjaGVtYShzY2hlbWEsIGVycm9yKSk7XG4gICAgaWYgKCFyZXMuZmluZChpc1Byb21pc2VMaWtlKSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICByZXR1cm4gKFByb21pc2UuYWxsKHJlcykgYXMgdW5rbm93bikgYXMgVmFsaWRhdG9yT3V0cHV0PFQ+W107XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUeXBlT2Y8XG4gIFQgZXh0ZW5kc1xuICAgIHwgJ3N0cmluZydcbiAgICB8ICdudW1iZXInXG4gICAgfCAnb2JqZWN0J1xuICAgIHwgJ2Jvb2xlYW4nXG4gICAgfCAnc3ltYm9sJ1xuICAgIHwgJ2JpZ2ludCdcbiAgICB8ICd1bmRlZmluZWQnXG4+KHR5cGVPZjogVCwgZXJyb3I/OiBFcnJvckxpa2UpOiBTeW5jRnVuY3Rpb25WYWxpZGF0b3I8VHlwZU9mVHlwZTxUPj4ge1xuICByZXR1cm4gKGlucHV0OiB1bmtub3duKTogVHlwZU9mVHlwZTxUPiA9PiB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gdHlwZU9mKSB7XG4gICAgICB0aHJvdyB0b0Vycm9yKGVycm9yIHx8IGBHb3QgJHt0eXBlb2YgaW5wdXR9IGluc3RlYWQgb2YgYSAke3R5cGVPZn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXQgYXMgVHlwZU9mVHlwZTxUPjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEFueTxUPihpbnB1dDogVCk6IFQge1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPdmVycmlkZTxUPih2YWx1ZTogVCk6IFN5bmNGdW5jdGlvblZhbGlkYXRvcjxULCBbdW5rbm93bj9dPiB7XG4gIHJldHVybiAoKTogVCA9PiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlc3Q8VD4oXG4gIHRlc3Q6IChpbnB1dDogVCkgPT4gdW5rbm93bixcbiAgZXJyb3I/OiBFcnJvckxpa2UsXG4pOiBTeW5jRnVuY3Rpb25WYWxpZGF0b3I8VCwgW1RdPiB7XG4gIHJldHVybiAoaW5wdXQpOiBUID0+IHtcbiAgICBpZiAoIXRlc3QoaW5wdXQpKSB7XG4gICAgICB0aHJvdyB0b0Vycm9yKGVycm9yIHx8IGBJbnZhbGlkIGlucHV0YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xufVxuIl19