react-relay 14.0.0 → 15.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/ReactRelayContainerUtils.js.flow +1 -2
- package/ReactRelayContext.js +1 -1
- package/ReactRelayContext.js.flow +1 -2
- package/ReactRelayFragmentContainer.js.flow +6 -4
- package/ReactRelayFragmentMockRenderer.js.flow +1 -2
- package/ReactRelayLocalQueryRenderer.js.flow +5 -5
- package/ReactRelayPaginationContainer.js.flow +21 -14
- package/ReactRelayQueryFetcher.js.flow +28 -16
- package/ReactRelayQueryRenderer.js.flow +42 -13
- package/ReactRelayQueryRendererContext.js.flow +2 -3
- package/ReactRelayRefetchContainer.js.flow +9 -9
- package/ReactRelayTestMocker.js.flow +3 -3
- package/ReactRelayTypes.js.flow +7 -8
- package/RelayContext.js.flow +1 -2
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +4 -5
- package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +4 -5
- package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +4 -5
- package/__flowtests__/RelayModern-flowtest.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +3 -1
- package/assertFragmentMap.js.flow +1 -2
- package/buildReactRelayContainer.js.flow +7 -7
- package/getRootVariablesForFragments.js.flow +1 -3
- package/hooks.js +1 -1
- package/hooks.js.flow +4 -2
- package/index.js +1 -1
- package/index.js.flow +6 -2
- package/isRelayEnvironment.js.flow +1 -2
- package/jest-react/enqueueTask.js.flow +1 -1
- package/jest-react/index.js.flow +1 -1
- package/jest-react/internalAct.js.flow +1 -1
- package/legacy.js +1 -1
- package/legacy.js.flow +1 -2
- package/lib/ReactRelayContainerUtils.js +2 -3
- package/lib/ReactRelayContext.js +3 -4
- package/lib/ReactRelayFragmentContainer.js +47 -73
- package/lib/ReactRelayFragmentMockRenderer.js +2 -4
- package/lib/ReactRelayLocalQueryRenderer.js +18 -31
- package/lib/ReactRelayPaginationContainer.js +74 -164
- package/lib/ReactRelayQueryFetcher.js +49 -76
- package/lib/ReactRelayQueryRenderer.js +63 -84
- package/lib/ReactRelayQueryRendererContext.js +2 -2
- package/lib/ReactRelayRefetchContainer.js +58 -108
- package/lib/ReactRelayTestMocker.js +33 -68
- package/lib/ReactRelayTypes.js +2 -1
- package/lib/RelayContext.js +4 -7
- package/lib/assertFragmentMap.js +3 -5
- package/lib/buildReactRelayContainer.js +11 -27
- package/lib/getRootVariablesForFragments.js +6 -10
- package/lib/hooks.js +5 -18
- package/lib/index.js +7 -24
- package/lib/isRelayEnvironment.js +5 -4
- package/lib/jest-react/enqueueTask.js +5 -9
- package/lib/jest-react/index.js +0 -1
- package/lib/jest-react/internalAct.js +9 -20
- package/lib/legacy.js +2 -8
- package/lib/multi-actor/ActorChange.js +2 -5
- package/lib/multi-actor/index.js +2 -1
- package/lib/multi-actor/useRelayActorEnvironment.js +4 -8
- package/lib/relay-hooks/EntryPointContainer.react.js +9 -15
- package/lib/relay-hooks/EntryPointTypes.flow.js +5 -3
- package/lib/relay-hooks/FragmentResource.js +109 -203
- package/lib/relay-hooks/HooksImplementation.js +3 -6
- package/lib/relay-hooks/InternalLogger.js +2 -3
- package/lib/relay-hooks/LRUCache.js +2 -20
- package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +33 -54
- package/lib/relay-hooks/MatchContainer.js +15 -24
- package/lib/relay-hooks/ProfilerContext.js +3 -3
- package/lib/relay-hooks/QueryResource.js +31 -101
- package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -9
- package/lib/relay-hooks/SuspenseResource.js +9 -33
- package/lib/relay-hooks/loadEntryPoint.js +19 -31
- package/lib/relay-hooks/loadQuery.js +42 -78
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +11 -37
- package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +9 -15
- package/lib/relay-hooks/react-cache/RelayReactCache.js +7 -12
- package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +27 -81
- package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +206 -0
- package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +195 -215
- package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +5 -15
- package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +17 -24
- package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +149 -0
- package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +24 -39
- package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +325 -0
- package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +37 -0
- package/lib/relay-hooks/useBlockingPaginationFragment.js +73 -93
- package/lib/relay-hooks/useClientQuery.js +30 -0
- package/lib/relay-hooks/useEntryPointLoader.js +18 -38
- package/lib/relay-hooks/useFetchTrackingRef.js +10 -12
- package/lib/relay-hooks/useFragment.js +8 -19
- package/lib/relay-hooks/useFragmentNode.js +20 -32
- package/lib/relay-hooks/useIsMountedRef.js +4 -6
- package/lib/relay-hooks/useIsOperationNodeActive.js +8 -20
- package/lib/relay-hooks/useIsParentQueryActive.js +3 -6
- package/lib/relay-hooks/useLazyLoadQuery.js +7 -24
- package/lib/relay-hooks/useLazyLoadQueryNode.js +23 -34
- package/lib/relay-hooks/useLoadMoreFunction.js +46 -78
- package/lib/relay-hooks/useMemoOperationDescriptor.js +6 -15
- package/lib/relay-hooks/useMemoVariables.js +15 -34
- package/lib/relay-hooks/useMutation.js +9 -27
- package/lib/relay-hooks/usePaginationFragment.js +73 -76
- package/lib/relay-hooks/usePreloadedQuery.js +13 -44
- package/lib/relay-hooks/useQueryLoader.js +24 -49
- package/lib/relay-hooks/useRefetchableFragment.js +19 -17
- package/lib/relay-hooks/useRefetchableFragmentNode.js +65 -109
- package/lib/relay-hooks/useRelayEnvironment.js +4 -8
- package/lib/relay-hooks/useStaticFragmentNodeWarning.js +4 -8
- package/lib/relay-hooks/useSubscribeToInvalidationState.js +8 -9
- package/lib/relay-hooks/useSubscription.js +5 -10
- package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +29 -0
- package/multi-actor/ActorChange.js.flow +1 -1
- package/multi-actor/index.js.flow +1 -1
- package/multi-actor/useRelayActorEnvironment.js.flow +2 -4
- package/package.json +2 -2
- package/react-relay-hooks.js +2 -2
- package/react-relay-hooks.min.js +2 -2
- package/react-relay-legacy.js +2 -2
- package/react-relay-legacy.min.js +2 -2
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/relay-hooks/EntryPointContainer.react.js.flow +3 -5
- package/relay-hooks/EntryPointTypes.flow.js.flow +37 -37
- package/relay-hooks/FragmentResource.js.flow +43 -19
- package/relay-hooks/HooksImplementation.js.flow +7 -9
- package/relay-hooks/InternalLogger.js.flow +1 -3
- package/relay-hooks/LRUCache.js.flow +1 -3
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +19 -14
- package/relay-hooks/MatchContainer.js.flow +6 -8
- package/relay-hooks/ProfilerContext.js.flow +1 -3
- package/relay-hooks/QueryResource.js.flow +29 -11
- package/relay-hooks/RelayEnvironmentProvider.js.flow +4 -6
- package/relay-hooks/SuspenseResource.js.flow +1 -3
- package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -4
- package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +4 -4
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -1
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +3 -1
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +39 -39
- package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -3
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +37 -38
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +18 -20
- package/relay-hooks/__flowtests__/utils.js.flow +21 -12
- package/relay-hooks/loadEntryPoint.js.flow +11 -6
- package/relay-hooks/loadQuery.js.flow +11 -7
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +9 -12
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +13 -10
- package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -3
- package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +26 -20
- package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
- package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +136 -96
- package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +1 -3
- package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +3 -5
- package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +190 -0
- package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +3 -6
- package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +601 -0
- package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
- package/relay-hooks/useBlockingPaginationFragment.js.flow +86 -59
- package/relay-hooks/useClientQuery.js.flow +39 -0
- package/relay-hooks/useEntryPointLoader.js.flow +16 -14
- package/relay-hooks/useFetchTrackingRef.js.flow +7 -8
- package/relay-hooks/useFragment.js.flow +2 -4
- package/relay-hooks/useFragmentNode.js.flow +7 -8
- package/relay-hooks/useIsMountedRef.js.flow +2 -4
- package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
- package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
- package/relay-hooks/useLazyLoadQuery.js.flow +9 -32
- package/relay-hooks/useLazyLoadQueryNode.js.flow +4 -6
- package/relay-hooks/useLoadMoreFunction.js.flow +20 -17
- package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -5
- package/relay-hooks/useMemoVariables.js.flow +13 -31
- package/relay-hooks/useMutation.js.flow +6 -8
- package/relay-hooks/usePaginationFragment.js.flow +75 -43
- package/relay-hooks/usePreloadedQuery.js.flow +49 -43
- package/relay-hooks/useQueryLoader.js.flow +89 -28
- package/relay-hooks/useRefetchableFragment.js.flow +83 -23
- package/relay-hooks/useRefetchableFragmentNode.js.flow +26 -22
- package/relay-hooks/useRelayEnvironment.js.flow +2 -4
- package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -5
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -4
- package/relay-hooks/useSubscription.js.flow +1 -3
- package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
- package/lib/readContext.js +0 -28
- package/readContext.js.flow +0 -31
|
@@ -5,85 +5,68 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*
|
|
8
|
-
* @emails oncall+relay
|
|
9
8
|
* @format
|
|
9
|
+
* @oncall relay
|
|
10
10
|
*/
|
|
11
|
-
// flowlint ambiguous-object-type:error
|
|
12
|
-
'use strict';
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
'use strict';
|
|
15
13
|
|
|
14
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
16
15
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
17
|
-
|
|
18
16
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
|
-
|
|
20
17
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
21
|
-
|
|
22
18
|
var LRUCache = require('./LRUCache');
|
|
23
|
-
|
|
24
19
|
var _require = require('./QueryResource'),
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
|
|
27
21
|
var SuspenseResource = require('./SuspenseResource');
|
|
28
|
-
|
|
29
22
|
var invariant = require('invariant');
|
|
30
|
-
|
|
31
23
|
var _require2 = require('relay-runtime'),
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
_require2$__internal = _require2.__internal,
|
|
25
|
+
fetchQuery = _require2$__internal.fetchQuery,
|
|
26
|
+
getPromiseForActiveRequest = _require2$__internal.getPromiseForActiveRequest,
|
|
27
|
+
RelayFeatureFlags = _require2.RelayFeatureFlags,
|
|
28
|
+
createOperationDescriptor = _require2.createOperationDescriptor,
|
|
29
|
+
getFragmentIdentifier = _require2.getFragmentIdentifier,
|
|
30
|
+
getPendingOperationsForFragment = _require2.getPendingOperationsForFragment,
|
|
31
|
+
getSelector = _require2.getSelector,
|
|
32
|
+
getVariablesFromFragment = _require2.getVariablesFromFragment,
|
|
33
|
+
handlePotentialSnapshotErrors = _require2.handlePotentialSnapshotErrors,
|
|
34
|
+
isPromise = _require2.isPromise,
|
|
35
|
+
recycleNodesInto = _require2.recycleNodesInto;
|
|
45
36
|
var WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
|
|
46
37
|
// TODO: Fix to not rely on LRU. If the number of active fragments exceeds this
|
|
47
38
|
// capacity, readSpec() will fail to find cached entries and break object
|
|
48
39
|
// identity even if data hasn't changed.
|
|
49
|
-
var CACHE_CAPACITY = 1000000;
|
|
40
|
+
var CACHE_CAPACITY = 1000000;
|
|
50
41
|
|
|
42
|
+
// this is frozen so that users don't accidentally push data into the array
|
|
51
43
|
var CONSTANT_READONLY_EMPTY_ARRAY = Object.freeze([]);
|
|
52
|
-
|
|
53
44
|
function isMissingData(snapshot) {
|
|
54
45
|
if (Array.isArray(snapshot)) {
|
|
55
46
|
return snapshot.some(function (s) {
|
|
56
47
|
return s.isMissingData;
|
|
57
48
|
});
|
|
58
49
|
}
|
|
59
|
-
|
|
60
50
|
return snapshot.isMissingData;
|
|
61
51
|
}
|
|
62
|
-
|
|
63
52
|
function hasMissingClientEdges(snapshot) {
|
|
64
53
|
var _snapshot$missingClie, _snapshot$missingClie2;
|
|
65
|
-
|
|
66
54
|
if (Array.isArray(snapshot)) {
|
|
67
55
|
return snapshot.some(function (s) {
|
|
68
56
|
var _s$missingClientEdges, _s$missingClientEdges2;
|
|
69
|
-
|
|
70
57
|
return ((_s$missingClientEdges = (_s$missingClientEdges2 = s.missingClientEdges) === null || _s$missingClientEdges2 === void 0 ? void 0 : _s$missingClientEdges2.length) !== null && _s$missingClientEdges !== void 0 ? _s$missingClientEdges : 0) > 0;
|
|
71
58
|
});
|
|
72
59
|
}
|
|
73
|
-
|
|
74
60
|
return ((_snapshot$missingClie = (_snapshot$missingClie2 = snapshot.missingClientEdges) === null || _snapshot$missingClie2 === void 0 ? void 0 : _snapshot$missingClie2.length) !== null && _snapshot$missingClie !== void 0 ? _snapshot$missingClie : 0) > 0;
|
|
75
61
|
}
|
|
76
|
-
|
|
77
62
|
function missingLiveResolverFields(snapshot) {
|
|
78
63
|
if (Array.isArray(snapshot)) {
|
|
79
64
|
return snapshot.map(function (s) {
|
|
80
65
|
return s.missingLiveResolverFields;
|
|
81
66
|
}).filter(Boolean).flat();
|
|
82
67
|
}
|
|
83
|
-
|
|
84
68
|
return snapshot.missingLiveResolverFields;
|
|
85
69
|
}
|
|
86
|
-
|
|
87
70
|
function singularOrPluralForEach(snapshot, f) {
|
|
88
71
|
if (Array.isArray(snapshot)) {
|
|
89
72
|
snapshot.forEach(f);
|
|
@@ -91,7 +74,6 @@ function singularOrPluralForEach(snapshot, f) {
|
|
|
91
74
|
f(snapshot);
|
|
92
75
|
}
|
|
93
76
|
}
|
|
94
|
-
|
|
95
77
|
function getFragmentResult(cacheKey, snapshot, storeEpoch) {
|
|
96
78
|
if (Array.isArray(snapshot)) {
|
|
97
79
|
return {
|
|
@@ -104,7 +86,6 @@ function getFragmentResult(cacheKey, snapshot, storeEpoch) {
|
|
|
104
86
|
storeEpoch: storeEpoch
|
|
105
87
|
};
|
|
106
88
|
}
|
|
107
|
-
|
|
108
89
|
return {
|
|
109
90
|
cacheKey: cacheKey,
|
|
110
91
|
snapshot: snapshot,
|
|
@@ -113,119 +94,95 @@ function getFragmentResult(cacheKey, snapshot, storeEpoch) {
|
|
|
113
94
|
storeEpoch: storeEpoch
|
|
114
95
|
};
|
|
115
96
|
}
|
|
97
|
+
|
|
116
98
|
/**
|
|
117
99
|
* The purpose of this cache is to allow information to be passed from an
|
|
118
100
|
* initial read which suspends through to the commit that follows a subsequent
|
|
119
101
|
* successful read. Specifically, the QueryResource result for the data fetch
|
|
120
102
|
* is passed through so that that query can be retained on commit.
|
|
121
103
|
*/
|
|
122
|
-
|
|
123
|
-
|
|
124
104
|
var ClientEdgeQueryResultsCache = /*#__PURE__*/function () {
|
|
125
105
|
function ClientEdgeQueryResultsCache(environment) {
|
|
126
106
|
(0, _defineProperty2["default"])(this, "_cache", new Map());
|
|
127
107
|
(0, _defineProperty2["default"])(this, "_retainCounts", new Map());
|
|
128
108
|
this._environment = environment;
|
|
129
109
|
}
|
|
130
|
-
|
|
131
110
|
var _proto = ClientEdgeQueryResultsCache.prototype;
|
|
132
|
-
|
|
133
111
|
_proto.get = function get(fragmentIdentifier) {
|
|
134
112
|
var _this$_cache$get$, _this$_cache$get;
|
|
135
|
-
|
|
136
113
|
return (_this$_cache$get$ = (_this$_cache$get = this._cache.get(fragmentIdentifier)) === null || _this$_cache$get === void 0 ? void 0 : _this$_cache$get[0]) !== null && _this$_cache$get$ !== void 0 ? _this$_cache$get$ : undefined;
|
|
137
114
|
};
|
|
138
|
-
|
|
139
|
-
|
|
115
|
+
_proto.recordQueryResults = function recordQueryResults(fragmentIdentifier, value // may be mutated after being passed here
|
|
116
|
+
) {
|
|
140
117
|
var _this = this;
|
|
141
|
-
|
|
142
118
|
var existing = this._cache.get(fragmentIdentifier);
|
|
143
|
-
|
|
144
119
|
if (!existing) {
|
|
145
120
|
var suspenseResource = new SuspenseResource(function () {
|
|
146
121
|
return _this._retain(fragmentIdentifier);
|
|
147
122
|
});
|
|
148
|
-
|
|
149
123
|
this._cache.set(fragmentIdentifier, [value, suspenseResource]);
|
|
150
|
-
|
|
151
124
|
suspenseResource.temporaryRetain(this._environment);
|
|
152
125
|
} else {
|
|
153
126
|
var existingResults = existing[0],
|
|
154
|
-
|
|
127
|
+
_suspenseResource = existing[1];
|
|
155
128
|
value.forEach(function (queryResult) {
|
|
156
129
|
existingResults.push(queryResult);
|
|
157
130
|
});
|
|
158
|
-
|
|
159
131
|
_suspenseResource.temporaryRetain(this._environment);
|
|
160
132
|
}
|
|
161
133
|
};
|
|
162
|
-
|
|
163
134
|
_proto._retain = function _retain(id) {
|
|
164
135
|
var _this2 = this;
|
|
165
|
-
|
|
166
136
|
var _this$_retainCounts$g;
|
|
167
|
-
|
|
168
137
|
var retainCount = ((_this$_retainCounts$g = this._retainCounts.get(id)) !== null && _this$_retainCounts$g !== void 0 ? _this$_retainCounts$g : 0) + 1;
|
|
169
|
-
|
|
170
138
|
this._retainCounts.set(id, retainCount);
|
|
171
|
-
|
|
172
139
|
return {
|
|
173
140
|
dispose: function dispose() {
|
|
174
141
|
var _this$_retainCounts$g2;
|
|
175
|
-
|
|
176
142
|
var newRetainCount = ((_this$_retainCounts$g2 = _this2._retainCounts.get(id)) !== null && _this$_retainCounts$g2 !== void 0 ? _this$_retainCounts$g2 : 0) - 1;
|
|
177
|
-
|
|
178
143
|
if (newRetainCount > 0) {
|
|
179
144
|
_this2._retainCounts.set(id, newRetainCount);
|
|
180
145
|
} else {
|
|
181
146
|
_this2._retainCounts["delete"](id);
|
|
182
|
-
|
|
183
147
|
_this2._cache["delete"](id);
|
|
184
148
|
}
|
|
185
149
|
}
|
|
186
150
|
};
|
|
187
151
|
};
|
|
188
|
-
|
|
189
152
|
return ClientEdgeQueryResultsCache;
|
|
190
153
|
}();
|
|
191
|
-
|
|
192
154
|
var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
193
155
|
function FragmentResourceImpl(environment) {
|
|
194
156
|
this._environment = environment;
|
|
195
157
|
this._cache = LRUCache.create(CACHE_CAPACITY);
|
|
196
|
-
|
|
197
158
|
if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
|
|
198
159
|
this._clientEdgeQueryResultsCache = new ClientEdgeQueryResultsCache(environment);
|
|
199
160
|
}
|
|
200
161
|
}
|
|
162
|
+
|
|
201
163
|
/**
|
|
202
164
|
* This function should be called during a Component's render function,
|
|
203
165
|
* to read the data for a fragment, or suspend if the fragment is being
|
|
204
166
|
* fetched.
|
|
205
167
|
*/
|
|
206
|
-
|
|
207
|
-
|
|
208
168
|
var _proto2 = FragmentResourceImpl.prototype;
|
|
209
|
-
|
|
210
169
|
_proto2.read = function read(fragmentNode, fragmentRef, componentDisplayName, fragmentKey) {
|
|
211
170
|
return this.readWithIdentifier(fragmentNode, fragmentRef, getFragmentIdentifier(fragmentNode, fragmentRef), componentDisplayName, fragmentKey);
|
|
212
171
|
}
|
|
172
|
+
|
|
213
173
|
/**
|
|
214
174
|
* Like `read`, but with a pre-computed fragmentIdentifier that should be
|
|
215
175
|
* equal to `getFragmentIdentifier(fragmentNode, fragmentRef)` from the
|
|
216
176
|
* arguments.
|
|
217
|
-
|
|
218
|
-
;
|
|
219
|
-
|
|
177
|
+
*/;
|
|
220
178
|
_proto2.readWithIdentifier = function readWithIdentifier(fragmentNode, fragmentRef, fragmentIdentifier, componentDisplayName, fragmentKey) {
|
|
221
179
|
var _this3 = this;
|
|
222
|
-
|
|
223
180
|
var _fragmentNode$metadat, _fragmentNode$metadat2, _missingLiveResolverF2, _missingLiveResolverF3;
|
|
181
|
+
var environment = this._environment;
|
|
224
182
|
|
|
225
|
-
|
|
183
|
+
// If fragmentRef is null or undefined, pass it directly through.
|
|
226
184
|
// This is a convenience when consuming fragments via a HOC API, when the
|
|
227
185
|
// prop corresponding to the fragment ref might be passed as null.
|
|
228
|
-
|
|
229
186
|
if (fragmentRef == null) {
|
|
230
187
|
return {
|
|
231
188
|
cacheKey: fragmentIdentifier,
|
|
@@ -235,13 +192,12 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
235
192
|
storeEpoch: 0
|
|
236
193
|
};
|
|
237
194
|
}
|
|
195
|
+
var storeEpoch = environment.getStore().getEpoch();
|
|
238
196
|
|
|
239
|
-
|
|
197
|
+
// If fragmentRef is plural, ensure that it is an array.
|
|
240
198
|
// If it's empty, return the empty array directly before doing any more work.
|
|
241
|
-
|
|
242
199
|
if ((fragmentNode === null || fragmentNode === void 0 ? void 0 : (_fragmentNode$metadat = fragmentNode.metadata) === null || _fragmentNode$metadat === void 0 ? void 0 : _fragmentNode$metadat.plural) === true) {
|
|
243
200
|
!Array.isArray(fragmentRef) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected fragment pointer%s for fragment `%s` to be ' + 'an array, instead got `%s`. Remove `@relay(plural: true)` ' + 'from fragment `%s` to allow the prop to be an object.', fragmentKey != null ? " for key `".concat(fragmentKey, "`") : '', fragmentNode.name, typeof fragmentRef, fragmentNode.name) : invariant(false) : void 0;
|
|
244
|
-
|
|
245
201
|
if (fragmentRef.length === 0) {
|
|
246
202
|
return {
|
|
247
203
|
cacheKey: fragmentIdentifier,
|
|
@@ -251,15 +207,14 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
251
207
|
storeEpoch: storeEpoch
|
|
252
208
|
};
|
|
253
209
|
}
|
|
254
|
-
}
|
|
255
|
-
// 1. Check if there's a cached value for this fragment
|
|
210
|
+
}
|
|
256
211
|
|
|
212
|
+
// Now we actually attempt to read the fragment:
|
|
257
213
|
|
|
214
|
+
// 1. Check if there's a cached value for this fragment
|
|
258
215
|
var cachedValue = this._cache.get(fragmentIdentifier);
|
|
259
|
-
|
|
260
216
|
if (cachedValue != null) {
|
|
261
217
|
var _missingLiveResolverF;
|
|
262
|
-
|
|
263
218
|
if (cachedValue.kind === 'pending' && isPromise(cachedValue.promise)) {
|
|
264
219
|
environment.__log({
|
|
265
220
|
name: 'suspense.fragment',
|
|
@@ -270,36 +225,47 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
270
225
|
isPromiseCached: true,
|
|
271
226
|
pendingOperations: cachedValue.pendingOperations
|
|
272
227
|
});
|
|
273
|
-
|
|
274
228
|
throw cachedValue.promise;
|
|
275
229
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
230
|
+
if (cachedValue.kind === 'done' && cachedValue.result.snapshot && !((_missingLiveResolverF = missingLiveResolverFields(cachedValue.result.snapshot)) !== null && _missingLiveResolverF !== void 0 && _missingLiveResolverF.length)) {
|
|
231
|
+
this._throwOrLogErrorsInSnapshot(
|
|
232
|
+
// $FlowFixMe[incompatible-call]
|
|
233
|
+
cachedValue.result.snapshot);
|
|
234
|
+
|
|
235
|
+
// This cache gets populated directly whenever the store notifies us of
|
|
236
|
+
// an update. That mechanism does not check for missing data, or
|
|
237
|
+
// in-flight requests.
|
|
238
|
+
if (cachedValue.result.isMissingData) {
|
|
239
|
+
environment.__log({
|
|
240
|
+
name: 'fragmentresource.missing_data',
|
|
241
|
+
data: cachedValue.result.data,
|
|
242
|
+
fragment: fragmentNode,
|
|
243
|
+
isRelayHooks: true,
|
|
244
|
+
cached: true
|
|
245
|
+
});
|
|
246
|
+
}
|
|
280
247
|
return cachedValue.result;
|
|
281
248
|
}
|
|
282
|
-
}
|
|
283
|
-
// If the snapshot has data, return it and save it in cache
|
|
284
|
-
|
|
249
|
+
}
|
|
285
250
|
|
|
251
|
+
// 2. If not, try reading the fragment from the Relay store.
|
|
252
|
+
// If the snapshot has data, return it and save it in cache
|
|
286
253
|
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
|
287
254
|
!(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, componentDisplayName, fragmentNode.name, fragmentKey == null ? 'a fragment reference' : "the `".concat(fragmentKey, "`"), componentDisplayName) : invariant(false) : void 0;
|
|
288
255
|
var snapshot = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors.map(function (s) {
|
|
289
256
|
return environment.lookup(s);
|
|
290
257
|
}) : environment.lookup(fragmentSelector);
|
|
291
258
|
var fragmentResult = getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
|
|
292
|
-
|
|
293
259
|
if (!fragmentResult.isMissingData) {
|
|
294
|
-
this.
|
|
295
|
-
|
|
260
|
+
this._throwOrLogErrorsInSnapshot(snapshot);
|
|
296
261
|
this._cache.set(fragmentIdentifier, {
|
|
297
262
|
kind: 'done',
|
|
298
263
|
result: fragmentResult
|
|
299
264
|
});
|
|
300
|
-
|
|
301
265
|
return fragmentResult;
|
|
302
|
-
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// 3. If we don't have data in the store, there's two cases where we should
|
|
303
269
|
// suspend to await the data: First if any client edges were traversed where
|
|
304
270
|
// the destination record was missing data; in that case we initiate a query
|
|
305
271
|
// here to fetch the missing data. Second, there may already be a request
|
|
@@ -307,64 +273,51 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
307
273
|
// may affect the parent's query data, such as a mutation or subscription.
|
|
308
274
|
// For any of these cases we can get a promise, which we will cache and
|
|
309
275
|
// suspend on.
|
|
310
|
-
// First, initiate a query for any client edges that were missing data:
|
|
311
|
-
|
|
312
276
|
|
|
277
|
+
// First, initiate a query for any client edges that were missing data:
|
|
313
278
|
var clientEdgeRequests = null;
|
|
314
|
-
|
|
315
279
|
if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && ((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true && hasMissingClientEdges(snapshot)) {
|
|
316
280
|
clientEdgeRequests = [];
|
|
317
281
|
var queryResource = getQueryResourceForEnvironment(this._environment);
|
|
318
282
|
var queryResults = [];
|
|
319
283
|
singularOrPluralForEach(snapshot, function (snap) {
|
|
320
284
|
var _snap$missingClientEd;
|
|
321
|
-
|
|
322
285
|
(_snap$missingClientEd = snap.missingClientEdges) === null || _snap$missingClientEd === void 0 ? void 0 : _snap$missingClientEd.forEach(function (_ref) {
|
|
323
286
|
var _clientEdgeRequests;
|
|
324
|
-
|
|
325
287
|
var request = _ref.request,
|
|
326
|
-
|
|
327
|
-
|
|
288
|
+
clientEdgeDestinationID = _ref.clientEdgeDestinationID;
|
|
328
289
|
var _this3$_performClient = _this3._performClientEdgeQuery(queryResource, fragmentNode, fragmentRef, request, clientEdgeDestinationID),
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
290
|
+
queryResult = _this3$_performClient.queryResult,
|
|
291
|
+
requestDescriptor = _this3$_performClient.requestDescriptor;
|
|
332
292
|
queryResults.push(queryResult);
|
|
333
293
|
(_clientEdgeRequests = clientEdgeRequests) === null || _clientEdgeRequests === void 0 ? void 0 : _clientEdgeRequests.push(requestDescriptor);
|
|
334
294
|
});
|
|
335
|
-
});
|
|
295
|
+
});
|
|
296
|
+
// Store the query so that it can be retained when our own fragment is
|
|
336
297
|
// subscribed to. This merges with any existing query results:
|
|
337
|
-
|
|
338
298
|
!(this._clientEdgeQueryResultsCache != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client edge query result cache should exist when ENABLE_CLIENT_EDGES is on.') : invariant(false) : void 0;
|
|
339
|
-
|
|
340
299
|
this._clientEdgeQueryResultsCache.recordQueryResults(fragmentIdentifier, queryResults);
|
|
341
300
|
}
|
|
342
|
-
|
|
343
301
|
var clientEdgePromises = [];
|
|
344
|
-
|
|
345
302
|
if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && clientEdgeRequests) {
|
|
346
303
|
clientEdgePromises = clientEdgeRequests.map(function (request) {
|
|
347
304
|
return getPromiseForActiveRequest(_this3._environment, request);
|
|
348
305
|
}).filter(Boolean);
|
|
349
|
-
}
|
|
350
|
-
|
|
306
|
+
}
|
|
351
307
|
|
|
308
|
+
// Finally look for operations in flight for our parent query:
|
|
352
309
|
var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
|
|
353
|
-
|
|
354
310
|
var parentQueryPromiseResult = this._getAndSavePromiseForFragmentRequestInFlight(fragmentIdentifier, fragmentNode, fragmentOwner, fragmentResult);
|
|
355
|
-
|
|
356
311
|
var parentQueryPromiseResultPromise = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.promise; // for refinement
|
|
357
|
-
|
|
358
312
|
var missingResolverFieldPromises = (_missingLiveResolverF2 = (_missingLiveResolverF3 = missingLiveResolverFields(snapshot)) === null || _missingLiveResolverF3 === void 0 ? void 0 : _missingLiveResolverF3.map(function (_ref2) {
|
|
359
313
|
var liveStateID = _ref2.liveStateID;
|
|
360
|
-
var store = environment.getStore();
|
|
314
|
+
var store = environment.getStore();
|
|
361
315
|
|
|
316
|
+
// $FlowFixMe[prop-missing] This is expected to be a LiveResolverStore
|
|
362
317
|
return store.getLiveResolverPromise(liveStateID);
|
|
363
318
|
})) !== null && _missingLiveResolverF2 !== void 0 ? _missingLiveResolverF2 : [];
|
|
364
|
-
|
|
365
319
|
if (clientEdgePromises.length || missingResolverFieldPromises.length || isPromise(parentQueryPromiseResultPromise)) {
|
|
366
320
|
var _parentQueryPromiseRe, _clientEdgeRequests2;
|
|
367
|
-
|
|
368
321
|
environment.__log({
|
|
369
322
|
name: 'suspense.fragment',
|
|
370
323
|
data: fragmentResult.data,
|
|
@@ -375,58 +328,63 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
375
328
|
// TODO! Attach information here about missing live resolver fields
|
|
376
329
|
pendingOperations: [].concat((0, _toConsumableArray2["default"])((_parentQueryPromiseRe = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.pendingOperations) !== null && _parentQueryPromiseRe !== void 0 ? _parentQueryPromiseRe : []), (0, _toConsumableArray2["default"])((_clientEdgeRequests2 = clientEdgeRequests) !== null && _clientEdgeRequests2 !== void 0 ? _clientEdgeRequests2 : []))
|
|
377
330
|
});
|
|
378
|
-
|
|
379
331
|
var promises = [];
|
|
380
|
-
|
|
381
332
|
if (clientEdgePromises.length > 0) {
|
|
382
333
|
promises = promises.concat(clientEdgePromises);
|
|
383
334
|
}
|
|
384
|
-
|
|
385
335
|
if (missingResolverFieldPromises.length > 0) {
|
|
386
336
|
promises = promises.concat(missingResolverFieldPromises);
|
|
387
337
|
}
|
|
388
|
-
|
|
389
338
|
if (promises.length > 0) {
|
|
390
339
|
if (parentQueryPromiseResultPromise) {
|
|
391
340
|
promises.push(parentQueryPromiseResultPromise);
|
|
392
341
|
}
|
|
393
|
-
|
|
394
342
|
throw Promise.all(promises);
|
|
395
|
-
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Note: we are re-throwing the `parentQueryPromiseResultPromise` here,
|
|
396
346
|
// because some of our suspense-related code is relying on the instance equality
|
|
397
347
|
// of thrown promises. See FragmentResource-test.js
|
|
398
|
-
|
|
399
|
-
|
|
400
348
|
if (parentQueryPromiseResultPromise) {
|
|
401
349
|
throw parentQueryPromiseResultPromise;
|
|
402
350
|
}
|
|
403
351
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
352
|
+
this._throwOrLogErrorsInSnapshot(snapshot);
|
|
353
|
+
|
|
354
|
+
// At this point, there's nothing we can do. We don't have all the expected
|
|
355
|
+
// data, but there's no indication the missing data will be fulfilled. So we
|
|
356
|
+
// choose to return potentially non-typesafe data. The data returned here
|
|
357
|
+
// might not match the generated types for this fragment/operation.
|
|
358
|
+
environment.__log({
|
|
359
|
+
name: 'fragmentresource.missing_data',
|
|
360
|
+
data: fragmentResult.data,
|
|
361
|
+
fragment: fragmentNode,
|
|
362
|
+
isRelayHooks: true,
|
|
363
|
+
cached: false
|
|
364
|
+
});
|
|
407
365
|
return getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
|
|
408
366
|
};
|
|
409
|
-
|
|
410
367
|
_proto2._performClientEdgeQuery = function _performClientEdgeQuery(queryResource, fragmentNode, fragmentRef, request, clientEdgeDestinationID) {
|
|
411
368
|
var originalVariables = getVariablesFromFragment(fragmentNode, fragmentRef);
|
|
412
369
|
var variables = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, originalVariables), {}, {
|
|
413
370
|
id: clientEdgeDestinationID // TODO should be a reserved name
|
|
414
|
-
|
|
415
371
|
});
|
|
372
|
+
|
|
416
373
|
var operation = createOperationDescriptor(request, variables, {} // TODO cacheConfig should probably inherent from parent operation
|
|
417
374
|
);
|
|
375
|
+
|
|
418
376
|
var fetchObservable = fetchQuery(this._environment, operation);
|
|
419
|
-
var queryResult = queryResource.prepare(operation, fetchObservable
|
|
377
|
+
var queryResult = queryResource.prepare(operation, fetchObservable
|
|
378
|
+
// TODO should inherent render policy etc. from parent operation
|
|
420
379
|
);
|
|
380
|
+
|
|
421
381
|
return {
|
|
422
382
|
requestDescriptor: operation.request,
|
|
423
383
|
queryResult: queryResult
|
|
424
384
|
};
|
|
425
385
|
};
|
|
426
|
-
|
|
427
|
-
_proto2._handlePotentialSnapshotErrorsInSnapshot = function _handlePotentialSnapshotErrorsInSnapshot(snapshot) {
|
|
386
|
+
_proto2._throwOrLogErrorsInSnapshot = function _throwOrLogErrorsInSnapshot(snapshot) {
|
|
428
387
|
var _this4 = this;
|
|
429
|
-
|
|
430
388
|
if (Array.isArray(snapshot)) {
|
|
431
389
|
snapshot.forEach(function (s) {
|
|
432
390
|
handlePotentialSnapshotErrors(_this4._environment, s.missingRequiredFields, s.relayResolverErrors);
|
|
@@ -435,53 +393,44 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
435
393
|
handlePotentialSnapshotErrors(this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
|
|
436
394
|
}
|
|
437
395
|
};
|
|
438
|
-
|
|
439
396
|
_proto2.readSpec = function readSpec(fragmentNodes, fragmentRefs, componentDisplayName) {
|
|
440
397
|
var result = {};
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
result[_key] = this.read(fragmentNodes[_key], fragmentRefs[_key], componentDisplayName, _key);
|
|
398
|
+
for (var key in fragmentNodes) {
|
|
399
|
+
result[key] = this.read(fragmentNodes[key], fragmentRefs[key], componentDisplayName, key);
|
|
444
400
|
}
|
|
445
|
-
|
|
446
401
|
return result;
|
|
447
402
|
};
|
|
448
|
-
|
|
449
403
|
_proto2.subscribe = function subscribe(fragmentResult, callback) {
|
|
450
404
|
var _this5 = this;
|
|
451
|
-
|
|
452
405
|
var environment = this._environment;
|
|
453
406
|
var cacheKey = fragmentResult.cacheKey;
|
|
454
407
|
var renderedSnapshot = fragmentResult.snapshot;
|
|
455
|
-
|
|
456
408
|
if (!renderedSnapshot) {
|
|
457
409
|
return {
|
|
458
410
|
dispose: function dispose() {}
|
|
459
411
|
};
|
|
460
|
-
}
|
|
461
|
-
// TODO(T44066760): More efficiently detect if we missed an update
|
|
462
|
-
|
|
412
|
+
}
|
|
463
413
|
|
|
414
|
+
// 1. Check for any updates missed during render phase
|
|
415
|
+
// TODO(T44066760): More efficiently detect if we missed an update
|
|
464
416
|
var _this$checkMissedUpda = this.checkMissedUpdates(fragmentResult),
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
// the latest data.
|
|
468
|
-
|
|
417
|
+
didMissUpdates = _this$checkMissedUpda[0],
|
|
418
|
+
currentSnapshot = _this$checkMissedUpda[1];
|
|
469
419
|
|
|
420
|
+
// 2. If an update was missed, notify the component so it updates with
|
|
421
|
+
// the latest data.
|
|
470
422
|
if (didMissUpdates) {
|
|
471
423
|
callback();
|
|
472
|
-
}
|
|
473
|
-
|
|
424
|
+
}
|
|
474
425
|
|
|
426
|
+
// 3. Establish subscriptions on the snapshot(s)
|
|
475
427
|
var disposables = [];
|
|
476
|
-
|
|
477
428
|
if (Array.isArray(renderedSnapshot)) {
|
|
478
429
|
!Array.isArray(currentSnapshot) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected snapshots to be plural. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
479
430
|
currentSnapshot.forEach(function (snapshot, idx) {
|
|
480
431
|
disposables.push(environment.subscribe(snapshot, function (latestSnapshot) {
|
|
481
432
|
var storeEpoch = environment.getStore().getEpoch();
|
|
482
|
-
|
|
483
433
|
_this5._updatePluralSnapshot(cacheKey, currentSnapshot, latestSnapshot, idx, storeEpoch);
|
|
484
|
-
|
|
485
434
|
callback();
|
|
486
435
|
}));
|
|
487
436
|
});
|
|
@@ -489,43 +438,34 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
489
438
|
!(currentSnapshot != null && !Array.isArray(currentSnapshot)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected snapshot to be singular. ' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
|
|
490
439
|
disposables.push(environment.subscribe(currentSnapshot, function (latestSnapshot) {
|
|
491
440
|
var storeEpoch = environment.getStore().getEpoch();
|
|
492
|
-
|
|
493
441
|
_this5._cache.set(cacheKey, {
|
|
494
442
|
kind: 'done',
|
|
495
443
|
result: getFragmentResult(cacheKey, latestSnapshot, storeEpoch)
|
|
496
444
|
});
|
|
497
|
-
|
|
498
445
|
callback();
|
|
499
446
|
}));
|
|
500
447
|
}
|
|
501
|
-
|
|
502
448
|
if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
|
|
503
449
|
var _this$_clientEdgeQuer, _this$_clientEdgeQuer2;
|
|
504
|
-
|
|
505
450
|
var clientEdgeQueryResults = (_this$_clientEdgeQuer = (_this$_clientEdgeQuer2 = this._clientEdgeQueryResultsCache) === null || _this$_clientEdgeQuer2 === void 0 ? void 0 : _this$_clientEdgeQuer2.get(cacheKey)) !== null && _this$_clientEdgeQuer !== void 0 ? _this$_clientEdgeQuer : undefined;
|
|
506
|
-
|
|
507
|
-
if (clientEdgeQueryResults === null || clientEdgeQueryResults === void 0 ? void 0 : clientEdgeQueryResults.length) {
|
|
451
|
+
if (clientEdgeQueryResults !== null && clientEdgeQueryResults !== void 0 && clientEdgeQueryResults.length) {
|
|
508
452
|
var queryResource = getQueryResourceForEnvironment(this._environment);
|
|
509
453
|
clientEdgeQueryResults.forEach(function (queryResult) {
|
|
510
454
|
disposables.push(queryResource.retain(queryResult));
|
|
511
455
|
});
|
|
512
456
|
}
|
|
513
457
|
}
|
|
514
|
-
|
|
515
458
|
return {
|
|
516
459
|
dispose: function dispose() {
|
|
517
460
|
disposables.forEach(function (s) {
|
|
518
461
|
return s.dispose();
|
|
519
462
|
});
|
|
520
|
-
|
|
521
463
|
_this5._cache["delete"](cacheKey);
|
|
522
464
|
}
|
|
523
465
|
};
|
|
524
466
|
};
|
|
525
|
-
|
|
526
467
|
_proto2.subscribeSpec = function subscribeSpec(fragmentResults, callback) {
|
|
527
468
|
var _this6 = this;
|
|
528
|
-
|
|
529
469
|
var disposables = Object.keys(fragmentResults).map(function (key) {
|
|
530
470
|
return _this6.subscribe(fragmentResults[key], callback);
|
|
531
471
|
});
|
|
@@ -537,25 +477,19 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
537
477
|
}
|
|
538
478
|
};
|
|
539
479
|
};
|
|
540
|
-
|
|
541
480
|
_proto2.checkMissedUpdates = function checkMissedUpdates(fragmentResult) {
|
|
542
481
|
var environment = this._environment;
|
|
543
482
|
var renderedSnapshot = fragmentResult.snapshot;
|
|
544
|
-
|
|
545
483
|
if (!renderedSnapshot) {
|
|
546
484
|
return [false, null];
|
|
547
485
|
}
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
486
|
+
var storeEpoch = null;
|
|
487
|
+
// Bail out if the store hasn't been written since last read
|
|
551
488
|
storeEpoch = environment.getStore().getEpoch();
|
|
552
|
-
|
|
553
489
|
if (fragmentResult.storeEpoch === storeEpoch) {
|
|
554
490
|
return [false, fragmentResult.snapshot];
|
|
555
491
|
}
|
|
556
|
-
|
|
557
492
|
var cacheKey = fragmentResult.cacheKey;
|
|
558
|
-
|
|
559
493
|
if (Array.isArray(renderedSnapshot)) {
|
|
560
494
|
var didMissUpdates = false;
|
|
561
495
|
var currentSnapshots = [];
|
|
@@ -564,28 +498,24 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
564
498
|
var renderData = snapshot.data;
|
|
565
499
|
var currentData = currentSnapshot.data;
|
|
566
500
|
var updatedData = recycleNodesInto(renderData, currentData);
|
|
567
|
-
|
|
568
501
|
if (updatedData !== renderData) {
|
|
569
502
|
currentSnapshot = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, currentSnapshot), {}, {
|
|
570
503
|
data: updatedData
|
|
571
504
|
});
|
|
572
505
|
didMissUpdates = true;
|
|
573
506
|
}
|
|
574
|
-
|
|
575
507
|
currentSnapshots[idx] = currentSnapshot;
|
|
576
|
-
});
|
|
508
|
+
});
|
|
509
|
+
// Only update the cache when the data is changed to avoid
|
|
577
510
|
// returning different `data` instances
|
|
578
|
-
|
|
579
511
|
if (didMissUpdates) {
|
|
580
512
|
this._cache.set(cacheKey, {
|
|
581
513
|
kind: 'done',
|
|
582
514
|
result: getFragmentResult(cacheKey, currentSnapshots, storeEpoch)
|
|
583
515
|
});
|
|
584
516
|
}
|
|
585
|
-
|
|
586
517
|
return [didMissUpdates, currentSnapshots];
|
|
587
518
|
}
|
|
588
|
-
|
|
589
519
|
var currentSnapshot = environment.lookup(renderedSnapshot.selector);
|
|
590
520
|
var renderData = renderedSnapshot.data;
|
|
591
521
|
var currentData = currentSnapshot.data;
|
|
@@ -600,111 +530,87 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
|
600
530
|
missingRequiredFields: currentSnapshot.missingRequiredFields,
|
|
601
531
|
relayResolverErrors: currentSnapshot.relayResolverErrors
|
|
602
532
|
};
|
|
603
|
-
|
|
604
533
|
if (updatedData !== renderData) {
|
|
605
534
|
this._cache.set(cacheKey, {
|
|
606
535
|
kind: 'done',
|
|
607
536
|
result: getFragmentResult(cacheKey, updatedCurrentSnapshot, storeEpoch)
|
|
608
537
|
});
|
|
609
538
|
}
|
|
610
|
-
|
|
611
539
|
return [updatedData !== renderData, updatedCurrentSnapshot];
|
|
612
540
|
};
|
|
613
|
-
|
|
614
541
|
_proto2.checkMissedUpdatesSpec = function checkMissedUpdatesSpec(fragmentResults) {
|
|
615
542
|
var _this7 = this;
|
|
616
|
-
|
|
617
543
|
return Object.keys(fragmentResults).some(function (key) {
|
|
618
544
|
return _this7.checkMissedUpdates(fragmentResults[key])[0];
|
|
619
545
|
});
|
|
620
546
|
};
|
|
621
|
-
|
|
622
547
|
_proto2._getAndSavePromiseForFragmentRequestInFlight = function _getAndSavePromiseForFragmentRequestInFlight(cacheKey, fragmentNode, fragmentOwner, fragmentResult) {
|
|
623
548
|
var _this8 = this;
|
|
624
|
-
|
|
625
549
|
var pendingOperationsResult = getPendingOperationsForFragment(this._environment, fragmentNode, fragmentOwner);
|
|
626
|
-
|
|
627
550
|
if (pendingOperationsResult == null) {
|
|
628
551
|
return null;
|
|
629
|
-
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// When the Promise for the request resolves, we need to make sure to
|
|
630
555
|
// update the cache with the latest data available in the store before
|
|
631
556
|
// resolving the Promise
|
|
632
|
-
|
|
633
|
-
|
|
634
557
|
var networkPromise = pendingOperationsResult.promise;
|
|
635
558
|
var pendingOperations = pendingOperationsResult.pendingOperations;
|
|
636
559
|
var promise = networkPromise.then(function () {
|
|
637
560
|
_this8._cache["delete"](cacheKey);
|
|
638
561
|
})["catch"](function (error) {
|
|
639
562
|
_this8._cache["delete"](cacheKey);
|
|
640
|
-
});
|
|
641
|
-
|
|
563
|
+
});
|
|
564
|
+
// $FlowExpectedError[prop-missing] Expando to annotate Promises.
|
|
642
565
|
promise.displayName = networkPromise.displayName;
|
|
643
|
-
|
|
644
566
|
this._cache.set(cacheKey, {
|
|
645
567
|
kind: 'pending',
|
|
646
568
|
pendingOperations: pendingOperations,
|
|
647
569
|
promise: promise,
|
|
648
570
|
result: fragmentResult
|
|
649
571
|
});
|
|
650
|
-
|
|
651
572
|
return {
|
|
652
573
|
promise: promise,
|
|
653
574
|
pendingOperations: pendingOperations
|
|
654
575
|
};
|
|
655
576
|
};
|
|
656
|
-
|
|
657
577
|
_proto2._updatePluralSnapshot = function _updatePluralSnapshot(cacheKey, baseSnapshots, latestSnapshot, idx, storeEpoch) {
|
|
658
578
|
var _currentFragmentResul;
|
|
659
|
-
|
|
660
579
|
var currentFragmentResult = this._cache.get(cacheKey);
|
|
661
|
-
|
|
662
580
|
if (isPromise(currentFragmentResult)) {
|
|
663
581
|
reportInvalidCachedData(latestSnapshot.selector.node.name);
|
|
664
582
|
return;
|
|
665
583
|
}
|
|
666
|
-
|
|
667
584
|
var currentSnapshot = currentFragmentResult === null || currentFragmentResult === void 0 ? void 0 : (_currentFragmentResul = currentFragmentResult.result) === null || _currentFragmentResul === void 0 ? void 0 : _currentFragmentResul.snapshot;
|
|
668
|
-
|
|
669
585
|
if (currentSnapshot && !Array.isArray(currentSnapshot)) {
|
|
670
586
|
reportInvalidCachedData(latestSnapshot.selector.node.name);
|
|
671
587
|
return;
|
|
672
588
|
}
|
|
673
|
-
|
|
674
589
|
var nextSnapshots = currentSnapshot ? (0, _toConsumableArray2["default"])(currentSnapshot) : (0, _toConsumableArray2["default"])(baseSnapshots);
|
|
675
590
|
nextSnapshots[idx] = latestSnapshot;
|
|
676
|
-
|
|
677
591
|
this._cache.set(cacheKey, {
|
|
678
592
|
kind: 'done',
|
|
679
593
|
result: getFragmentResult(cacheKey, nextSnapshots, storeEpoch)
|
|
680
594
|
});
|
|
681
595
|
};
|
|
682
|
-
|
|
683
596
|
return FragmentResourceImpl;
|
|
684
597
|
}();
|
|
685
|
-
|
|
686
598
|
function reportInvalidCachedData(nodeName) {
|
|
687
599
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to find cached data for plural fragment `%s` when ' + 'receiving a subscription. ' + "If you're seeing this, this is likely a bug in Relay.", nodeName) : invariant(false) : void 0;
|
|
688
600
|
}
|
|
689
|
-
|
|
690
601
|
function createFragmentResource(environment) {
|
|
691
602
|
return new FragmentResourceImpl(environment);
|
|
692
603
|
}
|
|
693
|
-
|
|
694
604
|
var dataResources = WEAKMAP_SUPPORTED ? new WeakMap() : new Map();
|
|
695
|
-
|
|
696
605
|
function getFragmentResourceForEnvironment(environment) {
|
|
697
606
|
var cached = dataResources.get(environment);
|
|
698
|
-
|
|
699
607
|
if (cached) {
|
|
700
608
|
return cached;
|
|
701
609
|
}
|
|
702
|
-
|
|
703
610
|
var newDataResource = createFragmentResource(environment);
|
|
704
611
|
dataResources.set(environment, newDataResource);
|
|
705
612
|
return newDataResource;
|
|
706
613
|
}
|
|
707
|
-
|
|
708
614
|
module.exports = {
|
|
709
615
|
createFragmentResource: createFragmentResource,
|
|
710
616
|
getFragmentResourceForEnvironment: getFragmentResourceForEnvironment
|