react-native-onyx 1.0.1 → 1.0.4

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/API.md CHANGED
@@ -33,6 +33,9 @@ applied in the order they were called. Note: <code>Onyx.set()</code> calls do no
33
33
  <dt><a href="#mergeCollection">mergeCollection(collectionKey, collection)</a> ⇒ <code>Promise</code></dt>
34
34
  <dd><p>Merges a collection based on their keys</p>
35
35
  </dd>
36
+ <dt><a href="#update">update(data)</a></dt>
37
+ <dd><p>Insert API responses and lifecycle data into Onyx</p>
38
+ </dd>
36
39
  <dt><a href="#init">init([options])</a></dt>
37
40
  <dd><p>Initialize the store with actions and listening for storage events</p>
38
41
  </dd>
@@ -158,6 +161,17 @@ Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, {
158
161
  [`${ONYXKEYS.COLLECTION.REPORT}2`]: report2,
159
162
  });
160
163
  ```
164
+ <a name="update"></a>
165
+
166
+ ## update(data)
167
+ Insert API responses and lifecycle data into Onyx
168
+
169
+ **Kind**: global function
170
+
171
+ | Param | Type | Description |
172
+ | --- | --- | --- |
173
+ | data | <code>Array</code> | An array of objects with shape {onyxMethod: oneOf('set', 'merge'), key: string, value: *} |
174
+
161
175
  <a name="init"></a>
162
176
 
163
177
  ## init([options])
package/README.md CHANGED
@@ -17,12 +17,10 @@ Persistent storage solution wrapped in a Pub/Sub library.
17
17
 
18
18
  ## Installation
19
19
 
20
- At the moment, Onyx is not yet published to `npm`. To use in your project, reference the latest sha of the main branch directly in `package.json`
20
+ Onyx is published to [`npm`](https://www.npmjs.com/package/react-native-onyx)
21
21
 
22
- ```json
23
- "dependencies": {
24
- "react-native-onyx": "git+https://github.com/Expensify/react-native-onyx.git#ccb64c738b8bbe933b8997eb177f864e5139bd8d"
25
- }
22
+ ```shell
23
+ npm install react-native-onyx --save
26
24
  ```
27
25
 
28
26
  ## Initialization
