@kubb/plugin-react-query 5.0.0-alpha.9 → 5.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +1 -3
  3. package/dist/components-DTGLu4UV.js +1451 -0
  4. package/dist/components-DTGLu4UV.js.map +1 -0
  5. package/dist/components-dAKJEn9b.cjs +1571 -0
  6. package/dist/components-dAKJEn9b.cjs.map +1 -0
  7. package/dist/components.cjs +1 -1
  8. package/dist/components.d.ts +105 -161
  9. package/dist/components.js +1 -1
  10. package/dist/generators-CWEQsdO9.cjs +1502 -0
  11. package/dist/generators-CWEQsdO9.cjs.map +1 -0
  12. package/dist/generators-C_fbcjpG.js +1460 -0
  13. package/dist/generators-C_fbcjpG.js.map +1 -0
  14. package/dist/generators.cjs +1 -1
  15. package/dist/generators.d.ts +9 -505
  16. package/dist/generators.js +1 -1
  17. package/dist/index.cjs +114 -126
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.js +110 -126
  21. package/dist/index.js.map +1 -1
  22. package/dist/{types-D5S7Ny9r.d.ts → types-DfaFRSBf.d.ts} +100 -86
  23. package/package.json +59 -62
  24. package/src/components/InfiniteQuery.tsx +75 -139
  25. package/src/components/InfiniteQueryOptions.tsx +62 -164
  26. package/src/components/Mutation.tsx +58 -113
  27. package/src/components/MutationOptions.tsx +61 -80
  28. package/src/components/Query.tsx +67 -140
  29. package/src/components/QueryOptions.tsx +75 -135
  30. package/src/components/SuspenseInfiniteQuery.tsx +75 -139
  31. package/src/components/SuspenseInfiniteQueryOptions.tsx +62 -164
  32. package/src/components/SuspenseQuery.tsx +67 -150
  33. package/src/generators/customHookOptionsFileGenerator.tsx +33 -45
  34. package/src/generators/hookOptionsGenerator.tsx +115 -175
  35. package/src/generators/infiniteQueryGenerator.tsx +183 -176
  36. package/src/generators/mutationGenerator.tsx +127 -138
  37. package/src/generators/queryGenerator.tsx +141 -141
  38. package/src/generators/suspenseInfiniteQueryGenerator.tsx +175 -155
  39. package/src/generators/suspenseQueryGenerator.tsx +149 -148
  40. package/src/index.ts +1 -1
  41. package/src/plugin.ts +133 -183
  42. package/src/resolvers/resolverReactQuery.ts +22 -0
  43. package/src/types.ts +67 -45
  44. package/src/utils.ts +40 -0
  45. package/dist/components-BHQT9ZLc.cjs +0 -1634
  46. package/dist/components-BHQT9ZLc.cjs.map +0 -1
  47. package/dist/components-CpyHYGOw.js +0 -1520
  48. package/dist/components-CpyHYGOw.js.map +0 -1
  49. package/dist/generators-DP07m3rH.cjs +0 -1469
  50. package/dist/generators-DP07m3rH.cjs.map +0 -1
  51. package/dist/generators-DkQwKTc2.js +0 -1427
  52. package/dist/generators-DkQwKTc2.js.map +0 -1
@@ -1,22 +1,20 @@
1
- import { isAllOptional, isOptional, type Operation } from '@kubb/oas'
2
- import type { OperationSchemas } from '@kubb/plugin-oas'
3
- import { getComments, getPathParams } from '@kubb/plugin-oas/utils'
4
- import { File, Function, FunctionParams } from '@kubb/react-fabric'
5
- import type { FabricReactNode } from '@kubb/react-fabric/types'
1
+ import { ast } from '@kubb/core'
2
+ import type { ResolverTs } from '@kubb/plugin-ts'
3
+ import { functionPrinter } from '@kubb/plugin-ts'
4
+ import { File, Function } from '@kubb/renderer-jsx'
5
+ import type { KubbReactNode } from '@kubb/renderer-jsx/types'
6
6
  import type { Infinite, PluginReactQuery } from '../types.ts'
7
+ import { getComments, resolveErrorNames } from '../utils.ts'
7
8
  import { QueryKey } from './QueryKey.tsx'
8
- import { QueryOptions } from './QueryOptions.tsx'
9
+ import { getQueryOptionsParams } from './QueryOptions.tsx'
9
10
 
10
11
  type Props = {
11
- /**
12
- * Name of the function
13
- */
14
12
  name: string
15
13
  queryOptionsName: string
16
14
  queryKeyName: string
17
15
  queryKeyTypeName: string
18
- typeSchemas: OperationSchemas
19
- operation: Operation
16
+ node: ast.OperationNode
17
+ tsResolver: ResolverTs
20
18
  paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
21
19
  paramsType: PluginReactQuery['resolvedOptions']['paramsType']
22
20
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
@@ -26,99 +24,41 @@ type Props = {
26
24
  customOptions: PluginReactQuery['resolvedOptions']['customOptions']
27
25
  }
28
26
 
29
- type GetParamsProps = {
30
- paramsType: PluginReactQuery['resolvedOptions']['paramsType']
31
- paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
32
- pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
33
- typeSchemas: OperationSchemas
34
- pageParamGeneric: string
35
- }
27
+ const declarationPrinter = functionPrinter({ mode: 'declaration' })
28
+ const callPrinter = functionPrinter({ mode: 'call' })
36
29
 
37
- function getParams({ paramsType, paramsCasing, pathParamsType, typeSchemas, pageParamGeneric }: GetParamsProps) {
38
- if (paramsType === 'object') {
39
- const pathParams = getPathParams(typeSchemas.pathParams, {
40
- typed: true,
41
- casing: paramsCasing,
42
- })
43
-
44
- const children = {
45
- ...pathParams,
46
- data: typeSchemas.request?.name
47
- ? {
48
- type: typeSchemas.request?.name,
49
- optional: isOptional(typeSchemas.request?.schema),
50
- }
51
- : undefined,
52
- params: typeSchemas.queryParams?.name
53
- ? {
54
- type: typeSchemas.queryParams?.name,
55
- optional: isOptional(typeSchemas.queryParams?.schema),
56
- }
57
- : undefined,
58
- headers: typeSchemas.headerParams?.name
59
- ? {
60
- type: typeSchemas.headerParams?.name,
61
- optional: isOptional(typeSchemas.headerParams?.schema),
62
- }
63
- : undefined,
64
- }
65
-
66
- // Check if all children are optional or undefined
67
- const allChildrenAreOptional = Object.values(children).every((child) => !child || child.optional)
68
-
69
- return FunctionParams.factory({
70
- data: {
71
- mode: 'object',
72
- children,
73
- default: allChildrenAreOptional ? '{}' : undefined,
74
- },
75
- options: {
76
- type: `
77
- {
78
- query?: Partial<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, ${pageParamGeneric}>> & { client?: QueryClient },
79
- client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>> & { client?: Client }` : 'Partial<RequestConfig> & { client?: Client }'}
80
- }
81
- `,
82
- default: '{}',
83
- },
84
- })
85
- }
86
-
87
- return FunctionParams.factory({
88
- pathParams: typeSchemas.pathParams?.name
89
- ? {
90
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
91
- children: getPathParams(typeSchemas.pathParams, { typed: true, casing: paramsCasing }),
92
- default: isAllOptional(typeSchemas.pathParams?.schema) ? '{}' : undefined,
93
- }
94
- : undefined,
95
- data: typeSchemas.request?.name
96
- ? {
97
- type: typeSchemas.request?.name,
98
- optional: isOptional(typeSchemas.request?.schema),
99
- }
100
- : undefined,
101
- params: typeSchemas.queryParams?.name
102
- ? {
103
- type: typeSchemas.queryParams?.name,
104
- optional: isOptional(typeSchemas.queryParams?.schema),
105
- }
106
- : undefined,
107
- headers: typeSchemas.headerParams?.name
108
- ? {
109
- type: typeSchemas.headerParams?.name,
110
- optional: isOptional(typeSchemas.headerParams?.schema),
111
- }
112
- : undefined,
113
- options: {
114
- type: `
115
- {
30
+ function getParams(
31
+ node: ast.OperationNode,
32
+ options: {
33
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
34
+ paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
35
+ pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
36
+ dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
37
+ resolver: ResolverTs
38
+ pageParamGeneric: string
39
+ },
40
+ ): ast.FunctionParametersNode {
41
+ const { paramsType, paramsCasing, pathParamsType, resolver, pageParamGeneric } = options
42
+ const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined
43
+
44
+ const optionsParam = ast.createFunctionParameter({
45
+ name: 'options',
46
+ type: ast.createParamsType({
47
+ variant: 'reference',
48
+ name: `{
116
49
  query?: Partial<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, ${pageParamGeneric}>> & { client?: QueryClient },
117
- client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>> & { client?: Client }` : 'Partial<RequestConfig> & { client?: Client }'}
118
- }
119
- `,
120
- default: '{}',
121
- },
50
+ client?: ${requestName ? `Partial<RequestConfig<${requestName}>> & { client?: Client }` : 'Partial<RequestConfig> & { client?: Client }'}
51
+ }`,
52
+ }),
53
+ default: '{}',
54
+ })
55
+
56
+ return ast.createOperationParams(node, {
57
+ paramsType,
58
+ pathParamsType: paramsType === 'object' ? 'object' : pathParamsType === 'object' ? 'object' : 'inline',
59
+ paramsCasing,
60
+ resolver,
61
+ extraParams: [optionsParam],
122
62
  })
123
63
  }
124
64
 
@@ -131,14 +71,18 @@ export function InfiniteQuery({
131
71
  paramsCasing,
132
72
  pathParamsType,
133
73
  dataReturnType,
134
- typeSchemas,
135
- operation,
74
+ node,
75
+ tsResolver,
136
76
  initialPageParam,
137
77
  queryParam,
138
78
  customOptions,
139
- }: Props): FabricReactNode {
140
- const responseType = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
141
- const errorType = `ResponseErrorConfig<${typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error'}>`
79
+ }: Props): KubbReactNode {
80
+ const responseName = tsResolver.resolveResponseName(node)
81
+ const errorNames = resolveErrorNames(node, tsResolver)
82
+
83
+ const responseType = dataReturnType === 'data' ? responseName : `ResponseConfig<${responseName}>`
84
+ const errorType = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
85
+
142
86
  const isInitialPageParamDefined = initialPageParam !== undefined && initialPageParam !== null
143
87
  const fallbackPageParamType =
144
88
  typeof initialPageParam === 'number'
@@ -153,8 +97,20 @@ export function InfiniteQuery({
153
97
  : typeof initialPageParam === 'boolean'
154
98
  ? 'boolean'
155
99
  : 'unknown'
156
- const queryParamType = queryParam && typeSchemas.queryParams?.name ? `${typeSchemas.queryParams?.name}['${queryParam}']` : undefined
100
+
101
+ const rawQueryParams = node.parameters.filter((p) => p.in === 'query')
102
+ const queryParamsTypeName =
103
+ rawQueryParams.length > 0
104
+ ? (() => {
105
+ const groupName = tsResolver.resolveQueryParamsName(node, rawQueryParams[0]!)
106
+ const individualName = tsResolver.resolveParamName(node, rawQueryParams[0]!)
107
+ return groupName !== individualName ? groupName : undefined
108
+ })()
109
+ : undefined
110
+
111
+ const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : undefined
157
112
  const pageParamType = queryParamType ? (isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType) : fallbackPageParamType
113
+
158
114
  const returnType = 'UseInfiniteQueryResult<TData, TError> & { queryKey: TQueryKey }'
159
115
  const generics = [
160
116
  `TQueryFnData = ${responseType}`,
@@ -164,46 +120,26 @@ export function InfiniteQuery({
164
120
  `TPageParam = ${pageParamType}`,
165
121
  ]
166
122
 
167
- const queryKeyParams = QueryKey.getParams({
168
- pathParamsType,
169
- typeSchemas,
170
- paramsCasing,
171
- })
172
- const queryOptionsParams = QueryOptions.getParams({
173
- paramsType,
174
- pathParamsType,
175
- typeSchemas,
176
- paramsCasing,
177
- })
178
- const params = getParams({
179
- paramsCasing,
180
- paramsType,
181
- pathParamsType,
182
- typeSchemas,
183
- pageParamGeneric: 'TPageParam',
184
- })
123
+ const queryKeyParamsNode = QueryKey.getParams(node, { pathParamsType, paramsCasing, resolver: tsResolver })
124
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? ''
125
+
126
+ const queryOptionsParamsNode = getQueryOptionsParams(node, { paramsType, paramsCasing, pathParamsType, resolver: tsResolver })
127
+ const queryOptionsParamsCall = callPrinter.print(queryOptionsParamsNode) ?? ''
185
128
 
186
- const queryOptions = `${queryOptionsName}(${queryOptionsParams.toCall()})`
129
+ const paramsNode = getParams(node, { paramsType, paramsCasing, pathParamsType, dataReturnType, resolver: tsResolver, pageParamGeneric: 'TPageParam' })
130
+ const paramsSignature = declarationPrinter.print(paramsNode) ?? ''
187
131
 
188
132
  return (
189
133
  <File.Source name={name} isExportable isIndexable>
190
- <Function
191
- name={name}
192
- export
193
- generics={generics.join(', ')}
194
- params={params.toConstructor()}
195
- JSDoc={{
196
- comments: getComments(operation),
197
- }}
198
- >
134
+ <Function name={name} export generics={generics.join(', ')} params={paramsSignature} returnType={undefined} JSDoc={{ comments: getComments(node) }}>
199
135
  {`
200
136
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
201
137
  const { client: queryClient, ...resolvedOptions } = queryConfig
202
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParams.toCall()})
203
- ${customOptions ? `const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${operation.getOperationId()}' })` : ''}
138
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})
139
+ ${customOptions ? `const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ''}
204
140
 
205
141
  const query = useInfiniteQuery({
206
- ...${queryOptions},${customOptions ? '\n...customOptions,' : ''}
142
+ ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? '\n...customOptions,' : ''}
207
143
  ...resolvedOptions,
208
144
  queryKey,
209
145
  } as unknown as InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1,18 +1,20 @@
1
1
  import { getNestedAccessor } from '@internals/utils'
2
- import { isAllOptional, isOptional } from '@kubb/oas'
3
- import { Client } from '@kubb/plugin-client/components'
4
- import type { OperationSchemas } from '@kubb/plugin-oas'
5
- import { getPathParams } from '@kubb/plugin-oas/utils'
6
- import { File, Function, FunctionParams } from '@kubb/react-fabric'
7
- import type { FabricReactNode } from '@kubb/react-fabric/types'
2
+ import type { ast } from '@kubb/core'
3
+ import type { ResolverTs } from '@kubb/plugin-ts'
4
+ import { functionPrinter } from '@kubb/plugin-ts'
5
+ import { File, Function } from '@kubb/renderer-jsx'
6
+ import type { KubbReactNode } from '@kubb/renderer-jsx/types'
8
7
  import type { Infinite, PluginReactQuery } from '../types.ts'
8
+ import { resolveErrorNames } from '../utils.ts'
9
9
  import { QueryKey } from './QueryKey.tsx'
10
+ import { buildEnabledCheck, getQueryOptionsParams } from './QueryOptions.tsx'
10
11
 
11
12
  type Props = {
12
13
  name: string
13
14
  clientName: string
14
15
  queryKeyName: string
15
- typeSchemas: OperationSchemas
16
+ node: ast.OperationNode
17
+ tsResolver: ResolverTs
16
18
  paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
17
19
  paramsType: PluginReactQuery['resolvedOptions']['paramsType']
18
20
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
@@ -24,94 +26,8 @@ type Props = {
24
26
  queryParam: Infinite['queryParam']
25
27
  }
26
28
 
27
- type GetParamsProps = {
28
- paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
29
- paramsType: PluginReactQuery['resolvedOptions']['paramsType']
30
- pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
31
- typeSchemas: OperationSchemas
32
- }
33
-
34
- function getParams({ paramsType, paramsCasing, pathParamsType, typeSchemas }: GetParamsProps) {
35
- if (paramsType === 'object') {
36
- const pathParams = getPathParams(typeSchemas.pathParams, { typed: true, casing: paramsCasing })
37
-
38
- const children = {
39
- ...pathParams,
40
- data: typeSchemas.request?.name
41
- ? {
42
- type: typeSchemas.request?.name,
43
- optional: isOptional(typeSchemas.request?.schema),
44
- }
45
- : undefined,
46
- params: typeSchemas.queryParams?.name
47
- ? {
48
- type: typeSchemas.queryParams?.name,
49
- optional: isOptional(typeSchemas.queryParams?.schema),
50
- }
51
- : undefined,
52
- headers: typeSchemas.headerParams?.name
53
- ? {
54
- type: typeSchemas.headerParams?.name,
55
- optional: isOptional(typeSchemas.headerParams?.schema),
56
- }
57
- : undefined,
58
- }
59
-
60
- // Check if all children are optional or undefined
61
- const allChildrenAreOptional = Object.values(children).every((child) => !child || child.optional)
62
-
63
- return FunctionParams.factory({
64
- data: {
65
- mode: 'object',
66
- children,
67
- default: allChildrenAreOptional ? '{}' : undefined,
68
- },
69
- config: {
70
- type: typeSchemas.request?.name
71
- ? `Partial<RequestConfig<${typeSchemas.request?.name}>> & { client?: Client }`
72
- : 'Partial<RequestConfig> & { client?: Client }',
73
- default: '{}',
74
- },
75
- })
76
- }
77
-
78
- return FunctionParams.factory({
79
- pathParams: typeSchemas.pathParams?.name
80
- ? {
81
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
82
- children: getPathParams(typeSchemas.pathParams, {
83
- typed: true,
84
- casing: paramsCasing,
85
- }),
86
- default: isAllOptional(typeSchemas.pathParams?.schema) ? '{}' : undefined,
87
- }
88
- : undefined,
89
- data: typeSchemas.request?.name
90
- ? {
91
- type: typeSchemas.request?.name,
92
- optional: isOptional(typeSchemas.request?.schema),
93
- }
94
- : undefined,
95
- params: typeSchemas.queryParams?.name
96
- ? {
97
- type: typeSchemas.queryParams?.name,
98
- optional: isOptional(typeSchemas.queryParams?.schema),
99
- }
100
- : undefined,
101
- headers: typeSchemas.headerParams?.name
102
- ? {
103
- type: typeSchemas.headerParams?.name,
104
- optional: isOptional(typeSchemas.headerParams?.schema),
105
- }
106
- : undefined,
107
- config: {
108
- type: typeSchemas.request?.name
109
- ? `Partial<RequestConfig<${typeSchemas.request?.name}>> & { client?: Client }`
110
- : 'Partial<RequestConfig> & { client?: Client }',
111
- default: '{}',
112
- },
113
- })
114
- }
29
+ const declarationPrinter = functionPrinter({ mode: 'declaration' })
30
+ const callPrinter = functionPrinter({ mode: 'call' })
115
31
 
116
32
  export function InfiniteQueryOptions({
117
33
  name,
@@ -120,16 +36,20 @@ export function InfiniteQueryOptions({
120
36
  cursorParam,
121
37
  nextParam,
122
38
  previousParam,
123
- typeSchemas,
39
+ node,
40
+ tsResolver,
124
41
  paramsCasing,
125
42
  paramsType,
126
43
  dataReturnType,
127
44
  pathParamsType,
128
45
  queryParam,
129
46
  queryKeyName,
130
- }: Props): FabricReactNode {
131
- const queryFnDataType = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
132
- const errorType = `ResponseErrorConfig<${typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error'}>`
47
+ }: Props): KubbReactNode {
48
+ const responseName = tsResolver.resolveResponseName(node)
49
+ const queryFnDataType = dataReturnType === 'data' ? responseName : `ResponseConfig<${responseName}>`
50
+ const errorNames = resolveErrorNames(node, tsResolver)
51
+ const errorType = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
52
+
133
53
  const isInitialPageParamDefined = initialPageParam !== undefined && initialPageParam !== null
134
54
  const fallbackPageParamType =
135
55
  typeof initialPageParam === 'number'
@@ -144,36 +64,37 @@ export function InfiniteQueryOptions({
144
64
  : typeof initialPageParam === 'boolean'
145
65
  ? 'boolean'
146
66
  : 'unknown'
147
- const queryParamType = queryParam && typeSchemas.queryParams?.name ? `${typeSchemas.queryParams?.name}['${queryParam}']` : undefined
67
+
68
+ const rawQueryParams = node.parameters.filter((p) => p.in === 'query')
69
+ const queryParamsTypeName =
70
+ rawQueryParams.length > 0
71
+ ? (() => {
72
+ const groupName = tsResolver.resolveQueryParamsName(node, rawQueryParams[0]!)
73
+ const individualName = tsResolver.resolveParamName(node, rawQueryParams[0]!)
74
+ return groupName !== individualName ? groupName : undefined
75
+ })()
76
+ : undefined
77
+
78
+ const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : undefined
148
79
  const pageParamType = queryParamType ? (isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType) : fallbackPageParamType
149
80
 
150
- const params = getParams({
151
- paramsType,
152
- paramsCasing,
153
- pathParamsType,
154
- typeSchemas,
155
- })
156
- const clientParams = Client.getParams({
157
- paramsCasing,
158
- typeSchemas,
159
- paramsType,
160
- pathParamsType,
161
- isConfigurable: true,
162
- })
163
- const queryKeyParams = QueryKey.getParams({
164
- pathParamsType,
165
- typeSchemas,
166
- paramsCasing,
167
- })
81
+ const paramsNode = getQueryOptionsParams(node, { paramsType, paramsCasing, pathParamsType, resolver: tsResolver })
82
+ const paramsSignature = declarationPrinter.print(paramsNode) ?? ''
83
+ const rawParamsCall = callPrinter.print(paramsNode) ?? ''
84
+ const clientCallStr = rawParamsCall.replace(/\bconfig\b(?=[^,]*$)/, '{ ...config, signal: config.signal ?? signal }')
85
+
86
+ const queryKeyParamsNode = QueryKey.getParams(node, { pathParamsType, paramsCasing, resolver: tsResolver })
87
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? ''
88
+
89
+ const enabledSource = buildEnabledCheck(queryKeyParamsNode)
90
+ const enabledText = enabledSource ? `enabled: !!(${enabledSource}),` : ''
168
91
 
169
- // Determine if we should use the new nextParam/previousParam or fall back to legacy cursorParam behavior
170
92
  const hasNewParams = nextParam !== undefined || previousParam !== undefined
171
93
 
172
94
  let getNextPageParamExpr: string | undefined
173
95
  let getPreviousPageParamExpr: string | undefined
174
96
 
175
97
  if (hasNewParams) {
176
- // Use the new nextParam and previousParam
177
98
  if (nextParam) {
178
99
  const accessor = getNestedAccessor(nextParam, 'lastPage')
179
100
  if (accessor) {
@@ -187,11 +108,9 @@ export function InfiniteQueryOptions({
187
108
  }
188
109
  }
189
110
  } else if (cursorParam) {
190
- // Legacy behavior: use cursorParam for both next and previous
191
111
  getNextPageParamExpr = `getNextPageParam: (lastPage) => lastPage['${cursorParam}']`
192
112
  getPreviousPageParamExpr = `getPreviousPageParam: (firstPage) => firstPage['${cursorParam}']`
193
113
  } else {
194
- // Fallback behavior: page-based pagination
195
114
  if (dataReturnType === 'full') {
196
115
  getNextPageParamExpr =
197
116
  'getNextPageParam: (lastPage, _allPages, lastPageParam) => Array.isArray(lastPage.data) && lastPage.data.length === 0 ? undefined : lastPageParam + 1'
@@ -202,56 +121,35 @@ export function InfiniteQueryOptions({
202
121
  getPreviousPageParamExpr = 'getPreviousPageParam: (_firstPage, _allPages, firstPageParam) => firstPageParam <= 1 ? undefined : firstPageParam - 1'
203
122
  }
204
123
 
205
- const queryOptions = [
124
+ const queryOptionsArr = [
206
125
  `initialPageParam: ${typeof initialPageParam === 'string' ? JSON.stringify(initialPageParam) : initialPageParam}`,
207
126
  getNextPageParamExpr,
208
127
  getPreviousPageParamExpr,
209
128
  ].filter(Boolean)
210
129
 
211
130
  const infiniteOverrideParams =
212
- queryParam && typeSchemas.queryParams?.name
131
+ queryParam && queryParamsTypeName
213
132
  ? `
214
133
  params = {
215
134
  ...(params ?? {}),
216
- ['${queryParam}']: pageParam as unknown as ${typeSchemas.queryParams?.name}['${queryParam}'],
217
- } as ${typeSchemas.queryParams?.name}`
135
+ ['${queryParam}']: pageParam as unknown as ${queryParamsTypeName}['${queryParam}'],
136
+ } as ${queryParamsTypeName}`
218
137
  : ''
219
138
 
220
- // Only add enabled check for required (non-optional) parameters
221
- // Optional parameters with defaults should not prevent query execution
222
- const enabled = Object.entries(queryKeyParams.flatParams)
223
- .map(([key, item]) => {
224
- // Only include if the parameter exists and is NOT optional
225
- // This ensures we only check required parameters
226
- return item && !item.optional && !item.default ? key : undefined
227
- })
228
- .filter(Boolean)
229
- .join('&& ')
230
-
231
- const enabledText = enabled ? `enabled: !!(${enabled}),` : ''
232
-
233
139
  if (infiniteOverrideParams) {
234
140
  return (
235
141
  <File.Source name={name} isExportable isIndexable>
236
- <Function name={name} export params={params.toConstructor()}>
142
+ <Function name={name} export params={paramsSignature}>
237
143
  {`
238
- const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
144
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
239
145
  return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, typeof queryKey, ${pageParamType}>({
240
146
  ${enabledText}
241
147
  queryKey,
242
148
  queryFn: async ({ signal, pageParam }) => {
243
149
  ${infiniteOverrideParams}
244
- return ${clientName}(${clientParams.toCall({
245
- transformName(name) {
246
- if (name === 'config') {
247
- return '{ ...config, signal: config.signal ?? signal }'
248
- }
249
-
250
- return name
251
- },
252
- })})
150
+ return ${clientName}(${clientCallStr})
253
151
  },
254
- ${queryOptions.join(',\n')}
152
+ ${queryOptionsArr.join(',\n')}
255
153
  })
256
154
  `}
257
155
  </Function>
@@ -261,24 +159,16 @@ export function InfiniteQueryOptions({
261
159
 
262
160
  return (
263
161
  <File.Source name={name} isExportable isIndexable>
264
- <Function name={name} export params={params.toConstructor()}>
162
+ <Function name={name} export params={paramsSignature}>
265
163
  {`
266
- const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
164
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
267
165
  return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, typeof queryKey, ${pageParamType}>({
268
166
  ${enabledText}
269
167
  queryKey,
270
168
  queryFn: async ({ signal }) => {
271
- return ${clientName}(${clientParams.toCall({
272
- transformName(name) {
273
- if (name === 'config') {
274
- return '{ ...config, signal: config.signal ?? signal }'
275
- }
276
-
277
- return name
278
- },
279
- })})
169
+ return ${clientName}(${clientCallStr})
280
170
  },
281
- ${queryOptions.join(',\n')}
171
+ ${queryOptionsArr.join(',\n')}
282
172
  })
283
173
  `}
284
174
  </Function>
@@ -286,4 +176,12 @@ export function InfiniteQueryOptions({
286
176
  )
287
177
  }
288
178
 
289
- InfiniteQueryOptions.getParams = getParams
179
+ InfiniteQueryOptions.getParams = (
180
+ node: ast.OperationNode,
181
+ options: {
182
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
183
+ paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
184
+ pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
185
+ resolver: ResolverTs
186
+ },
187
+ ) => getQueryOptionsParams(node, options)