@apollo/client 3.10.8 → 3.11.0-rc.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 (133) hide show
  1. package/.changeset/angry-ravens-mate.md +5 -0
  2. package/.changeset/angry-seals-jog.md +5 -0
  3. package/.changeset/chilly-dots-shake.md +5 -0
  4. package/.changeset/clever-bikes-admire.md +5 -0
  5. package/.changeset/flat-onions-guess.md +5 -0
  6. package/.changeset/fluffy-badgers-rush.md +5 -0
  7. package/.changeset/little-suits-return.md +5 -0
  8. package/.changeset/nasty-olives-act.md +5 -0
  9. package/.changeset/pink-ants-remember.md +16 -0
  10. package/.changeset/pre.json +24 -0
  11. package/.changeset/slimy-balloons-cheat.md +5 -0
  12. package/.changeset/slimy-berries-yawn.md +14 -0
  13. package/.changeset/tasty-chairs-dress.md +5 -0
  14. package/.changeset/thin-lies-begin.md +5 -0
  15. package/.changeset/unlucky-birds-press.md +5 -0
  16. package/.changeset/weak-ads-develop.md +5 -0
  17. package/CHANGELOG.md +60 -4
  18. package/apollo-client.cjs +501 -410
  19. package/apollo-client.cjs.map +1 -1
  20. package/apollo-client.min.cjs +1 -1
  21. package/core/ApolloClient.d.ts +24 -2
  22. package/core/ApolloClient.js +9 -8
  23. package/core/ApolloClient.js.map +1 -1
  24. package/core/ObservableQuery.js +5 -1
  25. package/core/ObservableQuery.js.map +1 -1
  26. package/core/QueryInfo.d.ts +2 -2
  27. package/core/QueryInfo.js.map +1 -1
  28. package/core/QueryManager.d.ts +1 -1
  29. package/core/QueryManager.js +5 -4
  30. package/core/QueryManager.js.map +1 -1
  31. package/core/core.cjs +18 -11
  32. package/core/core.cjs.map +1 -1
  33. package/core/core.cjs.native.js +18 -11
  34. package/core/types.d.ts +2 -2
  35. package/core/types.js.map +1 -1
  36. package/core/watchQueryOptions.d.ts +4 -0
  37. package/core/watchQueryOptions.js.map +1 -1
  38. package/dev/dev.cjs +40 -34
  39. package/dev/dev.cjs.map +1 -1
  40. package/dev/dev.cjs.native.js +40 -34
  41. package/errors/errors.cjs +4 -0
  42. package/errors/errors.cjs.map +1 -1
  43. package/errors/errors.cjs.native.js +4 -0
  44. package/errors/index.d.ts +18 -3
  45. package/errors/index.js +7 -2
  46. package/errors/index.js.map +1 -1
  47. package/invariantErrorCodes.js +41 -34
  48. package/link/core/types.d.ts +6 -4
  49. package/link/core/types.js.map +1 -1
  50. package/link/error/index.d.ts +4 -4
  51. package/link/error/index.js.map +1 -1
  52. package/link/persisted-queries/index.d.ts +3 -3
  53. package/link/persisted-queries/index.js.map +1 -1
  54. package/link/subscriptions/index.js +1 -0
  55. package/link/subscriptions/index.js.map +1 -1
  56. package/link/subscriptions/subscriptions.cjs.map +1 -1
  57. package/package.json +29 -29
  58. package/react/hooks/hooks.cjs +445 -368
  59. package/react/hooks/hooks.cjs.map +1 -1
  60. package/react/hooks/hooks.cjs.native.js +445 -368
  61. package/react/hooks/internal/wrapHook.d.ts +2 -0
  62. package/react/hooks/internal/wrapHook.js.map +1 -1
  63. package/react/hooks/useBackgroundQuery.d.ts +15 -1
  64. package/react/hooks/useBackgroundQuery.js +5 -1
  65. package/react/hooks/useBackgroundQuery.js.map +1 -1
  66. package/react/hooks/useLazyQuery.js +54 -12
  67. package/react/hooks/useLazyQuery.js.map +1 -1
  68. package/react/hooks/useLoadableQuery.d.ts +7 -1
  69. package/react/hooks/useLoadableQuery.js +5 -1
  70. package/react/hooks/useLoadableQuery.js.map +1 -1
  71. package/react/hooks/useQuery.d.ts +34 -47
  72. package/react/hooks/useQuery.js +387 -388
  73. package/react/hooks/useQuery.js.map +1 -1
  74. package/react/hooks/useQueryRefHandlers.d.ts +7 -1
  75. package/react/hooks/useQueryRefHandlers.js +5 -1
  76. package/react/hooks/useQueryRefHandlers.js.map +1 -1
  77. package/react/hooks/useSubscription.d.ts +13 -10
  78. package/react/hooks/useSubscription.js +130 -98
  79. package/react/hooks/useSubscription.js.map +1 -1
  80. package/react/hooks/useSuspenseQuery.js +3 -3
  81. package/react/hooks/useSuspenseQuery.js.map +1 -1
  82. package/react/hooks/useSyncExternalStore.js +1 -1
  83. package/react/internal/cache/QueryReference.js +1 -1
  84. package/react/internal/internal.cjs +2 -2
  85. package/react/internal/internal.cjs.map +1 -1
  86. package/react/internal/internal.cjs.native.js +2 -2
  87. package/react/parser/index.js +5 -5
  88. package/react/parser/parser.cjs +5 -5
  89. package/react/parser/parser.cjs.map +1 -1
  90. package/react/parser/parser.cjs.native.js +5 -5
  91. package/react/query-preloader/createQueryPreloader.js +5 -1
  92. package/react/query-preloader/createQueryPreloader.js.map +1 -1
  93. package/react/react.cjs +12 -1
  94. package/react/react.cjs.map +1 -1
  95. package/react/react.cjs.native.js +12 -1
  96. package/react/types/types.d.ts +19 -0
  97. package/react/types/types.documentation.d.ts +10 -0
  98. package/react/types/types.documentation.js.map +1 -1
  99. package/react/types/types.js.map +1 -1
  100. package/testing/core/core.cjs +6 -5
  101. package/testing/core/core.cjs.map +1 -1
  102. package/testing/core/core.cjs.native.js +6 -5
  103. package/testing/core/mocking/mockLink.js +8 -7
  104. package/testing/core/mocking/mockLink.js.map +1 -1
  105. package/testing/experimental/createSchemaFetch.d.ts +2 -0
  106. package/testing/experimental/createSchemaFetch.js +12 -1
  107. package/testing/experimental/createSchemaFetch.js.map +1 -1
  108. package/testing/experimental/createTestSchema.d.ts +2 -0
  109. package/testing/experimental/createTestSchema.js +2 -0
  110. package/testing/experimental/createTestSchema.js.map +1 -1
  111. package/testing/experimental/experimental.cjs +5 -1
  112. package/testing/experimental/experimental.cjs.map +1 -1
  113. package/testing/experimental/experimental.cjs.native.js +5 -1
  114. package/testing/internal/disposables/enableFakeTimers.d.ts +7 -0
  115. package/testing/internal/disposables/enableFakeTimers.js +16 -0
  116. package/testing/internal/disposables/enableFakeTimers.js.map +1 -0
  117. package/testing/internal/disposables/index.d.ts +1 -0
  118. package/testing/internal/disposables/index.js +1 -0
  119. package/testing/internal/disposables/index.js.map +1 -1
  120. package/utilities/common/errorHandling.d.ts +1 -1
  121. package/utilities/globals/globals.cjs +1 -1
  122. package/utilities/globals/globals.cjs.map +1 -1
  123. package/utilities/globals/globals.cjs.native.js +1 -1
  124. package/utilities/graphql/DocumentTransform.js +1 -1
  125. package/utilities/graphql/directives.js +4 -4
  126. package/utilities/graphql/fragments.js +3 -3
  127. package/utilities/graphql/getFromAST.js +8 -8
  128. package/utilities/graphql/storeUtils.js +1 -1
  129. package/utilities/graphql/transform.js +2 -2
  130. package/utilities/utilities.cjs +19 -19
  131. package/utilities/utilities.cjs.map +1 -1
  132. package/utilities/utilities.cjs.native.js +19 -19
  133. package/version.js +1 -1
