From 679dba2ca47d859ed2be5441f12eca3ca72ceea1 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Tue, 21 Oct 2025 21:00:50 +0900 Subject: [PATCH 1/3] Rename `onlyComplete()` into `onlyCompleteData()` Because it communicates better that it is about the data, and not the stream being completed. `onlyComplete()` will be dropped in the next major version. --- .changeset/rare-mangos-act.md | 10 ++++++++++ packages/apollo-angular/src/index.ts | 2 +- .../src/{only-complete.ts => only-complete-data.ts} | 9 +++++++-- ...nly-complete.spec.ts => only-complete-data.spec.ts} | 6 +++--- .../demo/src/app/pages/movie/movie-page.component.ts | 4 ++-- .../demo/src/app/pages/movies/movies-page.component.ts | 4 ++-- 6 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 .changeset/rare-mangos-act.md rename packages/apollo-angular/src/{only-complete.ts => only-complete-data.ts} (85%) rename packages/apollo-angular/testing/tests/{only-complete.spec.ts => only-complete-data.spec.ts} (91%) diff --git a/.changeset/rare-mangos-act.md b/.changeset/rare-mangos-act.md new file mode 100644 index 000000000..369ad73cf --- /dev/null +++ b/.changeset/rare-mangos-act.md @@ -0,0 +1,10 @@ +--- +'apollo-angular': patch +--- + +Rename `onlyComplete()` into `onlyCompleteData()` + +Because it communicates better that it is about the data, and not the +stream being completed. + +`onlyComplete()` will be dropped in the next major version. diff --git a/packages/apollo-angular/src/index.ts b/packages/apollo-angular/src/index.ts index 2cf00e6f6..2108ba5c6 100644 --- a/packages/apollo-angular/src/index.ts +++ b/packages/apollo-angular/src/index.ts @@ -8,4 +8,4 @@ export { Subscription } from './subscription'; export { APOLLO_OPTIONS, APOLLO_NAMED_OPTIONS, APOLLO_FLAGS } from './tokens'; export type { Flags, NamedOptions, ResultOf, VariablesOf } from './types'; export { gql } from './gql'; -export { onlyComplete } from './only-complete'; +export { onlyCompleteData, onlyComplete } from './only-complete-data'; diff --git a/packages/apollo-angular/src/only-complete.ts b/packages/apollo-angular/src/only-complete-data.ts similarity index 85% rename from packages/apollo-angular/src/only-complete.ts rename to packages/apollo-angular/src/only-complete-data.ts index b3bc8cbd5..37756e4ac 100644 --- a/packages/apollo-angular/src/only-complete.ts +++ b/packages/apollo-angular/src/only-complete-data.ts @@ -19,13 +19,13 @@ import type { ObservableQuery } from '@apollo/client/core'; * notifyOnNetworkStatusChange: false, // Adding this will save CPU cycles * }) * .valueChanges - * .pipe(onlyComplete()) + * .pipe(onlyCompleteData()) * .subscribe(result => { * // Do something with complete result * }); * ``` */ -export function onlyComplete(): OperatorFunction< +export function onlyCompleteData(): OperatorFunction< ObservableQuery.Result, ObservableQuery.Result > { @@ -34,3 +34,8 @@ export function onlyComplete(): OperatorFunction< result.dataState === 'complete', ); } + +/** + * @deprecated Use `onlyCompleteData()` instead. + */ +export const onlyComplete = onlyCompleteData; diff --git a/packages/apollo-angular/testing/tests/only-complete.spec.ts b/packages/apollo-angular/testing/tests/only-complete-data.spec.ts similarity index 91% rename from packages/apollo-angular/testing/tests/only-complete.spec.ts rename to packages/apollo-angular/testing/tests/only-complete-data.spec.ts index dfb9689e6..9fe0e1a4e 100644 --- a/packages/apollo-angular/testing/tests/only-complete.spec.ts +++ b/packages/apollo-angular/testing/tests/only-complete-data.spec.ts @@ -1,4 +1,4 @@ -import { onlyComplete } from 'apollo-angular'; +import { onlyCompleteData } from 'apollo-angular'; import { Subject } from 'rxjs'; import { describe, expect, test } from 'vitest'; import { NetworkStatus, ObservableQuery } from '@apollo/client/core'; @@ -9,14 +9,14 @@ interface Result { }; } -describe('onlyComplete', () => { +describe('onlyCompleteData', () => { let theUser: Result['user'] | null = null; let count = 0; test('should receive only complete results', () => new Promise(done => { const b = new Subject>(); - b.pipe(onlyComplete()).subscribe({ + b.pipe(onlyCompleteData()).subscribe({ next: result => { count++; theUser = result.data.user; diff --git a/packages/demo/src/app/pages/movie/movie-page.component.ts b/packages/demo/src/app/pages/movie/movie-page.component.ts index 94e841b31..25aacc2b1 100644 --- a/packages/demo/src/app/pages/movie/movie-page.component.ts +++ b/packages/demo/src/app/pages/movie/movie-page.component.ts @@ -1,4 +1,4 @@ -import { Apollo, gql, onlyComplete } from 'apollo-angular'; +import { Apollo, gql, onlyCompleteData } from 'apollo-angular'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { AsyncPipe } from '@angular/common'; @@ -72,7 +72,7 @@ export class MoviePageComponent implements OnInit { notifyOnNetworkStatusChange: false, }) .valueChanges.pipe( - onlyComplete(), + onlyCompleteData(), map(result => result.data.film), ); } diff --git a/packages/demo/src/app/pages/movies/movies-page.component.ts b/packages/demo/src/app/pages/movies/movies-page.component.ts index 0ad79a82d..220936707 100644 --- a/packages/demo/src/app/pages/movies/movies-page.component.ts +++ b/packages/demo/src/app/pages/movies/movies-page.component.ts @@ -1,4 +1,4 @@ -import { Apollo, gql, onlyComplete } from 'apollo-angular'; +import { Apollo, gql, onlyCompleteData } from 'apollo-angular'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { AsyncPipe } from '@angular/common'; @@ -59,7 +59,7 @@ export class MoviesPageComponent implements OnInit { notifyOnNetworkStatusChange: false, }) .valueChanges.pipe( - onlyComplete(), + onlyCompleteData(), map(result => result.data.allFilms.films), ); } From d21e7f90de50d0b7b2afc3692b8b569803209ea5 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Wed, 22 Oct 2025 11:47:22 +0900 Subject: [PATCH 2/3] New `onlyCompleteFragment()` (#2382) Same as `onlyCompleteData()` but for `Apollo.watchFragment()`. --- .changeset/strong-carrots-stare.md | 7 +++ packages/apollo-angular/src/index.ts | 2 +- .../apollo-angular/src/only-complete-data.ts | 19 +++++- .../testing/tests/only-complete-data.spec.ts | 61 ++++++++++++++++++- 4 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 .changeset/strong-carrots-stare.md diff --git a/.changeset/strong-carrots-stare.md b/.changeset/strong-carrots-stare.md new file mode 100644 index 000000000..72d3d5506 --- /dev/null +++ b/.changeset/strong-carrots-stare.md @@ -0,0 +1,7 @@ +--- +'apollo-angular': minor +--- + +New `onlyCompleteFragment()` + +Same as `onlyCompleteData()` but for `Apollo.watchFragment()`. diff --git a/packages/apollo-angular/src/index.ts b/packages/apollo-angular/src/index.ts index 2108ba5c6..2e09ff8dc 100644 --- a/packages/apollo-angular/src/index.ts +++ b/packages/apollo-angular/src/index.ts @@ -8,4 +8,4 @@ export { Subscription } from './subscription'; export { APOLLO_OPTIONS, APOLLO_NAMED_OPTIONS, APOLLO_FLAGS } from './tokens'; export type { Flags, NamedOptions, ResultOf, VariablesOf } from './types'; export { gql } from './gql'; -export { onlyCompleteData, onlyComplete } from './only-complete-data'; +export { onlyCompleteData, onlyComplete, onlyCompleteFragment } from './only-complete-data'; diff --git a/packages/apollo-angular/src/only-complete-data.ts b/packages/apollo-angular/src/only-complete-data.ts index 37756e4ac..4d5bd3b93 100644 --- a/packages/apollo-angular/src/only-complete-data.ts +++ b/packages/apollo-angular/src/only-complete-data.ts @@ -1,5 +1,15 @@ import { filter, type OperatorFunction } from 'rxjs'; -import type { ObservableQuery } from '@apollo/client/core'; +import type { ApolloClient, GetDataState, ObservableQuery } from '@apollo/client/core'; + +type CompleteFragment = { + complete: true; + missing?: never; +} & GetDataState; + +type ForWatchFragment = OperatorFunction< + ApolloClient.WatchFragmentResult, + CompleteFragment +>; /** * Filter emitted results to only receive results that are complete (`result.dataState === 'complete'`). @@ -39,3 +49,10 @@ export function onlyCompleteData(): OperatorFunction< * @deprecated Use `onlyCompleteData()` instead. */ export const onlyComplete = onlyCompleteData; + +/** + * Same as `onlyCompleteData()` but for `Apollo.watchFragment()`. + */ +export function onlyCompleteFragment(): ForWatchFragment { + return filter((result): result is CompleteFragment => result.dataState === 'complete'); +} diff --git a/packages/apollo-angular/testing/tests/only-complete-data.spec.ts b/packages/apollo-angular/testing/tests/only-complete-data.spec.ts index 9fe0e1a4e..98651fe6a 100644 --- a/packages/apollo-angular/testing/tests/only-complete-data.spec.ts +++ b/packages/apollo-angular/testing/tests/only-complete-data.spec.ts @@ -1,7 +1,9 @@ -import { onlyCompleteData } from 'apollo-angular'; -import { Subject } from 'rxjs'; +import { Apollo, gql, onlyCompleteData, onlyCompleteFragment, provideApollo } from 'apollo-angular'; +import { map, Subject } from 'rxjs'; import { describe, expect, test } from 'vitest'; -import { NetworkStatus, ObservableQuery } from '@apollo/client/core'; +import { TestBed } from '@angular/core/testing'; +import { InMemoryCache, NetworkStatus, type ObservableQuery } from '@apollo/client/core'; +import { MockLink } from '@apollo/client/testing'; interface Result { user: { @@ -9,6 +11,22 @@ interface Result { }; } +const query = gql>` + query User { + user { + name + } + } +`; + +const fragment = gql>` + fragment UserFragment on User { + user { + name + } + } +`; + describe('onlyCompleteData', () => { let theUser: Result['user'] | null = null; let count = 0; @@ -54,4 +72,41 @@ describe('onlyCompleteData', () => { b.complete(); })); + + test('should compile', () => { + TestBed.configureTestingModule({ + providers: [ + provideApollo(() => { + return { + link: new MockLink([]), + cache: new InMemoryCache(), + }; + }), + ], + }); + + const apollo = TestBed.inject(Apollo); + + apollo + .watchQuery({ + query: query, + }) + .valueChanges.pipe( + onlyCompleteData(), + map(result => result.data.user.name), + ); + + apollo + .watchFragment({ + fragment: fragment, + from: { + __typename: 'User', + id: 1, + }, + }) + .pipe( + onlyCompleteFragment(), + map(result => result.data.user.name), + ); + }); }); From 8bf6947c37f552c69a3f754eba453325623e64d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Oct 2025 02:48:30 +0000 Subject: [PATCH 3/3] chore(release): update monorepo packages versions --- .changeset/rare-mangos-act.md | 10 ---------- .changeset/strong-carrots-stare.md | 7 ------- packages/apollo-angular/CHANGELOG.md | 21 +++++++++++++++++++++ packages/apollo-angular/package.json | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) delete mode 100644 .changeset/rare-mangos-act.md delete mode 100644 .changeset/strong-carrots-stare.md diff --git a/.changeset/rare-mangos-act.md b/.changeset/rare-mangos-act.md deleted file mode 100644 index 369ad73cf..000000000 --- a/.changeset/rare-mangos-act.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'apollo-angular': patch ---- - -Rename `onlyComplete()` into `onlyCompleteData()` - -Because it communicates better that it is about the data, and not the -stream being completed. - -`onlyComplete()` will be dropped in the next major version. diff --git a/.changeset/strong-carrots-stare.md b/.changeset/strong-carrots-stare.md deleted file mode 100644 index 72d3d5506..000000000 --- a/.changeset/strong-carrots-stare.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'apollo-angular': minor ---- - -New `onlyCompleteFragment()` - -Same as `onlyCompleteData()` but for `Apollo.watchFragment()`. diff --git a/packages/apollo-angular/CHANGELOG.md b/packages/apollo-angular/CHANGELOG.md index 5267c24ec..2b663eadd 100644 --- a/packages/apollo-angular/CHANGELOG.md +++ b/packages/apollo-angular/CHANGELOG.md @@ -1,5 +1,26 @@ # Change log +## 12.1.0 + +### Minor Changes + +- [#2382](https://github.com/the-guild-org/apollo-angular/pull/2382) + [`d21e7f9`](https://github.com/the-guild-org/apollo-angular/commit/d21e7f90de50d0b7b2afc3692b8b569803209ea5) + Thanks [@PowerKiKi](https://github.com/PowerKiKi)! - New `onlyCompleteFragment()` + + Same as `onlyCompleteData()` but for `Apollo.watchFragment()`. + +### Patch Changes + +- [#2381](https://github.com/the-guild-org/apollo-angular/pull/2381) + [`679dba2`](https://github.com/the-guild-org/apollo-angular/commit/679dba2ca47d859ed2be5441f12eca3ca72ceea1) + Thanks [@PowerKiKi](https://github.com/PowerKiKi)! - Rename `onlyComplete()` into + `onlyCompleteData()` + + Because it communicates better that it is about the data, and not the stream being completed. + + `onlyComplete()` will be dropped in the next major version. + ## 12.0.0 ### Major Changes diff --git a/packages/apollo-angular/package.json b/packages/apollo-angular/package.json index 365614cc7..806e04599 100644 --- a/packages/apollo-angular/package.json +++ b/packages/apollo-angular/package.json @@ -1,6 +1,6 @@ { "name": "apollo-angular", - "version": "12.0.0", + "version": "12.1.0", "type": "module", "description": "Use your GraphQL data in your Angular app, with the Apollo Client", "repository": {