UNPKG

redux-json-api

Version:

A bunch of Redux actions, action creators and reducers to integrate with a JSON API

649 lines (562 loc) 27 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getRelatedResources = exports.getResources = exports.getResource = exports.getResourceData = exports.getResourceTree = exports.reducer = exports.deleteRelationship = exports.addRelationship = exports.replaceRelationship = exports.readRelationship = exports.readRelated = exports.requireResource = exports.deleteResource = exports.updateResource = exports.readEndpoint = exports.createResource = exports.hydrateStore = exports.setAxiosConfig = exports.IS_UPDATING = exports.IS_DELETING = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _reduxActions = require("redux-actions"); var imm = _interopRequireWildcard(require("object-path-immutable")); var _reReselect = require("re-reselect"); var _stateMutation = require("./state-mutation"); var _utils = require("./utils"); var _constants = _interopRequireDefault(require("./constants")); var _handleActions; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var API_SET_AXIOS_CONFIG = _constants["default"].API_SET_AXIOS_CONFIG, API_HYDRATE = _constants["default"].API_HYDRATE, API_WILL_CREATE = _constants["default"].API_WILL_CREATE, API_CREATED = _constants["default"].API_CREATED, API_CREATE_FAILED = _constants["default"].API_CREATE_FAILED, API_WILL_READ = _constants["default"].API_WILL_READ, API_RELATIONSHIP_READ = _constants["default"].API_RELATIONSHIP_READ, API_READ = _constants["default"].API_READ, API_READ_FAILED = _constants["default"].API_READ_FAILED, API_WILL_UPDATE = _constants["default"].API_WILL_UPDATE, API_UPDATED = _constants["default"].API_UPDATED, API_UPDATE_FAILED = _constants["default"].API_UPDATE_FAILED, API_WILL_DELETE = _constants["default"].API_WILL_DELETE, API_DELETED = _constants["default"].API_DELETED, API_DELETE_FAILED = _constants["default"].API_DELETE_FAILED, API_RELATIONSHIP_WILL_UPDATE = _constants["default"].API_RELATIONSHIP_WILL_UPDATE, API_RELATIONSHIP_UPDATED = _constants["default"].API_RELATIONSHIP_UPDATED, API_RELATIONSHIP_UPDATE_FAILED = _constants["default"].API_RELATIONSHIP_UPDATE_FAILED, API_RELATIONSHIP_WILL_DELETE = _constants["default"].API_RELATIONSHIP_WILL_DELETE, API_RELATIONSHIP_DELETED = _constants["default"].API_RELATIONSHIP_DELETED, API_RELATIONSHIP_DELETE_FAILED = _constants["default"].API_RELATIONSHIP_DELETE_FAILED; // Resource isInvalidating values var IS_DELETING = 'IS_DELETING'; exports.IS_DELETING = IS_DELETING; var IS_UPDATING = 'IS_UPDATING'; // Action creators exports.IS_UPDATING = IS_UPDATING; var setAxiosConfig = (0, _reduxActions.createAction)(API_SET_AXIOS_CONFIG); exports.setAxiosConfig = setAxiosConfig; var hydrateStore = (0, _reduxActions.createAction)(API_HYDRATE); exports.hydrateStore = hydrateStore; var apiWillCreate = (0, _reduxActions.createAction)(API_WILL_CREATE); var apiCreated = (0, _reduxActions.createAction)(API_CREATED); var apiCreateFailed = (0, _reduxActions.createAction)(API_CREATE_FAILED); var apiWillRead = (0, _reduxActions.createAction)(API_WILL_READ); var apiRead = (0, _reduxActions.createAction)(API_READ); var apiRelationshipRead = (0, _reduxActions.createAction)(API_RELATIONSHIP_READ); var apiReadFailed = (0, _reduxActions.createAction)(API_READ_FAILED); var apiWillUpdate = (0, _reduxActions.createAction)(API_WILL_UPDATE); var apiUpdated = (0, _reduxActions.createAction)(API_UPDATED); var apiUpdateFailed = (0, _reduxActions.createAction)(API_UPDATE_FAILED); var apiWillDelete = (0, _reduxActions.createAction)(API_WILL_DELETE); var apiDeleted = (0, _reduxActions.createAction)(API_DELETED); var apiDeleteFailed = (0, _reduxActions.createAction)(API_DELETE_FAILED); var apiRelationshipWillUpdate = (0, _reduxActions.createAction)(API_RELATIONSHIP_WILL_UPDATE); var apiRelationshipUpdated = (0, _reduxActions.createAction)(API_RELATIONSHIP_UPDATED); var apiRelationshipUpdateFailed = (0, _reduxActions.createAction)(API_RELATIONSHIP_UPDATE_FAILED); var apiRelationshipWillDelete = (0, _reduxActions.createAction)(API_RELATIONSHIP_WILL_DELETE); var apiRelationshipDeleted = (0, _reduxActions.createAction)(API_RELATIONSHIP_DELETED); var apiRelationshipDeleteFailed = (0, _reduxActions.createAction)(API_RELATIONSHIP_DELETE_FAILED); var createResource = function createResource(resource) { return function (dispatch, getState) { dispatch(apiWillCreate(resource)); var axiosConfig = getState().api.endpoint.axiosConfig; var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'POST', data: JSON.stringify({ data: resource }) }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(resource.type, options).then(function (json) { dispatch(apiCreated(json)); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; dispatch(apiCreateFailed(err)); reject(err); }); }); }; }; exports.createResource = createResource; var ApiResponse = function ApiResponse(response, dispatch, nextUrl, prevUrl) { var _this = this; (0, _classCallCheck2["default"])(this, ApiResponse); (0, _defineProperty2["default"])(this, "loadNext", function () { return _this.dispatch(readEndpoint(_this.nextUrl)); }); (0, _defineProperty2["default"])(this, "loadPrev", function () { return _this.dispatch(readEndpoint(_this.prevUrl)); }); this.body = response; this.dispatch = dispatch; this.nextUrl = nextUrl; this.prevUrl = prevUrl; } /* eslint-disable */ /* eslint-enable */ ; var readEndpoint = function readEndpoint(endpoint) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$options = _ref.options, options = _ref$options === void 0 ? { indexLinks: undefined } : _ref$options; return function (dispatch, getState) { var finalEndpoint = endpoint; if ((0, _typeof2["default"])(endpoint) === 'object' && 'type' in endpoint) { finalEndpoint = "".concat(endpoint.type, "/").concat(endpoint.id); } dispatch(apiWillRead(finalEndpoint)); var axiosConfig = getState().api.endpoint.axiosConfig; return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, axiosConfig).then(function (json) { dispatch(apiRead(_objectSpread({ finalEndpoint: finalEndpoint, options: options }, json))); var nextUrl = (0, _utils.getPaginationUrl)(json, 'next', axiosConfig.baseURL); var prevUrl = (0, _utils.getPaginationUrl)(json, 'prev', axiosConfig.baseURL); resolve(new ApiResponse(json, dispatch, nextUrl, prevUrl)); })["catch"](function (error) { var err = error; err.endpoint = finalEndpoint; dispatch(apiReadFailed(err)); reject(err); }); }); }; }; exports.readEndpoint = readEndpoint; var updateResource = function updateResource(resource) { return function (dispatch, getState) { dispatch(apiWillUpdate(resource)); var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = "".concat(resource.type, "/").concat(resource.id); var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'PATCH', data: { data: resource } }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, options).then(function (json) { dispatch(apiUpdated(json)); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; dispatch(apiUpdateFailed(err)); reject(err); }); }); }; }; exports.updateResource = updateResource; var deleteResource = function deleteResource(resource) { return function (dispatch, getState) { dispatch(apiWillDelete(resource)); var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = "".concat(resource.type, "/").concat(resource.id); var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'DELETE' }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, options).then(function () { dispatch(apiDeleted(resource)); resolve(); })["catch"](function (error) { var err = error; err.resource = resource; dispatch(apiDeleteFailed(err)); reject(err); }); }); }; }; exports.deleteResource = deleteResource; var requireResource = function requireResource(resourceType) { var endpoint = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : resourceType; return function (dispatch, getState) { return new Promise(function (resolve, reject) { var _getState = getState(), api = _getState.api; if (api.hasOwnProperty(resourceType)) { resolve(); } dispatch(readEndpoint(endpoint)).then(resolve)["catch"](reject); }); }; }; exports.requireResource = requireResource; var readRelated = function readRelated(resource, relationship) { var queryString = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; return function (dispatch, getState) { var endpoint; var axiosConfig = getState().api.endpoint.axiosConfig; if ((0, _utils.hasOwnProperties)(resource, ['relationships', relationship, 'links', 'related'])) { endpoint = resource.relationships[relationship].links.related; if (axiosConfig.baseURL && endpoint.indexOf(axiosConfig.baseURL) === 0) { endpoint = endpoint.replace(axiosConfig.baseURL, ''); } } if (!endpoint) { endpoint = "".concat(resource.type, "/").concat(resource.id, "/").concat(relationship); } return dispatch(readEndpoint("".concat(endpoint).concat(queryString))); }; }; exports.readRelated = readRelated; var getRelationshipEndpoint = function getRelationshipEndpoint(resource, relationship, axiosConfig) { if ((0, _utils.hasOwnProperties)(resource, ['relationships', relationship, 'links', 'self'])) { var endpoint = resource.relationships[relationship].links.self; if (axiosConfig.baseURL && endpoint.indexOf(axiosConfig.baseURL) === 0) { endpoint = endpoint.replace(axiosConfig.baseURL, ''); } return endpoint; } return "".concat(resource.type, "/").concat(resource.id, "/relationships/").concat(relationship); }; var readRelationship = function readRelationship(resource, relationship) { var queryString = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; return function (dispatch, getState) { var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = getRelationshipEndpoint(resource, relationship, axiosConfig) + queryString; dispatch(apiWillRead(endpoint)); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, axiosConfig).then(function (json) { dispatch(apiRelationshipRead({ resource: resource, relationship: relationship, data: json })); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; err.relationship = relationship; dispatch(apiReadFailed(err)); reject(err); }); }); }; }; exports.readRelationship = readRelationship; var replaceRelationship = function replaceRelationship(resource, relationship, data) { return function (dispatch, getState) { dispatch(apiRelationshipWillUpdate({ resource: resource, relationship: relationship })); var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = getRelationshipEndpoint(resource, relationship, axiosConfig); var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'PATCH', data: { data: data } }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, options).then(function (json) { dispatch(apiRelationshipUpdated({ resource: resource, relationship: relationship, data: json })); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; err.relationship = relationship; dispatch(apiRelationshipUpdateFailed(err)); reject(err); }); }); }; }; exports.replaceRelationship = replaceRelationship; var addRelationship = function addRelationship(resource, relationship, data) { return function (dispatch, getState) { dispatch(apiRelationshipWillUpdate({ resource: resource, relationship: relationship })); var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = getRelationshipEndpoint(resource, relationship, axiosConfig); var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'POST', data: { data: data } }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, options).then(function (json) { dispatch(apiRelationshipUpdated({ resource: resource, relationship: relationship, data: json })); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; err.relationship = relationship; dispatch(apiRelationshipUpdateFailed(err)); reject(err); }); }); }; }; exports.addRelationship = addRelationship; var deleteRelationship = function deleteRelationship(resource, relationship, data) { return function (dispatch, getState) { dispatch(apiRelationshipWillDelete({ resource: resource, relationship: relationship })); var axiosConfig = getState().api.endpoint.axiosConfig; var endpoint = getRelationshipEndpoint(resource, relationship, axiosConfig); var options = _objectSpread(_objectSpread({}, axiosConfig), {}, { method: 'DELETE', data: { data: data } }); return new Promise(function (resolve, reject) { (0, _utils.apiRequest)(endpoint, options).then(function (json) { dispatch(apiRelationshipDeleted({ resource: resource, relationship: relationship, data: json })); resolve(json); })["catch"](function (error) { var err = error; err.resource = resource; err.relationship = relationship; dispatch(apiRelationshipDeleteFailed(err)); reject(err); }); }); }; }; // Reducers exports.deleteRelationship = deleteRelationship; var reducer = (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty2["default"])(_handleActions, API_SET_AXIOS_CONFIG, function (state, _ref2) { var axiosConfig = _ref2.payload; return imm.wrap(state).set(['endpoint', 'axiosConfig'], axiosConfig).value(); }), (0, _defineProperty2["default"])(_handleActions, API_HYDRATE, function (state, _ref3) { var resources = _ref3.payload; var entities = Array.isArray(resources.data) ? resources.data : [resources.data]; var newState = (0, _stateMutation.updateOrInsertResourcesIntoState)(state, entities.concat(resources.included || [])); return imm.wrap(newState).value(); }), (0, _defineProperty2["default"])(_handleActions, API_WILL_CREATE, function (state) { return imm.wrap(state).set(['isCreating'], state.isCreating + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_CREATED, function (state, _ref4) { var resources = _ref4.payload; var entities = Array.isArray(resources.data) ? resources.data : [resources.data]; var newState = (0, _stateMutation.updateOrInsertResourcesIntoState)(state, entities.concat(resources.included || [])); return imm.wrap(newState).set('isCreating', state.isCreating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_CREATE_FAILED, function (state) { return imm.wrap(state).set(['isCreating'], state.isCreating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_WILL_READ, function (state) { return imm.wrap(state).set(['isReading'], state.isReading + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_READ, function (state, _ref5) { var payload = _ref5.payload; var resources = (Array.isArray(payload.data) ? payload.data : [payload.data]).concat(payload.included || []); var newState = (0, _stateMutation.updateOrInsertResourcesIntoState)(state, resources); var finalState = (0, _stateMutation.addLinksToState)(newState, payload.links, payload.options); return imm.wrap(finalState).set('isReading', state.isReading - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_READ, function (state, _ref6) { var _ref6$payload = _ref6.payload, resource = _ref6$payload.resource, relationship = _ref6$payload.relationship, data = _ref6$payload.data; var newState = (0, _stateMutation.updateRelationship)(state, resource, relationship, data); return imm.wrap(newState).set('isReading', state.isReading - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_READ_FAILED, function (state) { return imm.wrap(state).set(['isReading'], state.isReading - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_WILL_UPDATE, function (state, _ref7) { var resource = _ref7.payload; var type = resource.type, id = resource.id; var newState = (0, _stateMutation.ensureResourceTypeInState)(state, type); return (0, _stateMutation.setIsInvalidatingForExistingResource)(newState, { type: type, id: id }, IS_UPDATING).set('isUpdating', state.isUpdating + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_UPDATED, function (state, _ref8) { var resources = _ref8.payload; var entities = Array.isArray(resources.data) ? resources.data : [resources.data]; var newState = (0, _stateMutation.updateOrInsertResourcesIntoState)(state, entities.concat(resources.included || [])); return imm.wrap(newState).set('isUpdating', state.isUpdating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_UPDATE_FAILED, function (state, _ref9) { var resource = _ref9.payload.resource; var type = resource.type, id = resource.id; return (0, _stateMutation.setIsInvalidatingForExistingResource)(state, { type: type, id: id }, IS_UPDATING).set('isUpdating', state.isUpdating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_WILL_DELETE, function (state, _ref10) { var resource = _ref10.payload; var type = resource.type, id = resource.id; return (0, _stateMutation.setIsInvalidatingForExistingResource)(state, { type: type, id: id }, IS_DELETING).set('isDeleting', state.isDeleting + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_DELETED, function (state, _ref11) { var resource = _ref11.payload; return (0, _stateMutation.removeResourceFromState)(state, resource).set('isDeleting', state.isDeleting - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_DELETE_FAILED, function (state, _ref12) { var resource = _ref12.payload.resource; var type = resource.type, id = resource.id; return (0, _stateMutation.setIsInvalidatingForExistingResource)(state, { type: type, id: id }, IS_DELETING).set('isDeleting', state.isDeleting - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_WILL_UPDATE, function (state, _ref13) { var _ref13$payload = _ref13.payload, resource = _ref13$payload.resource, relationship = _ref13$payload.relationship; var type = resource.type, id = resource.id; var newState = (0, _stateMutation.ensureRelationshipInState)(state, { type: type, id: id }, relationship); return (0, _stateMutation.setIsInvalidatingForExistingRelationship)(newState, { type: type, id: id }, relationship, IS_UPDATING).set('isUpdating', state.isUpdating + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_UPDATED, function (state, _ref14) { var _ref14$payload = _ref14.payload, resource = _ref14$payload.resource, relationship = _ref14$payload.relationship, data = _ref14$payload.data; var newState = (0, _stateMutation.updateRelationship)(state, resource, relationship, data); return imm.wrap(newState).set('isUpdating', state.isUpdating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_UPDATE_FAILED, function (state, _ref15) { var _ref15$payload = _ref15.payload, resource = _ref15$payload.resource, relationship = _ref15$payload.relationship; var type = resource.type, id = resource.id; return (0, _stateMutation.setIsInvalidatingForExistingRelationship)(state, { type: type, id: id }, relationship, IS_UPDATING).set('isUpdating', state.isUpdating - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_WILL_DELETE, function (state, _ref16) { var _ref16$payload = _ref16.payload, resource = _ref16$payload.resource, relationship = _ref16$payload.relationship; var type = resource.type, id = resource.id; var newState = (0, _stateMutation.ensureRelationshipInState)(state, { type: type, id: id }, relationship); return (0, _stateMutation.setIsInvalidatingForExistingRelationship)(newState, { type: type, id: id }, relationship, IS_DELETING).set('isDeleting', state.isDeleting + 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_DELETED, function (state, _ref17) { var _ref17$payload = _ref17.payload, resource = _ref17$payload.resource, relationship = _ref17$payload.relationship, data = _ref17$payload.data; var newState = (0, _stateMutation.updateRelationship)(state, resource, relationship, data); return imm.wrap(newState).set('isDeleting', state.isDeleting - 1).value(); }), (0, _defineProperty2["default"])(_handleActions, API_RELATIONSHIP_DELETE_FAILED, function (state, _ref18) { var _ref18$payload = _ref18.payload, resource = _ref18$payload.resource, relationship = _ref18$payload.relationship; var type = resource.type, id = resource.id; return (0, _stateMutation.setIsInvalidatingForExistingRelationship)(state, { type: type, id: id }, relationship, IS_DELETING).set('isDeleting', state.isDeleting - 1).value(); }), _handleActions), { isCreating: 0, isReading: 0, isUpdating: 0, isDeleting: 0, endpoint: { axiosConfig: {} } }); // Selectors exports.reducer = reducer; var getResourceTree = function getResourceTree(state, resourceType) { return state.api[resourceType] || { data: [] }; }; exports.getResourceTree = getResourceTree; var getResourceData = function getResourceData(state, resourceType) { var _getResourceTree; return ((_getResourceTree = getResourceTree(state, resourceType)) === null || _getResourceTree === void 0 ? void 0 : _getResourceTree.data) || []; }; // Usage getResource(state, {type: 'users, id: '1'}) or getResource(state, 'users', '1') exports.getResourceData = getResourceData; var getResource = (0, _reReselect.createCachedSelector)(function (state, identifier) { return getResourceData(state, typeof identifier === 'string' ? identifier : identifier.type); }, function (_state, identifier, id) { return id || identifier.id; }, function (resources, id) { return resources.find(function (resource) { return "".concat(resource.id) === "".concat(id); }) || null; })(function (_state, identifier, id) { return typeof identifier === 'string' ? "".concat(identifier, "/").concat(id) : "".concat(identifier.type, "/").concat(identifier.id); }); exports.getResource = getResource; var getType = function getType(identifiers) { var type = identifiers; if (Array.isArray(identifiers) && identifiers.length > 0) { var _identifiers = (0, _slicedToArray2["default"])(identifiers, 1); type = _identifiers[0].type; } return type; }; var getIdList = function getIdList(identifiers, idList) { return idList || identifiers.map(function (identifier) { return identifier.id; }); }; // Usage getResources(state, [{type: 'users', id: '1'}, {type: 'users', id: '2'}]) or getResources(state, 'users', ['1', '2']) var getResources = (0, _reReselect.createCachedSelector)(function (state, identifiers) { return getResourceData(state, getType(identifiers)); }, function (_state, identifiers, idList) { return getIdList(identifiers, idList).map(function (id) { return "".concat(id); }); }, function (resources, idList) { return resources.filter(function (resource) { return idList.includes("".concat(resource.id)); }); })(function (_state, identifiers, idList) { var type = getType(identifiers); var useIdList = getIdList(identifiers, idList); return "".concat(type, "/").concat(useIdList.join(':')); }); // Usage getRelatedResources(state, {type: 'users', id: '1'}, 'transactions') exports.getResources = getResources; var getRelatedResources = function getRelatedResources(state, identifier, relationship) { var resource = getResource(state, identifier); if (!(0, _utils.hasOwnProperties)(resource, ['relationships', relationship, 'data'])) { return null; } var relationshipData = resource.relationships[relationship].data; return Array.isArray(relationshipData) ? getResources(state, relationshipData) : getResource(state, relationshipData); }; exports.getRelatedResources = getRelatedResources;