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 invariant = require("fbjs/lib/invariant");
17
22
 
@@ -29,7 +34,7 @@ function getFragmentVariables(fragment, rootVariables, argumentVariables) {
29
34
  return;
30
35
  }
31
36
 
32
- variables = variables || (0, _objectSpread2["default"])({}, argumentVariables);
37
+ variables = variables || _objectSpread({}, argumentVariables);
33
38
 
34
39
  switch (definition.kind) {
35
40
  case 'LocalArgument':
@@ -8,13 +8,20 @@
8
8
  * @emails oncall+relay
9
9
  * @format
10
10
  */
11
+ // flowlint ambiguous-object-type:error
11
12
  'use strict';
12
13
 
13
- var DataChecker = require('./DataChecker');
14
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
+
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ 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; }
19
+
20
+ 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; }
14
21
 
15
22
  var RelayDefaultHandlerProvider = require('../handlers/RelayDefaultHandlerProvider');
16
23
 
17
- var RelayDefaultMissingFieldHandlers = require('../handlers/RelayDefaultMissingFieldHandlers');
24
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
25
 
19
26
  var RelayModernQueryExecutor = require('./RelayModernQueryExecutor');
20
27
 
@@ -32,16 +39,15 @@ var generateID = require('../util/generateID');
32
39
 
33
40
  var invariant = require("fbjs/lib/invariant");
34
41
 
