relay-runtime 11.0.1 → 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 (71) hide show
  1. package/index.js +1 -1
  2. package/index.js.flow +4 -2
  3. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  4. package/lib/handlers/connection/ConnectionHandler.js +1 -1
  5. package/lib/handlers/connection/MutationHandlers.js +1 -1
  6. package/lib/multi-actor-environment/ActorIdentifier.js +23 -0
  7. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +108 -0
  8. package/lib/multi-actor-environment/MultiActorEnvironment.js +156 -0
  9. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  10. package/lib/multi-actor-environment/index.js +17 -0
  11. package/lib/mutations/RelayRecordProxy.js +1 -1
  12. package/lib/mutations/RelayRecordSourceMutator.js +1 -1
  13. package/lib/mutations/RelayRecordSourceProxy.js +1 -1
  14. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -1
  15. package/lib/mutations/applyOptimisticMutation.js +1 -1
  16. package/lib/mutations/commitMutation.js +1 -1
  17. package/lib/network/RelayNetwork.js +1 -1
  18. package/lib/network/RelayQueryResponseCache.js +1 -1
  19. package/lib/query/GraphQLTag.js +1 -1
  20. package/lib/query/fetchQuery.js +1 -1
  21. package/lib/query/fetchQueryInternal.js +1 -1
  22. package/lib/store/DataChecker.js +1 -1
  23. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +81 -37
  24. package/lib/store/RelayConcreteVariables.js +1 -1
  25. package/lib/store/RelayModernEnvironment.js +99 -144
  26. package/lib/store/RelayModernFragmentSpecResolver.js +1 -1
  27. package/lib/store/RelayModernRecord.js +1 -1
  28. package/lib/store/RelayModernSelector.js +1 -1
  29. package/lib/store/RelayModernStore.js +1 -6
  30. package/lib/store/RelayOperationTracker.js +1 -1
  31. package/lib/store/RelayPublishQueue.js +9 -5
  32. package/lib/store/RelayReader.js +63 -10
  33. package/lib/store/RelayReferenceMarker.js +1 -1
  34. package/lib/store/RelayResponseNormalizer.js +47 -22
  35. package/lib/store/RelayStoreReactFlightUtils.js +1 -1
  36. package/lib/store/RelayStoreUtils.js +1 -1
  37. package/lib/store/ResolverFragments.js +57 -0
  38. package/lib/store/cloneRelayHandleSourceField.js +1 -1
  39. package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
  40. package/lib/store/createRelayContext.js +1 -1
  41. package/lib/store/readInlineData.js +1 -1
  42. package/lib/subscription/requestSubscription.js +18 -7
  43. package/lib/util/RelayConcreteNode.js +1 -0
  44. package/lib/util/RelayFeatureFlags.js +3 -1
  45. package/lib/util/RelayProfiler.js +17 -187
  46. package/lib/util/RelayReplaySubject.js +1 -1
  47. package/lib/util/getRelayHandleKey.js +1 -1
  48. package/lib/util/getRequestIdentifier.js +1 -1
  49. package/multi-actor-environment/ActorIdentifier.js.flow +27 -0
  50. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +189 -0
  51. package/multi-actor-environment/MultiActorEnvironment.js.flow +233 -0
  52. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +196 -0
  53. package/multi-actor-environment/index.js.flow +24 -0
  54. package/network/RelayNetworkTypes.js.flow +5 -4
  55. package/package.json +3 -2
  56. package/relay-runtime.js +2 -2
  57. package/relay-runtime.min.js +2 -2
  58. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +82 -35
  59. package/store/RelayModernEnvironment.js.flow +88 -131
  60. package/store/RelayModernStore.js.flow +0 -5
  61. package/store/RelayPublishQueue.js.flow +7 -4
  62. package/store/RelayReader.js.flow +57 -5
  63. package/store/RelayResponseNormalizer.js.flow +67 -26
  64. package/store/RelayStoreTypes.js.flow +15 -8
  65. package/store/ResolverFragments.js.flow +125 -0
  66. package/subscription/requestSubscription.js.flow +15 -7
  67. package/util/ReaderNode.js.flow +14 -1
  68. package/util/RelayConcreteNode.js.flow +1 -0
  69. package/util/RelayFeatureFlags.js.flow +4 -0
  70. package/util/RelayProfiler.js.flow +22 -194
  71. package/util/RelayRuntimeTypes.js.flow +3 -1
