relay-runtime 11.0.0-rc.0 → 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/handlers/connection/ConnectionHandler.js.flow +7 -0
- package/handlers/connection/MutationHandlers.js.flow +28 -0
- package/index.js +1 -1
- package/index.js.flow +20 -3
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +12 -6
- package/lib/handlers/connection/MutationHandlers.js +67 -8
- package/lib/index.js +15 -0
- package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +148 -0
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +406 -0
- package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
- package/lib/multi-actor-environment/index.js +21 -0
- package/lib/mutations/RelayRecordProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceMutator.js +1 -1
- package/lib/mutations/RelayRecordSourceProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +7 -2
- package/lib/mutations/applyOptimisticMutation.js +1 -1
- package/lib/mutations/commitMutation.js +5 -2
- package/lib/mutations/validateMutation.js +39 -17
- package/lib/network/RelayNetwork.js +1 -1
- package/lib/network/RelayObservable.js +3 -1
- package/lib/network/RelayQueryResponseCache.js +20 -3
- package/lib/network/wrapNetworkWithLogObserver.js +78 -0
- package/lib/query/GraphQLTag.js +1 -1
- package/lib/query/fetchQuery.js +1 -1
- package/lib/query/fetchQueryInternal.js +1 -1
- package/lib/store/DataChecker.js +132 -50
- package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +524 -187
- package/lib/store/RelayConcreteVariables.js +29 -4
- package/lib/store/RelayModernEnvironment.js +137 -220
- package/lib/store/RelayModernFragmentSpecResolver.js +49 -23
- package/lib/store/RelayModernRecord.js +36 -2
- package/lib/store/RelayModernSelector.js +1 -1
- package/lib/store/RelayModernStore.js +53 -22
- package/lib/store/RelayOperationTracker.js +34 -24
- package/lib/store/RelayPublishQueue.js +30 -8
- package/lib/store/RelayReader.js +177 -29
- package/lib/store/RelayRecordSource.js +87 -3
- package/lib/store/RelayReferenceMarker.js +53 -28
- package/lib/store/RelayResponseNormalizer.js +247 -108
- package/lib/store/RelayStoreReactFlightUtils.js +7 -11
- package/lib/store/RelayStoreSubscriptions.js +8 -5
- package/lib/store/RelayStoreUtils.js +10 -4
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +57 -0
- package/lib/store/cloneRelayHandleSourceField.js +1 -1
- package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
- package/lib/store/createRelayContext.js +2 -2
- package/lib/store/defaultGetDataID.js +3 -1
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +32 -6
- package/lib/util/RelayConcreteNode.js +3 -0
- package/lib/util/RelayFeatureFlags.js +5 -4
- package/lib/util/RelayProfiler.js +17 -187
- package/lib/util/RelayReplaySubject.js +22 -7
- package/lib/util/deepFreeze.js +1 -0
- 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/getRelayHandleKey.js +1 -1
- package/lib/util/getRequestIdentifier.js +1 -1
- 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 +217 -0
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +485 -0
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +245 -0
- package/multi-actor-environment/index.js.flow +27 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
- package/mutations/commitMutation.js.flow +3 -1
- package/mutations/validateMutation.js.flow +42 -16
- package/network/RelayNetworkTypes.js.flow +17 -8
- package/network/RelayObservable.js.flow +2 -0
- package/network/RelayQueryResponseCache.js.flow +31 -17
- package/network/wrapNetworkWithLogObserver.js.flow +99 -0
- package/package.json +3 -2
- 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 +148 -44
- package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +578 -237
- package/store/RelayConcreteVariables.js.flow +31 -1
- package/store/RelayModernEnvironment.js.flow +132 -220
- 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 +57 -17
- package/store/RelayOperationTracker.js.flow +56 -34
- package/store/RelayPublishQueue.js.flow +37 -11
- package/store/RelayReader.js.flow +186 -27
- package/store/RelayRecordSource.js.flow +72 -6
- package/store/RelayReferenceMarker.js.flow +51 -21
- package/store/RelayResponseNormalizer.js.flow +251 -67
- package/store/RelayStoreReactFlightUtils.js.flow +6 -9
- package/store/RelayStoreSubscriptions.js.flow +10 -3
- package/store/RelayStoreTypes.js.flow +144 -21
- package/store/RelayStoreUtils.js.flow +19 -4
- package/store/ResolverCache.js.flow +247 -0
- package/store/ResolverFragments.js.flow +128 -0
- package/store/createRelayContext.js.flow +1 -1
- package/store/defaultGetDataID.js.flow +3 -1
- package/subscription/requestSubscription.js.flow +43 -8
- package/util/NormalizationNode.js.flow +16 -3
- package/util/ReaderNode.js.flow +29 -2
- package/util/RelayConcreteNode.js.flow +3 -0
- package/util/RelayFeatureFlags.js.flow +10 -6
- package/util/RelayProfiler.js.flow +22 -194
- package/util/RelayReplaySubject.js.flow +7 -6
- package/util/RelayRuntimeTypes.js.flow +4 -2
- package/util/deepFreeze.js.flow +2 -1
- 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 +2 -1
- 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
|
@@ -21,9 +21,10 @@ var hasOverlappingIDs = require('./hasOverlappingIDs');
|
|
|
21
21
|
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
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
|
|
|
@@ -101,12 +104,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
101
104
|
};
|
|
102
105
|
|
|
103
106
|
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
|
|
104
|
-
var
|
|
107
|
+
var _this3 = this;
|
|
105
108
|
|
|
106
109
|
var hasUpdatedRecords = updatedRecordIDs.size !== 0;
|
|
107
110
|
|
|
108
111
|
this._subscriptions.forEach(function (subscription) {
|
|
109
|
-
var owner =
|
|
112
|
+
var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
|
|
110
113
|
|
|
111
114
|
if (owner != null) {
|
|
112
115
|
updatedOwners.push(owner);
|
|
@@ -134,7 +137,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
134
137
|
return;
|
|
135
138
|
}
|
|
136
139
|
|
|
137
|
-
var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
|
|
140
|
+
var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
|
|
138
141
|
var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
|
|
139
142
|
nextSnapshot = {
|
|
140
143
|
data: nextData,
|
|
@@ -18,7 +18,7 @@ var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
|
18
18
|
|
|
19
19
|
var getRelayHandleKey = require('../util/getRelayHandleKey');
|
|
20
20
|
|
|
21
|
-
var invariant = require(
|
|
21
|
+
var invariant = require('invariant');
|
|
22
22
|
|
|
23
23
|
var stableCopy = require('../util/stableCopy');
|
|
24
24
|
|
|
@@ -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
|
/**
|
|
@@ -175,7 +175,8 @@ function formatStorageKey(name, argValues) {
|
|
|
175
175
|
|
|
176
176
|
|
|
177
177
|
function getStableVariableValue(name, variables) {
|
|
178
|
-
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
|
|
178
|
+
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
|
|
179
|
+
|
|
179
180
|
return stableCopy(variables[name]);
|
|
180
181
|
}
|
|
181
182
|
|
|
@@ -192,6 +193,7 @@ function getModuleOperationKey(documentName) {
|
|
|
192
193
|
|
|
193
194
|
|
|
194
195
|
var RelayStoreUtils = {
|
|
196
|
+
ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
|
|
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 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
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
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 invariant = require('invariant');
|
|
14
|
+
|
|
15
|
+
var _require = require('../query/GraphQLTag'),
|
|
16
|
+
getFragment = _require.getFragment;
|
|
17
|
+
|
|
18
|
+
var _require2 = require('./RelayModernSelector'),
|
|
19
|
+
getSelector = _require2.getSelector;
|
|
20
|
+
|
|
21
|
+
var contextStack = [];
|
|
22
|
+
|
|
23
|
+
function withResolverContext(context, cb) {
|
|
24
|
+
contextStack.push(context);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
return cb();
|
|
28
|
+
} finally {
|
|
29
|
+
contextStack.pop();
|
|
30
|
+
}
|
|
31
|
+
} // NOTE: these declarations are copied from 'useFragment'; it would be good
|
|
32
|
+
// to figure out how to share the same type signature between the two functions.
|
|
33
|
+
// The declarations ensure that the type of the returned data is:
|
|
34
|
+
// - non-nullable if the provided ref type is non-nullable
|
|
35
|
+
// - nullable if the provided ref type is nullable
|
|
36
|
+
// - array of non-nullable if the privoided ref type is an array of
|
|
37
|
+
// non-nullable refs
|
|
38
|
+
// - array of nullable if the privoided ref type is an array of nullable refs
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
function readFragment(fragmentInput, fragmentRef) {
|
|
42
|
+
if (!contextStack.length) {
|
|
43
|
+
throw new Error('readFragment should be called only from within a Relay Resolver function.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var context = contextStack[contextStack.length - 1];
|
|
47
|
+
var fragmentNode = getFragment(fragmentInput);
|
|
48
|
+
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
|
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
|
+
!(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, fragmentRef);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
readFragment: readFragment,
|
|
56
|
+
withResolverContext: withResolverContext
|
|
57
|
+
};
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require(
|
|
13
|
+
var invariant = require('invariant');
|
|
14
14
|
|
|
15
15
|
var relayContext;
|
|
16
16
|
var firstReact;
|
|
@@ -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
|
|
|
@@ -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,7 +10,7 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require(
|
|
13
|
+
var invariant = require('invariant');
|
|
14
14
|
|
|
15
15
|
var _require = require('../query/GraphQLTag'),
|
|
16
16
|
getInlineDataFragment = _require.getInlineDataFragment;
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
|
|
13
13
|
var RelayDeclarativeMutationConfig = require('../mutations/RelayDeclarativeMutationConfig');
|
|
14
14
|
|
|
15
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
16
|
+
|
|
15
17
|
var warning = require("fbjs/lib/warning");
|
|
16
18
|
|
|
17
19
|
var _require = require('../query/GraphQLTag'),
|
|
@@ -20,6 +22,9 @@ var _require = require('../query/GraphQLTag'),
|
|
|
20
22
|
var _require2 = require('../store/RelayModernOperationDescriptor'),
|
|
21
23
|
createOperationDescriptor = _require2.createOperationDescriptor;
|
|
22
24
|
|
|
25
|
+
var _require3 = require('../store/RelayModernSelector'),
|
|
26
|
+
createReaderSelector = _require3.createReaderSelector;
|
|
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
51
|
var sub = environment.execute({
|
|
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,9 @@
|
|
|
24
24
|
* for local caching.
|
|
25
25
|
*/
|
|
26
26
|
var RelayConcreteNode = {
|
|
27
|
+
ACTOR_CHANGE: 'ActorChange',
|
|
27
28
|
CONDITION: 'Condition',
|
|
29
|
+
CLIENT_COMPONENT: 'ClientComponent',
|
|
28
30
|
CLIENT_EXTENSION: 'ClientExtension',
|
|
29
31
|
DEFER: 'Defer',
|
|
30
32
|
CONNECTION: 'Connection',
|
|
@@ -40,6 +42,7 @@ var RelayConcreteNode = {
|
|
|
40
42
|
LIST_VALUE: 'ListValue',
|
|
41
43
|
LOCAL_ARGUMENT: 'LocalArgument',
|
|
42
44
|
MODULE_IMPORT: 'ModuleImport',
|
|
45
|
+
RELAY_RESOLVER: 'RelayResolver',
|
|
43
46
|
REQUIRED_FIELD: 'RequiredField',
|
|
44
47
|
OBJECT_VALUE: 'ObjectValue',
|
|
45
48
|
OPERATION: 'Operation',
|
|
@@ -13,15 +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,
|
|
18
|
+
ENABLE_RELAY_RESOLVERS: false,
|
|
20
19
|
ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
|
|
21
20
|
ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
|
|
22
|
-
ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
|
|
23
21
|
ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
|
|
24
22
|
ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
|
|
25
|
-
ENABLE_NOTIFY_SUBSCRIPTION: false
|
|
23
|
+
ENABLE_NOTIFY_SUBSCRIPTION: false,
|
|
24
|
+
BATCH_ASYNC_MODULE_UPDATES_FN: null,
|
|
25
|
+
ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT: false,
|
|
26
|
+
ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT: false
|
|
26
27
|
};
|
|
27
28
|
module.exports = RelayFeatureFlags;
|