relay-runtime 18.1.0 → 19.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 (92) hide show
  1. package/experimental.js +1 -1
  2. package/experimental.js.flow +22 -9
  3. package/handlers/connection/ConnectionHandler.js.flow +6 -1
  4. package/index.js +1 -1
  5. package/index.js.flow +4 -0
  6. package/lib/experimental.js +5 -2
  7. package/lib/handlers/connection/ConnectionHandler.js +1 -1
  8. package/lib/index.js +3 -0
  9. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +1 -1
  10. package/lib/mutations/RelayRecordProxy.js +14 -3
  11. package/lib/mutations/RelayRecordSourceMutator.js +17 -0
  12. package/lib/mutations/RelayRecordSourceProxy.js +2 -1
  13. package/lib/mutations/createUpdatableProxy.js +1 -1
  14. package/lib/mutations/validateMutation.js +2 -2
  15. package/lib/network/RelayObservable.js +1 -3
  16. package/lib/network/wrapNetworkWithLogObserver.js +2 -2
  17. package/lib/query/fetchQuery.js +1 -1
  18. package/lib/store/DataChecker.js +4 -5
  19. package/lib/store/OperationExecutor.js +11 -0
  20. package/lib/store/RelayModernEnvironment.js +13 -4
  21. package/lib/store/RelayModernFragmentSpecResolver.js +4 -4
  22. package/lib/store/RelayModernStore.js +43 -21
  23. package/lib/store/RelayPublishQueue.js +11 -15
  24. package/lib/store/RelayReader.js +244 -183
  25. package/lib/store/RelayReferenceMarker.js +3 -4
  26. package/lib/store/RelayResponseNormalizer.js +48 -26
  27. package/lib/store/RelayStoreSubscriptions.js +2 -2
  28. package/lib/store/RelayStoreUtils.js +8 -0
  29. package/lib/store/ResolverCache.js +1 -165
  30. package/lib/store/ResolverFragments.js +2 -2
  31. package/lib/store/createRelayLoggingContext.js +17 -0
  32. package/lib/store/generateTypenamePrefixedDataID.js +9 -0
  33. package/lib/store/live-resolvers/LiveResolverCache.js +5 -10
  34. package/lib/store/live-resolvers/resolverDataInjector.js +4 -4
  35. package/lib/store/observeFragmentExperimental.js +60 -13
  36. package/lib/store/observeQueryExperimental.js +21 -0
  37. package/lib/util/RelayFeatureFlags.js +7 -2
  38. package/lib/util/handlePotentialSnapshotErrors.js +12 -9
  39. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +1 -0
  40. package/mutations/RelayRecordProxy.js.flow +30 -3
  41. package/mutations/RelayRecordSourceMutator.js.flow +27 -0
  42. package/mutations/RelayRecordSourceProxy.js.flow +4 -0
  43. package/mutations/createUpdatableProxy.js.flow +1 -1
  44. package/mutations/validateMutation.js.flow +3 -3
  45. package/network/RelayNetworkTypes.js.flow +3 -0
  46. package/network/RelayObservable.js.flow +1 -5
  47. package/network/wrapNetworkWithLogObserver.js.flow +19 -1
  48. package/package.json +1 -1
  49. package/query/fetchQuery.js.flow +1 -1
  50. package/store/DataChecker.js.flow +5 -2
  51. package/store/OperationExecutor.js.flow +12 -1
  52. package/store/RelayExperimentalGraphResponseTransform.js.flow +4 -4
  53. package/store/RelayModernEnvironment.js.flow +22 -6
  54. package/store/RelayModernFragmentSpecResolver.js.flow +6 -6
  55. package/store/RelayModernRecord.js.flow +1 -1
  56. package/store/RelayModernSelector.js.flow +2 -0
  57. package/store/RelayModernStore.js.flow +74 -27
  58. package/store/RelayOptimisticRecordSource.js.flow +2 -0
  59. package/store/RelayPublishQueue.js.flow +32 -21
  60. package/store/RelayReader.js.flow +400 -145
  61. package/store/RelayRecordState.js.flow +1 -1
  62. package/store/RelayReferenceMarker.js.flow +3 -4
  63. package/store/RelayResponseNormalizer.js.flow +94 -62
  64. package/store/RelayStoreSubscriptions.js.flow +2 -2
  65. package/store/RelayStoreTypes.js.flow +45 -15
  66. package/store/RelayStoreUtils.js.flow +30 -1
  67. package/store/ResolverCache.js.flow +2 -271
  68. package/store/ResolverFragments.js.flow +5 -3
  69. package/store/StoreInspector.js.flow +5 -0
  70. package/store/createRelayContext.js.flow +3 -2
  71. package/store/createRelayLoggingContext.js.flow +46 -0
  72. package/store/generateTypenamePrefixedDataID.js.flow +25 -0
  73. package/store/live-resolvers/LiveResolverCache.js.flow +5 -10
  74. package/store/live-resolvers/resolverDataInjector.js.flow +10 -6
  75. package/store/observeFragmentExperimental.js.flow +82 -28
  76. package/store/observeQueryExperimental.js.flow +61 -0
  77. package/store/waitForFragmentExperimental.js.flow +4 -3
  78. package/util/NormalizationNode.js.flow +10 -1
  79. package/util/ReaderNode.js.flow +9 -3
  80. package/util/RelayConcreteNode.js.flow +3 -1
  81. package/util/RelayError.js.flow +1 -0
  82. package/util/RelayFeatureFlags.js.flow +31 -7
  83. package/util/RelayRuntimeTypes.js.flow +17 -3
  84. package/util/getPaginationVariables.js.flow +2 -0
  85. package/util/handlePotentialSnapshotErrors.js.flow +24 -12
  86. package/util/registerEnvironmentWithDevTools.js.flow +4 -2
  87. package/util/withProvidedVariables.js.flow +1 -0
  88. package/util/withStartAndDuration.js.flow +3 -0
  89. package/relay-runtime-experimental.js +0 -4
  90. package/relay-runtime-experimental.min.js +0 -9
  91. package/relay-runtime.js +0 -4
  92. package/relay-runtime.min.js +0 -9
