computed-types
Version:
Runtime validation types for TypeScript.
69 lines (51 loc) • 6.35 kB
JavaScript
;
exports.__esModule = true;
exports.findSwitchKey = findSwitchKey;
exports.generateSwitch = generateSwitch;
var _utils = require("./utils");
// exported functions
function findSwitchKey(...candidates) {
const firstCandidate = candidates[0];
if (candidates.length < 2 || typeof firstCandidate !== 'object' || firstCandidate === null) {
return null;
}
let values = new Map();
const switchKey = Object.keys(firstCandidate).find(key => {
const firstValue = firstCandidate[key];
if (!(0, _utils.isPrimitive)(firstValue)) {
return false;
}
values = new Map([[firstValue, 0]]);
for (let i = 1; i < candidates.length; i += 1) {
const candidate = candidates[i];
if (typeof candidate !== 'object' || candidate === null) {
return false;
}
const value = candidate[key];
if (!(0, _utils.isPrimitive)(value) || values.has(value)) {
return false;
}
values.set(value, i);
}
return true;
});
if (switchKey === undefined) {
return null;
}
return [switchKey, values];
}
function generateSwitch(switchKey, validators) {
const [key, values] = switchKey;
return (...args) => {
const obj = args[0];
let index;
if (typeof obj === 'object' && obj !== null) {
const value = obj[key];
index = values.get(value) || 0;
} else {
index = 0;
}
return validators[index](...args);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvc3dpdGNoLnRzIl0sIm5hbWVzIjpbImZpbmRTd2l0Y2hLZXkiLCJjYW5kaWRhdGVzIiwiZmlyc3RDYW5kaWRhdGUiLCJsZW5ndGgiLCJ2YWx1ZXMiLCJNYXAiLCJzd2l0Y2hLZXkiLCJPYmplY3QiLCJrZXlzIiwiZmluZCIsImtleSIsImZpcnN0VmFsdWUiLCJpIiwiY2FuZGlkYXRlIiwidmFsdWUiLCJoYXMiLCJzZXQiLCJ1bmRlZmluZWQiLCJnZW5lcmF0ZVN3aXRjaCIsInZhbGlkYXRvcnMiLCJhcmdzIiwib2JqIiwiaW5kZXgiLCJnZXQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUtBO0FBRU8sU0FBU0EsYUFBVCxDQUNMLEdBQUdDLFVBREUsRUFFYTtBQUNsQixRQUFNQyxjQUFjLEdBQUdELFVBQVUsQ0FBQyxDQUFELENBQWpDOztBQUNBLE1BQ0VBLFVBQVUsQ0FBQ0UsTUFBWCxHQUFvQixDQUFwQixJQUNBLE9BQU9ELGNBQVAsS0FBMEIsUUFEMUIsSUFFQUEsY0FBYyxLQUFLLElBSHJCLEVBSUU7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJRSxNQUFvQixHQUFHLElBQUlDLEdBQUosRUFBM0I7QUFDQSxRQUFNQyxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixjQUFaLEVBQTRCTyxJQUE1QixDQUFrQ0MsR0FBRCxJQUFrQjtBQUNuRSxVQUFNQyxVQUFVLEdBQUdULGNBQWMsQ0FBQ1EsR0FBRCxDQUFqQzs7QUFDQSxRQUFJLENBQUMsd0JBQVlDLFVBQVosQ0FBTCxFQUE4QjtBQUM1QixhQUFPLEtBQVA7QUFDRDs7QUFFRFAsSUFBQUEsTUFBTSxHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDLENBQUNNLFVBQUQsRUFBYSxDQUFiLENBQUQsQ0FBUixDQUFUOztBQUVBLFNBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR1gsVUFBVSxDQUFDRSxNQUEvQixFQUF1Q1MsQ0FBQyxJQUFJLENBQTVDLEVBQStDO0FBQzdDLFlBQU1DLFNBQVMsR0FBR1osVUFBVSxDQUFDVyxDQUFELENBQTVCOztBQUNBLFVBQUksT0FBT0MsU0FBUCxLQUFxQixRQUFyQixJQUFpQ0EsU0FBUyxLQUFLLElBQW5ELEVBQXlEO0FBQ3ZELGVBQU8sS0FBUDtBQUNEOztBQUVELFlBQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDSCxHQUFELENBQXZCOztBQUVBLFVBQUksQ0FBQyx3QkFBWUksS0FBWixDQUFELElBQXVCVixNQUFNLENBQUNXLEdBQVAsQ0FBV0QsS0FBWCxDQUEzQixFQUE4QztBQUM1QyxlQUFPLEtBQVA7QUFDRDs7QUFFRFYsTUFBQUEsTUFBTSxDQUFDWSxHQUFQLENBQVdGLEtBQVgsRUFBa0JGLENBQWxCO0FBQ0Q7O0FBRUQsV0FBTyxJQUFQO0FBQ0QsR0F4QmlCLENBQWxCOztBQTBCQSxNQUFJTixTQUFTLEtBQUtXLFNBQWxCLEVBQTZCO0FBQzNCLFdBQU8sSUFBUDtBQUNEOztBQUVELFNBQU8sQ0FBQ1gsU0FBRCxFQUFZRixNQUFaLENBQVA7QUFDRDs7QUFFTSxTQUFTYyxjQUFULENBQ0xaLFNBREssRUFFTGEsVUFGSyxFQUdTO0FBQ2QsUUFBTSxDQUFDVCxHQUFELEVBQU1OLE1BQU4sSUFBZ0JFLFNBQXRCO0FBRUEsU0FBTyxDQUFDLEdBQUdjLElBQUosS0FBaUM7QUFDdEMsVUFBTUMsR0FBRyxHQUFHRCxJQUFJLENBQUMsQ0FBRCxDQUFoQjtBQUNBLFFBQUlFLEtBQUo7O0FBRUEsUUFBSSxPQUFPRCxHQUFQLEtBQWUsUUFBZixJQUEyQkEsR0FBRyxLQUFLLElBQXZDLEVBQTZDO0FBQzNDLFlBQU1QLEtBQUssR0FBR08sR0FBRyxDQUFDWCxHQUFELENBQWpCO0FBQ0FZLE1BQUFBLEtBQUssR0FBR2xCLE1BQU0sQ0FBQ21CLEdBQVAsQ0FBV1QsS0FBWCxLQUFxQixDQUE3QjtBQUNELEtBSEQsTUFHTztBQUNMUSxNQUFBQSxLQUFLLEdBQUcsQ0FBUjtBQUNEOztBQUVELFdBQU9ILFVBQVUsQ0FBQ0csS0FBRCxDQUFWLENBQWtCLEdBQUdGLElBQXJCLENBQVA7QUFDRCxHQVpEO0FBYUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1ByaW1pdGl2ZSwgUHJpbWl0aXZlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRnVuY3Rpb25UeXBlIGZyb20gJy4vRnVuY3Rpb25UeXBlJztcblxuZXhwb3J0IHR5cGUgU3dpdGNoS2V5ID0gW3N0cmluZywgTWFwPFByaW1pdGl2ZSwgbnVtYmVyPl07XG5cbi8vIGV4cG9ydGVkIGZ1bmN0aW9uc1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFN3aXRjaEtleShcbiAgLi4uY2FuZGlkYXRlczogW3Vua25vd24sIC4uLnVua25vd25bXV1cbik6IFN3aXRjaEtleSB8IG51bGwge1xuICBjb25zdCBmaXJzdENhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbMF07XG4gIGlmIChcbiAgICBjYW5kaWRhdGVzLmxlbmd0aCA8IDIgfHxcbiAgICB0eXBlb2YgZmlyc3RDYW5kaWRhdGUgIT09ICdvYmplY3QnIHx8XG4gICAgZmlyc3RDYW5kaWRhdGUgPT09IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgdmFsdWVzOiBTd2l0Y2hLZXlbMV0gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHN3aXRjaEtleSA9IE9iamVjdC5rZXlzKGZpcnN0Q2FuZGlkYXRlKS5maW5kKChrZXkpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gZmlyc3RDYW5kaWRhdGVba2V5IGFzIGtleW9mIHR5cGVvZiBmaXJzdENhbmRpZGF0ZV07XG4gICAgaWYgKCFpc1ByaW1pdGl2ZShmaXJzdFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhbHVlcyA9IG5ldyBNYXAoW1tmaXJzdFZhbHVlLCAwXV0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgIT09ICdvYmplY3QnIHx8IGNhbmRpZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gY2FuZGlkYXRlW2tleSBhcyBrZXlvZiB0eXBlb2YgY2FuZGlkYXRlXTtcblxuICAgICAgaWYgKCFpc1ByaW1pdGl2ZSh2YWx1ZSkgfHwgdmFsdWVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZXMuc2V0KHZhbHVlLCBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKHN3aXRjaEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gW3N3aXRjaEtleSwgdmFsdWVzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3dpdGNoKFxuICBzd2l0Y2hLZXk6IFN3aXRjaEtleSxcbiAgdmFsaWRhdG9yczogRnVuY3Rpb25UeXBlW10sXG4pOiBGdW5jdGlvblR5cGUge1xuICBjb25zdCBba2V5LCB2YWx1ZXNdID0gc3dpdGNoS2V5O1xuXG4gIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biA9PiB7XG4gICAgY29uc3Qgb2JqID0gYXJnc1swXTtcbiAgICBsZXQgaW5kZXg6IG51bWJlcjtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqXTtcbiAgICAgIGluZGV4ID0gdmFsdWVzLmdldCh2YWx1ZSkgfHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzW2luZGV4XSguLi5hcmdzKTtcbiAgfTtcbn1cbiJdfQ==