@kubb/plugin-react-query 5.0.0-alpha.8 → 5.0.0-beta.10

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 (54) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +34 -85
  3. package/dist/components-Dow6tde8.js +1459 -0
  4. package/dist/components-Dow6tde8.js.map +1 -0
  5. package/dist/components-HwdCDefj.cjs +1603 -0
  6. package/dist/components-HwdCDefj.cjs.map +1 -0
  7. package/dist/components.cjs +1 -1
  8. package/dist/components.d.ts +49 -179
  9. package/dist/components.js +1 -1
  10. package/dist/generators-CcOmnTPa.cjs +1454 -0
  11. package/dist/generators-CcOmnTPa.cjs.map +1 -0
  12. package/dist/generators-yfZr_qfT.js +1412 -0
  13. package/dist/generators-yfZr_qfT.js.map +1 -0
  14. package/dist/generators.cjs +1 -1
  15. package/dist/generators.d.ts +9 -476
  16. package/dist/generators.js +1 -1
  17. package/dist/index.cjs +197 -126
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.js +193 -126
  21. package/dist/index.js.map +1 -1
  22. package/dist/types-DG_OxOym.d.ts +363 -0
  23. package/extension.yaml +911 -0
  24. package/package.json +59 -64
  25. package/src/components/InfiniteQuery.tsx +79 -138
  26. package/src/components/InfiniteQueryOptions.tsx +55 -166
  27. package/src/components/Mutation.tsx +74 -111
  28. package/src/components/MutationOptions.tsx +61 -80
  29. package/src/components/Query.tsx +66 -142
  30. package/src/components/QueryOptions.tsx +56 -138
  31. package/src/components/SuspenseInfiniteQuery.tsx +79 -138
  32. package/src/components/SuspenseInfiniteQueryOptions.tsx +55 -166
  33. package/src/components/SuspenseQuery.tsx +66 -152
  34. package/src/generators/customHookOptionsFileGenerator.tsx +37 -51
  35. package/src/generators/hookOptionsGenerator.tsx +111 -174
  36. package/src/generators/infiniteQueryGenerator.tsx +158 -178
  37. package/src/generators/mutationGenerator.tsx +112 -139
  38. package/src/generators/queryGenerator.tsx +128 -142
  39. package/src/generators/suspenseInfiniteQueryGenerator.tsx +157 -156
  40. package/src/generators/suspenseQueryGenerator.tsx +126 -152
  41. package/src/index.ts +1 -1
  42. package/src/plugin.ts +134 -187
  43. package/src/resolvers/resolverReactQuery.ts +107 -0
  44. package/src/types.ts +172 -49
  45. package/src/utils.ts +10 -0
  46. package/dist/components-BHQT9ZLc.cjs +0 -1634
  47. package/dist/components-BHQT9ZLc.cjs.map +0 -1
  48. package/dist/components-CpyHYGOw.js +0 -1520
  49. package/dist/components-CpyHYGOw.js.map +0 -1
  50. package/dist/generators-DP07m3rH.cjs +0 -1469
  51. package/dist/generators-DP07m3rH.cjs.map +0 -1
  52. package/dist/generators-DkQwKTc2.js +0 -1427
  53. package/dist/generators-DkQwKTc2.js.map +0 -1
  54. package/dist/types-D5S7Ny9r.d.ts +0 -270
@@ -1,18 +1,21 @@
1
+ import { getOperationParameters } from '@internals/shared'
1
2
  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'
3
+ import type { ast } from '@kubb/core'
4
+ import type { ResolverTs } from '@kubb/plugin-ts'
5
+ import { functionPrinter } from '@kubb/plugin-ts'
6
+ import { File, Function } from '@kubb/renderer-jsx'
7
+ import type { KubbReactNode } from '@kubb/renderer-jsx/types'
8
8
  import type { Infinite, PluginReactQuery } from '../types.ts'
9
- import { QueryKey } from './QueryKey.tsx'
9
+ import { buildQueryKeyParams, resolveErrorNames } from '../utils.ts'
10
+ import { buildEnabledCheck } from '@internals/tanstack-query'
11
+ import { getQueryOptionsParams } from './QueryOptions.tsx'
10
12
 
