attadux
Version:
Implementation of the redux-modular-ducks, forked from the extensible-duck implementation and extended to include spected validators, state machines, helpers, web workers, effect handling, action multipliers, action enhancers, action throttling/debouncing
204 lines (148 loc) • 10.6 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 _values = require('ramda/src/values');
var _values2 = _interopRequireDefault(_values);
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 _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.isStringieThingie, 'must be a (non-blank) string']],
namespace: [[_is3.isStringieThingie, 'must be a (non-blank) string']],
stateMachinesPropName: [[(0, _either2['default'])(_is3.isStringieThingie, (0, _both2['default'])((0, _is2['default'])(Array), (0, _all2['default'])(_is3.isStringieThingie))), '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)']],
enhancers: [[(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']],
effects: [[(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)']],
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.isStringieThingie, 'must be a (non-blank) string']],
namespace: [[_is3.isStringieThingie, '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];
var 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.isStringieThingie)), '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'])]);