Repository URL to install this package:
|
Version:
1.1.21 ▾
|
"use strict";
/* eslint complexity: "OFF" */
// util
const ENV_DEVELOPMENT = require("../deps/env/dev");
const ObjectKeys = require("../deps/util/keys");
const isObj = require("../deps/is/obj");
const isArray = require("../deps/is/array");
const isUndefined = require("../deps/is/undefined");
const isFunction = require("../deps/is/undefined"); // logic
const schemaBuilder = require("../deps/validators/schemaBuilder");
const validatorBuilder = require("../deps/validators/validatorBuilder");
const SCHEMA_KEY = 'schema';
const isObjOrArray = x => 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) {
const parent = this.parent;
const _entries = this.entries(),
onValid = _entries.onValid,
onInvalid = _entries.onInvalid,
define = _entries.define,
getSet = _entries.getSet;
const keys = ObjectKeys(obj);
for (let k = 0; k < keys.length; k++) {
const key = keys[k];
const value = obj[key]; // parent.method ? parent.method(key) :
let builder = this.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();
let type = value;
if (isObjOrArray(value)) {
// @@DEBUGGER
// could just assign to type
const 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;
};