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.
Files changed (157) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +34 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/index.js +1 -1
  5. package/index.js.flow +314 -0
  6. package/lib/handlers/RelayDefaultHandlerProvider.js +3 -2
  7. package/lib/handlers/connection/{RelayConnectionHandler.js → ConnectionHandler.js} +34 -35
  8. package/lib/handlers/connection/{RelayConnectionInterface.js → ConnectionInterface.js} +3 -30
  9. package/lib/index.js +29 -27
  10. package/lib/mutations/RelayDeclarativeMutationConfig.js +30 -52
  11. package/lib/mutations/RelayRecordProxy.js +6 -3
  12. package/lib/mutations/RelayRecordSourceMutator.js +3 -9
  13. package/lib/mutations/RelayRecordSourceProxy.js +21 -24
  14. package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -14
  15. package/lib/mutations/applyOptimisticMutation.js +2 -1
  16. package/lib/mutations/commitLocalUpdate.js +1 -0
  17. package/lib/mutations/commitMutation.js +26 -8
  18. package/lib/mutations/validateMutation.js +21 -11
  19. package/lib/network/ConvertToExecuteFunction.js +1 -0
  20. package/lib/network/RelayNetwork.js +1 -0
  21. package/lib/network/RelayNetworkTypes.js +1 -0
  22. package/lib/network/RelayObservable.js +10 -9
  23. package/lib/network/RelayQueryResponseCache.js +9 -7
  24. package/lib/query/{RelayModernGraphQLTag.js → GraphQLTag.js} +15 -8
  25. package/lib/query/fetchQuery.js +2 -1
  26. package/lib/query/fetchQueryInternal.js +30 -20
  27. package/lib/store/ClientID.js +1 -0
  28. package/lib/store/DataChecker.js +47 -97
  29. package/lib/store/RelayConcreteVariables.js +7 -2
  30. package/lib/store/RelayModernEnvironment.js +82 -41
  31. package/lib/store/RelayModernFragmentSpecResolver.js +61 -21
  32. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  33. package/lib/store/RelayModernQueryExecutor.js +476 -333
  34. package/lib/store/RelayModernRecord.js +39 -9
  35. package/lib/store/RelayModernSelector.js +2 -1
  36. package/lib/store/RelayModernStore.js +359 -371
  37. package/lib/store/RelayOperationTracker.js +36 -78
  38. package/lib/store/RelayOptimisticRecordSource.js +8 -5
  39. package/lib/store/RelayPublishQueue.js +66 -53
  40. package/lib/store/RelayReader.js +2 -24
  41. package/lib/store/RelayRecordSource.js +3 -9
  42. package/lib/store/RelayRecordSourceMapImpl.js +14 -18
  43. package/lib/store/RelayRecordState.js +1 -0
  44. package/lib/store/RelayReferenceMarker.js +8 -58
  45. package/lib/store/RelayResponseNormalizer.js +15 -144
  46. package/lib/store/RelayStoreTypes.js +1 -0
  47. package/lib/store/RelayStoreUtils.js +34 -10
  48. package/lib/store/StoreInspector.js +11 -5
  49. package/lib/store/ViewerPattern.js +1 -0
  50. package/lib/store/cloneRelayHandleSourceField.js +1 -0
  51. package/lib/store/createFragmentSpecResolver.js +1 -0
  52. package/lib/store/createRelayContext.js +1 -0
  53. package/lib/store/defaultGetDataID.js +1 -0
  54. package/lib/store/hasOverlappingIDs.js +1 -0
  55. package/lib/store/isRelayModernEnvironment.js +1 -0
  56. package/lib/store/normalizeRelayPayload.js +8 -4
  57. package/lib/store/readInlineData.js +2 -1
  58. package/lib/subscription/requestSubscription.js +6 -3
  59. package/lib/util/JSResourceTypes.flow.js +12 -0
  60. package/lib/util/NormalizationNode.js +1 -0
  61. package/lib/util/ReaderNode.js +1 -0
  62. package/lib/util/RelayConcreteNode.js +3 -0
  63. package/lib/util/RelayDefaultHandleKey.js +1 -0
  64. package/lib/util/RelayError.js +2 -1
  65. package/lib/util/RelayFeatureFlags.js +3 -2
  66. package/lib/util/RelayProfiler.js +1 -0
  67. package/lib/util/RelayReplaySubject.js +2 -3
  68. package/lib/util/RelayRuntimeTypes.js +1 -0
  69. package/lib/util/createPayloadFor3DField.js +34 -0
  70. package/lib/util/deepFreeze.js +1 -0
  71. package/lib/util/generateID.js +1 -0
  72. package/lib/util/getFragmentIdentifier.js +1 -0
  73. package/lib/util/getRelayHandleKey.js +1 -0
  74. package/lib/util/getRequestIdentifier.js +1 -0
  75. package/lib/util/isPromise.js +1 -0
  76. package/lib/util/isScalarAndEqual.js +1 -0
  77. package/lib/util/recycleNodesInto.js +1 -0
  78. package/lib/util/resolveImmediate.js +1 -0
  79. package/lib/util/stableCopy.js +1 -0
  80. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  81. package/mutations/RelayRecordProxy.js.flow +165 -0
  82. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  83. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  84. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  85. package/mutations/applyOptimisticMutation.js.flow +76 -0
  86. package/mutations/commitLocalUpdate.js.flow +24 -0
  87. package/mutations/commitMutation.js.flow +184 -0
  88. package/mutations/validateMutation.js.flow +211 -0
  89. package/network/ConvertToExecuteFunction.js.flow +49 -0
  90. package/network/RelayNetwork.js.flow +84 -0
  91. package/network/RelayNetworkTypes.js.flow +123 -0
  92. package/network/RelayObservable.js.flow +634 -0
  93. package/network/RelayQueryResponseCache.js.flow +111 -0
  94. package/package.json +1 -1
  95. package/query/GraphQLTag.js.flow +166 -0
  96. package/query/fetchQuery.js.flow +47 -0
  97. package/query/fetchQueryInternal.js.flow +349 -0
  98. package/relay-runtime.js +2 -2
  99. package/relay-runtime.min.js +2 -2
  100. package/store/ClientID.js.flow +43 -0
  101. package/store/DataChecker.js.flow +426 -0
  102. package/store/RelayConcreteVariables.js.flow +96 -0
  103. package/store/RelayModernEnvironment.js.flow +526 -0
  104. package/store/RelayModernFragmentSpecResolver.js.flow +426 -0
  105. package/store/RelayModernOperationDescriptor.js.flow +88 -0
  106. package/store/RelayModernQueryExecutor.js.flow +1327 -0
  107. package/store/RelayModernRecord.js.flow +403 -0
  108. package/store/RelayModernSelector.js.flow +444 -0
  109. package/store/RelayModernStore.js.flow +757 -0
  110. package/store/RelayOperationTracker.js.flow +164 -0
  111. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  112. package/store/RelayPublishQueue.js.flow +401 -0
  113. package/store/RelayReader.js.flow +376 -0
  114. package/store/RelayRecordSource.js.flow +29 -0
  115. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  116. package/store/RelayRecordState.js.flow +37 -0
  117. package/store/RelayReferenceMarker.js.flow +236 -0
  118. package/store/RelayResponseNormalizer.js.flow +556 -0
  119. package/store/RelayStoreTypes.js.flow +873 -0
  120. package/store/RelayStoreUtils.js.flow +218 -0
  121. package/store/StoreInspector.js.flow +173 -0
  122. package/store/ViewerPattern.js.flow +26 -0
  123. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  124. package/store/createFragmentSpecResolver.js.flow +55 -0
  125. package/store/createRelayContext.js.flow +44 -0
  126. package/store/defaultGetDataID.js.flow +27 -0
  127. package/store/hasOverlappingIDs.js.flow +34 -0
  128. package/store/isRelayModernEnvironment.js.flow +27 -0
  129. package/store/normalizeRelayPayload.js.flow +51 -0
  130. package/store/readInlineData.js.flow +75 -0
  131. package/subscription/requestSubscription.js.flow +100 -0
  132. package/util/JSResourceTypes.flow.js.flow +20 -0
  133. package/util/NormalizationNode.js.flow +191 -0
  134. package/util/ReaderNode.js.flow +208 -0
  135. package/util/RelayConcreteNode.js.flow +80 -0
  136. package/util/RelayDefaultHandleKey.js.flow +17 -0
  137. package/util/RelayError.js.flow +33 -0
  138. package/util/RelayFeatureFlags.js.flow +30 -0
  139. package/util/RelayProfiler.js.flow +284 -0
  140. package/util/RelayReplaySubject.js.flow +134 -0
  141. package/util/RelayRuntimeTypes.js.flow +70 -0
  142. package/util/createPayloadFor3DField.js.flow +43 -0
  143. package/util/deepFreeze.js.flow +36 -0
  144. package/util/generateID.js.flow +21 -0
  145. package/util/getFragmentIdentifier.js.flow +52 -0
  146. package/util/getRelayHandleKey.js.flow +41 -0
  147. package/util/getRequestIdentifier.js.flow +41 -0
  148. package/util/isPromise.js.flow +21 -0
  149. package/util/isScalarAndEqual.js.flow +26 -0
  150. package/util/recycleNodesInto.js.flow +80 -0
  151. package/util/resolveImmediate.js.flow +30 -0
  152. package/util/stableCopy.js.flow +35 -0
  153. package/lib/handlers/RelayDefaultMissingFieldHandlers.js +0 -26
  154. package/lib/store/RelayConnection.js +0 -36
  155. package/lib/store/RelayConnectionResolver.js +0 -177
  156. package/lib/store/RelayRecordSourceObjectImpl.js +0 -78
  157. 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 _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
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
- return validateSelections(r, selections, (0, _objectSpread2["default"])({}, context, {
123
- path: path
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, (0, _objectSpread2["default"])({}, context, {
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
- return validateOptimisticResponse(r, context);
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, (0, _objectSpread2["default"])({}, context, {
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 RelayObservable = require('./RelayObservable');
@@ -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 invariant = require("fbjs/lib/invariant");
@@ -7,4 +7,5 @@
7
7
  *
8
8
  * @format
9
9
  */
10
+ // flowlint ambiguous-object-type:error
10
11
  'use strict';
@@ -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 subscription;
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
- resolve(val);
425
- subscription.unsubscribe();
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 _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
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 ? // $FlowFixMe
58
- (0, _objectSpread2["default"])({}, response.payload, {
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
- if (typeof taggedNode !== 'function') {
26
- return taggedNode;
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
- var data = taggedNode(); // Support for languages that work (best) with ES6 modules, such as TypeScript.
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, 'RelayModernGraphQLTag: Expected a fragment, got `%s`.', JSON.stringify(fragment)) : invariant(false) : void 0;
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, 'RelayModernGraphQLTag: Expected a request, got `%s`.', JSON.stringify(request)) : invariant(false) : void 0;
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, 'RelayModernGraphQLTag: Expected an inline data fragment, got `%s`.', JSON.stringify(fragment)) : invariant(false) : void 0;
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
 
@@ -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('./RelayModernGraphQLTag'),
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 requestCachesByEnvironment = new Map();
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 getInFlightStatusObservableForCachedRequest(requestCache, cachedRequest) {
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: sink.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: function 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 in flight for the given query, variables and environment,
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
- * completed and the data has been saved to the store.
193
- * If no request is in flight, null will be returned
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 getPromiseForRequestInFlight(environment, request) {
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
- getInFlightStatusObservableForCachedRequest(requestCache, cachedRequest).subscribe({
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 getObservableForRequestInFlight(environment, request) {
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
- return getInFlightStatusObservableForCachedRequest(requestCache, cachedRequest);
242
- }
253
+ if (!environment.isRequestActive(cachedRequest.identifier)) {
254
+ return null;
255
+ }
243
256
 
244
- function hasRequestInFlight(environment, request) {
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
- getPromiseForRequestInFlight: getPromiseForRequestInFlight,
279
- getObservableForRequestInFlight: getObservableForRequestInFlight,
280
- hasRequestInFlight: hasRequestInFlight
289
+ getPromiseForActiveRequest: getPromiseForActiveRequest,
290
+ getObservableForActiveRequest: getObservableForActiveRequest
281
291
  };
@@ -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 PREFIX = 'client:';
@@ -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 RelayConnection = require('./RelayConnection');
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, getConnectionEvents) {
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, getConnectionEvents);
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
- /*#__PURE__*/
74
- function () {
75
- function DataChecker(source, target, variables, handlers, operationLoader, getDataID, getConnectionEvents) {
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 = (_operationLoader = operationLoader) !== null && _operationLoader !== void 0 ? _operationLoader : null;
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 !this._recordWasMissing;
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 _iteratorNormalCompletion = true;
130
- var _didIteratorError = false;
131
- var _iteratorError = undefined;
136
+ var _iterator = _createForOfIteratorHelper(this._handlers),
137
+ _step;
132
138
 
133
139
  try {
134
- for (var _iterator = this._handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
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
- _didIteratorError = true;
147
- _iteratorError = err;
152
+ _iterator.e(err);
148
153
  } finally {
149
- try {
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 _iteratorNormalCompletion2 = true;
169
- var _didIteratorError2 = false;
170
- var _iteratorError2 = undefined;
165
+ var _iterator2 = _createForOfIteratorHelper(this._handlers),
166
+ _step2;
171
167
 
172
168
  try {
173
- for (var _iterator2 = this._handlers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
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
- _didIteratorError2 = true;
186
- _iteratorError2 = err;
181
+ _iterator2.e(err);
187
182
  } finally {
188
- try {
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 _iteratorNormalCompletion3 = true;
210
- var _didIteratorError3 = false;
211
- var _iteratorError3 = undefined;
196
+ var _iterator3 = _createForOfIteratorHelper(this._handlers),
197
+ _step3;
212
198
 
213
199
  try {
214
- for (var _iterator3 = this._handlers[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
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
- _didIteratorError3 = true;
233
- _iteratorError3 = err;
218
+ _iterator3.e(err);
234
219
  } finally {
235
- try {
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 _this4 = this;
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
- _this4._traverse(field, linkedID);
404
+ _this3._traverse(field, linkedID);
455
405
  }
456
406
  });
457
407
  }