35
- var RelayModernEnvironment =
36
- /*#__PURE__*/
37
- function () {
42
+ var RelayModernEnvironment = /*#__PURE__*/function () {
38
43
  function RelayModernEnvironment(config) {
39
44
  var _this = this;
40
45
 
41
- var _config$log, _config$UNSTABLE_DO_N, _config$scheduler, _config$missingFieldH, _config$operationTrac;
46
+ var _config$log, _config$UNSTABLE_defa, _config$UNSTABLE_DO_N, _config$scheduler, _config$isServer, _config$operationTrac;
42
47
 
43
48
  this.configName = config.configName;
44
49
  var handlerProvider = config.handlerProvider ? config.handlerProvider : RelayDefaultHandlerProvider;
50
+ this._treatMissingFieldsAsNull = config.treatMissingFieldsAsNull === true;
45
51
  var operationLoader = config.operationLoader;
46
52
 
47
53
  if (process.env.NODE_ENV !== "production") {
@@ -51,12 +57,16 @@ function () {
51
57
  }
52
58
 
53
59
  this.__log = (_config$log = config.log) !== null && _config$log !== void 0 ? _config$log : emptyFunction;
60
+ this._defaultRenderPolicy = ((_config$UNSTABLE_defa = config.UNSTABLE_defaultRenderPolicy) !== null && _config$UNSTABLE_defa !== void 0 ? _config$UNSTABLE_defa : RelayFeatureFlags.ENABLE_PARTIAL_RENDERING_DEFAULT === true) ? 'partial' : 'full';
54
61
  this._operationLoader = operationLoader;
62
+ this._operationExecutions = new Map();
55
63
  this._network = config.network;
56
64
  this._getDataID = (_config$UNSTABLE_DO_N = config.UNSTABLE_DO_NOT_USE_getDataID) !== null && _config$UNSTABLE_DO_N !== void 0 ? _config$UNSTABLE_DO_N : defaultGetDataID;
57
65
  this._publishQueue = new RelayPublishQueue(config.store, handlerProvider, this._getDataID);
58
66
  this._scheduler = (_config$scheduler = config.scheduler) !== null && _config$scheduler !== void 0 ? _config$scheduler : null;
59
67
  this._store = config.store;
68
+ this.options = config.options;
69
+ this._isServer = (_config$isServer = config.isServer) !== null && _config$isServer !== void 0 ? _config$isServer : false;
60
70
 
61
71
  this.__setNet = function (newNet) {
62
72
  return _this._network = newNet;
@@ -81,7 +91,7 @@ function () {
81
91
  devToolsHook.registerEnvironment(this);
82
92
  }
83
93
 
84
- this._missingFieldHandlers = (_config$missingFieldH = config.missingFieldHandlers) !== null && _config$missingFieldH !== void 0 ? _config$missingFieldH : RelayDefaultMissingFieldHandlers;
94
+ this._missingFieldHandlers = config.missingFieldHandlers;
85
95
  this._operationTracker = (_config$operationTrac = config.operationTracker) !== null && _config$operationTrac !== void 0 ? _config$operationTrac : new RelayOperationTracker();
86
96
  }
87
97
 
@@ -99,6 +109,16 @@ function () {
99
109
  return this._operationTracker;
100
110
  };
101
111
 
112
+ _proto.isRequestActive = function isRequestActive(requestIdentifier) {
113
+ var activeState = this._operationExecutions.get(requestIdentifier);
114
+
115
+ return activeState === 'active';
116
+ };
117
+
118
+ _proto.UNSTABLE_getDefaultRenderPolicy = function UNSTABLE_getDefaultRenderPolicy() {
119
+ return this._defaultRenderPolicy;
120
+ };
121
+
102
122
  _proto.applyUpdate = function applyUpdate(optimisticUpdate) {
103
123
  var _this2 = this;
104
124
 
@@ -138,15 +158,18 @@ function () {
138
158
  var source = RelayObservable.create(function (_sink) {});
139
159
  var executor = RelayModernQueryExecutor.execute({
140
160
  operation: optimisticConfig.operation,
161
+ operationExecutions: _this3._operationExecutions,
141
162
  operationLoader: _this3._operationLoader,
142
163
  optimisticConfig: optimisticConfig,
143
164
  publishQueue: _this3._publishQueue,
144
165
  scheduler: _this3._scheduler,
145
166
  sink: sink,
146
167
  source: source,
168
+ store: _this3._store,
147
169
  updater: null,
148
170
  operationTracker: _this3._operationTracker,
149
- getDataID: _this3._getDataID
171
+ getDataID: _this3._getDataID,
172
+ treatMissingFieldsAsNull: _this3._treatMissingFieldsAsNull
150
173
  });
151
174
  return function () {
152
175
  return executor.cancel();
@@ -159,12 +182,12 @@ function () {
159
182
  };
160
183
  };
161
184
 
162
- _proto.check = function check(readSelector) {
163
- if (this._missingFieldHandlers == null) {
164
- return this._store.check(readSelector);
185
+ _proto.check = function check(operation) {
186
+ if (this._missingFieldHandlers == null || this._missingFieldHandlers.length === 0) {
187
+ return this._store.check(operation);
165
188
  }
166
189
 
167
- return this._checkSelectorAndHandleMissingFields(readSelector, this._missingFieldHandlers);
190
+ return this._checkSelectorAndHandleMissingFields(operation, this._missingFieldHandlers);
168
191
  };
169
192
 
170
193
  _proto.commitPayload = function commitPayload(operation, payload) {
@@ -173,6 +196,7 @@ function () {
173
196
  RelayObservable.create(function (sink) {
174
197
  var executor = RelayModernQueryExecutor.execute({
175
198
  operation: operation,
199
+ operationExecutions: _this4._operationExecutions,
176
200
  operationLoader: _this4._operationLoader,
177
201
  optimisticConfig: null,
178
202
  publishQueue: _this4._publishQueue,
@@ -182,9 +206,12 @@ function () {
182
206
  source: RelayObservable.from({
183
207
  data: payload
184
208
  }),
209
+ store: _this4._store,
185
210
  updater: null,
186
211
  operationTracker: _this4._operationTracker,
187
- getDataID: _this4._getDataID
212
+ getDataID: _this4._getDataID,
213
+ isClientPayload: true,
214
+ treatMissingFieldsAsNull: _this4._treatMissingFieldsAsNull
188
215
  });
189
216
  return function () {
190
217
  return executor.cancel();
@@ -206,16 +233,20 @@ function () {
206
233
  return this._store.subscribe(snapshot, callback);
207
234
  };
208
235
 
209
- _proto.retain = function retain(selector) {
210
- return this._store.retain(selector);
236
+ _proto.retain = function retain(operation) {
237
+ return this._store.retain(operation);
211
238
  };
212
239
 
213
- _proto._checkSelectorAndHandleMissingFields = function _checkSelectorAndHandleMissingFields(selector, handlers) {
214
- var _this5 = this;
240
+ _proto.isServer = function isServer() {
241
+ return this._isServer;
242
+ };
215
243
 
244
+ _proto._checkSelectorAndHandleMissingFields = function _checkSelectorAndHandleMissingFields(operation, handlers) {
216
245
  var target = RelayRecordSource.create();
217
- var result = DataChecker.check(this._store.getSource(), target, selector, handlers, this._operationLoader, this._getDataID, function (id) {
218
- return _this5._store.getConnectionEvents_UNSTABLE(id);
246
+
247
+ var result = this._store.check(operation, {
248
+ target: target,
249
+ handlers: handlers
219
250
  });
220
251
 
221
252
  if (target.size() > 0) {
@@ -237,7 +268,7 @@ function () {
237
268
  ;
238
269
 
239
270
  _proto.execute = function execute(_ref) {
240
- var _this6 = this;
271
+ var _this5 = this;
241
272
 
242
273
  var operation = _ref.operation,
243
274
  cacheConfig = _ref.cacheConfig,
@@ -248,19 +279,22 @@ function () {
248
279
  logRequestInfo = _this$__createLogObse[1];
249
280
 
250
281
  return RelayObservable.create(function (sink) {
251
- var source = _this6._network.execute(operation.request.node.params, operation.request.variables, cacheConfig || {}, null, logRequestInfo);
282
+ var source = _this5._network.execute(operation.request.node.params, operation.request.variables, cacheConfig || {}, null, logRequestInfo);
252
283
 
253
284
  var executor = RelayModernQueryExecutor.execute({
254
285
  operation: operation,
255
- operationLoader: _this6._operationLoader,
286
+ operationExecutions: _this5._operationExecutions,
287
+ operationLoader: _this5._operationLoader,
256
288
  optimisticConfig: null,
257
- publishQueue: _this6._publishQueue,
258
- scheduler: _this6._scheduler,
289
+ publishQueue: _this5._publishQueue,
290
+ scheduler: _this5._scheduler,
259
291
  sink: sink,
260
292
  source: source,
293
+ store: _this5._store,
261
294
  updater: updater,
262
- operationTracker: _this6._operationTracker,
263
- getDataID: _this6._getDataID
295
+ operationTracker: _this5._operationTracker,
296
+ getDataID: _this5._getDataID,
297
+ treatMissingFieldsAsNull: _this5._treatMissingFieldsAsNull
264
298
  });
265
299
  return function () {
266
300
  return executor.cancel();
@@ -280,9 +314,10 @@ function () {
280
314
  ;
281
315
 
282
316
  _proto.executeMutation = function executeMutation(_ref2) {
283
- var _this7 = this;
317
+ var _this6 = this;
284
318
 
285
- var operation = _ref2.operation,
319
+ var cacheConfig = _ref2.cacheConfig,
320
+ operation = _ref2.operation,
286
321
  optimisticResponse = _ref2.optimisticResponse,
287
322
  optimisticUpdater = _ref2.optimisticUpdater,
288
323
  updater = _ref2.updater,
@@ -303,21 +338,24 @@ function () {
303
338
  };
304
339
  }
305
340
 
306
- var source = _this7._network.execute(operation.request.node.params, operation.request.variables, {
341
+ var source = _this6._network.execute(operation.request.node.params, operation.request.variables, _objectSpread({}, cacheConfig, {
307
342
  force: true
308
- }, uploadables, logRequestInfo);
343
+ }), uploadables, logRequestInfo);
309
344
 
310
345
  var executor = RelayModernQueryExecutor.execute({
311
346
  operation: operation,
312
- operationLoader: _this7._operationLoader,
347
+ operationExecutions: _this6._operationExecutions,
348
+ operationLoader: _this6._operationLoader,
313
349
  optimisticConfig: optimisticConfig,
314
- publishQueue: _this7._publishQueue,
315
- scheduler: _this7._scheduler,
350
+ publishQueue: _this6._publishQueue,
351
+ scheduler: _this6._scheduler,
316
352
  sink: sink,
317
353
  source: source,
354
+ store: _this6._store,
318
355
  updater: updater,
319
- operationTracker: _this7._operationTracker,
320
- getDataID: _this7._getDataID
356
+ operationTracker: _this6._operationTracker,
357
+ getDataID: _this6._getDataID,
358
+ treatMissingFieldsAsNull: _this6._treatMissingFieldsAsNull
321
359
  });
322
360
  return function () {
323
361
  return executor.cancel();
@@ -336,21 +374,24 @@ function () {
336
374
  ;
337
375
 
338
376
  _proto.executeWithSource = function executeWithSource(_ref3) {
339
- var _this8 = this;
377
+ var _this7 = this;
340
378
 
341
379
  var operation = _ref3.operation,
342
380
  source = _ref3.source;
343
381
  return RelayObservable.create(function (sink) {
344
382
  var executor = RelayModernQueryExecutor.execute({
345
383
  operation: operation,
346
- operationLoader: _this8._operationLoader,
347
- operationTracker: _this8._operationTracker,
384
+ operationExecutions: _this7._operationExecutions,
385
+ operationLoader: _this7._operationLoader,
386
+ operationTracker: _this7._operationTracker,
348
387
  optimisticConfig: null,
349
- publishQueue: _this8._publishQueue,
350
- scheduler: _this8._scheduler,
388
+ publishQueue: _this7._publishQueue,
389
+ scheduler: _this7._scheduler,
351
390
  sink: sink,
352
391
  source: source,
353
- getDataID: _this8._getDataID
392
+ store: _this7._store,
393
+ getDataID: _this7._getDataID,
394
+ treatMissingFieldsAsNull: _this7._treatMissingFieldsAsNull
354
395
  });
355
396
  return function () {
356
397
  return executor.cancel();
@@ -7,27 +7,37 @@
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
-
16
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
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; }
20
+
21
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
22
+
18
23
  var areEqual = require("fbjs/lib/areEqual");
19
24
 
20
25
  var invariant = require("fbjs/lib/invariant");
21
26
 
22
27
  var isScalarAndEqual = require('../util/isScalarAndEqual');
23
28
 
24
- var _require = require('./RelayModernOperationDescriptor'),
25
- createRequestDescriptor = _require.createRequestDescriptor;
29
+ var warning = require("fbjs/lib/warning");
30
+
31
+ var _require = require('../query/fetchQueryInternal'),
32
+ getPromiseForActiveRequest = _require.getPromiseForActiveRequest;
26
33
 
27
- var _require2 = require('./RelayModernSelector'),
28
- areEqualSelectors = _require2.areEqualSelectors,
29
- createReaderSelector = _require2.createReaderSelector,
30
- getSelectorsFromObject = _require2.getSelectorsFromObject;
34
+ var _require2 = require('./RelayModernOperationDescriptor'),
35
+ createRequestDescriptor = _require2.createRequestDescriptor;
36
+
37
+ var _require3 = require('./RelayModernSelector'),
38
+ areEqualSelectors = _require3.areEqualSelectors,
39
+ createReaderSelector = _require3.createReaderSelector,
40
+ getSelectorsFromObject = _require3.getSelectorsFromObject;
31
41
 
32
42
  /**
33
43
  * A utility for resolving and subscribing to the results of a fragment spec
@@ -48,9 +58,7 @@ var _require2 = require('./RelayModernSelector'),
48
58
  * the resolver as stale and notify the caller, and the actual results are
49
59
  * recomputed the first time `resolve()` is called.
50
60
  */
51
- var RelayModernFragmentSpecResolver =
52
- /*#__PURE__*/
53
- function () {
61
+ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
54
62
  function RelayModernFragmentSpecResolver(context, fragments, props, callback) {
55
63
  var _this = this;
56
64
 
@@ -65,7 +73,7 @@ function () {
65
73
  this._context = context;
66
74
  this._data = {};
67
75
  this._fragments = fragments;
68
- this._props = props;
76
+ this._props = {};
69
77
  this._resolvers = {};
70
78
  this._stale = false;
71
79
  this.setProps(props);
@@ -97,7 +105,7 @@ function () {
97
105
  var nextItem = resolver.resolve();
98
106
 
99
107
  if (nextData || nextItem !== prevItem) {
100
- nextData = nextData || (0, _objectSpread2["default"])({}, prevData);
108
+ nextData = nextData || _objectSpread({}, prevData);
101
109
  nextData[_key2] = nextItem;
102
110
  }
103
111
  } else {
@@ -106,7 +114,7 @@ function () {
106
114
  var _nextItem = prop !== undefined ? prop : null;
107
115
 
108
116
  if (nextData || !isScalarAndEqual(_nextItem, prevItem)) {
109
- nextData = nextData || (0, _objectSpread2["default"])({}, prevData);
117
+ nextData = nextData || _objectSpread({}, prevData);
110
118
  nextData[_key2] = _nextItem;
111
119
  }
112
120
  }
@@ -126,6 +134,7 @@ function () {
126
134
 
127
135
  _proto.setProps = function setProps(props) {
128
136
  var ownedSelectors = getSelectorsFromObject(this._fragments, props);
137
+ this._props = {};
129
138
 
130
139
  for (var _key3 in ownedSelectors) {
131
140
  if (ownedSelectors.hasOwnProperty(_key3)) {
@@ -154,11 +163,11 @@ function () {
154
163
  }
155
164
  }
156
165
 
166
+ this._props[_key3] = props[_key3];
157
167
  this._resolvers[_key3] = resolver;
158
168
  }
159
169
  }
160
170
 
161
- this._props = props;
162
171
  this._stale = true;
163
172
  };
164
173
 
@@ -183,14 +192,13 @@ function () {
183
192
  */
184
193
 
185
194
 
186
- var SelectorResolver =
187
- /*#__PURE__*/
188
- function () {
195
+ var SelectorResolver = /*#__PURE__*/function () {
189
196
  function SelectorResolver(environment, selector, callback) {
190
197
  var _this2 = this;
191
198
 
192
199
  (0, _defineProperty2["default"])(this, "_onChange", function (snapshot) {
193
200
  _this2._data = snapshot.data;
201
+ _this2._isMissingData = snapshot.isMissingData;
194
202
 
195
203
  _this2._callback();
196
204
  });
@@ -199,6 +207,7 @@ function () {
199
207
 
200
208
  this._callback = callback;
201
209
  this._data = _snapshot.data;
210
+ this._isMissingData = _snapshot.isMissingData;
202
211
  this._environment = environment;
203
212
  this._selector = selector;
204
213
  this._subscription = environment.subscribe(_snapshot, this._onChange);
@@ -215,6 +224,38 @@ function () {
215
224
  };
216
225
 
217
226
  _proto2.resolve = function resolve() {
227
+ if (RelayFeatureFlags.ENABLE_RELAY_CONTAINERS_SUSPENSE === true && this._isMissingData === true) {
228
+ var _getPromiseForActiveR;
229
+
230
+ // NOTE: This branch exists to handle the case in which:
231
+ // - A RelayModern container is rendered as a descendant of a Relay Hook
232
+ // root using a "partial" renderPolicy (this means that eargerly
233
+ // reading any cached data that is available instead of blocking
234
+ // at the root until the whole query is fetched).
235
+ // - A parent Relay Hook didnt' suspend earlier on data being fetched,
236
+ // either because the fragment data for the parent was available, or
237
+ // the parent fragment didn't have any data dependencies.
238
+ // Even though our Flow types reflect the possiblity of null data, there
239
+ // might still be cases where it's not handled at runtime becuase the
240
+ // Flow types are being ignored, or simply not being used (for example,
241
+ // the case reported here: https://fburl.com/srnbucf8, was due to
242
+ // misuse of Flow types here: https://fburl.com/g3m0mqqh).
243
+ // Additionally, even though the null data might be handled without a
244
+ // runtime error, we might not suspend when we intended to if a parent
245
+ // Relay Hook (e.g. that is using @defer) decided not to suspend becuase
246
+ // it's immediate data was already available (even if it was deferred),
247
+ // or it didn't actually need any data (was just spreading other fragments).
248
+ // This should eventually go away with something like @optional, where we only
249
+ // suspend at specific boundaries depending on whether the boundary
250
+ // can be fulfilled or not.
251
+ var promise = (_getPromiseForActiveR = getPromiseForActiveRequest(this._environment, this._selector.owner)) !== null && _getPromiseForActiveR !== void 0 ? _getPromiseForActiveR : this._environment.getOperationTracker().getPromiseForPendingOperationsAffectingOwner(this._selector.owner);
252
+
253
+ if (promise != null) {
254
+ process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Relay Container for fragment `%s` suspended. When using ' + 'features such as @defer or @module, use `useFragment` instead ' + 'of a Relay Container.', this._selector.node.name) : void 0;
255
+ throw promise;
256
+ }
257
+ }
258
+
218
259
  return this._data;
219
260
  };
220
261
 
@@ -228,6 +269,7 @@ function () {
228
269
  var snapshot = this._environment.lookup(selector);
229
270
 
230
271
  this._data = snapshot.data;
272
+ this._isMissingData = snapshot.isMissingData;
231
273
  this._selector = selector;
232
274
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
233
275
  };
@@ -263,9 +305,7 @@ function () {
263
305
  */
264
306
 
265
307
 
266
- var SelectorListResolver =
267
- /*#__PURE__*/
268
- function () {
308
+ var SelectorListResolver = /*#__PURE__*/function () {
269
309
  function SelectorListResolver(environment, selector, callback) {
270
310
  var _this3 = this;
271
311
 
@@ -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 deepFreeze = require('../util/deepFreeze');
@@ -30,9 +31,9 @@ var _require3 = require('./RelayStoreUtils'),
30
31
  * operation, and default values are populated for null values.
31
32
  */
32
33
  function createOperationDescriptor(request, variables) {
34
+ var dataID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ROOT_ID;
33
35
  var operation = request.operation;
34
36
  var operationVariables = getOperationVariables(operation, variables);
35
- var dataID = ROOT_ID;
36
37
  var requestDescriptor = createRequestDescriptor(request, operationVariables);
37
38
  var operationDescriptor = {
38
39
  fragment: createReaderSelector(request.fragment, dataID, operationVariables, requestDescriptor),