UNPKG

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
'use strict'; 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); }