redux-toolkit-optimistic
Version:
Helper library for Redux Toolkit to perform optimistic updates.
134 lines (124 loc) • 12.6 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["ReduxToolkitOptimistic"] = factory();
else
root["ReduxToolkitOptimistic"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/@babel/runtime/helpers/typeof.js":
/*!*******************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/typeof.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/./node_modules/@babel/runtime/helpers/typeof.js?");
/***/ }),
/***/ "./src/index.js":
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*! exports provided: performOptimisticUpdate, performManyOptimisticUpdates, revertOptimisticUpdate, revertManyOptimisticUpdates */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"performOptimisticUpdate\", function() { return performOptimisticUpdate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"performManyOptimisticUpdates\", function() { return performManyOptimisticUpdates; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"revertOptimisticUpdate\", function() { return revertOptimisticUpdate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"revertManyOptimisticUpdates\", function() { return revertManyOptimisticUpdates; });\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {{ id: string, changes: object}} update The update object\n */\nfunction performOptimisticUpdate(state, adapter, update) {\n var incorrectUpdateArgError = new Error('Incorrect `update` arg sent to `performOptimisticUpdate`. Expected: { id: <string>, changes: <object> }');\n\n if (!update || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(update) !== 'object') {\n throw incorrectUpdateArgError;\n }\n\n var id = update.id,\n changes = update.changes;\n\n if (typeof id !== 'string' || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(changes) !== 'object') {\n throw incorrectUpdateArgError;\n } // Store the previous data to handle rejection of optimistic update\n\n\n state.entities[id].previousChanges = Object.keys(changes).reduce(function (acc, key) {\n acc[key] = state.entities[id][key];\n return acc;\n }, {});\n adapter.updateOne(state, update);\n}\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {{ id: string, changes: object}[]} update The update object\n */\n\nfunction performManyOptimisticUpdates(state, adapter, update) {\n var incorrectUpdateArgError = new Error('Incorrect `update` arg sent to `performManyOptimisticUpdates`. Expected: [{ id: <string>, changes: <object> }, ...]');\n\n if (!update || !Array.isArray(update)) {\n throw incorrectUpdateArgError;\n } // Store the previous data to handle rejection of optimistic updates\n\n\n var _iterator = _createForOfIteratorHelper(update),\n _step;\n\n try {\n var _loop = function _loop() {\n var entity = _step.value;\n\n if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(entity) !== 'object' || typeof entity.id !== 'string' || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(entity.changes) !== 'object') {\n throw incorrectUpdateArgError;\n }\n\n var id = entity.id,\n changes = entity.changes;\n state.entities[id].previousChanges = Object.keys(changes).reduce(function (acc, key) {\n acc[key] = state.entities[id][key];\n return acc;\n }, {});\n };\n\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n _loop();\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n adapter.updateMany(state, update);\n}\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {string} id The ID of the entity to revert to its prior state\n */\n\nfunction revertOptimisticUpdate(state, adapter, id) {\n var _state$entities$id;\n\n if (typeof id !== 'string') {\n throw new Error('Incorrect `id` arg sent to `revertOptimisticUpdate`. Expected: <string>');\n }\n\n var previousChanges = state === null || state === void 0 ? void 0 : (_state$entities$id = state.entities[id]) === null || _state$entities$id === void 0 ? void 0 : _state$entities$id.previousChanges;\n if (!previousChanges) return;\n adapter.updateOne(state, {\n id: id,\n changes: previousChanges\n });\n}\n/**\n * Redux toolkit helper function that reverts multiple optimistic updates\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {string[]} ids The list of IDs to revert to prior state\n */\n\nfunction revertManyOptimisticUpdates(state, adapter, ids) {\n if (!Array.isArray(ids)) {\n throw new Error('Incorrect `ids` arg sent to `revertManyOptimisticUpdates`. Expected: [<string>]');\n }\n\n var update = ids.map(function (id) {\n var _state$entities$id2;\n\n var changes = state === null || state === void 0 ? void 0 : (_state$entities$id2 = state.entities[id]) === null || _state$entities$id2 === void 0 ? void 0 : _state$entities$id2.previousChanges;\n if (!changes) return null;\n return {\n id: id,\n changes: changes\n };\n }).filter(Boolean);\n if (!update.length) return;\n adapter.updateMany(state, update);\n}\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/./src/index.js?");
/***/ }),
/***/ 0:
/*!*************************!*\
!*** multi ./src/index ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__(/*! ./src/index */\"./src/index.js\");\n\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/multi_./src/index?");
/***/ })
/******/ });
});