Skip to content

Commit d11eb40

Browse files
Add array support to useFragment, useSuspenseFragment, and client.watchFragment (#12971)
Co-authored-by: Lenz Weber-Tronic <[email protected]> Co-authored-by: jerelmiller <[email protected]>
1 parent 5c56b32 commit d11eb40

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+5504
-409
lines changed

.api-reports/api-report-cache.api.md

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import { getApolloCacheMemoryInternals } from '@apollo/client/utilities/internal
2020
import type { GetDataState } from '@apollo/client';
2121
import { getInMemoryCacheMemoryInternals } from '@apollo/client/utilities/internal';
2222
import type { InlineFragmentNode } from 'graphql';
23+
import type { IsAny } from '@apollo/client/utilities/internal';
2324
import { isReference } from '@apollo/client/utilities';
2425
import type { NoInfer as NoInfer_2 } from '@apollo/client/utilities/internal';
2526
import { Observable } from 'rxjs';
2627
import type { OperationVariables } from '@apollo/client';
28+
import type { Prettify } from '@apollo/client/utilities/internal';
2729
import { Reference } from '@apollo/client/utilities';
2830
import type { SelectionSetNode } from 'graphql';
2931
import type { StoreObject } from '@apollo/client/utilities';
@@ -39,20 +41,36 @@ type AllFieldsModifier<Entity extends Record<string, any>> = Modifier<Entity[key
3941

4042
// @public (undocumented)
4143
export namespace ApolloCache {
44+
// (undocumented)
45+
export interface ObservableFragment<TData = unknown> extends Observable<ApolloCache.WatchFragmentResult<TData>> {
46+
getCurrentResult: () => ApolloCache.WatchFragmentResult<TData>;
47+
}
48+
export type WatchFragmentFromValue<TData> = StoreObject | Reference | FragmentType<NoInfer_2<TData>> | string | null;
4249
export interface WatchFragmentOptions<TData = unknown, TVariables extends OperationVariables = OperationVariables> {
4350
fragment: DocumentNode | TypedDocumentNode<TData, TVariables>;
4451
fragmentName?: string;
45-
from: StoreObject | Reference | FragmentType<NoInfer_2<TData>> | string;
52+
from: ApolloCache.WatchFragmentFromValue<TData> | Array<ApolloCache.WatchFragmentFromValue<TData>>;
4653
optimistic?: boolean;
4754
variables?: TVariables;
4855
}
49-
export type WatchFragmentResult<TData = unknown> = ({
56+
export type WatchFragmentResult<TData = unknown> = true extends IsAny<TData> ? ({
57+
complete: true;
58+
missing?: never;
59+
} & GetDataState<any, "complete">) | ({
60+
complete: false;
61+
missing?: MissingTree;
62+
} & GetDataState<any, "partial">) : TData extends null | null[] ? Prettify<{
63+
complete: true;
64+
missing?: never;
65+
} & GetDataState<TData, "complete">> : Prettify<{
5066
complete: true;
5167
missing?: never;
52-
} & GetDataState<TData, "complete">) | ({
68+
} & GetDataState<TData, "complete">> | {
5369
complete: false;
54-
missing: MissingTree;
55-
} & GetDataState<TData, "partial">);
70+
missing?: MissingTree;
71+
data: TData extends Array<infer TItem> ? Array<DataValue.Partial<TItem> | null> : DataValue.Partial<TData>;
72+
dataState: "partial";
73+
};
5674
}
5775

5876
// @public (undocumented)
@@ -77,6 +95,7 @@ export abstract class ApolloCache {
7795
lookupFragment(fragmentName: string): FragmentDefinitionNode | null;
7896
// (undocumented)
7997
modify<Entity extends Record<string, any> = Record<string, any>>(options: Cache_2.ModifyOptions<Entity>): boolean;
98+
protected onAfterBroadcast: (cb: () => void) => void;
8099
// (undocumented)
81100
abstract performTransaction(transaction: Transaction, optimisticId?: string | null): void;
82101
// (undocumented)
@@ -106,7 +125,28 @@ export abstract class ApolloCache {
106125
updateQuery<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: Cache_2.UpdateQueryOptions<TData, TVariables>, update: (data: Unmasked<TData> | null) => Unmasked<TData> | null | void): Unmasked<TData> | null;
107126
// (undocumented)
108127
abstract watch<TData = unknown, TVariables extends OperationVariables = OperationVariables>(watch: Cache_2.WatchOptions<TData, TVariables>): () => void;
109-
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables>): Observable<ApolloCache.WatchFragmentResult<Unmasked<TData>>>;
128+
// (undocumented)
129+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables> & {
130+
from: Array<NonNullable<ApolloCache.WatchFragmentFromValue<TData>>>;
131+
}): ApolloCache.ObservableFragment<Array<Unmasked<TData>>>;
132+
// (undocumented)
133+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables> & {
134+
from: Array<null>;
135+
}): ApolloCache.ObservableFragment<Array<null>>;
136+
// (undocumented)
137+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables> & {
138+
from: Array<ApolloCache.WatchFragmentFromValue<TData>>;
139+
}): ApolloCache.ObservableFragment<Array<Unmasked<TData> | null>>;
140+
// (undocumented)
141+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables> & {
142+
from: null;
143+
}): ApolloCache.ObservableFragment<null>;
144+
// (undocumented)
145+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables> & {
146+
from: NonNullable<ApolloCache.WatchFragmentFromValue<TData>>;
147+
}): ApolloCache.ObservableFragment<Unmasked<TData>>;
148+
// (undocumented)
149+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloCache.WatchFragmentOptions<TData, TVariables>): ApolloCache.ObservableFragment<Unmasked<TData> | null>;
110150
// (undocumented)
111151
abstract write<TData = unknown, TVariables extends OperationVariables = OperationVariables>(write: Cache_2.WriteOptions<TData, TVariables>): Reference | undefined;
112152
writeFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>({ data, fragment, fragmentName, variables, overwrite, id, broadcast, }: Cache_2.WriteFragmentOptions<TData, TVariables>): Reference | undefined;

.api-reports/api-report-core.api.md

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,10 @@ export namespace ApolloClient {
224224
extensions?: Record<string, unknown>;
225225
}
226226
// (undocumented)
227+
export interface ObservableFragment<TData = unknown> extends Observable_2<ApolloClient.WatchFragmentResult<TData>> {
228+
getCurrentResult: () => ApolloClient.WatchFragmentResult<TData>;
229+
}
230+
// (undocumented)
227231
export interface Options {
228232
assumeImmutableResults?: boolean;
229233
cache: ApolloCache;
@@ -295,7 +299,7 @@ export namespace ApolloClient {
295299
// (undocumented)
296300
export type WatchFragmentOptions<TData = unknown, TVariables extends OperationVariables = OperationVariables> = ApolloCache.WatchFragmentOptions<TData, TVariables>;
297301
// (undocumented)
298-
export type WatchFragmentResult<TData = unknown> = ApolloCache.WatchFragmentResult<TData>;
302+
export type WatchFragmentResult<TData = unknown> = ApolloCache.WatchFragmentResult<MaybeMasked<TData>>;
299303
export type WatchQueryOptions<TData = unknown, TVariables extends OperationVariables = OperationVariables> = {
300304
fetchPolicy?: WatchQueryFetchPolicy;
301305
nextFetchPolicy?: WatchQueryFetchPolicy | ((this: WatchQueryOptions<TData, TVariables>, currentFetchPolicy: WatchQueryFetchPolicy, context: NextFetchPolicyContext<TData, TVariables>) => WatchQueryFetchPolicy);
@@ -367,7 +371,23 @@ export class ApolloClient {
367371
subscribe<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.SubscribeOptions<TData, TVariables>): SubscriptionObservable<ApolloClient.SubscribeResult<MaybeMasked<TData>>>;
368372
// (undocumented)
369373
version: string;
370-
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables>): Observable_2<ApolloClient.WatchFragmentResult<MaybeMasked<TData>>>;
374+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables> & {
375+
from: Array<NonNullable<ApolloCache.WatchFragmentFromValue<TData>>>;
376+
}): ApolloClient.ObservableFragment<Array<TData>>;
377+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables> & {
378+
from: Array<null>;
379+
}): ApolloClient.ObservableFragment<Array<null>>;
380+
// (undocumented)
381+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables> & {
382+
from: Array<ApolloCache.WatchFragmentFromValue<TData>>;
383+
}): ApolloClient.ObservableFragment<Array<TData | null>>;
384+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables> & {
385+
from: null;
386+
}): ApolloClient.ObservableFragment<null>;
387+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables> & {
388+
from: NonNullable<ApolloCache.WatchFragmentFromValue<TData>>;
389+
}): ApolloClient.ObservableFragment<TData>;
390+
watchFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchFragmentOptions<TData, TVariables>): ApolloClient.ObservableFragment<TData | null>;
371391
watchQuery<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WatchQueryOptions<TData, TVariables>): ObservableQuery<TData, TVariables>;
372392
writeFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WriteFragmentOptions<TData, TVariables>): Reference_2 | undefined;
373393
writeQuery<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: ApolloClient.WriteQueryOptions<TData, TVariables>): Reference_2 | undefined;
@@ -1140,7 +1160,7 @@ export type WatchQueryOptions<TVariables extends OperationVariables = OperationV
11401160

11411161
// Warnings were encountered during analysis:
11421162
//
1143-
// src/core/ApolloClient.ts:362:5 - (ae-forgotten-export) The symbol "NextFetchPolicyContext" needs to be exported by the entry point index.d.ts
1163+
// src/core/ApolloClient.ts:370:5 - (ae-forgotten-export) The symbol "NextFetchPolicyContext" needs to be exported by the entry point index.d.ts
11441164
// src/core/ObservableQuery.ts:368:5 - (ae-forgotten-export) The symbol "QueryManager" needs to be exported by the entry point index.d.ts
11451165
// src/core/QueryManager.ts:180:5 - (ae-forgotten-export) The symbol "MutationStoreValue" needs to be exported by the entry point index.d.ts
11461166

.api-reports/api-report-react.api.md

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
```ts
66

77
import type { ApolloCache } from '@apollo/client';
8+
import type { ApolloCache as ApolloCache_2 } from '@apollo/client/cache';
89
import type { ApolloClient } from '@apollo/client';
910
import type { DataState } from '@apollo/client';
1011
import type { DataValue } from '@apollo/client';
@@ -16,7 +17,6 @@ import type { ErrorLike } from '@apollo/client';
1617
import type { ErrorPolicy } from '@apollo/client';
1718
import type { FetchMoreFunction } from '@apollo/client/react/internal';
1819
import type { FetchPolicy } from '@apollo/client';
19-
import type { FragmentType } from '@apollo/client/masking';
2020
import type { GetDataState } from '@apollo/client';
2121
import type { HookWrappers } from '@apollo/client/react/internal';
2222
import type { IgnoreModifier } from '@apollo/client/cache';
@@ -41,12 +41,8 @@ import { QueryRef } from '@apollo/client/react/internal';
4141
import type { QueryRef as QueryRef_2 } from '@apollo/client/react';
4242
import type { ReactiveVar } from '@apollo/client';
4343
import type * as ReactTypes from 'react';
44-
import type { Reference } from '@apollo/client/cache';
45-
import type { Reference as Reference_2 } from '@apollo/client';
4644
import type { RefetchFunction } from '@apollo/client/react/internal';
4745
import type { RefetchWritePolicy } from '@apollo/client';
48-
import type { StoreObject } from '@apollo/client/cache';
49-
import type { StoreObject as StoreObject_2 } from '@apollo/client';
5046
import type { SubscribeToMoreFunction } from '@apollo/client';
5147
import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
5248
import type { TypedDocumentNode as TypedDocumentNode_2 } from '@apollo/client';
@@ -87,9 +83,6 @@ export type BackgroundQueryHookOptions<TData = unknown, TVariables extends Opera
8783
// @public
8884
export function createQueryPreloader(client: ApolloClient): PreloadQueryFunction;
8985

90-
// @public (undocumented)
91-
type From<TData> = StoreObject_2 | Reference_2 | FragmentType<NoInfer_2<TData>> | string | null;
92-
9386
// @public (undocumented)
9487
export function getApolloContext(): ReactTypes.Context<ApolloContextValue>;
9588

@@ -388,6 +381,21 @@ export namespace useBackgroundQuery {
388381
// @public @deprecated (undocumented)
389382
export type UseBackgroundQueryResult<TData = unknown, TVariables extends OperationVariables = OperationVariables> = useBackgroundQuery.Result<TData, TVariables>;
390383

384+
// @public
385+
export function useFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useFragment.Options<TData, TVariables> & {
386+
from: Array<NonNullable<useFragment.FromValue<TData>>>;
387+
}): useFragment.Result<Array<TData>>;
388+
389+
// @public
390+
export function useFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useFragment.Options<TData, TVariables> & {
391+
from: Array<null>;
392+
}): useFragment.Result<Array<null>>;
393+
394+
// @public
395+
export function useFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useFragment.Options<TData, TVariables> & {
396+
from: Array<useFragment.FromValue<TData>>;
397+
}): useFragment.Result<Array<TData | null>>;
398+
391399
// @public
392400
export function useFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useFragment.Options<TData, TVariables>): useFragment.Result<TData>;
393401

@@ -421,23 +429,26 @@ export namespace useFragment {
421429
export namespace DocumentationTypes {
422430
export function useFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>({ fragment, from, fragmentName, variables, optimistic, client, }: useFragment.Options<TData, TVariables>): useFragment.Result<TData>;
423431
}
432+
export type FromValue<TData> = ApolloCache_2.WatchFragmentFromValue<TData>;
424433
// (undocumented)
425434
export interface Options<TData, TVariables extends OperationVariables> {
426435
client?: ApolloClient;
427436
fragment: DocumentNode_2 | TypedDocumentNode_2<TData, TVariables>;
428437
fragmentName?: string;
429-
from: StoreObject | Reference | FragmentType<NoInfer_2<TData>> | string | null;
438+
from: useFragment.FromValue<TData> | Array<useFragment.FromValue<TData>>;
430439
optimistic?: boolean;
431440
variables?: NoInfer_2<TVariables>;
432441
}
433442
// (undocumented)
434443
export type Result<TData> = ({
435444
complete: true;
436445
missing?: never;
437-
} & GetDataState<MaybeMasked_2<TData>, "complete">) | ({
446+
} & GetDataState<MaybeMasked_2<TData>, "complete">) | {
438447
complete: false;
439448
missing?: MissingTree;
440-
} & GetDataState<MaybeMasked_2<TData>, "partial">);
449+
data: TData extends Array<infer TItem> ? Array<DataValue.Partial<TItem> | null> : DataValue.Partial<TData>;
450+
dataState: "partial";
451+
};
441452
}
442453

443454
// @public @deprecated (undocumented)
@@ -912,9 +923,24 @@ export namespace useSubscription {
912923
}
913924
}
914925

926+
// @public
927+
export function useSuspenseFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables> & {
928+
from: Array<NonNullable<useSuspenseFragment.FromValue<TData>>>;
929+
}): useSuspenseFragment.Result<Array<TData>>;
930+
931+
// @public
932+
export function useSuspenseFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables> & {
933+
from: Array<null>;
934+
}): useSuspenseFragment.Result<Array<null>>;
935+
936+
// @public
937+
export function useSuspenseFragment<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables> & {
938+
from: Array<useSuspenseFragment.FromValue<TData>>;
939+
}): useSuspenseFragment.Result<Array<TData | null>>;
940+
915941
// @public
916942
export function useSuspenseFragment<TData, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables> & {
917-
from: NonNullable<From<TData>>;
943+
from: NonNullable<useSuspenseFragment.FromValue<TData>>;
918944
}): useSuspenseFragment.Result<TData>;
919945

920946
// @public
@@ -924,7 +950,7 @@ export function useSuspenseFragment<TData, TVariables extends OperationVariables
924950

925951
// @public
926952
export function useSuspenseFragment<TData, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables> & {
927-
from: From<TData>;
953+
from: useSuspenseFragment.FromValue<TData>;
928954
}): useSuspenseFragment.Result<TData | null>;
929955

930956
// @public
@@ -939,7 +965,7 @@ export namespace useSuspenseFragment {
939965
export type Options<TData, TVariables extends OperationVariables> = {
940966
fragment: DocumentNode_2 | TypedDocumentNode_2<TData, TVariables>;
941967
fragmentName?: string;
942-
from: From<TData>;
968+
from: useSuspenseFragment.FromValue<TData> | Array<useSuspenseFragment.FromValue<TData>>;
943969
optimistic?: boolean;
944970
client?: ApolloClient;
945971
};
@@ -966,6 +992,7 @@ export namespace useSuspenseFragment {
966992
export namespace DocumentationTypes {
967993
export function useSuspenseFragment<TData, TVariables extends OperationVariables = OperationVariables>(options: useSuspenseFragment.Options<TData, TVariables>): useSuspenseFragment.Result<TData>;
968994
}
995+
export type FromValue<TData> = ApolloCache_2.WatchFragmentFromValue<TData>;
969996
// (undocumented)
970997
export type Options<TData, TVariables extends OperationVariables> = Base.Options<TData, TVariables> & VariablesOption<NoInfer_2<TVariables>>;
971998
// (undocumented)
@@ -1088,10 +1115,6 @@ export namespace useSuspenseQuery {
10881115
// @public @deprecated (undocumented)
10891116
export type UseSuspenseQueryResult<TData = unknown, TVariables extends OperationVariables = OperationVariables> = useSuspenseQuery.Result<TData, TVariables>;
10901117

1091-
// Warnings were encountered during analysis:
1092-
//
1093-
// src/react/hooks/useSuspenseFragment.ts:111:5 - (ae-forgotten-export) The symbol "From" needs to be exported by the entry point index.d.ts
1094-
10951118
// (No @packageDocumentation comment for this package)
10961119

10971120
```

0 commit comments

Comments
 (0)