UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

155 lines (124 loc) 16.1 kB
"use strict"; exports.__esModule = true; exports.array = array; exports.destruct = destruct; exports.enumValue = enumValue; exports.equals = equals; exports.error = error; exports.recordValue = recordValue; exports.regexp = regexp; exports.test = test; exports.type = type; var _errors = require("./errors"); var _utils = require("./utils"); function type(type, error) { return (...args) => { if (typeof args[0] !== type || args[0] === null) { throw (0, _errors.toError)(error || `Expect value to be "${type}"`, ...args); } return args[0]; }; } function equals(expected, error) { return (...args) => { if (args[0] !== expected) { throw (0, _errors.toError)(error || `Expect value to equal "${expected}"`, ...args); } return args[0]; }; } function test(tester, error) { return (...args) => { if (!tester(...args)) { throw (0, _errors.toError)(error || `Validation test failed`, ...args); } return args[0]; }; } function destruct(validator, error) { return (...args) => { try { const res = validator(...args); if (!(0, _utils.isPromiseLike)(res)) { return [null, res]; } return res.then(ret => [null, ret], err => [error ? (0, _errors.toError)(error, ...args) : err]); } catch (err) { return [error ? (0, _errors.toError)(error, ...args) : err]; } }; } function error(validator, err) { return (...args) => { try { const res = validator(...args); if (!(0, _utils.isPromiseLike)(res)) { return res; } return res.then(null, () => { throw (0, _errors.toError)(err, ...args); }); } catch (e) { throw (0, _errors.toError)(err, ...args); } }; } function regexp(exp, error) { if (!(exp instanceof RegExp)) { exp = new RegExp(exp); } return (...args) => { if (!exp.test(args[0])) { throw (0, _errors.toError)(error || `Invalid string format (expected: ${exp})`, ...args); } return String(args[0]); }; } function array(length = null, error) { const isArray = (...args) => { if (!Array.isArray(args[0])) { throw (0, _errors.toError)(error || `Expecting value to be an array`, ...args); } return args[0]; }; if (length === null) { return isArray; } return (...args) => { const arr = isArray(...args); if (arr.length !== length) { throw (0, _errors.toError)(error || `Expected array length ${length} (given: ${arr.length})`, ...args); } return arr; }; } function enumValue(value, error) { const values = new Set(Object.keys(value).filter(key => isNaN(Number(key))).map(key => value[key])); return (...args) => { if (!values.has(args[0])) { throw (0, _errors.toError)(error || 'Unknown enum value', ...args); } return args[0]; }; } function recordValue(key, value, error) { return (...args) => { const [input] = args; if (!input || typeof input !== 'object') { throw (0, _errors.toError)(error || 'Expected non-null object', ...args); } const obj = {}; for (const k in input) { try { obj[key(k)] = value(input[k]); } catch (error) { throw (0, _errors.createValidationError)([{ path: [k], error: error }], null, ...args); } } return obj; }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvdmFsaWRhdGlvbnMudHMiXSwibmFtZXMiOlsidHlwZSIsImVycm9yIiwiYXJncyIsImVxdWFscyIsImV4cGVjdGVkIiwidGVzdCIsInRlc3RlciIsImRlc3RydWN0IiwidmFsaWRhdG9yIiwicmVzIiwidGhlbiIsInJldCIsImVyciIsImUiLCJyZWdleHAiLCJleHAiLCJSZWdFeHAiLCJTdHJpbmciLCJhcnJheSIsImxlbmd0aCIsImlzQXJyYXkiLCJBcnJheSIsImFyciIsImVudW1WYWx1ZSIsInZhbHVlIiwidmFsdWVzIiwiU2V0IiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImtleSIsImlzTmFOIiwiTnVtYmVyIiwibWFwIiwiaGFzIiwicmVjb3JkVmFsdWUiLCJpbnB1dCIsIm9iaiIsImsiLCJwYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBT0E7O0FBU08sU0FBU0EsSUFBVCxDQUdMQSxJQUhLLEVBR0lDLEtBSEosRUFHc0Q7QUFDM0QsU0FBTyxDQUFDLEdBQUdDLElBQUosS0FBMkI7QUFDaEMsUUFBSSxPQUFPQSxJQUFJLENBQUMsQ0FBRCxDQUFYLEtBQW1CRixJQUFuQixJQUEyQkUsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLElBQTNDLEVBQWlEO0FBQy9DLFlBQU0scUJBQVFELEtBQUssSUFBSyx1QkFBc0JELElBQUssR0FBN0MsRUFBaUQsR0FBR0UsSUFBcEQsQ0FBTjtBQUNEOztBQUVELFdBQU9BLElBQUksQ0FBQyxDQUFELENBQVg7QUFDRCxHQU5EO0FBT0Q7O0FBRU0sU0FBU0MsTUFBVCxDQUNMQyxRQURLLEVBRUxILEtBRkssRUFHZTtBQUNwQixTQUFPLENBQUMsR0FBR0MsSUFBSixLQUFtQjtBQUN4QixRQUFJQSxJQUFJLENBQUMsQ0FBRCxDQUFKLEtBQVlFLFFBQWhCLEVBQTBCO0FBQ3hCLFlBQU0scUJBQVFILEtBQUssSUFBSywwQkFBeUJHLFFBQVMsR0FBcEQsRUFBd0QsR0FB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U0x2QixLQVRLLEVBVTBCO0FBQy9CLFNBQU8sQ0FBQyxHQUFHQyxJQUFKLEtBQWE7QUFDbEIsVUFBTSxDQUFDa0MsS0FBRCxJQUFVbEMsSUFBaEI7O0FBRUEsUUFBSSxDQUFDa0MsS0FBRCxJQUFVLE9BQU9BLEtBQVAsS0FBaUIsUUFBL0IsRUFBeUM7QUFDdkMsWUFBTSxxQkFBUW5DLEtBQUssSUFBSSwwQkFBakIsRUFBNkMsR0FBR0MsSUFBaEQsQ0FBTjtBQUNEOztBQUVELFVBQU1tQyxHQUFHLEdBQUcsRUFBWjs7QUFFQSxTQUFLLE1BQU1DLENBQVgsSUFBZ0JGLEtBQWhCLEVBQXVCO0FBQ3JCLFVBQUk7QUFDRkMsUUFBQUEsR0FBRyxDQUFDUCxHQUFHLENBQUNRLENBQUQsQ0FBSixDQUFILEdBQW9CZCxLQUFLLENBQUVZLEtBQUQsQ0FBbUNFLENBQW5DLENBQUQsQ0FBekI7QUFDRCxPQUZELENBRUUsT0FBT3JDLEtBQVAsRUFBYztBQUNkLGNBQU0sbUNBQ0osQ0FDRTtBQUNFc0MsVUFBQUEsSUFBSSxFQUFFLENBQUNELENBQUQsQ0FEUjtBQUVFckMsVUFBQUEsS0FBSyxFQUFFQTtBQUZULFNBREYsQ0FESSxFQU9KLElBUEksRUFRSixHQUFHQyxJQVJDLENBQU47QUFVRDtBQUNGOztBQUVELFdBQU9tQyxHQUFQO0FBQ0QsR0EzQkQ7QUE0QkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIEVycm9yTGlrZSxcbiAgdG9FcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgRnVuY3Rpb25UeXBlLCB7IEZ1bmN0aW9uUGFyYW1ldGVycyB9IGZyb20gJy4vRnVuY3Rpb25UeXBlJztcbmltcG9ydCB7XG4gIEVudW0sXG4gIGlzUHJvbWlzZUxpa2UsXG4gIE1heWJlQXN5bmMsXG4gIE9iamVjdFByb3BlcnR5LFxuICBSZXNvbHZlZFZhbHVlLFxuICBUeXBlb2YsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHlwZTxcbiAgVCBleHRlbmRzIGtleW9mIFR5cGVvZixcbiAgUCBleHRlbmRzIEZ1bmN0aW9uUGFyYW1ldGVycyA9IFtUeXBlb2ZbVF1dLFxuPih0eXBlOiBULCBlcnJvcj86IEVycm9yTGlrZTxQPik6IEZ1bmN0aW9uVHlwZTxUeXBlb2ZbVF0sIFA+IHtcbiAgcmV0dXJuICguLi5hcmdzOiBQKTogVHlwZW9mW1RdID0+IHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gIT09IHR5cGUgfHwgYXJnc1swXSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgdG9FcnJvcihlcnJvciB8fCBgRXhwZWN0IHZhbHVlIHRvIGJlIFwiJHt0eXBlfVwiYCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3NbMF0gYXMgVHlwZW9mW1RdO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzPFQsIFAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnMgPSBbVF0+KFxuICBleHBlY3RlZDogVCxcbiAgZXJyb3I/OiBFcnJvckxpa2U8UD4sXG4pOiBGdW5jdGlvblR5cGU8VCwgUD4ge1xuICByZXR1cm4gKC4uLmFyZ3M6IFApOiBUID0+IHtcbiAgICBpZiAoYXJnc1swXSAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgIHRocm93IHRvRXJyb3IoZXJyb3IgfHwgYEV4cGVjdCB2YWx1ZSB0byBlcXVhbCBcIiR7ZXhwZWN0ZWR9XCJgLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnc1swXSBhcyBUO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdDxQIGV4dGVuZHMgRnVuY3Rpb25QYXJhbWV0ZXJzPihcbiAgdGVzdGVyOiBGdW5jdGlvblR5cGU8dW5rbm93biwgUD4sXG4gIGVycm9yPzogRXJyb3JMaWtlPFA+LFxuKTogRnVuY3Rpb25UeXBlPFBbMF0sIFA+IHtcbiAgcmV0dXJuICguLi5hcmdzOiBQKTogUFswXSA9PiB7XG4gICAgaWYgKCF0ZXN0ZXIoLi4uYXJncykpIHtcbiAgICAgIHRocm93IHRvRXJyb3IoZXJyb3IgfHwgYFZhbGlkYXRpb24gdGVzdCBmYWlsZWRgLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnc1swXTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc3RydWN0PEYgZXh0ZW5kcyBGdW5jdGlvblR5cGU+KFxuICB2YWxpZGF0b3I6IEYsXG4gIGVycm9yPzogRXJyb3JMaWtlPFBhcmFtZXRlcnM8Rj4+LFxuKTogRnVuY3Rpb25UeXBlPFxuICBNYXliZUFzeW5jPFxuICAgIFJldHVyblR5cGU8Rj4sXG4gICAgW1ZhbGlkYXRpb25FcnJvciB8IG51bGwsIFJlc29sdmVkVmFsdWU8UmV0dXJuVHlwZTxGPj4/XVxuICA+LFxuICBQYXJhbWV0ZXJzPEY+XG4+IHtcbiAgcmV0dXJuICgoXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczxGPlxuICApOlxuICAgIHwgW0Vycm9yIHwgbnVsbCwgUmVzb2x2ZWRWYWx1ZTxSZXR1cm5UeXBlPEY+Pj9dXG4gICAgfCBQcm9taXNlTGlrZTxbRXJyb3IgfCBudWxsLCBSZXNvbHZlZFZhbHVlPFJldHVyblR5cGU8Rj4+P10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdG9yKC4uLmFyZ3MpO1xuICAgICAgaWYgKCFpc1Byb21pc2VMaWtlKHJlcykpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXNdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzLnRoZW4oXG4gICAgICAgIChyZXQpID0+IFtudWxsLCByZXRdLFxuICAgICAgICAoZXJyKSA9PiBbZXJyb3IgPyB0b0Vycm9yKGVycm9yLCAuLi5hcmdzKSA6IGVycl0sXG4gICAgICApIGFzIFByb21pc2VMaWtlPFtFcnJvciB8IG51bGwsIFJlc29sdmVkVmFsdWU8UmV0dXJuVHlwZTxGPj4/XT47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gW2Vycm9yID8gdG9FcnJvcihlcnJvciwgLi4uYXJncykgOiAoZXJyIGFzIEVycm9yKV07XG4gICAgfVxuICB9KSBhcyBGdW5jdGlvblR5cGU8XG4gICAgTWF5YmVBc3luYzxSZXR1cm5UeXBlPEY+LCBbRXJyb3IgfCBudWxsLCBSZXNvbHZlZFZhbHVlPFJldHVyblR5cGU8Rj4+P10+LFxuICAgIFBhcmFtZXRlcnM8Rj5cbiAgPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yPFIsIFAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnM+KFxuICB2YWxpZGF0b3I6IEZ1bmN0aW9uVHlwZTxSLCBQPixcbiAgZXJyOiBFcnJvckxpa2U8UD4sXG4pOiBGdW5jdGlvblR5cGU8UiwgUD4ge1xuICByZXR1cm4gKC4uLmFyZ3M6IFApOiBSID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdG9yKC4uLmFyZ3MpO1xuICAgICAgaWYgKCFpc1Byb21pc2VMaWtlKHJlcykpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcy50aGVuKG51bGwsICgpOiBuZXZlciA9PiB7XG4gICAgICAgIHRocm93IHRvRXJyb3IoZXJyLCAuLi5hcmdzKTtcbiAgICAgIH0pIGFzIHVua25vd24gYXMgUjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyB0b0Vycm9yKGVyciwgLi4uYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnZXhwPFAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnMgPSBbc3RyaW5nXT4oXG4gIGV4cDogUmVnRXhwIHwgc3RyaW5nLFxuICBlcnJvcj86IEVycm9yTGlrZTxQPixcbik6IEZ1bmN0aW9uVHlwZTxzdHJpbmcsIFA+IHtcbiAgaWYgKCEoZXhwIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgIGV4cCA9IG5ldyBSZWdFeHAoZXhwKTtcbiAgfVxuXG4gIHJldHVybiAoLi4uYXJnczogUCk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCEoZXhwIGFzIFJlZ0V4cCkudGVzdChhcmdzWzBdIGFzIHN0cmluZykpIHtcbiAgICAgIHRocm93IHRvRXJyb3IoXG4gICAgICAgIGVycm9yIHx8IGBJbnZhbGlkIHN0cmluZyBmb3JtYXQgKGV4cGVjdGVkOiAke2V4cH0pYCxcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhhcmdzWzBdKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5PFxuICBSIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4sXG4gIFAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnMgPSBbUl0sXG4+KGxlbmd0aDogbnVtYmVyIHwgbnVsbCA9IG51bGwsIGVycm9yPzogRXJyb3JMaWtlPFA+KTogRnVuY3Rpb25UeXBlPFIsIFA+IHtcbiAgY29uc3QgaXNBcnJheSA9ICguLi5hcmdzOiBQKTogUiA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICB0aHJvdyB0b0Vycm9yKGVycm9yIHx8IGBFeHBlY3RpbmcgdmFsdWUgdG8gYmUgYW4gYXJyYXlgLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnc1swXSBhcyBSO1xuICB9O1xuXG4gIGlmIChsZW5ndGggPT09IG51bGwpIHtcbiAgICByZXR1cm4gaXNBcnJheTtcbiAgfVxuXG4gIHJldHVybiAoLi4uYXJnczogUCk6IFIgPT4ge1xuICAgIGNvbnN0IGFyciA9IGlzQXJyYXkoLi4uYXJncyk7XG5cbiAgICBpZiAoYXJyLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICB0aHJvdyB0b0Vycm9yKFxuICAgICAgICBlcnJvciB8fCBgRXhwZWN0ZWQgYXJyYXkgbGVuZ3RoICR7bGVuZ3RofSAoZ2l2ZW46ICR7YXJyLmxlbmd0aH0pYCxcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1WYWx1ZTxcbiAgRSBleHRlbmRzIEVudW08RT4sXG4gIFAgZXh0ZW5kcyBGdW5jdGlvblBhcmFtZXRlcnMgPSBbRVtrZXlvZiBFXV0sXG4+KHZhbHVlOiBFLCBlcnJvcj86IEVycm9yTGlrZTxQPik6IEZ1bmN0aW9uVHlwZTxFW2tleW9mIEVdLCBQPiB7XG4gIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQ8RVtrZXlvZiBFXT4oXG4gICAgT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGlzTmFOKE51bWJlcihrZXkpKSlcbiAgICAgIC5tYXAoKGtleSkgPT4gdmFsdWVba2V5IGFzIGtleW9mIEVdKSxcbiAgKTtcblxuICByZXR1cm4gKC4uLmFyZ3M6IFApOiBFW2tleW9mIEVdID0+IHtcbiAgICBpZiAoIXZhbHVlcy5oYXMoYXJnc1swXSBhcyBFW2tleW9mIEVdKSkge1xuICAgICAgdGhyb3cgdG9FcnJvcihlcnJvciB8fCAnVW5rbm93biBlbnVtIHZhbHVlJywgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3NbMF0gYXMgRVtrZXlvZiBFXTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFZhbHVlPFxuICBLIGV4dGVuZHMgT2JqZWN0UHJvcGVydHksXG4gIFYsXG4gIElLIGV4dGVuZHMgT2JqZWN0UHJvcGVydHksXG4gIElWLFxuICBQIGV4dGVuZHMgRnVuY3Rpb25QYXJhbWV0ZXJzID0gW1JlY29yZDxJSywgSVY+XSxcbj4oXG4gIGtleTogRnVuY3Rpb25UeXBlPEssIFtJS10+LFxuICB2YWx1ZTogRnVuY3Rpb25UeXBlPFYsIFtJVl0+LFxuICBlcnJvcj86IEVycm9yTGlrZTxQPixcbik6IEZ1bmN0aW9uVHlwZTxSZWNvcmQ8SywgVj4sIFA+IHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgW2lucHV0XSA9IGFyZ3M7XG5cbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHRvRXJyb3IoZXJyb3IgfHwgJ0V4cGVjdGVkIG5vbi1udWxsIG9iamVjdCcsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IG9iaiA9IHt9IGFzIFJlY29yZDxLLCBWPjtcblxuICAgIGZvciAoY29uc3QgayBpbiBpbnB1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqW2tleShrIGFzIElLKV0gPSB2YWx1ZSgoaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdIGFzIElWKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6IFtrXSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9O1xufVxuIl19