relay-runtime 11.0.2 → 12.0.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/index.js +1 -1
- package/index.js.flow +16 -1
- package/lib/index.js +15 -0
- package/lib/multi-actor-environment/ActorIdentifier.js +11 -1
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +59 -19
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +305 -55
- package/lib/multi-actor-environment/index.js +5 -1
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +6 -1
- package/lib/mutations/commitMutation.js +4 -1
- package/lib/mutations/validateMutation.js +6 -1
- package/lib/network/RelayObservable.js +3 -1
- package/lib/network/RelayQueryResponseCache.js +19 -3
- package/lib/network/wrapNetworkWithLogObserver.js +78 -0
- package/lib/store/DataChecker.js +110 -40
- package/lib/store/OperationExecutor.js +478 -204
- package/lib/store/RelayConcreteVariables.js +21 -0
- package/lib/store/RelayModernEnvironment.js +41 -85
- package/lib/store/RelayModernFragmentSpecResolver.js +48 -22
- package/lib/store/RelayModernRecord.js +35 -1
- package/lib/store/RelayModernStore.js +48 -14
- package/lib/store/RelayOperationTracker.js +33 -23
- package/lib/store/RelayPublishQueue.js +23 -5
- package/lib/store/RelayReader.js +138 -44
- package/lib/store/RelayRecordSource.js +87 -3
- package/lib/store/RelayReferenceMarker.js +28 -15
- package/lib/store/RelayResponseNormalizer.js +164 -91
- package/lib/store/RelayStoreReactFlightUtils.js +1 -7
- package/lib/store/RelayStoreSubscriptions.js +8 -5
- package/lib/store/RelayStoreUtils.js +7 -2
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +1 -1
- package/lib/store/createRelayContext.js +1 -1
- package/lib/subscription/requestSubscription.js +27 -29
- package/lib/util/RelayConcreteNode.js +1 -0
- package/lib/util/RelayFeatureFlags.js +3 -5
- package/lib/util/RelayReplaySubject.js +21 -6
- package/lib/util/getPaginationMetadata.js +41 -0
- package/lib/util/getPaginationVariables.js +67 -0
- package/lib/util/getPendingOperationsForFragment.js +55 -0
- package/lib/util/getRefetchMetadata.js +36 -0
- 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 +17 -1
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +72 -44
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +332 -80
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +61 -12
- package/multi-actor-environment/index.js.flow +3 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
- package/mutations/commitMutation.js.flow +2 -0
- package/mutations/validateMutation.js.flow +8 -0
- package/network/RelayObservable.js.flow +2 -0
- package/network/RelayQueryResponseCache.js.flow +31 -18
- package/network/wrapNetworkWithLogObserver.js.flow +99 -0
- package/package.json +1 -1
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +5 -1
- package/store/DataChecker.js.flow +126 -35
- package/store/OperationExecutor.js.flow +528 -265
- package/store/RelayConcreteVariables.js.flow +26 -1
- package/store/RelayModernEnvironment.js.flow +41 -94
- package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
- package/store/RelayModernOperationDescriptor.js.flow +9 -3
- package/store/RelayModernRecord.js.flow +49 -0
- package/store/RelayModernStore.js.flow +50 -12
- package/store/RelayOperationTracker.js.flow +56 -34
- package/store/RelayPublishQueue.js.flow +31 -8
- package/store/RelayReader.js.flow +148 -42
- package/store/RelayRecordSource.js.flow +72 -6
- package/store/RelayReferenceMarker.js.flow +29 -12
- package/store/RelayResponseNormalizer.js.flow +164 -48
- package/store/RelayStoreReactFlightUtils.js.flow +1 -7
- package/store/RelayStoreSubscriptions.js.flow +10 -3
- package/store/RelayStoreTypes.js.flow +128 -12
- package/store/RelayStoreUtils.js.flow +17 -3
- package/store/ResolverCache.js.flow +247 -0
- package/store/ResolverFragments.js.flow +6 -3
- package/store/createRelayContext.js.flow +1 -1
- package/subscription/requestSubscription.js.flow +41 -29
- package/util/NormalizationNode.js.flow +10 -3
- package/util/ReaderNode.js.flow +15 -1
- package/util/RelayConcreteNode.js.flow +1 -0
- package/util/RelayFeatureFlags.js.flow +8 -10
- package/util/RelayReplaySubject.js.flow +7 -6
- package/util/getPaginationMetadata.js.flow +74 -0
- package/util/getPaginationVariables.js.flow +112 -0
- package/util/getPendingOperationsForFragment.js.flow +62 -0
- package/util/getRefetchMetadata.js.flow +80 -0
- package/util/getValueAtPath.js.flow +46 -0
- package/util/isEmptyObject.js.flow +1 -0
- package/util/registerEnvironmentWithDevTools.js.flow +33 -0
- 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
|
@@ -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 RelayModernRecord = require('./RelayModernRecord');
|
|
18
|
+
|
|
19
|
+
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
20
|
+
|
|
21
|
+
var warning = require("fbjs/lib/warning");
|
|
22
|
+
|
|
23
|
+
var _require = require('./ClientID'),
|
|
24
|
+
generateClientID = _require.generateClientID;
|
|
25
|
+
|
|
26
|
+
var _require2 = require('./RelayStoreUtils'),
|
|
27
|
+
RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
|
|
28
|
+
RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
|
|
29
|
+
RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
|
|
30
|
+
RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
|
|
31
|
+
getStorageKey = _require2.getStorageKey;
|
|
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
|
+
};
|
|
@@ -48,7 +48,7 @@ function readFragment(fragmentInput, fragmentRef) {
|
|
|
48
48
|
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
|
49
49
|
!(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;
|
|
50
50
|
!(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;
|
|
51
|
-
return context.getDataForResolverFragment(fragmentSelector);
|
|
51
|
+
return context.getDataForResolverFragment(fragmentSelector, fragmentRef);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
module.exports = {
|
|
@@ -26,7 +26,7 @@ function createRelayContext(react) {
|
|
|
26
26
|
firstReact = react;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
!(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
|
|
29
|
+
!(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
30
|
return relayContext;
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -19,14 +19,11 @@ var warning = require("fbjs/lib/warning");
|
|
|
19
19
|
var _require = require('../query/GraphQLTag'),
|
|
20
20
|
getRequest = _require.getRequest;
|
|
21
21
|
|
|
22
|
-
var _require2 = require('../store/
|
|
23
|
-
|
|
22
|
+
var _require2 = require('../store/RelayModernOperationDescriptor'),
|
|
23
|
+
createOperationDescriptor = _require2.createOperationDescriptor;
|
|
24
24
|
|
|
25
|
-
var _require3 = require('../store/
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
var _require4 = require('../store/RelayModernSelector'),
|
|
29
|
-
createReaderSelector = _require4.createReaderSelector;
|
|
25
|
+
var _require3 = require('../store/RelayModernSelector'),
|
|
26
|
+
createReaderSelector = _require3.createReaderSelector;
|
|
30
27
|
|
|
31
28
|
function requestSubscription(environment, config) {
|
|
32
29
|
var subscription = getRequest(config.subscription);
|
|
@@ -41,43 +38,44 @@ function requestSubscription(environment, config) {
|
|
|
41
38
|
onNext = config.onNext,
|
|
42
39
|
variables = config.variables,
|
|
43
40
|
cacheConfig = config.cacheConfig;
|
|
44
|
-
var operation = createOperationDescriptor(subscription, variables, cacheConfig
|
|
41
|
+
var operation = createOperationDescriptor(subscription, variables, cacheConfig);
|
|
45
42
|
process.env.NODE_ENV !== "production" ? warning(!(config.updater && configs), 'requestSubscription: Expected only one of `updater` and `configs` to be provided') : void 0;
|
|
46
43
|
|
|
47
44
|
var _ref = configs ? RelayDeclarativeMutationConfig.convert(configs, subscription, null
|
|
48
45
|
/* optimisticUpdater */
|
|
49
|
-
,
|
|
46
|
+
,
|
|
47
|
+
/* optimisticUpdater */
|
|
48
|
+
config.updater) : config,
|
|
50
49
|
updater = _ref.updater;
|
|
51
50
|
|
|
52
51
|
var sub = environment.execute({
|
|
53
52
|
operation: operation,
|
|
54
53
|
updater: updater
|
|
55
|
-
}).
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
}).subscribe({
|
|
55
|
+
next: function next(responses) {
|
|
56
|
+
if (onNext != null) {
|
|
57
|
+
var selector = operation.fragment;
|
|
58
|
+
var nextID;
|
|
60
59
|
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
if (Array.isArray(responses)) {
|
|
61
|
+
var _responses$, _responses$$extension;
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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;
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
nextID = (_responses$extensions = responses.extensions) === null || _responses$extensions === void 0 ? void 0 : _responses$extensions.__relay_subscription_root_id;
|
|
68
|
+
}
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
70
|
+
if (typeof nextID === 'string') {
|
|
71
|
+
selector = createReaderSelector(selector.node, nextID, selector.variables, selector.owner);
|
|
72
|
+
}
|
|
75
73
|
|
|
76
|
-
|
|
74
|
+
var data = environment.lookup(selector).data; // $FlowFixMe[incompatible-cast]
|
|
77
75
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
onNext(data);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
81
79
|
error: onError,
|
|
82
80
|
complete: onCompleted
|
|
83
81
|
});
|
|
@@ -13,18 +13,16 @@
|
|
|
13
13
|
var RelayFeatureFlags = {
|
|
14
14
|
ENABLE_VARIABLE_CONNECTION_KEY: false,
|
|
15
15
|
ENABLE_PARTIAL_RENDERING_DEFAULT: true,
|
|
16
|
-
ENABLE_RELAY_CONTAINERS_SUSPENSE: true,
|
|
17
|
-
ENABLE_PRECISE_TYPE_REFINEMENT: false,
|
|
18
16
|
ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
|
|
19
17
|
ENABLE_REQUIRED_DIRECTIVES: false,
|
|
20
18
|
ENABLE_RELAY_RESOLVERS: false,
|
|
21
19
|
ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
|
|
22
20
|
ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
|
|
23
|
-
ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
|
|
24
21
|
ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
|
|
25
22
|
ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
|
|
26
23
|
ENABLE_NOTIFY_SUBSCRIPTION: false,
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
BATCH_ASYNC_MODULE_UPDATES_FN: null,
|
|
25
|
+
ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT: false,
|
|
26
|
+
ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT: false
|
|
29
27
|
};
|
|
30
28
|
module.exports = RelayFeatureFlags;
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
|
|
13
13
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
14
14
|
|
|
15
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
16
|
+
|
|
15
17
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
18
|
|
|
17
19
|
var RelayObservable = require('../network/RelayObservable');
|
|
@@ -31,7 +33,7 @@ var RelayReplaySubject = /*#__PURE__*/function () {
|
|
|
31
33
|
(0, _defineProperty2["default"])(this, "_complete", false);
|
|
32
34
|
(0, _defineProperty2["default"])(this, "_events", []);
|
|
33
35
|
(0, _defineProperty2["default"])(this, "_sinks", new Set());
|
|
34
|
-
(0, _defineProperty2["default"])(this, "_subscription",
|
|
36
|
+
(0, _defineProperty2["default"])(this, "_subscription", []);
|
|
35
37
|
this._observable = RelayObservable.create(function (sink) {
|
|
36
38
|
_this._sinks.add(sink);
|
|
37
39
|
|
|
@@ -121,16 +123,29 @@ var RelayReplaySubject = /*#__PURE__*/function () {
|
|
|
121
123
|
};
|
|
122
124
|
|
|
123
125
|
_proto.subscribe = function subscribe(observer) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
+
var subscription = this._observable.subscribe(observer);
|
|
127
|
+
|
|
128
|
+
this._subscription.push(subscription);
|
|
129
|
+
|
|
130
|
+
return subscription;
|
|
126
131
|
};
|
|
127
132
|
|
|
128
133
|
_proto.unsubscribe = function unsubscribe() {
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(this._subscription),
|
|
135
|
+
_step;
|
|
131
136
|
|
|
132
|
-
|
|
137
|
+
try {
|
|
138
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
139
|
+
var subscription = _step.value;
|
|
140
|
+
subscription.unsubscribe();
|
|
141
|
+
}
|
|
142
|
+
} catch (err) {
|
|
143
|
+
_iterator.e(err);
|
|
144
|
+
} finally {
|
|
145
|
+
_iterator.f();
|
|
133
146
|
}
|
|
147
|
+
|
|
148
|
+
this._subscription = [];
|
|
134
149
|
};
|
|
135
150
|
|
|
136
151
|
_proto.getObserverCount = function getObserverCount() {
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
* @emails oncall+relay
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
var getRefetchMetadata = require('./getRefetchMetadata');
|
|
15
|
+
|
|
16
|
+
var invariant = require('invariant');
|
|
17
|
+
|
|
18
|
+
function getPaginationMetadata(fragmentNode, componentDisplayName) {
|
|
19
|
+
var _fragmentNode$metadat, _fragmentNode$metadat2;
|
|
20
|
+
|
|
21
|
+
var _getRefetchMetadata = getRefetchMetadata(fragmentNode, componentDisplayName),
|
|
22
|
+
paginationRequest = _getRefetchMetadata.refetchableRequest,
|
|
23
|
+
refetchMetadata = _getRefetchMetadata.refetchMetadata;
|
|
24
|
+
|
|
25
|
+
var paginationMetadata = refetchMetadata.connection;
|
|
26
|
+
!(paginationMetadata != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getPaginationMetadata(): Expected fragment `%s` to include a ' + 'connection when using `%s`. Did you forget to add a @connection ' + 'directive to the connection field in the fragment?', componentDisplayName, fragmentNode.name) : invariant(false) : void 0;
|
|
27
|
+
var connectionPathInFragmentData = paginationMetadata.path;
|
|
28
|
+
var connectionMetadata = ((_fragmentNode$metadat = (_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.connection) !== null && _fragmentNode$metadat !== void 0 ? _fragmentNode$metadat : [])[0];
|
|
29
|
+
!(connectionMetadata != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getPaginationMetadata(): Expected fragment `%s` to include a ' + 'connection when using `%s`. Did you forget to add a @connection ' + 'directive to the connection field in the fragment?', componentDisplayName, fragmentNode.name) : invariant(false) : void 0;
|
|
30
|
+
var identifierField = refetchMetadata.identifierField;
|
|
31
|
+
!(identifierField == null || typeof identifierField === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getRefetchMetadata(): Expected `identifierField` to be a string.') : invariant(false) : void 0;
|
|
32
|
+
return {
|
|
33
|
+
connectionPathInFragmentData: connectionPathInFragmentData,
|
|
34
|
+
identifierField: identifierField,
|
|
35
|
+
paginationRequest: paginationRequest,
|
|
36
|
+
paginationMetadata: paginationMetadata,
|
|
37
|
+
stream: connectionMetadata.stream === true
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = getPaginationMetadata;
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
* @emails oncall+relay
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
15
|
+
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
|
|
18
|
+
var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
19
|
+
|
|
20
|
+
var invariant = require('invariant');
|
|
21
|
+
|
|
22
|
+
var warning = require("fbjs/lib/warning");
|
|
23
|
+
|
|
24
|
+
function getPaginationVariables(direction, count, cursor, baseVariables, extraVariables, paginationMetadata) {
|
|
25
|
+
var _objectSpread3;
|
|
26
|
+
|
|
27
|
+
var backwardMetadata = paginationMetadata.backward,
|
|
28
|
+
forwardMetadata = paginationMetadata.forward;
|
|
29
|
+
|
|
30
|
+
if (direction === 'backward') {
|
|
31
|
+
var _objectSpread2;
|
|
32
|
+
|
|
33
|
+
!(backwardMetadata != null && backwardMetadata.count != null && backwardMetadata.cursor != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected backward pagination metadata to be available. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
34
|
+
process.env.NODE_ENV !== "production" ? warning(!extraVariables.hasOwnProperty(backwardMetadata.cursor), 'Relay: `UNSTABLE_extraVariables` provided by caller should not ' + 'contain cursor variable `%s`. This variable is automatically ' + 'determined by Relay.', backwardMetadata.cursor) : void 0;
|
|
35
|
+
process.env.NODE_ENV !== "production" ? warning(!extraVariables.hasOwnProperty(backwardMetadata.count), 'Relay: `UNSTABLE_extraVariables` provided by caller should not ' + 'contain count variable `%s`. This variable is automatically ' + 'determined by Relay.', backwardMetadata.count) : void 0; // $FlowFixMe[cannot-spread-interface]
|
|
36
|
+
|
|
37
|
+
var _paginationVariables = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, baseVariables), extraVariables), {}, (_objectSpread2 = {}, (0, _defineProperty2["default"])(_objectSpread2, backwardMetadata.cursor, cursor), (0, _defineProperty2["default"])(_objectSpread2, backwardMetadata.count, count), _objectSpread2));
|
|
38
|
+
|
|
39
|
+
if (forwardMetadata && forwardMetadata.cursor) {
|
|
40
|
+
_paginationVariables[forwardMetadata.cursor] = null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (forwardMetadata && forwardMetadata.count) {
|
|
44
|
+
_paginationVariables[forwardMetadata.count] = null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return _paginationVariables;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
!(forwardMetadata != null && forwardMetadata.count != null && forwardMetadata.cursor != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected forward pagination metadata to be available. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
51
|
+
process.env.NODE_ENV !== "production" ? warning(!extraVariables.hasOwnProperty(forwardMetadata.cursor), 'Relay: `UNSTABLE_extraVariables` provided by caller should not ' + 'contain cursor variable `%s`. This variable is automatically ' + 'determined by Relay.', forwardMetadata.cursor) : void 0;
|
|
52
|
+
process.env.NODE_ENV !== "production" ? warning(!extraVariables.hasOwnProperty(forwardMetadata.count), 'Relay: `UNSTABLE_extraVariables` provided by caller should not ' + 'contain count variable `%s`. This variable is automatically ' + 'determined by Relay.', forwardMetadata.count) : void 0; // $FlowFixMe[cannot-spread-interface]
|
|
53
|
+
|
|
54
|
+
var paginationVariables = (0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, baseVariables), extraVariables), {}, (_objectSpread3 = {}, (0, _defineProperty2["default"])(_objectSpread3, forwardMetadata.cursor, cursor), (0, _defineProperty2["default"])(_objectSpread3, forwardMetadata.count, count), _objectSpread3));
|
|
55
|
+
|
|
56
|
+
if (backwardMetadata && backwardMetadata.cursor) {
|
|
57
|
+
paginationVariables[backwardMetadata.cursor] = null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (backwardMetadata && backwardMetadata.count) {
|
|
61
|
+
paginationVariables[backwardMetadata.count] = null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return paginationVariables;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = getPaginationVariables;
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
* @emails oncall+relay
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
var _require = require('../query/fetchQueryInternal'),
|
|
15
|
+
getPromiseForActiveRequest = _require.getPromiseForActiveRequest;
|
|
16
|
+
|
|
17
|
+
function getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner) {
|
|
18
|
+
var _pendingOperations$ma, _pendingOperations;
|
|
19
|
+
|
|
20
|
+
var pendingOperations = [];
|
|
21
|
+
var promise = getPromiseForActiveRequest(environment, fragmentOwner);
|
|
22
|
+
|
|
23
|
+
if (promise != null) {
|
|
24
|
+
pendingOperations = [fragmentOwner];
|
|
25
|
+
} else {
|
|
26
|
+
var _result$pendingOperat, _result$promise;
|
|
27
|
+
|
|
28
|
+
var result = environment.getOperationTracker().getPendingOperationsAffectingOwner(fragmentOwner);
|
|
29
|
+
pendingOperations = (_result$pendingOperat = result === null || result === void 0 ? void 0 : result.pendingOperations) !== null && _result$pendingOperat !== void 0 ? _result$pendingOperat : [];
|
|
30
|
+
promise = (_result$promise = result === null || result === void 0 ? void 0 : result.promise) !== null && _result$promise !== void 0 ? _result$promise : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!promise) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var pendingOperationName = (_pendingOperations$ma = (_pendingOperations = pendingOperations) === null || _pendingOperations === void 0 ? void 0 : _pendingOperations.map(function (op) {
|
|
38
|
+
return op.node.params.name;
|
|
39
|
+
}).join(',')) !== null && _pendingOperations$ma !== void 0 ? _pendingOperations$ma : null;
|
|
40
|
+
|
|
41
|
+
if (pendingOperationName == null || pendingOperationName.length === 0) {
|
|
42
|
+
pendingOperationName = 'Unknown pending operation';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var fragmentName = fragmentNode.name;
|
|
46
|
+
var promiseDisplayName = pendingOperationName === fragmentName ? "Relay(".concat(pendingOperationName, ")") : "Relay(".concat(pendingOperationName, ":").concat(fragmentName, ")"); // $FlowExpectedError[prop-missing] Expando to annotate Promises.
|
|
47
|
+
|
|
48
|
+
promise.displayName = promiseDisplayName;
|
|
49
|
+
return {
|
|
50
|
+
promise: promise,
|
|
51
|
+
pendingOperations: pendingOperations
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = getPendingOperationsForFragment;
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
* @emails oncall+relay
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
var invariant = require('invariant');
|
|
15
|
+
|
|
16
|
+
function getRefetchMetadata(fragmentNode, componentDisplayName) {
|
|
17
|
+
var _fragmentNode$metadat, _fragmentNode$metadat2;
|
|
18
|
+
|
|
19
|
+
!(((_fragmentNode$metadat = fragmentNode.metadata) === null || _fragmentNode$metadat === void 0 ? void 0 : _fragmentNode$metadat.plural) !== true) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getRefetchMetadata(): Expected fragment `%s` not to be plural when using ' + '`%s`. Remove `@relay(plural: true)` from fragment `%s` ' + 'in order to use it with `%s`.', fragmentNode.name, componentDisplayName, fragmentNode.name, componentDisplayName) : invariant(false) : void 0;
|
|
20
|
+
var refetchMetadata = (_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.refetch;
|
|
21
|
+
!(refetchMetadata != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getRefetchMetadata(): Expected fragment `%s` to be refetchable when using `%s`. ' + 'Did you forget to add a @refetchable directive to the fragment?', componentDisplayName, fragmentNode.name) : invariant(false) : void 0; // handle both commonjs and es modules
|
|
22
|
+
|
|
23
|
+
var refetchableRequest = refetchMetadata.operation["default"] ? refetchMetadata.operation["default"] : refetchMetadata.operation;
|
|
24
|
+
var fragmentRefPathInResponse = refetchMetadata.fragmentPathInResult;
|
|
25
|
+
!(typeof refetchableRequest !== 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getRefetchMetadata(): Expected refetch query to be an ' + "operation and not a string when using `%s`. If you're seeing this, " + 'this is likely a bug in Relay.', componentDisplayName) : invariant(false) : void 0;
|
|
26
|
+
var identifierField = refetchMetadata.identifierField;
|
|
27
|
+
!(identifierField == null || typeof identifierField === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: getRefetchMetadata(): Expected `identifierField` to be a string.') : invariant(false) : void 0;
|
|
28
|
+
return {
|
|
29
|
+
fragmentRefPathInResponse: fragmentRefPathInResponse,
|
|
30
|
+
identifierField: identifierField,
|
|
31
|
+
refetchableRequest: refetchableRequest,
|
|
32
|
+
refetchMetadata: refetchMetadata
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = getRefetchMetadata;
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
* @emails oncall+relay
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
15
|
+
|
|
16
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
17
|
+
|
|
18
|
+
var invariant = require('invariant');
|
|
19
|
+
|
|
20
|
+
function getValueAtPath(data, path) {
|
|
21
|
+
var result = data;
|
|
22
|
+
|
|
23
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(path),
|
|
24
|
+
_step;
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
28
|
+
var key = _step.value;
|
|
29
|
+
|
|
30
|
+
if (result == null) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (typeof key === 'number') {
|
|
35
|
+
!Array.isArray(result) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected an array when extracting value at path. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
36
|
+
result = result[key];
|
|
37
|
+
} else {
|
|
38
|
+
!(typeof result === 'object' && !Array.isArray(result)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected an object when extracting value at path. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
39
|
+
result = result[key];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
_iterator.e(err);
|
|
44
|
+
} finally {
|
|
45
|
+
_iterator.f();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = getValueAtPath;
|