Skip to content

Commit cfe60e0

Browse files
authored
Merge pull request #410 from OpenAPI-Qraft/fix/get-mutation-cache-access
fix(api-client): enhance callback typing for mutation state and fix overloads in createAPIClient
2 parents 79288db + 685eaa5 commit cfe60e0

9 files changed

Lines changed: 87 additions & 13 deletions

File tree

.changeset/poor-pugs-fix.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
'@openapi-qraft/tanstack-query-react-plugin': patch
3+
'@openapi-qraft/react': patch
4+
---
5+
6+
Fixed callback typing and client factory overload generation for partial callback clients.
7+
8+
- Added `getMutationCache` to mutation state callback typing in `qraftAPIClient`, so it is available on generated
9+
clients when relevant callbacks are provided.
10+
- Fixed generated `createAPIClient` operation-client overloads to return `APIBasicQueryClientServices<..., Callbacks>`
11+
and `APIBasicClientServices<..., Callbacks>` (instead of incorrectly locking to `DefaultCallbacks`) for partial
12+
callback configurations.

packages/react-client/redocly.yaml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,18 @@ apis:
7575
callbacks: all
7676
createInternalReactAPIClient:
7777
services: none
78-
callbacks: ['setQueryData', 'getQueryData', 'getQueryKey', 'getInfiniteQueryKey']
78+
callbacks:
79+
[
80+
'setQueryData',
81+
'getQueryData',
82+
'getQueryKey',
83+
'getInfiniteQueryKey',
84+
'getMutationCache',
85+
]
7986
operation-parameters-type-wrapper:
8087
'get /files/**':
8188
type: 'ParametersWrapper'
8289
import: '../../type-overrides/parameters-wrapper.js'
8390
'delete /approval_policies/{approval_policy_id}':
8491
type: 'ParametersWrapper'
85-
import: '../../type-overrides/parameters-wrapper.js'
92+
import: '../../type-overrides/parameters-wrapper.js'

packages/react-client/src/qraftAPIClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ type MutationOperationStateHookCallbacks = Extract<
447447
>;
448448

449449
type MutationOperationStateCallbacks =
450-
| Extract<keyof ServiceMethods, 'isMutating'>
450+
| Extract<keyof ServiceMethods, 'getMutationCache' | 'isMutating'>
451451
| MutationOperationStateHookCallbacks;
452452

453453
type InvokeOperationCallback = Extract<
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* eslint-disable @typescript-eslint/no-unused-expressions */
2+
3+
import type { CreateAPIBasicQueryClientOptions } from '@openapi-qraft/react';
4+
import { requestFn } from '@openapi-qraft/react';
5+
import * as callbacks from '@openapi-qraft/react/callbacks/index';
6+
import { QueryClient } from '@tanstack/react-query';
7+
import {
8+
createInternalReactAPIClient as createAPIOperationClient,
9+
services,
10+
} from './fixtures/files-api/index.js';
11+
12+
const queryClient = new QueryClient();
13+
14+
// Default callbacks from redocly config should expose getMutationCache for mutation operations.
15+
const apiWithDefaultCallbacks = createAPIOperationClient(services, {
16+
queryClient,
17+
});
18+
19+
apiWithDefaultCallbacks.files.deleteFiles.getMutationCache();
20+
// @ts-expect-error - query operations don't expose getMutationCache
21+
apiWithDefaultCallbacks.files.getFileList.getMutationCache();
22+
23+
// For basic query options, provided callbacks should define the available methods.
24+
type MutationCacheOnlyCallbacks = {
25+
getMutationCache: typeof callbacks.getMutationCache;
26+
};
27+
28+
const customBasicQueryCallbacks: MutationCacheOnlyCallbacks = {
29+
getMutationCache: callbacks.getMutationCache,
30+
};
31+
32+
const basicQueryOptions: CreateAPIBasicQueryClientOptions = { queryClient };
33+
34+
const apiWithCustomBasicQueryCallbacksExplicit = createAPIOperationClient<
35+
typeof services,
36+
MutationCacheOnlyCallbacks
37+
>(services, basicQueryOptions, customBasicQueryCallbacks);
38+
39+
apiWithCustomBasicQueryCallbacksExplicit.files.deleteFiles.getMutationCache();
40+
41+
// getMutationCache should remain unavailable without queryClient.
42+
const apiWithoutQueryClient = createAPIOperationClient<
43+
typeof services,
44+
MutationCacheOnlyCallbacks
45+
>(
46+
services,
47+
{
48+
requestFn,
49+
baseUrl: 'https://example.com',
50+
},
51+
customBasicQueryCallbacks
52+
);
53+
54+
// @ts-expect-error - getMutationCache requires queryClient in options
55+
apiWithoutQueryClient.files.deleteFiles.getMutationCache();

