ruddy
Version:
Modularized state-management tools for modern front-end applications. Manage dispatched messages in a clean and predictable way for either small or large scale projects
204 lines (148 loc) • 10.3 kB
JavaScript
'use strict';
exports.__esModule = true;
exports.noDucks = exports.isDux = exports.duckMiddlewareRules = exports.duxRules = exports.duxDefaults = exports.metadataEvolvers = undefined;
var _none = require('ramda/src/none');
var _none2 = _interopRequireDefault(_none);
var _complement = require('ramda/src/complement');
var _complement2 = _interopRequireDefault(_complement);
var _difference = require('ramda/src/difference');
var _difference2 = _interopRequireDefault(_difference);
var _keys = require('ramda/src/keys');
var _keys2 = _interopRequireDefault(_keys);
var _isEmpty = require('ramda/src/isEmpty');
var _isEmpty2 = _interopRequireDefault(_isEmpty);
var _allPass = require('ramda/src/allPass');
var _allPass2 = _interopRequireDefault(_allPass);
var _filter = require('ramda/src/filter');
var _filter2 = _interopRequireDefault(_filter);
var _split = require('ramda/src/split');
var _split2 = _interopRequireDefault(_split);
var _last = require('ramda/src/last');
var _last2 = _interopRequireDefault(_last);
var _map = require('ramda/src/map');
var _map2 = _interopRequireDefault(_map);
var _equals = require('ramda/src/equals');
var _equals2 = _interopRequireDefault(_equals);
var _uniq = require('ramda/src/uniq');
var _uniq2 = _interopRequireDefault(_uniq);
var _length = require('ramda/src/length');
var _length2 = _interopRequireDefault(_length);
var _toPairs = require('ramda/src/toPairs');
var _toPairs2 = _interopRequireDefault(_toPairs);
var _values = require('ramda/src/values');
var _values2 = _interopRequireDefault(_values);
var _compose = require('ramda/src/compose');
var _compose2 = _interopRequireDefault(_compose);
var _anyPass = require('ramda/src/anyPass');
var _anyPass2 = _interopRequireDefault(_anyPass);
var _all = require('ramda/src/all');
var _all2 = _interopRequireDefault(_all);
var _is = require('ramda/src/is');
var _is2 = _interopRequireDefault(_is);
var _both = require('ramda/src/both');
var _both2 = _interopRequireDefault(_both);
var _either = require('ramda/src/either');
var _either2 = _interopRequireDefault(_either);
var _identity = require('ramda/src/identity');
var _identity2 = _interopRequireDefault(_identity);
var _machines = require('../machines');
var _types = require('../types');
var _is3 = require('../util/is');
var _validators = require('../validators');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* This object of functions is meant to be applied to an object which has
* some or all of its keys sharing the same name as these evolver functions.
*
* Using [evolve()](http://ramdajs.docs/#evolve) on an object with this set of evolver functions
* will create a clone of the original object with the result of each evolver in place of the original value.
*/
var metadataEvolvers = exports.metadataEvolvers = {
namespace: _identity2.default,
store: _identity2.default,
validationLevel: _validators.makeValidationLevel,
stateMachinesPropName: _machines.getStateMachinesPropPath,
consts: _types.createConstants
/**
* These are values which will always be set for a new duck,
* even though the user may not explicitly supply a value for any of them.
*/
};var duxDefaults = exports.duxDefaults = {
consts: {},
creators: {},
machines: {},
queries: {},
workers: {},
selectors: {},
stateMachinesPropName: 'states',
types: [],
validationLevel: 'CANCEL',
validators: {}
/**
* This set of rules is expected to be supplied to the (curried) [spected](https://github.com/25th-floor/spected)
* function, and is then invoked against the set of values supplied when creating a new duck.
*
* The spected validator function will then apply this collection of validator functions against
* any matching keys on the input values passed in, and set either a value of 'true' if validation succeeded
* or an array of error messages for any value(s) that failed validation.
*/
};var duxRules = exports.duxRules = {
validationLevel: [[_validators.isValidationLevel, 'must be: STRICT, CANCEL, PRUNE, or LOG. CANCEL is the default.']],
store: [[_is3.isGoodString, 'must be a (non-blank) string']],
namespace: [[_is3.isGoodString, 'must be a (non-blank) string']],
stateMachinesPropName: [[(0, _either2.default)(_is3.isGoodString, (0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)(_is3.isGoodString))), 'must be a string (or array of strings)']],
consts: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
creators: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
machines: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
selectors: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
types: [[(0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)((0, _is2.default)(String))), 'must be an object (or a function returning an object)']],
validators: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
multipliers: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
queries: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
workers: [[(0, _either2.default)(_is3.isPlainObj, (0, _is2.default)(Function)), 'must be an object (or a function returning an object)']],
reducer: [[(0, _is2.default)(Function), 'must be a function']],
enhancers: [[(0, _anyPass2.default)([(0, _is2.default)(Function), (0, _both2.default)(_is3.isPlainObj, (0, _compose2.default)((0, _all2.default)(_is3.isSpecOrFunction), _values2.default)), (0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)(_is3.isEnhancer))]), 'must be an array of key/value pairs, an object (or a function returning one of those options)']],
effects: [[(0, _either2.default)((0, _is2.default)(Function), (0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)(_is3.isEffect))), 'must be an array of key/value pairs (or a function returning an one)']],
throttling: [[(0, _either2.default)((0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)((0, _is2.default)(Array))), (0, _is2.default)(Function)), 'must be an array of key/value pairs (or a function returning an one)']],
debouncing: [[(0, _either2.default)((0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)((0, _is2.default)(Array))), (0, _is2.default)(Function)), 'must be an array of key/value pairs (or a function returning an one)']],
initialState: [[(0, _anyPass2.default)([_is3.isPrimitiveish, _is3.isPlainObj, (0, _is2.default)(Function)]), 'must be an object, a function returning an object, or a primitive value']]
/**
* This set of rules is expected to be supplied to the (curried) [spected](https://github.com/25th-floor/spected)
* function, and is then invoked against one or more ducks supplied to the validator middleware.
*
* The spected validator function will then apply this collection of validator functions against
* any matching keys on the input values passed in, and set either a value of 'true' if validation succeeded
* or an array of error messages for any value(s) that failed validation.
*
* The validator middleware makes use of a small portion of a given duck, so the schema rules
* for validating a usable duck in the middleware function is less strict than those used to create a duck.
*/
};var duckMiddlewareRules = exports.duckMiddlewareRules = {
store: [[_is3.isGoodString, 'must be a (non-blank) string']],
namespace: [[_is3.isGoodString, 'must be a (non-blank) string']],
types: [[_is3.isPlainObj, 'must be an object'], [(0, _compose2.default)((0, _all2.default)((0, _compose2.default)((0, _equals2.default)(1), _length2.default, _uniq2.default)), (0, _map2.default)(function (_ref) {
var key = _ref[0],
val = _ref[1];
return [key, (0, _compose2.default)(_last2.default, (0, _split2.default)('/'))(val)];
}), (0, _filter2.default)((0, _all2.default)((0, _is2.default)(String))), _toPairs2.default), 'each key and value are identical']],
machines: [[(0, _compose2.default)((0, _all2.default)(_is3.isPlainObj), _values2.default), 'must be an object'], [(0, _compose2.default)((0, _all2.default)(_is3.isNotEmpty), _values2.default), 'must not be empty'], [(0, _compose2.default)((0, _all2.default)((0, _allPass2.default)([_machines.areStateNamesStrings, _machines.areInputsAndTransitionsStrings])), _values2.default), 'each machine contains nested objects (states) whose inputs and transitions are strings'], [(0, _compose2.default)((0, _all2.default)(_machines.isEachTransitionAmongMachineStates), _values2.default), 'each transition value must also be a state']],
stateMachinesPropName: [[(0, _both2.default)((0, _is2.default)(Array), (0, _all2.default)(_is3.isGoodString)), 'must be an array of strings (representing the path to the "current state" prop)']]
/**
* Checks to see if a given value is a Duck for middleware,
* which means it is a namespaced unit that contains types and validators for one or more of those types.
*
* @func
* @sig * -> Boolean
* @param {*} val A value which may or may not be a Duck instance
* @returns {Boolean} whether or not the object is an instance of a Duck
*/
};var isDux = exports.isDux = (0, _compose2.default)(_isEmpty2.default, (0, _difference2.default)(['store', 'namespace', 'validators', 'types']), _keys2.default);
/**
* Checks whether or not a given Object contains ducks
*
* @func
* @sig {k: v} -> Boolean
* @param {Object} row An Object which may contain ducks among its props
* @returns {Boolean} whether or not there are any ducks inside of a given Object
*/
var noDucks = exports.noDucks = (0, _anyPass2.default)([(0, _complement2.default)(_is3.isPlainObj), (0, _compose2.default)(_isEmpty2.default, _keys2.default), (0, _compose2.default)((0, _none2.default)(isDux), _values2.default)]);