package/experimental.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v18.1.0
2
+ * Relay v19.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
@@ -27,18 +28,29 @@ export type IdOf<A: string, Typename: void | string = void> = [
27
28
  ? {id: DataID}
28
29
  : {id: DataID, __typename: Typename};
29
30
 
30
- // Annotates a `RelayResolverValue` GraphQL return type
31
- // eslint-disable-next-line no-unused-vars
32
- export type RelayResolverValue<A> = A;
31
+ /**
32
+ * Annotates a `RelayResolverValue` GraphQL return type. Using this type in the
33
+ * return position of a Relay Resolver informs Relay that it should model this
34
+ * field as returning a `RelayResolverValue` type. See the docs for more
35
+ * information:
36
+ *
37
+ * https://relay.dev/docs/next/guides/relay-resolvers/return-types/#javascript-values
38
+ *
39
+ * Note: This type forces the value to be non-maybe. This is required in order
40
+ * to allow the Relay compiler to to "see", via static analysis, if the field
41
+ * can return null or not. If the field is nullable, you can type it as
42
+ * returning `?RelayResolverValue<T>`.
43
+ */
44
+ export type RelayResolverValue<A> = $NonMaybeType<A>;
33
45
 
34
46
  type ErrorResult<Error> = {
35
- ok: false,
36
- errors: $ReadOnlyArray<Error>,
47
+ +ok: false,
48
+ +errors: $ReadOnlyArray<Error>,
37
49
  };
38
50
 
39
51
  type OkayResult<T> = {
40
- ok: true,
41
- value: T,
52
+ +ok: true,
53
+ +value: T,
42
54
  };
43
55
 
44
56
  export type Result<T, Error> = OkayResult<T> | ErrorResult<Error>;
@@ -46,19 +58,20 @@ export type Result<T, Error> = OkayResult<T> | ErrorResult<Error>;
46
58
  function isValueResult<T = mixed>(
47
59
  input: Result<T, Error>,
48
60
  ): input is OkayResult<T> {
49
- return input.ok === true;
61
+ return input.ok === (true as const);
50
62
  }
51
63
 
52
64
  function isErrorResult<T = mixed>(
53
65
  input: Result<T, Error>,
54
66
  ): input is ErrorResult<Error> {
55
- return input.ok === false;
67
+ return input.ok === (false as const);
56
68
  }
57
69
 
58
70
  module.exports = {
59
71
  resolverDataInjector,
60
72
  isValueResult,
61
73
  isErrorResult,
74
+ observeQuery,
62
75
  observeFragment,
63
76
  waitForFragmentData,
64
77
  };
@@ -67,7 +67,12 @@ function update(store: RecordSourceProxy, payload: HandleFieldPayload): void {
67
67
  const serverPageInfo =
68
68
  serverConnection && serverConnection.getLinkedRecord(PAGE_INFO);
69
69
  if (!serverConnection) {
70
- record.setValue(null, payload.handleKey);
70
+ record.setValue(
71
+ null,
72
+ payload.handleKey,
73
+ undefined,
74
+ record.getErrors(payload.fieldKey),
75
+ );
71
76
  return;
72
77
  }
73
78
  // In rare cases the handleKey field may be unset even though the client
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v18.1.0
2
+ * Relay v19.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,
@@ -232,6 +233,7 @@ export type {
232
233
  ClientQuery,
233
234
  RefetchableFragment,
234
235
  RenderPolicy,
236
+ PrefetchableRefetchableFragment,
235
237
  UpdatableFragment,
236
238
  UpdatableQuery,
237
239
  Variables,
@@ -315,6 +317,7 @@ module.exports = {
315
317
  suspenseSentinel,
316
318
  isRequest: GraphQLTag.isRequest,
317
319
  readInlineData,
320
+ readFragment: ResolverFragments.readFragment,
318
321
 
319
322
  // Declarative mutation API
320
323
  MutationTypes: RelayDeclarativeMutationConfig.MutationTypes,
@@ -378,6 +381,7 @@ module.exports = {
378
381
  ResolverFragments,
379
382
  OperationTracker: RelayOperationTracker,
380
383
  createRelayContext: createRelayContext,
384
+ createRelayLoggingContext: createRelayLoggingContext,
381
385
  getOperationVariables: RelayConcreteVariables.getOperationVariables,
382
386
  getLocalVariables: RelayConcreteVariables.getLocalVariables,
383
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
  };
@@ -26,7 +26,7 @@ function update(store, payload) {
26
26
  var serverConnection = record.getLinkedRecord(payload.fieldKey);
27
27
  var serverPageInfo = serverConnection && serverConnection.getLinkedRecord(PAGE_INFO);
28
28
  if (!serverConnection) {
29
- record.setValue(null, payload.handleKey);
29
+ record.setValue(null, payload.handleKey, undefined, record.getErrors(payload.fieldKey));
30
30
  return;
31
31
  }
32
32
  var clientConnectionID = generateClientID(record.getDataID(), payload.handleKey);
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
@@ -27,13 +27,24 @@ var RelayRecordProxy = /*#__PURE__*/function () {
27
27
  var storageKey = getStableStorageKey(name, args);
28
28
  return this._mutator.getValue(this._dataID, storageKey);
29
29
  };
30
- _proto.setValue = function setValue(value, name, args) {
30
+ _proto.setValue = function setValue(value, name, args, errors) {
31
31
  !isValidLeafValue(value) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayRecordProxy#setValue(): Expected a scalar or array of scalars, ' + 'got `%s`.', JSON.stringify(value)) : invariant(false) : void 0;
32
- return this.setValue__UNSAFE(value, name, args);
32
+ return this.setValue__UNSAFE(value, name, args, errors);
33
33
  };
34
- _proto.setValue__UNSAFE = function setValue__UNSAFE(value, name, args) {
34
+ _proto.getErrors = function getErrors(name, args) {
35
+ var storageKey = getStableStorageKey(name, args);
36
+ return this._mutator.getErrors(this._dataID, storageKey);
37
+ };
38
+ _proto.setValue__UNSAFE = function setValue__UNSAFE(value, name, args, errors) {
35
39
  var storageKey = getStableStorageKey(name, args);
36
40
  this._mutator.setValue(this._dataID, storageKey, value);
41
+ if (errors != null) {
42
+ if (errors.length === 0) {
43
+ this._mutator.setErrors(this._dataID, storageKey);
44
+ } else {
45
+ this._mutator.setErrors(this._dataID, storageKey, errors);
46
+ }
47
+ }
37
48
  return this;
38
49
  };
39
50
  _proto.getLinkedRecord = function getLinkedRecord(name, args) {
@@ -105,6 +105,23 @@ var RelayRecordSourceMutator = /*#__PURE__*/function () {
105
105
  var sinkRecord = this._getSinkRecord(dataID);
106
106
  RelayModernRecord.setValue(sinkRecord, storageKey, value);
107
107
  };
108
+ _proto.getErrors = function getErrors(dataID, storageKey) {
109
+ for (var ii = 0; ii < this.__sources.length; ii++) {
110
+ var record = this.__sources[ii].get(dataID);
111
+ if (record) {
112
+ var value = RelayModernRecord.getErrors(record, storageKey);
113
+ if (value !== undefined) {
114
+ return value;
115
+ }
116
+ } else if (record === null) {
117
+ return null;
118
+ }
119
+ }
120
+ };
121
+ _proto.setErrors = function setErrors(dataID, storageKey, errors) {
122
+ var sinkRecord = this._getSinkRecord(dataID);
123
+ RelayModernRecord.setErrors(sinkRecord, storageKey, errors);
124
+ };
108
125
  _proto.getLinkedRecordID = function getLinkedRecordID(dataID, storageKey) {
109
126
  for (var ii = 0; ii < this.__sources.length; ii++) {
110
127
  var record = this.__sources[ii].get(dataID);
@@ -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) {
@@ -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);
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) {
48
48
  this._getSourceForActor = getSourceForActor;
49
49
  this._getTargetForActor = getTargetForActor;
50
50
  this._getDataID = getDataID;
@@ -61,6 +61,7 @@ var DataChecker = /*#__PURE__*/function () {
61
61
  this._recordWasMissing = false;
62
62
  this._variables = variables;
63
63
  this._shouldProcessClientComponents = shouldProcessClientComponents;
64
+ this._log = log;
64
65
  }
65
66
  var _proto = DataChecker.prototype;
66
67
  _proto._getMutatorAndRecordProxyForActor = function _getMutatorAndRecordProxyForActor(actorIdentifier) {
@@ -68,7 +69,7 @@ var DataChecker = /*#__PURE__*/function () {
68
69
  if (tuple == null) {
69
70
  var target = this._getTargetForActor(actorIdentifier);
70
71
  var mutator = new RelayRecordSourceMutator(this._getSourceForActor(actorIdentifier), target);
71
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, undefined, this._handlers);
72
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, undefined, this._handlers, this._log);
72
73
  tuple = [mutator, recordSourceProxy];
73
74
  this._mutatorRecordSourceProxyCache.set(actorIdentifier, tuple);
74
75
  }
@@ -275,8 +276,6 @@ var DataChecker = /*#__PURE__*/function () {
275
276
  _this2._traverseSelections(selection.fragment.selections, dataID);
276
277
  break;
277
278
  case 'RelayResolver':
278
- _this2._checkResolver(selection, dataID);
279
- break;
280
279
  case 'RelayLiveResolver':
281
280
  _this2._checkResolver(selection, dataID);
282
281
  break;
@@ -111,6 +111,12 @@ var Executor = /*#__PURE__*/function () {
111
111
  variables: _this._operation.request.variables,
112
112
  cacheConfig: (_this$_operation$requ = _this._operation.request.cacheConfig) !== null && _this$_operation$requ !== void 0 ? _this$_operation$requ : {}
113
113
  });
114
+ },
115
+ unsubscribe: function unsubscribe() {
116
+ _this._log({
117
+ name: 'execute.unsubscribe',
118
+ executeId: _this._executeId
119
+ });
114
120
  }
115
121
  });
116
122
  if (!RelayFeatureFlags.PROCESS_OPTIMISTIC_UPDATE_BEFORE_SUBSCRIPTION && optimisticConfig != null) {
@@ -378,6 +384,7 @@ var Executor = /*#__PURE__*/function () {
378
384
  var payload = this._normalizeResponse(response, this._operation.root, ROOT_TYPE, {
379
385
  actorIdentifier: this._actorIdentifier,
380
386
  getDataID: this._getDataID,
387
+ log: this._log,
381
388
  path: [],
382
389
  shouldProcessClientComponents: this._shouldProcessClientComponents,
383
390
  treatMissingFieldsAsNull: treatMissingFieldsAsNull
@@ -459,6 +466,7 @@ var Executor = /*#__PURE__*/function () {
459
466
  }, selector, followupPayload.typeName, {
460
467
  actorIdentifier: this._actorIdentifier,
461
468
  getDataID: this._getDataID,
469
+ log: this._log,
462
470
  path: followupPayload.path,
463
471
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
464
472
  shouldProcessClientComponents: this._shouldProcessClientComponents
@@ -515,6 +523,7 @@ var Executor = /*#__PURE__*/function () {
515
523
  var relayPayload = _this8._normalizeResponse(payloadPart, _this8._operation.root, ROOT_TYPE, {
516
524
  actorIdentifier: _this8._actorIdentifier,
517
525
  getDataID: _this8._getDataID,
526
+ log: _this8._log,
518
527
  path: [],
519
528
  treatMissingFieldsAsNull: _this8._treatMissingFieldsAsNull,
520
529
  shouldProcessClientComponents: _this8._shouldProcessClientComponents
@@ -801,6 +810,7 @@ var Executor = /*#__PURE__*/function () {
801
810
  var relayPayload = this._normalizeResponse(response, placeholder.selector, placeholder.typeName, {
802
811
  actorIdentifier: this._actorIdentifier,
803
812
  getDataID: this._getDataID,
813
+ log: this._log,
804
814
  path: placeholder.path,
805
815
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
806
816
  shouldProcessClientComponents: this._shouldProcessClientComponents
@@ -903,6 +913,7 @@ var Executor = /*#__PURE__*/function () {
903
913
  var relayPayload = this._normalizeResponse(response, selector, typeName, {
904
914
  actorIdentifier: this._actorIdentifier,
905
915
  getDataID: this._getDataID,
916
+ log: this._log,
906
917
  path: [].concat((0, _toConsumableArray2["default"])(normalizationPath), [responseKey, String(itemIndex)]),
907
918
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
908
919
  shouldProcessClientComponents: this._shouldProcessClientComponents
@@ -14,13 +14,14 @@ var defaultGetDataID = require('./defaultGetDataID');
14
14
  var defaultRelayFieldLogger = require('./defaultRelayFieldLogger');
15
15
  var normalizeResponse = require('./normalizeResponse');
16
16
  var OperationExecutor = require('./OperationExecutor');
17
+ var RelayModernStore = require('./RelayModernStore');
17
18
  var RelayPublishQueue = require('./RelayPublishQueue');
18
19
  var RelayRecordSource = require('./RelayRecordSource');
19
20
  var invariant = require('invariant');
20
21
  var RelayModernEnvironment = /*#__PURE__*/function () {
21
22
  function RelayModernEnvironment(config) {
22
23
  var _this = this;
23
- var _config$log, _config$relayFieldLog, _config$UNSTABLE_defa, _config$getDataID, _config$missingFieldH, _config$handlerProvid, _config$scheduler, _config$isServer, _config$normalizeResp, _config$operationTrac;
24
+ var _config$store, _config$log, _config$relayFieldLog, _config$UNSTABLE_defa, _config$getDataID, _config$missingFieldH, _config$handlerProvid, _config$scheduler, _config$isServer, _config$normalizeResp, _config$operationTrac;
24
25
  this.configName = config.configName;
25
26
  this._treatMissingFieldsAsNull = config.treatMissingFieldsAsNull === true;
26
27
  var operationLoader = config.operationLoader;
@@ -29,6 +30,12 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
29
30
  !(typeof operationLoader === 'object' && typeof operationLoader.get === 'function' && typeof operationLoader.load === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernEnvironment: Expected `operationLoader` to be an object ' + 'with get() and load() functions, got `%s`.', operationLoader) : invariant(false) : void 0;
30
31
  }
31
32
  }
33
+ var store = (_config$store = config.store) !== null && _config$store !== void 0 ? _config$store : new RelayModernStore(new RelayRecordSource(), {
34
+ log: config.log,
35
+ operationLoader: config.operationLoader,
36
+ getDataID: config.getDataID,
37
+ shouldProcessClientComponents: config.shouldProcessClientComponents
38
+ });
32
39
  this.__log = (_config$log = config.log) !== null && _config$log !== void 0 ? _config$log : emptyFunction;
33
40
  this.relayFieldLogger = (_config$relayFieldLog = config.relayFieldLogger) !== null && _config$relayFieldLog !== void 0 ? _config$relayFieldLog : defaultRelayFieldLogger;
34
41
  this._defaultRenderPolicy = (_config$UNSTABLE_defa = config.UNSTABLE_defaultRenderPolicy) !== null && _config$UNSTABLE_defa !== void 0 ? _config$UNSTABLE_defa : 'partial';
@@ -37,9 +44,9 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
37
44
  this._network = wrapNetworkWithLogObserver(this, config.network);
38
45
  this._getDataID = (_config$getDataID = config.getDataID) !== null && _config$getDataID !== void 0 ? _config$getDataID : defaultGetDataID;
39
46
  this._missingFieldHandlers = (_config$missingFieldH = config.missingFieldHandlers) !== null && _config$missingFieldH !== void 0 ? _config$missingFieldH : [];
40
- this._publishQueue = new RelayPublishQueue(config.store, (_config$handlerProvid = config.handlerProvider) !== null && _config$handlerProvid !== void 0 ? _config$handlerProvid : RelayDefaultHandlerProvider, this._getDataID, this._missingFieldHandlers);
47
+ this._publishQueue = new RelayPublishQueue(store, (_config$handlerProvid = config.handlerProvider) !== null && _config$handlerProvid !== void 0 ? _config$handlerProvid : RelayDefaultHandlerProvider, this._getDataID, this._missingFieldHandlers, this.__log);
41
48
  this._scheduler = (_config$scheduler = config.scheduler) !== null && _config$scheduler !== void 0 ? _config$scheduler : null;
42
- this._store = config.store;
49
+ this._store = store;
43
50
  this.options = config.options;
44
51
  this._isServer = (_config$isServer = config.isServer) !== null && _config$isServer !== void 0 ? _config$isServer : false;
45
52
  this._normalizeResponse = (_config$normalizeResp = config.normalizeResponse) !== null && _config$normalizeResp !== void 0 ? _config$normalizeResp : normalizeResponse;
@@ -199,7 +206,9 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
199
206
  var operation = _ref.operation;
200
207
  return this._execute({
201
208
  createSource: function createSource() {
202
- return _this7.getNetwork().execute(operation.request.node.params, operation.request.variables, operation.request.cacheConfig || {}, null);
209
+ return _this7.getNetwork().execute(operation.request.node.params, operation.request.variables, operation.request.cacheConfig || {}, null, undefined, undefined, undefined, function () {
210
+ return _this7.check(operation);
211
+ });
203
212
  },
204
213
  isClientPayload: false,
205
214
  operation: operation,
@@ -132,14 +132,14 @@ var SelectorResolver = /*#__PURE__*/function () {
132
132
  (0, _defineProperty2["default"])(this, "_onChange", function (snapshot) {
133
133
  _this2._data = snapshot.data;
134
134
  _this2._isMissingData = snapshot.isMissingData;
135
- _this2._errorResponseFields = snapshot.errorResponseFields;
135
+ _this2._fieldErrors = snapshot.fieldErrors;
136
136
  _this2._callback();
137
137
  });
138
138
  var _snapshot = environment.lookup(selector);
139
139
  this._callback = callback;
140
140
  this._data = _snapshot.data;
141
141
  this._isMissingData = _snapshot.isMissingData;
142
- this._errorResponseFields = _snapshot.errorResponseFields;
142
+ this._fieldErrors = _snapshot.fieldErrors;
143
143
  this._environment = environment;
144
144
  this._rootIsQueryRenderer = rootIsQueryRenderer;
145
145
  this._selector = selector;
@@ -182,7 +182,7 @@ var SelectorResolver = /*#__PURE__*/function () {
182
182
  }
183
183
  }
184
184
  }
185
- handlePotentialSnapshotErrors(this._environment, this._errorResponseFields);
185
+ handlePotentialSnapshotErrors(this._environment, this._fieldErrors);
186
186
  return this._data;
187
187
  };
188
188
  _proto2.setSelector = function setSelector(selector) {
@@ -193,7 +193,7 @@ var SelectorResolver = /*#__PURE__*/function () {
193
193
  var snapshot = this._environment.lookup(selector);
194
194
  this._data = recycleNodesInto(this._data, snapshot.data);
195
195
  this._isMissingData = snapshot.isMissingData;
196
- this._errorResponseFields = snapshot.errorResponseFields;
196
+ this._fieldErrors = snapshot.fieldErrors;
197
197
  this._selector = selector;
198
198
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
199
199
  };