react-native-onyx 1.0.15 → 1.0.16

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 concatenate 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 NOT be concatenated and instead 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/mergeWith"), require("lodash/get"), require("localforage"), 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/mergeWith", "lodash/get", "localforage", "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/mergeWith"), require("lodash/get"), require("localforage"), 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/mergeWith"], 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_mergeWith__, __WEBPACK_EXTERNAL_MODULE_lodash_get__, __WEBPACK_EXTERNAL_MODULE_localforage__, __WEBPACK_EXTERNAL_MODULE_react__) => {
11
11
  return /******/ (() => { // webpackBootstrap
12
12
  /******/ var __webpack_modules__ = ({
13
13
 
@@ -492,11 +492,13 @@ function logInfo(message) {
492
492
  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 _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"));var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"));var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/extends.js"));var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"));var _underscore = _interopRequireDefault(__webpack_require__(/*! underscore */ "underscore"));
493
493
  var _str = _interopRequireDefault(__webpack_require__(/*! expensify-common/lib/str */ "expensify-common/lib/str"));
494
494
  var _merge = _interopRequireDefault(__webpack_require__(/*! lodash/merge */ "lodash/merge"));
495
+ var _mergeWith = _interopRequireDefault(__webpack_require__(/*! lodash/mergeWith */ "lodash/mergeWith"));
495
496
  var _get = _interopRequireDefault(__webpack_require__(/*! lodash/get */ "lodash/get"));
496
497
  var _storage = _interopRequireDefault(__webpack_require__(/*! ./storage */ "./lib/storage/index.web.js"));
497
498
  var Logger = _interopRequireWildcard(__webpack_require__(/*! ./Logger */ "./lib/Logger.js"));
498
499
  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;}
