react-redux-fetch
Version:
A declarative and customizable way to fetch data for React components and manage that data in the Redux state
97 lines (69 loc) • 3.19 kB
JavaScript
exports.__esModule = true;
exports.ensureResourceIsObject = ensureResourceIsObject;
exports.validateResourceObject = validateResourceObject;
exports.default = buildActionsFromMappings;
var _reduce = require('lodash/fp/reduce');
var _reduce2 = _interopRequireDefault(_reduce);
var _capitalizeFirstLetter = require('./capitalizeFirstLetter');
var _capitalizeFirstLetter2 = _interopRequireDefault(_capitalizeFirstLetter);
var _container = require('../container');
var _container2 = _interopRequireDefault(_container);
var _actions = require('../actions');
var _actions2 = _interopRequireDefault(_actions);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var defaultRequestType = 'get';
var comparisonCache = {};
function requestMethodToActionKey(key) {
var requestMethod = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultRequestType;
var finalRequestMethod = requestMethod.toLowerCase();
var finalKey = key;
var requestMethodConfig = _container2.default.getDefinition('requestMethods').getArgument(finalRequestMethod);
if (!requestMethodConfig) {
throw new Error('Request method ' + finalRequestMethod + ' not registered at react-redux-fetch. Use container.registerRequestMethod().');
}
return '' + finalKey + (0, _capitalizeFirstLetter2.default)(requestMethodConfig.method);
}
function ensureResourceIsObject(mapping) {
if (typeof mapping.resource === 'string') {
return {
name: mapping.resource
};
}
return mapping.resource;
}
function validateResourceObject(resource) {
if (!resource.name) {
throw new Error('\'resource\' property is missing or invalid in react-redux-fetch mapping.\n Make sure you have {resource:\'yourResourceName\'} or {resource:{name:\'yourResourceName\'}} defined in your mapping.');
}
}
function actionFromMapping(mapping) {
var finalRequestFn = mapping.request;
var resource = ensureResourceIsObject(mapping);
validateResourceObject(resource);
var finalResourceName = resource.name;
var requestMethod = mapping.method || defaultRequestType;
var actionKey = requestMethodToActionKey(resource.action || finalResourceName, requestMethod);
var actionFn = function actionFn() {
var finalRequest = typeof finalRequestFn === 'function' ? finalRequestFn.apply(undefined, arguments) : finalRequestFn;
var action = finalRequest.force || !_container2.default.getUtil('equals')(comparisonCache[actionKey], finalRequest.comparison) ? _actions2.default.for(requestMethod).request(Object.assign({}, mapping, {
method: requestMethod,
request: finalRequest,
resource: resource
})) : null;
comparisonCache[actionKey] = finalRequest.comparison;
return action;
};
return {
name: actionKey,
fn: actionFn
};
}
function buildActionsFromMappings(mappings) {
var actionsBuilder = (0, _reduce2.default)(function (actions, mapping) {
var _Object$assign;
var action = actionFromMapping(mapping);
return Object.assign(actions, (_Object$assign = {}, _Object$assign[action.name] = action.fn, _Object$assign));
}, {});
return actionsBuilder(mappings);
}
;