11
13
  type Props = {
12
14
  name: string
13
15
  clientName: string
14
16
  queryKeyName: string
15
- typeSchemas: OperationSchemas
17
+ node: ast.OperationNode
18
+ tsResolver: ResolverTs
16
19
  paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
17
20
  paramsType: PluginReactQuery['resolvedOptions']['paramsType']
18
21
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
@@ -24,94 +27,8 @@ type Props = {
24
27
  queryParam: Infinite['queryParam']
25
28
  }
26
29
 
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
- }
30
+ const declarationPrinter = functionPrinter({ mode: 'declaration' })
31
+ const callPrinter = functionPrinter({ mode: 'call' })
115
32
 
116
33
  export function InfiniteQueryOptions({
117
34
  name,
@@ -120,16 +37,20 @@ export function InfiniteQueryOptions({
120
37
  cursorParam,
121
38
  nextParam,
122
39
  previousParam,
123
- typeSchemas,
40
+ node,
41
+ tsResolver,
124
42
  paramsCasing,
125
43
  paramsType,
126
44
  dataReturnType,
127
45
  pathParamsType,
128
46
  queryParam,
129
47
  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'}>`
48
+ }: Props): KubbReactNode {
49
+ const responseName = tsResolver.resolveResponseName(node)
50
+ const queryFnDataType = dataReturnType === 'data' ? responseName : `ResponseConfig<${responseName}>`
51
+ const errorNames = resolveErrorNames(node, tsResolver)
52
+ const errorType = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
53
+
133
54
  const isInitialPageParamDefined = initialPageParam !== undefined && initialPageParam !== null
134
55
  const fallbackPageParamType =
135
56
  typeof initialPageParam === 'number'
@@ -144,36 +65,37 @@ export function InfiniteQueryOptions({
144
65
  : typeof initialPageParam === 'boolean'
145
66
  ? 'boolean'
146
67
  : 'unknown'
147
- const queryParamType = queryParam && typeSchemas.queryParams?.name ? `${typeSchemas.queryParams?.name}['${queryParam}']` : undefined
68
+
69
+ const rawQueryParams = getOperationParameters(node).query
70
+ const queryParamsTypeName =
71
+ rawQueryParams.length > 0
72
+ ? (() => {
73
+ const groupName = tsResolver.resolveQueryParamsName(node, rawQueryParams[0]!)
74
+ const individualName = tsResolver.resolveParamName(node, rawQueryParams[0]!)
75
+ return groupName !== individualName ? groupName : undefined
76
+ })()
77
+ : undefined
78
+
79
+ const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : undefined
148
80
  const pageParamType = queryParamType ? (isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType) : fallbackPageParamType
149
81
 
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
- })
82
+ const paramsNode = getQueryOptionsParams(node, { paramsType, paramsCasing, pathParamsType, resolver: tsResolver })
83
+ const paramsSignature = declarationPrinter.print(paramsNode) ?? ''
84
+ const rawParamsCall = callPrinter.print(paramsNode) ?? ''
85
+ const clientCallStr = rawParamsCall.replace(/\bconfig\b(?=[^,]*$)/, '{ ...config, signal: config.signal ?? signal }')
86
+
87
+ const queryKeyParamsNode = buildQueryKeyParams(node, { pathParamsType, paramsCasing, resolver: tsResolver })
88
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? ''
89
+
90
+ const enabledSource = buildEnabledCheck(queryKeyParamsNode)
91
+ const enabledText = enabledSource ? `enabled: !!(${enabledSource}),` : ''
168
92
 
169
- // Determine if we should use the new nextParam/previousParam or fall back to legacy cursorParam behavior
170
93
  const hasNewParams = nextParam !== undefined || previousParam !== undefined
171
94
 
172
95
  let getNextPageParamExpr: string | undefined
173
96
  let getPreviousPageParamExpr: string | undefined
174
97
 
175
98
  if (hasNewParams) {
176
- // Use the new nextParam and previousParam
177
99
  if (nextParam) {
178
100
  const accessor = getNestedAccessor(nextParam, 'lastPage')
179
101
  if (accessor) {
@@ -187,11 +109,9 @@ export function InfiniteQueryOptions({
187
109
  }
188
110
  }
189
111
  } else if (cursorParam) {
190
- // Legacy behavior: use cursorParam for both next and previous
191
112
  getNextPageParamExpr = `getNextPageParam: (lastPage) => lastPage['${cursorParam}']`
192
113
  getPreviousPageParamExpr = `getPreviousPageParam: (firstPage) => firstPage['${cursorParam}']`
193
114
  } else {
194
- // Fallback behavior: page-based pagination
195
115
  if (dataReturnType === 'full') {
196
116
  getNextPageParamExpr =
197
117
  'getNextPageParam: (lastPage, _allPages, lastPageParam) => Array.isArray(lastPage.data) && lastPage.data.length === 0 ? undefined : lastPageParam + 1'
@@ -202,56 +122,35 @@ export function InfiniteQueryOptions({
202
122
  getPreviousPageParamExpr = 'getPreviousPageParam: (_firstPage, _allPages, firstPageParam) => firstPageParam <= 1 ? undefined : firstPageParam - 1'
203
123
  }
204
124
 
205
- const queryOptions = [
125
+ const queryOptionsArr = [
206
126
  `initialPageParam: ${typeof initialPageParam === 'string' ? JSON.stringify(initialPageParam) : initialPageParam}`,
207
127
  getNextPageParamExpr,
208
128
  getPreviousPageParamExpr,
209
129
  ].filter(Boolean)
210
130
 
211
131
  const infiniteOverrideParams =
212
- queryParam && typeSchemas.queryParams?.name
132
+ queryParam && queryParamsTypeName
213
133
  ? `
214
134
  params = {
215
135
  ...(params ?? {}),
216
- ['${queryParam}']: pageParam as unknown as ${typeSchemas.queryParams?.name}['${queryParam}'],
217
- } as ${typeSchemas.queryParams?.name}`
136
+ ['${queryParam}']: pageParam as unknown as ${queryParamsTypeName}['${queryParam}'],
137
+ } as ${queryParamsTypeName}`
218
138
  : ''
219
139
 
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
140
  if (infiniteOverrideParams) {
234
141
  return (
235
142
  <File.Source name={name} isExportable isIndexable>
236
- <Function name={name} export params={params.toConstructor()}>
143
+ <Function name={name} export params={paramsSignature}>
237
144
  {`
238
- const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
145
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
239
146
  return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, typeof queryKey, ${pageParamType}>({
240
147
  ${enabledText}
241
148
  queryKey,
242
149
  queryFn: async ({ signal, pageParam }) => {
243
150
  ${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
- })})
151
+ return ${clientName}(${clientCallStr})
253
152
  },
254
- ${queryOptions.join(',\n')}
153
+ ${queryOptionsArr.join(',\n')}
255
154
  })
256
155
  `}
257
156
  </Function>
@@ -261,29 +160,19 @@ export function InfiniteQueryOptions({
261
160
 
262
161
  return (
263
162
  <File.Source name={name} isExportable isIndexable>
264
- <Function name={name} export params={params.toConstructor()}>
163
+ <Function name={name} export params={paramsSignature}>
265
164
  {`
266
- const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
165
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
267
166
  return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, typeof queryKey, ${pageParamType}>({
268
167
  ${enabledText}
269
168
  queryKey,
270
169
  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
- })})
170
+ return ${clientName}(${clientCallStr})
280
171
  },
281
- ${queryOptions.join(',\n')}
172
+ ${queryOptionsArr.join(',\n')}
282
173
  })
