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
163 lines (109 loc) • 6.15 kB
JavaScript
'use strict';
exports.__esModule = true;
var _pipe = require('ramda/src/pipe');
var _pipe2 = _interopRequireDefault(_pipe);
var _has = require('ramda/src/has');
var _has2 = _interopRequireDefault(_has);
var _filter = require('ramda/src/filter');
var _filter2 = _interopRequireDefault(_filter);
var _pathOr = require('ramda/src/pathOr');
var _pathOr2 = _interopRequireDefault(_pathOr);
var _map = require('ramda/src/map');
var _map2 = _interopRequireDefault(_map);
var _isEmpty = require('ramda/src/isEmpty');
var _isEmpty2 = _interopRequireDefault(_isEmpty);
var _isNil = require('ramda/src/isNil');
var _isNil2 = _interopRequireDefault(_isNil);
var _either = require('ramda/src/either');
var _either2 = _interopRequireDefault(_either);
var _reject = require('ramda/src/reject');
var _reject2 = _interopRequireDefault(_reject);
var _values = require('ramda/src/values');
var _values2 = _interopRequireDefault(_values);
var _unnest = require('ramda/src/unnest');
var _unnest2 = _interopRequireDefault(_unnest);
var _compose = require('ramda/src/compose');
var _compose2 = _interopRequireDefault(_compose);
var _curry = require('ramda/src/curry');
var _curry2 = _interopRequireDefault(_curry);
var _effects = require('./effects');
var _effects2 = _interopRequireDefault(_effects);
var _enhancers = require('./enhancers');
var _enhancers2 = _interopRequireDefault(_enhancers);
var _limiters = require('./limiters');
var _limiters2 = _interopRequireDefault(_limiters);
var _multipliers = require('./multipliers');
var _multipliers2 = _interopRequireDefault(_multipliers);
var _validators = require('./validators');
var _validators2 = _interopRequireDefault(_validators);
var _validate = require('../duck/validate');
var _create = require('../duck/create');
var _is = require('../util/is');
var _log = require('../util/log');
var _log2 = _interopRequireDefault(_log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var flattenList = (0, _curry2['default'])(function (duckPropName, row) {
return (0, _compose2['default'])((0, _reject2['default'])((0, _either2['default'])(_isNil2['default'], _isEmpty2['default'])), _unnest2['default'], _values2['default'], (0, _map2['default'])((0, _pathOr2['default'])([], [duckPropName])), (0, _filter2['default'])((0, _has2['default'])(duckPropName)))(row);
});
exports['default'] = function (row) {
var loggingEnabled = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
var validationErrors = (0, _validate.getRowValidationErrors)(row);
var logger = (0, _log2['default'])(loggingEnabled);
if (validationErrors) {
logger.error('Error validating your row of ducks', validationErrors);
throw new Error(validationErrors);
}
var getDuckMatchingAction = (0, _create.createDuckLookup)(row);
var effects = flattenList('effects', row);
var debouncing = flattenList('debouncing', row);
var throttling = flattenList('throttling', row);
var multipliers = (0, _compose2['default'])(_values2['default'], (0, _reject2['default'])((0, _either2['default'])(_isNil2['default'], _isEmpty2['default'])), (0, _map2['default'])((0, _pathOr2['default'])({}, ['multipliers'])))(row);
var curriedEnhancers = (0, _enhancers2['default'])(logger);
var curriedEffects = (0, _effects2['default'])(logger, effects);
var limitAction = (0, _limiters2['default'])(throttling, debouncing);
var curriedMultipliers = (0, _multipliers2['default'])(logger, multipliers);
var curriedValidators = (0, _validators2['default'])(logger, getDuckMatchingAction);
return function (_ref) {
var dispatch = _ref.dispatch;
var getState = _ref.getState;
var enhanceAction = curriedEnhancers(dispatch);
var validateAction = curriedValidators(getState);
var multiplyAction = curriedMultipliers(dispatch);
var handleAnyActionEffects = curriedEffects(dispatch);
return function (next) {
return function (action) {
if ((0, _is.isAction)(action)) {
limitAction(action)['catch'](function (err) {
return logger.error('There was a problem throttling or debouncing: "' + action.type + '"', err);
}).then(function (limitedAction) {
var validatedAction = validateAction(limitedAction);
return (0, _is.isAction)(validatedAction) ? validatedAction : false;
})['catch'](function (err) {
logger.error('There was a problem validating: "' + action.type + '"', err);
next(action);
}).then(function (validatedAction) {
if (validatedAction) {
var _getDuckMatchingActio = getDuckMatchingAction(validatedAction);
var _getDuckMatchingActio2 = _getDuckMatchingActio.enhancers;
var enhancers = _getDuckMatchingActio2 === undefined ? {} : _getDuckMatchingActio2;
return (0, _pipe2['default'])(multiplyAction, enhanceAction(enhancers))(validatedAction);
}
return false;
})['catch'](function (err) {
logger.error('A multiplier and/or enhancer failed for: "' + action.type + '"', err);
next(action);
}).then(function (enhancedAction) {
if ((0, _is.isAction)(enhancedAction)) {
next(enhancedAction);
handleAnyActionEffects(enhancedAction);
}
})['catch'](function (err) {
return logger.error('There was a problem executing the effect for: "' + action.type + '"', err);
});
} else {
logger.error('Looks like something was dispatched that is not a valid action:', action);
}
};
};
};
};