foop
Version:
interfaces that describe their intentions.
126 lines (117 loc) • 9.24 kB
JavaScript
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