react-native-onyx 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,7 +63,7 @@ The data will then be cached and stored via [`AsyncStorage`](https://github.com/
63
63
 
64
64
  We can also use `Onyx.merge()` to merge new `Object` or `Array` data in with existing data.
65
65
 
66
- For `Array` the default behavior is to concatenate new items.
66
+ For `Array` the default behavior is to replace it fully, effectively making it equivalent to set:
67
67
 
68
68
  ```javascript
69
69
  Onyx.merge(ONYXKEYS.EMPLOYEE_LIST, ['Joe']); // -> ['Joe']
@@ -77,10 +77,10 @@ Onyx.merge(ONYXKEYS.POLICY, {id: 1}); // -> {id: 1}
77
77
  Onyx.merge(ONYXKEYS.POLICY, {name: 'My Workspace'}); // -> {id: 1, name: 'My Workspace'}
78
78
  ```
79
79
 
80
- One caveat to be aware of is that `lodash/merge` [follows the behavior of jQuery's deep extend](https://github.com/lodash/lodash/issues/2872) and will not concatenate nested arrays in objects. It might seem like this code would concat these arrays, but it does not.
80
+ Arrays inside objects will be replaced fully, same as arrays not inside objects:
81
81
 
82
82
  ```javascript
83
- Onyx.merge(ONYXKEYS.POLICY, {employeeList: ['Joe']}); // -> {employeeList: ['Joe']}
83
+ Onyx.merge(ONYXKEYS.POLICY, {employeeList: ['Joe', 'Jack']}); // -> {employeeList: ['Joe', 'Jack']}
84
84
  Onyx.merge(ONYXKEYS.POLICY, {employeeList: ['Jack']}); // -> {employeeList: ['Jack']}
85
85
  ```
86
86
 
@@ -1,13 +1,13 @@
1
1
  (function webpackUniversalModuleDefinition(root, factory) {
2
2
  if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory(require("underscore"), require("expensify-common/lib/str"), require("lodash/merge"), require("lodash/get"), require("localforage"), require("react"));
3
+ module.exports = factory(require("underscore"), require("expensify-common/lib/str"), require("lodash/merge"), require("lodash/get"), require("localforage"), require("lodash/mergeWith"), require("react"));
4
4
  else if(typeof define === 'function' && define.amd)
5
- define(["underscore", "expensify-common/lib/str", "lodash/merge", "lodash/get", "localforage", "react"], factory);
5
+ define(["underscore", "expensify-common/lib/str", "lodash/merge", "lodash/get", "localforage", "lodash/mergeWith", "react"], factory);
6
6
  else if(typeof exports === 'object')
7
- exports["react-native-onyx/web"] = factory(require("underscore"), require("expensify-common/lib/str"), require("lodash/merge"), require("lodash/get"), require("localforage"), require("react"));
7
+ exports["react-native-onyx/web"] = factory(require("underscore"), require("expensify-common/lib/str"), require("lodash/merge"), require("lodash/get"), require("localforage"), require("lodash/mergeWith"), require("react"));
8
8
  else
9
- root["react-native-onyx/web"] = factory(root["underscore"], root["expensify-common/lib/str"], root["lodash/merge"], root["lodash/get"], root["localforage"], root["react"]);
10
- })(self, (__WEBPACK_EXTERNAL_MODULE_underscore__, __WEBPACK_EXTERNAL_MODULE_expensify_common_lib_str__, __WEBPACK_EXTERNAL_MODULE_lodash_merge__, __WEBPACK_EXTERNAL_MODULE_lodash_get__, __WEBPACK_EXTERNAL_MODULE_localforage__, __WEBPACK_EXTERNAL_MODULE_react__) => {
9
+ root["react-native-onyx/web"] = factory(root["underscore"], root["expensify-common/lib/str"], root["lodash/merge"], root["lodash/get"], root["localforage"], root["lodash/mergeWith"], root["react"]);
10
+ })(self, (__WEBPACK_EXTERNAL_MODULE_underscore__, __WEBPACK_EXTERNAL_MODULE_expensify_common_lib_str__, __WEBPACK_EXTERNAL_MODULE_lodash_merge__, __WEBPACK_EXTERNAL_MODULE_lodash_get__, __WEBPACK_EXTERNAL_MODULE_localforage__, __WEBPACK_EXTERNAL_MODULE_lodash_mergeWith__, __WEBPACK_EXTERNAL_MODULE_react__) => {
11
11
  return /******/ (() => { // webpackBootstrap
12
12
  /******/ var __webpack_modules__ = ({
13
13
 
@@ -496,7 +496,8 @@ var _get = _interopRequireDefault(__webpack_require__(/*! lodash/get */ "lodash/
496
496
  var _storage = _interopRequireDefault(__webpack_require__(/*! ./storage */ "./lib/storage/index.web.js"));
497
497
  var Logger = _interopRequireWildcard(__webpack_require__(/*! ./Logger */ "./lib/Logger.js"));
498
498
  var _OnyxCache = _interopRequireDefault(__webpack_require__(/*! ./OnyxCache */ "./lib/OnyxCache.js"));
499
- var _createDeferredTask = _interopRequireDefault(__webpack_require__(/*! ./createDeferredTask */ "./lib/createDeferredTask.js"));function _getRequireWildcardCache(nodeInterop) {if (typeof WeakMap !== "function") return null;var cacheBabelInterop = new WeakMap();var cacheNodeInterop = new WeakMap();return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {return nodeInterop ? cacheNodeInterop : cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj, nodeInterop) {if (!nodeInterop && obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache(nodeInterop);if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}
499
+ var _createDeferredTask = _interopRequireDefault(__webpack_require__(/*! ./createDeferredTask */ "./lib/createDeferredTask.js"));
500
+ var _mergeWithCustomized = _interopRequireDefault(__webpack_require__(/*! ./mergeWithCustomized */ "./lib/mergeWithCustomized.js"));function _getRequireWildcardCache(nodeInterop) {if (typeof WeakMap !== "function") return null;var cacheBabelInterop = new WeakMap();var cacheNodeInterop = new WeakMap();return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {return nodeInterop ? cacheNodeInterop : cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj, nodeInterop) {if (!nodeInterop && obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache(nodeInterop);if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}
500
501
 
501
502
  // Keeps track of the last connectionID that was used so we can keep incrementing it
502
503
  var lastConnectionID = 0;
@@ -1152,7 +1153,7 @@ function applyMerge(key, data) {
1152
1153
  if (_underscore.default.isObject(data) || _underscore.default.every(mergeValues, _underscore.default.isObject)) {
1153
1154
  // Object values are merged one after the other
1154
1155
  return _underscore.default.reduce(mergeValues, function (modifiedData, mergeValue) {
1155
- var newData = (0, _merge.default)({}, modifiedData, mergeValue);
1156
+ var newData = (0, _mergeWithCustomized.default)({}, modifiedData, mergeValue);
1156
1157
 
1157
1158
  // We will also delete any object keys that are undefined or null.
1158
1159
  // Deleting keys is not supported by AsyncStorage so we do it this way.
@@ -1223,7 +1224,7 @@ function initializeWithDefaultKeyStates() {
1223
1224
  then(function (pairs) {
1224
1225
  var asObject = _underscore.default.object(pairs);
1225
1226
 
1226
- var merged = (0, _merge.default)(asObject, defaultKeyStates);
1227
+ var merged = (0, _mergeWithCustomized.default)(asObject, defaultKeyStates);
1227
1228
  _OnyxCache.default.merge(merged);
1228
1229
  _underscore.default.each(merged, function (val, key) {return keyChanged(key, val);});
1229
1230
  });
@@ -1493,7 +1494,7 @@ Onyx;exports["default"] = _default;
1493
1494
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1494
1495
 
1495
1496
  var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");Object.defineProperty(exports, "__esModule", ({ value: true }));exports["default"] = void 0;var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"));var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"));var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"));var _underscore = _interopRequireDefault(__webpack_require__(/*! underscore */ "underscore"));
1496
- var _merge = _interopRequireDefault(__webpack_require__(/*! lodash/merge */ "lodash/merge"));
1497
+ var _mergeWithCustomized = _interopRequireDefault(__webpack_require__(/*! ./mergeWithCustomized */ "./lib/mergeWithCustomized.js"));
1497
1498
 
1498
1499
  var isDefined = _underscore.default.negate(_underscore.default.isUndefined);
1499
1500
 
@@ -1604,7 +1605,7 @@ OnyxCache = /*#__PURE__*/function () {
1604
1605
  * @param {Record<string, *>} data - a map of (cache) key - values
1605
1606
  */ }, { key: "merge", value: function merge(
1606
1607
  data) {var _this = this;
1607
- this.storageMap = (0, _merge.default)({}, this.storageMap, data);
1608
+ this.storageMap = (0, _mergeWithCustomized.default)({}, this.storageMap, data);
1608
1609
 
1609
1610
  var storageKeys = this.getAllKeys();
1610
1611
  var mergedKeys = _underscore.default.keys(data);
@@ -1775,6 +1776,41 @@ function createDeferredTask() {
1775
1776
 
1776
1777
  /***/ }),
1777
1778
 
1779
+ /***/ "./lib/mergeWithCustomized.js":
1780
+ /*!************************************!*\
1781
+ !*** ./lib/mergeWithCustomized.js ***!
1782
+ \************************************/
1783
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1784
+
1785
+ var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");Object.defineProperty(exports, "__esModule", ({ value: true }));exports["default"] = void 0;var _mergeWith = _interopRequireDefault(__webpack_require__(/*! lodash/mergeWith */ "lodash/mergeWith"));
1786
+
1787
+ /**
1788
+ * When merging 2 objects into onyx that contain an array, we want to completely replace the array instead of the default
1789
+ * behavior which is to merge each item by its index.
1790
+ * ie:
1791
+ * merge({a: [1]}, {a: [2,3]}):
1792
+ * - In the default implementation would produce {a:[1,3]}
1793
+ * - With this function would produce: {a: [2,3]}
1794
+ * @param {*} objValue
1795
+ * @param {*} srcValue
1796
+ * @return {*}
1797
+ */
1798
+ // eslint-disable-next-line rulesdir/prefer-early-return
1799
+ function customizerForMergeWith(objValue, srcValue) {
1800
+ // eslint-disable-next-line rulesdir/prefer-underscore-method
1801
+ if (Array.isArray(objValue)) {
1802
+ return srcValue;
1803
+ }
1804
+ }
1805
+
1806
+ function mergeWithCustomized() {for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}
1807
+ return _mergeWith.default.apply(void 0, args.concat([customizerForMergeWith]));
1808
+ }var _default =
1809
+
1810
+ mergeWithCustomized;exports["default"] = _default;
1811
+
1812
+ /***/ }),
1813
+
1778
1814
  /***/ "./lib/metrics/index.web.js":
1779
1815
  /*!**********************************!*\
1780
1816
  !*** ./lib/metrics/index.web.js ***!
@@ -1881,8 +1917,8 @@ var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/inte
1881
1917
 
1882
1918
  var _localforage = _interopRequireDefault(__webpack_require__(/*! localforage */ "localforage"));
1883
1919
  var _underscore = _interopRequireDefault(__webpack_require__(/*! underscore */ "underscore"));
1884
- var _merge = _interopRequireDefault(__webpack_require__(/*! lodash/merge */ "lodash/merge"));
1885
- var _SyncQueue = _interopRequireDefault(__webpack_require__(/*! ../../SyncQueue */ "./lib/SyncQueue.js")); /**
1920
+ var _SyncQueue = _interopRequireDefault(__webpack_require__(/*! ../../SyncQueue */ "./lib/SyncQueue.js"));
1921
+ var _mergeWithCustomized = _interopRequireDefault(__webpack_require__(/*! ../../mergeWithCustomized */ "./lib/mergeWithCustomized.js")); /**
1886
1922
  * @file
1887
1923
  * The storage provider based on localforage allows us to store most anything in its
1888
1924
  * natural form in the underlying DB without having to stringify or de-stringify it
@@ -1899,7 +1935,7 @@ var provider = {
1899
1935
  return _localforage.default.getItem(key).
1900
1936
  then(function (existingValue) {
1901
1937
  var newValue = _underscore.default.isObject(existingValue) ?
1902
- (0, _merge.default)({}, existingValue, value) :
1938
+ (0, _mergeWithCustomized.default)({}, existingValue, value) :
1903
1939
  value;
1904
1940
  return _localforage.default.setItem(key, newValue);
1905
1941
  });
@@ -3312,6 +3348,17 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_merge__;
3312
3348
 
3313
3349
  /***/ }),
3314
3350
 
3351
+ /***/ "lodash/mergeWith":
3352
+ /*!***********************************!*\
3353
+ !*** external "lodash/mergeWith" ***!
3354
+ \***********************************/
3355
+ /***/ ((module) => {
3356
+
3357
+ "use strict";
3358
+ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_mergeWith__;
3359
+
3360
+ /***/ }),
3361
+
3315
3362
  /***/ "react":
3316
3363
  /*!************************!*\
3317
3364
  !*** external "react" ***!