UNPKG

typescript-checker

Version:

Powerful data validation library enabling type safety

215 lines (214 loc) 6.83 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.withDefault = exports.Fallback = exports.Catch = exports.Or = exports.Merge = exports.And = exports.AndNot = exports.KeysObject2 = exports.KeysObject1 = exports.KeysObject = exports.ItemsPartial = exports.OneOf = exports.Accept = exports.CheckerRef = exports.Type = exports.isCheckError = exports.isCheckValid = void 0; var utils_1 = require("./utils"); var isType = function (name, value) { return typeof value === name; }; var isCheckValid = function (args) { return args[0] === null; }; exports.isCheckValid = isCheckValid; var isCheckError = function (args) { return args[0] !== null; }; exports.isCheckError = isCheckError; var Type = function (name) { return function (value) { return isType(name, value) ? [null, value] : [["expected " + name + " found " + (0, utils_1.stringifyObject)(value)]]; }; }; exports.Type = Type; var CheckerRef = function (checkerRef) { return function (value) { return checkerRef()(value); }; }; exports.CheckerRef = CheckerRef; var Accept = function () { return function (value) { return [null, value]; }; }; exports.Accept = Accept; var OneOf = function () { var items = []; for (var _i = 0; _i < arguments.length; _i++) { items[_i] = arguments[_i]; } return function (value) { for (var _i = 0, items_1 = items; _i < items_1.length; _i++) { var item = items_1[_i]; if (item === value) { return [null, item]; } } return [["expected one of " + (0, utils_1.stringifyObject)(items) + " found " + (0, utils_1.stringifyObject)(value)]]; }; }; exports.OneOf = OneOf; var ItemsPartial = function (items) { var test = items; return function (values) { var index = 0; var obj = []; for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { var value = values_1[_i]; var result = test(value); if ((0, exports.isCheckError)(result)) { return [result[0].map(function (error) { return "[" + index + "] " + error; })]; } obj.push(result[1]); ++index; } return [null, obj]; }; }; exports.ItemsPartial = ItemsPartial; exports.KeysObject = (function (schema, optional) { if (optional === undefined) { return (0, exports.KeysObject1)(schema); } return (0, exports.KeysObject2)(schema, optional); }); var KeysObject1 = function (schema) { return (0, exports.KeysObject2)(schema, []); }; exports.KeysObject1 = KeysObject1; var KeysObject2 = function (schema, optional) { var optionalSet = new Set(optional); var keys = Object.keys(schema); var tests = keys.map(function (key) { var test = schema[key]; return [ key, optionalSet.has(key), function (value) { var result = test(value[key]); if ((0, exports.isCheckError)(result)) { return [result[0].map(function (error) { return "." + key + " " + error; })]; } return result; }, ]; }); return function (value) { var obj = {}; for (var _i = 0, tests_1 = tests; _i < tests_1.length; _i++) { var _a = tests_1[_i], key = _a[0], optional_1 = _a[1], test_1 = _a[2]; if (!(key in value)) { if (optional_1) { continue; } else { return [["expected required property: " + key]]; } } var result = test_1(value); if ((0, exports.isCheckError)(result)) { return result; } obj[key] = result[1]; } return [null, obj]; }; }; exports.KeysObject2 = KeysObject2; var AndNot = function (a, b, error) { if (error === void 0) { error = "ERROR"; } var testA = a; var testB = b; return function (value) { if ((0, exports.isCheckValid)(testB(value))) { return [[error]]; } var result = testA(value); return result; }; }; exports.AndNot = AndNot; var And = function (a, b) { var testA = a; var testB = b; return function (value) { var result = testA(value); if ((0, exports.isCheckError)(result)) { return result; } return testB(result[1]); }; }; exports.And = And; var AndChain = function (a) { var checker = a.bind(null); checker.then = function (b) { return AndChain((0, exports.And)(a, b)); }; return checker; }; exports.And.then = AndChain; var Merge = function (a, b) { var testA = a; var testB = b; return function (value) { var resultA = testA(value); if ((0, exports.isCheckError)(resultA)) { return resultA; } var resultB = testB(value); if ((0, exports.isCheckError)(resultB)) { return resultB; } return [null, __assign(__assign({}, resultA[1]), resultB[1])]; }; }; exports.Merge = Merge; var Or = function () { var types = []; for (var _i = 0; _i < arguments.length; _i++) { types[_i] = arguments[_i]; } return function (value) { var _a; var errors = []; for (var _i = 0, types_1 = types; _i < types_1.length; _i++) { var test_2 = types_1[_i]; var result = test_2(value); if ((0, exports.isCheckValid)(result)) { return result; } errors.push(result[0]); } return [(_a = []).concat.apply(_a, errors)]; }; }; exports.Or = Or; var Catch = function (check, fallback) { return function (value) { var result = check(value); if ((0, exports.isCheckError)(result)) { return [null, fallback()]; } return result; }; }; exports.Catch = Catch; var Fallback = function (check, fallback) { return function (value) { if (value === undefined) { return [null, fallback()]; } return check(value); }; }; exports.Fallback = Fallback; var withDefault = function (check, defaultValue) { if ((0, exports.isCheckError)(check)) { return defaultValue; } return check[1]; }; exports.withDefault = withDefault;