computed-types
Version:
Runtime validation types for TypeScript.
127 lines (103 loc) • 13.5 kB
JavaScript
;
exports.__esModule = true;
exports.default = compiler;
var _errors = require("./errors");
var _validations = require("./validations");
var _utils = require("./utils");
function compiler(schema, opts) {
const {
error,
basePath = [],
strict
} = opts || {};
if (typeof schema === 'function') {
return schema;
}
if (typeof schema !== 'object' || schema === null) {
return (0, _validations.equals)(schema, error);
}
if (schema instanceof RegExp) {
return (0, _validations.regexp)(schema, error);
}
let typeValidator;
if (Array.isArray(schema)) {
const validator = (0, _validations.array)(schema.length, error);
typeValidator = (...args) => {
return [validator(...args), []];
};
} else {
const validator = (0, _validations.type)('object', error);
typeValidator = (...args) => {
return [validator(...args), {}];
};
}
const keys = Object.keys(schema);
const tasks = keys.map(key => {
const path = [...basePath, key];
const validator = compiler(schema[key], {
basePath,
strict
});
return (res, errors, obj) => {
try {
const value = validator(obj[key]);
if (!(0, _utils.isPromiseLike)(value)) {
res[key] = value;
return;
}
return value.then(value => {
res[key] = value;
}, error => {
errors.push(...(0, _errors.toPathErrors)(error, path));
});
} catch (error) {
errors.push(...(0, _errors.toPathErrors)(error, path));
}
};
});
if (strict) {
const keysSet = new Set(keys);
tasks.push((res, errors, obj) => {
Object.keys(obj).forEach(key => {
if (keysSet.has(key)) return;
errors.push({
path: [...basePath, key],
error: (0, _errors.toError)(`Unknown property "${key}"`)
});
});
});
}
const tasksCount = tasks.length;
return (...args) => {
// eslint-disable-next-line @typescript-eslint/ban-types
let obj;
let res;
let mainError;
try {
[obj, res] = typeValidator(...args);
} catch (e) {
obj = {};
res = {};
mainError = e;
}
const promises = [];
const errors = [];
for (let i = 0; i < tasksCount; i += 1) {
const promise = tasks[i](res, errors, obj);
if (promise) promises.push(promise);
}
if (!promises.length) {
if (errors.length || mainError) {
throw (0, _errors.createValidationError)(errors, mainError || error, ...args);
}
return res;
}
return Promise.all(promises).then(() => {
if (errors.length || mainError) {
throw (0, _errors.createValidationError)(errors, mainError || error, ...args);
}
return res;
});
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvY29tcGlsZXIudHMiXSwibmFtZXMiOlsiY29tcGlsZXIiLCJzY2hlbWEiLCJvcHRzIiwiZXJyb3IiLCJiYXNlUGF0aCIsInN0cmljdCIsIlJlZ0V4cCIsInR5cGVWYWxpZGF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWxpZGF0b3IiLCJsZW5ndGgiLCJhcmdzIiwia2V5cyIsIk9iamVjdCIsInRhc2tzIiwibWFwIiwia2V5IiwicGF0aCIsInJlcyIsImVycm9ycyIsIm9iaiIsInZhbHVlIiwidGhlbiIsInB1c2giLCJrZXlzU2V0IiwiU2V0IiwiZm9yRWFjaCIsImhhcyIsInRhc2tzQ291bnQiLCJtYWluRXJyb3IiLCJlIiwicHJvbWlzZXMiLCJpIiwicHJvbWlzZSIsIlByb21pc2UiLCJhbGwiXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0E7O0FBT0E7O0FBRUE7O0FBVWUsU0FBU0EsUUFBVCxDQUNiQyxNQURhLEVBRWJDLElBRmEsRUFPZTtBQUM1QixRQUFNO0FBQUVDLElBQUFBLEtBQUY7QUFBU0MsSUFBQUEsUUFBUSxHQUFHLEVBQXBCO0FBQXdCQyxJQUFBQTtBQUF4QixNQUFtQ0gsSUFBSSxJQUFJLEVBQWpEOztBQUVBLE1BQUksT0FBT0QsTUFBUCxLQUFrQixVQUF0QixFQUFrQztBQUNoQyxXQUFPQSxNQUFQO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPQSxNQUFQLEtBQWtCLFFBQWxCLElBQThCQSxNQUFNLEtBQUssSUFBN0MsRUFBbUQ7QUFDakQsV0FBTyx5QkFBT0EsTUFBUCxFQUFlRSxLQUFmLENBQVA7QUFDRDs7QUFFRCxNQUFJRixNQUFNLFlBQVlLLE1BQXRCLEVBQThCO0FBQzVCLFdBQU8seUJBQU9MLE1BQVAsRUFBZUUsS0FBZixDQUFQO0FBQ0Q7O0FBRUQsTUFBSUksYUFBSjs7QUFNQSxNQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY1IsTUFBZCxDQUFKLEVBQTJCO0FBQ3pCLFVBQU1TLFNBQVMsR0FBRyx3QkFBTVQs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LEtBRkQsQ0FFRSxPQUFPbUIsQ0FBUCxFQUFVO0FBQ1ZWLE1BQUFBLEdBQUcsR0FBRyxFQUFOO0FBQ0FGLE1BQUFBLEdBQUcsR0FBRyxFQUFOO0FBQ0FXLE1BQUFBLFNBQVMsR0FBR0MsQ0FBWjtBQUNEOztBQUVELFVBQU1DLFFBQTZCLEdBQUcsRUFBdEM7QUFDQSxVQUFNWixNQUFtQixHQUFHLEVBQTVCOztBQUVBLFNBQUssSUFBSWEsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osVUFBcEIsRUFBZ0NJLENBQUMsSUFBSSxDQUFyQyxFQUF3QztBQUN0QyxZQUFNQyxPQUFPLEdBQUduQixLQUFLLENBQUNrQixDQUFELENBQUwsQ0FBU2QsR0FBVCxFQUFjQyxNQUFkLEVBQXNCQyxHQUF0QixDQUFoQjtBQUNBLFVBQUlhLE9BQUosRUFBYUYsUUFBUSxDQUFDUixJQUFULENBQWNVLE9BQWQ7QUFDZDs7QUFFRCxRQUFJLENBQUNGLFFBQVEsQ0FBQ3JCLE1BQWQsRUFBc0I7QUFDcEIsVUFBSVMsTUFBTSxDQUFDVCxNQUFQLElBQWlCbUIsU0FBckIsRUFBZ0M7QUFDOUIsY0FBTSxtQ0FDSlYsTUFESSxFQUVKVSxTQUFTLElBQUkzQixLQUZULEVBR0osR0FBR1MsSUFIQyxDQUFOO0FBS0Q7O0FBRUQsYUFBT08sR0FBUDtBQUNEOztBQUVELFdBQU9nQixPQUFPLENBQUNDLEdBQVIsQ0FBWUosUUFBWixFQUFzQlQsSUFBdEIsQ0FBMkIsTUFBTTtBQUN0QyxVQUFJSCxNQUFNLENBQUNULE1BQVAsSUFBaUJtQixTQUFyQixFQUFnQztBQUM5QixjQUFNLG1DQUNKVixNQURJLEVBRUpVLFNBQVMsSUFBSTNCLEtBRlQsRUFHSixHQUFHUyxJQUhDLENBQU47QUFLRDs7QUFFRCxhQUFPTyxHQUFQO0FBQ0QsS0FWTSxDQUFQO0FBV0QsR0EvQ0Q7QUFnREQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTY2hlbWFQYXJhbWV0ZXJzLFxuICBTY2hlbWFSZXNvbHZlVHlwZSxcbiAgU2NoZW1hVmFsaWRhdG9yRnVuY3Rpb24sXG59IGZyb20gJy4vaW8nO1xuaW1wb3J0IHtcbiAgY3JlYXRlVmFsaWRhdGlvbkVycm9yLFxuICBFcnJvckxpa2UsXG4gIE9iamVjdFBhdGgsXG4gIHRvRXJyb3IsXG4gIHRvUGF0aEVycm9ycyxcbn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYXJyYXksIGVxdWFscywgcmVnZXhwLCB0eXBlIH0gZnJvbSAnLi92YWxpZGF0aW9ucyc7XG5pbXBvcnQgRnVuY3Rpb25UeXBlIGZyb20gJy4vRnVuY3Rpb25UeXBlJztcbmltcG9ydCB7IGlzUHJvbWlzZUxpa2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFBhdGhFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxudHlwZSBTY2hlbWFLZXlUYXNrID0gKFxuICByZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlcnJvcnM6IFBhdGhFcnJvcltdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBvYmo6IG9iamVjdCxcbikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21waWxlcjxTPihcbiAgc2NoZW1hOiBTLFxuICBvcHRzPzoge1xuICAgIGVycm9yPzogRXJyb3JMaWtlPFNjaGVtYVBhcmFtZXRlcnM8Uz4+O1xuICAgIGJhc2VQYXRoPzogT2JqZWN0UGF0aDtcbiAgICBzdHJpY3Q/OiBib29sZWFuO1xuICB9LFxuKTogU2NoZW1hVmFsaWRhdG9yRnVuY3Rpb248Uz4ge1xuICBjb25zdCB7IGVycm9yLCBiYXNlUGF0aCA9IFtdLCBzdHJpY3QgfSA9IG9wdHMgfHwge307XG5cbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2NoZW1hIGFzIHVua25vd24gYXMgU2NoZW1hVmFsaWRhdG9yRnVuY3Rpb248Uz47XG4gIH1cblxuICBpZiAodHlwZW9mIHNjaGVtYSAhPT0gJ29iamVjdCcgfHwgc2NoZW1hID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGVxdWFscyhzY2hlbWEsIGVycm9yKSBhcyBTY2hlbWFWYWxpZGF0b3JGdW5jdGlvbjxTPjtcbiAgfVxuXG4gIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gcmVnZXhwKHNjaGVtYSwgZXJyb3IpIGFzIFNjaGVtYVZhbGlkYXRvckZ1bmN0aW9uPFM+O1xuICB9XG5cbiAgbGV0IHR5cGVWYWxpZGF0b3I6IEZ1bmN0aW9uVHlwZTxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIFtvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSxcbiAgICBTY2hlbWFQYXJhbWV0ZXJzPFM+XG4gID47XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IGFycmF5KHNjaGVtYS5sZW5ndGgsIGVycm9yKTtcblxuICAgIHR5cGVWYWxpZGF0b3IgPSAoXG4gICAgICAuLi5hcmdzOiBTY2hlbWFQYXJhbWV0ZXJzPFM+XG4gICAgKTogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBbb2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0gPT4ge1xuICAgICAgcmV0dXJuIFt2YWxpZGF0b3IoLi4uYXJncyksIFtdIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdHlwZSgnb2JqZWN0JywgZXJyb3IpO1xuXG4gICAgdHlwZVZhbGlkYXRvciA9IChcbiAgICAgIC4uLmFyZ3M6IFNjaGVtYVBhcmFtZXRlcnM8Uz5cbiAgICApOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIFtvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSA9PiB7XG4gICAgICByZXR1cm4gW3ZhbGlkYXRvciguLi5hcmdzKSwge31dO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hKTtcblxuICBjb25zdCB0YXNrcyA9IGtleXMubWFwKChrZXkpOiBTY2hlbWFLZXlUYXNrID0+IHtcbiAgICBjb25zdCBwYXRoID0gWy4uLmJhc2VQYXRoLCBrZXldO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyPHVua25vd24+KHNjaGVtYVtrZXkgYXMga2V5b2YgU10sIHtcbiAgICAgIGJhc2VQYXRoLFxuICAgICAgc3RyaWN0LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChyZXMsIGVycm9ycywgb2JqKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gdmFsaWRhdG9yKFxuICAgICAgICAgIChvYmogYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pW2tleV0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpc1Byb21pc2VMaWtlKHZhbHVlKSkge1xuICAgICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRoZW4oXG4gICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCguLi50b1BhdGhFcnJvcnMoZXJyb3IsIHBhdGgpKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udG9QYXRoRXJyb3JzKGVycm9yIGFzIEVycm9yLCBwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgaWYgKHN0cmljdCkge1xuICAgIGNvbnN0IGtleXNTZXQgPSBuZXcgU2V0KGtleXMpO1xuXG4gICAgdGFza3MucHVzaCgocmVzLCBlcnJvcnMsIG9iaik6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleXNTZXQuaGFzKGtleSkpIHJldHVybjtcblxuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgcGF0aDogWy4uLmJhc2VQYXRoLCBrZXldLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGBVbmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRhc2tzQ291bnQgPSB0YXNrcy5sZW5ndGg7XG5cbiAgcmV0dXJuICgoXG4gICAgLi4uYXJnczogU2NoZW1hUGFyYW1ldGVyczxTPlxuICApOiBTY2hlbWFSZXNvbHZlVHlwZTxTPiB8IFByb21pc2U8U2NoZW1hUmVzb2x2ZVR5cGU8Uz4+ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIGxldCBvYmo6IG9iamVjdDtcbiAgICBsZXQgcmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBsZXQgbWFpbkVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBbb2JqLCByZXNdID0gdHlwZVZhbGlkYXRvciguLi5hcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvYmogPSB7fTtcbiAgICAgIHJlcyA9IHt9O1xuICAgICAgbWFpbkVycm9yID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZUxpa2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IGVycm9yczogUGF0aEVycm9yW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza3NDb3VudDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBwcm9taXNlID0gdGFza3NbaV0ocmVzLCBlcnJvcnMsIG9iaik7XG4gICAgICBpZiAocHJvbWlzZSkgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb21pc2VzLmxlbmd0aCkge1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggfHwgbWFpbkVycm9yKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVZhbGlkYXRpb25FcnJvcjxTY2hlbWFQYXJhbWV0ZXJzPFM+PihcbiAgICAgICAgICBlcnJvcnMsXG4gICAgICAgICAgbWFpbkVycm9yIHx8IGVycm9yLFxuICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXMgYXMgU2NoZW1hUmVzb2x2ZVR5cGU8Uz47XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoIHx8IG1haW5FcnJvcikge1xuICAgICAgICB0aHJvdyBjcmVhdGVWYWxpZGF0aW9uRXJyb3I8U2NoZW1hUGFyYW1ldGVyczxTPj4oXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgIG1haW5FcnJvciB8fCBlcnJvcixcbiAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pIGFzIFNjaGVtYVJlc29sdmVUeXBlPFM+O1xuICB9KSBhcyBTY2hlbWFWYWxpZGF0b3JGdW5jdGlvbjxTPjtcbn1cbiJdfQ==