@apollo/client 4.2.0-alpha.2 → 4.2.0-alpha.4

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 (147) hide show
  1. package/CHANGELOG.md +240 -0
  2. package/__cjs/cache/core/cache.cjs +1 -1
  3. package/__cjs/cache/inmemory/entityStore.cjs +3 -3
  4. package/__cjs/cache/inmemory/entityStore.cjs.map +1 -1
  5. package/__cjs/cache/inmemory/key-extractor.cjs +1 -1
  6. package/__cjs/cache/inmemory/policies.cjs +4 -4
  7. package/__cjs/cache/inmemory/readFromStore.cjs +2 -2
  8. package/__cjs/cache/inmemory/writeToStore.cjs +4 -4
  9. package/__cjs/core/ApolloClient.cjs +52 -20
  10. package/__cjs/core/ApolloClient.cjs.map +1 -1
  11. package/__cjs/core/ApolloClient.d.cts +159 -22
  12. package/__cjs/core/ObservableQuery.cjs +7 -7
  13. package/__cjs/core/ObservableQuery.cjs.map +1 -1
  14. package/__cjs/core/ObservableQuery.d.cts +20 -1
  15. package/__cjs/core/QueryManager.cjs +12 -12
  16. package/__cjs/core/QueryManager.cjs.map +1 -1
  17. package/__cjs/core/RefetchEventManager.cjs +134 -0
  18. package/__cjs/core/RefetchEventManager.cjs.map +1 -0
  19. package/__cjs/core/RefetchEventManager.d.cts +130 -0
  20. package/__cjs/core/index.cjs +7 -1
  21. package/__cjs/core/index.cjs.map +1 -1
  22. package/__cjs/core/index.d.cts +4 -1
  23. package/__cjs/core/refetchSources/onlineSource.cjs +10 -0
  24. package/__cjs/core/refetchSources/onlineSource.cjs.map +1 -0
  25. package/__cjs/core/refetchSources/onlineSource.d.cts +3 -0
  26. package/__cjs/core/refetchSources/windowFocusSource.cjs +13 -0
  27. package/__cjs/core/refetchSources/windowFocusSource.cjs.map +1 -0
  28. package/__cjs/core/refetchSources/windowFocusSource.d.cts +3 -0
  29. package/__cjs/core/types.d.cts +20 -0
  30. package/__cjs/invariantErrorCodes.cjs +69 -44
  31. package/__cjs/link/ws/index.cjs +9 -1
  32. package/__cjs/link/ws/index.cjs.map +1 -1
  33. package/__cjs/link/ws/index.d.cts +1 -1
  34. package/__cjs/react/hooks/useBackgroundQuery.cjs.map +1 -1
  35. package/__cjs/react/hooks/useBackgroundQuery.d.cts +1486 -66
  36. package/__cjs/react/hooks/useLazyQuery.cjs +1 -0
  37. package/__cjs/react/hooks/useLazyQuery.cjs.map +1 -1
  38. package/__cjs/react/hooks/useLazyQuery.d.cts +366 -40
  39. package/__cjs/react/hooks/useLoadableQuery.cjs.map +1 -1
  40. package/__cjs/react/hooks/useLoadableQuery.d.cts +512 -50
  41. package/__cjs/react/hooks/useMutation.cjs +5 -48
  42. package/__cjs/react/hooks/useMutation.cjs.map +1 -1
  43. package/__cjs/react/hooks/useMutation.d.cts +239 -130
  44. package/__cjs/react/hooks/useQuery.cjs.map +1 -1
  45. package/__cjs/react/hooks/useQuery.d.cts +590 -41
  46. package/__cjs/react/hooks/useSubscription.cjs +1 -1
  47. package/__cjs/react/hooks/useSubscription.cjs.map +1 -1
  48. package/__cjs/react/hooks/useSubscription.d.cts +2 -2
  49. package/__cjs/react/hooks/useSuspenseQuery.cjs.map +1 -1
  50. package/__cjs/react/hooks/useSuspenseQuery.d.cts +754 -46
  51. package/__cjs/react/internal/cache/QueryReference.cjs +1 -0
  52. package/__cjs/react/internal/cache/QueryReference.cjs.map +1 -1
  53. package/__cjs/react/internal/cache/QueryReference.d.cts +1 -1
  54. package/__cjs/react/query-preloader/createQueryPreloader.cjs.map +1 -1
  55. package/__cjs/react/query-preloader/createQueryPreloader.d.cts +20 -1
  56. package/__cjs/react/types/types.documentation.d.cts +19 -0
  57. package/__cjs/version.cjs +1 -1
  58. package/cache/core/cache.js +1 -1
  59. package/cache/inmemory/entityStore.js +3 -3
  60. package/cache/inmemory/entityStore.js.map +1 -1
  61. package/cache/inmemory/key-extractor.js +1 -1
  62. package/cache/inmemory/policies.js +4 -4
  63. package/cache/inmemory/readFromStore.js +2 -2
  64. package/cache/inmemory/writeToStore.js +4 -4
  65. package/core/ApolloClient.d.ts +159 -22
  66. package/core/ApolloClient.js +53 -21
  67. package/core/ApolloClient.js.map +1 -1
  68. package/core/ObservableQuery.d.ts +20 -1
  69. package/core/ObservableQuery.js +7 -7
  70. package/core/ObservableQuery.js.map +1 -1
  71. package/core/QueryManager.js +12 -12
  72. package/core/QueryManager.js.map +1 -1
  73. package/core/RefetchEventManager.d.ts +130 -0
  74. package/core/RefetchEventManager.js +126 -0
  75. package/core/RefetchEventManager.js.map +1 -0
  76. package/core/index.d.ts +4 -1
  77. package/core/index.js +3 -0
  78. package/core/index.js.map +1 -1
  79. package/core/refetchSources/onlineSource.d.ts +3 -0
  80. package/core/refetchSources/onlineSource.js +6 -0
  81. package/core/refetchSources/onlineSource.js.map +1 -0
  82. package/core/refetchSources/windowFocusSource.d.ts +3 -0
  83. package/core/refetchSources/windowFocusSource.js +9 -0
  84. package/core/refetchSources/windowFocusSource.js.map +1 -0
  85. package/core/types.d.ts +20 -0
  86. package/core/types.js.map +1 -1
  87. package/invariantErrorCodes.js +69 -44
  88. package/link/ws/index.d.ts +1 -1
  89. package/link/ws/index.js +9 -1
  90. package/link/ws/index.js.map +1 -1
  91. package/package.json +3 -7
  92. package/react/hooks/useBackgroundQuery.d.ts +1486 -66
  93. package/react/hooks/useBackgroundQuery.js.map +1 -1
  94. package/react/hooks/useLazyQuery.d.ts +366 -40
  95. package/react/hooks/useLazyQuery.js +1 -0
  96. package/react/hooks/useLazyQuery.js.map +1 -1
  97. package/react/hooks/useLoadableQuery.d.ts +512 -50
  98. package/react/hooks/useLoadableQuery.js.map +1 -1
  99. package/react/hooks/useMutation.d.ts +239 -130
  100. package/react/hooks/useMutation.js +5 -48
  101. package/react/hooks/useMutation.js.map +1 -1
  102. package/react/hooks/useQuery.d.ts +590 -41
  103. package/react/hooks/useQuery.js.map +1 -1
  104. package/react/hooks/useSubscription.d.ts +2 -2
  105. package/react/hooks/useSubscription.js +1 -1
  106. package/react/hooks/useSubscription.js.map +1 -1
  107. package/react/hooks/useSuspenseQuery.d.ts +754 -46
  108. package/react/hooks/useSuspenseQuery.js.map +1 -1
  109. package/react/hooks-compiled/useBackgroundQuery.d.ts +1486 -66
  110. package/react/hooks-compiled/useBackgroundQuery.js.map +1 -1
  111. package/react/hooks-compiled/useLazyQuery.d.ts +366 -40
  112. package/react/hooks-compiled/useLazyQuery.js +1 -0
  113. package/react/hooks-compiled/useLazyQuery.js.map +1 -1
  114. package/react/hooks-compiled/useLoadableQuery.d.ts +512 -50
  115. package/react/hooks-compiled/useLoadableQuery.js.map +1 -1
  116. package/react/hooks-compiled/useMutation.d.ts +239 -130
  117. package/react/hooks-compiled/useMutation.js +4 -47
  118. package/react/hooks-compiled/useMutation.js.map +1 -1
  119. package/react/hooks-compiled/useQuery.d.ts +590 -41
  120. package/react/hooks-compiled/useQuery.js.map +1 -1
  121. package/react/hooks-compiled/useSubscription.d.ts +2 -2
  122. package/react/hooks-compiled/useSubscription.js +1 -1
  123. package/react/hooks-compiled/useSubscription.js.map +1 -1
  124. package/react/hooks-compiled/useSuspenseQuery.d.ts +754 -46
  125. package/react/hooks-compiled/useSuspenseQuery.js.map +1 -1
  126. package/react/internal/cache/QueryReference.d.ts +1 -1
  127. package/react/internal/cache/QueryReference.js +1 -0
  128. package/react/internal/cache/QueryReference.js.map +1 -1
  129. package/react/query-preloader/createQueryPreloader.d.ts +20 -1
  130. package/react/query-preloader/createQueryPreloader.js.map +1 -1
  131. package/react/types/types.documentation.d.ts +19 -0
  132. package/react/types/types.documentation.js.map +1 -1
  133. package/skills/apollo-client/SKILL.md +168 -0
  134. package/skills/apollo-client/references/caching.md +560 -0
  135. package/skills/apollo-client/references/error-handling.md +350 -0
  136. package/skills/apollo-client/references/fragments.md +804 -0
  137. package/skills/apollo-client/references/integration-client.md +336 -0
  138. package/skills/apollo-client/references/integration-nextjs.md +325 -0
  139. package/skills/apollo-client/references/integration-react-router.md +256 -0
  140. package/skills/apollo-client/references/integration-tanstack-start.md +378 -0
  141. package/skills/apollo-client/references/mutations.md +549 -0
  142. package/skills/apollo-client/references/queries.md +416 -0
  143. package/skills/apollo-client/references/state-management.md +428 -0
  144. package/skills/apollo-client/references/suspense-hooks.md +773 -0
  145. package/skills/apollo-client/references/troubleshooting.md +487 -0
  146. package/skills/apollo-client/references/typescript-codegen.md +133 -0
  147. package/version.js +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,226 @@
