relay-runtime 18.2.0 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/experimental.js +1 -1
  2. package/experimental.js.flow +8 -6
  3. package/index.js +1 -1
  4. package/index.js.flow +3 -0
  5. package/lib/experimental.js +5 -2
  6. package/lib/index.js +3 -0
  7. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +1 -1
  8. package/lib/mutations/RelayRecordSourceProxy.js +2 -1
  9. package/lib/mutations/createUpdatableProxy.js +1 -1
  10. package/lib/mutations/validateMutation.js +2 -2
  11. package/lib/network/RelayObservable.js +1 -3
  12. package/lib/network/wrapNetworkWithLogObserver.js +2 -2
  13. package/lib/query/fetchQuery.js +1 -1
  14. package/lib/store/DataChecker.js +12 -8
  15. package/lib/store/OperationExecutor.js +93 -43
  16. package/lib/store/RelayModernEnvironment.js +13 -4
  17. package/lib/store/RelayModernFragmentSpecResolver.js +4 -4
  18. package/lib/store/RelayModernStore.js +49 -24
  19. package/lib/store/RelayPublishQueue.js +11 -15
  20. package/lib/store/RelayReader.js +134 -151
  21. package/lib/store/RelayReferenceMarker.js +14 -7
  22. package/lib/store/RelayResponseNormalizer.js +57 -31
  23. package/lib/store/RelayStoreSubscriptions.js +2 -2
  24. package/lib/store/RelayStoreUtils.js +8 -0
  25. package/lib/store/ResolverFragments.js +2 -2
  26. package/lib/store/createRelayLoggingContext.js +17 -0
  27. package/lib/store/generateTypenamePrefixedDataID.js +9 -0
  28. package/lib/store/live-resolvers/LiveResolverCache.js +4 -2
  29. package/lib/store/live-resolvers/resolverDataInjector.js +4 -4
  30. package/lib/store/normalizeResponse.js +2 -2
  31. package/lib/store/observeFragmentExperimental.js +60 -13
  32. package/lib/store/observeQueryExperimental.js +21 -0
  33. package/lib/util/RelayFeatureFlags.js +7 -1
  34. package/lib/util/handlePotentialSnapshotErrors.js +11 -8
  35. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +1 -0
  36. package/mutations/RelayRecordSourceProxy.js.flow +4 -0
  37. package/mutations/createUpdatableProxy.js.flow +1 -1
  38. package/mutations/validateMutation.js.flow +3 -3
  39. package/network/RelayNetworkTypes.js.flow +3 -0
  40. package/network/RelayObservable.js.flow +1 -5
  41. package/network/wrapNetworkWithLogObserver.js.flow +19 -1
  42. package/package.json +1 -1
  43. package/query/fetchQuery.js.flow +1 -1
  44. package/store/DataChecker.js.flow +16 -4
  45. package/store/OperationExecutor.js.flow +101 -15
  46. package/store/RelayExperimentalGraphResponseTransform.js.flow +4 -4
  47. package/store/RelayModernEnvironment.js.flow +22 -6
  48. package/store/RelayModernFragmentSpecResolver.js.flow +6 -6
  49. package/store/RelayModernSelector.js.flow +2 -0
  50. package/store/RelayModernStore.js.flow +86 -27
  51. package/store/RelayPublishQueue.js.flow +32 -21
  52. package/store/RelayReader.js.flow +168 -97
  53. package/store/RelayReferenceMarker.js.flow +15 -5
  54. package/store/RelayResponseNormalizer.js.flow +104 -69
  55. package/store/RelayStoreSubscriptions.js.flow +2 -2
  56. package/store/RelayStoreTypes.js.flow +34 -4
  57. package/store/RelayStoreUtils.js.flow +29 -0
  58. package/store/ResolverCache.js.flow +2 -2
  59. package/store/ResolverFragments.js.flow +5 -3
  60. package/store/StoreInspector.js.flow +5 -0
  61. package/store/createRelayContext.js.flow +3 -2
  62. package/store/createRelayLoggingContext.js.flow +46 -0
  63. package/store/generateTypenamePrefixedDataID.js.flow +25 -0
  64. package/store/live-resolvers/LiveResolverCache.js.flow +7 -2
  65. package/store/live-resolvers/resolverDataInjector.js.flow +10 -6
  66. package/store/normalizeResponse.js.flow +2 -0
  67. package/store/observeFragmentExperimental.js.flow +82 -28
  68. package/store/observeQueryExperimental.js.flow +61 -0
  69. package/store/waitForFragmentExperimental.js.flow +4 -3
  70. package/util/NormalizationNode.js.flow +2 -1
  71. package/util/RelayConcreteNode.js.flow +2 -0
  72. package/util/RelayError.js.flow +1 -0
  73. package/util/RelayFeatureFlags.js.flow +28 -0
  74. package/util/RelayRuntimeTypes.js.flow +6 -3
  75. package/util/getPaginationVariables.js.flow +2 -0
  76. package/util/handlePotentialSnapshotErrors.js.flow +23 -11
  77. package/util/registerEnvironmentWithDevTools.js.flow +4 -2
  78. package/util/withProvidedVariables.js.flow +1 -0
  79. package/util/withStartAndDuration.js.flow +3 -0
  80. package/relay-runtime-experimental.js +0 -4
  81. package/relay-runtime-experimental.min.js +0 -9
  82. package/relay-runtime.js +0 -4
  83. package/relay-runtime.min.js +0 -9
