relay-runtime 9.0.0 → 10.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 (142) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +47 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/handlers/connection/MutationHandlers.js.flow +199 -0
  5. package/index.js +1 -1
  6. package/index.js.flow +335 -0
  7. package/lib/handlers/RelayDefaultHandlerProvider.js +20 -0
  8. package/lib/handlers/connection/ConnectionHandler.js +1 -3
  9. package/lib/handlers/connection/MutationHandlers.js +212 -0
  10. package/lib/index.js +14 -2
  11. package/lib/mutations/RelayDeclarativeMutationConfig.js +22 -45
  12. package/lib/mutations/RelayRecordProxy.js +1 -3
  13. package/lib/mutations/RelayRecordSourceMutator.js +1 -3
  14. package/lib/mutations/RelayRecordSourceProxy.js +1 -3
  15. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -3
  16. package/lib/mutations/commitMutation.js +2 -3
  17. package/lib/mutations/validateMutation.js +40 -9
  18. package/lib/network/RelayObservable.js +9 -9
  19. package/lib/network/RelayQueryResponseCache.js +8 -6
  20. package/lib/query/GraphQLTag.js +2 -1
  21. package/lib/query/PreloadableQueryRegistry.js +70 -0
  22. package/lib/query/fetchQuery.js +2 -3
  23. package/lib/query/fetchQueryInternal.js +5 -14
  24. package/lib/store/DataChecker.js +200 -71
  25. package/lib/store/RelayConcreteVariables.js +6 -2
  26. package/lib/store/RelayModernEnvironment.js +124 -65
  27. package/lib/store/RelayModernFragmentSpecResolver.js +19 -14
  28. package/lib/store/RelayModernOperationDescriptor.js +6 -5
  29. package/lib/store/RelayModernQueryExecutor.js +122 -73
  30. package/lib/store/RelayModernRecord.js +14 -9
  31. package/lib/store/RelayModernSelector.js +6 -2
  32. package/lib/store/RelayModernStore.js +281 -131
  33. package/lib/store/RelayOperationTracker.js +35 -78
  34. package/lib/store/RelayOptimisticRecordSource.js +7 -5
  35. package/lib/store/RelayPublishQueue.js +2 -4
  36. package/lib/store/RelayReader.js +304 -52
  37. package/lib/store/RelayRecordSource.js +1 -3
  38. package/lib/store/RelayRecordSourceMapImpl.js +13 -18
  39. package/lib/store/RelayReferenceMarker.js +125 -14
  40. package/lib/store/RelayResponseNormalizer.js +261 -66
  41. package/lib/store/RelayStoreReactFlightUtils.js +47 -0
  42. package/lib/store/RelayStoreUtils.js +1 -0
  43. package/lib/store/StoreInspector.js +8 -8
  44. package/lib/store/TypeID.js +28 -0
  45. package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
  46. package/lib/store/defaultRequiredFieldLogger.js +18 -0
  47. package/lib/store/normalizeRelayPayload.js +6 -2
  48. package/lib/store/readInlineData.js +1 -1
  49. package/lib/subscription/requestSubscription.js +4 -3
  50. package/lib/util/NormalizationNode.js +1 -5
  51. package/lib/util/RelayConcreteNode.js +11 -6
  52. package/lib/util/RelayError.js +39 -9
  53. package/lib/util/RelayFeatureFlags.js +6 -3
  54. package/lib/util/RelayReplaySubject.js +3 -3
  55. package/lib/util/createPayloadFor3DField.js +7 -2
  56. package/lib/util/getFragmentIdentifier.js +12 -3
  57. package/lib/util/getOperation.js +33 -0
  58. package/lib/util/getRequestIdentifier.js +2 -2
  59. package/lib/util/isEmptyObject.js +25 -0
  60. package/lib/util/recycleNodesInto.js +6 -7
  61. package/lib/util/reportMissingRequiredFields.js +48 -0
  62. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  63. package/mutations/RelayRecordProxy.js.flow +165 -0
  64. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  65. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  66. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  67. package/mutations/applyOptimisticMutation.js.flow +76 -0
  68. package/mutations/commitLocalUpdate.js.flow +24 -0
  69. package/mutations/commitMutation.js.flow +181 -0
  70. package/mutations/validateMutation.js.flow +242 -0
  71. package/network/ConvertToExecuteFunction.js.flow +49 -0
  72. package/network/RelayNetwork.js.flow +84 -0
  73. package/network/RelayNetworkTypes.js.flow +145 -0
  74. package/network/RelayObservable.js.flow +634 -0
  75. package/network/RelayQueryResponseCache.js.flow +111 -0
  76. package/package.json +2 -2
  77. package/query/GraphQLTag.js.flow +168 -0
  78. package/query/PreloadableQueryRegistry.js.flow +65 -0
  79. package/query/fetchQuery.js.flow +47 -0
  80. package/query/fetchQueryInternal.js.flow +343 -0
  81. package/relay-runtime.js +2 -2
  82. package/relay-runtime.min.js +2 -2
  83. package/store/ClientID.js.flow +43 -0
  84. package/store/DataChecker.js.flow +568 -0
  85. package/store/RelayConcreteVariables.js.flow +96 -0
  86. package/store/RelayModernEnvironment.js.flow +571 -0
  87. package/store/RelayModernFragmentSpecResolver.js.flow +438 -0
  88. package/store/RelayModernOperationDescriptor.js.flow +92 -0
  89. package/store/RelayModernQueryExecutor.js.flow +1345 -0
  90. package/store/RelayModernRecord.js.flow +403 -0
  91. package/store/RelayModernSelector.js.flow +455 -0
  92. package/store/RelayModernStore.js.flow +858 -0
  93. package/store/RelayOperationTracker.js.flow +164 -0
  94. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  95. package/store/RelayPublishQueue.js.flow +401 -0
  96. package/store/RelayReader.js.flow +638 -0
  97. package/store/RelayRecordSource.js.flow +29 -0
  98. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  99. package/store/RelayRecordState.js.flow +37 -0
  100. package/store/RelayReferenceMarker.js.flow +324 -0
  101. package/store/RelayResponseNormalizer.js.flow +791 -0
  102. package/store/RelayStoreReactFlightUtils.js.flow +64 -0
  103. package/store/RelayStoreTypes.js.flow +958 -0
  104. package/store/RelayStoreUtils.js.flow +219 -0
  105. package/store/StoreInspector.js.flow +171 -0
  106. package/store/TypeID.js.flow +28 -0
  107. package/store/ViewerPattern.js.flow +26 -0
  108. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  109. package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
  110. package/store/createFragmentSpecResolver.js.flow +55 -0
  111. package/store/createRelayContext.js.flow +44 -0
  112. package/store/defaultGetDataID.js.flow +27 -0
  113. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  114. package/store/hasOverlappingIDs.js.flow +34 -0
  115. package/store/isRelayModernEnvironment.js.flow +27 -0
  116. package/store/normalizeRelayPayload.js.flow +51 -0
  117. package/store/readInlineData.js.flow +75 -0
  118. package/subscription/requestSubscription.js.flow +103 -0
  119. package/util/JSResourceTypes.flow.js.flow +20 -0
  120. package/util/NormalizationNode.js.flow +213 -0
  121. package/util/ReaderNode.js.flow +227 -0
  122. package/util/RelayConcreteNode.js.flow +99 -0
  123. package/util/RelayDefaultHandleKey.js.flow +17 -0
  124. package/util/RelayError.js.flow +62 -0
  125. package/util/RelayFeatureFlags.js.flow +37 -0
  126. package/util/RelayProfiler.js.flow +284 -0
  127. package/util/RelayReplaySubject.js.flow +135 -0
  128. package/util/RelayRuntimeTypes.js.flow +72 -0
  129. package/util/createPayloadFor3DField.js.flow +43 -0
  130. package/util/deepFreeze.js.flow +36 -0
  131. package/util/generateID.js.flow +21 -0
  132. package/util/getFragmentIdentifier.js.flow +76 -0
  133. package/util/getOperation.js.flow +40 -0
  134. package/util/getRelayHandleKey.js.flow +41 -0
  135. package/util/getRequestIdentifier.js.flow +42 -0
  136. package/util/isEmptyObject.js.flow +25 -0
  137. package/util/isPromise.js.flow +21 -0
  138. package/util/isScalarAndEqual.js.flow +26 -0
  139. package/util/recycleNodesInto.js.flow +87 -0
  140. package/util/reportMissingRequiredFields.js.flow +51 -0
  141. package/util/resolveImmediate.js.flow +30 -0
  142. package/util/stableCopy.js.flow +35 -0
