UNPKG

class-o-mat

Version:

ALPHA VERSION ONLY: class-o-mats will help to create getter-setter functionality with validations that can be attached to a container class for easier coding. Some basic validations are included. class-o-mats also has the ability to store params as bloc

348 lines (276 loc) 10.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _dec, _class, _class2, _temp; var _bunyan = require('bunyan'); var _bunyan2 = _interopRequireDefault(_bunyan); var _mixinDecorator = require('mixin-decorator'); var _mixinDecorator2 = _interopRequireDefault(_mixinDecorator); var _lodash = require('lodash.clonedeep'); var _lodash2 = _interopRequireDefault(_lodash); var _types = require('../constants/types'); var _accessorMethods2 = require('./_accessor-methods'); var _accessorMethods3 = _interopRequireDefault(_accessorMethods2); var _eventMethodsOMat = require('./_event-methods-o-mat'); var _eventMethodsOMat2 = _interopRequireDefault(_eventMethodsOMat); var _apiMethodsOMat = require('./_api-methods-o-mat'); var _apiMethodsOMat2 = _interopRequireDefault(_apiMethodsOMat); var _fieldFunctions = require('../methods/field-functions'); var _classOMatFieldFunctions = require('./class-o-mat-field-functions'); var _fieldValidatorOMat = require('./field-validator-o-mat'); var _fieldValidatorOMat2 = _interopRequireDefault(_fieldValidatorOMat); var _fieldReducerOMat = require('./field-reducer-o-mat'); var _fieldReducerOMat2 = _interopRequireDefault(_fieldReducerOMat); var _fieldActionOMat = require('./field-action-o-mat'); var _fieldActionOMat2 = _interopRequireDefault(_fieldActionOMat); var _stack = require('../prototype/stack'); var _stack2 = _interopRequireDefault(_stack); var _queue = require('../prototype/queue'); var _queue2 = _interopRequireDefault(_queue); var _buildField = require('../methods/build-field'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var log = _bunyan2.default.createLogger({ name: "FieldOMat" }); var lb = function lb(db) { if (db === false) return; }; /** * Class Field creates a specification for a single function to be * added to the class to be constructed. * This will decide what function name will get or set the field, * what type of getter or setter and any reducers, actions or validations. */ var FieldOMat = (_dec = (0, _mixinDecorator2.default)(_accessorMethods3.default, _eventMethodsOMat2.default, _apiMethodsOMat2.default), _dec(_class = (_temp = _class2 = function () { function FieldOMat() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _types.NONE; _classCallCheck(this, FieldOMat); this.TYPE = _types.FIELD_O_MAT; this.cacheValidators = false; this._params = params === _types.NONE ? { abstract: false, actionOMats: [], reducerOMats: [], fallback: _types.NONE, upKey: '$', _default: null, accessorGetter: _fieldFunctions.getterSetter, isStack: false, isQueue: false, paramKeyPrefix: '___', validator: _types.NONE, validatorOMats: [], isRequired: false, ON_GET: _types.NONE, ON_SET: _types.NONE, ON_DELETE: _types.NONE, protected: false } : params; } _createClass(FieldOMat, [{ key: 'init', value: function init(parent, key) { var initParams = { parent: parent, key: key, internalKey: key }; var params = this._params; this._params = _extends({}, params, initParams); var validatorOMats = params.validatorOMats, actionOMats = params.actionOMats, reducerOMats = params.reducerOMats; validatorOMats.forEach(function (validatorOMat) { return validatorOMat.connect(fieldOMat); }); return this; } /** * finish with this field and return to the ClassOMat * @return {ClassOMat} */ }, { key: '$', value: function $() { return this._params.parent; } }, { key: 'abstract', value: function abstract() { this._params.abstract = true; return this; } }, { key: 'notAbstract', value: function notAbstract() { this._params.abstract = false; return this; } }, { key: 'protected', value: function _protected() { this._params.protected = true; return this; } }, { key: 'accessorGetter', value: function accessorGetter() { for (var _len = arguments.length, p = Array(_len), _key = 0; _key < _len; _key++) { p[_key] = arguments[_key]; } return _classOMatFieldFunctions.getterSetter.apply(undefined, [this, 'accessorGetter'].concat(p)); } /** * CALLED FROM THE PARENT PARAMETER SET. * This will add the function specified by this FieldOMat * to the Class that will be created. * @param {Class} BaseClass * @return {Class} BaseClass with the new field added. */ }, { key: 'addToClassMixins', value: function addToClassMixins(mixins) { var paramObjectKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_params'; var _paramKeyPrefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _types.NONE; var workingParams = _extends({ paramObjectKey: paramObjectKey }, this._params); this.default((0, _buildField.adjustDefault)(this._params)); var thisAccessorMethod = (0, _buildField.build)(workingParams); var key = this._params.key; if (Array.isArray(thisAccessorMethod) === true) { mixins[key] = thisAccessorMethod[0]; mixins['___' + key] = thisAccessorMethod[1]; this._params.key = '___' + key; } else { mixins[key] = thisAccessorMethod; } return mixins; } }, { key: 'addChild', value: function addChild(classOMat) { return this.$().addChild(classOMat); } // FIELD FACTORY DEFINITION /** * get a clone of this field as a new field in the same classOMat * The new clone will be a sibling of the original FieldOMat in the param * @param {string} key the key of the new clone * @return {FieldOMat} The new clone */ }, { key: 'again', value: function again(key) { var nextField = this.$().field(key); var _params = this._params, onSet = _params.onSet, _default = _params._default, accessorGetter = _params.accessorGetter, isStack = _params.isStack, isQueue = _params.isQueue, paramObjectKey = _params.paramObjectKey, validator = _params.validator; nextField.params({ onSet: onSet, _default: _default, accessorGetter: accessorGetter, isStack: isStack, isQueue: isQueue, paramObjectKey: paramObjectKey, validator: validator }, true); return nextField; } }, { key: 'default', value: function _default() { for (var _len2 = arguments.length, p = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { p[_key2] = arguments[_key2]; } return _classOMatFieldFunctions.getterSetter.apply(undefined, [this, '_default'].concat(p)); } }, { key: 'deleteField', value: function deleteField(key) { return this.$().field(key); } }, { key: 'fallback', value: function fallback() { for (var _len3 = arguments.length, p = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { p[_key3] = arguments[_key3]; } return _classOMatFieldFunctions.getterSetter.apply(undefined, [this, 'fallback'].concat(p)); } }, { key: 'field', value: function field(key) { return this.$().field(key); } }, { key: 'internalKey', value: function internalKey() { var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _types.NONE; if (key === _types.NONE) { return this._params.internalKey === _types.NONE ? this._params.key : this._params.internalKey; } this._params.internalKey = key; return this; } }, { key: 'required', value: function required() { this._params.isRequired = true; return this; } // THE GETTER AND SETTER FUNCTIONS TO BE SELECTED FROM FOR THIS FIELD // are in the _AccessorsOMat parent class /** * returns a FieldActionOMat to create reducers for this field. * @return {FieldActionOMat} */ }, { key: 'action', value: function action() { return new _fieldActionOMat2.default(this); } /** * returns a FieldReducerOMat to create reducers for this field. * @return {FieldReducerOMat} */ }, { key: 'reducer', value: function reducer() { return new _fieldReducerOMat2.default(this); } /** * sets the validator for this FieldOMat * @param {Class} ValidatorOMat subclass of FieldValidatorOMat * @return {FieldOMat} this */ }, { key: 'validate', value: function validate() { var ValidatorOMat = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _fieldValidatorOMat2.default; return new ValidatorOMat(this, this.key(), this.cacheValidators); } }, { key: '_acceptAction', value: function _acceptAction(actionOMat) { this._params.actionOMats.push(actionOMat); } }, { key: '_acceptReducer', value: function _acceptReducer(reducerOMat) { this._params.reducerOMats.push(reducerOMat); } }, { key: '_acceptValidator', value: function _acceptValidator(validator) { var validatorOMat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _types.NONE; this._params.validator = validator; this._params.validatorOMat = validatorOMat; return this; } }]); return FieldOMat; }(), _class2.TYPE = _types.FIELD_O_MAT, _temp)) || _class); exports.default = FieldOMat; //# sourceMappingURL=field-o-mat.js.map