relay-runtime 11.0.2 → 13.0.0-rc.2
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/README.md +67 -0
- package/handlers/RelayDefaultHandlerProvider.js.flow +3 -3
- package/handlers/connection/ConnectionHandler.js.flow +9 -18
- package/handlers/connection/ConnectionInterface.js.flow +1 -1
- package/handlers/connection/MutationHandlers.js.flow +8 -12
- package/index.js +1 -1
- package/index.js.flow +57 -35
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +13 -19
- package/lib/handlers/connection/ConnectionInterface.js +1 -1
- package/lib/handlers/connection/MutationHandlers.js +4 -7
- package/lib/index.js +59 -44
- package/lib/multi-actor-environment/ActorIdentifier.js +12 -2
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +64 -20
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +324 -61
- package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +1 -1
- package/lib/multi-actor-environment/index.js +6 -2
- package/lib/mutations/RelayDeclarativeMutationConfig.js +5 -2
- package/lib/mutations/RelayRecordProxy.js +4 -3
- package/lib/mutations/RelayRecordSourceMutator.js +4 -3
- package/lib/mutations/RelayRecordSourceProxy.js +13 -5
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +19 -6
- package/lib/mutations/applyOptimisticMutation.js +7 -7
- package/lib/mutations/commitLocalUpdate.js +1 -1
- package/lib/mutations/commitMutation.js +15 -11
- package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +242 -0
- package/lib/mutations/validateMutation.js +11 -6
- package/lib/network/ConvertToExecuteFunction.js +3 -2
- package/lib/network/RelayNetwork.js +4 -3
- package/lib/network/RelayNetworkTypes.js +1 -1
- package/lib/network/RelayObservable.js +1 -1
- package/lib/network/RelayQueryResponseCache.js +22 -6
- package/lib/network/wrapNetworkWithLogObserver.js +79 -0
- package/lib/query/GraphQLTag.js +3 -2
- package/lib/query/PreloadableQueryRegistry.js +1 -1
- package/lib/query/fetchQuery.js +7 -6
- package/lib/query/fetchQueryInternal.js +1 -1
- package/lib/query/fetchQuery_DEPRECATED.js +3 -2
- package/lib/store/ClientID.js +8 -2
- package/lib/store/DataChecker.js +124 -55
- package/lib/store/OperationExecutor.js +489 -215
- package/lib/store/RelayConcreteVariables.js +27 -9
- package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
- package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
- package/lib/store/RelayModernEnvironment.js +100 -120
- package/lib/store/RelayModernFragmentSpecResolver.js +53 -27
- package/lib/store/RelayModernOperationDescriptor.js +3 -2
- package/lib/store/RelayModernRecord.js +48 -13
- package/lib/store/RelayModernSelector.js +15 -9
- package/lib/store/RelayModernStore.js +56 -23
- package/lib/store/RelayOperationTracker.js +34 -24
- package/lib/store/RelayOptimisticRecordSource.js +1 -1
- package/lib/store/RelayPublishQueue.js +35 -11
- package/lib/store/RelayReader.js +257 -72
- package/lib/store/RelayRecordSource.js +88 -4
- package/lib/store/RelayRecordState.js +1 -1
- package/lib/store/RelayReferenceMarker.js +34 -22
- package/lib/store/RelayResponseNormalizer.js +172 -96
- package/lib/store/RelayStoreReactFlightUtils.js +5 -11
- package/lib/store/RelayStoreSubscriptions.js +15 -10
- package/lib/store/RelayStoreTypes.js +1 -1
- package/lib/store/RelayStoreUtils.js +13 -8
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +10 -6
- package/lib/store/StoreInspector.js +1 -1
- package/lib/store/TypeID.js +1 -1
- package/lib/store/ViewerPattern.js +1 -1
- package/lib/store/cloneRelayHandleSourceField.js +6 -5
- package/lib/store/cloneRelayScalarHandleSourceField.js +6 -5
- package/lib/store/createFragmentSpecResolver.js +1 -1
- package/lib/store/createRelayContext.js +5 -3
- package/lib/store/defaultGetDataID.js +1 -1
- package/lib/store/defaultRequiredFieldLogger.js +1 -1
- package/lib/store/hasOverlappingIDs.js +1 -1
- package/lib/store/isRelayModernEnvironment.js +1 -1
- package/lib/store/normalizeRelayPayload.js +1 -1
- package/lib/store/readInlineData.js +7 -3
- package/lib/subscription/requestSubscription.js +32 -34
- package/lib/util/JSResourceTypes.flow.js +1 -1
- package/lib/util/NormalizationNode.js +1 -1
- package/lib/util/ReaderNode.js +1 -1
- package/lib/util/RelayConcreteNode.js +3 -1
- package/lib/util/RelayDefaultHandleKey.js +1 -1
- package/lib/util/RelayError.js +1 -1
- package/lib/util/RelayFeatureFlags.js +10 -7
- package/lib/util/RelayProfiler.js +1 -1
- package/lib/util/RelayReplaySubject.js +22 -7
- package/lib/util/RelayRuntimeTypes.js +1 -7
- package/lib/util/StringInterner.js +71 -0
- package/lib/util/createPayloadFor3DField.js +1 -1
- package/lib/util/deepFreeze.js +1 -1
- package/lib/util/generateID.js +1 -1
- package/lib/util/getAllRootVariables.js +29 -0
- package/lib/util/getFragmentIdentifier.js +16 -8
- package/lib/util/getOperation.js +3 -2
- 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 +3 -3
- package/lib/util/getRequestIdentifier.js +3 -3
- package/lib/util/getValueAtPath.js +51 -0
- package/lib/util/isEmptyObject.js +2 -2
- package/lib/util/isPromise.js +1 -1
- package/lib/util/isScalarAndEqual.js +1 -1
- package/lib/util/recycleNodesInto.js +1 -1
- package/lib/util/registerEnvironmentWithDevTools.js +26 -0
- package/lib/util/reportMissingRequiredFields.js +1 -1
- package/lib/util/resolveImmediate.js +1 -1
- package/lib/util/stableCopy.js +1 -1
- package/lib/util/withDuration.js +31 -0
- package/multi-actor-environment/ActorIdentifier.js.flow +18 -2
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +94 -58
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +366 -93
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +88 -23
- package/multi-actor-environment/index.js.flow +3 -1
- package/mutations/RelayDeclarativeMutationConfig.js.flow +33 -27
- package/mutations/RelayRecordProxy.js.flow +5 -6
- package/mutations/RelayRecordSourceMutator.js.flow +5 -7
- package/mutations/RelayRecordSourceProxy.js.flow +20 -11
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +23 -8
- package/mutations/applyOptimisticMutation.js.flow +14 -15
- package/mutations/commitLocalUpdate.js.flow +2 -2
- package/mutations/commitMutation.js.flow +36 -47
- package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +318 -0
- package/mutations/validateMutation.js.flow +27 -17
- package/network/ConvertToExecuteFunction.js.flow +3 -3
- package/network/RelayNetwork.js.flow +5 -6
- package/network/RelayNetworkTypes.js.flow +1 -1
- package/network/RelayObservable.js.flow +2 -2
- package/network/RelayQueryResponseCache.js.flow +35 -22
- package/network/wrapNetworkWithLogObserver.js.flow +99 -0
- package/package.json +2 -2
- package/query/GraphQLTag.js.flow +11 -11
- package/query/PreloadableQueryRegistry.js.flow +5 -3
- package/query/fetchQuery.js.flow +19 -19
- package/query/fetchQueryInternal.js.flow +7 -10
- package/query/fetchQuery_DEPRECATED.js.flow +7 -7
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +15 -4
- package/store/DataChecker.js.flow +142 -60
- package/store/OperationExecutor.js.flow +575 -320
- package/store/RelayConcreteVariables.js.flow +28 -9
- package/store/RelayExperimentalGraphResponseHandler.js.flow +121 -0
- package/store/RelayExperimentalGraphResponseTransform.js.flow +470 -0
- package/store/RelayModernEnvironment.js.flow +91 -115
- package/store/RelayModernFragmentSpecResolver.js.flow +56 -32
- package/store/RelayModernOperationDescriptor.js.flow +13 -8
- package/store/RelayModernRecord.js.flow +68 -12
- package/store/RelayModernSelector.js.flow +25 -15
- package/store/RelayModernStore.js.flow +67 -32
- package/store/RelayOperationTracker.js.flow +60 -44
- package/store/RelayOptimisticRecordSource.js.flow +3 -3
- package/store/RelayPublishQueue.js.flow +74 -32
- package/store/RelayReader.js.flow +319 -100
- package/store/RelayRecordSource.js.flow +73 -7
- package/store/RelayRecordState.js.flow +1 -1
- package/store/RelayReferenceMarker.js.flow +41 -27
- package/store/RelayResponseNormalizer.js.flow +204 -86
- package/store/RelayStoreReactFlightUtils.js.flow +5 -12
- package/store/RelayStoreSubscriptions.js.flow +20 -12
- package/store/RelayStoreTypes.js.flow +200 -41
- package/store/RelayStoreUtils.js.flow +25 -12
- package/store/ResolverCache.js.flow +249 -0
- package/store/ResolverFragments.js.flow +16 -20
- package/store/StoreInspector.js.flow +3 -3
- package/store/TypeID.js.flow +2 -2
- package/store/ViewerPattern.js.flow +3 -3
- package/store/cloneRelayHandleSourceField.js.flow +6 -7
- package/store/cloneRelayScalarHandleSourceField.js.flow +6 -7
- package/store/createFragmentSpecResolver.js.flow +4 -5
- package/store/createRelayContext.js.flow +4 -4
- package/store/defaultGetDataID.js.flow +1 -1
- package/store/defaultRequiredFieldLogger.js.flow +1 -1
- package/store/hasOverlappingIDs.js.flow +1 -1
- package/store/isRelayModernEnvironment.js.flow +1 -1
- package/store/normalizeRelayPayload.js.flow +7 -8
- package/store/readInlineData.js.flow +8 -9
- package/subscription/requestSubscription.js.flow +55 -51
- package/util/JSResourceTypes.flow.js.flow +1 -1
- package/util/NormalizationNode.js.flow +11 -4
- package/util/ReaderNode.js.flow +25 -2
- package/util/RelayConcreteNode.js.flow +5 -1
- package/util/RelayDefaultHandleKey.js.flow +1 -1
- package/util/RelayError.js.flow +1 -1
- package/util/RelayFeatureFlags.js.flow +23 -15
- package/util/RelayProfiler.js.flow +1 -1
- package/util/RelayReplaySubject.js.flow +10 -10
- package/util/RelayRuntimeTypes.js.flow +70 -3
- package/util/StringInterner.js.flow +69 -0
- package/util/createPayloadFor3DField.js.flow +4 -4
- package/util/deepFreeze.js.flow +1 -1
- package/util/generateID.js.flow +1 -1
- package/util/getAllRootVariables.js.flow +36 -0
- package/util/getFragmentIdentifier.js.flow +28 -16
- package/util/getOperation.js.flow +3 -3
- package/util/getPaginationMetadata.js.flow +69 -0
- package/util/getPaginationVariables.js.flow +108 -0
- package/util/getPendingOperationsForFragment.js.flow +62 -0
- package/util/getRefetchMetadata.js.flow +76 -0
- package/util/getRelayHandleKey.js.flow +2 -3
- package/util/getRequestIdentifier.js.flow +4 -4
- package/util/getValueAtPath.js.flow +46 -0
- package/util/isEmptyObject.js.flow +2 -1
- package/util/isPromise.js.flow +1 -1
- package/util/isScalarAndEqual.js.flow +1 -1
- package/util/recycleNodesInto.js.flow +1 -1
- package/util/registerEnvironmentWithDevTools.js.flow +33 -0
- package/util/reportMissingRequiredFields.js.flow +1 -1
- package/util/resolveImmediate.js.flow +2 -2
- package/util/stableCopy.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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -10,21 +10,21 @@
|
|
|
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('invariant');
|
|
16
|
-
|
|
17
|
-
var warning = require("fbjs/lib/warning");
|
|
18
|
-
|
|
19
13
|
var _require = require('./RelayConcreteVariables'),
|
|
20
14
|
getFragmentVariables = _require.getFragmentVariables;
|
|
21
15
|
|
|
22
16
|
var _require2 = require('./RelayStoreUtils'),
|
|
17
|
+
CLIENT_EDGE_TRAVERSAL_PATH = _require2.CLIENT_EDGE_TRAVERSAL_PATH,
|
|
23
18
|
FRAGMENT_OWNER_KEY = _require2.FRAGMENT_OWNER_KEY,
|
|
24
19
|
FRAGMENTS_KEY = _require2.FRAGMENTS_KEY,
|
|
25
20
|
ID_KEY = _require2.ID_KEY,
|
|
26
21
|
IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require2.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT;
|
|
27
22
|
|
|
23
|
+
var areEqual = require("fbjs/lib/areEqual");
|
|
24
|
+
|
|
25
|
+
var invariant = require('invariant');
|
|
26
|
+
|
|
27
|
+
var warning = require("fbjs/lib/warning");
|
|
28
28
|
/**
|
|
29
29
|
* @public
|
|
30
30
|
*
|
|
@@ -54,18 +54,22 @@ var _require2 = require('./RelayStoreUtils'),
|
|
|
54
54
|
* const childData = environment.lookup(childSelector).data;
|
|
55
55
|
* ```
|
|
56
56
|
*/
|
|
57
|
+
|
|
58
|
+
|
|
57
59
|
function getSingularSelector(fragment, item) {
|
|
58
60
|
!(typeof item === 'object' && item !== null && !Array.isArray(item)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernSelector: Expected value for fragment `%s` to be an object, got ' + '`%s`.', fragment.name, JSON.stringify(item)) : invariant(false) : void 0;
|
|
59
61
|
var dataID = item[ID_KEY];
|
|
60
62
|
var fragments = item[FRAGMENTS_KEY];
|
|
61
63
|
var mixedOwner = item[FRAGMENT_OWNER_KEY];
|
|
62
64
|
var isWithinUnmatchedTypeRefinement = item[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] === true;
|
|
65
|
+
var mixedClientEdgeTraversalPath = item[CLIENT_EDGE_TRAVERSAL_PATH];
|
|
63
66
|
|
|
64
|
-
if (typeof dataID === 'string' && typeof fragments === 'object' && fragments !== null && typeof fragments[fragment.name] === 'object' && fragments[fragment.name] !== null && typeof mixedOwner === 'object' && mixedOwner !== null) {
|
|
67
|
+
if (typeof dataID === 'string' && typeof fragments === 'object' && fragments !== null && typeof fragments[fragment.name] === 'object' && fragments[fragment.name] !== null && typeof mixedOwner === 'object' && mixedOwner !== null && (mixedClientEdgeTraversalPath == null || Array.isArray(mixedClientEdgeTraversalPath))) {
|
|
65
68
|
var owner = mixedOwner;
|
|
69
|
+
var clientEdgeTraversalPath = mixedClientEdgeTraversalPath;
|
|
66
70
|
var argumentVariables = fragments[fragment.name];
|
|
67
71
|
var fragmentVariables = getFragmentVariables(fragment, owner.variables, argumentVariables);
|
|
68
|
-
return createReaderSelector(fragment, dataID, fragmentVariables, owner, isWithinUnmatchedTypeRefinement);
|
|
72
|
+
return createReaderSelector(fragment, dataID, fragmentVariables, owner, isWithinUnmatchedTypeRefinement, clientEdgeTraversalPath);
|
|
69
73
|
}
|
|
70
74
|
|
|
71
75
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -295,10 +299,12 @@ function areEqualSelectors(thisSelector, thatSelector) {
|
|
|
295
299
|
|
|
296
300
|
function createReaderSelector(fragment, dataID, variables, request) {
|
|
297
301
|
var isWithinUnmatchedTypeRefinement = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
302
|
+
var clientEdgeTraversalPath = arguments.length > 5 ? arguments[5] : undefined;
|
|
298
303
|
return {
|
|
299
304
|
kind: 'SingularReaderSelector',
|
|
300
305
|
dataID: dataID,
|
|
301
306
|
isWithinUnmatchedTypeRefinement: isWithinUnmatchedTypeRefinement,
|
|
307
|
+
clientEdgeTraversalPath: clientEdgeTraversalPath !== null && clientEdgeTraversalPath !== void 0 ? clientEdgeTraversalPath : null,
|
|
302
308
|
node: fragment,
|
|
303
309
|
variables: variables,
|
|
304
310
|
owner: request
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -16,10 +16,20 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
|
|
|
16
16
|
|
|
17
17
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
18
18
|
|
|
19
|
-
var
|
|
19
|
+
var _require = require('../multi-actor-environment/ActorIdentifier'),
|
|
20
|
+
INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
|
|
21
|
+
assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
|
|
22
|
+
|
|
23
|
+
var deepFreeze = require('../util/deepFreeze');
|
|
20
24
|
|
|
21
25
|
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
22
26
|
|
|
27
|
+
var resolveImmediate = require('../util/resolveImmediate');
|
|
28
|
+
|
|
29
|
+
var DataChecker = require('./DataChecker');
|
|
30
|
+
|
|
31
|
+
var defaultGetDataID = require('./defaultGetDataID');
|
|
32
|
+
|
|
23
33
|
var RelayModernRecord = require('./RelayModernRecord');
|
|
24
34
|
|
|
25
35
|
var RelayOptimisticRecordSource = require('./RelayOptimisticRecordSource');
|
|
@@ -32,22 +42,17 @@ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
|
|
|
32
42
|
|
|
33
43
|
var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
|
|
34
44
|
|
|
35
|
-
var RelayStoreSubscriptionsUsingMapByID = require('./RelayStoreSubscriptionsUsingMapByID');
|
|
36
|
-
|
|
37
45
|
var RelayStoreUtils = require('./RelayStoreUtils');
|
|
38
46
|
|
|
39
|
-
var
|
|
47
|
+
var _require2 = require('./RelayStoreUtils'),
|
|
48
|
+
ROOT_ID = _require2.ROOT_ID,
|
|
49
|
+
ROOT_TYPE = _require2.ROOT_TYPE;
|
|
40
50
|
|
|
41
|
-
var
|
|
51
|
+
var _require3 = require('./ResolverCache'),
|
|
52
|
+
RecordResolverCache = _require3.RecordResolverCache;
|
|
42
53
|
|
|
43
54
|
var invariant = require('invariant');
|
|
44
55
|
|
|
45
|
-
var resolveImmediate = require('../util/resolveImmediate');
|
|
46
|
-
|
|
47
|
-
var _require = require('./RelayStoreUtils'),
|
|
48
|
-
ROOT_ID = _require.ROOT_ID,
|
|
49
|
-
ROOT_TYPE = _require.ROOT_TYPE;
|
|
50
|
-
|
|
51
56
|
var DEFAULT_RELEASE_BUFFER_SIZE = 10;
|
|
52
57
|
/**
|
|
53
58
|
* @public
|
|
@@ -108,7 +113,10 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
108
113
|
this._releaseBuffer = [];
|
|
109
114
|
this._roots = new Map();
|
|
110
115
|
this._shouldScheduleGC = false;
|
|
111
|
-
this.
|
|
116
|
+
this._resolverCache = new RecordResolverCache(function () {
|
|
117
|
+
return _this._getMutableRecordSource();
|
|
118
|
+
});
|
|
119
|
+
this._storeSubscriptions = new RelayStoreSubscriptions(options === null || options === void 0 ? void 0 : options.log, this._resolverCache);
|
|
112
120
|
this._updatedRecordIDs = new Set();
|
|
113
121
|
this._shouldProcessClientComponents = options === null || options === void 0 ? void 0 : options.shouldProcessClientComponents;
|
|
114
122
|
initializeRecordSource(this._recordSource);
|
|
@@ -122,11 +130,19 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
122
130
|
return (_this$_optimisticSour = this._optimisticSource) !== null && _this$_optimisticSour !== void 0 ? _this$_optimisticSour : this._recordSource;
|
|
123
131
|
};
|
|
124
132
|
|
|
133
|
+
_proto._getMutableRecordSource = function _getMutableRecordSource() {
|
|
134
|
+
var _this$_optimisticSour2;
|
|
135
|
+
|
|
136
|
+
return (_this$_optimisticSour2 = this._optimisticSource) !== null && _this$_optimisticSour2 !== void 0 ? _this$_optimisticSour2 : this._recordSource;
|
|
137
|
+
};
|
|
138
|
+
|
|
125
139
|
_proto.check = function check(operation, options) {
|
|
126
|
-
var
|
|
140
|
+
var _options$handlers, _options$getSourceFor, _options$getTargetFor, _options$defaultActor;
|
|
127
141
|
|
|
128
142
|
var selector = operation.root;
|
|
129
|
-
|
|
143
|
+
|
|
144
|
+
var source = this._getMutableRecordSource();
|
|
145
|
+
|
|
130
146
|
var globalInvalidationEpoch = this._globalInvalidationEpoch;
|
|
131
147
|
|
|
132
148
|
var rootEntry = this._roots.get(operation.request.identifier);
|
|
@@ -135,7 +151,7 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
135
151
|
|
|
136
152
|
if (globalInvalidationEpoch != null) {
|
|
137
153
|
// If so, check if the operation we're checking was last written
|
|
138
|
-
// before or after invalidation
|
|
154
|
+
// before or after invalidation occurred.
|
|
139
155
|
if (operationLastWrittenAt == null || operationLastWrittenAt <= globalInvalidationEpoch) {
|
|
140
156
|
// If the operation was written /before/ global invalidation occurred,
|
|
141
157
|
// or if this operation has never been written to the store before,
|
|
@@ -147,9 +163,16 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
147
163
|
}
|
|
148
164
|
}
|
|
149
165
|
|
|
150
|
-
var target = (_options$target = options === null || options === void 0 ? void 0 : options.target) !== null && _options$target !== void 0 ? _options$target : source;
|
|
151
166
|
var handlers = (_options$handlers = options === null || options === void 0 ? void 0 : options.handlers) !== null && _options$handlers !== void 0 ? _options$handlers : [];
|
|
152
|
-
var
|
|
167
|
+
var getSourceForActor = (_options$getSourceFor = options === null || options === void 0 ? void 0 : options.getSourceForActor) !== null && _options$getSourceFor !== void 0 ? _options$getSourceFor : function (actorIdentifier) {
|
|
168
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
169
|
+
return source;
|
|
170
|
+
};
|
|
171
|
+
var getTargetForActor = (_options$getTargetFor = options === null || options === void 0 ? void 0 : options.getTargetForActor) !== null && _options$getTargetFor !== void 0 ? _options$getTargetFor : function (actorIdentifier) {
|
|
172
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
173
|
+
return source;
|
|
174
|
+
};
|
|
175
|
+
var operationAvailability = DataChecker.check(getSourceForActor, getTargetForActor, (_options$defaultActor = options === null || options === void 0 ? void 0 : options.defaultActorIdentifier) !== null && _options$defaultActor !== void 0 ? _options$defaultActor : INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE, selector, handlers, this._operationLoader, this._getDataID, this._shouldProcessClientComponents);
|
|
153
176
|
return getAvailabilityStatus(operationAvailability, operationLastWrittenAt, rootEntry === null || rootEntry === void 0 ? void 0 : rootEntry.fetchTime, this._queryCacheExpirationTime);
|
|
154
177
|
};
|
|
155
178
|
|
|
@@ -234,7 +257,7 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
234
257
|
|
|
235
258
|
_proto.lookup = function lookup(selector) {
|
|
236
259
|
var source = this.getSource();
|
|
237
|
-
var snapshot = RelayReader.read(source, selector);
|
|
260
|
+
var snapshot = RelayReader.read(source, selector, this._resolverCache);
|
|
238
261
|
|
|
239
262
|
if (process.env.NODE_ENV !== "production") {
|
|
240
263
|
deepFreeze(snapshot);
|
|
@@ -264,6 +287,14 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
264
287
|
this._globalInvalidationEpoch = this._currentWriteEpoch;
|
|
265
288
|
}
|
|
266
289
|
|
|
290
|
+
if (RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
|
|
291
|
+
// When a record is updated, we need to also handle records that depend on it,
|
|
292
|
+
// specifically Relay Resolver result records containing results based on the
|
|
293
|
+
// updated records. This both adds to updatedRecordIDs and invalidates any
|
|
294
|
+
// cached data as needed.
|
|
295
|
+
this._resolverCache.invalidateDataIDs(this._updatedRecordIDs);
|
|
296
|
+
}
|
|
297
|
+
|
|
267
298
|
var source = this.getSource();
|
|
268
299
|
var updatedOwners = [];
|
|
269
300
|
|
|
@@ -322,9 +353,8 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
322
353
|
};
|
|
323
354
|
|
|
324
355
|
_proto.publish = function publish(source, idsMarkedForInvalidation) {
|
|
325
|
-
var
|
|
356
|
+
var target = this._getMutableRecordSource();
|
|
326
357
|
|
|
327
|
-
var target = (_this$_optimisticSour3 = this._optimisticSource) !== null && _this$_optimisticSour3 !== void 0 ? _this$_optimisticSour3 : this._recordSource;
|
|
328
358
|
updateTargetFromSource(target, source, // We increment the current epoch at the end of the set of updates,
|
|
329
359
|
// in notify(). Here, we pass what will be the incremented value of
|
|
330
360
|
// the epoch to use to write to invalidated records.
|
|
@@ -375,6 +405,10 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
375
405
|
|
|
376
406
|
_proto.toJSON = function toJSON() {
|
|
377
407
|
return 'RelayModernStore()';
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
_proto.getEpoch = function getEpoch() {
|
|
411
|
+
return this._currentWriteEpoch;
|
|
378
412
|
} // Internal API
|
|
379
413
|
;
|
|
380
414
|
|
|
@@ -646,8 +680,7 @@ function updateTargetFromSource(target, source, currentWriteEpoch, idsMarkedForI
|
|
|
646
680
|
}
|
|
647
681
|
|
|
648
682
|
RelayModernRecord.setValue(nextRecord, RelayStoreUtils.INVALIDATED_AT_KEY, currentWriteEpoch);
|
|
649
|
-
invalidatedRecordIDs.add(dataID);
|
|
650
|
-
|
|
683
|
+
invalidatedRecordIDs.add(dataID);
|
|
651
684
|
target.set(dataID, nextRecord);
|
|
652
685
|
});
|
|
653
686
|
} // Update the target based on the changes present in source
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -18,9 +18,9 @@ var invariant = require('invariant');
|
|
|
18
18
|
|
|
19
19
|
var RelayOperationTracker = /*#__PURE__*/function () {
|
|
20
20
|
function RelayOperationTracker() {
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
21
|
+
this._ownersToPendingOperations = new Map();
|
|
22
|
+
this._pendingOperationsToOwners = new Map();
|
|
23
|
+
this._ownersToPendingPromise = new Map();
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Update the map of current processing operations with the set of
|
|
@@ -46,19 +46,19 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
46
46
|
var owner = _step.value;
|
|
47
47
|
var ownerIdentifier = owner.identifier;
|
|
48
48
|
|
|
49
|
-
var pendingOperationsAffectingOwner = this.
|
|
49
|
+
var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier);
|
|
50
50
|
|
|
51
51
|
if (pendingOperationsAffectingOwner != null) {
|
|
52
52
|
// In this case the `ownerIdentifier` already affected by some operations
|
|
53
53
|
// We just need to detect, is it the same operation that we already
|
|
54
54
|
// have in the list, or it's a new operation
|
|
55
55
|
if (!pendingOperationsAffectingOwner.has(pendingOperationIdentifier)) {
|
|
56
|
-
pendingOperationsAffectingOwner.
|
|
56
|
+
pendingOperationsAffectingOwner.set(pendingOperationIdentifier, pendingOperation);
|
|
57
57
|
newlyAffectedOwnersIdentifier.add(ownerIdentifier);
|
|
58
58
|
}
|
|
59
59
|
} else {
|
|
60
60
|
// This is a new `ownerIdentifier` that is affected by the operation
|
|
61
|
-
this.
|
|
61
|
+
this._ownersToPendingOperations.set(ownerIdentifier, new Map([[pendingOperationIdentifier, pendingOperation]]));
|
|
62
62
|
|
|
63
63
|
newlyAffectedOwnersIdentifier.add(ownerIdentifier);
|
|
64
64
|
}
|
|
@@ -73,10 +73,10 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
73
73
|
if (newlyAffectedOwnersIdentifier.size === 0) {
|
|
74
74
|
return;
|
|
75
75
|
} // But, if some owners were affected we need to add them to
|
|
76
|
-
// the `
|
|
76
|
+
// the `_pendingOperationsToOwners` set
|
|
77
77
|
|
|
78
78
|
|
|
79
|
-
var
|
|
79
|
+
var ownersAffectedByPendingOperation = this._pendingOperationsToOwners.get(pendingOperationIdentifier) || new Set();
|
|
80
80
|
|
|
81
81
|
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(newlyAffectedOwnersIdentifier),
|
|
82
82
|
_step2;
|
|
@@ -87,7 +87,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
87
87
|
|
|
88
88
|
this._resolveOwnerResolvers(_ownerIdentifier);
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
ownersAffectedByPendingOperation.add(_ownerIdentifier);
|
|
91
91
|
}
|
|
92
92
|
} catch (err) {
|
|
93
93
|
_iterator2.e(err);
|
|
@@ -95,7 +95,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
95
95
|
_iterator2.f();
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
this.
|
|
98
|
+
this._pendingOperationsToOwners.set(pendingOperationIdentifier, ownersAffectedByPendingOperation);
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
101
|
* Once pending operation is completed we need to remove it
|
|
@@ -106,7 +106,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
106
106
|
_proto.complete = function complete(pendingOperation) {
|
|
107
107
|
var pendingOperationIdentifier = pendingOperation.identifier;
|
|
108
108
|
|
|
109
|
-
var affectedOwnersIdentifier = this.
|
|
109
|
+
var affectedOwnersIdentifier = this._pendingOperationsToOwners.get(pendingOperationIdentifier);
|
|
110
110
|
|
|
111
111
|
if (affectedOwnersIdentifier == null) {
|
|
112
112
|
return;
|
|
@@ -125,7 +125,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
125
125
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
126
126
|
var ownerIdentifier = _step3.value;
|
|
127
127
|
|
|
128
|
-
var pendingOperationsAffectingOwner = this.
|
|
128
|
+
var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier);
|
|
129
129
|
|
|
130
130
|
if (!pendingOperationsAffectingOwner) {
|
|
131
131
|
continue;
|
|
@@ -155,7 +155,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
155
155
|
|
|
156
156
|
this._resolveOwnerResolvers(_ownerIdentifier2);
|
|
157
157
|
|
|
158
|
-
this.
|
|
158
|
+
this._ownersToPendingOperations["delete"](_ownerIdentifier2);
|
|
159
159
|
} // Update all ownerIdentifier that were updated by `pendingOperationIdentifier` but still
|
|
160
160
|
// are affected by other operations
|
|
161
161
|
|
|
@@ -181,30 +181,35 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
181
181
|
_iterator5.f();
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
this.
|
|
184
|
+
this._pendingOperationsToOwners["delete"](pendingOperationIdentifier);
|
|
185
185
|
};
|
|
186
186
|
|
|
187
187
|
_proto._resolveOwnerResolvers = function _resolveOwnerResolvers(ownerIdentifier) {
|
|
188
|
-
var promiseEntry = this.
|
|
188
|
+
var promiseEntry = this._ownersToPendingPromise.get(ownerIdentifier);
|
|
189
189
|
|
|
190
190
|
if (promiseEntry != null) {
|
|
191
191
|
promiseEntry.resolve();
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
this.
|
|
194
|
+
this._ownersToPendingPromise["delete"](ownerIdentifier);
|
|
195
195
|
};
|
|
196
196
|
|
|
197
|
-
_proto.
|
|
197
|
+
_proto.getPendingOperationsAffectingOwner = function getPendingOperationsAffectingOwner(owner) {
|
|
198
198
|
var ownerIdentifier = owner.identifier;
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
var pendingOperationsForOwner = this._ownersToPendingOperations.get(ownerIdentifier);
|
|
201
|
+
|
|
202
|
+
if (pendingOperationsForOwner == null || pendingOperationsForOwner.size === 0) {
|
|
201
203
|
return null;
|
|
202
204
|
}
|
|
203
205
|
|
|
204
|
-
var cachedPromiseEntry = this.
|
|
206
|
+
var cachedPromiseEntry = this._ownersToPendingPromise.get(ownerIdentifier);
|
|
205
207
|
|
|
206
208
|
if (cachedPromiseEntry != null) {
|
|
207
|
-
return
|
|
209
|
+
return {
|
|
210
|
+
promise: cachedPromiseEntry.promise,
|
|
211
|
+
pendingOperations: cachedPromiseEntry.pendingOperations
|
|
212
|
+
};
|
|
208
213
|
}
|
|
209
214
|
|
|
210
215
|
var resolve;
|
|
@@ -212,13 +217,18 @@ var RelayOperationTracker = /*#__PURE__*/function () {
|
|
|
212
217
|
resolve = r;
|
|
213
218
|
});
|
|
214
219
|
!(resolve != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayOperationTracker: Expected resolver to be defined. If you' + 'are seeing this, it is likely a bug in Relay.') : invariant(false) : void 0;
|
|
220
|
+
var pendingOperations = Array.from(pendingOperationsForOwner.values());
|
|
215
221
|
|
|
216
|
-
this.
|
|
222
|
+
this._ownersToPendingPromise.set(ownerIdentifier, {
|
|
217
223
|
promise: promise,
|
|
218
|
-
resolve: resolve
|
|
224
|
+
resolve: resolve,
|
|
225
|
+
pendingOperations: pendingOperations
|
|
219
226
|
});
|
|
220
227
|
|
|
221
|
-
return
|
|
228
|
+
return {
|
|
229
|
+
promise: promise,
|
|
230
|
+
pendingOperations: pendingOperations
|
|
231
|
+
};
|
|
222
232
|
};
|
|
223
233
|
|
|
224
234
|
return RelayOperationTracker;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -10,11 +10,7 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var _global$ErrorUtils$ap, _global$ErrorUtils;
|
|
14
|
-
|
|
15
|
-
var RelayReader = require('./RelayReader');
|
|
16
|
-
|
|
17
|
-
var RelayRecordSource = require('./RelayRecordSource');
|
|
13
|
+
var _global$ErrorUtils$ap, _global, _global$ErrorUtils;
|
|
18
14
|
|
|
19
15
|
var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
|
|
20
16
|
|
|
@@ -22,11 +18,15 @@ var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
|
|
|
22
18
|
|
|
23
19
|
var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
|
|
24
20
|
|
|
21
|
+
var RelayReader = require('./RelayReader');
|
|
22
|
+
|
|
23
|
+
var RelayRecordSource = require('./RelayRecordSource');
|
|
24
|
+
|
|
25
25
|
var invariant = require('invariant');
|
|
26
26
|
|
|
27
27
|
var warning = require("fbjs/lib/warning");
|
|
28
28
|
|
|
29
|
-
var applyWithGuard = (_global$ErrorUtils$ap = (_global$ErrorUtils =
|
|
29
|
+
var applyWithGuard = (_global$ErrorUtils$ap = (_global = global) === null || _global === void 0 ? void 0 : (_global$ErrorUtils = _global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
|
|
30
30
|
return callback.apply(context, args);
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
@@ -45,9 +45,15 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
45
45
|
// True if the next `run()` should apply the backup and rerun all optimistic
|
|
46
46
|
// updates performing a rebase.
|
|
47
47
|
// Payloads to apply or Sources to publish to the store with the next `run()`.
|
|
48
|
+
// $FlowFixMe[unclear-type] See explanation below.
|
|
48
49
|
// Optimistic updaters to add with the next `run()`.
|
|
50
|
+
// $FlowFixMe[unclear-type] See explanation below.
|
|
49
51
|
// Optimistic updaters that are already added and might be rerun in order to
|
|
50
52
|
// rebase them.
|
|
53
|
+
// $FlowFixMe[unclear-type] See explanation below.
|
|
54
|
+
// For _pendingOptimisticUpdates, _appliedOptimisticUpdates, and _pendingData,
|
|
55
|
+
// we want to parametrize by "any" since the type is effectively
|
|
56
|
+
// "the union of all T's that PublishQueue's methods were called with".
|
|
51
57
|
// Garbage collection hold, should rerun gc on dispose
|
|
52
58
|
function RelayPublishQueue(store, handlerProvider, getDataID) {
|
|
53
59
|
this._hasStoreSnapshot = false;
|
|
@@ -149,11 +155,25 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
149
155
|
;
|
|
150
156
|
|
|
151
157
|
_proto.run = function run(sourceOperation) {
|
|
158
|
+
var runWillClearGcHold = this._appliedOptimisticUpdates === 0 && !!this._gcHold;
|
|
159
|
+
var runIsANoop = // this._pendingBackupRebase is true if an applied optimistic
|
|
160
|
+
// update has potentially been reverted or if this._pendingData is not empty.
|
|
161
|
+
!this._pendingBackupRebase && this._pendingOptimisticUpdates.size === 0 && !runWillClearGcHold;
|
|
162
|
+
|
|
152
163
|
if (process.env.NODE_ENV !== "production") {
|
|
164
|
+
process.env.NODE_ENV !== "production" ? warning(!runIsANoop, 'RelayPublishQueue.run was called, but the call would have been a noop.') : void 0;
|
|
153
165
|
process.env.NODE_ENV !== "production" ? warning(this._isRunning !== true, 'A store update was detected within another store update. Please ' + "make sure new store updates aren't being executed within an " + 'updater function for a different update.') : void 0;
|
|
154
166
|
this._isRunning = true;
|
|
155
167
|
}
|
|
156
168
|
|
|
169
|
+
if (runIsANoop) {
|
|
170
|
+
if (process.env.NODE_ENV !== "production") {
|
|
171
|
+
this._isRunning = false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
|
|
157
177
|
if (this._pendingBackupRebase) {
|
|
158
178
|
if (this._hasStoreSnapshot) {
|
|
159
179
|
this._store.restore();
|
|
@@ -287,7 +307,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
287
307
|
|
|
288
308
|
var sink = RelayRecordSource.create();
|
|
289
309
|
var mutator = new RelayRecordSourceMutator(this._store.getSource(), sink);
|
|
290
|
-
var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider);
|
|
310
|
+
var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider); // $FlowFixMe[unclear-type] see explanation above.
|
|
291
311
|
|
|
292
312
|
var processUpdate = function processUpdate(optimisticUpdate) {
|
|
293
313
|
if (optimisticUpdate.storeUpdater) {
|
|
@@ -299,15 +319,19 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
299
319
|
updater = optimisticUpdate.updater;
|
|
300
320
|
var source = payload.source,
|
|
301
321
|
fieldPayloads = payload.fieldPayloads;
|
|
302
|
-
var recordSourceSelectorProxy = new RelayRecordSourceSelectorProxy(mutator, recordSourceProxy, operation.fragment);
|
|
303
|
-
var selectorData;
|
|
304
322
|
|
|
305
323
|
if (source) {
|
|
306
324
|
recordSourceProxy.publishSource(source, fieldPayloads);
|
|
307
|
-
selectorData = lookupSelector(source, operation.fragment);
|
|
308
325
|
}
|
|
309
326
|
|
|
310
327
|
if (updater) {
|
|
328
|
+
var selectorData;
|
|
329
|
+
|
|
330
|
+
if (source) {
|
|
331
|
+
selectorData = lookupSelector(source, operation.fragment);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
var recordSourceSelectorProxy = new RelayRecordSourceSelectorProxy(mutator, recordSourceProxy, operation.fragment);
|
|
311
335
|
applyWithGuard(updater, null, [recordSourceSelectorProxy, selectorData], null, 'RelayPublishQueue:applyUpdates');
|
|
312
336
|
}
|
|
313
337
|
}
|