1
1
  # @apollo/client
2
2
 
3
+ ## 4.2.0-alpha.4
4
+
5
+ ### Minor Changes
6
+
7
+ - [#13210](https://github.com/apollographql/apollo-client/pull/13210) [`1f9a428`](https://github.com/apollographql/apollo-client/commit/1f9a4287eb1eeef2cc08c81c92961f1cecd0dbca) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Add support for automatic event-based refetching, such as window focus.
8
+
9
+ The `RefetchEventManager` class handles automatic refetches in response to events. Apollo Client provides built-in sources for window focus and network reconnect as `windowFocusSource` and `onlineSource`.
10
+
11
+ Event refetching is fully opt-in. Create and pass a `RefetchEventManager` instance to the `ApolloClient` constructor to activate the event listeners.
12
+
13
+ ```ts
14
+ import {
15
+ ApolloClient,
16
+ InMemoryCache,
17
+ RefetchEventManager,
18
+ windowFocusSource,
19
+ onlineSource,
20
+ } from "@apollo/client";
21
+
22
+ const client = new ApolloClient({
23
+ link,
24
+ cache: new InMemoryCache(),
25
+ refetchEventManager: new RefetchEventManager({
26
+ sources: {
27
+ // Refetch when window is focused
28
+ windowFocus: windowFocusSource,
29
+
30
+ // Refetch when the user comes back online
31
+ online: onlineSource,
32
+ },
33
+ }),
34
+ });
35
+ ```
36
+
37
+ By default, all active queries refetch when the events fire. Queries can opt out per-event or disable all event refetches:
38
+
39
+ ```ts
40
+ // Skip refetch on window focus for this query, but keep `online`
41
+ useQuery(QUERY, {
42
+ refetchOn: { windowFocus: false },
43
+ });
44
+
45
+ // Disable all event-driven refetches for this query
46
+ useQuery(OTHER_QUERY, {
47
+ refetchOn: false,
48
+ });
49
+
50
+ // Enable every event for this query, regardless of defaultOptions
51
+ useQuery(LIVE_DASHBOARD, {
52
+ refetchOn: true,
53
+ });
54
+
55
+ // Dynamically enable or disable a refetch when the event fires
56
+ useQuery(LIVE_DASHBOARD, {
57
+ refetchOn: ({ source, payload }) => {
58
+ if (source === "windowFocus") {
59
+ // payload is the data associated with the event
60
+ return someCondition(payload);
61
+ }
62
+
63
+ return true;
64
+ },
65
+ });
66
+
67
+ // Dynamically enable or disable a refetch for a specific event
68
+ useQuery(LIVE_DASHBOARD, {
69
+ refetchOn: {
70
+ windowFocus: ({ payload }) => {
71
+ // payload is the data associated with the event
72
+ return someCondition(payload);
73
+ },
74
+ },
75
+ });
76
+ ```
77
+
78
+ To enable per-query opt-in rather than opt-out, set `defaultOptions.watchQuery.refetchOn` to `false` and enable it per-query instead.
79
+
80
+ ```ts
81
+ const client = new ApolloClient({
82
+ link,
83
+ cache,
84
+ refetchEventManager: new RefetchEventManager({
85
+ sources: { windowFocus: windowFocusSource },
86
+ }),
87
+ defaultOptions: {
88
+ watchQuery: { refetchOn: false },
89
+ },
90
+ });
91
+
92
+ // Only this query refetches on window focus
93
+ useQuery(DASHBOARD_QUERY, { refetchOn: { windowFocus: true } });
94
+ ```
95
+
96
+ When `defaultOptions.watchQuery.refetchOn` and per-query `refetchOn` options are provided, the objects are merged together.
97
+
98
+ ### Custom events
99
+
100
+ You can also add your own custom events that trigger refetches. Register your event name and payload type using TypeScript module augmentation, then provide a source function that returns an Observable. The source's emitted value becomes the event's `payload`.
101
+
102
+ ```ts
103
+ import { Observable } from "@apollo/client";
104
+ import { filter } from "rxjs";
105
+ import { AppState, AppStateStatus, Platform } from "react-native";
106
+
107
+ declare module "@apollo/client" {
108
+ interface RefetchEvents {
109
+ reactNativeAppStatus: AppStateStatus;
110
+ }
111
+ }
112
+
113
+ const refetchEventManager = new RefetchEventManager({
114
+ sources: {
115
+ reactNativeAppStatus: () => {
116
+ return new Observable((observer) => {
117
+ const subscription = AppState.addEventListener("change", (status) => {
118
+ observer.next(status);
119
+ });
120
+ return () => subscription.remove();
121
+ }).pipe(
122
+ filter((status) => Platform.OS !== "web" && status === "active")
123
+ );
124
+ },
125
+ },
126
+ });
127
+
128
+ // Disable per-query by setting the event to false
129
+ useQuery(QUERY, { refetchOn: { reactNativeAppStatus: false } });
130
+ ```
131
+
132
+ ### Manually trigger an event refetch
133
+
134
+ Refetches can be triggered imperatively by calling `emit` with the event name and its payload (if any).
135
+
136
+ ```ts
137
+ refetchEventManager.emit("reactNativeAppStatus", "active");
138
+ ```
139
+
140
+ #### Sourceless events
141
+
142
+ A source that has no automatic detection logic but still wants imperative `emit` support can be declared as `true`. Type the event as `void` to omit the payload argument.
143
+
144
+ ```ts
145
+ declare module "@apollo/client" {
146
+ interface RefetchEvents {
147
+ userTriggered: void;
148
+ }
149
+ }
150
+
151
+ const refetchEventManager = new RefetchEventManager({
152
+ sources: { userTriggered: true },
153
+ });
154
+
155
+ refetchEventManager.emit("userTriggered");
156
+ ```
157
+
158
+ Note: Calling `emit` on an event without a registered source will log a warning and result in a no-op.
159
+
160
+ ### Custom handlers
161
+
162
+ When an event fires, the default handler calls `client.refetchQueries({ include: "active" })` filtered by each query's `refetchOn` setting. You can override the handler for an event to add your own custom filtering. For example, to refetch all queries, including `standby` queries, define a handler for the event:
163
+
164
+ ```ts
165
+ const refetchEventManager = new RefetchEventManager({
166
+ // ...
167
+ handlers: {
168
+ userTriggered: ({ client, source, payload, matchesRefetchOn }) => {
169
+ return client.refetchQueries({
170
+ include: "all",
171
+ onQueryUpdated: (observableQuery) => {
172
+ return matchesRefetchOn(observableQuery);
173
+ },
174
+ });
175
+ },
176
+ },
177
+ });
178
+ ```
179
+
180
+ Handlers must return either a `RefetchQueriesResult` or `void`. Returning `void` skips refetching for the event.
181
+
182
+ ## 4.2.0-alpha.3
183
+
184
+ ### Minor Changes
185
+
186
+ - [#13206](https://github.com/apollographql/apollo-client/pull/13206) [`08fccab`](https://github.com/apollographql/apollo-client/commit/08fccab68822e99c6edd539cb4162d1a3df4f4c9) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Extend the `defaultOptions` type-safety work to `client.mutate` and `useMutation`.
187
+
188
+ The `errorPolicy` option now flows through to the result types for mutations in the same way it already does for queries:
189
+
190
+ - `ApolloClient.MutateResult<TData, TErrorPolicy>` maps `errorPolicy` to the concrete shape of `data` and `error`:
191
+ - `"none"` → `{ data: TData; error?: never }`
192
+ - `"all"` → `{ data: TData | undefined; error?: ErrorLike }`
193
+ - `"ignore"` → `{ data: TData | undefined; error?: never }`
194
+ - `client.mutate` and `useMutation` pick up the declared `defaultOptions.mutate.errorPolicy` and the explicit `errorPolicy` on each call to narrow return types accordingly.
195
+ - `useMutation.Result.error` is narrowed to `undefined` when `errorPolicy` is `"ignore"`, since `client.mutate` never resolves with an error in that case.
196
+
197
+ `DeclareDefaultOptions.Mutate` already accepted `errorPolicy`; the new behavior is that once you declare it, hook and method return types reflect it:
198
+
199
+ ```ts
200
+ // apollo.d.ts
201
+ import "@apollo/client";
202
+
203
+ declare module "@apollo/client" {
204
+ namespace ApolloClient {
205
+ namespace DeclareDefaultOptions {
206
+ interface Mutate {
207
+ errorPolicy: "all";
208
+ }
209
+ }
210
+ }
211
+ }
212
+ ```
213
+
214
+ ```ts
215
+ const result = await client.mutate({ mutation: MUTATION });
216
+ result.data;
217
+ // ^? TData | undefined
218
+ result.error;
219
+ // ^? ErrorLike | undefined
220
+ ```
221
+
222
+ Setting `errorPolicy` on an individual call overrides the default for that call's return type.
223
+
3
224
  ## 4.2.0-alpha.2
4
225
 
5
226
  ### Minor Changes
@@ -160,6 +381,25 @@
160
381
 
161
382
  - [#13130](https://github.com/apollographql/apollo-client/pull/13130) [`dd12231`](https://github.com/apollographql/apollo-client/commit/dd122316028b55307de4a40335512307c8fa916a) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Improve the accuracy of `client.query` return type to better detect the current `errorPolicy`. The `data` property is no longer nullable when the `errorPolicy` is `none`. This makes it possible to remove the `undefined` checks or optional chaining in most cases.
162
383
 
384
+ ## 4.1.9
385
+
386
+ ### Patch Changes
387
+
388
+ - [#13203](https://github.com/apollographql/apollo-client/pull/13203) [`099954b`](https://github.com/apollographql/apollo-client/commit/099954b9905c0f80b57563eb64157386f4493e84) Thanks [@copilot-swe-agent](https://github.com/apps/copilot-swe-agent)! - Remove the `workspaces` field from the published `package.json` in `dist` to avoid Yarn v1 warnings about workspaces requiring private packages.
389
+
390
+ ## 4.1.8
391
+
392
+ ### Patch Changes
393
+
394
+ - [#13202](https://github.com/apollographql/apollo-client/pull/13202) [`8a51ea6`](https://github.com/apollographql/apollo-client/commit/8a51ea636600dbe4b48477d32f30469b7d36b152) Thanks [@phryneas](https://github.com/phryneas)! - Ship agent skill for usage with @tanstack/intent — the skill is now bundled in the npm package under `skills/apollo-client/` and discoverable by `intent list`.
395
+ For more context, see the [TanStack Intent QuickStart](https://tanstack.com/intent/latest/docs/getting-started/quick-start-consumers).
396
+
397
+ ## 4.1.7
398
+
399
+ ### Patch Changes
400
+
401
+ - [#13187](https://github.com/apollographql/apollo-client/pull/13187) [`bb3fd9b`](https://github.com/apollographql/apollo-client/commit/bb3fd9b3d40a2505add673a6ee89d85b8b4c8984) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Fix RxJS interop issue with the observable returned by `WebSocketLink`.
402
+
163
403
  ## 4.1.6
164
404
 
165
405
  ### Patch Changes
@@ -140,7 +140,7 @@ class ApolloCache {
140
140
  if (environment_1.__DEV__) {
141
141
  const actualFragmentName = fragmentName || (0, internal_1.getFragmentDefinition)(fragment).name.value;
142
142
  if (id === undefined) {
143
- __DEV__ && invariant_1.invariant.warn(113, actualFragmentName);
143
+ __DEV__ && invariant_1.invariant.warn(118, actualFragmentName);
144
144
  }
145
145
  }
146
146
  return id;
@@ -82,7 +82,7 @@ class EntityStore {
82
82
  // then there are no fields to be merged, so we're done.
83
83
  if (!incoming)
84
84
  return;
85
- (0, invariant_1.invariant)(typeof dataId === "string", 99);
85
+ (0, invariant_1.invariant)(typeof dataId === "string", 104);
86
86
  const merged = new internal_1.DeepMerger({
87
87
  reconciler: storeObjectReconciler,
88
88
  }).merge(existing, incoming);
@@ -184,7 +184,7 @@ class EntityStore {
184
184
  if (environment_1.__DEV__) {
185
185
  const checkReference = (ref) => {
186
186
  if (this.lookup(ref.__ref) === undefined) {
187
- __DEV__ && invariant_1.invariant.warn(100, ref);
187
+ __DEV__ && invariant_1.invariant.warn(105, ref);
188
188
  return true;
189
189
  }
190
190
  };
@@ -213,7 +213,7 @@ class EntityStore {
213
213
  }
214
214
  }
215
215
  if (seenReference && someNonReference !== undefined) {
216
- __DEV__ && invariant_1.invariant.warn(101, someNonReference);
216
+ __DEV__ && invariant_1.invariant.warn(106, someNonReference);
217
217
  break;
218
218
  }
219
219
  }