@@ -14,7 +14,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
16
 
17
- var invariant = require("fbjs/lib/invariant");
17
+ var invariant = require('invariant');
18
18
 
19
19
  var RelayOperationTracker = /*#__PURE__*/function () {
20
20
  function RelayOperationTracker() {
@@ -10,7 +10,7 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var ErrorUtils = require("fbjs/lib/ErrorUtils");
13
+ var _global$ErrorUtils$ap, _global$ErrorUtils;
14
14
 
15
15
  var RelayReader = require('./RelayReader');
16
16
 
@@ -22,10 +22,13 @@ var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
22
22
 
23
23
  var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
24
24
 
25
- var invariant = require("fbjs/lib/invariant");
25
+ var invariant = require('invariant');
26
26
 
27
27
  var warning = require("fbjs/lib/warning");
28
28
 
29
+ var applyWithGuard = (_global$ErrorUtils$ap = (_global$ErrorUtils = global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
30
+ return callback.apply(context, args);
31
+ };
29
32
  /**
30
33
  * Coordinates the concurrent modification of a `Store` due to optimistic and
31
34
  * non-revertable client updates and server payloads:
@@ -37,6 +40,7 @@ var warning = require("fbjs/lib/warning");
37
40
  * - Executes handlers for "handle" fields.
38
41
  * - Reverts and reapplies pending optimistic updates.
39
42
  */
43
+
40
44
  var RelayPublishQueue = /*#__PURE__*/function () {
41
45
  // True if the next `run()` should apply the backup and rerun all optimistic
42
46
  // updates performing a rebase.
@@ -259,7 +263,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
259
263
  var sink = RelayRecordSource.create();
260
264
  var mutator = new RelayRecordSourceMutator(_this2._store.getSource(), sink);
261
265
  var recordSourceProxy = new RelayRecordSourceProxy(mutator, _this2._getDataID);
262
- ErrorUtils.applyWithGuard(updater, null, [recordSourceProxy], null, 'RelayPublishQueue:commitData');
266
+ applyWithGuard(updater, null, [recordSourceProxy], null, 'RelayPublishQueue:commitData');
263
267
  invalidatedStore = invalidatedStore || recordSourceProxy.isStoreMarkedForInvalidation();
264
268
  var idsMarkedForInvalidation = recordSourceProxy.getIDsMarkedForInvalidation();
265
269
 
@@ -288,7 +292,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
288
292
  var processUpdate = function processUpdate(optimisticUpdate) {
289
293
  if (optimisticUpdate.storeUpdater) {
290
294
  var storeUpdater = optimisticUpdate.storeUpdater;
291
- ErrorUtils.applyWithGuard(storeUpdater, null, [recordSourceProxy], null, 'RelayPublishQueue:applyUpdates');
295
+ applyWithGuard(storeUpdater, null, [recordSourceProxy], null, 'RelayPublishQueue:applyUpdates');
292
296
  } else {
293
297
  var operation = optimisticUpdate.operation,
294
298
  payload = optimisticUpdate.payload,
@@ -304,7 +308,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
304
308
  }
305
309
 
306
310
  if (updater) {
307
- ErrorUtils.applyWithGuard(updater, null, [recordSourceSelectorProxy, selectorData], null, 'RelayPublishQueue:applyUpdates');
311
+ applyWithGuard(updater, null, [recordSourceSelectorProxy, selectorData], null, 'RelayPublishQueue:applyUpdates');
308
312
  }
309
313
  }
310
314
  }; // rerun all updaters in case we are running a rebase
@@ -10,11 +10,15 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
13
17
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
14
18
 
15
19
  var RelayModernRecord = require('./RelayModernRecord');
16
20
 
17
- var invariant = require("fbjs/lib/invariant");
21
+ var invariant = require('invariant');
18
22
 
19
23
  var _require = require('../util/RelayConcreteNode'),
20
24
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
@@ -27,6 +31,7 @@ var _require = require('../util/RelayConcreteNode'),
27
31
  LINKED_FIELD = _require.LINKED_FIELD,
28
32
  MODULE_IMPORT = _require.MODULE_IMPORT,
29
33
  REQUIRED_FIELD = _require.REQUIRED_FIELD,
34
+ RELAY_RESOLVER = _require.RELAY_RESOLVER,
30
35
  SCALAR_FIELD = _require.SCALAR_FIELD,
31
36
  STREAM = _require.STREAM;
32
37
 
@@ -45,8 +50,11 @@ var _require3 = require('./RelayStoreUtils'),
45
50
  getStorageKey = _require3.getStorageKey,
46
51
  getModuleComponentKey = _require3.getModuleComponentKey;
47
52
 
48
- var _require4 = require('./TypeID'),
49
- generateTypeID = _require4.generateTypeID;
53
+ var _require4 = require('./ResolverFragments'),
54
+ withResolverContext = _require4.withResolverContext;
55
+
56
+ var _require5 = require('./TypeID'),
57
+ generateTypeID = _require5.generateTypeID;
50
58
 
51
59
  function read(recordSource, selector) {
52
60
  var reader = new RelayReader(recordSource, selector);
@@ -310,6 +318,17 @@ var RelayReader = /*#__PURE__*/function () {
310
318
  break;
311
319
  }
312
320
 
321
+ case RELAY_RESOLVER:
322
+ {
323
+ if (!RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
324
+ throw new Error('Relay Resolver fields are not yet supported.');
325
+ }
326
+
327
+ this._readResolverField(selection, record, data);
328
+
329
+ break;
330
+ }
331
+
313
332
  case FRAGMENT_SPREAD:
314
333
  this._createFragmentPointer(selection, record, data);
315
334
 
@@ -321,7 +340,7 @@ var RelayReader = /*#__PURE__*/function () {
321
340
  break;
322
341
 
323
342
  case INLINE_DATA_FRAGMENT_SPREAD:
324
- this._createInlineDataFragmentPointer(selection, record, data);
343
+ this._createInlineDataOrResolverFragmentPointer(selection, record, data);
325
344
 
326
345
  break;
327
346
 
@@ -388,6 +407,40 @@ var RelayReader = /*#__PURE__*/function () {
388
407
  }
389
408
  };
390
409
 
410
+ _proto._readResolverField = function _readResolverField(selection, record, data) {
411
+ var _this = this;
412
+
413
+ var name = selection.name,
414
+ alias = selection.alias,
415
+ resolverModule = selection.resolverModule,
416
+ fragment = selection.fragment;
417
+ var key = {
418
+ __id: RelayModernRecord.getDataID(record),
419
+ __fragmentOwner: this._owner,
420
+ __fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
421
+ };
422
+ var resolverContext = {
423
+ getDataForResolverFragment: function getDataForResolverFragment(singularReaderSelector) {
424
+ var _resolverFragmentData;
425
+
426
+ var resolverFragmentData = {};
427
+
428
+ _this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
429
+
430
+ var answer = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
431
+ !(typeof answer === 'object' && answer !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
432
+ return answer;
433
+ }
434
+ };
435
+ var resolverResult = withResolverContext(resolverContext, function () {
436
+ return (// $FlowFixMe[prop-missing] - resolver module's type signature is a lie
437
+ resolverModule(key)
438
+ );
439
+ });
440
+ data[alias !== null && alias !== void 0 ? alias : name] = resolverResult;
441
+ return resolverResult;
442
+ };
443
+
391
444
  _proto._readFlightField = function _readFlightField(field, record, data) {
392
445
  var _field$alias;
393
446
 
@@ -466,7 +519,7 @@ var RelayReader = /*#__PURE__*/function () {
466
519
  };
467
520
 
468
521
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
469
- var _this = this;
522
+ var _this2 = this;
470
523
 
471
524
  var _field$alias4;
472
525
 
@@ -490,7 +543,7 @@ var RelayReader = /*#__PURE__*/function () {
490
543
  linkedIDs.forEach(function (linkedID, nextIndex) {
491
544
  if (linkedID == null) {
492
545
  if (linkedID === undefined) {
493
- _this._isMissingData = true;
546
+ _this2._isMissingData = true;
494
547
  } // $FlowFixMe[cannot-write]
495
548
 
496
549
 
@@ -502,7 +555,7 @@ var RelayReader = /*#__PURE__*/function () {
502
555
  !(prevItem == null || typeof prevItem === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevItem) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
503
556
  // $FlowFixMe[incompatible-variance]
504
557
 
505
- linkedArray[nextIndex] = _this._traverse(field, linkedID, prevItem);
558
+ linkedArray[nextIndex] = _this2._traverse(field, linkedID, prevItem);
506
559
  });
507
560
  data[applicationName] = linkedArray;
508
561
  return linkedArray;
@@ -564,7 +617,7 @@ var RelayReader = /*#__PURE__*/function () {
564
617
  }
565
618
  };
566
619
 
567
- _proto._createInlineDataFragmentPointer = function _createInlineDataFragmentPointer(inlineDataFragmentSpread, record, data) {
620
+ _proto._createInlineDataOrResolverFragmentPointer = function _createInlineDataOrResolverFragmentPointer(fragmentSpreadOrFragment, record, data) {
568
621
  var fragmentPointers = data[FRAGMENTS_KEY];
569
622
 
570
623
  if (fragmentPointers == null) {
@@ -579,10 +632,10 @@ var RelayReader = /*#__PURE__*/function () {
579
632
 
580
633
  var inlineData = {};
581
634
 
582
- this._traverseSelections(inlineDataFragmentSpread.selections, record, inlineData); // $FlowFixMe[cannot-write] - writing into read-only field
635
+ this._traverseSelections(fragmentSpreadOrFragment.selections, record, inlineData); // $FlowFixMe[cannot-write] - writing into read-only field
583
636
 
584
637
 
585
- fragmentPointers[inlineDataFragmentSpread.name] = inlineData;
638
+ fragmentPointers[fragmentSpreadOrFragment.name] = inlineData;
586
639
  };
587
640
 
588
641
  return RelayReader;
@@ -28,7 +28,7 @@ var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
28
28
 
29
29
  var getOperation = require('../util/getOperation');
30
30
 
31
- var invariant = require("fbjs/lib/invariant");
31
+ var invariant = require('invariant');
32
32
 
33
33
  var _require = require('./TypeID'),
34
34
  generateTypeID = _require.generateTypeID;
@@ -20,11 +20,9 @@ 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
 
@@ -447,13 +445,37 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
447
445
  var fieldValue = data[responseKey];
448
446
 
449
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
+
450
471
  RelayModernRecord.setValue(record, storageKey, null);
451
472
  return;
452
473
  }
453
474
 
454
475
  var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
476
+ var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
455
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;
456
- !(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;
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;
457
479
 
458
480
  if (reactFlightPayload.errors.length > 0) {
459
481
  if (typeof this._reactFlightServerErrorHandler === 'function') {
@@ -461,22 +483,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
461
483
  } else {
462
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;
463
485
  }
464
- } // This typically indicates that a fatal server error prevented rows from
465
- // being written. When this occurs, we should not continue normalization of
466
- // the Flight field because the row response is malformed.
467
- //
468
- // Receiving empty rows is OK because it can indicate the start of a stream.
469
-
470
-
471
- if (reactFlightPayload.tree == null) {
472
- 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;
473
- return;
474
- } // We store the deserialized reactFlightClientResponse in a separate
475
- // record and link it to the parent record. This is so we can GC the Flight
476
- // tree later even if the parent record is still reachable.
477
-
478
-
479
- var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
486
+ }
480
487
 
481
488
  var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
482
489
 
@@ -488,6 +495,25 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
488
495
  this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
489
496
  }
490
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);
491
517
  RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
492
518
  var reachableExecutableDefinitions = [];
493
519
 
@@ -679,7 +705,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
679
705
  return RelayResponseNormalizer;
680
706
  }();
681
707
 
682
- var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
683
708
  module.exports = {
684
- normalize: instrumentedNormalize
709
+ normalize: normalize
685
710
  };
@@ -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 _require = require('./RelayModernRecord'),
16
16
  getType = _require.getType;
@@ -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
 
@@ -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;
@@ -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;
@@ -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 _require = require('../query/GraphQLTag'),
16
16
  getInlineDataFragment = _require.getInlineDataFragment;
@@ -25,6 +25,9 @@ var _require2 = require('../store/ClientID'),
25
25
  var _require3 = require('../store/RelayModernOperationDescriptor'),
26
26
  createOperationDescriptor = _require3.createOperationDescriptor;
27
27
 
28
+ var _require4 = require('../store/RelayModernSelector'),
29
+ createReaderSelector = _require4.createReaderSelector;
30
+
28
31
  function requestSubscription(environment, config) {
29
32
  var subscription = getRequest(config.subscription);
30
33
 
@@ -50,19 +53,27 @@ function requestSubscription(environment, config) {
50
53
  operation: operation,
51
54
  updater: updater
52
55
  }).map(function (responses) {
56
+ var selector = operation.fragment;
57
+
53
58
  if (RelayFeatureFlags.ENABLE_UNIQUE_SUBSCRIPTION_ROOT) {
59
+ var nextID;
60
+
54
61
  if (Array.isArray(responses)) {
55
- // $FlowFixMe[incompatible-cast]
56
- return responses.map(function (response) {
57
- return response.data;
58
- });
59
- } // $FlowFixMe[incompatible-cast]
62
+ var _responses$, _responses$$extension;
63
+
64
+ nextID = (_responses$ = responses[0]) === null || _responses$ === void 0 ? void 0 : (_responses$$extension = _responses$.extensions) === null || _responses$$extension === void 0 ? void 0 : _responses$$extension.__relay_subscription_root_id;
65
+ } else {
66
+ var _responses$extensions;
60
67
 
68
+ nextID = (_responses$extensions = responses.extensions) === null || _responses$extensions === void 0 ? void 0 : _responses$extensions.__relay_subscription_root_id;
69
+ }
61
70
 
62
- return responses.data;
71
+ if (typeof nextID === 'string') {
72
+ selector = createReaderSelector(selector.node, nextID, selector.variables, selector.owner);
73
+ }
63
74
  }
64
75
 
65
- var data = environment.lookup(operation.fragment).data; // $FlowFixMe[incompatible-cast]
76
+ var data = environment.lookup(selector).data; // $FlowFixMe[incompatible-cast]
66
77
 
67
78
  return data;
68
79
  }).subscribe({
@@ -41,6 +41,7 @@ var RelayConcreteNode = {
41
41
  LIST_VALUE: 'ListValue',
42
42
  LOCAL_ARGUMENT: 'LocalArgument',
43
43
  MODULE_IMPORT: 'ModuleImport',
44
+ RELAY_RESOLVER: 'RelayResolver',
44
45
  REQUIRED_FIELD: 'RequiredField',
45
46
  OBJECT_VALUE: 'ObjectValue',
46
47
  OPERATION: 'Operation',
@@ -17,12 +17,14 @@ var RelayFeatureFlags = {
17
17
  ENABLE_PRECISE_TYPE_REFINEMENT: false,
18
18
  ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
19
19
  ENABLE_REQUIRED_DIRECTIVES: false,
20
+ ENABLE_RELAY_RESOLVERS: false,
20
21
  ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
21
22
  ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
22
23
  ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
23
24
  ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
24
25
  ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
25
26
  ENABLE_NOTIFY_SUBSCRIPTION: false,
26
- ENABLE_UNIQUE_SUBSCRIPTION_ROOT: false
27
+ ENABLE_UNIQUE_SUBSCRIPTION_ROOT: false,
28
+ ENABLE_BATCHED_STORE_UPDATES: false
27
29
  };
28
30
  module.exports = RelayFeatureFlags;