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
161 lines (108 loc) • 5.49 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 ? arguments[1] : true;
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,
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),
enhancers = _getDuckMatchingActio.enhancers;
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);
}
};
};
};
};