typescript-checker
Version:
Powerful data validation library enabling type safety
215 lines (214 loc) • 6.83 kB
JavaScript
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;
;