@@ -49,7 +49,7 @@ var useSyncExternalStore = realHook$1 ||
49
49
  !didWarnUncachedGetSnapshot &&
50
50
  value !== getSnapshot()) {
51
51
  didWarnUncachedGetSnapshot = true;
52
- globalThis.__DEV__ !== false && globals.invariant.error(58);
52
+ globalThis.__DEV__ !== false && globals.invariant.error(59);
53
53
  }
54
54
  var _a = React__namespace.useState({
55
55
  inst: { value: value, getSnapshot: getSnapshot },
@@ -98,7 +98,7 @@ function useDeepMemo(memoFn, deps) {
98
98
  var useIsomorphicLayoutEffect = utilities.canUseDOM ? React__namespace.useLayoutEffect : React__namespace.useEffect;
99
99
 
100
100
  var Ctx;
101
- function noop() { }
101
+ function noop$1() { }
102
102
  function useRenderGuard() {
103
103
  if (!Ctx) {
104
104
  Ctx = React__namespace.createContext(null);
@@ -107,7 +107,7 @@ function useRenderGuard() {
107
107
  function () {
108
108
  var orig = console.error;
109
109
  try {
110
- console.error = noop;
110
+ console.error = noop$1;
111
111
  React__namespace["useContext" ](Ctx);
112
112
  return true;
113
113
  }
@@ -153,181 +153,185 @@ function wrapHook(hookName, useHook, clientOrObsQuery) {
153
153
  }
154
154
 
155
155
  var hasOwnProperty = Object.prototype.hasOwnProperty;
156
+ var originalResult = Symbol();
157
+ function noop() { }
158
+ var lastWatchOptions = Symbol();
156
159
  function useQuery(query, options) {
157
160
  if (options === void 0) { options = Object.create(null); }
158
161
  return wrapHook("useQuery", _useQuery, useApolloClient(options && options.client))(query, options);
159
162
  }
160
163
  function _useQuery(query, options) {
161
- return useInternalState(useApolloClient(options.client), query).useQuery(options);
164
+ var _a = useQueryInternals(query, options), result = _a.result, obsQueryFields = _a.obsQueryFields;
165
+ return React__namespace.useMemo(function () { return (tslib.__assign(tslib.__assign({}, result), obsQueryFields)); }, [result, obsQueryFields]);
162
166
  }
163
- function useInternalState(client, query) {
164
- var forceUpdateState = React__namespace.useReducer(function (tick) { return tick + 1; }, 0)[1];
167
+ function useInternalState(client, query, options, renderPromises, makeWatchQueryOptions) {
165
168
  function createInternalState(previous) {
166
- return Object.assign(new InternalState(client, query, previous), {
167
- forceUpdateState: forceUpdateState,
168
- });
169
+ var _a;
170
+ parser.verifyDocumentType(query, parser.DocumentType.Query);
171
+ var internalState = {
172
+ client: client,
173
+ query: query,
174
+ observable:
175
+ (renderPromises &&
176
+ renderPromises.getSSRObservable(makeWatchQueryOptions())) ||
177
+ client.watchQuery(getObsQueryOptions(void 0, client, options, makeWatchQueryOptions())),
178
+ resultData: {
179
+ previousData: (_a = previous === null || previous === void 0 ? void 0 : previous.resultData.current) === null || _a === void 0 ? void 0 : _a.data,
180
+ },
181
+ };
182
+ return internalState;
169
183
  }
170
- var _a = React__namespace.useState(createInternalState), state = _a[0], updateState = _a[1];
171
- if (client !== state.client || query !== state.query) {
172
- updateState((state = createInternalState(state)));
184
+ var _a = React__namespace.useState(createInternalState), internalState = _a[0], updateInternalState = _a[1];
185
+ function onQueryExecuted(watchQueryOptions) {
186
+ var _a;
187
+ var _b;
188
+ Object.assign(internalState.observable, (_a = {},
189
+ _a[lastWatchOptions] = watchQueryOptions,
190
+ _a));
191
+ var resultData = internalState.resultData;
192
+ updateInternalState(tslib.__assign(tslib.__assign({}, internalState), {
193
+ query: watchQueryOptions.query, resultData: Object.assign(resultData, {
194
+ previousData: ((_b = resultData.current) === null || _b === void 0 ? void 0 : _b.data) || resultData.previousData,
195
+ current: undefined,
196
+ }) }));
173
197
  }
174
- return state;
175
- }
176
- var InternalState = (function () {
177
- function InternalState(client, query, previous) {
178
- var _this = this;
179
- this.client = client;
180
- this.query = query;
181
- this.forceUpdate = function () { return _this.forceUpdateState(); };
182
- this.ssrDisabledResult = utilities.maybeDeepFreeze({
183
- loading: true,
184
- data: void 0,
185
- error: void 0,
186
- networkStatus: core.NetworkStatus.loading,
187
- });
188
- this.skipStandbyResult = utilities.maybeDeepFreeze({
189
- loading: false,
190
- data: void 0,
191
- error: void 0,
192
- networkStatus: core.NetworkStatus.ready,
193
- });
194
- this.toQueryResultCache = new (utilities.canUseWeakMap ? WeakMap : Map)();
195
- parser.verifyDocumentType(query, parser.DocumentType.Query);
196
- var previousResult = previous && previous.result;
197
- var previousData = previousResult && previousResult.data;
198
- if (previousData) {
199
- this.previousData = previousData;
200
- }
198
+ if (client !== internalState.client || query !== internalState.query) {
199
+ var newInternalState = createInternalState(internalState);
200
+ updateInternalState(newInternalState);
201
+ return [newInternalState, onQueryExecuted];
201
202
  }
202
- InternalState.prototype.forceUpdateState = function () {
203
- globalThis.__DEV__ !== false && globals.invariant.warn(51);
203
+ return [internalState, onQueryExecuted];
204
+ }
205
+ function useQueryInternals(query, options) {
206
+ var client = useApolloClient(options.client);
207
+ var renderPromises = React__namespace.useContext(context.getApolloContext()).renderPromises;
208
+ var isSyncSSR = !!renderPromises;
209
+ var disableNetworkFetches = client.disableNetworkFetches;
210
+ var ssrAllowed = options.ssr !== false && !options.skip;
211
+ var partialRefetch = options.partialRefetch;
212
+ var makeWatchQueryOptions = createMakeWatchQueryOptions(client, query, options, isSyncSSR);
213
+ var _a = useInternalState(client, query, options, renderPromises, makeWatchQueryOptions), _b = _a[0], observable = _b.observable, resultData = _b.resultData, onQueryExecuted = _a[1];
214
+ var watchQueryOptions = makeWatchQueryOptions(observable);
215
+ useResubscribeIfNecessary(resultData,
216
+ observable,
217
+ client, options, watchQueryOptions);
218
+ var obsQueryFields = React__namespace.useMemo(function () { return bindObservableMethods(observable); }, [observable]);
219
+ useHandleSkip(resultData,
220
+ observable, client, options, watchQueryOptions, disableNetworkFetches, isSyncSSR);
221
+ useRegisterSSRObservable(observable, renderPromises, ssrAllowed);
222
+ var result = useObservableSubscriptionResult(resultData, observable, client, disableNetworkFetches, partialRefetch, isSyncSSR, {
223
+ onCompleted: options.onCompleted || noop,
224
+ onError: options.onError || noop,
225
+ });
226
+ return {
227
+ result: result,
228
+ obsQueryFields: obsQueryFields,
229
+ observable: observable,
230
+ resultData: resultData,
231
+ client: client,
232
+ onQueryExecuted: onQueryExecuted,
204
233
  };
205
- InternalState.prototype.executeQuery = function (options) {
206
- var _this = this;
207
- var _a;
208
- if (options.query) {
209
- Object.assign(this, { query: options.query });
234
+ }
235
+ function useObservableSubscriptionResult(resultData, observable, client, disableNetworkFetches, partialRefetch, skipSubscribing, callbacks) {
236
+ var callbackRef = React__namespace.useRef(callbacks);
237
+ React__namespace.useEffect(function () {
238
+ callbackRef.current = callbacks;
239
+ });
240
+ return useSyncExternalStore(React__namespace.useCallback(function (handleStoreChange) {
241
+ if (skipSubscribing) {
242
+ return function () { };
210
243
  }
211
- this.watchQueryOptions = this.createWatchQueryOptions((this.queryHookOptions = options));
212
- var concast = this.observable.reobserveAsConcast(this.getObsQueryOptions());
213
- this.previousData = ((_a = this.result) === null || _a === void 0 ? void 0 : _a.data) || this.previousData;
214
- this.result = void 0;
215
- this.forceUpdate();
216
- return new Promise(function (resolve) {
217
- var result;
218
- concast.subscribe({
219
- next: function (value) {
220
- result = value;
221
- },
222
- error: function () {
223
- resolve(_this.toQueryResult(_this.observable.getCurrentResult()));
224
- },
225
- complete: function () {
226
- resolve(_this.toQueryResult(result));
227
- },
228
- });
229
- });
230
- };
231
- InternalState.prototype.useQuery = function (options) {
232
- var _this = this;
233
- this.renderPromises = React__namespace.useContext(context.getApolloContext()).renderPromises;
234
- this.useOptions(options);
235
- var obsQuery = this.useObservableQuery();
236
- var result = useSyncExternalStore(
237
- React__namespace.useCallback(function (handleStoreChange) {
238
- if (_this.renderPromises) {
239
- return function () { };
244
+ var onNext = function () {
245
+ var previousResult = resultData.current;
246
+ var result = observable.getCurrentResult();
247
+ if (previousResult &&
248
+ previousResult.loading === result.loading &&
249
+ previousResult.networkStatus === result.networkStatus &&
250
+ equal.equal(previousResult.data, result.data)) {
251
+ return;
240
252
  }
241
- _this.forceUpdate = handleStoreChange;
242
- var onNext = function () {
243
- var previousResult = _this.result;
244
- var result = obsQuery.getCurrentResult();
245
- if (previousResult &&
246
- previousResult.loading === result.loading &&
247
- previousResult.networkStatus === result.networkStatus &&
248
- equal.equal(previousResult.data, result.data)) {
249
- return;
250
- }
251
- _this.setResult(result);
252
- };
253
- var onError = function (error) {
254
- subscription.unsubscribe();
255
- subscription = obsQuery.resubscribeAfterError(onNext, onError);
256
- if (!hasOwnProperty.call(error, "graphQLErrors")) {
257
- throw error;
258
- }
259
- var previousResult = _this.result;
260
- if (!previousResult ||
261
- (previousResult && previousResult.loading) ||
262
- !equal.equal(error, previousResult.error)) {
263
- _this.setResult({
264
- data: (previousResult && previousResult.data),
265
- error: error,
266
- loading: false,
267
- networkStatus: core.NetworkStatus.error,
268
- });
269
- }
270
- };
271
- var subscription = obsQuery.subscribe(onNext, onError);
272
- return function () {
273
- setTimeout(function () { return subscription.unsubscribe(); });
274
- _this.forceUpdate = function () { return _this.forceUpdateState(); };
275
- };
276
- }, [
277
- obsQuery,
278
- this.renderPromises,
279
- this.client.disableNetworkFetches,
280
- ]), function () { return _this.getCurrentResult(); }, function () { return _this.getCurrentResult(); });
281
- this.unsafeHandlePartialRefetch(result);
282
- return this.toQueryResult(result);
283
- };
284
- InternalState.prototype.useOptions = function (options) {
285
- var _a;
286
- var watchQueryOptions = this.createWatchQueryOptions((this.queryHookOptions = options));
287
- var currentWatchQueryOptions = this.watchQueryOptions;
288
- if (!equal.equal(watchQueryOptions, currentWatchQueryOptions)) {
289
- this.watchQueryOptions = watchQueryOptions;
290
- if (currentWatchQueryOptions && this.observable) {
291
- this.observable.reobserve(this.getObsQueryOptions());
292
- this.previousData = ((_a = this.result) === null || _a === void 0 ? void 0 : _a.data) || this.previousData;
293
- this.result = void 0;
253
+ setResult(result, resultData, observable, client, partialRefetch, handleStoreChange, callbackRef.current);
254
+ };
255
+ var onError = function (error) {
256
+ subscription.current.unsubscribe();
257
+ subscription.current = observable.resubscribeAfterError(onNext, onError);
258
+ if (!hasOwnProperty.call(error, "graphQLErrors")) {
259
+ throw error;
294
260
  }
261
+ var previousResult = resultData.current;
262
+ if (!previousResult ||
263
+ (previousResult && previousResult.loading) ||
264
+ !equal.equal(error, previousResult.error)) {
265
+ setResult({
266
+ data: (previousResult && previousResult.data),
267
+ error: error,
268
+ loading: false,
269
+ networkStatus: core.NetworkStatus.error,
270
+ }, resultData, observable, client, partialRefetch, handleStoreChange, callbackRef.current);
271
+ }
272
+ };
273
+ var subscription = { current: observable.subscribe(onNext, onError) };
274
+ return function () {
275
+ setTimeout(function () { return subscription.current.unsubscribe(); });
276
+ };
277
+ }, [
278
+ disableNetworkFetches,
279
+ skipSubscribing,
280
+ observable,
281
+ resultData,
282
+ partialRefetch,
283
+ client,
284
+ ]), function () {
285
+ return getCurrentResult(resultData, observable, callbackRef.current, partialRefetch, client);
286
+ }, function () {
287
+ return getCurrentResult(resultData, observable, callbackRef.current, partialRefetch, client);
288
+ });
289
+ }
290
+ function useRegisterSSRObservable(observable, renderPromises, ssrAllowed) {
291
+ if (renderPromises && ssrAllowed) {
292
+ renderPromises.registerSSRObservable(observable);
293
+ if (observable.getCurrentResult().loading) {
294
+ renderPromises.addObservableQueryPromise(observable);
295
295
  }
296
- this.onCompleted =
297
- options.onCompleted || InternalState.prototype.onCompleted;
298
- this.onError = options.onError || InternalState.prototype.onError;
299
- if ((this.renderPromises || this.client.disableNetworkFetches) &&
300
- this.queryHookOptions.ssr === false &&
301
- !this.queryHookOptions.skip) {
302
- this.result = this.ssrDisabledResult;
303
- }
304
- else if (this.queryHookOptions.skip ||
305
- this.watchQueryOptions.fetchPolicy === "standby") {
306
- this.result = this.skipStandbyResult;
307
- }
308
- else if (this.result === this.ssrDisabledResult ||
309
- this.result === this.skipStandbyResult) {
310
- this.result = void 0;
311
- }
312
- };
313
- InternalState.prototype.getObsQueryOptions = function () {
314
- var toMerge = [];
315
- var globalDefaults = this.client.defaultOptions.watchQuery;
316
- if (globalDefaults)
317
- toMerge.push(globalDefaults);
318
- if (this.queryHookOptions.defaultOptions) {
319
- toMerge.push(this.queryHookOptions.defaultOptions);
320
- }
321
- toMerge.push(utilities.compact(this.observable && this.observable.options, this.watchQueryOptions));
322
- return toMerge.reduce(utilities.mergeOptions);
323
- };
324
- InternalState.prototype.createWatchQueryOptions = function (_a) {
325
- var _b;
326
- if (_a === void 0) { _a = {}; }
327
- var skip = _a.skip; _a.ssr; _a.onCompleted; _a.onError; _a.defaultOptions;
328
- var otherOptions = tslib.__rest(_a, ["skip", "ssr", "onCompleted", "onError", "defaultOptions"]);
329
- var watchQueryOptions = Object.assign(otherOptions, { query: this.query });
330
- if (this.renderPromises &&
296
+ }
297
+ }
298
+ function useHandleSkip(
299
+ resultData, observable, client, options, watchQueryOptions, disableNetworkFetches, isSyncSSR) {
300
+ if ((isSyncSSR || disableNetworkFetches) &&
301
+ options.ssr === false &&
302
+ !options.skip) {
303
+ resultData.current = toQueryResult(ssrDisabledResult, resultData.previousData, observable, client);
304
+ }
305
+ else if (options.skip || watchQueryOptions.fetchPolicy === "standby") {
306
+ resultData.current = toQueryResult(skipStandbyResult, resultData.previousData, observable, client);
307
+ }
308
+ else if (
309
+ resultData.current &&
310
+ (resultData.current[originalResult] === ssrDisabledResult ||
311
+ resultData.current[originalResult] === skipStandbyResult)) {
312
+ resultData.current = void 0;
313
+ }
314
+ }
315
+ function useResubscribeIfNecessary(
316
+ resultData,
317
+ observable, client, options, watchQueryOptions) {
318
+ var _a;
319
+ if (observable[lastWatchOptions] &&
320
+ !equal.equal(observable[lastWatchOptions], watchQueryOptions)) {
321
+ observable.reobserve(getObsQueryOptions(observable, client, options, watchQueryOptions));
322
+ resultData.previousData =
323
+ ((_a = resultData.current) === null || _a === void 0 ? void 0 : _a.data) || resultData.previousData;
324
+ resultData.current = void 0;
325
+ }
326
+ observable[lastWatchOptions] = watchQueryOptions;
327
+ }
328
+ function createMakeWatchQueryOptions(client, query, _a, isSyncSSR) {
329
+ if (_a === void 0) { _a = {}; }
330
+ var skip = _a.skip; _a.ssr; _a.onCompleted; _a.onError; var defaultOptions = _a.defaultOptions,
331
+ otherOptions = tslib.__rest(_a, ["skip", "ssr", "onCompleted", "onError", "defaultOptions"]);
332
+ return function (observable) {
333
+ var watchQueryOptions = Object.assign(otherOptions, { query: query });
334
+ if (isSyncSSR &&
331
335
  (watchQueryOptions.fetchPolicy === "network-only" ||
332
336
  watchQueryOptions.fetchPolicy === "cache-and-network")) {
333
337
  watchQueryOptions.fetchPolicy = "cache-first";
@@ -336,117 +340,119 @@ var InternalState = (function () {
336
340
  watchQueryOptions.variables = {};
337
341
  }
338
342
  if (skip) {
339
- var _c = watchQueryOptions.fetchPolicy, fetchPolicy = _c === void 0 ? this.getDefaultFetchPolicy() : _c, _d = watchQueryOptions.initialFetchPolicy, initialFetchPolicy = _d === void 0 ? fetchPolicy : _d;
340
- Object.assign(watchQueryOptions, {
341
- initialFetchPolicy: initialFetchPolicy,
342
- fetchPolicy: "standby",
343
- });
343
+ watchQueryOptions.initialFetchPolicy =
344
+ watchQueryOptions.initialFetchPolicy ||
345
+ watchQueryOptions.fetchPolicy ||
346
+ getDefaultFetchPolicy(defaultOptions, client.defaultOptions);
347
+ watchQueryOptions.fetchPolicy = "standby";
344
348
  }
345
349
  else if (!watchQueryOptions.fetchPolicy) {
346
350
  watchQueryOptions.fetchPolicy =
347
- ((_b = this.observable) === null || _b === void 0 ? void 0 : _b.options.initialFetchPolicy) ||
348
- this.getDefaultFetchPolicy();
351
+ (observable === null || observable === void 0 ? void 0 : observable.options.initialFetchPolicy) ||
352
+ getDefaultFetchPolicy(defaultOptions, client.defaultOptions);
349
353
  }
350
354
  return watchQueryOptions;
351
355
  };
352
- InternalState.prototype.getDefaultFetchPolicy = function () {
353
- var _a, _b;
354
- return (((_a = this.queryHookOptions.defaultOptions) === null || _a === void 0 ? void 0 : _a.fetchPolicy) ||
355
- ((_b = this.client.defaultOptions.watchQuery) === null || _b === void 0 ? void 0 : _b.fetchPolicy) ||
356
- "cache-first");
357
- };
358
- InternalState.prototype.onCompleted = function (data) { };
359
- InternalState.prototype.onError = function (error) { };
360
- InternalState.prototype.useObservableQuery = function () {
361
- var obsQuery = (this.observable =
362
- (this.renderPromises &&
363
- this.renderPromises.getSSRObservable(this.watchQueryOptions)) ||
364
- this.observable ||
365
- this.client.watchQuery(this.getObsQueryOptions()));
366
- this.obsQueryFields = React__namespace.useMemo(function () { return ({
367
- refetch: obsQuery.refetch.bind(obsQuery),
368
- reobserve: obsQuery.reobserve.bind(obsQuery),
369
- fetchMore: obsQuery.fetchMore.bind(obsQuery),
370
- updateQuery: obsQuery.updateQuery.bind(obsQuery),
371
- startPolling: obsQuery.startPolling.bind(obsQuery),
372
- stopPolling: obsQuery.stopPolling.bind(obsQuery),
373
- subscribeToMore: obsQuery.subscribeToMore.bind(obsQuery),
374
- }); }, [obsQuery]);
375
- var ssrAllowed = !(this.queryHookOptions.ssr === false || this.queryHookOptions.skip);
376
- if (this.renderPromises && ssrAllowed) {
377
- this.renderPromises.registerSSRObservable(obsQuery);
378
- if (obsQuery.getCurrentResult().loading) {
379
- this.renderPromises.addObservableQueryPromise(obsQuery);
356
+ }
357
+ function getObsQueryOptions(observable, client, queryHookOptions, watchQueryOptions) {
358
+ var toMerge = [];
359
+ var globalDefaults = client.defaultOptions.watchQuery;
360
+ if (globalDefaults)
361
+ toMerge.push(globalDefaults);
362
+ if (queryHookOptions.defaultOptions) {
363
+ toMerge.push(queryHookOptions.defaultOptions);
364
+ }
365
+ toMerge.push(utilities.compact(observable && observable.options, watchQueryOptions));
366
+ return toMerge.reduce(utilities.mergeOptions);
367
+ }
368
+ function setResult(nextResult, resultData, observable, client, partialRefetch, forceUpdate, callbacks) {
369
+ var previousResult = resultData.current;
370
+ if (previousResult && previousResult.data) {
371
+ resultData.previousData = previousResult.data;
372
+ }
373
+ resultData.current = toQueryResult(unsafeHandlePartialRefetch(nextResult, observable, partialRefetch), resultData.previousData, observable, client);
374
+ forceUpdate();
375
+ handleErrorOrCompleted(nextResult, previousResult === null || previousResult === void 0 ? void 0 : previousResult[originalResult], callbacks);
376
+ }
377
+ function handleErrorOrCompleted(result, previousResult, callbacks) {
378
+ if (!result.loading) {
379
+ var error_1 = toApolloError$1(result);
380
+ Promise.resolve()
381
+ .then(function () {
382
+ if (error_1) {
383
+ callbacks.onError(error_1);
380
384
  }
381
- }
382
- return obsQuery;
383
- };
384
- InternalState.prototype.setResult = function (nextResult) {
385
- var previousResult = this.result;
386
- if (previousResult && previousResult.data) {
387
- this.previousData = previousResult.data;
388
- }
389
- this.result = nextResult;
390
- this.forceUpdate();
391
- this.handleErrorOrCompleted(nextResult, previousResult);
392
- };
393
- InternalState.prototype.handleErrorOrCompleted = function (result, previousResult) {
394
- var _this = this;
395
- if (!result.loading) {
396
- var error_1 = this.toApolloError(result);
397
- Promise.resolve()
398
- .then(function () {
399
- if (error_1) {
400
- _this.onError(error_1);
401
- }
402
- else if (result.data &&
403
- (previousResult === null || previousResult === void 0 ? void 0 : previousResult.networkStatus) !== result.networkStatus &&
404
- result.networkStatus === core.NetworkStatus.ready) {
405
- _this.onCompleted(result.data);
406
- }
407
- })
408
- .catch(function (error) {
409
- globalThis.__DEV__ !== false && globals.invariant.warn(error);
410
- });
411
- }
412
- };
413
- InternalState.prototype.toApolloError = function (result) {
414
- return utilities.isNonEmptyArray(result.errors) ?
415
- new errors.ApolloError({ graphQLErrors: result.errors })
416
- : result.error;
417
- };
418
- InternalState.prototype.getCurrentResult = function () {
419
- if (!this.result) {
420
- this.handleErrorOrCompleted((this.result = this.observable.getCurrentResult()));
421
- }
422
- return this.result;
423
- };
424
- InternalState.prototype.toQueryResult = function (result) {
425
- var queryResult = this.toQueryResultCache.get(result);
426
- if (queryResult)
427
- return queryResult;
428
- var data = result.data; result.partial; var resultWithoutPartial = tslib.__rest(result, ["data", "partial"]);
429
- this.toQueryResultCache.set(result, (queryResult = tslib.__assign(tslib.__assign(tslib.__assign({ data: data }, resultWithoutPartial), this.obsQueryFields), { client: this.client, observable: this.observable, variables: this.observable.variables, called: !this.queryHookOptions.skip, previousData: this.previousData })));
430
- if (!queryResult.error && utilities.isNonEmptyArray(result.errors)) {
431
- queryResult.error = new errors.ApolloError({ graphQLErrors: result.errors });
432
- }
433
- return queryResult;
434
- };
435
- InternalState.prototype.unsafeHandlePartialRefetch = function (result) {
436
- if (result.partial &&
437
- this.queryHookOptions.partialRefetch &&
438
- !result.loading &&
439
- (!result.data || Object.keys(result.data).length === 0) &&
440
- this.observable.options.fetchPolicy !== "cache-only") {
441
- Object.assign(result, {
442
- loading: true,
443
- networkStatus: core.NetworkStatus.refetch,
444
- });
445
- this.observable.refetch();
446
- }
385
+ else if (result.data &&
386
+ (previousResult === null || previousResult === void 0 ? void 0 : previousResult.networkStatus) !== result.networkStatus &&
387
+ result.networkStatus === core.NetworkStatus.ready) {
388
+ callbacks.onCompleted(result.data);
389
+ }
390
+ })
391
+ .catch(function (error) {
392
+ globalThis.__DEV__ !== false && globals.invariant.warn(error);
393
+ });
394
+ }
395
+ }
396
+ function getCurrentResult(resultData, observable, callbacks, partialRefetch, client) {
397
+ if (!resultData.current) {
398
+ setResult(observable.getCurrentResult(), resultData, observable, client, partialRefetch, function () { }, callbacks);
399
+ }
400
+ return resultData.current;
401
+ }
402
+ function getDefaultFetchPolicy(queryHookDefaultOptions, clientDefaultOptions) {
403
+ var _a;
404
+ return ((queryHookDefaultOptions === null || queryHookDefaultOptions === void 0 ? void 0 : queryHookDefaultOptions.fetchPolicy) ||
405
+ ((_a = clientDefaultOptions === null || clientDefaultOptions === void 0 ? void 0 : clientDefaultOptions.watchQuery) === null || _a === void 0 ? void 0 : _a.fetchPolicy) ||
406
+ "cache-first");
407
+ }
408
+ function toApolloError$1(result) {
409
+ return utilities.isNonEmptyArray(result.errors) ?
410
+ new errors.ApolloError({ graphQLErrors: result.errors })
411
+ : result.error;
412
+ }
413
+ function toQueryResult(result, previousData, observable, client) {
414
+ var data = result.data; result.partial; var resultWithoutPartial = tslib.__rest(result, ["data", "partial"]);
415
+ var queryResult = tslib.__assign(tslib.__assign({ data: data }, resultWithoutPartial), { client: client, observable: observable, variables: observable.variables, called: result !== ssrDisabledResult && result !== skipStandbyResult, previousData: previousData });
416
+ Object.defineProperty(queryResult, originalResult, { value: result });
417
+ if (!queryResult.error && utilities.isNonEmptyArray(result.errors)) {
418
+ queryResult.error = new errors.ApolloError({ graphQLErrors: result.errors });
419
+ }
420
+ return queryResult;
421
+ }
422
+ function unsafeHandlePartialRefetch(result, observable, partialRefetch) {
423
+ if (result.partial &&
424
+ partialRefetch &&
425
+ !result.loading &&
426
+ (!result.data || Object.keys(result.data).length === 0) &&
427
+ observable.options.fetchPolicy !== "cache-only") {
428
+ observable.refetch();
429
+ return tslib.__assign(tslib.__assign({}, result), { loading: true, networkStatus: core.NetworkStatus.refetch });
430
+ }
431
+ return result;
432
+ }
433
+ var ssrDisabledResult = utilities.maybeDeepFreeze({
434
+ loading: true,
435
+ data: void 0,
436
+ error: void 0,
437
+ networkStatus: core.NetworkStatus.loading,
438
+ });
439
+ var skipStandbyResult = utilities.maybeDeepFreeze({
440
+ loading: false,
441
+ data: void 0,
442
+ error: void 0,
443
+ networkStatus: core.NetworkStatus.ready,
444
+ });
445
+ function bindObservableMethods(observable) {
446
+ return {
447
+ refetch: observable.refetch.bind(observable),
448
+ reobserve: observable.reobserve.bind(observable),
449
+ fetchMore: observable.fetchMore.bind(observable),
450
+ updateQuery: observable.updateQuery.bind(observable),
451
+ startPolling: observable.startPolling.bind(observable),
452
+ stopPolling: observable.stopPolling.bind(observable),
453
+ subscribeToMore: observable.subscribeToMore.bind(observable),
447
454
  };
448
- return InternalState;
449
- }());
455
+ }
450
456
 
451
457
  var EAGER_METHODS = [
452
458
  "refetch",
@@ -454,6 +460,7 @@ var EAGER_METHODS = [
454
460
  "fetchMore",
455
461
  "updateQuery",
456
462
  "startPolling",
463
+ "stopPolling",
457
464
  "subscribeToMore",
458
465
  ];
459
466
  function useLazyQuery(query, options) {
@@ -465,11 +472,11 @@ function useLazyQuery(query, options) {
465
472
  var document = (_a = merged === null || merged === void 0 ? void 0 : merged.query) !== null && _a !== void 0 ? _a : query;
466
473
  optionsRef.current = options;
467
474
  queryRef.current = document;
468
- var internalState = useInternalState(useApolloClient(options && options.client), document);
469
- var useQueryResult = internalState.useQuery(tslib.__assign(tslib.__assign({}, merged), { skip: !execOptionsRef.current }));
470
- var initialFetchPolicy = useQueryResult.observable.options.initialFetchPolicy ||
471
- internalState.getDefaultFetchPolicy();
472
- var forceUpdateState = internalState.forceUpdateState, obsQueryFields = internalState.obsQueryFields;
475
+ var queryHookOptions = tslib.__assign(tslib.__assign({}, merged), { skip: !execOptionsRef.current });
476
+ var _b = useQueryInternals(document, queryHookOptions), obsQueryFields = _b.obsQueryFields, useQueryResult = _b.result, client = _b.client, resultData = _b.resultData, observable = _b.observable, onQueryExecuted = _b.onQueryExecuted;
477
+ var initialFetchPolicy = observable.options.initialFetchPolicy ||
478
+ getDefaultFetchPolicy(queryHookOptions.defaultOptions, client.defaultOptions);
479
+ var forceUpdateState = React__namespace.useReducer(function (tick) { return tick + 1; }, 0)[1];
473
480
  var eagerMethods = React__namespace.useMemo(function () {
474
481
  var eagerMethods = {};
475
482
  var _loop_1 = function (key) {
@@ -496,13 +503,50 @@ function useLazyQuery(query, options) {
496
503
  fetchPolicy: initialFetchPolicy,
497
504
  };
498
505
  var options = utilities.mergeOptions(optionsRef.current, tslib.__assign({ query: queryRef.current }, execOptionsRef.current));
499
- var promise = internalState
500
- .executeQuery(tslib.__assign(tslib.__assign({}, options), { skip: false }))
501
- .then(function (queryResult) { return Object.assign(queryResult, eagerMethods); });
506
+ var promise = executeQuery(resultData, observable, client, document, tslib.__assign(tslib.__assign({}, options), { skip: false }), onQueryExecuted).then(function (queryResult) { return Object.assign(queryResult, eagerMethods); });
502
507
  promise.catch(function () { });
503
508
  return promise;
504
- }, [eagerMethods, initialFetchPolicy, internalState]);
505
- return [execute, result];
509
+ }, [
510
+ client,
511
+ document,
512
+ eagerMethods,
513
+ initialFetchPolicy,
514
+ observable,
515
+ resultData,
516
+ onQueryExecuted,
517
+ ]);
518
+ var executeRef = React__namespace.useRef(execute);
519
+ useIsomorphicLayoutEffect(function () {
520
+ executeRef.current = execute;
521
+ });
522
+ var stableExecute = React__namespace.useCallback(function () {
523
+ var args = [];
524
+ for (var _i = 0; _i < arguments.length; _i++) {
525
+ args[_i] = arguments[_i];
526
+ }
527
+ return executeRef.current.apply(executeRef, args);
528
+ }, []);
529
+ return [stableExecute, result];
530
+ }
531
+ function executeQuery(resultData, observable, client, currentQuery, options, onQueryExecuted) {
532
+ var query = options.query || currentQuery;
533
+ var watchQueryOptions = createMakeWatchQueryOptions(client, query, options, false)(observable);
534
+ var concast = observable.reobserveAsConcast(getObsQueryOptions(observable, client, options, watchQueryOptions));
535
+ onQueryExecuted(watchQueryOptions);
536
+ return new Promise(function (resolve) {
537
+ var result;
538
+ concast.subscribe({
539
+ next: function (value) {
540
+ result = value;
541
+ },
542
+ error: function () {
543
+ resolve(toQueryResult(observable.getCurrentResult(), resultData.previousData, observable, client));
544
+ },
545
+ complete: function () {
546
+ resolve(toQueryResult(result, resultData.previousData, observable, client));
547
+ },
548
+ });
549
+ });
506
550
  }
507
551
 
508
552
  function useMutation(mutation, options) {
@@ -617,89 +661,67 @@ function useMutation(mutation, options) {
617
661
  }
618
662
 
619
663
  function useSubscription(subscription, options) {
664
+ if (options === void 0) { options = Object.create(null); }
620
665
  var hasIssuedDeprecationWarningRef = React__namespace.useRef(false);
621
- var client = useApolloClient(options === null || options === void 0 ? void 0 : options.client);
666
+ var client = useApolloClient(options.client);
622
667
  parser.verifyDocumentType(subscription, parser.DocumentType.Subscription);
623
- var _a = React__namespace.useState({
624
- loading: !(options === null || options === void 0 ? void 0 : options.skip),
625
- error: void 0,
626
- data: void 0,
627
- variables: options === null || options === void 0 ? void 0 : options.variables,
628
- }), result = _a[0], setResult = _a[1];
629
668
  if (!hasIssuedDeprecationWarningRef.current) {
630
669
  hasIssuedDeprecationWarningRef.current = true;
631
- if (options === null || options === void 0 ? void 0 : options.onSubscriptionData) {
670
+ if (options.onSubscriptionData) {
632
671
  globalThis.__DEV__ !== false && globals.invariant.warn(options.onData ? 52 : 53);
633
672
  }
634
- if (options === null || options === void 0 ? void 0 : options.onSubscriptionComplete) {
673
+ if (options.onSubscriptionComplete) {
635
674
  globalThis.__DEV__ !== false && globals.invariant.warn(options.onComplete ? 54 : 55);
636
675
  }
637
676
  }
638
- var _b = React__namespace.useState(function () {
639
- if (options === null || options === void 0 ? void 0 : options.skip) {
640
- return null;
641
- }
642
- return client.subscribe({
643
- query: subscription,
644
- variables: options === null || options === void 0 ? void 0 : options.variables,
645
- fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
646
- context: options === null || options === void 0 ? void 0 : options.context,
647
- });
648
- }), observable = _b[0], setObservable = _b[1];
649
- var canResetObservableRef = React__namespace.useRef(false);
650
- React__namespace.useEffect(function () {
651
- return function () {
652
- canResetObservableRef.current = true;
653
- };
654
- }, []);
655
- var ref = React__namespace.useRef({ client: client, subscription: subscription, options: options });
656
- React__namespace.useEffect(function () {
657
- var _a, _b, _c, _d;
658
- var shouldResubscribe = options === null || options === void 0 ? void 0 : options.shouldResubscribe;
659
- if (typeof shouldResubscribe === "function") {
660
- shouldResubscribe = !!shouldResubscribe(options);
661
- }
662
- if (options === null || options === void 0 ? void 0 : options.skip) {
663
- if (!(options === null || options === void 0 ? void 0 : options.skip) !== !((_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.skip) ||
664
- canResetObservableRef.current) {
665
- setResult({
666
- loading: false,
667
- data: void 0,
668
- error: void 0,
669
- variables: options === null || options === void 0 ? void 0 : options.variables,
670
- });
671
- setObservable(null);
672
- canResetObservableRef.current = false;
673
- }
674
- }
675
- else if ((shouldResubscribe !== false &&
676
- (client !== ref.current.client ||
677
- subscription !== ref.current.subscription ||
678
- (options === null || options === void 0 ? void 0 : options.fetchPolicy) !== ((_b = ref.current.options) === null || _b === void 0 ? void 0 : _b.fetchPolicy) ||
679
- !(options === null || options === void 0 ? void 0 : options.skip) !== !((_c = ref.current.options) === null || _c === void 0 ? void 0 : _c.skip) ||
680
- !equal.equal(options === null || options === void 0 ? void 0 : options.variables, (_d = ref.current.options) === null || _d === void 0 ? void 0 : _d.variables))) ||
681
- canResetObservableRef.current) {
682
- setResult({
683
- loading: true,
684
- data: void 0,
685
- error: void 0,
686
- variables: options === null || options === void 0 ? void 0 : options.variables,
687
- });
688
- setObservable(client.subscribe({
689
- query: subscription,
690
- variables: options === null || options === void 0 ? void 0 : options.variables,
691
- fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
692
- context: options === null || options === void 0 ? void 0 : options.context,
693
- }));
694
- canResetObservableRef.current = false;
677
+ var skip = options.skip, fetchPolicy = options.fetchPolicy, errorPolicy = options.errorPolicy, shouldResubscribe = options.shouldResubscribe, context = options.context, extensions = options.extensions, ignoreResults = options.ignoreResults;
678
+ var variables = useDeepMemo(function () { return options.variables; }, [options.variables]);
679
+ var recreate = function () {
680
+ return createSubscription(client, subscription, variables, fetchPolicy, errorPolicy, context, extensions);
681
+ };
682
+ var _a = React__namespace.useState(options.skip ? null : recreate), observable = _a[0], setObservable = _a[1];
683
+ var recreateRef = React__namespace.useRef(recreate);
684
+ useIsomorphicLayoutEffect(function () {
685
+ recreateRef.current = recreate;
686
+ });
687
+ if (skip) {
688
+ if (observable) {
689
+ setObservable((observable = null));
695
690
  }
696
- Object.assign(ref.current, { client: client, subscription: subscription, options: options });
697
- }, [client, subscription, options, canResetObservableRef.current]);
691
+ }
692
+ else if (!observable ||
693
+ ((client !== observable.__.client ||
694
+ subscription !== observable.__.query ||
695
+ fetchPolicy !== observable.__.fetchPolicy ||
696
+ errorPolicy !== observable.__.errorPolicy ||
697
+ !equal.equal(variables, observable.__.variables)) &&
698
+ (typeof shouldResubscribe === "function" ?
699
+ !!shouldResubscribe(options)
700
+ : shouldResubscribe) !== false)) {
701
+ setObservable((observable = recreate()));
702
+ }
703
+ var optionsRef = React__namespace.useRef(options);
698
704
  React__namespace.useEffect(function () {
705
+ optionsRef.current = options;
706
+ });
707
+ var fallbackLoading = !skip && !ignoreResults;
708
+ var fallbackResult = React__namespace.useMemo(function () { return ({
709
+ loading: fallbackLoading,
710
+ error: void 0,
711
+ data: void 0,
712
+ variables: variables,
713
+ }); }, [fallbackLoading, variables]);
714
+ var ignoreResultsRef = React__namespace.useRef(ignoreResults);
715
+ useIsomorphicLayoutEffect(function () {
716
+ ignoreResultsRef.current = ignoreResults;
717
+ });
718
+ var ret = useSyncExternalStore(React__namespace.useCallback(function (update) {
699
719
  if (!observable) {
700
- return;
720
+ return function () { };
701
721
  }
702
722
  var subscriptionStopped = false;
723
+ var variables = observable.__.variables;
724
+ var client = observable.__.client;
703
725
  var subscription = observable.subscribe({
704
726
  next: function (fetchResult) {
705
727
  var _a, _b;
@@ -709,18 +731,23 @@ function useSubscription(subscription, options) {
709
731
  var result = {
710
732
  loading: false,
711
733
  data: fetchResult.data,
712
- error: void 0,
713
- variables: options === null || options === void 0 ? void 0 : options.variables,
734
+ error: toApolloError$1(fetchResult),
735
+ variables: variables,
714
736
  };
715
- setResult(result);
716
- if ((_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.onData) {
717
- ref.current.options.onData({
737
+ observable.__.setResult(result);
738
+ if (!ignoreResultsRef.current)
739
+ update();
740
+ if (result.error) {
741
+ (_b = (_a = optionsRef.current).onError) === null || _b === void 0 ? void 0 : _b.call(_a, result.error);
742
+ }
743
+ else if (optionsRef.current.onData) {
744
+ optionsRef.current.onData({
718
745
  client: client,
719
746
  data: result,
720
747
  });
721
748
  }
722
- else if ((_b = ref.current.options) === null || _b === void 0 ? void 0 : _b.onSubscriptionData) {
723
- ref.current.options.onSubscriptionData({
749
+ else if (optionsRef.current.onSubscriptionData) {
750
+ optionsRef.current.onSubscriptionData({
724
751
  client: client,
725
752
  subscriptionData: result,
726
753
  });
@@ -728,24 +755,27 @@ function useSubscription(subscription, options) {
728
755
  },
729
756
  error: function (error) {
730
757
  var _a, _b;
758
+ error =
759
+ error instanceof core.ApolloError ? error : (new core.ApolloError({ protocolErrors: [error] }));
731
760
  if (!subscriptionStopped) {
732
- setResult({
761
+ observable.__.setResult({
733
762
  loading: false,
734
763
  data: void 0,
735
764
  error: error,
736
- variables: options === null || options === void 0 ? void 0 : options.variables,
765
+ variables: variables,
737
766
  });
738
- (_b = (_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
767
+ if (!ignoreResultsRef.current)
768
+ update();
769
+ (_b = (_a = optionsRef.current).onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
739
770
  }
740
771
  },
741
772
  complete: function () {
742
- var _a, _b;
743
773
  if (!subscriptionStopped) {
744
- if ((_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.onComplete) {
745
- ref.current.options.onComplete();
774
+ if (optionsRef.current.onComplete) {
775
+ optionsRef.current.onComplete();
746
776
  }
747
- else if ((_b = ref.current.options) === null || _b === void 0 ? void 0 : _b.onSubscriptionComplete) {
748
- ref.current.options.onSubscriptionComplete();
777
+ else if (optionsRef.current.onSubscriptionComplete) {
778
+ optionsRef.current.onSubscriptionComplete();
749
779
  }
750
780
  }
751
781
  },
@@ -756,8 +786,43 @@ function useSubscription(subscription, options) {
756
786
  subscription.unsubscribe();
757
787
  });
758
788
  };
759
- }, [observable]);
760
- return result;
789
+ }, [observable]), function () {
790
+ return observable && !skip && !ignoreResults ?
791
+ observable.__.result
792
+ : fallbackResult;
793
+ });
794
+ return React__namespace.useMemo(function () { return (tslib.__assign(tslib.__assign({}, ret), { restart: function () {
795
+ globals.invariant(!optionsRef.current.skip, 56);
796
+ setObservable(recreateRef.current());
797
+ } })); }, [ret]);
798
+ }
799
+ function createSubscription(client, query, variables, fetchPolicy, errorPolicy, context, extensions) {
800
+ var options = {
801
+ query: query,
802
+ variables: variables,
803
+ fetchPolicy: fetchPolicy,
804
+ errorPolicy: errorPolicy,
805
+ context: context,
806
+ extensions: extensions,
807
+ };
808
+ var __ = tslib.__assign(tslib.__assign({}, options), { client: client, result: {
809
+ loading: true,
810
+ data: void 0,
811
+ error: void 0,
812
+ variables: variables,
813
+ }, setResult: function (result) {
814
+ __.result = result;
815
+ } });
816
+ var observable = null;
817
+ return Object.assign(new core.Observable(function (observer) {
818
+ if (!observable) {
819
+ observable = client.subscribe(options);
820
+ }
821
+ var sub = observable.subscribe(observer);
822
+ return function () { return sub.unsubscribe(); };
823
+ }), {
824
+ __: __,
825
+ });
761
826
  }
762
827
 
763
828
  function useReactiveVar(rv) {
@@ -876,7 +941,7 @@ function _useSuspenseQuery(query, options) {
876
941
  setPromise([queryRef.key, queryRef.promise]);
877
942
  return promise;
878
943
  }, [queryRef]);
879
- var subscribeToMore = React__namespace.useCallback(function (options) { return queryRef.observable.subscribeToMore(options); }, [queryRef]);
944
+ var subscribeToMore = queryRef.observable.subscribeToMore;
880
945
  return React__namespace.useMemo(function () {
881
946
  return {
882
947
  client: client,
@@ -903,11 +968,11 @@ function validateFetchPolicy(fetchPolicy) {
903
968
  "no-cache",
904
969
  "cache-and-network",
905
970
  ];
906
- globals.invariant(supportedFetchPolicies.includes(fetchPolicy), 56, fetchPolicy);
971
+ globals.invariant(supportedFetchPolicies.includes(fetchPolicy), 57, fetchPolicy);
907
972
  }
908
973
  function validatePartialDataReturn(fetchPolicy, returnPartialData) {
909
974
  if (fetchPolicy === "no-cache" && returnPartialData) {
910
- globalThis.__DEV__ !== false && globals.invariant.warn(57);
975
+ globalThis.__DEV__ !== false && globals.invariant.warn(58);
911
976
  }
912
977
  }
913
978
  function toApolloError(result) {
@@ -984,7 +1049,11 @@ function _useBackgroundQuery(query, options) {
984
1049
  React__namespace.useEffect(function () { return queryRef.softRetain(); }, [queryRef]);
985
1050
  return [
986
1051
  didFetchResult.current ? wrappedQueryRef : void 0,
987
- { fetchMore: fetchMore, refetch: refetch },
1052
+ {
1053
+ fetchMore: fetchMore,
1054
+ refetch: refetch,
1055
+ subscribeToMore: queryRef.observable.subscribeToMore,
1056
+ },
988
1057
  ];
989
1058
  }
990
1059
 
@@ -1041,10 +1110,14 @@ function useLoadableQuery(query, options) {
1041
1110
  calledDuringRender,
1042
1111
  client,
1043
1112
  ]);
1113
+ var subscribeToMore = React__namespace.useCallback(function (options) {
1114
+ globals.invariant(internalQueryRef, 51);
1115
+ return internalQueryRef.observable.subscribeToMore(options);
1116
+ }, [internalQueryRef]);
1044
1117
  var reset = React__namespace.useCallback(function () {
1045
1118
  setQueryRef(null);
1046
1119
  }, []);
1047
- return [loadQuery, queryRef, { fetchMore: fetchMore, refetch: refetch, reset: reset }];
1120
+ return [loadQuery, queryRef, { fetchMore: fetchMore, refetch: refetch, reset: reset, subscribeToMore: subscribeToMore }];
1048
1121
  }
1049
1122
 
1050
1123
  function useQueryRefHandlers(queryRef) {
@@ -1075,7 +1148,11 @@ function _useQueryRefHandlers(queryRef) {
1075
1148
  setWrappedQueryRef(internal.wrapQueryRef(internalQueryRef));
1076
1149
  return promise;
1077
1150
  }, [internalQueryRef]);
1078
- return { refetch: refetch, fetchMore: fetchMore };
1151
+ return {
1152
+ refetch: refetch,
1153
+ fetchMore: fetchMore,
1154
+ subscribeToMore: internalQueryRef.observable.subscribeToMore,
1155
+ };
1079
1156
  }
1080
1157
 
1081
1158
  function useReadQuery(queryRef) {