Skip to content

Commit d21e7f9

Browse files
authored
New onlyCompleteFragment() (#2382)
Same as `onlyCompleteData()` but for `Apollo.watchFragment()`.
1 parent bbb6315 commit d21e7f9

File tree

4 files changed

+84
-5
lines changed

4 files changed

+84
-5
lines changed

.changeset/strong-carrots-stare.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'apollo-angular': minor
3+
---
4+
5+
New `onlyCompleteFragment()`
6+
7+
Same as `onlyCompleteData()` but for `Apollo.watchFragment()`.

packages/apollo-angular/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ export { Subscription } from './subscription';
88
export { APOLLO_OPTIONS, APOLLO_NAMED_OPTIONS, APOLLO_FLAGS } from './tokens';
99
export type { Flags, NamedOptions, ResultOf, VariablesOf } from './types';
1010
export { gql } from './gql';
11-
export { onlyCompleteData, onlyComplete } from './only-complete-data';
11+
export { onlyCompleteData, onlyComplete, onlyCompleteFragment } from './only-complete-data';

packages/apollo-angular/src/only-complete-data.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import { filter, type OperatorFunction } from 'rxjs';
2-
import type { ObservableQuery } from '@apollo/client/core';
2+
import type { ApolloClient, GetDataState, ObservableQuery } from '@apollo/client/core';
3+
4+
type CompleteFragment<TData> = {
5+
complete: true;
6+
missing?: never;
7+
} & GetDataState<TData, 'complete'>;
8+
9+
type ForWatchFragment<TData> = OperatorFunction<
10+
ApolloClient.WatchFragmentResult<TData>,
11+
CompleteFragment<TData>
12+
>;
313

414
/**
515
* Filter emitted results to only receive results that are complete (`result.dataState === 'complete'`).
@@ -39,3 +49,10 @@ export function onlyCompleteData<TData>(): OperatorFunction<
3949
* @deprecated Use `onlyCompleteData()` instead.
4050
*/
4151
export const onlyComplete = onlyCompleteData;
52+
53+
/**
54+
* Same as `onlyCompleteData()` but for `Apollo.watchFragment()`.
55+
*/
56+
export function onlyCompleteFragment<TData>(): ForWatchFragment<TData> {
57+
return filter((result): result is CompleteFragment<TData> => result.dataState === 'complete');
58+
}

packages/apollo-angular/testing/tests/only-complete-data.spec.ts

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
1-
import { onlyCompleteData } from 'apollo-angular';
2-
import { Subject } from 'rxjs';
1+
import { Apollo, gql, onlyCompleteData, onlyCompleteFragment, provideApollo } from 'apollo-angular';
2+
import { map, Subject } from 'rxjs';
33
import { describe, expect, test } from 'vitest';
4-
import { NetworkStatus, ObservableQuery } from '@apollo/client/core';
4+
import { TestBed } from '@angular/core/testing';
5+
import { InMemoryCache, NetworkStatus, type ObservableQuery } from '@apollo/client/core';
6+
import { MockLink } from '@apollo/client/testing';
57

68
interface Result {
79
user: {
810
name: string;
911
};
1012
}
1113

14+
const query = gql<Result, Record<string, never>>`
15+
query User {
16+
user {
17+
name
18+
}
19+
}
20+
`;
21+
22+
const fragment = gql<Result, Record<string, never>>`
23+
fragment UserFragment on User {
24+
user {
25+
name
26+
}
27+
}
28+
`;
29+
1230
describe('onlyCompleteData', () => {
1331
let theUser: Result['user'] | null = null;
1432
let count = 0;
@@ -54,4 +72,41 @@ describe('onlyCompleteData', () => {
5472

5573
b.complete();
5674
}));
75+
76+
test('should compile', () => {
77+
TestBed.configureTestingModule({
78+
providers: [
79+
provideApollo(() => {
80+
return {
81+
link: new MockLink([]),
82+
cache: new InMemoryCache(),
83+
};
84+
}),
85+
],
86+
});
87+
88+
const apollo = TestBed.inject(Apollo);
89+
90+
apollo
91+
.watchQuery({
92+
query: query,
93+
})
94+
.valueChanges.pipe(
95+
onlyCompleteData(),
96+
map(result => result.data.user.name),
97+
);
98+
99+
apollo
100+
.watchFragment({
101+
fragment: fragment,
102+
from: {
103+
__typename: 'User',
104+
id: 1,
105+
},
106+
})
107+
.pipe(
108+
onlyCompleteFragment(),
109+
map(result => result.data.user.name),
110+
);
111+
});
57112
});

0 commit comments

Comments
 (0)