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 +14 -0
- package/README.md +4 -6
- package/dist/web.development.js +140 -71
- package/dist/web.development.js.map +1 -1
- package/dist/web.min.js +1 -1
- package/dist/web.min.js.map +1 -1
- package/lib/MDTable.js +1 -1
- package/lib/Onyx.js +115 -58
- package/lib/OnyxCache.js +10 -9
- package/lib/compose.js +1 -0
- package/lib/metrics/index.native.js +7 -7
- package/lib/storage/providers/LocalForage.js +2 -2
- package/lib/withOnyx.js +2 -2
- package/package.json +16 -3
- package/web.js +2 -2
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
|
-
|
|
20
|
+
Onyx is published to [`npm`](https://www.npmjs.com/package/react-native-onyx)
|
|
21
21
|
|
|
22
|
-
```
|
|
23
|
-
|
|
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
|
|
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`
|
package/dist/web.development.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
}
|
|
811
|
+
if (!subscriber || !isKeyMatch(subscriber.key, key)) {
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
815
814
|
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
815
|
+
if (_underscore.default.isFunction(subscriber.callback)) {
|
|
816
|
+
subscriber.callback(data, key);
|
|
817
|
+
}
|
|
819
818
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
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
|
-
|
|
830
|
-
|
|
831
|
-
subscriber.statePropertyName
|
|
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
|
-
|
|
900
|
-
|
|
900
|
+
if (!isSafeEvictionKey(mapping.key)) {
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
901
903
|
|
|
902
|
-
|
|
903
|
-
|
|
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
|
-
|
|
1003
|
+
Logger.logInfo("Handled error: " + error);
|
|
1000
1004
|
|
|
1001
1005
|
if (error && _str.default.startsWith(error.message, 'Failed to execute \'put\' on \'IDBObjectStore\'')) {
|
|
1002
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1207
|
-
_OnyxCache.default.set(key,
|
|
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
|
-
|
|
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 (
|
|
1232
|
-
|
|
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
|
|
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:
|
|
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
|
|
1576
|
-
|
|
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 = "/
|
|
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
|
-
|
|
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" ***!
|