@kubb/plugin-react-query 5.0.0-alpha.9 → 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.
- package/LICENSE +17 -10
- package/README.md +34 -85
- package/dist/components-Dow6tde8.js +1459 -0
- package/dist/components-Dow6tde8.js.map +1 -0
- package/dist/components-HwdCDefj.cjs +1603 -0
- package/dist/components-HwdCDefj.cjs.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.ts +49 -179
- package/dist/components.js +1 -1
- package/dist/generators-CcOmnTPa.cjs +1454 -0
- package/dist/generators-CcOmnTPa.cjs.map +1 -0
- package/dist/generators-yfZr_qfT.js +1412 -0
- package/dist/generators-yfZr_qfT.js.map +1 -0
- package/dist/generators.cjs +1 -1
- package/dist/generators.d.ts +9 -505
- package/dist/generators.js +1 -1
- package/dist/index.cjs +197 -126
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +193 -126
- package/dist/index.js.map +1 -1
- package/dist/types-DG_OxOym.d.ts +363 -0
- package/extension.yaml +911 -0
- package/package.json +59 -64
- package/src/components/InfiniteQuery.tsx +79 -138
- package/src/components/InfiniteQueryOptions.tsx +55 -166
- package/src/components/Mutation.tsx +74 -111
- package/src/components/MutationOptions.tsx +61 -80
- package/src/components/Query.tsx +66 -142
- package/src/components/QueryOptions.tsx +56 -138
- package/src/components/SuspenseInfiniteQuery.tsx +79 -138
- package/src/components/SuspenseInfiniteQueryOptions.tsx +55 -166
- package/src/components/SuspenseQuery.tsx +66 -152
- package/src/generators/customHookOptionsFileGenerator.tsx +37 -51
- package/src/generators/hookOptionsGenerator.tsx +111 -174
- package/src/generators/infiniteQueryGenerator.tsx +158 -178
- package/src/generators/mutationGenerator.tsx +112 -139
- package/src/generators/queryGenerator.tsx +128 -142
- package/src/generators/suspenseInfiniteQueryGenerator.tsx +157 -156
- package/src/generators/suspenseQueryGenerator.tsx +126 -152
- package/src/index.ts +1 -1
- package/src/plugin.ts +134 -187
- package/src/resolvers/resolverReactQuery.ts +107 -0
- package/src/types.ts +172 -49
- package/src/utils.ts +10 -0
- package/dist/components-BHQT9ZLc.cjs +0 -1634
- package/dist/components-BHQT9ZLc.cjs.map +0 -1
- package/dist/components-CpyHYGOw.js +0 -1520
- package/dist/components-CpyHYGOw.js.map +0 -1
- package/dist/generators-DP07m3rH.cjs +0 -1469
- package/dist/generators-DP07m3rH.cjs.map +0 -1
- package/dist/generators-DkQwKTc2.js +0 -1427
- package/dist/generators-DkQwKTc2.js.map +0 -1
- 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 {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
40
|
+
node,
|
|
41
|
+
tsResolver,
|
|
124
42
|
paramsCasing,
|
|
125
43
|
paramsType,
|
|
126
44
|
dataReturnType,
|
|
127
45
|
pathParamsType,
|
|
128
46
|
queryParam,
|
|
129
47
|
queryKeyName,
|
|
130
|
-
}: Props):
|
|
131
|
-
const
|
|
132
|
-
const
|
|
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
|
-
|
|
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
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
})
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
|
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 &&
|
|
132
|
+
queryParam && queryParamsTypeName
|
|
213
133
|
? `
|
|
214
134
|
params = {
|
|
215
135
|
...(params ?? {}),
|
|
216
|
-
['${queryParam}']: pageParam as unknown as ${
|
|
217
|
-
} as ${
|
|
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={
|
|
143
|
+
<Function name={name} export params={paramsSignature}>
|
|
237
144
|
{`
|
|
238
|
-
const queryKey = ${queryKeyName}(${
|
|
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}(${
|
|
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
|
-
${
|
|
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={
|
|
163
|
+
<Function name={name} export params={paramsSignature}>
|
|
265
164
|
{`
|
|
266
|
-
const queryKey = ${queryKeyName}(${
|
|
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}(${
|
|
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
|
-
${
|
|
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 {
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
4
|
-
import { File, Function
|
|
5
|
-
import type {
|
|
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 {
|
|
8
|
-
import {
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
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 =
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
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?: ${
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
client?: ${buildRequestConfigType(node, resolver)},
|
|
72
|
+
}`,
|
|
73
|
+
}),
|
|
74
|
+
default: '{}',
|
|
75
|
+
}),
|
|
76
|
+
],
|
|
72
77
|
})
|
|
73
78
|
}
|
|
74
79
|
|
|
75
|
-
export function Mutation({
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
92
|
-
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
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}(
|
|
107
|
+
const mutationKey = mutationOptions.mutationKey ?? ${mutationKeyName}()
|
|
145
108
|
|
|
146
|
-
const baseOptions = ${
|
|
147
|
-
${customOptions ? `const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${
|
|
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,' : ''}
|