@@ -12,7 +12,11 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- 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; }
16
20
 
17
21
  var invariant = require("fbjs/lib/invariant");
18
22
 
@@ -23,9 +27,7 @@ var stableCopy = require('../util/stableCopy');
23
27
  * - `get` with TTL
24
28
  * - cache size limiting, with least-recently *updated* entries purged first
25
29
  */
26
- var RelayQueryResponseCache =
27
- /*#__PURE__*/
28
- function () {
30
+ var RelayQueryResponseCache = /*#__PURE__*/function () {
29
31
  function RelayQueryResponseCache(_ref) {
30
32
  var size = _ref.size,
31
33
  ttl = _ref.ttl;
@@ -55,8 +57,8 @@ function () {
55
57
 
56
58
  var response = this._responses.get(cacheKey);
57
59
 
58
- return response != null ? (0, _objectSpread2["default"])({}, response.payload, {
59
- extensions: (0, _objectSpread2["default"])({}, response.payload.extensions, {
60
+ return response != null ? _objectSpread(_objectSpread({}, response.payload), {}, {
61
+ extensions: _objectSpread(_objectSpread({}, response.payload.extensions), {}, {
60
62
  cacheTimestamp: response.fetchTime
61
63
  })
62
64
  }) : null;
@@ -21,7 +21,7 @@ var warning = require("fbjs/lib/warning");
21
21
  * All calls to this function should be transformed by the plugin.
22
22
  */
23
23
  function graphql(strings) {
24
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'graphql: Unexpected invocation at runtime. Either the Babel transform ' + 'was not set up, or it failed to identify this call site. Make sure it ' + 'is being used verbatim as `graphql`.') : invariant(false) : void 0;
24
+ !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'graphql: Unexpected invocation at runtime. Either the Babel transform ' + 'was not set up, or it failed to identify this call site. Make sure it ' + 'is being used verbatim as `graphql`. Note also that there cannot be ' + 'a space between graphql and the backtick that follows.') : invariant(false) : void 0;
25
25
  }
26
26
 
27
27
  function getNode(taggedNode) {
@@ -100,6 +100,7 @@ function getInlineDataFragment(taggedNode) {
100
100
 
101
101
  module.exports = {
102
102
  getFragment: getFragment,
103
+ getNode: getNode,
103
104
  getPaginationFragment: getPaginationFragment,
104
105
  getRefetchableFragment: getRefetchableFragment,
105
106
  getRequest: getRequest,
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails oncall+relay
8
+ *
9
+ * @format
10
+ */
11
+ 'use strict';
12
+
13
+ var PreloadableQueryRegistry = /*#__PURE__*/function () {
14
+ function PreloadableQueryRegistry() {
15
+ this._preloadableQueries = new Map();
16
+ this._callbacks = new Map();
17
+ }
18
+
19
+ var _proto = PreloadableQueryRegistry.prototype;
20
+
21
+ _proto.set = function set(key, value) {
22
+ this._preloadableQueries.set(key, value);
23
+
24
+ var callbacks = this._callbacks.get(key);
25
+
26
+ if (callbacks != null) {
27
+ callbacks.forEach(function (cb) {
28
+ try {
29
+ cb(value);
30
+ } catch (e) {
31
+ // We do *not* want to throw in this tick, as this callback is executed
32
+ // while a query is required for the very first time.
33
+ setTimeout(function () {
34
+ throw e;
35
+ }, 0);
36
+ }
37
+ });
38
+ }
39
+ };
40
+
41
+ _proto.get = function get(key) {
42
+ return this._preloadableQueries.get(key);
43
+ };
44
+
45
+ _proto.onLoad = function onLoad(key, callback) {
46
+ var _this$_callbacks$get;
47
+
48
+ var callbacks = (_this$_callbacks$get = this._callbacks.get(key)) !== null && _this$_callbacks$get !== void 0 ? _this$_callbacks$get : new Set();
49
+ callbacks.add(callback);
50
+
51
+ var dispose = function dispose() {
52
+ callbacks["delete"](callback);
53
+ };
54
+
55
+ this._callbacks.set(key, callbacks);
56
+
57
+ return {
58
+ dispose: dispose
59
+ };
60
+ };
61
+
62
+ _proto.clear = function clear() {
63
+ this._preloadableQueries.clear();
64
+ };
65
+
66
+ return PreloadableQueryRegistry;
67
+ }();
68
+
69
+ var preloadableQueryRegistry = new PreloadableQueryRegistry();
70
+ module.exports = preloadableQueryRegistry;
@@ -28,10 +28,9 @@ function fetchQuery(environment, taggedNode, variables, cacheConfig) {
28
28
  throw new Error('fetchQuery: Expected query operation');
29
29
  }
30
30
 
31
- var operation = createOperationDescriptor(query, variables);
31
+ var operation = createOperationDescriptor(query, variables, cacheConfig);
32
32
  return environment.execute({
33
- operation: operation,
34
- cacheConfig: cacheConfig
33
+ operation: operation
35
34
  }).map(function () {
36
35
  return environment.lookup(operation.fragment).data;
37
36
  }).toPromise();
@@ -82,11 +82,10 @@ var requestCachesByEnvironment = WEAKMAP_SUPPORTED ? new WeakMap() : new Map();
82
82
  * ```
83
83
  */
84
84
 
85
- function fetchQuery(environment, operation, options) {
86
- return fetchQueryDeduped(environment, operation.request, function () {
85
+ function fetchQuery(environment, operation) {
86
+ return fetchQueryDeduped(environment, operation.request.identifier, function () {
87
87
  return environment.execute({
88
- operation: operation,
89
- cacheConfig: options === null || options === void 0 ? void 0 : options.networkCacheConfig
88
+ operation: operation
90
89
  });
91
90
  });
92
91
  }
@@ -99,10 +98,9 @@ function fetchQuery(environment, operation, options) {
99
98
  */
100
99
 
101
100
 
102
- function fetchQueryDeduped(environment, request, fetchFn) {
101
+ function fetchQueryDeduped(environment, identifier, fetchFn) {
103
102
  return Observable.create(function (sink) {
104
103
  var requestCache = getRequestCache(environment);
105
- var identifier = request.identifier;
106
104
  var cachedRequest = requestCache.get(identifier);
107
105
 
108
106
  if (!cachedRequest) {
@@ -256,12 +254,6 @@ function getObservableForActiveRequest(environment, request) {
256
254
 
257
255
  return getActiveStatusObservableForCachedRequest(environment, requestCache, cachedRequest);
258
256
  }
259
-
260
- function isRequestActive(environment, request) {
261
- var requestCache = getRequestCache(environment);
262
- var cachedRequest = requestCache.get(request.identifier);
263
- return cachedRequest != null && environment.isRequestActive(cachedRequest.identifier);
264
- }
265
257
  /**
266
258
  * @private
267
259
  */
@@ -293,6 +285,5 @@ module.exports = {
293
285
  fetchQuery: fetchQuery,
294
286
  fetchQueryDeduped: fetchQueryDeduped,
295
287
  getPromiseForActiveRequest: getPromiseForActiveRequest,
296
- getObservableForActiveRequest: getObservableForActiveRequest,
297
- isRequestActive: isRequestActive
288
+ getObservableForActiveRequest: getObservableForActiveRequest
298
289
  };
@@ -11,18 +11,32 @@
11
11
  // flowlint ambiguous-object-type:error
12
12
  'use strict';
13
13
 
14
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; 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 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(o); 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
+
14
20
  var RelayConcreteNode = require('../util/RelayConcreteNode');
15
21
 
22
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
23
+
16
24
  var RelayModernRecord = require('./RelayModernRecord');
17
25
 
18
26
  var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
19
27
 
20
28
  var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
21
29
 
30
+ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
31
+
22
32
  var RelayStoreUtils = require('./RelayStoreUtils');
23
33
 
24
34
  var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
25
35
 
36
+ var cloneRelayScalarHandleSourceField = require('./cloneRelayScalarHandleSourceField');
37
+
38
+ var getOperation = require('../util/getOperation');
39
+
26
40
  var invariant = require("fbjs/lib/invariant");
27
41
 
28
42
  var _require = require('./ClientID'),
@@ -32,9 +46,13 @@ var _require2 = require('./RelayRecordState'),
32
46
  EXISTENT = _require2.EXISTENT,
33
47
  UNKNOWN = _require2.UNKNOWN;
34
48
 
49
+ var _require3 = require('./TypeID'),
50
+ generateTypeID = _require3.generateTypeID;
51
+
35
52
  var CONDITION = RelayConcreteNode.CONDITION,
36
53
  CLIENT_EXTENSION = RelayConcreteNode.CLIENT_EXTENSION,
37
54
  DEFER = RelayConcreteNode.DEFER,
55
+ FLIGHT_FIELD = RelayConcreteNode.FLIGHT_FIELD,
38
56
  FRAGMENT_SPREAD = RelayConcreteNode.FRAGMENT_SPREAD,
39
57
  INLINE_FRAGMENT = RelayConcreteNode.INLINE_FRAGMENT,
40
58
  LINKED_FIELD = RelayConcreteNode.LINKED_FIELD,
@@ -42,8 +60,10 @@ var CONDITION = RelayConcreteNode.CONDITION,
42
60
  MODULE_IMPORT = RelayConcreteNode.MODULE_IMPORT,
43
61
  SCALAR_FIELD = RelayConcreteNode.SCALAR_FIELD,
44
62
  SCALAR_HANDLE = RelayConcreteNode.SCALAR_HANDLE,
45
- STREAM = RelayConcreteNode.STREAM;
46
- var getModuleOperationKey = RelayStoreUtils.getModuleOperationKey,
63
+ STREAM = RelayConcreteNode.STREAM,
64
+ TYPE_DISCRIMINATOR = RelayConcreteNode.TYPE_DISCRIMINATOR;
65
+ var ROOT_ID = RelayStoreUtils.ROOT_ID,
66
+ getModuleOperationKey = RelayStoreUtils.getModuleOperationKey,
47
67
  getStorageKey = RelayStoreUtils.getStorageKey,
48
68
  getArgumentValues = RelayStoreUtils.getArgumentValues;
49
69
  /**
@@ -69,17 +89,13 @@ function check(source, target, selector, handlers, operationLoader, getDataID) {
69
89
  */
70
90
 
71
91
 
72
- var DataChecker =
73
- /*#__PURE__*/
74
- function () {
92
+ var DataChecker = /*#__PURE__*/function () {
75
93
  function DataChecker(source, target, variables, handlers, operationLoader, getDataID) {
76
- var _operationLoader;
77
-
78
94
  var mutator = new RelayRecordSourceMutator(source, target);
79
95
  this._mostRecentlyInvalidatedAt = null;
80
96
  this._handlers = handlers;
81
97
  this._mutator = mutator;
82
- this._operationLoader = (_operationLoader = operationLoader) !== null && _operationLoader !== void 0 ? _operationLoader : null;
98
+ this._operationLoader = operationLoader !== null && operationLoader !== void 0 ? operationLoader : null;
83
99
  this._recordSourceProxy = new RelayRecordSourceProxy(mutator, getDataID);
84
100
  this._recordWasMissing = false;
85
101
  this._source = source;
@@ -131,12 +147,11 @@ function () {
131
147
  args = _this$_getDataForHand.args,
132
148
  record = _this$_getDataForHand.record;
133
149
 
134
- var _iteratorNormalCompletion = true;
135
- var _didIteratorError = false;
136
- var _iteratorError = undefined;
150
+ var _iterator = _createForOfIteratorHelper(this._handlers),
151
+ _step;
137
152
 
138
153
  try {
139
- for (var _iterator = this._handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
154
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
140
155
  var handler = _step.value;
141
156
 
142
157
  if (handler.kind === 'scalar') {
@@ -148,18 +163,9 @@ function () {
148
163
  }
149
164
  }
150
165
  } catch (err) {
151
- _didIteratorError = true;
152
- _iteratorError = err;
166
+ _iterator.e(err);
153
167
  } finally {
154
- try {
155
- if (!_iteratorNormalCompletion && _iterator["return"] != null) {
156
- _iterator["return"]();
157
- }
158
- } finally {
159
- if (_didIteratorError) {
160
- throw _iteratorError;
161
- }
162
- }
168
+ _iterator.f();
163
169
  }
164
170
 
165
171
  this._handleMissing();
@@ -170,35 +176,25 @@ function () {
170
176
  args = _this$_getDataForHand2.args,
171
177
  record = _this$_getDataForHand2.record;
172
178
 
173
- var _iteratorNormalCompletion2 = true;
174
- var _didIteratorError2 = false;
175
- var _iteratorError2 = undefined;
179
+ var _iterator2 = _createForOfIteratorHelper(this._handlers),
180
+ _step2;
176
181
 
177
182
  try {
178
- for (var _iterator2 = this._handlers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
183
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
179
184
  var handler = _step2.value;
180
185
 
181
186
  if (handler.kind === 'linked') {
182
187
  var newValue = handler.handle(field, record, args, this._recordSourceProxy);
183
188
 
184
- if (newValue != null && this._mutator.getStatus(newValue) === EXISTENT) {
189
+ if (newValue !== undefined && (newValue === null || this._mutator.getStatus(newValue) === EXISTENT)) {
185
190
  return newValue;
186
191
  }
187
192
  }
188
193
  }
189
194
  } catch (err) {
190
- _didIteratorError2 = true;
191
- _iteratorError2 = err;
195
+ _iterator2.e(err);
192
196
  } finally {
193
- try {
194
- if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
195
- _iterator2["return"]();
196
- }
197
- } finally {
198
- if (_didIteratorError2) {
199
- throw _iteratorError2;
200
- }
201
- }
197
+ _iterator2.f();
202
198
  }
203
199
 
204
200
  this._handleMissing();
@@ -211,12 +207,11 @@ function () {
211
207
  args = _this$_getDataForHand3.args,
212
208
  record = _this$_getDataForHand3.record;
213
209
 
214
- var _iteratorNormalCompletion3 = true;
215
- var _didIteratorError3 = false;
216
- var _iteratorError3 = undefined;
210
+ var _iterator3 = _createForOfIteratorHelper(this._handlers),
211
+ _step3;
217
212
 
218
213
  try {
219
- for (var _iterator3 = this._handlers[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
214
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
220
215
  var handler = _step3.value;
221
216
 
222
217
  if (handler.kind === 'pluralLinked') {
@@ -230,22 +225,15 @@ function () {
230
225
  if (allItemsKnown) {
231
226
  return newValue;
232
227
  }
228
+ } else if (newValue === null) {
229
+ return null;
233
230
  }
234
231
  }
235
232
  }
236
233
  } catch (err) {
237
- _didIteratorError3 = true;
238
- _iteratorError3 = err;
234
+ _iterator3.e(err);
239
235
  } finally {
240
- try {
241
- if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
242
- _iterator3["return"]();
243
- }
244
- } finally {
245
- if (_didIteratorError3) {
246
- throw _iteratorError3;
247
- }
248
- }
236
+ _iterator3.f();
249
237
  }
250
238
 
251
239
  this._handleMissing();
@@ -300,26 +288,71 @@ function () {
300
288
  break;
301
289
 
302
290
  case INLINE_FRAGMENT:
303
- var typeName = _this2._mutator.getType(dataID);
291
+ {
292
+ var abstractKey = selection.abstractKey;
293
+
294
+ if (abstractKey == null) {
295
+ // concrete type refinement: only check data if the type exactly matches
296
+ var typeName = _this2._mutator.getType(dataID);
297
+
298
+ if (typeName === selection.type) {
299
+ _this2._traverseSelections(selection.selections, dataID);
300
+ }
301
+ } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
302
+ // Abstract refinement: check data depending on whether the type
303
+ // conforms to the interface/union or not:
304
+ // - Type known to _not_ implement the interface: don't check the selections.
305
+ // - Type is known _to_ implement the interface: check selections.
306
+ // - Unknown whether the type implements the interface: don't check the selections
307
+ // and treat the data as missing; we do this because the Relay Compiler
308
+ // guarantees that the type discriminator will always be fetched.
309
+ var recordType = _this2._mutator.getType(dataID);
310
+
311
+ !(recordType != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'DataChecker: Expected record `%s` to have a known type', dataID) : invariant(false) : void 0;
312
+ var typeID = generateTypeID(recordType);
313
+
314
+ var implementsInterface = _this2._mutator.getValue(typeID, abstractKey);
315
+
316
+ if (implementsInterface === true) {
317
+ _this2._traverseSelections(selection.selections, dataID);
318
+ } else if (implementsInterface == null) {
319
+ // unsure if the type implements the interface: data is
320
+ // missing so don't bother reading the fragment
321
+ _this2._handleMissing();
322
+ } // else false: known to not implement the interface
323
+
324
+ } else {
325
+ // legacy behavior for abstract refinements: always check even
326
+ // if the type doesn't conform
327
+ _this2._traverseSelections(selection.selections, dataID);
328
+ }
304
329
 
305
- if (typeName != null && typeName === selection.type) {
306
- _this2._traverseSelections(selection.selections, dataID);
330
+ break;
307
331
  }
308
332
 
309
- break;
310
-
311
333
  case LINKED_HANDLE:
312
- // Handles have no selections themselves; traverse the original field
313
- // where the handle was set-up instead.
314
- var handleField = cloneRelayHandleSourceField(selection, selections, _this2._variables);
334
+ {
335
+ // Handles have no selections themselves; traverse the original field
336
+ // where the handle was set-up instead.
337
+ var handleField = cloneRelayHandleSourceField(selection, selections, _this2._variables);
338
+
339
+ if (handleField.plural) {
340
+ _this2._checkPluralLink(handleField, dataID);
341
+ } else {
342
+ _this2._checkLink(handleField, dataID);
343
+ }
315
344
 
316
- if (handleField.plural) {
317
- _this2._checkPluralLink(handleField, dataID);
318
- } else {
319
- _this2._checkLink(handleField, dataID);
345
+ break;
320
346
  }
321
347
 
322
- break;
348
+ case SCALAR_HANDLE:
349
+ {
350
+ var _handleField = cloneRelayScalarHandleSourceField(selection, selections, _this2._variables);
351
+
352
+ _this2._checkScalar(_handleField, dataID);
353
+
354
+ break;
355
+ }
323
356
 
324
357
  case MODULE_IMPORT:
325
358
  _this2._checkModuleImport(selection, dataID);
@@ -331,10 +364,10 @@ function () {
331
364
  _this2._traverseSelections(selection.selections, dataID);
332
365
 
333
366
  break;
367
+ // $FlowFixMe[incompatible-type]
334
368
 
335
- case SCALAR_HANDLE:
336
369
  case FRAGMENT_SPREAD:
337
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayAsyncLoader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0; // $FlowExpectedError - we need the break; for OSS linter
370
+ !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayAsyncLoader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0; // $FlowExpectedError[unreachable-code] - we need the break; for OSS linter
338
371
 
339
372
  break;
340
373
 
@@ -346,6 +379,37 @@ function () {
346
379
  _this2._recordWasMissing = recordWasMissing;
347
380
  break;
348
381
 
382
+ case TYPE_DISCRIMINATOR:
383
+ if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
384
+ var _abstractKey = selection.abstractKey;
385
+
386
+ var _recordType = _this2._mutator.getType(dataID);
387
+
388
+ !(_recordType != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'DataChecker: Expected record `%s` to have a known type', dataID) : invariant(false) : void 0;
389
+
390
+ var _typeID = generateTypeID(_recordType);
391
+
392
+ var _implementsInterface = _this2._mutator.getValue(_typeID, _abstractKey);
393
+
394
+ if (_implementsInterface == null) {
395
+ // unsure if the type implements the interface: data is
396
+ // missing
397
+ _this2._handleMissing();
398
+ } // else: if it does or doesn't implement, we don't need to check or skip anything else
399
+
400
+ }
401
+
402
+ break;
403
+
404
+ case FLIGHT_FIELD:
405
+ if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
406
+ _this2._checkFlightField(selection, dataID);
407
+ } else {
408
+ throw new Error('Flight fields are not yet supported.');
409
+ }
410
+
411
+ break;
412
+
349
413
  default:
350
414
  selection;
351
415
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayAsyncLoader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -368,9 +432,11 @@ function () {
368
432
  return;
369
433
  }
370
434
 
371
- var operation = operationLoader.get(operationReference);
435
+ var normalizationRootNode = operationLoader.get(operationReference);
436
+
437
+ if (normalizationRootNode != null) {
438
+ var operation = getOperation(normalizationRootNode);
372
439
 
373
- if (operation != null) {
374
440
  this._traverse(operation, dataID);
375
441
  } else {
376
442
  // If the fragment is not available, we assume that the data cannot have been
@@ -403,6 +469,8 @@ function () {
403
469
 
404
470
  if (linkedID != null) {
405
471
  this._mutator.setLinkedRecordID(dataID, storageKey, linkedID);
472
+ } else if (linkedID === null) {
473
+ this._mutator.setValue(dataID, storageKey, null);
406
474
  }
407
475
  }
408
476
 
@@ -423,6 +491,8 @@ function () {
423
491
 
424
492
  if (linkedIDs != null) {
425
493
  this._mutator.setLinkedRecordIDs(dataID, storageKey, linkedIDs);
494
+ } else if (linkedIDs === null) {
495
+ this._mutator.setValue(dataID, storageKey, null);
426
496
  }
427
497
  }
428
498
 
@@ -435,6 +505,65 @@ function () {
435
505
  }
436
506
  };
437
507
 
508
+ _proto._checkFlightField = function _checkFlightField(field, dataID) {
509
+ var storageKey = getStorageKey(field, this._variables);
510
+
511
+ var linkedID = this._mutator.getLinkedRecordID(dataID, storageKey);
512
+
513
+ if (linkedID == null) {
514
+ if (linkedID === undefined) {
515
+ this._handleMissing();
516
+
517
+ return;
518
+ }
519
+
520
+ return;
521
+ }
522
+
523
+ var tree = this._mutator.getValue(linkedID, RelayStoreReactFlightUtils.REACT_FLIGHT_TREE_STORAGE_KEY);
524
+
525
+ var reachableQueries = this._mutator.getValue(linkedID, RelayStoreReactFlightUtils.REACT_FLIGHT_QUERIES_STORAGE_KEY);
526
+
527
+ if (tree == null || !Array.isArray(reachableQueries)) {
528
+ this._handleMissing();
529
+
530
+ return;
531
+ }
532
+
533
+ var operationLoader = this._operationLoader;
534
+ !(operationLoader !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'DataChecker: Expected an operationLoader to be configured when using ' + 'React Flight.') : invariant(false) : void 0; // In Flight, the variables that are in scope for reachable queries aren't
535
+ // the same as what's in scope for the outer query.
536
+
537
+ var prevVariables = this._variables; // $FlowFixMe[incompatible-cast]
538
+
539
+ var _iterator4 = _createForOfIteratorHelper(reachableQueries),
540
+ _step4;
541
+
542
+ try {
543
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
544
+ var query = _step4.value;
545
+ this._variables = query.variables;
546
+ var normalizationRootNode = operationLoader.get(query.module);
547
+
548
+ if (normalizationRootNode != null) {
549
+ var operation = getOperation(normalizationRootNode);
550
+
551
+ this._traverseSelections(operation.selections, ROOT_ID);
552
+ } else {
553
+ // If the fragment is not available, we assume that the data cannot have
554
+ // been processed yet and must therefore be missing.
555
+ this._handleMissing();
556
+ }
557
+ }
558
+ } catch (err) {
559
+ _iterator4.e(err);
560
+ } finally {
561
+ _iterator4.f();
562
+ }
563
+
564
+ this._variables = prevVariables;
565
+ };
566
+
438
567
  return DataChecker;
439
568
  }();
440
569
 
@@ -12,7 +12,11 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- 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; }
16
20
 
17
21
  var invariant = require("fbjs/lib/invariant");
18
22
 
@@ -30,7 +34,7 @@ function getFragmentVariables(fragment, rootVariables, argumentVariables) {
30
34
  return;
31
35
  }
32
36
 
33
- variables = variables || (0, _objectSpread2["default"])({}, argumentVariables);
37
+ variables = variables || _objectSpread({}, argumentVariables);
34
38
 
35
39
  switch (definition.kind) {
36
40
  case 'LocalArgument':