relay-runtime 10.1.3 → 11.0.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 (106) hide show
  1. package/handlers/connection/ConnectionHandler.js.flow +60 -0
  2. package/handlers/connection/MutationHandlers.js.flow +28 -0
  3. package/index.js +1 -1
  4. package/index.js.flow +9 -3
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  6. package/lib/handlers/connection/ConnectionHandler.js +68 -6
  7. package/lib/handlers/connection/MutationHandlers.js +67 -8
  8. package/lib/index.js +3 -0
  9. package/lib/multi-actor-environment/ActorIdentifier.js +23 -0
  10. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +108 -0
  11. package/lib/multi-actor-environment/MultiActorEnvironment.js +156 -0
  12. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  13. package/lib/multi-actor-environment/index.js +17 -0
  14. package/lib/mutations/RelayRecordProxy.js +1 -1
  15. package/lib/mutations/RelayRecordSourceMutator.js +1 -1
  16. package/lib/mutations/RelayRecordSourceProxy.js +1 -1
  17. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -1
  18. package/lib/mutations/applyOptimisticMutation.js +1 -1
  19. package/lib/mutations/commitMutation.js +1 -1
  20. package/lib/mutations/validateMutation.js +36 -15
  21. package/lib/network/RelayNetwork.js +1 -1
  22. package/lib/network/RelayQueryResponseCache.js +3 -2
  23. package/lib/query/GraphQLTag.js +1 -1
  24. package/lib/query/fetchQuery.js +129 -13
  25. package/lib/query/fetchQueryInternal.js +3 -4
  26. package/lib/query/fetchQuery_DEPRECATED.js +39 -0
  27. package/lib/store/DataChecker.js +26 -14
  28. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +117 -47
  29. package/lib/store/RelayConcreteVariables.js +8 -4
  30. package/lib/store/RelayModernEnvironment.js +105 -136
  31. package/lib/store/RelayModernFragmentSpecResolver.js +16 -9
  32. package/lib/store/RelayModernRecord.js +1 -1
  33. package/lib/store/RelayModernSelector.js +1 -1
  34. package/lib/store/RelayModernStore.js +19 -20
  35. package/lib/store/RelayOperationTracker.js +55 -49
  36. package/lib/store/RelayPublishQueue.js +9 -5
  37. package/lib/store/RelayReader.js +68 -14
  38. package/lib/store/RelayReferenceMarker.js +28 -14
  39. package/lib/store/RelayResponseNormalizer.js +109 -15
  40. package/lib/store/RelayStoreReactFlightUtils.js +6 -4
  41. package/lib/store/RelayStoreSubscriptions.js +18 -8
  42. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +90 -30
  43. package/lib/store/RelayStoreUtils.js +3 -2
  44. package/lib/store/ResolverFragments.js +57 -0
  45. package/lib/store/cloneRelayHandleSourceField.js +1 -1
  46. package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
  47. package/lib/store/createFragmentSpecResolver.js +2 -2
  48. package/lib/store/createRelayContext.js +1 -1
  49. package/lib/store/defaultGetDataID.js +3 -1
  50. package/lib/store/hasOverlappingIDs.js +11 -3
  51. package/lib/store/readInlineData.js +1 -1
  52. package/lib/subscription/requestSubscription.js +33 -5
  53. package/lib/util/RelayConcreteNode.js +2 -0
  54. package/lib/util/RelayFeatureFlags.js +8 -3
  55. package/lib/util/RelayProfiler.js +17 -187
  56. package/lib/util/RelayReplaySubject.js +1 -1
  57. package/lib/util/deepFreeze.js +1 -0
  58. package/lib/util/getRelayHandleKey.js +1 -1
  59. package/lib/util/getRequestIdentifier.js +1 -1
  60. package/multi-actor-environment/ActorIdentifier.js.flow +27 -0
  61. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +189 -0
  62. package/multi-actor-environment/MultiActorEnvironment.js.flow +233 -0
  63. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +196 -0
  64. package/multi-actor-environment/index.js.flow +24 -0
  65. package/mutations/RelayRecordSourceProxy.js.flow +3 -2
  66. package/mutations/commitMutation.js.flow +1 -1
  67. package/mutations/validateMutation.js.flow +40 -15
  68. package/network/RelayNetworkTypes.js.flow +31 -11
  69. package/network/RelayQueryResponseCache.js.flow +2 -1
  70. package/package.json +3 -2
  71. package/query/fetchQuery.js.flow +147 -20
  72. package/query/fetchQueryInternal.js.flow +2 -3
  73. package/query/fetchQuery_DEPRECATED.js.flow +47 -0
  74. package/relay-runtime.js +2 -2
  75. package/relay-runtime.min.js +2 -2
  76. package/store/DataChecker.js.flow +23 -15
  77. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +128 -40
  78. package/store/RelayConcreteVariables.js.flow +5 -0
  79. package/store/RelayModernEnvironment.js.flow +100 -130
  80. package/store/RelayModernFragmentSpecResolver.js.flow +30 -8
  81. package/store/RelayModernStore.js.flow +28 -24
  82. package/store/RelayOperationTracker.js.flow +69 -56
  83. package/store/RelayPublishQueue.js.flow +7 -4
  84. package/store/RelayReader.js.flow +63 -11
  85. package/store/RelayRecordSource.js.flow +3 -3
  86. package/store/RelayRecordSourceMapImpl.js.flow +6 -2
  87. package/store/RelayReferenceMarker.js.flow +28 -18
  88. package/store/RelayResponseNormalizer.js.flow +134 -23
  89. package/store/RelayStoreReactFlightUtils.js.flow +9 -4
  90. package/store/RelayStoreSubscriptions.js.flow +22 -7
  91. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +36 -12
  92. package/store/RelayStoreTypes.js.flow +51 -22
  93. package/store/RelayStoreUtils.js.flow +2 -1
  94. package/store/ResolverFragments.js.flow +125 -0
  95. package/store/createFragmentSpecResolver.js.flow +2 -0
  96. package/store/defaultGetDataID.js.flow +3 -1
  97. package/store/hasOverlappingIDs.js.flow +11 -9
  98. package/subscription/requestSubscription.js.flow +25 -2
  99. package/util/NormalizationNode.js.flow +13 -0
  100. package/util/ReaderNode.js.flow +14 -1
  101. package/util/RelayConcreteNode.js.flow +2 -0
  102. package/util/RelayFeatureFlags.js.flow +12 -2
  103. package/util/RelayProfiler.js.flow +22 -194
  104. package/util/RelayRuntimeTypes.js.flow +4 -5
  105. package/util/deepFreeze.js.flow +2 -1
  106. package/util/isEmptyObject.js.flow +1 -1
