relay-runtime 7.0.0 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/handlers/RelayDefaultHandlerProvider.js.flow +34 -0
- package/handlers/connection/ConnectionHandler.js.flow +549 -0
- package/handlers/connection/ConnectionInterface.js.flow +92 -0
- package/index.js +1 -1
- package/index.js.flow +314 -0
- package/lib/handlers/RelayDefaultHandlerProvider.js +3 -2
- package/lib/handlers/connection/{RelayConnectionHandler.js → ConnectionHandler.js} +34 -35
- package/lib/handlers/connection/{RelayConnectionInterface.js → ConnectionInterface.js} +3 -30
- package/lib/index.js +29 -27
- package/lib/mutations/RelayDeclarativeMutationConfig.js +30 -52
- package/lib/mutations/RelayRecordProxy.js +6 -3
- package/lib/mutations/RelayRecordSourceMutator.js +3 -9
- package/lib/mutations/RelayRecordSourceProxy.js +21 -24
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -14
- package/lib/mutations/applyOptimisticMutation.js +2 -1
- package/lib/mutations/commitLocalUpdate.js +1 -0
- package/lib/mutations/commitMutation.js +26 -8
- package/lib/mutations/validateMutation.js +21 -11
- package/lib/network/ConvertToExecuteFunction.js +1 -0
- package/lib/network/RelayNetwork.js +1 -0
- package/lib/network/RelayNetworkTypes.js +1 -0
- package/lib/network/RelayObservable.js +10 -9
- package/lib/network/RelayQueryResponseCache.js +9 -7
- package/lib/query/{RelayModernGraphQLTag.js → GraphQLTag.js} +15 -8
- package/lib/query/fetchQuery.js +2 -1
- package/lib/query/fetchQueryInternal.js +30 -20
- package/lib/store/ClientID.js +1 -0
- package/lib/store/DataChecker.js +47 -97
- package/lib/store/RelayConcreteVariables.js +7 -2
- package/lib/store/RelayModernEnvironment.js +82 -41
- package/lib/store/RelayModernFragmentSpecResolver.js +61 -21
- package/lib/store/RelayModernOperationDescriptor.js +2 -1
- package/lib/store/RelayModernQueryExecutor.js +476 -333
- package/lib/store/RelayModernRecord.js +39 -9
- package/lib/store/RelayModernSelector.js +2 -1
- package/lib/store/RelayModernStore.js +359 -371
- package/lib/store/RelayOperationTracker.js +36 -78
- package/lib/store/RelayOptimisticRecordSource.js +8 -5
- package/lib/store/RelayPublishQueue.js +66 -53
- package/lib/store/RelayReader.js +2 -24
- package/lib/store/RelayRecordSource.js +3 -9
- package/lib/store/RelayRecordSourceMapImpl.js +14 -18
- package/lib/store/RelayRecordState.js +1 -0
- package/lib/store/RelayReferenceMarker.js +8 -58
- package/lib/store/RelayResponseNormalizer.js +15 -144
- package/lib/store/RelayStoreTypes.js +1 -0
- package/lib/store/RelayStoreUtils.js +34 -10
- package/lib/store/StoreInspector.js +11 -5
- package/lib/store/ViewerPattern.js +1 -0
- package/lib/store/cloneRelayHandleSourceField.js +1 -0
- package/lib/store/createFragmentSpecResolver.js +1 -0
- package/lib/store/createRelayContext.js +1 -0
- package/lib/store/defaultGetDataID.js +1 -0
- package/lib/store/hasOverlappingIDs.js +1 -0
- package/lib/store/isRelayModernEnvironment.js +1 -0
- package/lib/store/normalizeRelayPayload.js +8 -4
- package/lib/store/readInlineData.js +2 -1
- package/lib/subscription/requestSubscription.js +6 -3
- package/lib/util/JSResourceTypes.flow.js +12 -0
- package/lib/util/NormalizationNode.js +1 -0
- package/lib/util/ReaderNode.js +1 -0
- package/lib/util/RelayConcreteNode.js +3 -0
- package/lib/util/RelayDefaultHandleKey.js +1 -0
- package/lib/util/RelayError.js +2 -1
- package/lib/util/RelayFeatureFlags.js +3 -2
- package/lib/util/RelayProfiler.js +1 -0
- package/lib/util/RelayReplaySubject.js +2 -3
- package/lib/util/RelayRuntimeTypes.js +1 -0
- package/lib/util/createPayloadFor3DField.js +34 -0
- package/lib/util/deepFreeze.js +1 -0
- package/lib/util/generateID.js +1 -0
- package/lib/util/getFragmentIdentifier.js +1 -0
- package/lib/util/getRelayHandleKey.js +1 -0
- package/lib/util/getRequestIdentifier.js +1 -0
- package/lib/util/isPromise.js +1 -0
- package/lib/util/isScalarAndEqual.js +1 -0
- package/lib/util/recycleNodesInto.js +1 -0
- package/lib/util/resolveImmediate.js +1 -0
- package/lib/util/stableCopy.js +1 -0
- package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
- package/mutations/RelayRecordProxy.js.flow +165 -0
- package/mutations/RelayRecordSourceMutator.js.flow +238 -0
- package/mutations/RelayRecordSourceProxy.js.flow +164 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
- package/mutations/applyOptimisticMutation.js.flow +76 -0
- package/mutations/commitLocalUpdate.js.flow +24 -0
- package/mutations/commitMutation.js.flow +184 -0
- package/mutations/validateMutation.js.flow +211 -0
- package/network/ConvertToExecuteFunction.js.flow +49 -0
- package/network/RelayNetwork.js.flow +84 -0
- package/network/RelayNetworkTypes.js.flow +123 -0
- package/network/RelayObservable.js.flow +634 -0
- package/network/RelayQueryResponseCache.js.flow +111 -0
- package/package.json +1 -1
- package/query/GraphQLTag.js.flow +166 -0
- package/query/fetchQuery.js.flow +47 -0
- package/query/fetchQueryInternal.js.flow +349 -0
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +43 -0
- package/store/DataChecker.js.flow +426 -0
- package/store/RelayConcreteVariables.js.flow +96 -0
- package/store/RelayModernEnvironment.js.flow +526 -0
- package/store/RelayModernFragmentSpecResolver.js.flow +426 -0
- package/store/RelayModernOperationDescriptor.js.flow +88 -0
- package/store/RelayModernQueryExecutor.js.flow +1327 -0
- package/store/RelayModernRecord.js.flow +403 -0
- package/store/RelayModernSelector.js.flow +444 -0
- package/store/RelayModernStore.js.flow +757 -0
- package/store/RelayOperationTracker.js.flow +164 -0
- package/store/RelayOptimisticRecordSource.js.flow +119 -0
- package/store/RelayPublishQueue.js.flow +401 -0
- package/store/RelayReader.js.flow +376 -0
- package/store/RelayRecordSource.js.flow +29 -0
- package/store/RelayRecordSourceMapImpl.js.flow +87 -0
- package/store/RelayRecordState.js.flow +37 -0
- package/store/RelayReferenceMarker.js.flow +236 -0
- package/store/RelayResponseNormalizer.js.flow +556 -0
- package/store/RelayStoreTypes.js.flow +873 -0
- package/store/RelayStoreUtils.js.flow +218 -0
- package/store/StoreInspector.js.flow +173 -0
- package/store/ViewerPattern.js.flow +26 -0
- package/store/cloneRelayHandleSourceField.js.flow +66 -0
- package/store/createFragmentSpecResolver.js.flow +55 -0
- package/store/createRelayContext.js.flow +44 -0
- package/store/defaultGetDataID.js.flow +27 -0
- package/store/hasOverlappingIDs.js.flow +34 -0
- package/store/isRelayModernEnvironment.js.flow +27 -0
- package/store/normalizeRelayPayload.js.flow +51 -0
- package/store/readInlineData.js.flow +75 -0
- package/subscription/requestSubscription.js.flow +100 -0
- package/util/JSResourceTypes.flow.js.flow +20 -0
- package/util/NormalizationNode.js.flow +191 -0
- package/util/ReaderNode.js.flow +208 -0
- package/util/RelayConcreteNode.js.flow +80 -0
- package/util/RelayDefaultHandleKey.js.flow +17 -0
- package/util/RelayError.js.flow +33 -0
- package/util/RelayFeatureFlags.js.flow +30 -0
- package/util/RelayProfiler.js.flow +284 -0
- package/util/RelayReplaySubject.js.flow +134 -0
- package/util/RelayRuntimeTypes.js.flow +70 -0
- package/util/createPayloadFor3DField.js.flow +43 -0
- package/util/deepFreeze.js.flow +36 -0
- package/util/generateID.js.flow +21 -0
- package/util/getFragmentIdentifier.js.flow +52 -0
- package/util/getRelayHandleKey.js.flow +41 -0
- package/util/getRequestIdentifier.js.flow +41 -0
- package/util/isPromise.js.flow +21 -0
- package/util/isScalarAndEqual.js.flow +26 -0
- package/util/recycleNodesInto.js.flow +80 -0
- package/util/resolveImmediate.js.flow +30 -0
- package/util/stableCopy.js.flow +35 -0
- package/lib/handlers/RelayDefaultMissingFieldHandlers.js +0 -26
- package/lib/store/RelayConnection.js +0 -36
- package/lib/store/RelayConnectionResolver.js +0 -177
- package/lib/store/RelayRecordSourceObjectImpl.js +0 -78
- package/lib/util/getFragmentSpecIdentifier.js +0 -26
|
@@ -7,11 +7,16 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
13
14
|
|
|
14
|
-
var
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
+
|
|
17
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
18
|
+
|
|
19
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
15
20
|
|
|
16
21
|
var warning = require("fbjs/lib/warning");
|
|
17
22
|
|
|
@@ -75,11 +80,12 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
75
80
|
});
|
|
76
81
|
return;
|
|
77
82
|
|
|
78
|
-
case 'Connection':
|
|
79
|
-
validateSelections(optimisticResponse, [selection.edges, selection.pageInfo], context);
|
|
80
|
-
break;
|
|
81
|
-
|
|
82
83
|
case 'ClientExtension':
|
|
84
|
+
selection.selections.forEach(function (subselection) {
|
|
85
|
+
validateSelection(optimisticResponse, subselection, context);
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
|
|
83
89
|
case 'ModuleImport':
|
|
84
90
|
case 'LinkedHandle':
|
|
85
91
|
case 'ScalarHandle':
|
|
@@ -119,9 +125,11 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
119
125
|
if (field.plural) {
|
|
120
126
|
if (Array.isArray(optimisticResponse[fieldName])) {
|
|
121
127
|
optimisticResponse[fieldName].forEach(function (r) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
if (r !== null) {
|
|
129
|
+
validateSelections(r, selections, _objectSpread({}, context, {
|
|
130
|
+
path: path
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
125
133
|
});
|
|
126
134
|
return;
|
|
127
135
|
} else {
|
|
@@ -130,7 +138,7 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
130
138
|
}
|
|
131
139
|
} else {
|
|
132
140
|
if (optimisticResponse[fieldName] instanceof Object) {
|
|
133
|
-
validateSelections(optimisticResponse[fieldName], selections, (
|
|
141
|
+
validateSelections(optimisticResponse[fieldName], selections, _objectSpread({}, context, {
|
|
134
142
|
path: path
|
|
135
143
|
}));
|
|
136
144
|
return;
|
|
@@ -146,7 +154,9 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
146
154
|
var validateOptimisticResponse = function validateOptimisticResponse(optimisticResponse, context) {
|
|
147
155
|
if (Array.isArray(optimisticResponse)) {
|
|
148
156
|
optimisticResponse.forEach(function (r) {
|
|
149
|
-
|
|
157
|
+
if (r instanceof Object) {
|
|
158
|
+
validateOptimisticResponse(r, context);
|
|
159
|
+
}
|
|
150
160
|
});
|
|
151
161
|
return;
|
|
152
162
|
}
|
|
@@ -161,7 +171,7 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
161
171
|
}
|
|
162
172
|
|
|
163
173
|
if (value instanceof Object) {
|
|
164
|
-
validateOptimisticResponse(value, (
|
|
174
|
+
validateOptimisticResponse(value, _objectSpread({}, context, {
|
|
165
175
|
path: path
|
|
166
176
|
}));
|
|
167
177
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var isPromise = require('../util/isPromise');
|
|
@@ -29,9 +30,7 @@ var hostReportError = swallowError;
|
|
|
29
30
|
* ESObservable: https://github.com/tc39/proposal-observable
|
|
30
31
|
*/
|
|
31
32
|
|
|
32
|
-
var RelayObservable =
|
|
33
|
-
/*#__PURE__*/
|
|
34
|
-
function () {
|
|
33
|
+
var RelayObservable = /*#__PURE__*/function () {
|
|
35
34
|
RelayObservable.create = function create(source) {
|
|
36
35
|
return new RelayObservable(source);
|
|
37
36
|
} // Use RelayObservable.create()
|
|
@@ -407,6 +406,9 @@ function () {
|
|
|
407
406
|
/**
|
|
408
407
|
* Returns a Promise which resolves when this Observable yields a first value
|
|
409
408
|
* or when it completes with no value.
|
|
409
|
+
*
|
|
410
|
+
* NOTE: The source Observable is *NOT* canceled when the returned Promise
|
|
411
|
+
* resolves. The Observable is always run to completion.
|
|
410
412
|
*/
|
|
411
413
|
;
|
|
412
414
|
|
|
@@ -414,15 +416,14 @@ function () {
|
|
|
414
416
|
var _this9 = this;
|
|
415
417
|
|
|
416
418
|
return new Promise(function (resolve, reject) {
|
|
417
|
-
var
|
|
419
|
+
var resolved = false;
|
|
418
420
|
|
|
419
421
|
_this9.subscribe({
|
|
420
|
-
start: function start(sub) {
|
|
421
|
-
subscription = sub;
|
|
422
|
-
},
|
|
423
422
|
next: function next(val) {
|
|
424
|
-
|
|
425
|
-
|
|
423
|
+
if (!resolved) {
|
|
424
|
+
resolved = true;
|
|
425
|
+
resolve(val);
|
|
426
|
+
}
|
|
426
427
|
},
|
|
427
428
|
error: reject,
|
|
428
429
|
complete: resolve
|
|
@@ -7,11 +7,16 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
13
14
|
|
|
14
|
-
var
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
+
|
|
17
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
18
|
+
|
|
19
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
15
20
|
|
|
16
21
|
var invariant = require("fbjs/lib/invariant");
|
|
17
22
|
|
|
@@ -22,9 +27,7 @@ var stableCopy = require('../util/stableCopy');
|
|
|
22
27
|
* - `get` with TTL
|
|
23
28
|
* - cache size limiting, with least-recently *updated* entries purged first
|
|
24
29
|
*/
|
|
25
|
-
var RelayQueryResponseCache =
|
|
26
|
-
/*#__PURE__*/
|
|
27
|
-
function () {
|
|
30
|
+
var RelayQueryResponseCache = /*#__PURE__*/function () {
|
|
28
31
|
function RelayQueryResponseCache(_ref) {
|
|
29
32
|
var size = _ref.size,
|
|
30
33
|
ttl = _ref.ttl;
|
|
@@ -54,9 +57,8 @@ function () {
|
|
|
54
57
|
|
|
55
58
|
var response = this._responses.get(cacheKey);
|
|
56
59
|
|
|
57
|
-
return response != null ?
|
|
58
|
-
|
|
59
|
-
extensions: (0, _objectSpread2["default"])({}, response.payload.extensions, {
|
|
60
|
+
return response != null ? _objectSpread({}, response.payload, {
|
|
61
|
+
extensions: _objectSpread({}, response.payload.extensions, {
|
|
60
62
|
cacheTimestamp: response.fetchTime
|
|
61
63
|
})
|
|
62
64
|
}) : null;
|
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
13
14
|
|
|
14
15
|
var invariant = require("fbjs/lib/invariant");
|
|
15
16
|
|
|
17
|
+
var warning = require("fbjs/lib/warning");
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* Runtime function to correspond to the `graphql` tagged template function.
|
|
18
21
|
* All calls to this function should be transformed by the plugin.
|
|
@@ -22,13 +25,17 @@ function graphql(strings) {
|
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
function getNode(taggedNode) {
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
var node = taggedNode;
|
|
29
|
+
|
|
30
|
+
if (typeof node === 'function') {
|
|
31
|
+
node = node();
|
|
32
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayGraphQLTag: node `%s` unexpectedly wrapped in a function.', node.kind === 'Fragment' ? node.name : node.operation.name) : void 0;
|
|
33
|
+
} else if (node["default"]) {
|
|
34
|
+
// Support for languages that work (best) with ES6 modules, such as TypeScript.
|
|
35
|
+
node = node["default"];
|
|
27
36
|
}
|
|
28
37
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return data["default"] ? data["default"] : data;
|
|
38
|
+
return node;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
function isFragment(node) {
|
|
@@ -48,7 +55,7 @@ function isInlineDataFragment(node) {
|
|
|
48
55
|
|
|
49
56
|
function getFragment(taggedNode) {
|
|
50
57
|
var fragment = getNode(taggedNode);
|
|
51
|
-
!isFragment(fragment) ? process.env.NODE_ENV !== "production" ? invariant(false, '
|
|
58
|
+
!isFragment(fragment) ? process.env.NODE_ENV !== "production" ? invariant(false, 'GraphQLTag: Expected a fragment, got `%s`.', JSON.stringify(fragment)) : invariant(false) : void 0;
|
|
52
59
|
return fragment;
|
|
53
60
|
}
|
|
54
61
|
|
|
@@ -81,13 +88,13 @@ function getRefetchableFragment(taggedNode) {
|
|
|
81
88
|
|
|
82
89
|
function getRequest(taggedNode) {
|
|
83
90
|
var request = getNode(taggedNode);
|
|
84
|
-
!isRequest(request) ? process.env.NODE_ENV !== "production" ? invariant(false, '
|
|
91
|
+
!isRequest(request) ? process.env.NODE_ENV !== "production" ? invariant(false, 'GraphQLTag: Expected a request, got `%s`.', JSON.stringify(request)) : invariant(false) : void 0;
|
|
85
92
|
return request;
|
|
86
93
|
}
|
|
87
94
|
|
|
88
95
|
function getInlineDataFragment(taggedNode) {
|
|
89
96
|
var fragment = getNode(taggedNode);
|
|
90
|
-
!isInlineDataFragment(fragment) ? process.env.NODE_ENV !== "production" ? invariant(false, '
|
|
97
|
+
!isInlineDataFragment(fragment) ? process.env.NODE_ENV !== "production" ? invariant(false, 'GraphQLTag: Expected an inline data fragment, got `%s`.', JSON.stringify(fragment)) : invariant(false) : void 0;
|
|
91
98
|
return fragment;
|
|
92
99
|
}
|
|
93
100
|
|
package/lib/query/fetchQuery.js
CHANGED
|
@@ -7,12 +7,13 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var _require = require('../store/RelayModernOperationDescriptor'),
|
|
13
14
|
createOperationDescriptor = _require.createOperationDescriptor;
|
|
14
15
|
|
|
15
|
-
var _require2 = require('./
|
|
16
|
+
var _require2 = require('./GraphQLTag'),
|
|
16
17
|
getRequest = _require2.getRequest;
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
var Observable = require('../network/RelayObservable');
|
|
@@ -15,7 +16,8 @@ var RelayReplaySubject = require('../util/RelayReplaySubject');
|
|
|
15
16
|
|
|
16
17
|
var invariant = require("fbjs/lib/invariant");
|
|
17
18
|
|
|
18
|
-
var
|
|
19
|
+
var WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
|
|
20
|
+
var requestCachesByEnvironment = WEAKMAP_SUPPORTED ? new WeakMap() : new Map();
|
|
19
21
|
/**
|
|
20
22
|
* Fetches the given query and variables on the provided environment,
|
|
21
23
|
* and de-dupes identical in-flight requests.
|
|
@@ -171,15 +173,20 @@ function getObservableForCachedRequest(requestCache, cachedRequest) {
|
|
|
171
173
|
*/
|
|
172
174
|
|
|
173
175
|
|
|
174
|
-
function
|
|
176
|
+
function getActiveStatusObservableForCachedRequest(environment, requestCache, cachedRequest) {
|
|
175
177
|
return Observable.create(function (sink) {
|
|
176
178
|
var subscription = cachedRequest.subjectForInFlightStatus.subscribe({
|
|
177
179
|
error: sink.error,
|
|
178
|
-
next:
|
|
180
|
+
next: function next(response) {
|
|
181
|
+
if (!environment.isRequestActive(cachedRequest.identifier)) {
|
|
182
|
+
sink.complete();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
sink.next();
|
|
187
|
+
},
|
|
179
188
|
complete: sink.complete,
|
|
180
|
-
unsubscribe:
|
|
181
|
-
sink.complete();
|
|
182
|
-
}
|
|
189
|
+
unsubscribe: sink.complete
|
|
183
190
|
});
|
|
184
191
|
return function () {
|
|
185
192
|
subscription.unsubscribe();
|
|
@@ -187,14 +194,15 @@ function getInFlightStatusObservableForCachedRequest(requestCache, cachedRequest
|
|
|
187
194
|
});
|
|
188
195
|
}
|
|
189
196
|
/**
|
|
190
|
-
* If a request is
|
|
197
|
+
* If a request is active for the given query, variables and environment,
|
|
191
198
|
* this function will return a Promise that will resolve when that request has
|
|
192
|
-
*
|
|
193
|
-
*
|
|
199
|
+
* stops being active (receives a final payload), and the data has been saved
|
|
200
|
+
* to the store.
|
|
201
|
+
* If no request is active, null will be returned
|
|
194
202
|
*/
|
|
195
203
|
|
|
196
204
|
|
|
197
|
-
function
|
|
205
|
+
function getPromiseForActiveRequest(environment, request) {
|
|
198
206
|
var requestCache = getRequestCache(environment);
|
|
199
207
|
var cachedRequest = requestCache.get(request.identifier);
|
|
200
208
|
|
|
@@ -202,9 +210,13 @@ function getPromiseForRequestInFlight(environment, request) {
|
|
|
202
210
|
return null;
|
|
203
211
|
}
|
|
204
212
|
|
|
213
|
+
if (!environment.isRequestActive(cachedRequest.identifier)) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
205
217
|
return new Promise(function (resolve, reject) {
|
|
206
218
|
var resolveOnNext = false;
|
|
207
|
-
|
|
219
|
+
getActiveStatusObservableForCachedRequest(environment, requestCache, cachedRequest).subscribe({
|
|
208
220
|
complete: resolve,
|
|
209
221
|
error: reject,
|
|
210
222
|
next: function next(response) {
|
|
@@ -230,7 +242,7 @@ function getPromiseForRequestInFlight(environment, request) {
|
|
|
230
242
|
*/
|
|
231
243
|
|
|
232
244
|
|
|
233
|
-
function
|
|
245
|
+
function getObservableForActiveRequest(environment, request) {
|
|
234
246
|
var requestCache = getRequestCache(environment);
|
|
235
247
|
var cachedRequest = requestCache.get(request.identifier);
|
|
236
248
|
|
|
@@ -238,12 +250,11 @@ function getObservableForRequestInFlight(environment, request) {
|
|
|
238
250
|
return null;
|
|
239
251
|
}
|
|
240
252
|
|
|
241
|
-
|
|
242
|
-
|
|
253
|
+
if (!environment.isRequestActive(cachedRequest.identifier)) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
243
256
|
|
|
244
|
-
|
|
245
|
-
var requestCache = getRequestCache(environment);
|
|
246
|
-
return requestCache.has(request.identifier);
|
|
257
|
+
return getActiveStatusObservableForCachedRequest(environment, requestCache, cachedRequest);
|
|
247
258
|
}
|
|
248
259
|
/**
|
|
249
260
|
* @private
|
|
@@ -275,7 +286,6 @@ function getCachedRequest(requestCache, identifier) {
|
|
|
275
286
|
module.exports = {
|
|
276
287
|
fetchQuery: fetchQuery,
|
|
277
288
|
fetchQueryDeduped: fetchQueryDeduped,
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
hasRequestInFlight: hasRequestInFlight
|
|
289
|
+
getPromiseForActiveRequest: getPromiseForActiveRequest,
|
|
290
|
+
getObservableForActiveRequest: getObservableForActiveRequest
|
|
281
291
|
};
|
package/lib/store/ClientID.js
CHANGED
package/lib/store/DataChecker.js
CHANGED
|
@@ -8,11 +8,18 @@
|
|
|
8
8
|
* @format
|
|
9
9
|
* @emails oncall+relay
|
|
10
10
|
*/
|
|
11
|
+
// flowlint ambiguous-object-type:error
|
|
11
12
|
'use strict';
|
|
12
13
|
|
|
14
|
+
function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
15
|
+
|
|
16
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
17
|
+
|
|
18
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
19
|
+
|
|
13
20
|
var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
14
21
|
|
|
15
|
-
var
|
|
22
|
+
var RelayModernRecord = require('./RelayModernRecord');
|
|
16
23
|
|
|
17
24
|
var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
|
|
18
25
|
|
|
@@ -34,7 +41,6 @@ var _require2 = require('./RelayRecordState'),
|
|
|
34
41
|
var CONDITION = RelayConcreteNode.CONDITION,
|
|
35
42
|
CLIENT_EXTENSION = RelayConcreteNode.CLIENT_EXTENSION,
|
|
36
43
|
DEFER = RelayConcreteNode.DEFER,
|
|
37
|
-
CONNECTION = RelayConcreteNode.CONNECTION,
|
|
38
44
|
FRAGMENT_SPREAD = RelayConcreteNode.FRAGMENT_SPREAD,
|
|
39
45
|
INLINE_FRAGMENT = RelayConcreteNode.INLINE_FRAGMENT,
|
|
40
46
|
LINKED_FIELD = RelayConcreteNode.LINKED_FIELD,
|
|
@@ -57,11 +63,11 @@ var getModuleOperationKey = RelayStoreUtils.getModuleOperationKey,
|
|
|
57
63
|
* If all records are present, returns `true`, otherwise `false`.
|
|
58
64
|
*/
|
|
59
65
|
|
|
60
|
-
function check(source, target, selector, handlers, operationLoader, getDataID
|
|
66
|
+
function check(source, target, selector, handlers, operationLoader, getDataID) {
|
|
61
67
|
var dataID = selector.dataID,
|
|
62
68
|
node = selector.node,
|
|
63
69
|
variables = selector.variables;
|
|
64
|
-
var checker = new DataChecker(source, target, variables, handlers, operationLoader, getDataID
|
|
70
|
+
var checker = new DataChecker(source, target, variables, handlers, operationLoader, getDataID);
|
|
65
71
|
return checker.check(node, dataID);
|
|
66
72
|
}
|
|
67
73
|
/**
|
|
@@ -69,18 +75,13 @@ function check(source, target, selector, handlers, operationLoader, getDataID, g
|
|
|
69
75
|
*/
|
|
70
76
|
|
|
71
77
|
|
|
72
|
-
var DataChecker =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var _operationLoader;
|
|
77
|
-
|
|
78
|
-
var newConnectionEvents = [];
|
|
79
|
-
var mutator = new RelayRecordSourceMutator(source, target, newConnectionEvents);
|
|
80
|
-
this._getConnectionEvents = getConnectionEvents;
|
|
78
|
+
var DataChecker = /*#__PURE__*/function () {
|
|
79
|
+
function DataChecker(source, target, variables, handlers, operationLoader, getDataID) {
|
|
80
|
+
var mutator = new RelayRecordSourceMutator(source, target);
|
|
81
|
+
this._mostRecentlyInvalidatedAt = null;
|
|
81
82
|
this._handlers = handlers;
|
|
82
83
|
this._mutator = mutator;
|
|
83
|
-
this._operationLoader =
|
|
84
|
+
this._operationLoader = operationLoader !== null && operationLoader !== void 0 ? operationLoader : null;
|
|
84
85
|
this._recordSourceProxy = new RelayRecordSourceProxy(mutator, getDataID);
|
|
85
86
|
this._recordWasMissing = false;
|
|
86
87
|
this._source = source;
|
|
@@ -92,7 +93,13 @@ function () {
|
|
|
92
93
|
_proto.check = function check(node, dataID) {
|
|
93
94
|
this._traverse(node, dataID);
|
|
94
95
|
|
|
95
|
-
return
|
|
96
|
+
return this._recordWasMissing === true ? {
|
|
97
|
+
status: 'missing',
|
|
98
|
+
mostRecentlyInvalidatedAt: this._mostRecentlyInvalidatedAt
|
|
99
|
+
} : {
|
|
100
|
+
status: 'available',
|
|
101
|
+
mostRecentlyInvalidatedAt: this._mostRecentlyInvalidatedAt
|
|
102
|
+
};
|
|
96
103
|
};
|
|
97
104
|
|
|
98
105
|
_proto._getVariableValue = function _getVariableValue(name) {
|
|
@@ -126,12 +133,11 @@ function () {
|
|
|
126
133
|
args = _this$_getDataForHand.args,
|
|
127
134
|
record = _this$_getDataForHand.record;
|
|
128
135
|
|
|
129
|
-
var
|
|
130
|
-
|
|
131
|
-
var _iteratorError = undefined;
|
|
136
|
+
var _iterator = _createForOfIteratorHelper(this._handlers),
|
|
137
|
+
_step;
|
|
132
138
|
|
|
133
139
|
try {
|
|
134
|
-
for (
|
|
140
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
135
141
|
var handler = _step.value;
|
|
136
142
|
|
|
137
143
|
if (handler.kind === 'scalar') {
|
|
@@ -143,18 +149,9 @@ function () {
|
|
|
143
149
|
}
|
|
144
150
|
}
|
|
145
151
|
} catch (err) {
|
|
146
|
-
|
|
147
|
-
_iteratorError = err;
|
|
152
|
+
_iterator.e(err);
|
|
148
153
|
} finally {
|
|
149
|
-
|
|
150
|
-
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
|
|
151
|
-
_iterator["return"]();
|
|
152
|
-
}
|
|
153
|
-
} finally {
|
|
154
|
-
if (_didIteratorError) {
|
|
155
|
-
throw _iteratorError;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
154
|
+
_iterator.f();
|
|
158
155
|
}
|
|
159
156
|
|
|
160
157
|
this._handleMissing();
|
|
@@ -165,12 +162,11 @@ function () {
|
|
|
165
162
|
args = _this$_getDataForHand2.args,
|
|
166
163
|
record = _this$_getDataForHand2.record;
|
|
167
164
|
|
|
168
|
-
var
|
|
169
|
-
|
|
170
|
-
var _iteratorError2 = undefined;
|
|
165
|
+
var _iterator2 = _createForOfIteratorHelper(this._handlers),
|
|
166
|
+
_step2;
|
|
171
167
|
|
|
172
168
|
try {
|
|
173
|
-
for (
|
|
169
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
174
170
|
var handler = _step2.value;
|
|
175
171
|
|
|
176
172
|
if (handler.kind === 'linked') {
|
|
@@ -182,18 +178,9 @@ function () {
|
|
|
182
178
|
}
|
|
183
179
|
}
|
|
184
180
|
} catch (err) {
|
|
185
|
-
|
|
186
|
-
_iteratorError2 = err;
|
|
181
|
+
_iterator2.e(err);
|
|
187
182
|
} finally {
|
|
188
|
-
|
|
189
|
-
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
|
|
190
|
-
_iterator2["return"]();
|
|
191
|
-
}
|
|
192
|
-
} finally {
|
|
193
|
-
if (_didIteratorError2) {
|
|
194
|
-
throw _iteratorError2;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
183
|
+
_iterator2.f();
|
|
197
184
|
}
|
|
198
185
|
|
|
199
186
|
this._handleMissing();
|
|
@@ -206,12 +193,11 @@ function () {
|
|
|
206
193
|
args = _this$_getDataForHand3.args,
|
|
207
194
|
record = _this$_getDataForHand3.record;
|
|
208
195
|
|
|
209
|
-
var
|
|
210
|
-
|
|
211
|
-
var _iteratorError3 = undefined;
|
|
196
|
+
var _iterator3 = _createForOfIteratorHelper(this._handlers),
|
|
197
|
+
_step3;
|
|
212
198
|
|
|
213
199
|
try {
|
|
214
|
-
for (
|
|
200
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
215
201
|
var handler = _step3.value;
|
|
216
202
|
|
|
217
203
|
if (handler.kind === 'pluralLinked') {
|
|
@@ -229,18 +215,9 @@ function () {
|
|
|
229
215
|
}
|
|
230
216
|
}
|
|
231
217
|
} catch (err) {
|
|
232
|
-
|
|
233
|
-
_iteratorError3 = err;
|
|
218
|
+
_iterator3.e(err);
|
|
234
219
|
} finally {
|
|
235
|
-
|
|
236
|
-
if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
|
|
237
|
-
_iterator3["return"]();
|
|
238
|
-
}
|
|
239
|
-
} finally {
|
|
240
|
-
if (_didIteratorError3) {
|
|
241
|
-
throw _iteratorError3;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
220
|
+
_iterator3.f();
|
|
244
221
|
}
|
|
245
222
|
|
|
246
223
|
this._handleMissing();
|
|
@@ -254,6 +231,14 @@ function () {
|
|
|
254
231
|
}
|
|
255
232
|
|
|
256
233
|
if (status === EXISTENT) {
|
|
234
|
+
var record = this._source.get(dataID);
|
|
235
|
+
|
|
236
|
+
var invalidatedAt = RelayModernRecord.getInvalidationEpoch(record);
|
|
237
|
+
|
|
238
|
+
if (invalidatedAt != null) {
|
|
239
|
+
this._mostRecentlyInvalidatedAt = this._mostRecentlyInvalidatedAt != null ? Math.max(this._mostRecentlyInvalidatedAt, invalidatedAt) : invalidatedAt;
|
|
240
|
+
}
|
|
241
|
+
|
|
257
242
|
this._traverseSelections(node.selections, dataID);
|
|
258
243
|
}
|
|
259
244
|
};
|
|
@@ -333,11 +318,6 @@ function () {
|
|
|
333
318
|
_this2._recordWasMissing = recordWasMissing;
|
|
334
319
|
break;
|
|
335
320
|
|
|
336
|
-
case CONNECTION:
|
|
337
|
-
_this2._checkConnection(selection, dataID);
|
|
338
|
-
|
|
339
|
-
break;
|
|
340
|
-
|
|
341
321
|
default:
|
|
342
322
|
selection;
|
|
343
323
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayAsyncLoader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
|
|
@@ -371,36 +351,6 @@ function () {
|
|
|
371
351
|
}
|
|
372
352
|
};
|
|
373
353
|
|
|
374
|
-
_proto._checkConnection = function _checkConnection(connection, dataID) {
|
|
375
|
-
var _this3 = this;
|
|
376
|
-
|
|
377
|
-
var connectionID = RelayConnection.createConnectionID(dataID, connection.label);
|
|
378
|
-
|
|
379
|
-
var connectionEvents = this._getConnectionEvents(connectionID);
|
|
380
|
-
|
|
381
|
-
if (connectionEvents == null || connectionEvents.length === 0) {
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
connectionEvents.forEach(function (event) {
|
|
386
|
-
if (event.kind === 'fetch') {
|
|
387
|
-
event.edgeIDs.forEach(function (edgeID) {
|
|
388
|
-
if (edgeID != null) {
|
|
389
|
-
_this3._traverse(connection.edges, edgeID);
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
} else if (event.kind === 'insert') {
|
|
393
|
-
_this3._traverse(connection.edges, event.edgeID);
|
|
394
|
-
} else if (event.kind === 'stream.edge') {
|
|
395
|
-
_this3._traverse(connection.edges, event.edgeID);
|
|
396
|
-
} else if (event.kind === 'stream.pageInfo') {// no-op
|
|
397
|
-
} else {
|
|
398
|
-
event;
|
|
399
|
-
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'DataChecker: Unexpected connection event kind `%s`.', event.kind) : invariant(false) : void 0;
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
};
|
|
403
|
-
|
|
404
354
|
_proto._checkScalar = function _checkScalar(field, dataID) {
|
|
405
355
|
var storageKey = getStorageKey(field, this._variables);
|
|
406
356
|
|
|
@@ -434,7 +384,7 @@ function () {
|
|
|
434
384
|
};
|
|
435
385
|
|
|
436
386
|
_proto._checkPluralLink = function _checkPluralLink(field, dataID) {
|
|
437
|
-
var
|
|
387
|
+
var _this3 = this;
|
|
438
388
|
|
|
439
389
|
var storageKey = getStorageKey(field, this._variables);
|
|
440
390
|
|
|
@@ -451,7 +401,7 @@ function () {
|
|
|
451
401
|
if (linkedIDs) {
|
|
452
402
|
linkedIDs.forEach(function (linkedID) {
|
|
453
403
|
if (linkedID != null) {
|
|
454
|
-
|
|
404
|
+
_this3._traverse(field, linkedID);
|
|
455
405
|
}
|
|
456
406
|
});
|
|
457
407
|
}
|