Skip to content

Commit 2e2b671

Browse files
authored
Merge pull request #293 from OpenAPI-Qraft/refactor/query-method-parameters-usage
feat: Allow the use of fetch* query methods without optional parameters when appropriate
2 parents b5fcd6e + 1741d74 commit 2e2b671

13 files changed

+304
-75
lines changed

.changeset/cyan-poems-draw.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@openapi-qraft/tanstack-query-react-plugin': patch
3+
'@openapi-qraft/tanstack-query-react-types': patch
4+
---
5+
6+
Allow the use of fetch\* query methods without optional parameters when appropriate.

packages/react-client/src/tests/createAPIClient.const-parameters.types-test.ts

Lines changed: 147 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,29 @@ import { QueryClient } from '@tanstack/query-core';
22
import { requestFn } from '../index.js';
33
import { createAPIClient } from './fixtures/api/index.js';
44

5-
const qraft = createAPIClient({
6-
queryClient: new QueryClient(),
7-
requestFn: requestFn,
8-
baseUrl: 'https://example.com',
9-
});
5+
/**
6+
* Tests for correct parameter usage
7+
*/
108

9+
// Create client with only QueryClient
10+
const createBasicClient = () =>
11+
createAPIClient({
12+
queryClient: new QueryClient(),
13+
});
14+
15+
// Create client with a full set of parameters
16+
const createFullClient = () =>
17+
createAPIClient({
18+
queryClient: new QueryClient(),
19+
requestFn: requestFn,
20+
baseUrl: 'https://example.com',
21+
});
22+
23+
// 1. Inline parameters
1124
{
12-
// Normal inline parameters
25+
const qraft = createBasicClient();
26+
27+
// 1.1 Regular inline parameters
1328
qraft.files.getFiles.setQueryData(
1429
{
1530
query: { id__in: ['1', '2'] },
@@ -26,10 +41,8 @@ const qraft = createAPIClient({
2641
'x-monite-version': 'current',
2742
},
2843
});
29-
}
3044

31-
{
32-
// Const inline parameters
45+
// 1.2 Const inline parameters (as const)
3346
qraft.files.getFiles.setQueryData(
3447
{
3548
query: { id__in: ['1', '2'] },
@@ -48,8 +61,10 @@ const qraft = createAPIClient({
4861
} as const);
4962
}
5063

64+
// 2. External mutable parameters
5165
{
52-
// External mutable parameters
66+
const qraft = createFullClient();
67+
5368
const parameters = {
5469
query: { id__in: ['1', '2'] },
5570
header: {
@@ -70,6 +85,10 @@ const qraft = createAPIClient({
7085
initialPageParam: {},
7186
getNextPageParam: () => undefined,
7287
});
88+
qraft.files.getFiles.useSuspenseInfiniteQuery(parameters, {
89+
initialPageParam: {},
90+
getNextPageParam: () => undefined,
91+
});
7392
void qraft.files.getFiles.fetchQuery({ parameters });
7493
void qraft.files.getFiles.fetchInfiniteQuery({
7594
parameters,
@@ -79,8 +98,10 @@ const qraft = createAPIClient({
7998
void qraft.files.getFiles({ parameters });
8099
}
81100

101+
// 3. External const parameters (as const)
82102
{
83-
// External const parameters
103+
const qraft = createFullClient();
104+
84105
const parameters = {
85106
query: { id__in: ['1', '2'] },
86107
header: {
@@ -89,7 +110,11 @@ const qraft = createAPIClient({
89110
} as const;
90111

91112
const data = { query: { id__in: ['1'] } } as const;
113+
const pageParam = {
114+
query: { id__in: ['1'] },
115+
} as const;
92116

117+
// 3.1 getFiles methods
93118
qraft.files.getFiles.setQueryData(parameters, data);
94119
qraft.files.getFiles.setInfiniteQueryData(parameters, (pages) => ({
95120
pages: [...(pages?.pages ?? []), data],
@@ -98,27 +123,69 @@ const qraft = createAPIClient({
98123
qraft.files.getFiles.getQueryData(parameters);
99124
qraft.files.getFiles.useQuery(parameters);
100125
qraft.files.getFiles.useInfiniteQuery(parameters, {
101-
initialPageParam: {},
102-
getNextPageParam: () => undefined,
126+
initialPageParam: pageParam,
127+
getNextPageParam: () => pageParam,
128+
getPreviousPageParam: () => pageParam,
129+
});
130+
qraft.files.getFiles.useSuspenseInfiniteQuery(parameters, {
131+
initialPageParam: pageParam,
132+
getNextPageParam: () => pageParam,
133+
getPreviousPageParam: () => pageParam,
103134
});
104135
void qraft.files.getFiles.fetchQuery({ parameters });
105136
void qraft.files.getFiles.fetchInfiniteQuery({
106137
parameters,
107-
initialPageParam: {},
108-
getNextPageParam: () => undefined,
138+
initialPageParam: pageParam,
139+
getNextPageParam: () => pageParam,
109140
});
110141
void qraft.files.getFiles({ parameters });
142+
143+
// 3.2 findAll methods
144+
void qraft.files.findAll.fetchQuery({ parameters });
145+
void qraft.files.findAll.fetchQuery();
146+
void qraft.files.findAll.fetchQuery({});
147+
148+
qraft.files.findAll.useQuery();
149+
qraft.files.findAll.useInfiniteQuery(parameters, {
150+
initialPageParam: pageParam,
151+
getNextPageParam: () => pageParam,
152+
getPreviousPageParam: () => pageParam,
153+
});
154+
qraft.files.findAll.useSuspenseInfiniteQuery(parameters, {
155+
initialPageParam: pageParam,
156+
getNextPageParam: () => pageParam,
157+
getPreviousPageParam: () => pageParam,
158+
});
159+
void qraft.files.findAll.fetchInfiniteQuery({
160+
pages: 1,
161+
parameters,
162+
getNextPageParam: () => pageParam,
163+
});
164+
void qraft.files.findAll.fetchInfiniteQuery({
165+
pages: 1,
166+
getNextPageParam: () => pageParam,
167+
});
168+
void qraft.files.findAll.fetchInfiniteQuery({});
169+
void qraft.files.findAll.fetchInfiniteQuery();
111170
}
112171

172+
// 4. Tests for useMutation
113173
{
114-
// External const parameters for useMutation
174+
const qraft = createFullClient();
175+
115176
const parameters = { query: { all: true } } as const;
116177
qraft.files.deleteFiles.useMutation(parameters);
117178
void qraft.files.deleteFiles({ parameters });
118179
}
119180

181+
/**
182+
* Tests for incorrect usage (type checking)
183+
*/
184+
185+
// 5. Incorrect parameters
120186
{
121-
// Incorrect usage
187+
const qraft = createBasicClient();
188+
122189
qraft.files.getFiles.setQueryData(
123190
{
124191
// @ts-expect-error - OK, incorrect usage
@@ -152,4 +219,67 @@ const qraft = createAPIClient({
152219
},
153220
} as const
154221
);
222+
223+
const parameters = {
224+
query: { id__in: ['1', '2'] },
225+
header: { 'x-monite-version': '1.0.0' },
226+
} as const;
227+
228+
// @ts-expect-error - OK, incorrect usage (not existing method)
229+
qraft.files.getFiles.useQuery(parameters);
230+
// @ts-expect-error - OK, incorrect usage (not existing method)
231+
qraft.files.getFiles.useInfiniteQuery(parameters, {
232+
initialPageParam: {},
233+
getNextPageParam: () => undefined,
234+
});
235+
// @ts-expect-error - OK, incorrect usage (not existing method)
236+
void qraft.files.getFiles.fetchQuery({ parameters });
237+
// @ts-expect-error - OK, incorrect usage (not existing method)
238+
void qraft.files.getFiles.fetchInfiniteQuery({
239+
parameters,
240+
initialPageParam: {},
241+
getNextPageParam: () => undefined,
242+
});
243+
}
244+
245+
// 6. Incorrect method usage with parameters
246+
{
247+
const qraft = createFullClient();
248+
249+
const parameters = {
250+
query: { id__in: ['1', '2'] },
251+
header: { 'x-monite-version': '1.0.0' },
252+
} as const;
253+
254+
// @ts-expect-error - OK, incorrect usage
255+
void qraft.files.getFiles.fetchInfiniteQuery({ parameters });
256+
// @ts-expect-error - OK, incorrect usage
257+
void qraft.files.getFiles.fetchInfiniteQuery({
258+
// initialPageParam: parameters, // OK, incorrect usage
259+
parameters,
260+
getNextPageParam: () => parameters,
261+
});
262+
263+
// @ts-expect-error - OK, incorrect usage (not existing method)
264+
qraft.files.getFiles.useQuery();
265+
// @ts-expect-error - OK, incorrect usage (not existing method)
266+
qraft.files.getFiles.useInfiniteQuery();
267+
// @ts-expect-error - OK, incorrect usage (not existing method)
268+
void qraft.files.getFiles.fetchQuery({});
269+
// @ts-expect-error - OK, incorrect usage (not existing method)
270+
void qraft.files.getFiles.fetchInfiniteQuery({});
271+
}
272+
273+
// 7. Additional incorrect usage checks
274+
{
275+
const qraft = createFullClient();
276+
277+
const parameters = { query: { id__in: ['1', '2'] } } as const;
278+
279+
// @ts-expect-error - OK, incorrect usage
280+
void qraft.files.findAll.fetchInfiniteQuery({
281+
// getNextPageParam: () => parameters, // OK, incorrect usage
282+
pages: 1,
283+
parameters,
284+
});
155285
}

packages/tanstack-query-react-plugin/src/__snapshots__/explicit-import-extensions/services/ApprovalPoliciesService.ts.snapshot.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,17 @@ export interface ApprovalPoliciesService {
7373
* @summary Get an approval policy by ID
7474
* @description Retrieve a specific approval policy.
7575
*/
76-
fetchInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationFetchInfiniteQueryOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, TPageParam, GetApprovalPoliciesIdError>): Promise<OperationInfiniteData<GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters>>;
76+
fetchInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationFetchInfiniteQueryOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, DeepReadonly<TPageParam>, GetApprovalPoliciesIdError>): Promise<OperationInfiniteData<GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters>>;
7777
/**
7878
* @summary Get an approval policy by ID
7979
* @description Retrieve a specific approval policy.
8080
*/
81-
prefetchInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationFetchInfiniteQueryOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, TPageParam, GetApprovalPoliciesIdError>): Promise<void>;
81+
prefetchInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationFetchInfiniteQueryOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, DeepReadonly<TPageParam>, GetApprovalPoliciesIdError>): Promise<void>;
8282
/**
8383
* @summary Get an approval policy by ID
8484
* @description Retrieve a specific approval policy.
8585
*/
86-
ensureInfiniteQueryData<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationEnsureInfiniteQueryDataOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, TPageParam, GetApprovalPoliciesIdError>): Promise<OperationInfiniteData<GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters>>;
86+
ensureInfiniteQueryData<TPageParam extends GetApprovalPoliciesIdParameters>(options: ServiceOperationEnsureInfiniteQueryDataOptions<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters, DeepReadonly<TPageParam>, GetApprovalPoliciesIdError>): Promise<OperationInfiniteData<GetApprovalPoliciesIdData, GetApprovalPoliciesIdParameters>>;
8787
/**
8888
* @summary Get an approval policy by ID
8989
* @description Retrieve a specific approval policy.
@@ -188,6 +188,8 @@ export interface ApprovalPoliciesService {
188188
* Performs asynchronous data fetching with support for infinite scrolling scenarios.
189189
* Manages paginated data and provides utilities for fetching additional pages.
190190
*
191+
* @summary Get an approval policy by ID
192+
* @description Retrieve a specific approval policy.
191193
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useInfiniteQuery|`useInfiniteQuery(...)` documentation}
192194
*
193195
* @example Infinite Query
@@ -213,11 +215,13 @@ export interface ApprovalPoliciesService {
213215
* fetchNextPage(); // Fetch the next page
214216
* ```
215217
*/
216-
useInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TQueryFnData = GetApprovalPoliciesIdData, TData = OperationInfiniteData<TQueryFnData, GetApprovalPoliciesIdParameters>>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<UndefinedInitialDataInfiniteOptions<TQueryFnData, GetApprovalPoliciesIdError, TData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<TPageParam>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<TQueryFnData, PartialParameters<TPageParam>>): UseInfiniteQueryResult<TData, GetApprovalPoliciesIdError | Error>;
218+
useInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TQueryFnData = GetApprovalPoliciesIdData, TData = OperationInfiniteData<TQueryFnData, GetApprovalPoliciesIdParameters>>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<UndefinedInitialDataInfiniteOptions<TQueryFnData, GetApprovalPoliciesIdError, TData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<DeepReadonly<TPageParam>>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<TQueryFnData, PartialParameters<DeepReadonly<TPageParam>>>): UseInfiniteQueryResult<TData, GetApprovalPoliciesIdError | Error>;
217219
/**
218220
* Performs asynchronous data fetching with support for infinite scrolling scenarios.
219221
* Manages paginated data and provides utilities for fetching additional pages.
220222
*
223+
* @summary Get an approval policy by ID
224+
* @description Retrieve a specific approval policy.
221225
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useInfiniteQuery|`useInfiniteQuery(...)` documentation}
222226
*
223227
* @example Infinite Query
@@ -243,11 +247,13 @@ export interface ApprovalPoliciesService {
243247
* fetchNextPage(); // Fetch the next page
244248
* ```
245249
*/
246-
useInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TQueryFnData = GetApprovalPoliciesIdData, TData = OperationInfiniteData<TQueryFnData, GetApprovalPoliciesIdParameters>>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<DefinedInitialDataInfiniteOptions<TQueryFnData, GetApprovalPoliciesIdError, TData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<TPageParam>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<GetApprovalPoliciesIdData, PartialParameters<TPageParam>>): DefinedUseInfiniteQueryResult<TData, GetApprovalPoliciesIdError | Error>;
250+
useInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TQueryFnData = GetApprovalPoliciesIdData, TData = OperationInfiniteData<TQueryFnData, GetApprovalPoliciesIdParameters>>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<DefinedInitialDataInfiniteOptions<TQueryFnData, GetApprovalPoliciesIdError, TData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<DeepReadonly<TPageParam>>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<GetApprovalPoliciesIdData, PartialParameters<DeepReadonly<TPageParam>>>): DefinedUseInfiniteQueryResult<TData, GetApprovalPoliciesIdError | Error>;
247251
/**
248252
* Monitors the number of queries currently fetching, matching the provided filters.
249253
* Useful for creating loading indicators or performing actions based on active requests.
250254
*
255+
* @summary Get an approval policy by ID
256+
* @description Retrieve a specific approval policy.
251257
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useIsFetching|`useIsFetching(...)` documentation}
252258
* @example Checks the total number of queries fetching from the specified service method,
253259
* both normal and infinite. If no parameters are provided, no filtering is applied.
@@ -406,6 +412,8 @@ export interface ApprovalPoliciesService {
406412
* Manages paginated data and provides utilities for fetching additional pages.
407413
* It functions similarly to `useInfiniteQuery`, but with added support for React Suspense.
408414
*
415+
* @summary Get an approval policy by ID
416+
* @description Retrieve a specific approval policy.
409417
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useSuspenseInfiniteQuery|`useSuspenseInfiniteQuery(...)` documentation}
410418
*
411419
* @example Suspense Infinite Query
@@ -431,7 +439,7 @@ export interface ApprovalPoliciesService {
431439
* fetchNextPage(); // Fetch the next page
432440
* ```
433441
*/
434-
useSuspenseInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TData = GetApprovalPoliciesIdData>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<UseSuspenseInfiniteQueryOptions<GetApprovalPoliciesIdData, GetApprovalPoliciesIdError, OperationInfiniteData<TData, GetApprovalPoliciesIdParameters>, GetApprovalPoliciesIdData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<TPageParam>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<GetApprovalPoliciesIdData, PartialParameters<TPageParam>>): UseSuspenseInfiniteQueryResult<OperationInfiniteData<TData, GetApprovalPoliciesIdParameters>, GetApprovalPoliciesIdError | Error>;
442+
useSuspenseInfiniteQuery<TPageParam extends GetApprovalPoliciesIdParameters, TData = GetApprovalPoliciesIdData>(parameters: ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters> | (DeepReadonly<GetApprovalPoliciesIdParameters>), options: Omit<UseSuspenseInfiniteQueryOptions<GetApprovalPoliciesIdData, GetApprovalPoliciesIdError, OperationInfiniteData<TData, GetApprovalPoliciesIdParameters>, GetApprovalPoliciesIdData, ServiceOperationInfiniteQueryKey<GetApprovalPoliciesIdSchema, GetApprovalPoliciesIdParameters>, PartialParameters<DeepReadonly<TPageParam>>>, "queryKey" | "getPreviousPageParam" | "getNextPageParam" | "initialPageParam"> & InfiniteQueryPageParamsOptions<GetApprovalPoliciesIdData, PartialParameters<DeepReadonly<TPageParam>>>): UseSuspenseInfiniteQueryResult<OperationInfiniteData<TData, GetApprovalPoliciesIdParameters>, GetApprovalPoliciesIdError | Error>;
435443
/**
436444
* Allows you to execute multiple asynchronous data fetching operations concurrently with Suspense support.
437445
* Similar to useQueries but integrates with React Suspense for loading states.
@@ -554,6 +562,8 @@ export interface ApprovalPoliciesService {
554562
* Enables performing asynchronous data mutation operations such as POST, PUT, PATCH, or DELETE requests.
555563
* Handles loading state, optimistic updates, and error handling.
556564
*
565+
* @summary Delete an approval policy
566+
* @description Delete an existing approval policy.
557567
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useMutation|`useMutation(...)` documentation}
558568
* @example Mutation with predefined parameters, e.g., for updating
559569
* ```ts
@@ -594,6 +604,8 @@ export interface ApprovalPoliciesService {
594604
* Enables performing asynchronous data mutation operations such as POST, PUT, PATCH, or DELETE requests.
595605
* Handles loading state, optimistic updates, and error handling.
596606
*
607+
* @summary Delete an approval policy
608+
* @description Delete an existing approval policy.
597609
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useMutation|`useMutation(...)` documentation}
598610
* @example Mutation with predefined parameters, e.g., for updating
599611
* ```ts
@@ -731,6 +743,8 @@ export interface ApprovalPoliciesService {
731743
* Enables performing asynchronous data mutation operations such as POST, PUT, PATCH, or DELETE requests.
732744
* Handles loading state, optimistic updates, and error handling.
733745
*
746+
* @summary Update an approval policy
747+
* @description Update an existing approval policy.
734748
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useMutation|`useMutation(...)` documentation}
735749
* @example Mutation with predefined parameters, e.g., for updating
736750
* ```ts
@@ -771,6 +785,8 @@ export interface ApprovalPoliciesService {
771785
* Enables performing asynchronous data mutation operations such as POST, PUT, PATCH, or DELETE requests.
772786
* Handles loading state, optimistic updates, and error handling.
773787
*
788+
* @summary Update an approval policy
789+
* @description Update an existing approval policy.
774790
* @see {@link https://openapi-qraft.github.io/openapi-qraft/docs/hooks/useMutation|`useMutation(...)` documentation}
775791
* @example Mutation with predefined parameters, e.g., for updating
776792
* ```ts

0 commit comments

Comments
 (0)