@@ -20,19 +20,19 @@ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
20
 
21
21
  var RelayModernRecord = require('./RelayModernRecord');
22
22
 
23
- var RelayProfiler = require('../util/RelayProfiler');
24
-
25
23
  var areEqual = require("fbjs/lib/areEqual");
26
24
 
27
- var invariant = require("fbjs/lib/invariant");
25
+ var invariant = require('invariant');
28
26
 
29
27
  var warning = require("fbjs/lib/warning");
30
28
 
31
29
  var _require = require('../util/RelayConcreteNode'),
32
30
  CONDITION = _require.CONDITION,
31
+ CLIENT_COMPONENT = _require.CLIENT_COMPONENT,
33
32
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
34
33
  DEFER = _require.DEFER,
35
34
  FLIGHT_FIELD = _require.FLIGHT_FIELD,
35
+ FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
36
36
  INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
37
37
  LINKED_FIELD = _require.LINKED_FIELD,
38
38
  LINKED_HANDLE = _require.LINKED_HANDLE,
@@ -51,7 +51,7 @@ var _require3 = require('./RelayModernSelector'),
51
51
 
52
52
  var _require4 = require('./RelayStoreReactFlightUtils'),
53
53
  refineToReactFlightPayloadData = _require4.refineToReactFlightPayloadData,