packages/tanstack-query-react-plugin/src/__snapshots__/create-api-client-fn/multiple-clients-create-api-operation-client.ts.snapshot.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const defaultCallbacks = {
1313
} as const;
1414
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>>(services: Services, options: CreateAPIQueryClientOptions, callbacks: AllCallbacks): APIDefaultQueryClientServices<Services>;
1515
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIQueryClientOptions, callbacks?: Callbacks): APIQueryClientServices<Services, Callbacks>;
16-
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicQueryClientOptions, callbacks?: Callbacks): APIBasicQueryClientServices<Services, DefaultCallbacks>;
17-
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicClientOptions, callbacks?: Callbacks): APIBasicClientServices<Services, DefaultCallbacks>;
16+
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicQueryClientOptions, callbacks?: Callbacks): APIBasicQueryClientServices<Services, Callbacks>;
17+
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicClientOptions, callbacks?: Callbacks): APIBasicClientServices<Services, Callbacks>;
1818
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, callbacks?: Callbacks): APIUtilityClientServices<Services, Callbacks>;
1919
export function createAPIOperationClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, callbacksOrOptions?: CreateAPIClientOptions | Callbacks, callbacks: Callbacks = defaultCallbacks as Callbacks): APIDefaultQueryClientServices<Services> | APIQueryClientServices<Services, Callbacks> | APIBasicQueryClientServices<Services, Callbacks> | APIBasicClientServices<Services, Callbacks> | APIUtilityClientServices<Services, Callbacks> {
2020
if (!callbacksOrOptions)

packages/tanstack-query-react-plugin/src/__snapshots__/create-api-client-fn/none-createAPIClient.ts.snapshot.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import { qraftAPIClient } from "@openapi-qraft/react";
99
const defaultCallbacks = {} as const;
1010
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>>(services: Services, options: CreateAPIQueryClientOptions, callbacks: AllCallbacks): APIDefaultQueryClientServices<Services>;
1111
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIQueryClientOptions, callbacks: Callbacks): APIQueryClientServices<Services, Callbacks>;
12-
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicQueryClientOptions, callbacks: Callbacks): APIBasicQueryClientServices<Services, DefaultCallbacks>;
13-
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicClientOptions, callbacks: Callbacks): APIBasicClientServices<Services, DefaultCallbacks>;
12+
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicQueryClientOptions, callbacks: Callbacks): APIBasicQueryClientServices<Services, Callbacks>;
13+
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, options: CreateAPIBasicClientOptions, callbacks: Callbacks): APIBasicClientServices<Services, Callbacks>;
1414
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, callbacks: Callbacks): APIUtilityClientServices<Services, Callbacks>;
1515
export function createAPIClient<Services extends UnionServiceOperationsDeclaration<Services>, Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(services: Services, callbacksOrOptions: CreateAPIClientOptions | Callbacks, callbacks: Callbacks = defaultCallbacks as Callbacks): APIDefaultQueryClientServices<Services> | APIQueryClientServices<Services, Callbacks> | APIBasicQueryClientServices<Services, Callbacks> | APIBasicClientServices<Services, Callbacks> | APIUtilityClientServices<Services, Callbacks> {
1616
if (!callbacksOrOptions)

packages/tanstack-query-react-plugin/src/__snapshots__/create-api-client-fn/specific-hooks-create-api-operation-client.ts.snapshot.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const defaultCallbacks = {
1414
import { services } from "./services/index";
1515
export function createAPIOperationClient(options: CreateAPIQueryClientOptions, callbacks: AllCallbacks): APIDefaultQueryClientServices<Services>;
1616
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIQueryClientOptions, callbacks?: Callbacks): APIQueryClientServices<Services, Callbacks>;
17-
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicQueryClientOptions, callbacks?: Callbacks): APIBasicQueryClientServices<Services, DefaultCallbacks>;
18-
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicClientOptions, callbacks?: Callbacks): APIBasicClientServices<Services, DefaultCallbacks>;
17+
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicQueryClientOptions, callbacks?: Callbacks): APIBasicQueryClientServices<Services, Callbacks>;
18+
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicClientOptions, callbacks?: Callbacks): APIBasicClientServices<Services, Callbacks>;
1919
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(callbacks?: Callbacks): APIUtilityClientServices<Services, Callbacks>;
2020
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(callbacksOrOptions?: CreateAPIClientOptions | Callbacks, callbacks: Callbacks = defaultCallbacks as Callbacks): APIDefaultQueryClientServices<Services> | APIQueryClientServices<Services, Callbacks> | APIBasicQueryClientServices<Services, Callbacks> | APIBasicClientServices<Services, Callbacks> | APIUtilityClientServices<Services, Callbacks> {
2121
if (!callbacksOrOptions)

packages/tanstack-query-react-plugin/src/__snapshots__/override-import-type/create-api-operation-client.ts.snapshot.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ const defaultCallbacks = {} as const;
1111
import { services } from "./services/index";
1212
export function createAPIOperationClient(options: CreateAPIQueryClientOptions, callbacks: AllCallbacks): APIDefaultQueryClientServices<Services>;
1313
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIQueryClientOptions, callbacks: Callbacks): APIQueryClientServices<Services, Callbacks>;
14-
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicQueryClientOptions, callbacks: Callbacks): APIBasicQueryClientServices<Services, DefaultCallbacks>;
15-
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicClientOptions, callbacks: Callbacks): APIBasicClientServices<Services, DefaultCallbacks>;
14+
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicQueryClientOptions, callbacks: Callbacks): APIBasicQueryClientServices<Services, Callbacks>;
15+
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(options: CreateAPIBasicClientOptions, callbacks: Callbacks): APIBasicClientServices<Services, Callbacks>;
1616
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(callbacks: Callbacks): APIUtilityClientServices<Services, Callbacks>;
1717
export function createAPIOperationClient<Callbacks extends Partial<AllCallbacks> = DefaultCallbacks>(callbacksOrOptions: CreateAPIClientOptions | Callbacks, callbacks: Callbacks = defaultCallbacks as Callbacks): APIDefaultQueryClientServices<Services> | APIQueryClientServices<Services, Callbacks> | APIBasicQueryClientServices<Services, Callbacks> | APIBasicClientServices<Services, Callbacks> | APIUtilityClientServices<Services, Callbacks> {
1818
if (!callbacksOrOptions)

packages/tanstack-query-react-plugin/src/ts-factory/getCreateAPIClientFactory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ const getCreateOperationClientFunctionFactory = ({
495495
),
496496
factory.createTypeReferenceNode(
497497
factory.createIdentifier(
498-
shouldImportAllCallbacks ? 'AllCallbacks' : 'DefaultCallbacks'
498+
shouldImportAllCallbacks ? 'AllCallbacks' : 'Callbacks'
499499
),
500500
undefined
501501
),
@@ -596,7 +596,7 @@ const getCreateOperationClientFunctionFactory = ({
596596
),
597597
factory.createTypeReferenceNode(
598598
factory.createIdentifier(
599-
shouldImportAllCallbacks ? 'AllCallbacks' : 'DefaultCallbacks'
599+
shouldImportAllCallbacks ? 'AllCallbacks' : 'Callbacks'
600600
),
601601
undefined
602602
),

0 commit comments

Comments
 (0)