UNPKG

foop

Version:

interfaces that describe their intentions.

126 lines (117 loc) 9.24 kB
var ENV_DEVELOPMENT = require('../env/dev') var dotPropPaths = require('../dot/paths') var dotGet = require('../dot/get') var isNotNested = require('../is/notNested') var validationBuilder = require('./validatorBuilder') var validateType = function (type, value, nestedSchema) { var validator = nestedSchema || validationBuilder(type) return validator(value) } /** * @desc pass the property & schema in, get a nestable typeValidator out * @since 4.0.0-alpha.1 * @category types * @category schema * * @param {Primitive} property property name of the currently nested schema * @param {Schema | Type} nestedSchema a nested schema with Type validators, or a Type validator * @return {Function} typeValidator * * @example * * // property name here is `dates`, then `created`, then `at` * nestedSchema = { * dates: { * created: { * at: 'date' * } * } * } * * input = { * dates: { * created: { * at: new Date() * } * } * } * * input = new Date() * input = { * dates: { * mismatch: true * } * } * */ var schemaFactory = function (property, nestedSchema) { /** * @desc build a recursive schema for all around runtime type safety * @category types * @category schema * @memberOf schema * @symb 🛂 * @since 4.0.0-beta.1 * * @param {any} input the input to validate * @return {boolean} valid * * @see is * * @example * * const typeValidator = schemaFactory('eh', x => typeof x === 'string') * * var isValid = typeValidator('stringy') * //=> true * * var isValid = typeValidator(Number) * //=> false * * @example * * const isNumber = x => typeof x === 'number' * const typeValidator = schemaFactory('eh', {canada: 'number'}) * * var isValid = typeValidator({canada: 1}) * //=> true * * var isValid = typeValidator({}) * //=> false * * var isValid = typeValidator({canada: false}) * //=> false * * var isValid = typeValidator(1) * //=> false * */ function typeValidator(input) { if (isNotNested(input)) { // @@DEBUGGER return validateType(property, input, nestedSchema) } var longestPaths = dotPropPaths(false, input, true) // @@DEBUGGER for (var l = 0; l < longestPaths.length; l++) { var fullPath = longestPaths[l] || property var type = dotGet(nestedSchema, fullPath) var value = dotGet(input, fullPath.split('.')) // @@DEBUGGER if (!validateType(type, value)) { // @@DEBUGGER return false } // @@DEBUGGER } return true } /* istanbul ignore next: devs */ if (ENV_DEVELOPMENT) { typeValidator.inspect = function () { return ({property: property, nestedSchema: nestedSchema}); } typeValidator.toString = function () { return JSON.stringify(typeValidator.inspect(), null, 2); } } return typeValidator } module.exports = schemaFactory //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hQnVpbGRlci5qcyIsInNvdXJjZXMiOlsic2NoZW1hQnVpbGRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBFTlZfREVWRUxPUE1FTlQgPSByZXF1aXJlKCcuLi9lbnYvZGV2JylcbmNvbnN0IGRvdFByb3BQYXRocyA9IHJlcXVpcmUoJy4uL2RvdC9wYXRocycpXG5jb25zdCBkb3RHZXQgPSByZXF1aXJlKCcuLi9kb3QvZ2V0JylcbmNvbnN0IGlzTm90TmVzdGVkID0gcmVxdWlyZSgnLi4vaXMvbm90TmVzdGVkJylcbmNvbnN0IHZhbGlkYXRpb25CdWlsZGVyID0gcmVxdWlyZSgnLi92YWxpZGF0b3JCdWlsZGVyJylcblxuY29uc3QgdmFsaWRhdGVUeXBlID0gKHR5cGUsIHZhbHVlLCBuZXN0ZWRTY2hlbWEpID0+IHtcbiAgY29uc3QgdmFsaWRhdG9yID0gbmVzdGVkU2NoZW1hIHx8IHZhbGlkYXRpb25CdWlsZGVyKHR5cGUpXG4gIHJldHVybiB2YWxpZGF0b3IodmFsdWUpXG59XG5cbi8qKlxuICogQGRlc2MgcGFzcyB0aGUgcHJvcGVydHkgJiBzY2hlbWEgaW4sIGdldCBhIG5lc3RhYmxlIHR5cGVWYWxpZGF0b3Igb3V0XG4gKiBAc2luY2UgNC4wLjAtYWxwaGEuMVxuICogQGNhdGVnb3J5IHR5cGVzXG4gKiBAY2F0ZWdvcnkgc2NoZW1hXG4gKlxuICogQHBhcmFtIHtQcmltaXRpdmV9IHByb3BlcnR5IHByb3BlcnR5IG5hbWUgb2YgdGhlIGN1cnJlbnRseSBuZXN0ZWQgc2NoZW1hXG4gKiBAcGFyYW0ge1NjaGVtYSB8IFR5cGV9IG5lc3RlZFNjaGVtYSBhIG5lc3RlZCBzY2hlbWEgd2l0aCBUeXBlIHZhbGlkYXRvcnMsIG9yIGEgVHlwZSB2YWxpZGF0b3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0eXBlVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBwcm9wZXJ0eSBuYW1lIGhlcmUgaXMgYGRhdGVzYCwgdGhlbiBgY3JlYXRlZGAsIHRoZW4gYGF0YFxuICogbmVzdGVkU2NoZW1hID0ge1xuICogICBkYXRlczoge1xuICogICAgICBjcmVhdGVkOiB7XG4gKiAgICAgICAgIGF0OiAnZGF0ZSdcbiAqICAgICAgfVxuICogICB9XG4gKiB9XG4gKlxuICogaW5wdXQgPSB7XG4gKiAgICBkYXRlczoge1xuICogICAgICBjcmVhdGVkOiB7XG4gKiAgICAgICAgYXQ6IG5ldyBEYXRlKClcbiAqICAgICAgfVxuICogICAgfVxuICogfVxuICpcbiAqIGlucHV0ID0gbmV3IERhdGUoKVxuICogaW5wdXQgPSB7XG4gKiAgICBkYXRlczoge1xuICogICAgICBtaXNtYXRjaDogdHJ1ZVxuICogICAgfVxuICogfVxuICpcbiAqL1xuY29uc3Qgc2NoZW1hRmFjdG9yeSA9IChwcm9wZXJ0eSwgbmVzdGVkU2NoZW1hKSA9PiB7XG4gIC8qKlxuICAgKiBAZGVzYyBidWlsZCBhIHJlY3Vyc2l2ZSBzY2hlbWEgZm9yIGFsbCBhcm91bmQgcnVudGltZSB0eXBlIHNhZmV0eVxuICAgKiBAY2F0ZWdvcnkgdHlwZXNcbiAgICogQGNhdGVnb3J5IHNjaGVtYVxuICAgKiBAbWVtYmVyT2Ygc2NoZW1hXG4gICAqIEBzeW1iIPCfm4JcbiAgICogQHNpbmNlIDQuMC4wLWJldGEuMVxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9IGlucHV0IHRoZSBpbnB1dCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufSB2YWxpZFxuICAgKlxuICAgKiBAc2VlIGlzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgY29uc3QgdHlwZVZhbGlkYXRvciA9IHNjaGVtYUZhY3RvcnkoJ2VoJywgeCA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpXG4gICAqXG4gICAqICAgdmFyIGlzVmFsaWQgPSB0eXBlVmFsaWRhdG9yKCdzdHJpbmd5JylcbiAgICogICAvLz0+IHRydWVcbiAgICpcbiAgICogICB2YXIgaXNWYWxpZCA9IHR5cGVWYWxpZGF0b3IoTnVtYmVyKVxuICAgKiAgIC8vPT4gZmFsc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBpc051bWJlciA9IHggPT4gdHlwZW9mIHggPT09ICdudW1iZXInXG4gICAqICAgY29uc3QgdHlwZVZhbGlkYXRvciA9IHNjaGVtYUZhY3RvcnkoJ2VoJywge2NhbmFkYTogJ251bWJlcid9KVxuICAgKlxuICAgKiAgIHZhciBpc1ZhbGlkID0gdHlwZVZhbGlkYXRvcih7Y2FuYWRhOiAxfSlcbiAgICogICAvLz0+IHRydWVcbiAgICpcbiAgICogICB2YXIgaXNWYWxpZCA9IHR5cGVWYWxpZGF0b3Ioe30pXG4gICAqICAgLy89PiBmYWxzZVxuICAgKlxuICAgKiAgIHZhciBpc1ZhbGlkID0gdHlwZVZhbGlkYXRvcih7Y2FuYWRhOiBmYWxzZX0pXG4gICAqICAgLy89PiBmYWxzZVxuICAgKlxuICAgKiAgIHZhciBpc1ZhbGlkID0gdHlwZVZhbGlkYXRvcigxKVxuICAgKiAgIC8vPT4gZmFsc2VcbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIHR5cGVWYWxpZGF0b3IoaW5wdXQpIHtcbiAgICBpZiAoaXNOb3ROZXN0ZWQoaW5wdXQpKSB7XG4gICAgICAvLyBAQERFQlVHR0VSXG4gICAgICByZXR1cm4gdmFsaWRhdGVUeXBlKHByb3BlcnR5LCBpbnB1dCwgbmVzdGVkU2NoZW1hKVxuICAgIH1cbiAgICBsZXQgbG9uZ2VzdFBhdGhzID0gZG90UHJvcFBhdGhzKGZhbHNlLCBpbnB1dCwgdHJ1ZSlcblxuICAgIC8vIEBAREVCVUdHRVJcblxuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbG9uZ2VzdFBhdGhzLmxlbmd0aDsgbCsrKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGxvbmdlc3RQYXRoc1tsXSB8fCBwcm9wZXJ0eVxuICAgICAgY29uc3QgdHlwZSA9IGRvdEdldChuZXN0ZWRTY2hlbWEsIGZ1bGxQYXRoKVxuICAgICAgY29uc3QgdmFsdWUgPSBkb3RHZXQoaW5wdXQsIGZ1bGxQYXRoLnNwbGl0KCcuJykpXG5cbiAgICAgIC8vIEBAREVCVUdHRVJcblxuICAgICAgaWYgKCF2YWxpZGF0ZVR5cGUodHlwZSwgdmFsdWUpKSB7XG4gICAgICAgIC8vIEBAREVCVUdHRVJcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIEBAREVCVUdHRVJcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXZzICovXG4gIGlmIChFTlZfREVWRUxPUE1FTlQpIHtcbiAgICB0eXBlVmFsaWRhdG9yLmluc3BlY3QgPSAoKSA9PiAoe3Byb3BlcnR5LCBuZXN0ZWRTY2hlbWF9KVxuICAgIHR5cGVWYWxpZGF0b3IudG9TdHJpbmcgPSAoKSA9PlxuICAgICAgSlNPTi5zdHJpbmdpZnkodHlwZVZhbGlkYXRvci5pbnNwZWN0KCksIG51bGwsIDIpXG4gIH1cbiAgcmV0dXJuIHR5cGVWYWxpZGF0b3Jcbn1cbm1vZHVsZS5leHBvcnRzID0gc2NoZW1hRmFjdG9yeVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQzdDQSxHQUFLLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDNUNBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDOUNBLEdBQUssQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7O0FBRXZEQSxHQUFLLENBQUMsWUFBWSxHQUFHLFNBQUEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxBQUFHO0VBQ2xEQSxHQUFLLENBQUMsU0FBUyxHQUFHLFlBQVksSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7RUFDekQsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDO0NBQ3hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Q0RBLEdBQUssQ0FBQyxhQUFhLEdBQUcsU0FBQSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsQUFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMENoRCxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUU7SUFDNUIsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7O01BRXRCLE9BQU8sWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDO0tBQ25EO0lBQ0RDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDOzs7O0lBSW5ELEtBQUtBLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO01BQzVDRCxHQUFLLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRO01BQzVDQSxHQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO01BQzNDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7OztNQUloRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTs7UUFFOUIsT0FBTyxLQUFLO09BQ2I7OztLQUdGO0lBQ0QsT0FBTyxJQUFJO0dBQ1o7OztFQUdELElBQUksZUFBZSxFQUFFO0lBQ25CLGFBQWEsQ0FBQyxPQUFPLEdBQUcsU0FBQSxHQUFHLEFBQUcsU0FBQSxDQUFDLENBQUMsVUFBQSxRQUFRLEVBQUUsY0FBQSxZQUFZLENBQUMsQ0FBQyxHQUFBO0lBQ3hELGFBQWEsQ0FBQyxRQUFRLEdBQUcsU0FBQSxHQUFHLEFBQzFCLFNBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFBO0dBQ25EO0VBQ0QsT0FBTyxhQUFhO0NBQ3JCO0FBQ0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhOyJ9