relay-runtime 11.0.0 → 13.0.0-rc.0
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/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
- package/handlers/connection/ConnectionHandler.js.flow +8 -10
- package/handlers/connection/MutationHandlers.js.flow +31 -7
- package/index.js +1 -1
- package/index.js.flow +60 -36
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +8 -8
- package/lib/handlers/connection/MutationHandlers.js +61 -5
- package/lib/index.js +58 -43
- package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +152 -0
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +419 -0
- package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
- package/lib/multi-actor-environment/index.js +21 -0
- package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
- package/lib/mutations/RelayRecordProxy.js +3 -2
- package/lib/mutations/RelayRecordSourceMutator.js +3 -2
- package/lib/mutations/RelayRecordSourceProxy.js +12 -4
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -5
- package/lib/mutations/applyOptimisticMutation.js +6 -6
- package/lib/mutations/commitMutation.js +14 -10
- package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
- package/lib/mutations/validateMutation.js +12 -5
- package/lib/network/ConvertToExecuteFunction.js +2 -1
- package/lib/network/RelayNetwork.js +3 -2
- package/lib/network/RelayQueryResponseCache.js +21 -4
- package/lib/network/wrapNetworkWithLogObserver.js +79 -0
- package/lib/query/GraphQLTag.js +3 -2
- package/lib/query/fetchQuery.js +6 -5
- package/lib/query/fetchQueryInternal.js +1 -1
- package/lib/query/fetchQuery_DEPRECATED.js +2 -1
- package/lib/store/ClientID.js +7 -1
- package/lib/store/DataChecker.js +141 -60
- package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +532 -195
- package/lib/store/RelayConcreteVariables.js +24 -4
- package/lib/store/RelayModernEnvironment.js +175 -234
- package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
- package/lib/store/RelayModernOperationDescriptor.js +2 -1
- package/lib/store/RelayModernRecord.js +47 -12
- package/lib/store/RelayModernSelector.js +14 -8
- package/lib/store/RelayModernStore.js +58 -29
- package/lib/store/RelayOperationTracker.js +34 -24
- package/lib/store/RelayPublishQueue.js +41 -13
- package/lib/store/RelayReader.js +287 -46
- package/lib/store/RelayRecordSource.js +87 -3
- package/lib/store/RelayReferenceMarker.js +55 -31
- package/lib/store/RelayResponseNormalizer.js +250 -108
- package/lib/store/RelayStoreReactFlightUtils.js +8 -12
- package/lib/store/RelayStoreSubscriptions.js +14 -9
- package/lib/store/RelayStoreUtils.js +11 -5
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +61 -0
- package/lib/store/cloneRelayHandleSourceField.js +5 -4
- package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
- package/lib/store/createRelayContext.js +4 -2
- package/lib/store/defaultGetDataID.js +3 -1
- package/lib/store/readInlineData.js +6 -2
- package/lib/subscription/requestSubscription.js +35 -9
- package/lib/util/RelayConcreteNode.js +4 -0
- package/lib/util/RelayFeatureFlags.js +11 -4
- package/lib/util/RelayProfiler.js +17 -187
- package/lib/util/RelayReplaySubject.js +22 -7
- package/lib/util/RelayRuntimeTypes.js +0 -6
- package/lib/util/StringInterner.js +71 -0
- package/lib/util/deepFreeze.js +1 -0
- package/lib/util/getFragmentIdentifier.js +15 -7
- package/lib/util/getOperation.js +2 -1
- package/lib/util/getPaginationMetadata.js +41 -0
- package/lib/util/getPaginationVariables.js +66 -0
- package/lib/util/getPendingOperationsForFragment.js +55 -0
- package/lib/util/getRefetchMetadata.js +36 -0
- package/lib/util/getRelayHandleKey.js +2 -2
- package/lib/util/getRequestIdentifier.js +2 -2
- package/lib/util/getValueAtPath.js +51 -0
- package/lib/util/isEmptyObject.js +1 -1
- package/lib/util/registerEnvironmentWithDevTools.js +26 -0
- package/lib/util/withDuration.js +31 -0
- package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +225 -0
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +506 -0
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +261 -0
- package/multi-actor-environment/index.js.flow +26 -0
- package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
- package/mutations/RelayRecordProxy.js.flow +4 -5
- package/mutations/RelayRecordSourceMutator.js.flow +4 -6
- package/mutations/RelayRecordSourceProxy.js.flow +19 -10
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +22 -7
- package/mutations/applyOptimisticMutation.js.flow +13 -14
- package/mutations/commitLocalUpdate.js.flow +1 -1
- package/mutations/commitMutation.js.flow +35 -46
- package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
- package/mutations/validateMutation.js.flow +28 -16
- package/network/ConvertToExecuteFunction.js.flow +2 -2
- package/network/RelayNetwork.js.flow +4 -5
- package/network/RelayNetworkTypes.js.flow +17 -8
- package/network/RelayObservable.js.flow +1 -1
- package/network/RelayQueryResponseCache.js.flow +34 -20
- package/network/wrapNetworkWithLogObserver.js.flow +100 -0
- package/package.json +3 -2
- package/query/GraphQLTag.js.flow +9 -9
- package/query/PreloadableQueryRegistry.js.flow +2 -1
- package/query/fetchQuery.js.flow +11 -13
- package/query/fetchQueryInternal.js.flow +6 -9
- package/query/fetchQuery_DEPRECATED.js.flow +6 -6
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +14 -3
- package/store/DataChecker.js.flow +162 -67
- package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +616 -283
- package/store/RelayConcreteVariables.js.flow +27 -5
- package/store/RelayModernEnvironment.js.flow +176 -235
- package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
- package/store/RelayModernOperationDescriptor.js.flow +12 -7
- package/store/RelayModernRecord.js.flow +67 -11
- package/store/RelayModernSelector.js.flow +24 -14
- package/store/RelayModernStore.js.flow +72 -36
- package/store/RelayOperationTracker.js.flow +59 -43
- package/store/RelayOptimisticRecordSource.js.flow +2 -2
- package/store/RelayPublishQueue.js.flow +79 -34
- package/store/RelayReader.js.flow +351 -72
- package/store/RelayRecordSource.js.flow +72 -6
- package/store/RelayReferenceMarker.js.flow +60 -33
- package/store/RelayResponseNormalizer.js.flow +288 -102
- package/store/RelayStoreReactFlightUtils.js.flow +9 -13
- package/store/RelayStoreSubscriptions.js.flow +19 -11
- package/store/RelayStoreTypes.js.flow +210 -44
- package/store/RelayStoreUtils.js.flow +25 -11
- package/store/ResolverCache.js.flow +249 -0
- package/store/ResolverFragments.js.flow +121 -0
- package/store/StoreInspector.js.flow +2 -2
- package/store/TypeID.js.flow +1 -1
- package/store/ViewerPattern.js.flow +2 -2
- package/store/cloneRelayHandleSourceField.js.flow +5 -6
- package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
- package/store/createFragmentSpecResolver.js.flow +3 -4
- package/store/createRelayContext.js.flow +3 -3
- package/store/defaultGetDataID.js.flow +3 -1
- package/store/normalizeRelayPayload.js.flow +6 -7
- package/store/readInlineData.js.flow +7 -8
- package/subscription/requestSubscription.js.flow +54 -27
- package/util/NormalizationNode.js.flow +16 -3
- package/util/ReaderNode.js.flow +38 -2
- package/util/RelayConcreteNode.js.flow +4 -0
- package/util/RelayFeatureFlags.js.flow +24 -8
- package/util/RelayProfiler.js.flow +22 -194
- package/util/RelayReplaySubject.js.flow +9 -9
- package/util/RelayRuntimeTypes.js.flow +73 -4
- package/util/StringInterner.js.flow +69 -0
- package/util/createPayloadFor3DField.js.flow +3 -3
- package/util/deepFreeze.js.flow +2 -1
- package/util/getFragmentIdentifier.js.flow +27 -15
- package/util/getOperation.js.flow +2 -2
- package/util/getPaginationMetadata.js.flow +72 -0
- package/util/getPaginationVariables.js.flow +108 -0
- package/util/getPendingOperationsForFragment.js.flow +62 -0
- package/util/getRefetchMetadata.js.flow +79 -0
- package/util/getRelayHandleKey.js.flow +1 -2
- package/util/getRequestIdentifier.js.flow +3 -3
- package/util/getValueAtPath.js.flow +46 -0
- package/util/isEmptyObject.js.flow +2 -1
- package/util/registerEnvironmentWithDevTools.js.flow +33 -0
- package/util/resolveImmediate.js.flow +1 -1
- package/util/withDuration.js.flow +32 -0
- package/lib/store/RelayRecordSourceMapImpl.js +0 -107
- package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
- package/store/RelayRecordSourceMapImpl.js.flow +0 -91
- package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
|
@@ -10,20 +10,21 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var deepFreeze = require('../util/deepFreeze');
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
16
16
|
|
|
17
|
-
var
|
|
17
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
18
18
|
|
|
19
19
|
var hasOverlappingIDs = require('./hasOverlappingIDs');
|
|
20
20
|
|
|
21
|
-
var
|
|
21
|
+
var RelayReader = require('./RelayReader');
|
|
22
22
|
|
|
23
23
|
var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
24
|
-
function RelayStoreSubscriptions(log) {
|
|
24
|
+
function RelayStoreSubscriptions(log, resolverCache) {
|
|
25
25
|
this._subscriptions = new Set();
|
|
26
26
|
this.__log = log;
|
|
27
|
+
this._resolverCache = resolverCache;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
var _proto = RelayStoreSubscriptions.prototype;
|
|
@@ -50,6 +51,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
50
51
|
};
|
|
51
52
|
|
|
52
53
|
_proto.snapshotSubscriptions = function snapshotSubscriptions(source) {
|
|
54
|
+
var _this2 = this;
|
|
55
|
+
|
|
53
56
|
this._subscriptions.forEach(function (subscription) {
|
|
54
57
|
// Backup occurs after writing a new "final" payload(s) and before (re)applying
|
|
55
58
|
// optimistic changes. Each subscription's `snapshot` represents what was *last
|
|
@@ -69,7 +72,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
var snapshot = subscription.snapshot;
|
|
72
|
-
var backup = RelayReader.read(source, snapshot.selector);
|
|
75
|
+
var backup = RelayReader.read(source, snapshot.selector, _this2._resolverCache);
|
|
73
76
|
var nextData = recycleNodesInto(snapshot.data, backup.data);
|
|
74
77
|
backup.data = nextData; // backup owns the snapshot and can safely mutate
|
|
75
78
|
|
|
@@ -90,6 +93,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
90
93
|
subscription.snapshot = {
|
|
91
94
|
data: subscription.snapshot.data,
|
|
92
95
|
isMissingData: backup.isMissingData,
|
|
96
|
+
missingClientEdges: backup.missingClientEdges,
|
|
93
97
|
seenRecords: backup.seenRecords,
|
|
94
98
|
selector: backup.selector,
|
|
95
99
|
missingRequiredFields: backup.missingRequiredFields
|
|
@@ -101,12 +105,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
101
105
|
};
|
|
102
106
|
|
|
103
107
|
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
|
|
104
|
-
var
|
|
108
|
+
var _this3 = this;
|
|
105
109
|
|
|
106
110
|
var hasUpdatedRecords = updatedRecordIDs.size !== 0;
|
|
107
111
|
|
|
108
112
|
this._subscriptions.forEach(function (subscription) {
|
|
109
|
-
var owner =
|
|
113
|
+
var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
|
|
110
114
|
|
|
111
115
|
if (owner != null) {
|
|
112
116
|
updatedOwners.push(owner);
|
|
@@ -134,11 +138,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
134
138
|
return;
|
|
135
139
|
}
|
|
136
140
|
|
|
137
|
-
var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
|
|
141
|
+
var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
|
|
138
142
|
var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
|
|
139
143
|
nextSnapshot = {
|
|
140
144
|
data: nextData,
|
|
141
145
|
isMissingData: nextSnapshot.isMissingData,
|
|
146
|
+
missingClientEdges: nextSnapshot.missingClientEdges,
|
|
142
147
|
seenRecords: nextSnapshot.seenRecords,
|
|
143
148
|
selector: nextSnapshot.selector,
|
|
144
149
|
missingRequiredFields: nextSnapshot.missingRequiredFields
|
|
@@ -14,14 +14,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
14
14
|
|
|
15
15
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
16
16
|
|
|
17
|
-
var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
18
|
-
|
|
19
17
|
var getRelayHandleKey = require('../util/getRelayHandleKey');
|
|
20
18
|
|
|
21
|
-
var
|
|
19
|
+
var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
22
20
|
|
|
23
21
|
var stableCopy = require('../util/stableCopy');
|
|
24
22
|
|
|
23
|
+
var invariant = require('invariant');
|
|
24
|
+
|
|
25
25
|
var VARIABLE = RelayConcreteNode.VARIABLE,
|
|
26
26
|
LITERAL = RelayConcreteNode.LITERAL,
|
|
27
27
|
OBJECT_VALUE = RelayConcreteNode.OBJECT_VALUE,
|
|
@@ -122,8 +122,8 @@ function getStorageKey(field, variables) {
|
|
|
122
122
|
return field.storageKey;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
var args = field.args
|
|
126
|
-
|
|
125
|
+
var args = typeof field.args === 'undefined' ? undefined : field.args;
|
|
126
|
+
var name = field.name;
|
|
127
127
|
return args && args.length !== 0 ? formatStorageKey(name, getArgumentValues(args, variables)) : name;
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
@@ -192,6 +192,8 @@ function getModuleOperationKey(documentName) {
|
|
|
192
192
|
|
|
193
193
|
|
|
194
194
|
var RelayStoreUtils = {
|
|
195
|
+
ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
|
|
196
|
+
CLIENT_EDGE_TRAVERSAL_PATH: '__clientEdgeTraversalPath',
|
|
195
197
|
FRAGMENTS_KEY: '__fragments',
|
|
196
198
|
FRAGMENT_OWNER_KEY: '__fragmentOwner',
|
|
197
199
|
FRAGMENT_PROP_NAME_KEY: '__fragmentPropName',
|
|
@@ -205,6 +207,10 @@ var RelayStoreUtils = {
|
|
|
205
207
|
TYPENAME_KEY: '__typename',
|
|
206
208
|
INVALIDATED_AT_KEY: '__invalidated_at',
|
|
207
209
|
IS_WITHIN_UNMATCHED_TYPE_REFINEMENT: '__isWithinUnmatchedTypeRefinement',
|
|
210
|
+
RELAY_RESOLVER_VALUE_KEY: '__resolverValue',
|
|
211
|
+
RELAY_RESOLVER_INVALIDATION_KEY: '__resolverValueMayBeInvalid',
|
|
212
|
+
RELAY_RESOLVER_INPUTS_KEY: '__resolverInputValues',
|
|
213
|
+
RELAY_RESOLVER_READER_SELECTOR_KEY: '__resolverReaderSelector',
|
|
208
214
|
formatStorageKey: formatStorageKey,
|
|
209
215
|
getArgumentValue: getArgumentValue,
|
|
210
216
|
getArgumentValues: getArgumentValues,
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
14
|
+
|
|
15
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
16
|
+
|
|
17
|
+
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
18
|
+
|
|
19
|
+
var _require = require('./ClientID'),
|
|
20
|
+
generateClientID = _require.generateClientID;
|
|
21
|
+
|
|
22
|
+
var RelayModernRecord = require('./RelayModernRecord');
|
|
23
|
+
|
|
24
|
+
var _require2 = require('./RelayStoreUtils'),
|
|
25
|
+
RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
|
|
26
|
+
RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
|
|
27
|
+
RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
|
|
28
|
+
RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
|
|
29
|
+
getStorageKey = _require2.getStorageKey;
|
|
30
|
+
|
|
31
|
+
var warning = require("fbjs/lib/warning");
|
|
32
|
+
|
|
33
|
+
// $FlowFixMe[unclear-type] - will always be empty
|
|
34
|
+
var emptySet = new Set();
|
|
35
|
+
|
|
36
|
+
var NoopResolverCache = /*#__PURE__*/function () {
|
|
37
|
+
function NoopResolverCache() {}
|
|
38
|
+
|
|
39
|
+
var _proto = NoopResolverCache.prototype;
|
|
40
|
+
|
|
41
|
+
_proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
|
|
42
|
+
return [evaluate().resolverResult, undefined];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
_proto.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {};
|
|
46
|
+
|
|
47
|
+
return NoopResolverCache;
|
|
48
|
+
}();
|
|
49
|
+
|
|
50
|
+
function addDependencyEdge(edges, from, to) {
|
|
51
|
+
var set = edges.get(from);
|
|
52
|
+
|
|
53
|
+
if (!set) {
|
|
54
|
+
set = new Set();
|
|
55
|
+
edges.set(from, set);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
set.add(to);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var RecordResolverCache = /*#__PURE__*/function () {
|
|
62
|
+
function RecordResolverCache(getRecordSource) {
|
|
63
|
+
this._resolverIDToRecordIDs = new Map();
|
|
64
|
+
this._recordIDToResolverIDs = new Map();
|
|
65
|
+
this._getRecordSource = getRecordSource;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var _proto2 = RecordResolverCache.prototype;
|
|
69
|
+
|
|
70
|
+
_proto2.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
|
|
71
|
+
var recordSource = this._getRecordSource();
|
|
72
|
+
|
|
73
|
+
var recordID = RelayModernRecord.getDataID(record);
|
|
74
|
+
var storageKey = getStorageKey(field, variables);
|
|
75
|
+
var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
|
|
76
|
+
var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
|
|
77
|
+
|
|
78
|
+
if (linkedRecord == null || this._isInvalid(linkedRecord, getDataForResolverFragment)) {
|
|
79
|
+
var _linkedID;
|
|
80
|
+
|
|
81
|
+
// Cache miss; evaluate the selector and store the result in a new record:
|
|
82
|
+
linkedID = (_linkedID = linkedID) !== null && _linkedID !== void 0 ? _linkedID : generateClientID(recordID, storageKey);
|
|
83
|
+
linkedRecord = RelayModernRecord.create(linkedID, '__RELAY_RESOLVER__');
|
|
84
|
+
var evaluationResult = evaluate();
|
|
85
|
+
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
|
|
86
|
+
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_INPUTS_KEY, evaluationResult.fragmentValue);
|
|
87
|
+
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_READER_SELECTOR_KEY, evaluationResult.readerSelector);
|
|
88
|
+
recordSource.set(linkedID, linkedRecord); // Link the resolver value record to the resolver field of the record being read:
|
|
89
|
+
|
|
90
|
+
var nextRecord = RelayModernRecord.clone(record);
|
|
91
|
+
RelayModernRecord.setLinkedRecordID(nextRecord, storageKey, linkedID);
|
|
92
|
+
recordSource.set(RelayModernRecord.getDataID(nextRecord), nextRecord); // Put records observed by the resolver into the dependency graph:
|
|
93
|
+
|
|
94
|
+
var resolverID = evaluationResult.resolverID;
|
|
95
|
+
addDependencyEdge(this._resolverIDToRecordIDs, resolverID, linkedID);
|
|
96
|
+
addDependencyEdge(this._recordIDToResolverIDs, recordID, resolverID);
|
|
97
|
+
|
|
98
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(evaluationResult.seenRecordIDs),
|
|
99
|
+
_step;
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
103
|
+
var seenRecordID = _step.value;
|
|
104
|
+
addDependencyEdge(this._recordIDToResolverIDs, seenRecordID, resolverID);
|
|
105
|
+
}
|
|
106
|
+
} catch (err) {
|
|
107
|
+
_iterator.e(err);
|
|
108
|
+
} finally {
|
|
109
|
+
_iterator.f();
|
|
110
|
+
}
|
|
111
|
+
} // $FlowFixMe[incompatible-type] - will always be empty
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
var answer = linkedRecord[RELAY_RESOLVER_VALUE_KEY];
|
|
115
|
+
return [answer, linkedID];
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
_proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
|
|
119
|
+
var recordSource = this._getRecordSource();
|
|
120
|
+
|
|
121
|
+
var visited = new Set();
|
|
122
|
+
var recordsToVisit = Array.from(updatedDataIDs);
|
|
123
|
+
|
|
124
|
+
while (recordsToVisit.length) {
|
|
125
|
+
var recordID = recordsToVisit.pop();
|
|
126
|
+
updatedDataIDs.add(recordID);
|
|
127
|
+
|
|
128
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])((_this$_recordIDToReso = this._recordIDToResolverIDs.get(recordID)) !== null && _this$_recordIDToReso !== void 0 ? _this$_recordIDToReso : emptySet),
|
|
129
|
+
_step2;
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
133
|
+
var _this$_recordIDToReso;
|
|
134
|
+
|
|
135
|
+
var fragment = _step2.value;
|
|
136
|
+
|
|
137
|
+
if (!visited.has(fragment)) {
|
|
138
|
+
var _iterator3 = (0, _createForOfIteratorHelper2["default"])((_this$_resolverIDToRe = this._resolverIDToRecordIDs.get(fragment)) !== null && _this$_resolverIDToRe !== void 0 ? _this$_resolverIDToRe : emptySet),
|
|
139
|
+
_step3;
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
143
|
+
var _this$_resolverIDToRe;
|
|
144
|
+
|
|
145
|
+
var anotherRecordID = _step3.value;
|
|
146
|
+
|
|
147
|
+
this._markInvalidatedResolverRecord(anotherRecordID, recordSource, updatedDataIDs);
|
|
148
|
+
|
|
149
|
+
if (!visited.has(anotherRecordID)) {
|
|
150
|
+
recordsToVisit.push(anotherRecordID);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} catch (err) {
|
|
154
|
+
_iterator3.e(err);
|
|
155
|
+
} finally {
|
|
156
|
+
_iterator3.f();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
} catch (err) {
|
|
161
|
+
_iterator2.e(err);
|
|
162
|
+
} finally {
|
|
163
|
+
_iterator2.f();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
_proto2._markInvalidatedResolverRecord = function _markInvalidatedResolverRecord(dataID, recordSource, // Written to
|
|
169
|
+
updatedDataIDs) // Mutated in place
|
|
170
|
+
{
|
|
171
|
+
var record = recordSource.get(dataID);
|
|
172
|
+
|
|
173
|
+
if (!record) {
|
|
174
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'Expected a resolver record with ID %s, but it was missing.', dataID) : void 0;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var nextRecord = RelayModernRecord.clone(record);
|
|
179
|
+
RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, true);
|
|
180
|
+
recordSource.set(dataID, nextRecord);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
_proto2._isInvalid = function _isInvalid(record, getDataForResolverFragment) {
|
|
184
|
+
if (!RelayModernRecord.getValue(record, RELAY_RESOLVER_INVALIDATION_KEY)) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
var originalInputs = RelayModernRecord.getValue(record, RELAY_RESOLVER_INPUTS_KEY); // $FlowFixMe[incompatible-type] - storing values in records is not typed
|
|
189
|
+
|
|
190
|
+
var readerSelector = RelayModernRecord.getValue(record, RELAY_RESOLVER_READER_SELECTOR_KEY);
|
|
191
|
+
|
|
192
|
+
if (originalInputs == null || readerSelector == null) {
|
|
193
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'Expected previous inputs and reader selector on resolver record with ID %s, but they were missing.', RelayModernRecord.getDataID(record)) : void 0;
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
var latestValues = getDataForResolverFragment(readerSelector);
|
|
198
|
+
var recycled = recycleNodesInto(originalInputs, latestValues);
|
|
199
|
+
|
|
200
|
+
if (recycled !== originalInputs) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return false;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
return RecordResolverCache;
|
|
208
|
+
}();
|
|
209
|
+
|
|
210
|
+
module.exports = {
|
|
211
|
+
NoopResolverCache: NoopResolverCache,
|
|
212
|
+
RecordResolverCache: RecordResolverCache
|
|
213
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
var _require = require('../query/GraphQLTag'),
|
|
14
|
+
getFragment = _require.getFragment;
|
|
15
|
+
|
|
16
|
+
var _require2 = require('./RelayModernSelector'),
|
|
17
|
+
getSelector = _require2.getSelector;
|
|
18
|
+
|
|
19
|
+
var invariant = require('invariant'); // When we call the user-supplied resolver function, it will in turn call
|
|
20
|
+
// `readFragment`, but that's a global function -- it needs information
|
|
21
|
+
// about what resolver is being executed, which is supplied by putting the
|
|
22
|
+
// info on this stack before we call the resolver function.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
var contextStack = [];
|
|
26
|
+
|
|
27
|
+
function withResolverContext(context, cb) {
|
|
28
|
+
contextStack.push(context);
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
return cb();
|
|
32
|
+
} finally {
|
|
33
|
+
contextStack.pop();
|
|
34
|
+
}
|
|
35
|
+
} // NOTE: these declarations are copied from 'useFragment'; it would be good
|
|
36
|
+
// to figure out how to share the same type signature between the two functions.
|
|
37
|
+
// The declarations ensure that the type of the returned data is:
|
|
38
|
+
// - non-nullable if the provided ref type is non-nullable
|
|
39
|
+
// - nullable if the provided ref type is nullable
|
|
40
|
+
// - array of non-nullable if the privoided ref type is an array of
|
|
41
|
+
// non-nullable refs
|
|
42
|
+
// - array of nullable if the privoided ref type is an array of nullable refs
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
function readFragment(fragmentInput, fragmentKey) {
|
|
46
|
+
if (!contextStack.length) {
|
|
47
|
+
throw new Error('readFragment should be called only from within a Relay Resolver function.');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
var context = contextStack[contextStack.length - 1];
|
|
51
|
+
var fragmentNode = getFragment(fragmentInput);
|
|
52
|
+
var fragmentSelector = getSelector(fragmentNode, fragmentKey);
|
|
53
|
+
!(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a selector for the fragment of the resolver ".concat(fragmentNode.name, ", but got null.")) : invariant(false) : void 0;
|
|
54
|
+
!(fragmentSelector.kind === 'SingularReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a singular reader selector for the fragment of the resolver ".concat(fragmentNode.name, ", but it was plural.")) : invariant(false) : void 0;
|
|
55
|
+
return context.getDataForResolverFragment(fragmentSelector, fragmentKey);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = {
|
|
59
|
+
readFragment: readFragment,
|
|
60
|
+
withResolverContext: withResolverContext
|
|
61
|
+
};
|
|
@@ -10,16 +10,15 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var areEqual = require("fbjs/lib/areEqual");
|
|
14
|
-
|
|
15
|
-
var invariant = require("fbjs/lib/invariant");
|
|
16
|
-
|
|
17
13
|
var _require = require('../util/RelayConcreteNode'),
|
|
18
14
|
LINKED_FIELD = _require.LINKED_FIELD;
|
|
19
15
|
|
|
20
16
|
var _require2 = require('./RelayStoreUtils'),
|
|
21
17
|
getHandleStorageKey = _require2.getHandleStorageKey;
|
|
22
18
|
|
|
19
|
+
var areEqual = require("fbjs/lib/areEqual");
|
|
20
|
+
|
|
21
|
+
var invariant = require('invariant');
|
|
23
22
|
/**
|
|
24
23
|
* @private
|
|
25
24
|
*
|
|
@@ -27,6 +26,8 @@ var _require2 = require('./RelayStoreUtils'),
|
|
|
27
26
|
* field (on which the handle was declared) among the sibling `selections`, and
|
|
28
27
|
* copying its selections into the clone.
|
|
29
28
|
*/
|
|
29
|
+
|
|
30
|
+
|
|
30
31
|
function cloneRelayHandleSourceField(handleField, selections, variables) {
|
|
31
32
|
var sourceField = selections.find(function (source) {
|
|
32
33
|
return source.kind === LINKED_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
|
|
@@ -10,22 +10,23 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var areEqual = require("fbjs/lib/areEqual");
|
|
14
|
-
|
|
15
|
-
var invariant = require("fbjs/lib/invariant");
|
|
16
|
-
|
|
17
13
|
var _require = require('../util/RelayConcreteNode'),
|
|
18
14
|
SCALAR_FIELD = _require.SCALAR_FIELD;
|
|
19
15
|
|
|
20
16
|
var _require2 = require('./RelayStoreUtils'),
|
|
21
17
|
getHandleStorageKey = _require2.getHandleStorageKey;
|
|
22
18
|
|
|
19
|
+
var areEqual = require("fbjs/lib/areEqual");
|
|
20
|
+
|
|
21
|
+
var invariant = require('invariant');
|
|
23
22
|
/**
|
|
24
23
|
* @private
|
|
25
24
|
*
|
|
26
25
|
* Creates a clone of the supplied `handleField` by finding the original scalar
|
|
27
26
|
* field (on which the handle was declared) among the sibling `selections`.
|
|
28
27
|
*/
|
|
28
|
+
|
|
29
|
+
|
|
29
30
|
function cloneRelayScalarHandleSourceField(handleField, selections, variables) {
|
|
30
31
|
var sourceField = selections.find(function (source) {
|
|
31
32
|
return source.kind === SCALAR_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require(
|
|
13
|
+
var invariant = require('invariant'); // Ideally, we'd just import the type of the react module, but this causes Flow
|
|
14
|
+
// problems.
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
var relayContext;
|
|
16
18
|
var firstReact;
|
|
@@ -26,7 +28,7 @@ function createRelayContext(react) {
|
|
|
26
28
|
firstReact = react;
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
!(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
|
|
31
|
+
!(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You are passing a different instance of React', react.version) : invariant(false) : void 0;
|
|
30
32
|
return relayContext;
|
|
31
33
|
}
|
|
32
34
|
|
|
@@ -16,8 +16,10 @@ var _require = require('./ViewerPattern'),
|
|
|
16
16
|
|
|
17
17
|
function defaultGetDataID(fieldValue, typeName) {
|
|
18
18
|
if (typeName === VIEWER_TYPE) {
|
|
19
|
+
// $FlowFixMe[prop-missing]
|
|
19
20
|
return fieldValue.id == null ? VIEWER_ID : fieldValue.id;
|
|
20
|
-
}
|
|
21
|
+
} // $FlowFixMe[prop-missing]
|
|
22
|
+
|
|
21
23
|
|
|
22
24
|
return fieldValue.id;
|
|
23
25
|
}
|
|
@@ -10,14 +10,18 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require("fbjs/lib/invariant");
|
|
14
|
-
|
|
15
13
|
var _require = require('../query/GraphQLTag'),
|
|
16
14
|
getInlineDataFragment = _require.getInlineDataFragment;
|
|
17
15
|
|
|
18
16
|
var _require2 = require('./RelayStoreUtils'),
|
|
19
17
|
FRAGMENTS_KEY = _require2.FRAGMENTS_KEY;
|
|
20
18
|
|
|
19
|
+
var invariant = require('invariant');
|
|
20
|
+
/**
|
|
21
|
+
* Reads an @inline data fragment that was spread into the parent fragment.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
|
|
21
25
|
function readInlineData(fragment, fragmentRef) {
|
|
22
26
|
var _fragmentRef$FRAGMENT;
|
|
23
27
|
|
|
@@ -12,14 +12,19 @@
|
|
|
12
12
|
|
|
13
13
|
var RelayDeclarativeMutationConfig = require('../mutations/RelayDeclarativeMutationConfig');
|
|
14
14
|
|
|
15
|
-
var warning = require("fbjs/lib/warning");
|
|
16
|
-
|
|
17
15
|
var _require = require('../query/GraphQLTag'),
|
|
18
16
|
getRequest = _require.getRequest;
|
|
19
17
|
|
|
20
18
|
var _require2 = require('../store/RelayModernOperationDescriptor'),
|
|
21
19
|
createOperationDescriptor = _require2.createOperationDescriptor;
|
|
22
20
|
|
|
21
|
+
var _require3 = require('../store/RelayModernSelector'),
|
|
22
|
+
createReaderSelector = _require3.createReaderSelector;
|
|
23
|
+
|
|
24
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
25
|
+
|
|
26
|
+
var warning = require("fbjs/lib/warning");
|
|
27
|
+
|
|
23
28
|
function requestSubscription(environment, config) {
|
|
24
29
|
var subscription = getRequest(config.subscription);
|
|
25
30
|
|
|
@@ -38,18 +43,39 @@ function requestSubscription(environment, config) {
|
|
|
38
43
|
|
|
39
44
|
var _ref = configs ? RelayDeclarativeMutationConfig.convert(configs, subscription, null
|
|
40
45
|
/* optimisticUpdater */
|
|
41
|
-
,
|
|
46
|
+
,
|
|
47
|
+
/* optimisticUpdater */
|
|
48
|
+
config.updater) : config,
|
|
42
49
|
updater = _ref.updater;
|
|
43
50
|
|
|
44
|
-
var sub = environment.
|
|
51
|
+
var sub = environment.executeSubscription({
|
|
45
52
|
operation: operation,
|
|
46
53
|
updater: updater
|
|
47
|
-
}).map(function () {
|
|
48
|
-
var data = environment.lookup(operation.fragment).data; // $FlowFixMe[incompatible-cast]
|
|
49
|
-
|
|
50
|
-
return data;
|
|
51
54
|
}).subscribe({
|
|
52
|
-
next:
|
|
55
|
+
next: function next(responses) {
|
|
56
|
+
if (onNext != null) {
|
|
57
|
+
var selector = operation.fragment;
|
|
58
|
+
var nextID;
|
|
59
|
+
|
|
60
|
+
if (Array.isArray(responses)) {
|
|
61
|
+
var _responses$, _responses$$extension;
|
|
62
|
+
|
|
63
|
+
nextID = (_responses$ = responses[0]) === null || _responses$ === void 0 ? void 0 : (_responses$$extension = _responses$.extensions) === null || _responses$$extension === void 0 ? void 0 : _responses$$extension.__relay_subscription_root_id;
|
|
64
|
+
} else {
|
|
65
|
+
var _responses$extensions;
|
|
66
|
+
|
|
67
|
+
nextID = (_responses$extensions = responses.extensions) === null || _responses$extensions === void 0 ? void 0 : _responses$extensions.__relay_subscription_root_id;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (typeof nextID === 'string') {
|
|
71
|
+
selector = createReaderSelector(selector.node, nextID, selector.variables, selector.owner);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
var data = environment.lookup(selector).data; // $FlowFixMe[incompatible-cast]
|
|
75
|
+
|
|
76
|
+
onNext(data);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
53
79
|
error: onError,
|
|
54
80
|
complete: onCompleted
|
|
55
81
|
});
|
|
@@ -24,7 +24,10 @@
|
|
|
24
24
|
* for local caching.
|
|
25
25
|
*/
|
|
26
26
|
var RelayConcreteNode = {
|
|
27
|
+
ACTOR_CHANGE: 'ActorChange',
|
|
27
28
|
CONDITION: 'Condition',
|
|
29
|
+
CLIENT_COMPONENT: 'ClientComponent',
|
|
30
|
+
CLIENT_EDGE: 'ClientEdge',
|
|
28
31
|
CLIENT_EXTENSION: 'ClientExtension',
|
|
29
32
|
DEFER: 'Defer',
|
|
30
33
|
CONNECTION: 'Connection',
|
|
@@ -40,6 +43,7 @@ var RelayConcreteNode = {
|
|
|
40
43
|
LIST_VALUE: 'ListValue',
|
|
41
44
|
LOCAL_ARGUMENT: 'LocalArgument',
|
|
42
45
|
MODULE_IMPORT: 'ModuleImport',
|
|
46
|
+
RELAY_RESOLVER: 'RelayResolver',
|
|
43
47
|
REQUIRED_FIELD: 'RequiredField',
|
|
44
48
|
OBJECT_VALUE: 'ObjectValue',
|
|
45
49
|
OPERATION: 'Operation',
|
|
@@ -11,17 +11,24 @@
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
13
|
var RelayFeatureFlags = {
|
|
14
|
+
DELAY_CLEANUP_OF_PENDING_PRELOAD_QUERIES: false,
|
|
15
|
+
ENABLE_CLIENT_EDGES: false,
|
|
14
16
|
ENABLE_VARIABLE_CONNECTION_KEY: false,
|
|
15
17
|
ENABLE_PARTIAL_RENDERING_DEFAULT: true,
|
|
16
|
-
ENABLE_RELAY_CONTAINERS_SUSPENSE: true,
|
|
17
|
-
ENABLE_PRECISE_TYPE_REFINEMENT: false,
|
|
18
18
|
ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
|
|
19
19
|
ENABLE_REQUIRED_DIRECTIVES: false,
|
|
20
|
+
ENABLE_RELAY_RESOLVERS: false,
|
|
20
21
|
ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
|
|
21
22
|
ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
|
|
22
|
-
ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
|
|
23
23
|
ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
|
|
24
24
|
ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
|
|
25
|
-
ENABLE_NOTIFY_SUBSCRIPTION: false
|
|
25
|
+
ENABLE_NOTIFY_SUBSCRIPTION: false,
|
|
26
|
+
BATCH_ASYNC_MODULE_UPDATES_FN: null,
|
|
27
|
+
ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT: false,
|
|
28
|
+
ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT: false,
|
|
29
|
+
MAX_DATA_ID_LENGTH: null,
|
|
30
|
+
REFACTOR_SUSPENSE_RESOURCE: true,
|
|
31
|
+
STRING_INTERN_LEVEL: 0,
|
|
32
|
+
USE_REACT_CACHE: false
|
|
26
33
|
};
|
|
27
34
|
module.exports = RelayFeatureFlags;
|