chain-able
Version:
interfaces that describe their intentions.
100 lines (83 loc) • 9.45 kB
JavaScript
/* eslint complexity: "OFF" */
// util
var ENV_DEVELOPMENT = require('../deps/env/dev')
var ObjectKeys = require('../deps/util/keys')
var isObj = require('../deps/is/obj')
var isArray = require('../deps/is/array')
var isUndefined = require('../deps/is/undefined')
var isFunction = require('../deps/is/undefined')
// logic
var schemaBuilder = require('../deps/validators/schemaBuilder')
var validatorBuilder = require('../deps/validators/validatorBuilder')
var SCHEMA_KEY = 'schema'
var isObjOrArray = function (x) { return (isObj(x) && !isFunction(x)) || isArray(x); }
// const meta = require('../deps/meta')
// const or = require('../deps/conditional/or')
// const and = require('../deps/conditional/and')
// const not = require('../deps/conditional/not')
// const condition = Condition(Condition.is(isFunction).and().not(isObj)).or(isArray)
// const isObjNotFn = and(not(isFunction), isObj)
// const isObjOrArray = or(isObjNotFn, isArray)
/**
* @desc handles:
* 1. recursively building nestable schemas,
* 2. creating MethodChains for all types
* 3. carrying over the inheritable properties
* 4. @modifies @injects @decorates .add(customValidators)
* @pattern decorator...builder...plugin...
* @param {Schema} obj
* @return {MethodFactory} @chainable
*/
module.exports = function schema(obj) {
var this$1 = this;
var parent = this.parent
var ref = this.entries();
var onValid = ref.onValid;
var onInvalid = ref.onInvalid;
var define = ref.define;
var getSet = ref.getSet;
var keys = ObjectKeys(obj)
for (var k = 0; k < keys.length; k++) {
var key = keys[k]
var value = obj[key]
// parent.method
// ? parent.method(key)
// :
//
var builder = this$1.newThis().name(key) // MethodChain
// @TODO: PLUCK METHOD FOR USING VALID KEYS
// @TODO:
// const entryKeys = ObjectKeys(entries)
// const entries = this.entries()
// for (let e = 0; e < entryKeys.length; e++) {
// const entryKey = entryKeys[e]
// const entry = entries[entryKey]
// builder[entryKey](entry)
// }
if (onInvalid) { builder.onInvalid(onInvalid) }
if (onValid) { builder.onValid(onValid) }
if (define) { builder.define() }
if (getSet) { builder.getSet() }
var type = value
if (isObjOrArray(value)) {
// @@DEBUGGER
// could just assign to type
var traversableValidator = schemaBuilder(key, value)
if (ENV_DEVELOPMENT) {
traversableValidator.schema = value
}
type = traversableValidator
}
// @HACK @FIXME @TODO: this should not happen,
// just when using babel and decorating not calling constructor...
// likely needs to `return this` on each?
// parent.store = parent.store || new Map()
// parent.meta = meta(parent)
if (parent.meta) {
parent.meta(SCHEMA_KEY, key, value)
}
builder.type(type).build()
}
return parent
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlcyI6WyJzY2hlbWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbXBsZXhpdHk6IFwiT0ZGXCIgKi9cblxuLy8gdXRpbFxuY29uc3QgRU5WX0RFVkVMT1BNRU5UID0gcmVxdWlyZSgnLi4vZGVwcy9lbnYvZGV2JylcbmNvbnN0IE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9kZXBzL3V0aWwva2V5cycpXG5jb25zdCBpc09iaiA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvb2JqJylcbmNvbnN0IGlzQXJyYXkgPSByZXF1aXJlKCcuLi9kZXBzL2lzL2FycmF5JylcbmNvbnN0IGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vZGVwcy9pcy91bmRlZmluZWQnKVxuY29uc3QgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvdW5kZWZpbmVkJylcbi8vIGxvZ2ljXG5jb25zdCBzY2hlbWFCdWlsZGVyID0gcmVxdWlyZSgnLi4vZGVwcy92YWxpZGF0b3JzL3NjaGVtYUJ1aWxkZXInKVxuY29uc3QgdmFsaWRhdG9yQnVpbGRlciA9IHJlcXVpcmUoJy4uL2RlcHMvdmFsaWRhdG9ycy92YWxpZGF0b3JCdWlsZGVyJylcblxuY29uc3QgU0NIRU1BX0tFWSA9ICdzY2hlbWEnXG5cbmNvbnN0IGlzT2JqT3JBcnJheSA9IHggPT4gKGlzT2JqKHgpICYmICFpc0Z1bmN0aW9uKHgpKSB8fCBpc0FycmF5KHgpXG5cbi8vIGNvbnN0IG1ldGEgPSByZXF1aXJlKCcuLi9kZXBzL21ldGEnKVxuLy8gY29uc3Qgb3IgPSByZXF1aXJlKCcuLi9kZXBzL2NvbmRpdGlvbmFsL29yJylcbi8vIGNvbnN0IGFuZCA9IHJlcXVpcmUoJy4uL2RlcHMvY29uZGl0aW9uYWwvYW5kJylcbi8vIGNvbnN0IG5vdCA9IHJlcXVpcmUoJy4uL2RlcHMvY29uZGl0aW9uYWwvbm90Jylcbi8vIGNvbnN0IGNvbmRpdGlvbiA9IENvbmRpdGlvbihDb25kaXRpb24uaXMoaXNGdW5jdGlvbikuYW5kKCkubm90KGlzT2JqKSkub3IoaXNBcnJheSlcbi8vIGNvbnN0IGlzT2JqTm90Rm4gPSBhbmQobm90KGlzRnVuY3Rpb24pLCBpc09iailcbi8vIGNvbnN0IGlzT2JqT3JBcnJheSA9IG9yKGlzT2JqTm90Rm4sIGlzQXJyYXkpXG5cbi8qKlxuICogQGRlc2MgaGFuZGxlczpcbiAqICAgICAgIDEuIHJlY3Vyc2l2ZWx5IGJ1aWxkaW5nIG5lc3RhYmxlIHNjaGVtYXMsXG4gKiAgICAgICAyLiBjcmVhdGluZyBNZXRob2RDaGFpbnMgZm9yIGFsbCB0eXBlc1xuICogICAgICAgMy4gY2Fycnlpbmcgb3ZlciB0aGUgaW5oZXJpdGFibGUgcHJvcGVydGllc1xuICogICAgICAgNC4gQG1vZGlmaWVzIEBpbmplY3RzIEBkZWNvcmF0ZXMgLmFkZChjdXN0b21WYWxpZGF0b3JzKVxuICogICAgICAgQHBhdHRlcm4gZGVjb3JhdG9yLi4uYnVpbGRlci4uLnBsdWdpbi4uLlxuICogQHBhcmFtICB7U2NoZW1hfSBvYmpcbiAqIEByZXR1cm4ge01ldGhvZEZhY3Rvcnl9IEBjaGFpbmFibGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzY2hlbWEob2JqKSB7XG4gIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50XG4gIGNvbnN0IHtvblZhbGlkLCBvbkludmFsaWQsIGRlZmluZSwgZ2V0U2V0fSA9IHRoaXMuZW50cmllcygpXG4gIGNvbnN0IGtleXMgPSBPYmplY3RLZXlzKG9iailcblxuICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2tdXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuXG4gICAgLy8gcGFyZW50Lm1ldGhvZFxuICAgIC8vICAgPyBwYXJlbnQubWV0aG9kKGtleSlcbiAgICAvLyAgIDpcbiAgICAvL1xuICAgIGxldCBidWlsZGVyID0gdGhpcy5uZXdUaGlzKCkubmFtZShrZXkpIC8vIE1ldGhvZENoYWluXG5cbiAgICAvLyBAVE9ETzogUExVQ0sgTUVUSE9EIEZPUiBVU0lORyBWQUxJRCBLRVlTXG4gICAgLy8gQFRPRE86XG4gICAgLy8gY29uc3QgZW50cnlLZXlzID0gT2JqZWN0S2V5cyhlbnRyaWVzKVxuICAgIC8vIGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKVxuICAgIC8vIGZvciAobGV0IGUgPSAwOyBlIDwgZW50cnlLZXlzLmxlbmd0aDsgZSsrKSB7XG4gICAgLy8gICBjb25zdCBlbnRyeUtleSA9IGVudHJ5S2V5c1tlXVxuICAgIC8vICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2VudHJ5S2V5XVxuICAgIC8vICAgYnVpbGRlcltlbnRyeUtleV0oZW50cnkpXG4gICAgLy8gfVxuICAgIGlmIChvbkludmFsaWQpIGJ1aWxkZXIub25JbnZhbGlkKG9uSW52YWxpZClcbiAgICBpZiAob25WYWxpZCkgYnVpbGRlci5vblZhbGlkKG9uVmFsaWQpXG4gICAgaWYgKGRlZmluZSkgYnVpbGRlci5kZWZpbmUoKVxuICAgIGlmIChnZXRTZXQpIGJ1aWxkZXIuZ2V0U2V0KClcblxuICAgIGxldCB0eXBlID0gdmFsdWVcbiAgICBpZiAoaXNPYmpPckFycmF5KHZhbHVlKSkge1xuICAgICAgLy8gQEBERUJVR0dFUlxuXG4gICAgICAvLyBjb3VsZCBqdXN0IGFzc2lnbiB0byB0eXBlXG4gICAgICBjb25zdCB0cmF2ZXJzYWJsZVZhbGlkYXRvciA9IHNjaGVtYUJ1aWxkZXIoa2V5LCB2YWx1ZSlcblxuICAgICAgaWYgKEVOVl9ERVZFTE9QTUVOVCkge1xuICAgICAgICB0cmF2ZXJzYWJsZVZhbGlkYXRvci5zY2hlbWEgPSB2YWx1ZVxuICAgICAgfVxuXG4gICAgICB0eXBlID0gdHJhdmVyc2FibGVWYWxpZGF0b3JcbiAgICB9XG5cbiAgICAvLyBASEFDSyBARklYTUUgQFRPRE86IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sXG4gICAgLy8ganVzdCB3aGVuIHVzaW5nIGJhYmVsIGFuZCBkZWNvcmF0aW5nIG5vdCBjYWxsaW5nIGNvbnN0cnVjdG9yLi4uXG4gICAgLy8gbGlrZWx5IG5lZWRzIHRvIGByZXR1cm4gdGhpc2Agb24gZWFjaD9cbiAgICAvLyBwYXJlbnQuc3RvcmUgPSBwYXJlbnQuc3RvcmUgfHwgbmV3IE1hcCgpXG4gICAgLy8gcGFyZW50Lm1ldGEgPSBtZXRhKHBhcmVudClcbiAgICBpZiAocGFyZW50Lm1ldGEpIHtcbiAgICAgIHBhcmVudC5tZXRhKFNDSEVNQV9LRVksIGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgYnVpbGRlci50eXBlKHR5cGUpLmJ1aWxkKClcbiAgfVxuXG4gIHJldHVybiBwYXJlbnRcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCIsInRoaXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7QUFHQUEsR0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDbERBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0FBQy9DQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN2Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDM0NBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0FBQ25EQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQzs7QUFFbERBLEdBQUssQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDO0FBQ2pFQSxHQUFLLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLHFDQUFxQyxDQUFDOztBQUV2RUEsR0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFROztBQUUzQkEsR0FBSyxDQUFDLFlBQVksR0FBRyxVQUFBLENBQUMsQ0FBQSxDQUFDLEFBQUcsU0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQnBFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7O0FBQUE7RUFDckNBLEdBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07RUFDMUIsQUFBSyxBQUFxQyxPQUFBLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtFQUFwRCxJQUFBLE9BQU87RUFBRSxJQUFBLFNBQVM7RUFBRSxJQUFBLE1BQU07RUFBRSxJQUFBLE1BQU0sY0FBbkMsQUFBUSxBQUFXLEFBQVEsQUFBUSxBQUFrQjtFQUMzREEsR0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDOztFQUU1QixLQUFLQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUNwQ0QsR0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25CQSxHQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7Ozs7OztJQU10QkMsR0FBRyxDQUFDLE9BQU8sR0FBR0MsTUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7Ozs7O0lBV3RDLElBQUksU0FBUyxFQUFFLEVBQUEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBQTtJQUMzQyxJQUFJLE9BQU8sRUFBRSxFQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUE7SUFDckMsSUFBSSxNQUFNLEVBQUUsRUFBQSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUE7SUFDNUIsSUFBSSxNQUFNLEVBQUUsRUFBQSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUE7O0lBRTVCRCxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUs7SUFDaEIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7Ozs7TUFJdkJELEdBQUssQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQzs7TUFFdEQsSUFBSSxlQUFlLEVBQUU7UUFDbkIsb0JBQW9CLENBQUMsTUFBTSxHQUFHLEtBQUs7T0FDcEM7O01BRUQsSUFBSSxHQUFHLG9CQUFvQjtLQUM1Qjs7Ozs7OztJQU9ELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtNQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7S0FDcEM7O0lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7R0FDM0I7O0VBRUQsT0FBTyxNQUFNO0NBQ2Q7In0=