relay-runtime 10.0.0 → 10.1.2

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 (82) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +6 -0
  2. package/handlers/connection/MutationHandlers.js.flow +121 -3
  3. package/index.js +1 -1
  4. package/index.js.flow +16 -1
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +9 -0
  6. package/lib/handlers/connection/MutationHandlers.js +147 -14
  7. package/lib/index.js +7 -0
  8. package/lib/mutations/RelayDeclarativeMutationConfig.js +5 -7
  9. package/lib/mutations/commitMutation.js +1 -4
  10. package/lib/mutations/validateMutation.js +28 -12
  11. package/lib/network/RelayQueryResponseCache.js +3 -7
  12. package/lib/query/GraphQLTag.js +2 -1
  13. package/lib/query/fetchQuery.js +2 -3
  14. package/lib/query/fetchQueryInternal.js +2 -3
  15. package/lib/store/DataChecker.js +85 -10
  16. package/lib/store/RelayConcreteVariables.js +2 -6
  17. package/lib/store/RelayModernEnvironment.js +81 -72
  18. package/lib/store/RelayModernFragmentSpecResolver.js +14 -7
  19. package/lib/store/RelayModernOperationDescriptor.js +6 -5
  20. package/lib/store/RelayModernQueryExecutor.js +46 -33
  21. package/lib/store/RelayModernRecord.js +3 -7
  22. package/lib/store/RelayModernStore.js +45 -143
  23. package/lib/store/RelayOperationTracker.js +7 -9
  24. package/lib/store/RelayOptimisticRecordSource.js +2 -6
  25. package/lib/store/RelayPublishQueue.js +1 -1
  26. package/lib/store/RelayReader.js +200 -49
  27. package/lib/store/RelayRecordSourceMapImpl.js +3 -5
  28. package/lib/store/RelayReferenceMarker.js +87 -5
  29. package/lib/store/RelayResponseNormalizer.js +123 -54
  30. package/lib/store/RelayStoreReactFlightUtils.js +47 -0
  31. package/lib/store/RelayStoreSubscriptions.js +162 -0
  32. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +258 -0
  33. package/lib/store/StoreInspector.js +3 -9
  34. package/lib/store/createRelayContext.js +5 -0
  35. package/lib/store/defaultRequiredFieldLogger.js +18 -0
  36. package/lib/store/normalizeRelayPayload.js +2 -6
  37. package/lib/subscription/requestSubscription.js +2 -3
  38. package/lib/util/NormalizationNode.js +1 -5
  39. package/lib/util/RelayConcreteNode.js +2 -0
  40. package/lib/util/RelayFeatureFlags.js +6 -2
  41. package/lib/util/createPayloadFor3DField.js +2 -7
  42. package/lib/util/getFragmentIdentifier.js +12 -3
  43. package/lib/util/getOperation.js +33 -0
  44. package/lib/util/isEmptyObject.js +25 -0
  45. package/lib/util/recycleNodesInto.js +6 -9
  46. package/lib/util/reportMissingRequiredFields.js +48 -0
  47. package/mutations/commitMutation.js.flow +1 -2
  48. package/mutations/validateMutation.js.flow +34 -5
  49. package/network/RelayNetworkTypes.js.flow +22 -0
  50. package/package.json +2 -2
  51. package/query/GraphQLTag.js.flow +3 -1
  52. package/query/fetchQuery.js.flow +2 -2
  53. package/query/fetchQueryInternal.js.flow +0 -5
  54. package/relay-runtime.js +2 -2
  55. package/relay-runtime.min.js +2 -2
  56. package/store/DataChecker.js.flow +68 -2
  57. package/store/RelayModernEnvironment.js.flow +107 -87
  58. package/store/RelayModernFragmentSpecResolver.js.flow +13 -1
  59. package/store/RelayModernOperationDescriptor.js.flow +5 -1
  60. package/store/RelayModernQueryExecutor.js.flow +47 -23
  61. package/store/RelayModernStore.js.flow +40 -114
  62. package/store/RelayPublishQueue.js.flow +1 -1
  63. package/store/RelayReader.js.flow +184 -27
  64. package/store/RelayReferenceMarker.js.flow +72 -5
  65. package/store/RelayResponseNormalizer.js.flow +140 -50
  66. package/store/RelayStoreReactFlightUtils.js.flow +64 -0
  67. package/store/RelayStoreSubscriptions.js.flow +168 -0
  68. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +259 -0
  69. package/store/RelayStoreTypes.js.flow +130 -37
  70. package/store/StoreInspector.js.flow +1 -3
  71. package/store/createRelayContext.js.flow +3 -0
  72. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  73. package/subscription/requestSubscription.js.flow +5 -2
  74. package/util/NormalizationNode.js.flow +17 -2
  75. package/util/ReaderNode.js.flow +20 -1
  76. package/util/RelayConcreteNode.js.flow +6 -0
  77. package/util/RelayFeatureFlags.js.flow +10 -1
  78. package/util/getFragmentIdentifier.js.flow +33 -9
  79. package/util/getOperation.js.flow +40 -0
  80. package/util/isEmptyObject.js.flow +25 -0
  81. package/util/recycleNodesInto.js.flow +13 -8
  82. package/util/reportMissingRequiredFields.js.flow +51 -0