@@ -253,6 +251,6 @@ To quickly test small changes you can directly go to `node_modules/react-native-
253
251
  To continuously work on Onyx we have to set up a task that copies content to parent project's `node_modules/react-native-onyx`:
254
252
  1. Work on Onyx feature or a fix
255
253
  2. Save files
256
- 3. Optional: run `npm build:web` (if you're working or want to test on a non react-native project)
254
+ 3. Optional: run `npm build` (if you're working or want to test on a non react-native project)
257
255
  - `npm link` would actually work outside of `react-native` and it can be used to link Onyx locally for a web only project
258
256
  4. Copy Onyx to consumer project's `node_modules/react-native-onyx`
@@ -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("localforage"), require("react"));
3
+ module.exports = factory(require("underscore"), require("expensify-common/lib/str"), require("lodash/merge"), 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", "localforage", "react"], factory);
5
+ define(["underscore", "expensify-common/lib/str", "lodash/merge", "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("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("react"));
8
8
  else
9
- root["react-native-onyx/web"] = factory(root["underscore"], root["expensify-common/lib/str"], root["lodash/merge"], 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_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["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__) => {
11
11
  return /******/ (() => { // webpackBootstrap
12
12
  /******/ var __webpack_modules__ = ({
13
13
 
@@ -492,11 +492,11 @@ 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 _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"));var _extends4 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/extends.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 _get = _interopRequireDefault(__webpack_require__(/*! lodash/get */ "lodash/get"));
495
496
  var _storage = _interopRequireDefault(__webpack_require__(/*! ./storage */ "./lib/storage/index.web.js"));
496
-
497
- var _Logger = __webpack_require__(/*! ./Logger */ "./lib/Logger.js");
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"));
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
500
 
501
501
  // Keeps track of the last connectionID that was used so we can keep incrementing it
502
502
  var lastConnectionID = 0;
@@ -550,7 +550,7 @@ function get(key) {
550
550
  _OnyxCache.default.set(key, val);
551
551
  return val;
552
552
  }).
553
- catch(function (err) {return (0, _Logger.logInfo)("Unable to get item from persistent storage. Key: " + key + " Error: " + err);});
553
+ catch(function (err) {return Logger.logInfo("Unable to get item from persistent storage. Key: " + key + " Error: " + err);});
554
554
 
555
555
  return _OnyxCache.default.captureTask(taskName, promise);
556
556
  }
@@ -699,9 +699,10 @@ function addAllSafeEvictionKeysToRecentlyAccessedList() {
699
699
  then(function (keys) {
700
700
  _underscore.default.each(evictionAllowList, function (safeEvictionKey) {
701
701
  _underscore.default.each(keys, function (key) {
702
- if (isKeyMatch(safeEvictionKey, key)) {
703
- addLastAccessedKey(key);
702
+ if (!isKeyMatch(safeEvictionKey, key)) {
703
+ return;
704
704
  }
705
+ addLastAccessedKey(key);
705
706
  });
706
707
  });
707
708
  });
@@ -749,7 +750,6 @@ function keysChanged(collectionKey, collection) {
749
750
 
750
751
  if (isSubscribedToCollectionKey) {
751
752
  if (_underscore.default.isFunction(subscriber.callback)) {
752
- // eslint-disable-next-line no-use-before-define
753
753
  var cachedCollection = getCachedCollection(collectionKey);
754
754
  _underscore.default.each(collection, function (data, dataKey) {
755
755
  subscriber.callback(cachedCollection[dataKey], dataKey);
@@ -808,29 +808,31 @@ function keyChanged(key, data) {
808
808
 
809
809
  // Find all subscribers that were added with connect() and trigger the callback or setState() with the new data
810
810
  _underscore.default.each(callbackToStateMapping, function (subscriber) {
811
- if (subscriber && isKeyMatch(subscriber.key, key)) {
812
- if (_underscore.default.isFunction(subscriber.callback)) {
813
- subscriber.callback(data, key);
814
- }
811
+ if (!subscriber || !isKeyMatch(subscriber.key, key)) {
812
+ return;
813
+ }
815
814
 
816
- if (!subscriber.withOnyxInstance) {
817
- return;
818
- }
815
+ if (_underscore.default.isFunction(subscriber.callback)) {
816
+ subscriber.callback(data, key);
817
+ }
819
818
 
820
- // Check if we are subscribing to a collection key and add this item as a collection
821
- if (isCollectionKey(subscriber.key)) {
822
- subscriber.withOnyxInstance.setState(function (prevState) {
823
- var collection = _underscore.default.clone(prevState[subscriber.statePropertyName] || {});
824
- collection[key] = data;
825
- return (0, _defineProperty2.default)({},
826
- subscriber.statePropertyName, collection);
819
+ if (!subscriber.withOnyxInstance) {
820
+ return;
821
+ }
827
822
 
828
- });
829
- } else {
830
- subscriber.withOnyxInstance.setState((0, _defineProperty2.default)({},
831
- subscriber.statePropertyName, data));
823
+ // Check if we are subscribing to a collection key and add this item as a collection
824
+ if (isCollectionKey(subscriber.key)) {
825
+ subscriber.withOnyxInstance.setState(function (prevState) {
826
+ var collection = _underscore.default.clone(prevState[subscriber.statePropertyName] || {});
827
+ collection[key] = data;
828
+ return (0, _defineProperty2.default)({},
829
+ subscriber.statePropertyName, collection);
830
+
831
+ });
832
+ } else {
833
+ subscriber.withOnyxInstance.setState((0, _defineProperty2.default)({},
834
+ subscriber.statePropertyName, data));
832
835
 
833
- }
834
836
  }
835
837
  });
836
838
  }
@@ -895,21 +897,23 @@ function connect(mapping) {
895
897
  deferredInitTask.promise.
896
898
  then(function () {
897
899
  // Check to see if this key is flagged as a safe eviction key and add it to the recentlyAccessedKeys list
898
- if (isSafeEvictionKey(mapping.key)) {
899
- // Try to free some cache whenever we connect to a safe eviction key
900
- _OnyxCache.default.removeLeastRecentlyUsedKeys();
900
+ if (!isSafeEvictionKey(mapping.key)) {
901
+ return;
902
+ }
901
903
 
902
- if (mapping.withOnyxInstance && !isCollectionKey(mapping.key)) {
903
- // All React components subscribing to a key flagged as a safe eviction
904
- // key must implement the canEvict property.
905
- if (_underscore.default.isUndefined(mapping.canEvict)) {
906
- throw new Error("Cannot subscribe to safe eviction key '" +
907
- mapping.key + "' without providing a canEvict value.");
904
+ // Try to free some cache whenever we connect to a safe eviction key
905
+ _OnyxCache.default.removeLeastRecentlyUsedKeys();
908
906
 
909
- }
907
+ if (mapping.withOnyxInstance && !isCollectionKey(mapping.key)) {
908
+ // All React components subscribing to a key flagged as a safe eviction
909
+ // key must implement the canEvict property.
910
+ if (_underscore.default.isUndefined(mapping.canEvict)) {
911
+ throw new Error("Cannot subscribe to safe eviction key '" +
912
+ mapping.key + "' without providing a canEvict value.");
910
913
 
911
- addLastAccessedKey(mapping.key);
912
914
  }
915
+
916
+ addLastAccessedKey(mapping.key);
913
917
  }
914
918
  }).
915
919
  then(getAllKeys).
@@ -996,10 +1000,10 @@ function remove(key) {
996
1000
  * @return {Promise}
997
1001
  */
998
1002
  function evictStorageAndRetry(error, onyxMethod) {for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {args[_key - 2] = arguments[_key];}
999
- (0, _Logger.logInfo)("Handled error: " + error);
1003
+ Logger.logInfo("Handled error: " + error);
1000
1004
 
1001
1005
  if (error && _str.default.startsWith(error.message, 'Failed to execute \'put\' on \'IDBObjectStore\'')) {
1002
- (0, _Logger.logAlert)('Attempted to set invalid data set in Onyx. Please ensure all data is serializable.');
1006
+ Logger.logAlert('Attempted to set invalid data set in Onyx. Please ensure all data is serializable.');
1003
1007
  throw error;
1004
1008
  }
1005
1009
 
@@ -1007,12 +1011,12 @@ function evictStorageAndRetry(error, onyxMethod) {for (var _len = arguments.leng
1007
1011
  var keyForRemoval = _underscore.default.find(recentlyAccessedKeys, function (key) {return !evictionBlocklist[key];});
1008
1012
 
1009
1013
  if (!keyForRemoval) {
1010
- (0, _Logger.logAlert)('Out of storage. But found no acceptable keys to remove.');
1014
+ Logger.logAlert('Out of storage. But found no acceptable keys to remove.');
1011
1015
  throw error;
1012
1016
  }
1013
1017
 
1014
1018
  // Remove the least recently viewed key that is not currently being accessed and retry.
1015
- (0, _Logger.logInfo)("Out of storage. Evicting least recently accessed key (" + keyForRemoval + ") and retrying.");
1019
+ Logger.logInfo("Out of storage. Evicting least recently accessed key (" + keyForRemoval + ") and retrying.");
1016
1020
  return remove(keyForRemoval).
1017
1021
  then(function () {return onyxMethod.apply(void 0, args);});
1018
1022
  }
@@ -1027,12 +1031,11 @@ function evictStorageAndRetry(error, onyxMethod) {for (var _len = arguments.leng
1027
1031
  */
1028
1032
  function set(key, value) {
1029
1033
  // Logging properties only since values could be sensitive things we don't want to log
1030
- (0, _Logger.logInfo)("set() called for key: " + key + (_underscore.default.isObject(value) ? " properties: " + _underscore.default.keys(value).join(',') : ''));
1034
+ Logger.logInfo("set() called for key: " + key + (_underscore.default.isObject(value) ? " properties: " + _underscore.default.keys(value).join(',') : ''));
1031
1035
 
1032
1036
  // eslint-disable-next-line no-use-before-define
1033
1037
  if (hasPendingMergeForKey(key)) {
1034
- // eslint-disable-next-line max-len
1035
- (0, _Logger.logAlert)("Onyx.set() called after Onyx.merge() for key: " + key + ". It is recommended to use set() or merge() not both.");
1038
+ Logger.logAlert("Onyx.set() called after Onyx.merge() for key: " + key + ". It is recommended to use set() or merge() not both.");
1036
1039
  }
1037
1040
 
1038
1041
  // Adds the key to cache when it's not available
@@ -1171,7 +1174,7 @@ function merge(key, value) {
1171
1174
 
1172
1175
  return set(key, modifiedData);
1173
1176
  } catch (error) {
1174
- (0, _Logger.logAlert)("An error occurred while applying merge for key: " + key + ", Error: " + error);
1177
+ Logger.logAlert("An error occurred while applying merge for key: " + key + ", Error: " + error);
1175
1178
  }
1176
1179
 
1177
1180
  return Promise.resolve();
@@ -1197,18 +1200,36 @@ function initializeWithDefaultKeyStates() {
1197
1200
  /**
1198
1201
  * Clear out all the data in the store
1199
1202
  *
1203
+ * Note that calling Onyx.clear() and then Onyx.set() on a key with a default
1204
+ * key state may store an unexpected value in Storage.
1205
+ *
1206
+ * E.g.
1207
+ * Onyx.clear();
1208
+ * Onyx.set(ONYXKEYS.DEFAULT_KEY, 'default');
1209
+ * Storage.getItem(ONYXKEYS.DEFAULT_KEY)
1210
+ * .then((storedValue) => console.log(storedValue));
1211
+ * null is logged instead of the expected 'default'
1212
+ *
1213
+ * Onyx.set() might call Storage.setItem() before Onyx.clear() calls
1214
+ * Storage.setItem(). Use Onyx.merge() instead if possible. Onyx.merge() calls
1215
+ * Onyx.get(key) before calling Storage.setItem() via Onyx.set().
1216
+ * Storage.setItem() from Onyx.clear() will have already finished and the merged
1217
+ * value will be saved to storage after the default value.
1218
+ *
1200
1219
  * @returns {Promise<void>}
1201
1220
  */
1202
1221
  function clear() {
1203
1222
  return getAllKeys().
1204
1223
  then(function (keys) {
1205
1224
  _underscore.default.each(keys, function (key) {
1206
- keyChanged(key, null);
1207
- _OnyxCache.default.set(key, null);
1225
+ var resetValue = (0, _get.default)(defaultKeyStates, key, null);
1226
+ _OnyxCache.default.set(key, resetValue);
1227
+
1228
+ // Optimistically inform subscribers on the next tick
1229
+ Promise.resolve().then(function () {return keyChanged(key, resetValue);});
1208
1230
  });
1209
- }).
1210
- then(_storage.default.clear).
1211
- then(initializeWithDefaultKeyStates);
1231
+ _storage.default.clear();
1232
+ });
1212
1233
  }
1213
1234
 
1214
1235
  /**
@@ -1228,10 +1249,11 @@ function clear() {
1228
1249
  function mergeCollection(collectionKey, collection) {
1229
1250
  // Confirm all the collection keys belong to the same parent
1230
1251
  _underscore.default.each(collection, function (data, dataKey) {
1231
- if (!isKeyMatch(collectionKey, dataKey)) {
1232
- // eslint-disable-next-line max-len
1233
- throw new Error("Provided collection does not have all its data belonging to the same parent. CollectionKey: " + collectionKey + ", DataKey: " + dataKey);
1252
+ if (isKeyMatch(collectionKey, dataKey)) {
1253
+ return;
1234
1254
  }
1255
+
1256
+ throw new Error("Provided collection doesn't have all its data belonging to the same parent. CollectionKey: " + collectionKey + ", DataKey: " + dataKey);
1235
1257
  });
1236
1258
 
1237
1259
  return getAllKeys().
@@ -1271,6 +1293,36 @@ function mergeCollection(collectionKey, collection) {
1271
1293
  });
1272
1294
  }
1273
1295
 
1296
+ /**
1297
+ * Insert API responses and lifecycle data into Onyx
1298
+ *
1299
+ * @param {Array} data An array of objects with shape {onyxMethod: oneOf('set', 'merge'), key: string, value: *}
1300
+ */
1301
+ function update(data) {
1302
+ // First, validate the Onyx object is in the format we expect
1303
+ _underscore.default.each(data, function (_ref4) {var onyxMethod = _ref4.onyxMethod,key = _ref4.key;
1304
+ if (!_underscore.default.contains(['set', 'merge'], onyxMethod)) {
1305
+ throw new Error("Invalid onyxMethod " + onyxMethod + " in Onyx update.");
1306
+ }
1307
+ if (!_underscore.default.isString(key)) {
1308
+ throw new Error("Invalid " + typeof key + " key provided in Onyx update. Onyx key must be of type string.");
1309
+ }
1310
+ });
1311
+
1312
+ _underscore.default.each(data, function (_ref5) {var onyxMethod = _ref5.onyxMethod,key = _ref5.key,value = _ref5.value;
1313
+ switch (onyxMethod) {
1314
+ case 'set':
1315
+ set(key, value);
1316
+ break;
1317
+ case 'merge':
1318
+ merge(key, value);
1319
+ break;
1320
+ default:
1321
+ break;}
1322
+
1323
+ });
1324
+ }
1325
+
1274
1326
  /**
1275
1327
  * Initialize the store with actions and listening for storage events
1276
1328
  *
@@ -1305,7 +1357,7 @@ function init()
1305
1357
 
1306
1358
 
1307
1359
 
1308
- {var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},_ref4$keys = _ref4.keys,keys = _ref4$keys === void 0 ? {} : _ref4$keys,_ref4$initialKeyState = _ref4.initialKeyStates,initialKeyStates = _ref4$initialKeyState === void 0 ? {} : _ref4$initialKeyState,_ref4$safeEvictionKey = _ref4.safeEvictionKeys,safeEvictionKeys = _ref4$safeEvictionKey === void 0 ? [] : _ref4$safeEvictionKey,_ref4$maxCachedKeysCo = _ref4.maxCachedKeysCount,maxCachedKeysCount = _ref4$maxCachedKeysCo === void 0 ? 1000 : _ref4$maxCachedKeysCo,_ref4$captureMetrics = _ref4.captureMetrics,captureMetrics = _ref4$captureMetrics === void 0 ? false : _ref4$captureMetrics,_ref4$shouldSyncMulti = _ref4.shouldSyncMultipleInstances,shouldSyncMultipleInstances = _ref4$shouldSyncMulti === void 0 ? Boolean(__webpack_require__.g.localStorage) : _ref4$shouldSyncMulti,_ref4$keysToDisableSy = _ref4.keysToDisableSyncEvents,keysToDisableSyncEvents = _ref4$keysToDisableSy === void 0 ? [] : _ref4$keysToDisableSy;
1360
+ {var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},_ref6$keys = _ref6.keys,keys = _ref6$keys === void 0 ? {} : _ref6$keys,_ref6$initialKeyState = _ref6.initialKeyStates,initialKeyStates = _ref6$initialKeyState === void 0 ? {} : _ref6$initialKeyState,_ref6$safeEvictionKey = _ref6.safeEvictionKeys,safeEvictionKeys = _ref6$safeEvictionKey === void 0 ? [] : _ref6$safeEvictionKey,_ref6$maxCachedKeysCo = _ref6.maxCachedKeysCount,maxCachedKeysCount = _ref6$maxCachedKeysCo === void 0 ? 1000 : _ref6$maxCachedKeysCo,_ref6$captureMetrics = _ref6.captureMetrics,captureMetrics = _ref6$captureMetrics === void 0 ? false : _ref6$captureMetrics,_ref6$shouldSyncMulti = _ref6.shouldSyncMultipleInstances,shouldSyncMultipleInstances = _ref6$shouldSyncMulti === void 0 ? Boolean(__webpack_require__.g.localStorage) : _ref6$shouldSyncMulti,_ref6$keysToDisableSy = _ref6.keysToDisableSyncEvents,keysToDisableSyncEvents = _ref6$keysToDisableSy === void 0 ? [] : _ref6$keysToDisableSy;
1309
1361
  if (captureMetrics) {
1310
1362
  // The code here is only bundled and applied when the captureMetrics is set
1311
1363
  // eslint-disable-next-line no-use-before-define
@@ -1347,9 +1399,10 @@ var Onyx = {
1347
1399
  multiSet: multiSet,
1348
1400
  merge: merge,
1349
1401
  mergeCollection: mergeCollection,
1402
+ update: update,
1350
1403
  clear: clear,
1351
1404
  init: init,
1352
- registerLogger: _Logger.registerLogger,
1405
+ registerLogger: Logger.registerLogger,
1353
1406
  addToEvictionBlockList: addToEvictionBlockList,
1354
1407
  removeFromEvictionBlockList: removeFromEvictionBlockList,
1355
1408
  isSafeEvictionKey: isSafeEvictionKey };
@@ -1374,14 +1427,18 @@ function applyDecorators() {
1374
1427
  mergeCollection = decorate.decorateWithMetrics(mergeCollection, 'Onyx:mergeCollection');
1375
1428
  getAllKeys = decorate.decorateWithMetrics(getAllKeys, 'Onyx:getAllKeys');
1376
1429
  initializeWithDefaultKeyStates = decorate.decorateWithMetrics(initializeWithDefaultKeyStates, 'Onyx:defaults');
1430
+ update = decorate.decorateWithMetrics(update, 'Onyx:update');
1377
1431
  /* eslint-enable */
1378
1432
 
1379
1433
  // Re-expose decorated methods
1434
+ /* eslint-disable rulesdir/prefer-actions-set-data */
1380
1435
  Onyx.set = set;
1381
1436
  Onyx.multiSet = multiSet;
1382
1437
  Onyx.clear = clear;
1383
1438
  Onyx.merge = merge;
1384
1439
  Onyx.mergeCollection = mergeCollection;
1440
+ Onyx.update = update;
1441
+ /* eslint-enable */
1385
1442
 
1386
1443
  // Expose stats methods on Onyx
1387
1444
  Onyx.getMetrics = decorate.getMetrics;
@@ -1402,7 +1459,6 @@ Onyx;exports["default"] = _default;
1402
1459
  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"));
1403
1460
  var _merge = _interopRequireDefault(__webpack_require__(/*! lodash/merge */ "lodash/merge"));
1404
1461
 
1405
-
1406
1462
  var isDefined = _underscore.default.negate(_underscore.default.isUndefined);
1407
1463
 
1408
1464
  /**
@@ -1572,14 +1628,16 @@ OnyxCache = /*#__PURE__*/function () {
1572
1628
  * Remove keys that don't fall into the range of recently used keys
1573
1629
  */ }, { key: "removeLeastRecentlyUsedKeys", value: function removeLeastRecentlyUsedKeys()
1574
1630
  {
1575
- if (this.recentKeys.size > this.maxRecentKeysSize) {
1576
- // Get the last N keys by doing a negative slice
1577
- var recentlyAccessed = (0, _toConsumableArray2.default)(this.recentKeys).slice(-this.maxRecentKeysSize);
1578
- var storageKeys = _underscore.default.keys(this.storageMap);
1579
- var keysToRemove = _underscore.default.difference(storageKeys, recentlyAccessed);
1580
-
1581
- _underscore.default.each(keysToRemove, this.drop);
1631
+ if (this.recentKeys.size <= this.maxRecentKeysSize) {
1632
+ return;
1582
1633
  }
1634
+
1635
+ // Get the last N keys by doing a negative slice
1636
+ var recentlyAccessed = (0, _toConsumableArray2.default)(this.recentKeys).slice(-this.maxRecentKeysSize);
1637
+ var storageKeys = _underscore.default.keys(this.storageMap);
1638
+ var keysToRemove = _underscore.default.difference(storageKeys, recentlyAccessed);
1639
+
1640
+ _underscore.default.each(keysToRemove, this.drop);
1583
1641
  }
1584
1642
 
1585
1643
  /**
@@ -1908,7 +1966,7 @@ var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
1908
1966
  var _underscore = _interopRequireDefault(__webpack_require__(/*! underscore */ "underscore"));
1909
1967
  var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"));
1910
1968
  var _str = _interopRequireDefault(__webpack_require__(/*! expensify-common/lib/str */ "expensify-common/lib/str"));
1911
- var _Onyx = _interopRequireDefault(__webpack_require__(/*! ./Onyx */ "./lib/Onyx.js"));var _jsxFileName = "/Users/andrew/Expensidev/react-native-onyx/lib/withOnyx.js";function _createSuper(Derived) {var hasNativeReflectConstruct = _isNativeReflectConstruct();return function _createSuperInternal() {var Super = (0, _getPrototypeOf2.default)(Derived),result;if (hasNativeReflectConstruct) {var NewTarget = (0, _getPrototypeOf2.default)(this).constructor;result = Reflect.construct(Super, arguments, NewTarget);} else {result = Super.apply(this, arguments);}return (0, _possibleConstructorReturn2.default)(this, result);};}function _isNativeReflectConstruct() {if (typeof Reflect === "undefined" || !Reflect.construct) return false;if (Reflect.construct.sham) return false;if (typeof Proxy === "function") return true;try {Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));return true;} catch (e) {return false;}}
1969
+ var _Onyx = _interopRequireDefault(__webpack_require__(/*! ./Onyx */ "./lib/Onyx.js"));var _jsxFileName = "/home/runner/work/react-native-onyx/react-native-onyx/lib/withOnyx.js";function _createSuper(Derived) {var hasNativeReflectConstruct = _isNativeReflectConstruct();return function _createSuperInternal() {var Super = (0, _getPrototypeOf2.default)(Derived),result;if (hasNativeReflectConstruct) {var NewTarget = (0, _getPrototypeOf2.default)(this).constructor;result = Reflect.construct(Super, arguments, NewTarget);} else {result = Super.apply(this, arguments);}return (0, _possibleConstructorReturn2.default)(this, result);};}function _isNativeReflectConstruct() {if (typeof Reflect === "undefined" || !Reflect.construct) return false;if (Reflect.construct.sham) return false;if (typeof Proxy === "function") return true;try {Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));return true;} catch (e) {return false;}}
1912
1970
 
1913
1971
  /**
1914
1972
  * Returns the display name of a component
@@ -2023,8 +2081,7 @@ function _default(mapOnyxToState) {var _this = this;
2023
2081
  var key = _str.default.result(mapping.key, _this7.props);
2024
2082
 
2025
2083
  if (!_Onyx.default.isSafeEvictionKey(key)) {
2026
- // eslint-disable-next-line max-len
2027
- throw new Error("canEvict cannot be used on key '" + key + "'. This key must explicitly be flagged as safe for removal by adding it to Onyx.init({safeEvictionKeys: []}).");
2084
+ throw new Error("canEvict can't be used on key '" + key + "'. This key must explicitly be flagged as safe for removal by adding it to Onyx.init({safeEvictionKeys: []}).");
2028
2085
  }
2029
2086
 
2030
2087
  if (canEvict) {
@@ -2048,6 +2105,7 @@ function _default(mapOnyxToState) {var _this = this;
2048
2105
  mapping, statePropertyName) {
2049
2106
  var key = _str.default.result(mapping.key, this.props);
2050
2107
 
2108
+ // eslint-disable-next-line rulesdir/prefer-onyx-connect-in-libs
2051
2109
  this.activeConnectionIDs[key] = _Onyx.default.connect((0, _extends2.default)({},
2052
2110
  mapping, {
2053
2111
  key: key,
@@ -3196,6 +3254,17 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_localforage__;
3196
3254
 
3197
3255
  /***/ }),
3198
3256
 
3257
+ /***/ "lodash/get":
3258
+ /*!*****************************!*\
3259
+ !*** external "lodash/get" ***!
3260
+ \*****************************/
3261
+ /***/ ((module) => {
3262
+
3263
+ "use strict";
3264
+ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_get__;
3265
+
3266
+ /***/ }),
3267
+
3199
3268
  /***/ "lodash/merge":
3200
3269
  /*!*******************************!*\
3201
3270
  !*** external "lodash/merge" ***!