54
- REACT_FLIGHT_QUERIES_STORAGE_KEY = _require4.REACT_FLIGHT_QUERIES_STORAGE_KEY,
54
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require4.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
55
55
  REACT_FLIGHT_TREE_STORAGE_KEY = _require4.REACT_FLIGHT_TREE_STORAGE_KEY,
56
56
  REACT_FLIGHT_TYPE_NAME = _require4.REACT_FLIGHT_TYPE_NAME;
57
57
 
@@ -100,6 +100,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
100
100
  this._recordSource = recordSource;
101
101
  this._variables = variables;
102
102
  this._reactFlightPayloadDeserializer = options.reactFlightPayloadDeserializer;
103
+ this._reactFlightServerErrorHandler = options.reactFlightServerErrorHandler;
104
+ this._shouldProcessClientComponents = options.shouldProcessClientComponents;
103
105
  }
104
106
 
105
107
  var _proto = RelayResponseNormalizer.prototype;
@@ -122,7 +124,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
122
124
  };
123
125
 
124
126
  _proto._getVariableValue = function _getVariableValue(name) {
125
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
127
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
128
+
126
129
  return this._variables[name];
127
130
  };
128
131
 
@@ -152,6 +155,13 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
152
155
 
153
156
  break;
154
157
 
158
+ case FRAGMENT_SPREAD:
159
+ {
160
+ this._traverseSelections(selection.fragment, record, data);
161
+
162
+ break;
163
+ }
164
+
155
165
  case INLINE_FRAGMENT:
156
166
  {
157
167
  var abstractKey = selection.abstractKey;
@@ -265,6 +275,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
265
275
  this._isClientExtension = isClientExtension;
266
276
  break;
267
277
 
278
+ case CLIENT_COMPONENT:
279
+ if (this._shouldProcessClientComponents === false) {
280
+ break;
281
+ }
282
+
283
+ this._traverseSelections(selection.fragment, record, data);
284
+
285
+ break;
286
+
268
287
  case FLIGHT_FIELD:
269
288
  if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
270
289
  this._normalizeFlightField(node, selection, record, data);
@@ -426,17 +445,45 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
426
445
  var fieldValue = data[responseKey];
427
446
 
428
447
  if (fieldValue == null) {
448
+ if (fieldValue === undefined) {
449
+ // Flight field may be missing in the response if:
450
+ // - It is inside an abstract type refinement where the concrete type does
451
+ // not conform to the interface/union.
452
+ // However an otherwise-required field may also be missing if the server
453
+ // is configured to skip fields with `null` values, in which case the
454
+ // client is assumed to be correctly configured with
455
+ // treatMissingFieldsAsNull=true.
456
+ if (this._isUnmatchedAbstractType) {
457
+ // Field not expected to exist regardless of whether the server is pruning null
458
+ // fields or not.
459
+ return;
460
+ } else if (!this._treatMissingFieldsAsNull) {
461
+ // Not optional and the server is not pruning null fields: field is expected
462
+ // to be present
463
+ if (process.env.NODE_ENV !== "production") {
464
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
465
+ }
466
+
467
+ return;
468
+ }
469
+ }
470
+
429
471
  RelayModernRecord.setValue(record, storageKey, null);
430
472
  return;
431
473
  }
432
474
 
433
475
  var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
434
- !(reactFlightPayload != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Expected React Flight payload data ' + 'to be an object with `tree` and `queries` properties, got `%s`.', fieldValue) : invariant(false) : void 0;
435
- !(typeof this._reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', this._reactFlightPayloadDeserializer) : invariant(false) : void 0; // We store the deserialized reactFlightClientResponse in a separate
436
- // record and link it to the parent record. This is so we can GC the Flight
437
- // tree later even if the parent record is still reachable.
476
+ var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
477
+ !(reactFlightPayload != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected React Flight payload data to be an ' + 'object with `status`, tree`, `queries` and `errors` properties, got ' + '`%s`.', fieldValue) : invariant(false) : void 0;
478
+ !(typeof reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', reactFlightPayloadDeserializer) : invariant(false) : void 0;
438
479
 
439
- var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
480
+ if (reactFlightPayload.errors.length > 0) {
481
+ if (typeof this._reactFlightServerErrorHandler === 'function') {
482
+ this._reactFlightServerErrorHandler(reactFlightPayload.status, reactFlightPayload.errors);
483
+ } else {
484
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Received server errors for field `%s`.\n\n' + '%s\n%s', responseKey, reactFlightPayload.errors[0].message, reactFlightPayload.errors[0].stack) : void 0;
485
+ }
486
+ }
440
487
 
441
488
  var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
442
489
 
@@ -448,8 +495,27 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
448
495
  this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
449
496
  }
450
497
 
498
+ if (reactFlightPayload.tree == null) {
499
+ // This typically indicates that a fatal server error prevented rows from
500
+ // being written. When this occurs, we should not continue normalization of
501
+ // the Flight field because the row response is malformed.
502
+ //
503
+ // Receiving empty rows is OK because it can indicate the start of a stream.
504
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0; // We create the flight record with a null value for the tree
505
+ // and empty reachable definitions
506
+
507
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, null);
508
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, []);
509
+ RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
510
+ return;
511
+ } // We store the deserialized reactFlightClientResponse in a separate
512
+ // record and link it to the parent record. This is so we can GC the Flight
513
+ // tree later even if the parent record is still reachable.
514
+
515
+
516
+ var reactFlightClientResponse = reactFlightPayloadDeserializer(reactFlightPayload.tree);
451
517
  RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
452
- var reachableQueries = [];
518
+ var reachableExecutableDefinitions = [];
453
519
 
454
520
  var _iterator = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.queries),
455
521
  _step;
@@ -469,7 +535,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
469
535
  });
470
536
  }
471
537
 
472
- reachableQueries.push({
538
+ reachableExecutableDefinitions.push({
473
539
  module: query.module,
474
540
  variables: query.variables
475
541
  });
@@ -480,7 +546,36 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
480
546
  _iterator.f();
481
547
  }
482
548
 
483
- RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_QUERIES_STORAGE_KEY, reachableQueries);
549
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.fragments),
550
+ _step2;
551
+
552
+ try {
553
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
554
+ var fragment = _step2.value;
555
+
556
+ if (fragment.response.data != null) {
557
+ this._moduleImportPayloads.push({
558
+ data: fragment.response.data,
559
+ dataID: fragment.__id,
560
+ operationReference: fragment.module,
561
+ path: [],
562
+ typeName: fragment.__typename,
563
+ variables: fragment.variables
564
+ });
565
+ }
566
+
567
+ reachableExecutableDefinitions.push({
568
+ module: fragment.module,
569
+ variables: fragment.variables
570
+ });
571
+ }
572
+ } catch (err) {
573
+ _iterator2.e(err);
574
+ } finally {
575
+ _iterator2.f();
576
+ }
577
+
578
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, reachableExecutableDefinitions);
484
579
  RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
485
580
  };
486
581
 
@@ -610,7 +705,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
610
705
  return RelayResponseNormalizer;
611
706
  }();
612
707
 
613
- var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
614
708
  module.exports = {
615
- normalize: instrumentedNormalize
709
+ normalize: normalize
616
710
  };
@@ -10,17 +10,19 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/invariant");
13
+ var invariant = require('invariant');
14
14
 
15
15
  var _require = require('./RelayModernRecord'),
16
16
  getType = _require.getType;
17
17
 
18
- var REACT_FLIGHT_QUERIES_STORAGE_KEY = 'queries';
18
+ // Reachable (client) executable definitions encountered while server component
19
+ // rendering
20
+ var REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = 'executableDefinitions';
19
21
  var REACT_FLIGHT_TREE_STORAGE_KEY = 'tree';
20
22
  var REACT_FLIGHT_TYPE_NAME = 'ReactFlightComponent';
21
23
 
22
24
  function refineToReactFlightPayloadData(payload) {
23
- if (payload == null || typeof payload !== 'object' || !Array.isArray(payload.tree) || !Array.isArray(payload.queries)) {
25
+ if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.fragments) || !Array.isArray(payload.errors)) {
24
26
  return null;
25
27
  }
26
28
 
@@ -39,7 +41,7 @@ function getReactFlightClientResponse(record) {
39
41
  }
40
42
 
41
43
  module.exports = {
42
- REACT_FLIGHT_QUERIES_STORAGE_KEY: REACT_FLIGHT_QUERIES_STORAGE_KEY,
44
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY: REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
43
45
  REACT_FLIGHT_TREE_STORAGE_KEY: REACT_FLIGHT_TREE_STORAGE_KEY,
44
46
  REACT_FLIGHT_TYPE_NAME: REACT_FLIGHT_TYPE_NAME,
45
47
  getReactFlightClientResponse: getReactFlightClientResponse,
@@ -10,19 +10,20 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
14
+
13
15
  var RelayReader = require('./RelayReader');
14
16
 
15
17
  var deepFreeze = require('../util/deepFreeze');
16
18
 
17
19
  var hasOverlappingIDs = require('./hasOverlappingIDs');
18
20
 
19
- var isEmptyObject = require('../util/isEmptyObject');
20
-
21
21
  var recycleNodesInto = require('../util/recycleNodesInto');
22
22
 
23
23
  var RelayStoreSubscriptions = /*#__PURE__*/function () {
24
- function RelayStoreSubscriptions() {
24
+ function RelayStoreSubscriptions(log) {
25
25
  this._subscriptions = new Set();
26
+ this.__log = log;
26
27
  }
27
28
 
28
29
  var _proto = RelayStoreSubscriptions.prototype;
@@ -59,7 +60,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
59
60
  // but its base has changed (we just applied a final payload): recompute
60
61
  // a backup so that we can later restore to the state the subscription
61
62
  // should be in.
62
- // - stale=false: This subscription was restored to the same value than
63
+ // - stale=false: This subscription was restored to the same value as
63
64
  // `snapshot`. That means this subscription does *not* have changes relative
64
65
  // to its base, so the current `snapshot` is valid to use as a backup.
65
66
  if (!subscription.stale) {
@@ -99,13 +100,13 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
99
100
  });
100
101
  };
101
102
 
102
- _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners) {
103
+ _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
103
104
  var _this2 = this;
104
105
 
105
- var hasUpdatedRecords = !isEmptyObject(updatedRecordIDs);
106
+ var hasUpdatedRecords = updatedRecordIDs.size !== 0;
106
107
 
107
108
  this._subscriptions.forEach(function (subscription) {
108
- var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords);
109
+ var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
109
110
 
110
111
  if (owner != null) {
111
112
  updatedOwners.push(owner);
@@ -122,7 +123,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
122
123
  */
123
124
  ;
124
125
 
125
- _proto._updateSubscription = function _updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords) {
126
+ _proto._updateSubscription = function _updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation) {
126
127
  var backup = subscription.backup,
127
128
  callback = subscription.callback,
128
129
  snapshot = subscription.snapshot,
@@ -151,6 +152,15 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
151
152
  subscription.stale = false;
152
153
 
153
154
  if (nextSnapshot.data !== snapshot.data) {
155
+ if (this.__log && RelayFeatureFlags.ENABLE_NOTIFY_SUBSCRIPTION) {
156
+ this.__log({
157
+ name: 'store.notify.subscription',
158
+ sourceOperation: sourceOperation,
159
+ snapshot: snapshot,
160
+ nextSnapshot: nextSnapshot
161
+ });
162
+ }
163
+
154
164
  callback(nextSnapshot);
155
165
  return snapshot.selector.owner;
156
166
  }
@@ -10,6 +10,12 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
17
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
+
13
19
  var RelayReader = require('./RelayReader');
14
20
 
15
21
  var deepFreeze = require('../util/deepFreeze');
@@ -17,11 +23,12 @@ var deepFreeze = require('../util/deepFreeze');
17
23
  var recycleNodesInto = require('../util/recycleNodesInto');
18
24
 
19
25
  var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
20
- function RelayStoreSubscriptionsUsingMapByID() {
26
+ function RelayStoreSubscriptionsUsingMapByID(log) {
21
27
  this._notifiedRevision = 0;
22
28
  this._snapshotRevision = 0;
23
29
  this._subscriptionsByDataId = new Map();
24
30
  this._staleSubscriptions = new Set();
31
+ this.__log = log;
25
32
  }
26
33
 
27
34
  var _proto = RelayStoreSubscriptionsUsingMapByID.prototype;
@@ -38,27 +45,49 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
38
45
  };
39
46
 
40
47
  var dispose = function dispose() {
41
- for (var dataId in snapshot.seenRecords) {
42
- var subscriptionsForDataId = _this._subscriptionsByDataId.get(dataId);
48
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(snapshot.seenRecords),
49
+ _step;
43
50
 
44
- if (subscriptionsForDataId != null) {
45
- subscriptionsForDataId["delete"](subscription);
51
+ try {
52
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
53
+ var dataId = _step.value;
46
54
 
47
- if (subscriptionsForDataId.size === 0) {
48
- _this._subscriptionsByDataId["delete"](dataId);
55
+ var subscriptionsForDataId = _this._subscriptionsByDataId.get(dataId);
56
+
57
+ if (subscriptionsForDataId != null) {
58
+ subscriptionsForDataId["delete"](subscription);
59
+
60
+ if (subscriptionsForDataId.size === 0) {
61
+ _this._subscriptionsByDataId["delete"](dataId);
62
+ }
49
63
  }
50
64
  }
65
+ } catch (err) {
66
+ _iterator.e(err);
67
+ } finally {
68
+ _iterator.f();
51
69
  }
52
70
  };
53
71
 
54
- for (var dataId in snapshot.seenRecords) {
55
- var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
72
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(snapshot.seenRecords),
73
+ _step2;
74
+
75
+ try {
76
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
77
+ var dataId = _step2.value;
78
+
79
+ var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
56
80
 
57
- if (subscriptionsForDataId != null) {
58
- subscriptionsForDataId.add(subscription);
59
- } else {
60
- this._subscriptionsByDataId.set(dataId, new Set([subscription]));
81
+ if (subscriptionsForDataId != null) {
82
+ subscriptionsForDataId.add(subscription);
83
+ } else {
84
+ this._subscriptionsByDataId.set(dataId, new Set([subscription]));
85
+ }
61
86
  }
87
+ } catch (err) {
88
+ _iterator2.e(err);
89
+ } finally {
90
+ _iterator2.f();
62
91
  }
63
92
 
64
93
  return {
@@ -142,11 +171,11 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
142
171
  });
143
172
  };
144
173
 
145
- _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners) {
174
+ _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
146
175
  var _this4 = this;
147
176
 
148
177
  this._notifiedRevision++;
149
- Object.keys(updatedRecordIDs).forEach(function (updatedRecordId) {
178
+ updatedRecordIDs.forEach(function (updatedRecordId) {
150
179
  var subcriptionsForDataId = _this4._subscriptionsByDataId.get(updatedRecordId);
151
180
 
152
181
  if (subcriptionsForDataId == null) {
@@ -158,7 +187,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
158
187
  return;
159
188
  }
160
189
 
161
- var owner = _this4._updateSubscription(source, subscription, false);
190
+ var owner = _this4._updateSubscription(source, subscription, false, sourceOperation);
162
191
 
163
192
  if (owner != null) {
164
193
  updatedOwners.push(owner);
@@ -171,7 +200,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
171
200
  return;
172
201
  }
173
202
 
174
- var owner = _this4._updateSubscription(source, subscription, true);
203
+ var owner = _this4._updateSubscription(source, subscription, true, sourceOperation);
175
204
 
176
205
  if (owner != null) {
177
206
  updatedOwners.push(owner);
@@ -191,7 +220,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
191
220
  */
192
221
  ;
193
222
 
194
- _proto._updateSubscription = function _updateSubscription(source, subscription, stale) {
223
+ _proto._updateSubscription = function _updateSubscription(source, subscription, stale, sourceOperation) {
195
224
  var backup = subscription.backup,
196
225
  callback = subscription.callback,
197
226
  snapshot = subscription.snapshot;
@@ -216,6 +245,15 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
216
245
  this._updateSubscriptionsMap(subscription, prevSeenRecords);
217
246
 
218
247
  if (nextSnapshot.data !== snapshot.data) {
248
+ if (this.__log && RelayFeatureFlags.ENABLE_NOTIFY_SUBSCRIPTION) {
249
+ this.__log({
250
+ name: 'store.notify.subscription',
251
+ sourceOperation: sourceOperation,
252
+ snapshot: snapshot,
253
+ nextSnapshot: nextSnapshot
254
+ });
255
+ }
256
+
219
257
  callback(nextSnapshot);
220
258
  return snapshot.selector.owner;
221
259
  }
@@ -229,26 +267,48 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
229
267
  ;
230
268
 
231
269
  _proto._updateSubscriptionsMap = function _updateSubscriptionsMap(subscription, prevSeenRecords) {
232
- for (var dataId in prevSeenRecords) {
233
- var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
270
+ var _iterator3 = (0, _createForOfIteratorHelper2["default"])(prevSeenRecords),
271
+ _step3;
272
+
273
+ try {
274
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
275
+ var dataId = _step3.value;
234
276
 
235
- if (subscriptionsForDataId != null) {
236
- subscriptionsForDataId["delete"](subscription);
277
+ var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
278
+
279
+ if (subscriptionsForDataId != null) {
280
+ subscriptionsForDataId["delete"](subscription);
237
281
 
238
- if (subscriptionsForDataId.size === 0) {
239
- this._subscriptionsByDataId["delete"](dataId);
282
+ if (subscriptionsForDataId.size === 0) {
283
+ this._subscriptionsByDataId["delete"](dataId);
284
+ }
240
285
  }
241
286
  }
287
+ } catch (err) {
288
+ _iterator3.e(err);
289
+ } finally {
290
+ _iterator3.f();
242
291
  }
243
292
 
244
- for (var _dataId in subscription.snapshot.seenRecords) {
245
- var _subscriptionsForDataId = this._subscriptionsByDataId.get(_dataId);
293
+ var _iterator4 = (0, _createForOfIteratorHelper2["default"])(subscription.snapshot.seenRecords),
294
+ _step4;
295
+
296
+ try {
297
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
298
+ var _dataId = _step4.value;
246
299
 
247
- if (_subscriptionsForDataId != null) {
248
- _subscriptionsForDataId.add(subscription);
249
- } else {
250
- this._subscriptionsByDataId.set(_dataId, new Set([subscription]));
300
+ var _subscriptionsForDataId = this._subscriptionsByDataId.get(_dataId);
301
+
302
+ if (_subscriptionsForDataId != null) {
303
+ _subscriptionsForDataId.add(subscription);
304
+ } else {
305
+ this._subscriptionsByDataId.set(_dataId, new Set([subscription]));
306
+ }
251
307
  }
308
+ } catch (err) {
309
+ _iterator4.e(err);
310
+ } finally {
311
+ _iterator4.f();
252
312
  }
253
313
  };
254
314
 
@@ -18,7 +18,7 @@ var RelayConcreteNode = require('../util/RelayConcreteNode');
18
18
 
19
19
  var getRelayHandleKey = require('../util/getRelayHandleKey');
20
20
 
21
- var invariant = require("fbjs/lib/invariant");
21
+ var invariant = require('invariant');
22
22
 
23
23
  var stableCopy = require('../util/stableCopy');
24
24
 
@@ -175,7 +175,8 @@ function formatStorageKey(name, argValues) {
175
175
 
176
176
 
177
177
  function getStableVariableValue(name, variables) {
178
- !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
178
+ !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
179
+
179
180
  return stableCopy(variables[name]);
180
181
  }
181
182
 
@@ -0,0 +1,57 @@
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
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ var invariant = require('invariant');
14
+
15
+ var _require = require('../query/GraphQLTag'),
16
+ getFragment = _require.getFragment;
17
+
18
+ var _require2 = require('./RelayModernSelector'),
19
+ getSelector = _require2.getSelector;
20
+
21
+ var contextStack = [];
22
+
23
+ function withResolverContext(context, cb) {
24
+ contextStack.push(context);
25
+
26
+ try {
27
+ return cb();
28
+ } finally {
29
+ contextStack.pop();
30
+ }
31
+ } // NOTE: these declarations are copied from 'useFragment'; it would be good
32
+ // to figure out how to share the same type signature between the two functions.
33
+ // The declarations ensure that the type of the returned data is:
34
+ // - non-nullable if the provided ref type is non-nullable
35
+ // - nullable if the provided ref type is nullable
36
+ // - array of non-nullable if the privoided ref type is an array of
37
+ // non-nullable refs
38
+ // - array of nullable if the privoided ref type is an array of nullable refs
39
+
40
+
41
+ function readFragment(fragmentInput, fragmentRef) {
42
+ if (!contextStack.length) {
43
+ throw new Error('readFragment should be called only from within a Relay Resolver function.');
44
+ }
45
+
46
+ var context = contextStack[contextStack.length - 1];
47
+ var fragmentNode = getFragment(fragmentInput);
48
+ var fragmentSelector = getSelector(fragmentNode, fragmentRef);
49
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a selector for the fragment of the resolver ".concat(fragmentNode.name, ", but got null.")) : invariant(false) : void 0;
50
+ !(fragmentSelector.kind === 'SingularReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a singular reader selector for the fragment of the resolver ".concat(fragmentNode.name, ", but it was plural.")) : invariant(false) : void 0;
51
+ return context.getDataForResolverFragment(fragmentSelector);
52
+ }
53
+
54
+ module.exports = {
55
+ readFragment: readFragment,
56
+ withResolverContext: withResolverContext
57
+ };
@@ -12,7 +12,7 @@
12
12
 
13
13
  var areEqual = require("fbjs/lib/areEqual");
14
14
 
15
- var invariant = require("fbjs/lib/invariant");
15
+ var invariant = require('invariant');
16
16
 
17
17
  var _require = require('../util/RelayConcreteNode'),
18
18
  LINKED_FIELD = _require.LINKED_FIELD;
@@ -12,7 +12,7 @@
12
12
 
13
13
  var areEqual = require("fbjs/lib/areEqual");
14
14
 
15
- var invariant = require("fbjs/lib/invariant");
15
+ var invariant = require('invariant');
16
16
 
17
17
  var _require = require('../util/RelayConcreteNode'),
18
18
  SCALAR_FIELD = _require.SCALAR_FIELD;
@@ -14,7 +14,7 @@ var RelayModernFragmentSpecResolver = require('./RelayModernFragmentSpecResolver
14
14
 
15
15
  var warning = require("fbjs/lib/warning");
16
16
 
17
- function createFragmentSpecResolver(context, containerName, fragments, props, callback) {
17
+ function createFragmentSpecResolver(context, containerName, fragments, props, rootIsQueryRenderer, callback) {
18
18
  if (process.env.NODE_ENV !== "production") {
19
19
  var fragmentNames = Object.keys(fragments);
20
20
  fragmentNames.forEach(function (fragmentName) {
@@ -23,7 +23,7 @@ function createFragmentSpecResolver(context, containerName, fragments, props, ca
23
23
  });
24
24
  }
25
25
 
26
- return new RelayModernFragmentSpecResolver(context, fragments, props, callback);
26
+ return new RelayModernFragmentSpecResolver(context, fragments, props, callback, rootIsQueryRenderer);
27
27
  }
28
28
 
29
29
  module.exports = createFragmentSpecResolver;
@@ -10,7 +10,7 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/invariant");
13
+ var invariant = require('invariant');
14
14
 
15
15
  var relayContext;
16
16
  var firstReact;
@@ -16,8 +16,10 @@ var _require = require('./ViewerPattern'),
16
16
 
17
17
  function defaultGetDataID(fieldValue, typeName) {
18
18
  if (typeName === VIEWER_TYPE) {
19
+ // $FlowFixMe[prop-missing]
19
20
  return fieldValue.id == null ? VIEWER_ID : fieldValue.id;
20
- }
21
+ } // $FlowFixMe[prop-missing]
22
+
21
23
 
22
24
  return fieldValue.id;
23
25
  }