283
174
  `}
284
175
  </Function>
285
176
  </File.Source>
286
177
  )
287
178
  }
288
-
289
- InfiniteQueryOptions.getParams = getParams
@@ -1,150 +1,113 @@
1
- import { 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 { PluginReactQuery } from '../types.ts'
7
- import { MutationKey } from './MutationKey.tsx'
8
- import { MutationOptions } from './MutationOptions.tsx'
7
+ import { buildRequestConfigType, getComments, resolveErrorNames } from '../utils.ts'
8
+ import { buildMutationConfigParamsNode } from './MutationOptions.tsx'
9
9
 
10
10
  type Props = {
11
- /**
12
- * Name of the function
13
- */
14
11
  name: string
15
12
  typeName: string
16
13
  mutationOptionsName: string
17
14
  mutationKeyName: string
18
- typeSchemas: OperationSchemas
19
- operation: Operation
15
+ node: ast.OperationNode
16
+ tsResolver: ResolverTs
20
17
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
21
18
  paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
22
19
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
23
20
  customOptions: PluginReactQuery['resolvedOptions']['customOptions']
24
21
  }
25
22
 
26
- type GetParamsProps = {
27
- paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
28
- pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
29
- dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
30
- typeSchemas: OperationSchemas
23
+ const declarationPrinter = functionPrinter({ mode: 'declaration' })
24
+ const callPrinter = functionPrinter({ mode: 'call' })
25
+
26
+ function createMutationArgParams(
27
+ node: ast.OperationNode,
28
+ options: {
29
+ paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
30
+ resolver: ResolverTs
31
+ },
32
+ ): ast.FunctionParametersNode {
33
+ return ast.createOperationParams(node, {
34
+ paramsType: 'inline',
35
+ pathParamsType: 'inline',
36
+ paramsCasing: options.paramsCasing,
37
+ resolver: options.resolver,
38
+ })
31
39
  }
32
40
 
33
- function getParams({ paramsCasing, dataReturnType, typeSchemas }: GetParamsProps) {
34
- const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
35
- const pathParams = getPathParams(typeSchemas.pathParams, { typed: true, casing: paramsCasing })
41
+ function buildMutationParamsNode(
42
+ node: ast.OperationNode,
43
+ options: {
44
+ paramsCasing: PluginReactQuery['resolvedOptions']['paramsCasing']
45
+ dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
46
+ resolver: ResolverTs
47
+ },
48
+ ): ast.FunctionParametersNode {
49
+ const { paramsCasing, dataReturnType, resolver } = options
50
+ const responseName = resolver.resolveResponseName(node)
51
+ const errorNames = resolveErrorNames(node, resolver)
52
+
53
+ const TData = dataReturnType === 'data' ? responseName : `ResponseConfig<${responseName}>`
54
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
36
55
 
37
- const mutationParams = FunctionParams.factory({
38
- ...pathParams,
39
- data: typeSchemas.request?.name
40
- ? {
41
- type: typeSchemas.request?.name,
42
- optional: isOptional(typeSchemas.request?.schema),
43
- }
44
- : undefined,
45
- params: typeSchemas.queryParams?.name
46
- ? {
47
- type: typeSchemas.queryParams?.name,
48
- optional: isOptional(typeSchemas.queryParams?.schema),
49
- }
50
- : undefined,
51
- headers: typeSchemas.headerParams?.name
52
- ? {
53
- type: typeSchemas.headerParams?.name,
54
- optional: isOptional(typeSchemas.headerParams?.schema),
55
- }
56
- : undefined,
56
+ const mutationArgParamsNode = createMutationArgParams(node, {
57
+ paramsCasing,
58
+ resolver,
57
59
  })
58
- const TRequest = mutationParams.toConstructor()
59
- const TError = `ResponseErrorConfig<${typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error'}>`
60
+ const TRequest = mutationArgParamsNode.params.length > 0 ? (declarationPrinter.print(mutationArgParamsNode) ?? '') : ''
60
61
  const generics = [TData, TError, TRequest ? `{${TRequest}}` : 'void', 'TContext'].join(', ')
61
62
 
62
- return FunctionParams.factory({
63
- options: {
64
- type: `
65
- {
63
+ return ast.createFunctionParameters({
64
+ params: [
65
+ ast.createFunctionParameter({
66
+ name: 'options',
67
+ type: ast.createParamsType({
68
+ variant: 'reference',
69
+ name: `{
66
70
  mutation?: UseMutationOptions<${generics}> & { client?: QueryClient },
67
- client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>> & { client?: Client }` : 'Partial<RequestConfig> & { client?: Client }'},
68
- }
69
- `,
70
- default: '{}',
71
- },
71
+ client?: ${buildRequestConfigType(node, resolver)},
72
+ }`,
73
+ }),
74
+ default: '{}',
75
+ }),
76
+ ],
72
77
  })
73
78
  }
74
79
 
75
- export function Mutation({
76
- name,
77
- mutationOptionsName,
78
- paramsCasing,
79
- pathParamsType,
80
- dataReturnType,
81
- typeSchemas,
82
- operation,
83
- mutationKeyName,
84
- customOptions,
85
- }: Props): FabricReactNode {
86
- const mutationKeyParams = MutationKey.getParams({
87
- pathParamsType,
88
- typeSchemas,
89
- })
80
+ export function Mutation({ name, mutationOptionsName, paramsCasing, dataReturnType, node, tsResolver, mutationKeyName, customOptions }: Props): KubbReactNode {
81
+ const responseName = tsResolver.resolveResponseName(node)
82
+ const errorNames = resolveErrorNames(node, tsResolver)
90
83
 
91
- const params = getParams({
92
- paramsCasing,
93
- pathParamsType,
94
- dataReturnType,
95
- typeSchemas,
96
- })
84
+ const TData = dataReturnType === 'data' ? responseName : `ResponseConfig<${responseName}>`
85
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
97
86
 
98
- const mutationParams = FunctionParams.factory({
99
- ...getPathParams(typeSchemas.pathParams, { typed: true, casing: paramsCasing }),
100
- data: typeSchemas.request?.name
101
- ? {
102
- type: typeSchemas.request?.name,
103
- optional: isOptional(typeSchemas.request?.schema),
104
- }
105
- : undefined,
106
- params: typeSchemas.queryParams?.name
107
- ? {
108
- type: typeSchemas.queryParams?.name,
109
- optional: isOptional(typeSchemas.queryParams?.schema),
110
- }
111
- : undefined,
112
- headers: typeSchemas.headerParams?.name
113
- ? {
114
- type: typeSchemas.headerParams?.name,
115
- optional: isOptional(typeSchemas.headerParams?.schema),
116
- }
117
- : undefined,
87
+ const mutationArgParamsNode = createMutationArgParams(node, {
88
+ paramsCasing,
89
+ resolver: tsResolver,
118
90
  })
119
-
120
- const mutationOptionsParams = MutationOptions.getParams({ typeSchemas })
121
-
122
- const TRequest = mutationParams.toConstructor()
123
- const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
124
- const TError = `ResponseErrorConfig<${typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error'}>`
91
+ const TRequest = mutationArgParamsNode.params.length > 0 ? (declarationPrinter.print(mutationArgParamsNode) ?? '') : ''
125
92
  const generics = [TData, TError, TRequest ? `{${TRequest}}` : 'void', 'TContext'].join(', ')
126
93
  const returnType = `UseMutationResult<${generics}>`
127
94
 
128
- const mutationOptions = `${mutationOptionsName}(${mutationOptionsParams.toCall()})`
95
+ const mutationOptionsConfigNode = buildMutationConfigParamsNode(node, tsResolver)
96
+ const mutationOptionsParamsCall = callPrinter.print(mutationOptionsConfigNode) ?? ''
97
+
98
+ const paramsNode = buildMutationParamsNode(node, { paramsCasing, dataReturnType, resolver: tsResolver })
99
+ const paramsSignature = declarationPrinter.print(paramsNode) ?? ''
129
100
 
130
101
  return (
131
102
  <File.Source name={name} isExportable isIndexable>
132
- <Function
133
- name={name}
134
- export
135
- params={params.toConstructor()}
136
- JSDoc={{
137
- comments: getComments(operation),
138
- }}
139
- generics={['TContext']}
140
- >
103
+ <Function name={name} export params={paramsSignature} JSDoc={{ comments: getComments(node) }} generics={['TContext']}>
141
104
  {`
142
105
  const { mutation = {}, client: config = {} } = options ?? {}
143
106
  const { client: queryClient, ...mutationOptions } = mutation;
144
- const mutationKey = mutationOptions.mutationKey ?? ${mutationKeyName}(${mutationKeyParams.toCall()})
107
+ const mutationKey = mutationOptions.mutationKey ?? ${mutationKeyName}()
145
108
 
146
- const baseOptions = ${mutationOptions} as UseMutationOptions<${generics}>
147
- ${customOptions ? `const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${operation.getOperationId()}' }) as UseMutationOptions<${generics}>` : ''}
109
+ const baseOptions = ${mutationOptionsName}(${mutationOptionsParamsCall}) as UseMutationOptions<${generics}>
110
+ ${customOptions ? `const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' }) as UseMutationOptions<${generics}>` : ''}
148
111
 
149
112
  return useMutation<${generics}>({
150
113
  ...baseOptions,${customOptions ? '\n...customOptions,' : ''}