package/experimental.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v18.2.0
2
+ * Relay v20.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -16,6 +16,7 @@ import type {DataID} from './util/RelayRuntimeTypes';
16
16
 
17
17
  const resolverDataInjector = require('./store/live-resolvers/resolverDataInjector');
18
18
  const {observeFragment} = require('./store/observeFragmentExperimental');
19
+ const {observeQuery} = require('./store/observeQueryExperimental');
19
20
  const {waitForFragmentData} = require('./store/waitForFragmentExperimental');
20
21
 
21
22
  // Annotates a strong object return type, where `A` is the GraphQL typename and `Typename` is the
@@ -43,13 +44,13 @@ export type IdOf<A: string, Typename: void | string = void> = [
43
44
  export type RelayResolverValue<A> = $NonMaybeType<A>;
44
45
 
45
46
  type ErrorResult<Error> = {
46
- ok: false,
47
- errors: $ReadOnlyArray<Error>,
47
+ +ok: false,
48
+ +errors: $ReadOnlyArray<Error>,
48
49
  };
49
50
 
50
51
  type OkayResult<T> = {
51
- ok: true,
52
- value: T,
52
+ +ok: true,
53
+ +value: T,
53
54
  };
54
55
 
55
56
  export type Result<T, Error> = OkayResult<T> | ErrorResult<Error>;
@@ -57,19 +58,20 @@ export type Result<T, Error> = OkayResult<T> | ErrorResult<Error>;
57
58
  function isValueResult<T = mixed>(
58
59
  input: Result<T, Error>,
59
60
  ): input is OkayResult<T> {
60
- return input.ok === true;
61
+ return input.ok === (true as const);
61
62
  }
62
63
 
63
64
  function isErrorResult<T = mixed>(
64
65
  input: Result<T, Error>,
65
66
  ): input is ErrorResult<Error> {
66
- return input.ok === false;
67
+ return input.ok === (false as const);
67
68
  }
68
69
 
69
70
  module.exports = {
70
71
  resolverDataInjector,
71
72
  isValueResult,
72
73
  isErrorResult,
74
+ observeQuery,
73
75
  observeFragment,
74
76
  waitForFragmentData,
75
77
  };
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v18.2.0
2
+ * Relay v20.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/index.js.flow CHANGED
@@ -35,6 +35,7 @@ const {
35
35
  } = require('./store/ClientID');
36
36
  const createFragmentSpecResolver = require('./store/createFragmentSpecResolver');
37
37
  const createRelayContext = require('./store/createRelayContext');
38
+ const createRelayLoggingContext = require('./store/createRelayLoggingContext');
38
39
  const isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
39
40
  const {
40
41
  isSuspenseSentinel,
@@ -316,6 +317,7 @@ module.exports = {
316
317
  suspenseSentinel,
317
318
  isRequest: GraphQLTag.isRequest,
318
319
  readInlineData,
320
+ readFragment: ResolverFragments.readFragment,
319
321
 
320
322
  // Declarative mutation API
321
323
  MutationTypes: RelayDeclarativeMutationConfig.MutationTypes,
@@ -379,6 +381,7 @@ module.exports = {
379
381
  ResolverFragments,
380
382
  OperationTracker: RelayOperationTracker,
381
383
  createRelayContext: createRelayContext,
384
+ createRelayLoggingContext: createRelayLoggingContext,
382
385
  getOperationVariables: RelayConcreteVariables.getOperationVariables,
383
386
  getLocalVariables: RelayConcreteVariables.getLocalVariables,
384
387
  fetchQuery: fetchQueryInternal.fetchQuery,
@@ -3,8 +3,10 @@
3
3
  var resolverDataInjector = require('./store/live-resolvers/resolverDataInjector');
4
4
  var _require = require('./store/observeFragmentExperimental'),
5
5
  observeFragment = _require.observeFragment;
6
- var _require2 = require('./store/waitForFragmentExperimental'),
7
- waitForFragmentData = _require2.waitForFragmentData;
6
+ var _require2 = require('./store/observeQueryExperimental'),
7
+ observeQuery = _require2.observeQuery;
8
+ var _require3 = require('./store/waitForFragmentExperimental'),
9
+ waitForFragmentData = _require3.waitForFragmentData;
8
10
  function isValueResult(input) {
9
11
  return input.ok === true;
10
12
  }
@@ -15,6 +17,7 @@ module.exports = {
15
17
  resolverDataInjector: resolverDataInjector,
16
18
  isValueResult: isValueResult,
17
19
  isErrorResult: isErrorResult,
20
+ observeQuery: observeQuery,
18
21
  observeFragment: observeFragment,
19
22
  waitForFragmentData: waitForFragmentData
20
23
  };
package/lib/index.js CHANGED
@@ -25,6 +25,7 @@ var _require2 = require('./store/ClientID'),
25
25
  isClientID = _require2.isClientID;
26
26
  var createFragmentSpecResolver = require('./store/createFragmentSpecResolver');
27
27
  var createRelayContext = require('./store/createRelayContext');
28
+ var createRelayLoggingContext = require('./store/createRelayLoggingContext');
28
29
  var isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
29
30
  var _require3 = require('./store/live-resolvers/LiveResolverSuspenseSentinel'),
30
31
  isSuspenseSentinel = _require3.isSuspenseSentinel,
@@ -123,6 +124,7 @@ module.exports = {
123
124
  suspenseSentinel: suspenseSentinel,
124
125
  isRequest: GraphQLTag.isRequest,
125
126
  readInlineData: readInlineData,
127
+ readFragment: ResolverFragments.readFragment,
126
128
  MutationTypes: RelayDeclarativeMutationConfig.MutationTypes,
127
129
  RangeOperations: RelayDeclarativeMutationConfig.RangeOperations,
128
130
  DefaultHandlerProvider: RelayDefaultHandlerProvider,
@@ -173,6 +175,7 @@ module.exports = {
173
175
  ResolverFragments: ResolverFragments,
174
176
  OperationTracker: RelayOperationTracker,
175
177
  createRelayContext: createRelayContext,
178
+ createRelayLoggingContext: createRelayLoggingContext,
176
179
  getOperationVariables: RelayConcreteVariables.getOperationVariables,
177
180
  getLocalVariables: RelayConcreteVariables.getLocalVariables,
178
181
  fetchQuery: fetchQueryInternal.fetchQuery,
@@ -16,7 +16,7 @@ var ActorSpecificEnvironment = /*#__PURE__*/function () {
16
16
  this._operationTracker = new RelayOperationTracker();
17
17
  this._store = config.store;
18
18
  this._network = wrapNetworkWithLogObserver(this, config.network);
19
- this._publishQueue = new RelayPublishQueue(config.store, config.handlerProvider, defaultGetDataID, config.missingFieldHandlers);
19
+ this._publishQueue = new RelayPublishQueue(config.store, config.handlerProvider, defaultGetDataID, config.missingFieldHandlers, this.__log);
20
20
  this._defaultRenderPolicy = config.defaultRenderPolicy;
21
21
  this.options = {
22
22
  actorID: this.actorIdentifier
@@ -14,7 +14,7 @@ var _require4 = require('./readUpdatableQuery'),
14
14
  var RelayRecordProxy = require('./RelayRecordProxy');
15
15
  var invariant = require('invariant');
16
16
  var RelayRecordSourceProxy = /*#__PURE__*/function () {
17
- function RelayRecordSourceProxy(mutator, getDataID, handlerProvider, missingFieldHandlers) {
17
+ function RelayRecordSourceProxy(mutator, getDataID, handlerProvider, missingFieldHandlers, log) {
18
18
  this.__mutator = mutator;
19
19
  this._handlerProvider = handlerProvider || null;
20
20
  this._proxies = {};
@@ -22,6 +22,7 @@ var RelayRecordSourceProxy = /*#__PURE__*/function () {
22
22
  this._invalidatedStore = false;
23
23
  this._idsMarkedForInvalidation = new Set();
24
24
  this._missingFieldHandlers = missingFieldHandlers;
25
+ this._log = log !== null && log !== void 0 ? log : function (LogEvent) {};
25
26
  }
26
27
  var _proto = RelayRecordSourceProxy.prototype;
27
28
  _proto.publishSource = function publishSource(source, fieldPayloads) {
@@ -71,11 +71,11 @@ function updateProxyFromSelections(mutableUpdatableProxy, updatableProxyRootReco
71
71
  case 'ClientEdgeToServerObject':
72
72
  case 'Defer':
73
73
  case 'ModuleImport':
74
- case 'RelayLiveResolver':
75
74
  case 'RequiredField':
76
75
  case 'CatchField':
77
76
  case 'Stream':
78
77
  case 'RelayResolver':
78
+ case 'RelayLiveResolver':
79
79
  throw new Error('Encountered an unexpected ReaderSelection variant in RelayRecordSourceProxy. This indicates a bug in Relay.');
80
80
  default:
81
81
  selection.kind;
@@ -72,13 +72,13 @@ if (process.env.NODE_ENV !== "production") {
72
72
  return validateModuleImport(context);
73
73
  case 'TypeDiscriminator':
74
74
  return validateAbstractKey(context, selection.abstractKey);
75
- case 'RelayResolver':
76
- case 'RelayLiveResolver':
77
75
  case 'ClientEdgeToClientObject':
78
76
  case 'LinkedHandle':
79
77
  case 'ScalarHandle':
80
78
  case 'Defer':
81
79
  case 'Stream':
80
+ case 'RelayResolver':
81
+ case 'RelayLiveResolver':
82
82
  {
83
83
  return;
84
84
  }
@@ -364,9 +364,7 @@ function _subscribe(source, observer) {
364
364
  function swallowError(_error, _isUncaughtThrownError) {}
365
365
  if (process.env.NODE_ENV !== "production") {
366
366
  RelayObservable.onUnhandledError(function (error, isUncaughtThrownError) {
367
- if (typeof fail === 'function') {
368
- fail(String(error));
369
- } else if (isUncaughtThrownError) {
367
+ if (isUncaughtThrownError) {
370
368
  setTimeout(function () {
371
369
  throw error;
372
370
  });
@@ -3,7 +3,7 @@
3
3
  var generateID = require('../util/generateID');
4
4
  function wrapNetworkWithLogObserver(env, network) {
5
5
  return {
6
- execute: function execute(params, variables, cacheConfig, uploadables) {
6
+ execute: function execute(params, variables, cacheConfig, uploadables, _, encryptedVariables, preprocessResponse, checkOperation) {
7
7
  var networkRequestId = generateID();
8
8
  var logObserver = {
9
9
  start: function start(subscription) {
@@ -49,7 +49,7 @@ function wrapNetworkWithLogObserver(env, network) {
49
49
  info: info
50
50
  });
51
51
  };
52
- return network.execute(params, variables, cacheConfig, uploadables, logRequestInfo)["do"](logObserver);
52
+ return network.execute(params, variables, cacheConfig, uploadables, logRequestInfo, encryptedVariables, preprocessResponse, checkOperation)["do"](logObserver);
53
53
  }
54
54
  };
55
55
  }
@@ -21,7 +21,7 @@ function fetchQuery(environment, query, variables, options) {
21
21
  var operation = createOperationDescriptor(queryNode, variables, networkCacheConfig);
22
22
  var fetchPolicy = (_options$fetchPolicy = options === null || options === void 0 ? void 0 : options.fetchPolicy) !== null && _options$fetchPolicy !== void 0 ? _options$fetchPolicy : 'network-only';
23
23
  function readData(snapshot) {
24
- handlePotentialSnapshotErrors(environment, snapshot.errorResponseFields);
24
+ handlePotentialSnapshotErrors(environment, snapshot.fieldErrors);
25
25
  return snapshot.data;
26
26
  }
27
27
  switch (fetchPolicy) {
@@ -23,7 +23,7 @@ var invariant = require('invariant');
23
23
  var getModuleOperationKey = RelayStoreUtils.getModuleOperationKey,
24
24
  getStorageKey = RelayStoreUtils.getStorageKey,
25
25
  getArgumentValues = RelayStoreUtils.getArgumentValues;
26
- function check(getSourceForActor, getTargetForActor, defaultActorIdentifier, selector, handlers, operationLoader, getDataID, shouldProcessClientComponents, log) {
26
+ function check(getSourceForActor, getTargetForActor, defaultActorIdentifier, selector, handlers, operationLoader, getDataID, shouldProcessClientComponents, log, useExecTimeResolvers) {
27
27
  if (log != null) {
28
28
  log({
29
29
  name: 'store.datachecker.start',
@@ -33,7 +33,7 @@ function check(getSourceForActor, getTargetForActor, defaultActorIdentifier, sel
33
33
  var dataID = selector.dataID,
34
34
  node = selector.node,
35
35
  variables = selector.variables;
36
- var checker = new DataChecker(getSourceForActor, getTargetForActor, defaultActorIdentifier, variables, handlers, operationLoader, getDataID, shouldProcessClientComponents);
36
+ var checker = new DataChecker(getSourceForActor, getTargetForActor, defaultActorIdentifier, variables, handlers, operationLoader, getDataID, shouldProcessClientComponents, log, useExecTimeResolvers);
37
37
  var result = checker.check(node, dataID);
38
38
  if (log != null) {
39
39
  log({
@@ -44,7 +44,7 @@ function check(getSourceForActor, getTargetForActor, defaultActorIdentifier, sel
44
44
  return result;
45
45
  }
46
46
  var DataChecker = /*#__PURE__*/function () {
47
- function DataChecker(getSourceForActor, getTargetForActor, defaultActorIdentifier, variables, handlers, operationLoader, getDataID, shouldProcessClientComponents) {
47
+ function DataChecker(getSourceForActor, getTargetForActor, defaultActorIdentifier, variables, handlers, operationLoader, getDataID, shouldProcessClientComponents, log, useExecTimeResolvers) {
48
48
  this._getSourceForActor = getSourceForActor;
49
49
  this._getTargetForActor = getTargetForActor;
50
50
  this._getDataID = getDataID;
@@ -53,6 +53,7 @@ var DataChecker = /*#__PURE__*/function () {
53
53
  var _this$_getMutatorAndR = this._getMutatorAndRecordProxyForActor(defaultActorIdentifier),
54
54
  mutator = _this$_getMutatorAndR[0],
55
55
  recordSourceProxy = _this$_getMutatorAndR[1];
56
+ this._useExecTimeResolvers = useExecTimeResolvers !== null && useExecTimeResolvers !== void 0 ? useExecTimeResolvers : false;
56
57
  this._mostRecentlyInvalidatedAt = null;
57
58
  this._handlers = handlers;
58
59
  this._mutator = mutator;
@@ -61,6 +62,7 @@ var DataChecker = /*#__PURE__*/function () {
61
62
  this._recordWasMissing = false;
62
63
  this._variables = variables;
63
64
  this._shouldProcessClientComponents = shouldProcessClientComponents;
65
+ this._log = log;
64
66
  }
65
67
  var _proto = DataChecker.prototype;
66
68
  _proto._getMutatorAndRecordProxyForActor = function _getMutatorAndRecordProxyForActor(actorIdentifier) {
@@ -68,7 +70,7 @@ var DataChecker = /*#__PURE__*/function () {
68
70
  if (tuple == null) {
69
71
  var target = this._getTargetForActor(actorIdentifier);
70
72
  var mutator = new RelayRecordSourceMutator(this._getSourceForActor(actorIdentifier), target);
71
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, undefined, this._handlers);
73
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, undefined, this._handlers, this._log);
72
74
  tuple = [mutator, recordSourceProxy];
73
75
  this._mutatorRecordSourceProxyCache.set(actorIdentifier, tuple);
74
76
  }
@@ -275,13 +277,15 @@ var DataChecker = /*#__PURE__*/function () {
275
277
  _this2._traverseSelections(selection.fragment.selections, dataID);
276
278
  break;
277
279
  case 'RelayResolver':
278
- _this2._checkResolver(selection, dataID);
279
- break;
280
280
  case 'RelayLiveResolver':
281
- _this2._checkResolver(selection, dataID);
281
+ if (!_this2._useExecTimeResolvers) {
282
+ _this2._checkResolver(selection, dataID);
283
+ }
282
284
  break;
283
285
  case 'ClientEdgeToClientObject':
284
- _this2._checkResolver(selection.backingField, dataID);
286
+ if (!_this2._useExecTimeResolvers) {
287
+ _this2._checkResolver(selection.backingField, dataID);
288
+ }
285
289
  break;
286
290
  default:
287
291
  selection;
@@ -31,26 +31,27 @@ function execute(config) {
31
31
  return new Executor(config);
32
32
  }
33
33
  var Executor = /*#__PURE__*/function () {
34
- function Executor(_ref2) {
34
+ function Executor(_ref3) {
35
35
  var _this = this;
36
- var actorIdentifier = _ref2.actorIdentifier,
37
- getDataID = _ref2.getDataID,
38
- getPublishQueue = _ref2.getPublishQueue,
39
- getStore = _ref2.getStore,
40
- isClientPayload = _ref2.isClientPayload,
41
- operation = _ref2.operation,
42
- operationExecutions = _ref2.operationExecutions,
43
- operationLoader = _ref2.operationLoader,
44
- operationTracker = _ref2.operationTracker,
45
- optimisticConfig = _ref2.optimisticConfig,
46
- scheduler = _ref2.scheduler,
47
- shouldProcessClientComponents = _ref2.shouldProcessClientComponents,
48
- sink = _ref2.sink,
49
- source = _ref2.source,
50
- treatMissingFieldsAsNull = _ref2.treatMissingFieldsAsNull,
51
- updater = _ref2.updater,
52
- log = _ref2.log,
53
- normalizeResponse = _ref2.normalizeResponse;
36
+ var _ref, _this$_operation$requ, _this$_operation$requ2;
37
+ var actorIdentifier = _ref3.actorIdentifier,
38
+ getDataID = _ref3.getDataID,
39
+ getPublishQueue = _ref3.getPublishQueue,
40
+ getStore = _ref3.getStore,
41
+ isClientPayload = _ref3.isClientPayload,
42
+ operation = _ref3.operation,
43
+ operationExecutions = _ref3.operationExecutions,
44
+ operationLoader = _ref3.operationLoader,
45
+ operationTracker = _ref3.operationTracker,
46
+ optimisticConfig = _ref3.optimisticConfig,
47
+ scheduler = _ref3.scheduler,
48
+ shouldProcessClientComponents = _ref3.shouldProcessClientComponents,
49
+ sink = _ref3.sink,
50
+ source = _ref3.source,
51
+ treatMissingFieldsAsNull = _ref3.treatMissingFieldsAsNull,
52
+ updater = _ref3.updater,
53
+ log = _ref3.log,
54
+ normalizeResponse = _ref3.normalizeResponse;
54
55
  this._actorIdentifier = actorIdentifier;
55
56
  this._getDataID = getDataID;
56
57
  this._treatMissingFieldsAsNull = treatMissingFieldsAsNull;
@@ -65,6 +66,8 @@ var Executor = /*#__PURE__*/function () {
65
66
  this._operationTracker = operationTracker;
66
67
  this._operationUpdateEpochs = new Map();
67
68
  this._optimisticUpdates = null;
69
+ this._useExecTimeResolvers = (_ref = (_this$_operation$requ = this._operation.request.node.operation.use_exec_time_resolvers) !== null && _this$_operation$requ !== void 0 ? _this$_operation$requ : ((_this$_operation$requ2 = this._operation.request.node.operation.exec_time_resolvers_enabled_provider) === null || _this$_operation$requ2 === void 0 ? void 0 : _this$_operation$requ2.get()) === true) !== null && _ref !== void 0 ? _ref : false;
70
+ this._execTimeResolverResponseComplete = false;
68
71
  this._pendingModulePayloadsCount = 0;
69
72
  this._getPublishQueue = getPublishQueue;
70
73
  this._scheduler = scheduler;
@@ -102,14 +105,20 @@ var Executor = /*#__PURE__*/function () {
102
105
  }
103
106
  },
104
107
  start: function start(subscription) {
105
- var _this$_operation$requ;
108
+ var _this$_operation$requ3;
106
109
  _this._start(id, subscription);
107
110
  _this._log({
108
111
  name: 'execute.start',
109
112
  executeId: _this._executeId,
110
113
  params: _this._operation.request.node.params,
111
114
  variables: _this._operation.request.variables,
112
- cacheConfig: (_this$_operation$requ = _this._operation.request.cacheConfig) !== null && _this$_operation$requ !== void 0 ? _this$_operation$requ : {}
115
+ cacheConfig: (_this$_operation$requ3 = _this._operation.request.cacheConfig) !== null && _this$_operation$requ3 !== void 0 ? _this$_operation$requ3 : {}
116
+ });
117
+ },
118
+ unsubscribe: function unsubscribe() {
119
+ _this._log({
120
+ name: 'execute.unsubscribe',
121
+ executeId: _this._executeId
113
122
  });
114
123
  }
115
124
  });
@@ -170,7 +179,7 @@ var Executor = /*#__PURE__*/function () {
170
179
  }
171
180
  case 'loading_final':
172
181
  {
173
- activeState = this._pendingModulePayloadsCount > 0 ? 'active' : 'inactive';
182
+ activeState = this._pendingModulePayloadsCount > 0 || this._useExecTimeResolvers && !this._execTimeResolverResponseComplete ? 'active' : 'inactive';
174
183
  break;
175
184
  }
176
185
  default:
@@ -263,8 +272,8 @@ var Executor = /*#__PURE__*/function () {
263
272
  return;
264
273
  } else if (response.data == null) {
265
274
  var errors = response.hasOwnProperty('errors') && response.errors != null ? response.errors : null;
266
- var messages = errors ? errors.map(function (_ref3) {
267
- var message = _ref3.message;
275
+ var messages = errors ? errors.map(function (_ref4) {
276
+ var message = _ref4.message;
268
277
  return message;
269
278
  }).join('\n') : '(No errors)';
270
279
  var error = RelayError.create('RelayNetwork', 'No data returned for operation `' + _this5._operation.request.node.params.name + '`, got error(s):\n' + messages + '\n\nSee the error `source` property for more information.');
@@ -331,8 +340,10 @@ var Executor = /*#__PURE__*/function () {
331
340
  }
332
341
  var _partitionGraphQLResp = partitionGraphQLResponses(responsesWithData),
333
342
  nonIncrementalResponses = _partitionGraphQLResp[0],
334
- incrementalResponses = _partitionGraphQLResp[1];
343
+ incrementalResponses = _partitionGraphQLResp[1],
344
+ normalizedResponses = _partitionGraphQLResp[2];
335
345
  var hasNonIncrementalResponses = nonIncrementalResponses.length > 0;
346
+ var hasNormalizedResponses = normalizedResponses.length > 0;
336
347
  if (hasNonIncrementalResponses) {
337
348
  if (this._isSubscriptionOperation) {
338
349
  var nextID = generateUniqueClientID();
@@ -345,9 +356,32 @@ var Executor = /*#__PURE__*/function () {
345
356
  var payloadFollowups = this._processResponses(nonIncrementalResponses);
346
357
  this._processPayloadFollowups(payloadFollowups);
347
358
  }
359
+ if (hasNormalizedResponses) {
360
+ var _payloadFollowups = [];
361
+ for (var i = 0; i < normalizedResponses.length; i++) {
362
+ var _response$extensions2;
363
+ var _response = normalizedResponses[i];
364
+ var source = new RelayRecordSource(_response.data);
365
+ var isFinal = ((_response$extensions2 = _response.extensions) === null || _response$extensions2 === void 0 ? void 0 : _response$extensions2.is_final) === true;
366
+ var payload = {
367
+ errors: [],
368
+ fieldPayloads: [],
369
+ followupPayloads: [],
370
+ incrementalPlaceholders: [],
371
+ isFinal: isFinal,
372
+ source: source
373
+ };
374
+ this._getPublishQueueAndSaveActor().commitPayload(this._operation, payload, this._updater);
375
+ _payloadFollowups.push(payload);
376
+ this._execTimeResolverResponseComplete = isFinal;
377
+ if (isFinal) {
378
+ this._updateActiveState();
379
+ }
380
+ }
381
+ }
348
382
  if (incrementalResponses.length > 0) {
349
- var _payloadFollowups = this._processIncrementalResponses(incrementalResponses);
350
- this._processPayloadFollowups(_payloadFollowups);
383
+ var _payloadFollowups2 = this._processIncrementalResponses(incrementalResponses);
384
+ this._processPayloadFollowups(_payloadFollowups2);
351
385
  }
352
386
  if (this._isSubscriptionOperation) {
353
387
  if (responsesWithData[0].extensions == null) {
@@ -358,7 +392,7 @@ var Executor = /*#__PURE__*/function () {
358
392
  responsesWithData[0].extensions.__relay_subscription_root_id = this._operation.fragment.dataID;
359
393
  }
360
394
  }
361
- var updatedOwners = this._runPublishQueue(hasNonIncrementalResponses ? this._operation : undefined);
395
+ var updatedOwners = this._runPublishQueue(hasNonIncrementalResponses || hasNormalizedResponses ? this._operation : undefined);
362
396
  if (hasNonIncrementalResponses) {
363
397
  if (this._incrementalPayloadsPending) {
364
398
  this._retainData();
@@ -378,10 +412,11 @@ var Executor = /*#__PURE__*/function () {
378
412
  var payload = this._normalizeResponse(response, this._operation.root, ROOT_TYPE, {
379
413
  actorIdentifier: this._actorIdentifier,
380
414
  getDataID: this._getDataID,
415
+ log: this._log,
381
416
  path: [],
382
417
  shouldProcessClientComponents: this._shouldProcessClientComponents,
383
418
  treatMissingFieldsAsNull: treatMissingFieldsAsNull
384
- });
419
+ }, this._useExecTimeResolvers);
385
420
  validateOptimisticResponsePayload(payload);
386
421
  optimisticUpdates.push({
387
422
  operation: this._operation,
@@ -454,15 +489,20 @@ var Executor = /*#__PURE__*/function () {
454
489
  variables = followupPayload.variables;
455
490
  }
456
491
  var selector = createNormalizationSelector(normalizationNode, followupPayload.dataID, variables);
457
- return this._normalizeResponse({
458
- data: followupPayload.data
459
- }, selector, followupPayload.typeName, {
492
+ var nextResponse = {
493
+ data: followupPayload.data,
494
+ extensions: this._state === 'loading_final' ? {
495
+ is_final: true
496
+ } : undefined
497
+ };
498
+ return this._normalizeResponse(nextResponse, selector, followupPayload.typeName, {
460
499
  actorIdentifier: this._actorIdentifier,
461
500
  getDataID: this._getDataID,
501
+ log: this._log,
462
502
  path: followupPayload.path,
463
503
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
464
504
  shouldProcessClientComponents: this._shouldProcessClientComponents
465
- });
505
+ }, this._useExecTimeResolvers);
466
506
  };
467
507
  _proto._processOptimisticModuleImport = function _processOptimisticModuleImport(normalizationRootNode, moduleImportPayload) {
468
508
  var operation = getOperation(normalizationRootNode);
@@ -515,10 +555,11 @@ var Executor = /*#__PURE__*/function () {
515
555
  var relayPayload = _this8._normalizeResponse(payloadPart, _this8._operation.root, ROOT_TYPE, {
516
556
  actorIdentifier: _this8._actorIdentifier,
517
557
  getDataID: _this8._getDataID,
558
+ log: _this8._log,
518
559
  path: [],
519
560
  treatMissingFieldsAsNull: _this8._treatMissingFieldsAsNull,
520
561
  shouldProcessClientComponents: _this8._shouldProcessClientComponents
521
- });
562
+ }, _this8._useExecTimeResolvers);
522
563
  _this8._getPublishQueueAndSaveActor().commitPayload(_this8._operation, relayPayload, _this8._updater);
523
564
  _this8._log({
524
565
  name: 'execute.normalize.end',
@@ -565,7 +606,10 @@ var Executor = /*#__PURE__*/function () {
565
606
  incrementalPlaceholders.forEach(function (placeholder) {
566
607
  if (placeholder.kind === 'defer') {
567
608
  relayPayloads.push(_this9._processDeferResponse(placeholder.label, placeholder.path, placeholder, {
568
- data: placeholder.data
609
+ data: placeholder.data,
610
+ extensions: {
611
+ is_final: true
612
+ }
569
613
  }));
570
614
  }
571
615
  });
@@ -577,7 +621,7 @@ var Executor = /*#__PURE__*/function () {
577
621
  });
578
622
  };
579
623
  _proto._maybeCompleteSubscriptionOperationTracking = function _maybeCompleteSubscriptionOperationTracking() {
580
- if (!this._isSubscriptionOperation) {
624
+ if (!this._isSubscriptionOperation && !(this._useExecTimeResolvers && this._execTimeResolverResponseComplete && this._state === 'loading_final')) {
581
625
  return;
582
626
  }
583
627
  if (this._pendingModulePayloadsCount === 0 && this._incrementalPayloadsPending === false) {
@@ -801,23 +845,24 @@ var Executor = /*#__PURE__*/function () {
801
845
  var relayPayload = this._normalizeResponse(response, placeholder.selector, placeholder.typeName, {
802
846
  actorIdentifier: this._actorIdentifier,
803
847
  getDataID: this._getDataID,
848
+ log: this._log,
804
849
  path: placeholder.path,
805
850
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
806
851
  shouldProcessClientComponents: this._shouldProcessClientComponents
807
- });
852
+ }, this._useExecTimeResolvers);
808
853
  this._getPublishQueueAndSaveActor().commitPayload(this._operation, relayPayload);
809
854
  var parentEntry = this._source.get(parentID);
810
855
  !(parentEntry != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'OperationExecutor: Expected the parent record `%s` for @defer ' + 'data to exist.', parentID) : invariant(false) : void 0;
811
856
  var fieldPayloads = parentEntry.fieldPayloads;
812
857
  if (fieldPayloads.length !== 0) {
813
- var _response$extensions2;
858
+ var _response$extensions3;
814
859
  var handleFieldsRelayPayload = {
815
860
  errors: null,
816
861
  fieldPayloads: fieldPayloads,
817
862
  incrementalPlaceholders: null,
818
863
  followupPayloads: null,
819
864
  source: RelayRecordSource.create(),
820
- isFinal: ((_response$extensions2 = response.extensions) === null || _response$extensions2 === void 0 ? void 0 : _response$extensions2.is_final) === true
865
+ isFinal: ((_response$extensions3 = response.extensions) === null || _response$extensions3 === void 0 ? void 0 : _response$extensions3.is_final) === true
821
866
  };
822
867
  this._getPublishQueueAndSaveActor().commitPayload(this._operation, handleFieldsRelayPayload);
823
868
  }
@@ -873,7 +918,7 @@ var Executor = /*#__PURE__*/function () {
873
918
  return relayPayload;
874
919
  };
875
920
  _proto._normalizeStreamItem = function _normalizeStreamItem(response, parentID, field, variables, path, normalizationPath) {
876
- var _field$alias, _field$concreteType, _ref, _this$_getDataID;
921
+ var _field$alias, _field$concreteType, _ref2, _this$_getDataID;
877
922
  var data = response.data;
878
923
  !(typeof data === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'OperationExecutor: Expected the GraphQL @stream payload `data` ' + 'value to be an object.') : invariant(false) : void 0;
879
924
  var responseKey = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
@@ -889,7 +934,7 @@ var Executor = /*#__PURE__*/function () {
889
934
  !(itemIndex === finalPathEntry && itemIndex >= 0) ? process.env.NODE_ENV !== "production" ? invariant(false, 'OperationExecutor: Expected path for @stream to end in a ' + 'positive integer index, got `%s`', finalPathEntry) : invariant(false) : void 0;
890
935
  var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : data[TYPENAME_KEY];
891
936
  !(typeof typeName === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'OperationExecutor: Expected @stream field `%s` to have a ' + '__typename.', field.name) : invariant(false) : void 0;
892
- var itemID = (_ref = (_this$_getDataID = this._getDataID(data, typeName)) !== null && _this$_getDataID !== void 0 ? _this$_getDataID : prevIDs === null || prevIDs === void 0 ? void 0 : prevIDs[itemIndex]) !== null && _ref !== void 0 ? _ref : generateClientID(parentID, storageKey, itemIndex);
937
+ var itemID = (_ref2 = (_this$_getDataID = this._getDataID(data, typeName)) !== null && _this$_getDataID !== void 0 ? _this$_getDataID : prevIDs === null || prevIDs === void 0 ? void 0 : prevIDs[itemIndex]) !== null && _ref2 !== void 0 ? _ref2 : generateClientID(parentID, storageKey, itemIndex);
893
938
  !(typeof itemID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'OperationExecutor: Expected id of elements of field `%s` to ' + 'be strings.', storageKey) : invariant(false) : void 0;
894
939
  var selector = createNormalizationSelector(field, itemID, variables);
895
940
  var nextParentRecord = RelayModernRecord.clone(parentRecord);
@@ -903,10 +948,11 @@ var Executor = /*#__PURE__*/function () {
903
948
  var relayPayload = this._normalizeResponse(response, selector, typeName, {
904
949
  actorIdentifier: this._actorIdentifier,
905
950
  getDataID: this._getDataID,
951
+ log: this._log,
906
952
  path: [].concat((0, _toConsumableArray2["default"])(normalizationPath), [responseKey, String(itemIndex)]),
907
953
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
908
954
  shouldProcessClientComponents: this._shouldProcessClientComponents
909
- });
955
+ }, this._useExecTimeResolvers);
910
956
  return {
911
957
  fieldPayloads: fieldPayloads,
912
958
  itemID: itemID,
@@ -1020,7 +1066,9 @@ var Executor = /*#__PURE__*/function () {
1020
1066
  function partitionGraphQLResponses(responses) {
1021
1067
  var nonIncrementalResponses = [];
1022
1068
  var incrementalResponses = [];
1069
+ var normalizedResponses = [];
1023
1070
  responses.forEach(function (response) {
1071
+ var _response$extensions4;
1024
1072
  if (response.path != null || response.label != null) {
1025
1073
  var label = response.label,
1026
1074
  path = response.path;
@@ -1032,11 +1080,13 @@ function partitionGraphQLResponses(responses) {
1032
1080
  path: path,
1033
1081
  response: response
1034
1082
  });
1083
+ } else if (((_response$extensions4 = response.extensions) === null || _response$extensions4 === void 0 ? void 0 : _response$extensions4.is_normalized) === true) {
1084
+ normalizedResponses.push(response);
1035
1085
  } else {
1036
1086
  nonIncrementalResponses.push(response);
1037
1087
  }
1038
1088
  });
1039
- return [nonIncrementalResponses, incrementalResponses];
1089
+ return [nonIncrementalResponses, incrementalResponses, normalizedResponses];
1040
1090
  }
1041
1091
  function stableStringify(value) {
1042
1092
  var _JSON$stringify;