500
+ var _createDeferredTask = _interopRequireDefault(__webpack_require__(/*! ./createDeferredTask */ "./lib/createDeferredTask.js"));
501
+ var _customizerForMergeWith = _interopRequireDefault(__webpack_require__(/*! ./customizerForMergeWith */ "./lib/customizerForMergeWith.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
502
 
501
503
  // Keeps track of the last connectionID that was used so we can keep incrementing it
502
504
  var lastConnectionID = 0;
@@ -1152,7 +1154,7 @@ function applyMerge(key, data) {
1152
1154
  if (_underscore.default.isObject(data) || _underscore.default.every(mergeValues, _underscore.default.isObject)) {
1153
1155
  // Object values are merged one after the other
1154
1156
  return _underscore.default.reduce(mergeValues, function (modifiedData, mergeValue) {
1155
- var newData = (0, _merge.default)({}, modifiedData, mergeValue);
1157
+ var newData = (0, _mergeWith.default)({}, modifiedData, mergeValue, _customizerForMergeWith.default);
1156
1158
 
1157
1159
  // We will also delete any object keys that are undefined or null.
1158
1160
  // Deleting keys is not supported by AsyncStorage so we do it this way.
@@ -1223,7 +1225,7 @@ function initializeWithDefaultKeyStates() {
1223
1225
  then(function (pairs) {
1224
1226
  var asObject = _underscore.default.object(pairs);
1225
1227
 
1226
- var merged = (0, _merge.default)(asObject, defaultKeyStates);
1228
+ var merged = (0, _mergeWith.default)(asObject, defaultKeyStates, _customizerForMergeWith.default);
1227
1229
  _OnyxCache.default.merge(merged);
1228
1230
  _underscore.default.each(merged, function (val, key) {return keyChanged(key, val);});
1229
1231
  });
@@ -1493,7 +1495,8 @@ Onyx;exports["default"] = _default;
1493
1495
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1494
1496
 
1495
1497
  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"));
1498
+ var _mergeWith = _interopRequireDefault(__webpack_require__(/*! lodash/mergeWith */ "lodash/mergeWith"));
1499
+ var _customizerForMergeWith = _interopRequireDefault(__webpack_require__(/*! ./customizerForMergeWith */ "./lib/customizerForMergeWith.js"));
1497
1500
 
1498
1501
  var isDefined = _underscore.default.negate(_underscore.default.isUndefined);
1499
1502
 
@@ -1604,7 +1607,7 @@ OnyxCache = /*#__PURE__*/function () {
1604
1607
  * @param {Record<string, *>} data - a map of (cache) key - values
1605
1608
  */ }, { key: "merge", value: function merge(
1606
1609
  data) {var _this = this;
1607
- this.storageMap = (0, _merge.default)({}, this.storageMap, data);
1610
+ this.storageMap = (0, _mergeWith.default)({}, this.storageMap, data, _customizerForMergeWith.default);
1608
1611
 
1609
1612
  var storageKeys = this.getAllKeys();
1610
1613
  var mergedKeys = _underscore.default.keys(data);
@@ -1775,6 +1778,36 @@ function createDeferredTask() {
1775
1778
 
1776
1779
  /***/ }),
1777
1780
 
1781
+ /***/ "./lib/customizerForMergeWith.js":
1782
+ /*!***************************************!*\
1783
+ !*** ./lib/customizerForMergeWith.js ***!
1784
+ \***************************************/
1785
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1786
+
1787
+ 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 _underscore = _interopRequireDefault(__webpack_require__(/*! underscore */ "underscore"));
1788
+
1789
+ /**
1790
+ * When merging 2 objects into onyx that contain an array, we want to completely replace the array instead of the default
1791
+ * behavior which is to merge each item by its index.
1792
+ * ie:
1793
+ * merge({a: [1]}, {a: [2,3]}):
1794
+ * - In the default implementation would produce {a:[1,3]}
1795
+ * - With this function would produce: {a: [2,3]}
1796
+ * @param {*} objValue
1797
+ * @param {*} srcValue
1798
+ * @return {*}
1799
+ */
1800
+ // eslint-disable-next-line rulesdir/prefer-early-return
1801
+ function customizerForMergeWith(objValue, srcValue) {
1802
+ if (_underscore.default.isArray(objValue)) {
1803
+ return srcValue;
1804
+ }
1805
+ }var _default =
1806
+
1807
+ customizerForMergeWith;exports["default"] = _default;
1808
+
1809
+ /***/ }),
1810
+
1778
1811
  /***/ "./lib/metrics/index.web.js":
1779
1812
  /*!**********************************!*\
1780
1813
  !*** ./lib/metrics/index.web.js ***!
@@ -1881,8 +1914,9 @@ var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/inte
1881
1914
 
1882
1915
  var _localforage = _interopRequireDefault(__webpack_require__(/*! localforage */ "localforage"));
1883
1916
  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")); /**
1917
+ var _mergeWith = _interopRequireDefault(__webpack_require__(/*! lodash/mergeWith */ "lodash/mergeWith"));
1918
+ var _SyncQueue = _interopRequireDefault(__webpack_require__(/*! ../../SyncQueue */ "./lib/SyncQueue.js"));
1919
+ var _customizerForMergeWith = _interopRequireDefault(__webpack_require__(/*! ../../customizerForMergeWith */ "./lib/customizerForMergeWith.js")); /**
1886
1920
  * @file
1887
1921
  * The storage provider based on localforage allows us to store most anything in its
1888
1922
  * natural form in the underlying DB without having to stringify or de-stringify it
@@ -1899,7 +1933,7 @@ var provider = {
1899
1933
  return _localforage.default.getItem(key).
1900
1934
  then(function (existingValue) {
1901
1935
  var newValue = _underscore.default.isObject(existingValue) ?
1902
- (0, _merge.default)({}, existingValue, value) :
1936
+ (0, _mergeWith.default)({}, existingValue, value, _customizerForMergeWith.default) :
1903
1937
  value;
1904
1938
  return _localforage.default.setItem(key, newValue);
1905
1939
  });
@@ -3312,6 +3346,17 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_merge__;
3312
3346
 
3313
3347
  /***/ }),
3314
3348
 
3349
+ /***/ "lodash/mergeWith":
3350
+ /*!***********************************!*\
3351
+ !*** external "lodash/mergeWith" ***!
3352
+ \***********************************/
3353
+ /***/ ((module) => {
3354
+
3355
+ "use strict";
3356
+ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_mergeWith__;
3357
+
3358
+ /***/ }),
3359
+
3315
3360
  /***/ "react":
3316
3361
  /*!************************!*\
3317
3362
  !*** external "react" ***!