UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

69 lines (51 loc) 6.35 kB
"use strict"; 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==