@@ -13,11 +13,7 @@
13
13
 
14
14
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
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; }
16
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
21
17
 
22
18
  var RelayDefaultHandlerProvider = require('../handlers/RelayDefaultHandlerProvider');
23
19
 
@@ -35,6 +31,8 @@ var RelayRecordSource = require('./RelayRecordSource');
35
31
 
36
32
  var defaultGetDataID = require('./defaultGetDataID');
37
33
 
34
+ var defaultRequiredFieldLogger = require('./defaultRequiredFieldLogger');
35
+
38
36
  var generateID = require('../util/generateID');
39
37
 
40
38
  var invariant = require("fbjs/lib/invariant");
@@ -43,24 +41,30 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
43
41
  function RelayModernEnvironment(config) {
44
42
  var _this = this;
45
43
 
46
- var _config$log, _config$UNSTABLE_defa, _config$UNSTABLE_DO_N, _config$scheduler, _config$isServer, _config$operationTrac;
44
+ var _config$log, _config$requiredField, _config$UNSTABLE_defa, _config$UNSTABLE_DO_N, _config$scheduler, _config$isServer, _config$operationTrac;
47
45
 
48
46
  this.configName = config.configName;
49
47
  var handlerProvider = config.handlerProvider ? config.handlerProvider : RelayDefaultHandlerProvider;
50
48
  this._treatMissingFieldsAsNull = config.treatMissingFieldsAsNull === true;
51
49
  var operationLoader = config.operationLoader;
50
+ var reactFlightPayloadDeserializer = config.reactFlightPayloadDeserializer;
52
51
 
53
52
  if (process.env.NODE_ENV !== "production") {
54
53
  if (operationLoader != null) {
55
54
  !(typeof operationLoader === 'object' && typeof operationLoader.get === 'function' && typeof operationLoader.load === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernEnvironment: Expected `operationLoader` to be an object ' + 'with get() and load() functions, got `%s`.', operationLoader) : invariant(false) : void 0;
56
55
  }
56
+
57
+ if (reactFlightPayloadDeserializer != null) {
58
+ !(typeof reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernEnvironment: Expected `reactFlightPayloadDeserializer` ' + ' to be a function, got `%s`.', reactFlightPayloadDeserializer) : invariant(false) : void 0;
59
+ }
57
60
  }
58
61
 
59
62
  this.__log = (_config$log = config.log) !== null && _config$log !== void 0 ? _config$log : emptyFunction;
63
+ this.requiredFieldLogger = (_config$requiredField = config.requiredFieldLogger) !== null && _config$requiredField !== void 0 ? _config$requiredField : defaultRequiredFieldLogger;
60
64
  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';
61
65
  this._operationLoader = operationLoader;
62
66
  this._operationExecutions = new Map();
63
- this._network = config.network;
67
+ this._network = this.__wrapNetworkWithLogObserver(config.network);
64
68
  this._getDataID = (_config$UNSTABLE_DO_N = config.UNSTABLE_DO_NOT_USE_getDataID) !== null && _config$UNSTABLE_DO_N !== void 0 ? _config$UNSTABLE_DO_N : defaultGetDataID;
65
69
  this._publishQueue = new RelayPublishQueue(config.store, handlerProvider, this._getDataID);
66
70
  this._scheduler = (_config$scheduler = config.scheduler) !== null && _config$scheduler !== void 0 ? _config$scheduler : null;
@@ -69,7 +73,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
69
73
  this._isServer = (_config$isServer = config.isServer) !== null && _config$isServer !== void 0 ? _config$isServer : false;
70
74
 
71
75
  this.__setNet = function (newNet) {
72
- return _this._network = newNet;
76
+ return _this._network = _this.__wrapNetworkWithLogObserver(newNet);
73
77
  };
74
78
 
75
79
  if (process.env.NODE_ENV !== "production") {
@@ -93,6 +97,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
93
97
 
94
98
  this._missingFieldHandlers = config.missingFieldHandlers;
95
99
  this._operationTracker = (_config$operationTrac = config.operationTracker) !== null && _config$operationTrac !== void 0 ? _config$operationTrac : new RelayOperationTracker();
100
+ this._reactFlightPayloadDeserializer = reactFlightPayloadDeserializer;
96
101
  }
97
102
 
98
103
  var _proto = RelayModernEnvironment.prototype;
@@ -174,6 +179,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
174
179
  operationLoader: _this5._operationLoader,
175
180
  optimisticConfig: optimisticConfig,
176
181
  publishQueue: _this5._publishQueue,
182
+ reactFlightPayloadDeserializer: _this5._reactFlightPayloadDeserializer,
177
183
  scheduler: _this5._scheduler,
178
184
  sink: sink,
179
185
  source: source,
@@ -212,6 +218,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
212
218
  operationLoader: _this6._operationLoader,
213
219
  optimisticConfig: null,
214
220
  publishQueue: _this6._publishQueue,
221
+ reactFlightPayloadDeserializer: _this6._reactFlightPayloadDeserializer,
215
222
  scheduler: _this6._scheduler,
216
223
  sink: sink,
217
224
  source: RelayObservable.from({
@@ -300,15 +307,9 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
300
307
  var _this9 = this;
301
308
 
302
309
  var operation = _ref.operation,
303
- cacheConfig = _ref.cacheConfig,
304
310
  updater = _ref.updater;
305
-
306
- var _this$__createLogObse = this.__createLogObserver(operation.request.node.params, operation.request.variables),
307
- logObserver = _this$__createLogObse[0],
308
- logRequestInfo = _this$__createLogObse[1];
309
-
310
311
  return RelayObservable.create(function (sink) {
311
- var source = _this9._network.execute(operation.request.node.params, operation.request.variables, cacheConfig || {}, null, logRequestInfo)["do"](logObserver);
312
+ var source = _this9._network.execute(operation.request.node.params, operation.request.variables, operation.request.cacheConfig || {}, null);
312
313
 
313
314
  var executor = RelayModernQueryExecutor.execute({
314
315
  operation: operation,
@@ -316,6 +317,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
316
317
  operationLoader: _this9._operationLoader,
317
318
  optimisticConfig: null,
318
319
  publishQueue: _this9._publishQueue,
320
+ reactFlightPayloadDeserializer: _this9._reactFlightPayloadDeserializer,
319
321
  scheduler: _this9._scheduler,
320
322
  sink: sink,
321
323
  source: source,
@@ -345,17 +347,11 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
345
347
  _proto.executeMutation = function executeMutation(_ref2) {
346
348
  var _this10 = this;
347
349
 
348
- var cacheConfig = _ref2.cacheConfig,
349
- operation = _ref2.operation,
350
+ var operation = _ref2.operation,
350
351
  optimisticResponse = _ref2.optimisticResponse,
351
352
  optimisticUpdater = _ref2.optimisticUpdater,
352
353
  updater = _ref2.updater,
353
354
  uploadables = _ref2.uploadables;
354
-
355
- var _this$__createLogObse2 = this.__createLogObserver(operation.request.node.params, operation.request.variables),
356
- logObserver = _this$__createLogObse2[0],
357
- logRequestInfo = _this$__createLogObse2[1];
358
-
359
355
  return RelayObservable.create(function (sink) {
360
356
  var optimisticConfig;
361
357
 
@@ -367,9 +363,9 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
367
363
  };
368
364
  }
369
365
 
370
- var source = _this10._network.execute(operation.request.node.params, operation.request.variables, _objectSpread({}, cacheConfig, {
366
+ var source = _this10._network.execute(operation.request.node.params, operation.request.variables, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, operation.request.cacheConfig), {}, {
371
367
  force: true
372
- }), uploadables, logRequestInfo)["do"](logObserver);
368
+ }), uploadables);
373
369
 
374
370
  var executor = RelayModernQueryExecutor.execute({
375
371
  operation: operation,
@@ -377,6 +373,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
377
373
  operationLoader: _this10._operationLoader,
378
374
  optimisticConfig: optimisticConfig,
379
375
  publishQueue: _this10._publishQueue,
376
+ reactFlightPayloadDeserializer: _this10._reactFlightPayloadDeserializer,
380
377
  scheduler: _this10._scheduler,
381
378
  sink: sink,
382
379
  source: source,
@@ -415,6 +412,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
415
412
  operationTracker: _this11._operationTracker,
416
413
  optimisticConfig: null,
417
414
  publishQueue: _this11._publishQueue,
415
+ reactFlightPayloadDeserializer: _this11._reactFlightPayloadDeserializer,
418
416
  scheduler: _this11._scheduler,
419
417
  sink: sink,
420
418
  source: source,
@@ -432,57 +430,68 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
432
430
  var _this$configName;
433
431
 
434
432
  return "RelayModernEnvironment(".concat((_this$configName = this.configName) !== null && _this$configName !== void 0 ? _this$configName : '', ")");
435
- };
433
+ }
434
+ /**
435
+ * Wraps the network with logging to ensure that network requests are
436
+ * always logged. Relying on each network callsite to be wrapped is
437
+ * untenable and will eventually lead to holes in the logging.
438
+ */
439
+ ;
436
440
 
437
- _proto.__createLogObserver = function __createLogObserver(params, variables) {
438
- var transactionID = generateID();
439
- var log = this.__log;
440
- var logObserver = {
441
- start: function start(subscription) {
442
- log({
443
- name: 'execute.start',
444
- transactionID: transactionID,
445
- params: params,
446
- variables: variables
447
- });
448
- },
449
- next: function next(response) {
450
- log({
451
- name: 'execute.next',
452
- transactionID: transactionID,
453
- response: response
454
- });
455
- },
456
- error: function error(_error) {
457
- log({
458
- name: 'execute.error',
459
- transactionID: transactionID,
460
- error: _error
461
- });
462
- },
463
- complete: function complete() {
464
- log({
465
- name: 'execute.complete',
466
- transactionID: transactionID
467
- });
468
- },
469
- unsubscribe: function unsubscribe() {
470
- log({
471
- name: 'execute.unsubscribe',
472
- transactionID: transactionID
473
- });
474
- }
475
- };
441
+ _proto.__wrapNetworkWithLogObserver = function __wrapNetworkWithLogObserver(network) {
442
+ var that = this;
443
+ return {
444
+ execute: function execute(params, variables, cacheConfig, uploadables) {
445
+ var transactionID = generateID();
446
+ var log = that.__log;
447
+ var logObserver = {
448
+ start: function start(subscription) {
449
+ log({
450
+ name: 'network.start',
451
+ transactionID: transactionID,
452
+ params: params,
453
+ variables: variables
454
+ });
455
+ },
456
+ next: function next(response) {
457
+ log({
458
+ name: 'network.next',
459
+ transactionID: transactionID,
460
+ response: response
461
+ });
462
+ },
463
+ error: function error(_error) {
464
+ log({
465
+ name: 'network.error',
466
+ transactionID: transactionID,
467
+ error: _error
468
+ });
469
+ },
470
+ complete: function complete() {
471
+ log({
472
+ name: 'network.complete',
473
+ transactionID: transactionID
474
+ });
475
+ },
476
+ unsubscribe: function unsubscribe() {
477
+ log({
478
+ name: 'network.unsubscribe',
479
+ transactionID: transactionID
480
+ });
481
+ }
482
+ };
476
483
 
477
- var logRequestInfo = function logRequestInfo(info) {
478
- log({
479
- name: 'execute.info',
480
- transactionID: transactionID,
481
- info: info
482
- });
483
- };
484
+ var logRequestInfo = function logRequestInfo(info) {
485
+ log({
486
+ name: 'network.info',
487
+ transactionID: transactionID,
488
+ info: info
489
+ });
490
+ };
484
491
 
485
- return [logObserver, logRequestInfo];
492
+ return network.execute(params, variables, cacheConfig, uploadables, logRequestInfo)["do"](logObserver);
493
+ }
494
+ };
486
495
  };
487
496
 
488
497
  return RelayModernEnvironment;
@@ -12,11 +12,9 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
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; }
15
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
18
16
 
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; }
17
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
18
 
21
19
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
22
20
 
@@ -26,6 +24,8 @@ var invariant = require("fbjs/lib/invariant");
26
24
 
27
25
  var isScalarAndEqual = require('../util/isScalarAndEqual');
28
26
 
27
+ var reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
28
+
29
29
  var warning = require("fbjs/lib/warning");
30
30
 
31
31
  var _require = require('../query/fetchQueryInternal'),
@@ -105,7 +105,7 @@ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
105
105
  var nextItem = resolver.resolve();
106
106
 
107
107
  if (nextData || nextItem !== prevItem) {
108
- nextData = nextData || _objectSpread({}, prevData);
108
+ nextData = nextData || (0, _objectSpread2["default"])({}, prevData);
109
109
  nextData[_key2] = nextItem;
110
110
  }
111
111
  } else {
@@ -114,7 +114,7 @@ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
114
114
  var _nextItem = prop !== undefined ? prop : null;
115
115
 
116
116
  if (nextData || !isScalarAndEqual(_nextItem, prevItem)) {
117
- nextData = nextData || _objectSpread({}, prevData);
117
+ nextData = nextData || (0, _objectSpread2["default"])({}, prevData);
118
118
  nextData[_key2] = _nextItem;
119
119
  }
120
120
  }
@@ -199,6 +199,7 @@ var SelectorResolver = /*#__PURE__*/function () {
199
199
  (0, _defineProperty2["default"])(this, "_onChange", function (snapshot) {
200
200
  _this2._data = snapshot.data;
201
201
  _this2._isMissingData = snapshot.isMissingData;
202
+ _this2._missingRequiredFields = snapshot.missingRequiredFields;
202
203
 
203
204
  _this2._callback();
204
205
  });
@@ -208,6 +209,7 @@ var SelectorResolver = /*#__PURE__*/function () {
208
209
  this._callback = callback;
209
210
  this._data = _snapshot.data;
210
211
  this._isMissingData = _snapshot.isMissingData;
212
+ this._missingRequiredFields = _snapshot.missingRequiredFields;
211
213
  this._environment = environment;
212
214
  this._selector = selector;
213
215
  this._subscription = environment.subscribe(_snapshot, this._onChange);
@@ -256,6 +258,10 @@ var SelectorResolver = /*#__PURE__*/function () {
256
258
  }
257
259
  }
258
260
 
261
+ if (this._missingRequiredFields != null) {
262
+ reportMissingRequiredFields(this._environment, this._missingRequiredFields);
263
+ }
264
+
259
265
  return this._data;
260
266
  };
261
267
 
@@ -270,6 +276,7 @@ var SelectorResolver = /*#__PURE__*/function () {
270
276
 
271
277
  this._data = snapshot.data;
272
278
  this._isMissingData = snapshot.isMissingData;
279
+ this._missingRequiredFields = snapshot.missingRequiredFields;
273
280
  this._selector = selector;
274
281
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
275
282
  };
@@ -287,7 +294,7 @@ var SelectorResolver = /*#__PURE__*/function () {
287
294
  } // NOTE: We manually create the request descriptor here instead of
288
295
  // calling createOperationDescriptor() because we want to set a
289
296
  // descriptor with *unaltered* variables as the fragment owner.
290
- // This is a hack that allows us to preserve exisiting (broken)
297
+ // This is a hack that allows us to preserve existing (broken)
291
298
  // behavior of RelayModern containers while using fragment ownership
292
299
  // to propagate variables instead of Context.
293
300
  // For more details, see the summary of D13999308
@@ -30,11 +30,11 @@ var _require3 = require('./RelayStoreUtils'),
30
30
  * are filtered to exclude variables that do not match defined arguments on the
31
31
  * operation, and default values are populated for null values.
32
32
  */
33
- function createOperationDescriptor(request, variables) {
34
- var dataID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ROOT_ID;
33
+ function createOperationDescriptor(request, variables, cacheConfig) {
34
+ var dataID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ROOT_ID;
35
35
  var operation = request.operation;
36
36
  var operationVariables = getOperationVariables(operation, variables);
37
- var requestDescriptor = createRequestDescriptor(request, operationVariables);
37
+ var requestDescriptor = createRequestDescriptor(request, operationVariables, cacheConfig);
38
38
  var operationDescriptor = {
39
39
  fragment: createReaderSelector(request.fragment, dataID, operationVariables, requestDescriptor),
40
40
  request: requestDescriptor,
@@ -53,11 +53,12 @@ function createOperationDescriptor(request, variables) {
53
53
  return operationDescriptor;
54
54
  }
55
55
 
56
- function createRequestDescriptor(request, variables) {
56
+ function createRequestDescriptor(request, variables, cacheConfig) {
57
57
  var requestDescriptor = {
58
58
  identifier: getRequestIdentifier(request.params, variables),
59
59
  node: request,
60
- variables: variables
60
+ variables: variables,
61
+ cacheConfig: cacheConfig
61
62
  };
62
63
 
63
64
  if (process.env.NODE_ENV !== "production") {
@@ -13,19 +13,11 @@
13
13
 
14
14
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
15
 
16
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
17
17
 
18
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
19
-
20
- 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; }
21
-
22
- 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; }
23
-
24
- 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; } } }; }
18
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
25
19
 
26
- 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); }
27
-
28
- 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; }
20
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
29
21
 
30
22
  var RelayError = require('../util/RelayError');
31
23
 
@@ -37,6 +29,8 @@ var RelayRecordSource = require('./RelayRecordSource');
37
29
 
38
30
  var RelayResponseNormalizer = require('./RelayResponseNormalizer');
39
31
 
32
+ var getOperation = require('../util/getOperation');
33
+
40
34
  var invariant = require("fbjs/lib/invariant");
41
35
 
42
36
  var stableCopy = require('../util/stableCopy');
@@ -81,7 +75,8 @@ var Executor = /*#__PURE__*/function () {
81
75
  operationTracker = _ref.operationTracker,
82
76
  treatMissingFieldsAsNull = _ref.treatMissingFieldsAsNull,
83
77
  getDataID = _ref.getDataID,
84
- isClientPayload = _ref.isClientPayload;
78
+ isClientPayload = _ref.isClientPayload,
79
+ reactFlightPayloadDeserializer = _ref.reactFlightPayloadDeserializer;
85
80
  this._getDataID = getDataID;
86
81
  this._treatMissingFieldsAsNull = treatMissingFieldsAsNull;
87
82
  this._incrementalPayloadsPending = false;
@@ -103,6 +98,7 @@ var Executor = /*#__PURE__*/function () {
103
98
  this._subscriptions = new Map();
104
99
  this._updater = updater;
105
100
  this._isClientPayload = isClientPayload === true;
101
+ this._reactFlightPayloadDeserializer = reactFlightPayloadDeserializer;
106
102
  var id = this._nextSubscriptionId++;
107
103
  source.subscribe({
108
104
  complete: function complete() {
@@ -166,6 +162,12 @@ var Executor = /*#__PURE__*/function () {
166
162
  this._incrementalResults.clear();
167
163
 
168
164
  this._completeOperationTracker();
165
+
166
+ if (this._retainDisposable) {
167
+ this._retainDisposable.dispose();
168
+
169
+ this._retainDisposable = null;
170
+ }
169
171
  };
170
172
 
171
173
  _proto._updateActiveState = function _updateActiveState() {
@@ -387,17 +389,17 @@ var Executor = /*#__PURE__*/function () {
387
389
  nonIncrementalResponses = _partitionGraphQLResp[0],
388
390
  incrementalResponses = _partitionGraphQLResp[1]; // In theory this doesn't preserve the ordering of the batch.
389
391
  // The idea is that a batch is always:
390
- // * at-most one non-incremental payload
391
- // * followed zero or more incremental payloads
392
+ // * at most one non-incremental payload
393
+ // * followed by zero or more incremental payloads
392
394
  // The non-incremental payload can appear if the server sends a batch
393
- // w the initial payload followed by some early-to-resolve incremental
395
+ // with the initial payload followed by some early-to-resolve incremental
394
396
  // payloads (although, can that even happen?)
395
397
 
396
398
 
397
399
  if (nonIncrementalResponses.length > 0) {
398
- var payloadFollowups = this._processResponses(nonIncrementalResponses); // Please note, that we're passing `this._operation` to the publish
400
+ var payloadFollowups = this._processResponses(nonIncrementalResponses); // Please note that we're passing `this._operation` to the publish
399
401
  // queue here, which will later passed to the store (via notify)
400
- // to indicate that this is an operation that cause the store to update
402
+ // to indicate that this is an operation that caused the store to update
401
403
 
402
404
 
403
405
  var updatedOwners = this._publishQueue.run(this._operation);
@@ -405,6 +407,10 @@ var Executor = /*#__PURE__*/function () {
405
407
  this._updateOperationTracker(updatedOwners);
406
408
 
407
409
  this._processPayloadFollowups(payloadFollowups);
410
+
411
+ if (this._incrementalPayloadsPending && !this._retainDisposable) {
412
+ this._retainDisposable = this._store.retain(this._operation);
413
+ }
408
414
  }
409
415
 
410
416
  if (incrementalResponses.length > 0) {
@@ -438,6 +444,7 @@ var Executor = /*#__PURE__*/function () {
438
444
  var payload = normalizeResponse(response, this._operation.root, ROOT_TYPE, {
439
445
  getDataID: this._getDataID,
440
446
  path: [],
447
+ reactFlightPayloadDeserializer: this._reactFlightPayloadDeserializer,
441
448
  treatMissingFieldsAsNull: treatMissingFieldsAsNull
442
449
  });
443
450
  validateOptimisticResponsePayload(payload);
@@ -477,7 +484,7 @@ var Executor = /*#__PURE__*/function () {
477
484
  var operationLoader = this._operationLoader;
478
485
  !operationLoader ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernEnvironment: Expected an operationLoader to be ' + 'configured when using `@match`.') : invariant(false) : void 0;
479
486
 
480
- var _iterator = _createForOfIteratorHelper(moduleImportPayloads),
487
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(moduleImportPayloads),
481
488
  _step;
482
489
 
483
490
  try {
@@ -488,9 +495,9 @@ var Executor = /*#__PURE__*/function () {
488
495
  if (operation == null) {
489
496
  this._processAsyncOptimisticModuleImport(operationLoader, moduleImportPayload);
490
497
  } else {
491
- var moduleImportOptimisitcUpdates = this._processOptimisticModuleImport(operation, moduleImportPayload);
498
+ var moduleImportOptimisticUpdates = this._processOptimisticModuleImport(operation, moduleImportPayload);
492
499
 
493
- optimisticUpdates.push.apply(optimisticUpdates, (0, _toConsumableArray2["default"])(moduleImportOptimisitcUpdates));
500
+ optimisticUpdates.push.apply(optimisticUpdates, (0, _toConsumableArray2["default"])(moduleImportOptimisticUpdates));
494
501
  }
495
502
  }
496
503
  } catch (err) {
@@ -508,11 +515,13 @@ var Executor = /*#__PURE__*/function () {
508
515
  }, selector, moduleImportPayload.typeName, {
509
516
  getDataID: this._getDataID,
510
517
  path: moduleImportPayload.path,
518
+ reactFlightPayloadDeserializer: this._reactFlightPayloadDeserializer,
511
519
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull
512
520
  });
513
521
  };
514
522
 
515
- _proto._processOptimisticModuleImport = function _processOptimisticModuleImport(operation, moduleImportPayload) {
523
+ _proto._processOptimisticModuleImport = function _processOptimisticModuleImport(normalizationRootNode, moduleImportPayload) {
524
+ var operation = getOperation(normalizationRootNode);
516
525
  var optimisticUpdates = [];
517
526
 
518
527
  var modulePayload = this._normalizeModuleImport(moduleImportPayload, operation);
@@ -537,18 +546,18 @@ var Executor = /*#__PURE__*/function () {
537
546
  return;
538
547
  }
539
548
 
540
- var moduleImportOptimisitcUpdates = _this7._processOptimisticModuleImport(operation, moduleImportPayload);
549
+ var moduleImportOptimisticUpdates = _this7._processOptimisticModuleImport(operation, moduleImportPayload);
541
550
 
542
- moduleImportOptimisitcUpdates.forEach(function (update) {
551
+ moduleImportOptimisticUpdates.forEach(function (update) {
543
552
  return _this7._publishQueue.applyUpdate(update);
544
553
  });
545
554
 
546
555
  if (_this7._optimisticUpdates == null) {
547
- process.env.NODE_ENV !== "production" ? warning(false, 'RelayModernQueryExecutor: Unexpected ModuleImport optimisitc ' + 'update in operation %s.' + _this7._operation.request.node.params.name) : void 0;
556
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayModernQueryExecutor: Unexpected ModuleImport optimistic ' + 'update in operation %s.' + _this7._operation.request.node.params.name) : void 0;
548
557
  } else {
549
558
  var _this$_optimisticUpda;
550
559
 
551
- (_this$_optimisticUpda = _this7._optimisticUpdates).push.apply(_this$_optimisticUpda, (0, _toConsumableArray2["default"])(moduleImportOptimisitcUpdates));
560
+ (_this$_optimisticUpda = _this7._optimisticUpdates).push.apply(_this$_optimisticUpda, (0, _toConsumableArray2["default"])(moduleImportOptimisticUpdates));
552
561
 
553
562
  _this7._publishQueue.run();
554
563
  }
@@ -575,8 +584,9 @@ var Executor = /*#__PURE__*/function () {
575
584
  return responses.map(function (payloadPart) {
576
585
  var relayPayload = normalizeResponse(payloadPart, _this8._operation.root, ROOT_TYPE, {
577
586
  getDataID: _this8._getDataID,
578
- treatMissingFieldsAsNull: _this8._treatMissingFieldsAsNull,
579
- path: []
587
+ path: [],
588
+ reactFlightPayloadDeserializer: _this8._reactFlightPayloadDeserializer,
589
+ treatMissingFieldsAsNull: _this8._treatMissingFieldsAsNull
580
590
  });
581
591
 
582
592
  _this8._publishQueue.commitPayload(_this8._operation, relayPayload, _this8._updater);
@@ -676,12 +686,13 @@ var Executor = /*#__PURE__*/function () {
676
686
  _proto._processModuleImportPayload = function _processModuleImportPayload(moduleImportPayload, operationLoader) {
677
687
  var _this10 = this;
678
688
 
679
- var syncOperation = operationLoader.get(moduleImportPayload.operationReference);
689
+ var node = operationLoader.get(moduleImportPayload.operationReference);
680
690
 
681
- if (syncOperation != null) {
682
- // If the operation module is available synchronously, normalize the
691
+ if (node != null) {
692
+ var operation = getOperation(node); // If the operation module is available synchronously, normalize the
683
693
  // data synchronously.
684
- this._handleModuleImportPayload(moduleImportPayload, syncOperation);
694
+
695
+ this._handleModuleImportPayload(moduleImportPayload, operation);
685
696
 
686
697
  this._maybeCompleteSubscriptionOperationTracking();
687
698
  } else {
@@ -705,7 +716,7 @@ var Executor = /*#__PURE__*/function () {
705
716
  })).map(function (operation) {
706
717
  if (operation != null) {
707
718
  _this10._schedule(function () {
708
- _this10._handleModuleImportPayload(moduleImportPayload, operation);
719
+ _this10._handleModuleImportPayload(moduleImportPayload, getOperation(operation));
709
720
  });
710
721
  }
711
722
  }).subscribe({
@@ -917,6 +928,7 @@ var Executor = /*#__PURE__*/function () {
917
928
  var relayPayload = normalizeResponse(response, placeholder.selector, placeholder.typeName, {
918
929
  getDataID: this._getDataID,
919
930
  path: placeholder.path,
931
+ reactFlightPayloadDeserializer: this._reactFlightPayloadDeserializer,
920
932
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull
921
933
  });
922
934
 
@@ -1068,6 +1080,7 @@ var Executor = /*#__PURE__*/function () {
1068
1080
  var relayPayload = normalizeResponse(response, selector, typeName, {
1069
1081
  getDataID: this._getDataID,
1070
1082
  path: [].concat((0, _toConsumableArray2["default"])(normalizationPath), [responseKey, String(itemIndex)]),
1083
+ reactFlightPayloadDeserializer: this._reactFlightPayloadDeserializer,
1071
1084
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull
1072
1085
  });
1073
1086
  return {
@@ -1128,7 +1141,7 @@ function normalizeResponse(response, selector, typeName, options) {
1128
1141
  var record = RelayModernRecord.create(selector.dataID, typeName);
1129
1142
  source.set(selector.dataID, record);
1130
1143
  var relayPayload = RelayResponseNormalizer.normalize(source, selector, data, options);
1131
- return _objectSpread({}, relayPayload, {
1144
+ return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, relayPayload), {}, {
1132
1145
  errors: errors,
1133
1146
  isFinal: ((_response$extensions3 = response.extensions) === null || _response$extensions3 === void 0 ? void 0 : _response$extensions3.is_final) === true
1134
1147
  });
@@ -12,11 +12,7 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
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
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
20
16
 
21
17
  var areEqual = require("fbjs/lib/areEqual");
22
18
 
@@ -87,7 +83,7 @@ var _require2 = require('./RelayStoreUtils'),
87
83
  * Clone a record.
88
84
  */
89
85
  function clone(record) {
90
- return _objectSpread({}, record);
86
+ return (0, _objectSpread2["default"])({}, record);
91
87
  }
92
88
  /**
93
89
  * @public
@@ -248,7 +244,7 @@ function update(prevRecord, nextRecord) {
248
244
  var key = keys[ii];
249
245
 
250
246
  if (updated || !areEqual(prevRecord[key], nextRecord[key])) {
251
- updated = updated !== null ? updated : _objectSpread({}, prevRecord);
247
+ updated = updated !== null ? updated : (0, _objectSpread2["default"])({}, prevRecord);
252
248
  updated[key] = nextRecord[key];
253
249
  }
254
250
  }