@kubb/plugin-react-query 3.0.0-beta.8 → 3.0.0

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/dist/{chunk-C2H3KPHM.cjs → chunk-EOG7AHFO.cjs} +276 -44
  2. package/dist/chunk-EOG7AHFO.cjs.map +1 -0
  3. package/dist/{chunk-Y3DM2P6L.js → chunk-EY5KE7R7.js} +276 -44
  4. package/dist/chunk-EY5KE7R7.js.map +1 -0
  5. package/dist/{chunk-3U5EOLDD.cjs → chunk-NBC6BPMV.cjs} +141 -110
  6. package/dist/chunk-NBC6BPMV.cjs.map +1 -0
  7. package/dist/{chunk-ES4YRHDI.js → chunk-NZKAIPYC.js} +130 -99
  8. package/dist/chunk-NZKAIPYC.js.map +1 -0
  9. package/dist/components.cjs +9 -9
  10. package/dist/components.d.cts +29 -16
  11. package/dist/components.d.ts +29 -16
  12. package/dist/components.js +1 -1
  13. package/dist/generators.cjs +6 -6
  14. package/dist/generators.d.cts +1 -1
  15. package/dist/generators.d.ts +1 -1
  16. package/dist/generators.js +2 -2
  17. package/dist/index.cjs +24 -24
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +23 -23
  22. package/dist/index.js.map +1 -1
  23. package/dist/{types-LhwfnVo7.d.cts → types-IuxCCG1K.d.cts} +46 -16
  24. package/dist/{types-LhwfnVo7.d.ts → types-IuxCCG1K.d.ts} +46 -16
  25. package/package.json +13 -13
  26. package/src/components/InfiniteQuery.tsx +52 -5
  27. package/src/components/InfiniteQueryOptions.tsx +62 -7
  28. package/src/components/Mutation.tsx +9 -3
  29. package/src/components/MutationKey.tsx +11 -5
  30. package/src/components/Query.tsx +62 -6
  31. package/src/components/QueryKey.tsx +17 -7
  32. package/src/components/QueryOptions.tsx +47 -7
  33. package/src/components/SuspenseQuery.tsx +52 -5
  34. package/src/generators/__snapshots__/clientDataReturnTypeFull.ts +1 -1
  35. package/src/generators/__snapshots__/clientGetImportPath.ts +1 -1
  36. package/src/generators/__snapshots__/findByTags.ts +1 -1
  37. package/src/generators/__snapshots__/findByTagsObject.ts +60 -0
  38. package/src/generators/__snapshots__/findByTagsPathParamsObject.ts +1 -1
  39. package/src/generators/__snapshots__/findByTagsWithCustomQueryKey.ts +2 -2
  40. package/src/generators/__snapshots__/findByTagsWithZod.ts +1 -1
  41. package/src/generators/__snapshots__/findInfiniteByTags.ts +1 -1
  42. package/src/generators/__snapshots__/findInfiniteByTagsCursor.ts +1 -1
  43. package/src/generators/__snapshots__/postAsQuery.ts +1 -1
  44. package/src/generators/__snapshots__/updatePetByIdPathParamsObject.ts +1 -3
  45. package/src/generators/infiniteQueryGenerator.tsx +40 -28
  46. package/src/generators/mutationGenerator.tsx +25 -16
  47. package/src/generators/queryGenerator.tsx +24 -17
  48. package/src/generators/suspenseQueryGenerator.tsx +26 -16
  49. package/src/plugin.ts +23 -20
  50. package/src/types.ts +35 -15
  51. package/dist/chunk-3U5EOLDD.cjs.map +0 -1
  52. package/dist/chunk-C2H3KPHM.cjs.map +0 -1
  53. package/dist/chunk-ES4YRHDI.js.map +0 -1
  54. package/dist/chunk-Y3DM2P6L.js.map +0 -1
@@ -18,24 +18,68 @@ type Props = {
18
18
  queryKeyTypeName: string
19
19
  typeSchemas: OperationSchemas
20
20
  operation: Operation
21
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
21
22
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
22
23
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
23
24
  }
24
25
 
25
26
  type GetParamsProps = {
27
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
26
28
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
27
29
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
28
30
  typeSchemas: OperationSchemas
29
31
  }
30
32
 
31
- function getParams({ pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
33
+ function getParams({ paramsType, pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
32
34
  const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
33
35
 
36
+ if (paramsType === 'object') {
37
+ return FunctionParams.factory({
38
+ data: {
39
+ mode: 'object',
40
+ children: {
41
+ ...getPathParams(typeSchemas.pathParams, { typed: true }),
42
+ data: typeSchemas.request?.name
43
+ ? {
44
+ type: typeSchemas.request?.name,
45
+ optional: isOptional(typeSchemas.request?.schema),
46
+ }
47
+ : undefined,
48
+ params: typeSchemas.queryParams?.name
49
+ ? {
50
+ type: typeSchemas.queryParams?.name,
51
+ optional: isOptional(typeSchemas.queryParams?.schema),
52
+ }
53
+ : undefined,
54
+ headers: typeSchemas.headerParams?.name
55
+ ? {
56
+ type: typeSchemas.headerParams?.name,
57
+ optional: isOptional(typeSchemas.headerParams?.schema),
58
+ }
59
+ : undefined,
60
+ },
61
+ },
62
+ options: {
63
+ type: `
64
+ {
65
+ query?: Partial<InfiniteQueryObserverOptions<${[TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', 'TData', 'TQueryData', 'TQueryKey'].join(', ')}>>,
66
+ client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>>` : 'Partial<RequestConfig>'}
67
+ }
68
+ `,
69
+ default: '{}',
70
+ },
71
+ })
72
+ }
73
+
34
74
  return FunctionParams.factory({
35
- pathParams: {
36
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
37
- children: getPathParams(typeSchemas.pathParams, { typed: true }),
38
- },
75
+ pathParams: typeSchemas.pathParams?.name
76
+ ? {
77
+ mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
78
+ children: getPathParams(typeSchemas.pathParams, { typed: true }),
79
+ type: typeSchemas.pathParams?.name,
80
+ optional: isOptional(typeSchemas.pathParams?.schema),
81
+ }
82
+ : undefined,
39
83
  data: typeSchemas.request?.name
40
84
  ? {
41
85
  type: typeSchemas.request?.name,
@@ -71,6 +115,7 @@ export function InfiniteQuery({
71
115
  queryKeyTypeName,
72
116
  queryOptionsName,
73
117
  queryKeyName,
118
+ paramsType,
74
119
  pathParamsType,
75
120
  dataReturnType,
76
121
  typeSchemas,
@@ -85,10 +130,12 @@ export function InfiniteQuery({
85
130
  typeSchemas,
86
131
  })
87
132
  const queryOptionsParams = QueryOptions.getParams({
133
+ paramsType,
88
134
  pathParamsType,
89
135
  typeSchemas,
90
136
  })
91
137
  const params = getParams({
138
+ paramsType,
92
139
  pathParamsType,
93
140
  dataReturnType,
94
141
  typeSchemas,
@@ -14,6 +14,7 @@ type Props = {
14
14
  clientName: string
15
15
  queryKeyName: string
16
16
  typeSchemas: OperationSchemas
17
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
17
18
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
18
19
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
19
20
  initialPageParam: Infinite['initialPageParam']
@@ -22,16 +23,54 @@ type Props = {
22
23
  }
23
24
 
24
25
  type GetParamsProps = {
26
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
25
27
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
26
28
  typeSchemas: OperationSchemas
27
29
  }
28
30
 
29
- function getParams({ pathParamsType, typeSchemas }: GetParamsProps) {
31
+ function getParams({ paramsType, pathParamsType, typeSchemas }: GetParamsProps) {
32
+ if (paramsType === 'object') {
33
+ return FunctionParams.factory({
34
+ data: {
35
+ mode: 'object',
36
+ children: {
37
+ ...getPathParams(typeSchemas.pathParams, { typed: true }),
38
+ data: typeSchemas.request?.name
39
+ ? {
40
+ type: typeSchemas.request?.name,
41
+ optional: isOptional(typeSchemas.request?.schema),
42
+ }
43
+ : undefined,
44
+ params: typeSchemas.queryParams?.name
45
+ ? {
46
+ type: typeSchemas.queryParams?.name,
47
+ optional: isOptional(typeSchemas.queryParams?.schema),
48
+ }
49
+ : undefined,
50
+ headers: typeSchemas.headerParams?.name
51
+ ? {
52
+ type: typeSchemas.headerParams?.name,
53
+ optional: isOptional(typeSchemas.headerParams?.schema),
54
+ }
55
+ : undefined,
56
+ },
57
+ },
58
+ config: {
59
+ type: typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>>` : 'Partial<RequestConfig>',
60
+ default: '{}',
61
+ },
62
+ })
63
+ }
64
+
30
65
  return FunctionParams.factory({
31
- pathParams: {
32
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
33
- children: getPathParams(typeSchemas.pathParams, { typed: true }),
34
- },
66
+ pathParams: typeSchemas.pathParams?.name
67
+ ? {
68
+ mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
69
+ children: getPathParams(typeSchemas.pathParams, { typed: true }),
70
+ type: typeSchemas.pathParams?.name,
71
+ optional: isOptional(typeSchemas.pathParams?.schema),
72
+ }
73
+ : undefined,
35
74
  data: typeSchemas.request?.name
36
75
  ? {
37
76
  type: typeSchemas.request?.name,
@@ -63,14 +102,16 @@ export function InfiniteQueryOptions({
63
102
  initialPageParam,
64
103
  cursorParam,
65
104
  typeSchemas,
105
+ paramsType,
66
106
  dataReturnType,
67
107
  pathParamsType,
68
108
  queryParam,
69
109
  queryKeyName,
70
110
  }: Props): ReactNode {
71
- const params = getParams({ pathParamsType, typeSchemas })
111
+ const params = getParams({ paramsType, pathParamsType, typeSchemas })
72
112
  const clientParams = Client.getParams({
73
113
  typeSchemas,
114
+ paramsType,
74
115
  pathParamsType,
75
116
  })
76
117
  const queryKeyParams = QueryKey.getParams({
@@ -109,7 +150,8 @@ export function InfiniteQueryOptions({
109
150
  return (
110
151
  <File.Source name={name} isExportable isIndexable>
111
152
  <Function name={name} export params={params.toConstructor()}>
112
- {`
153
+ {infiniteOverrideParams &&
154
+ `
113
155
  const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
114
156
  return infiniteQueryOptions({
115
157
  ${enabledText}
@@ -121,6 +163,19 @@ export function InfiniteQueryOptions({
121
163
  },
122
164
  ${queryOptions.join('\n')}
123
165
  })
166
+ `}
167
+ {!infiniteOverrideParams &&
168
+ `
169
+ const queryKey = ${queryKeyName}(${queryKeyParams.toCall()})
170
+ return infiniteQueryOptions({
171
+ ${enabledText}
172
+ queryKey,
173
+ queryFn: async ({ signal }) => {
174
+ config.signal = signal
175
+ return ${clientName}(${clientParams.toCall()})
176
+ },
177
+ ${queryOptions.join('\n')}
178
+ })
124
179
  `}
125
180
  </Function>
126
181
  </File.Source>
@@ -20,6 +20,7 @@ type Props = {
20
20
  typeSchemas: OperationSchemas
21
21
  operation: Operation
22
22
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
23
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
23
24
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
24
25
  }
25
26
 
@@ -53,7 +54,9 @@ function getParams({ dataReturnType, typeSchemas }: GetParamsProps) {
53
54
  : undefined,
54
55
  })
55
56
  const TRequest = mutationParams.toConstructor({ valueAsType: true })
56
- const generics = [TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', `{${TRequest}}`].join(', ')
57
+ const generics = [TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', TRequest ? `{${TRequest}}` : undefined]
58
+ .filter(Boolean)
59
+ .join(', ')
57
60
 
58
61
  return FunctionParams.factory({
59
62
  options: {
@@ -68,7 +71,7 @@ function getParams({ dataReturnType, typeSchemas }: GetParamsProps) {
68
71
  })
69
72
  }
70
73
 
71
- export function Mutation({ name, clientName, pathParamsType, dataReturnType, typeSchemas, operation, mutationKeyName }: Props): ReactNode {
74
+ export function Mutation({ name, clientName, paramsType, pathParamsType, dataReturnType, typeSchemas, operation, mutationKeyName }: Props): ReactNode {
72
75
  const mutationKeyParams = MutationKey.getParams({
73
76
  pathParamsType,
74
77
  typeSchemas,
@@ -81,6 +84,7 @@ export function Mutation({ name, clientName, pathParamsType, dataReturnType, typ
81
84
  })
82
85
 
83
86
  const clientParams = Client.getParams({
87
+ paramsType,
84
88
  typeSchemas,
85
89
  pathParamsType,
86
90
  })
@@ -127,7 +131,9 @@ export function Mutation({ name, clientName, pathParamsType, dataReturnType, typ
127
131
 
128
132
  const TRequest = mutationParams.toConstructor({ valueAsType: true })
129
133
  const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
130
- const generics = [TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', `{${TRequest}}`].join(', ')
134
+ const generics = [TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', TRequest ? `{${TRequest}}` : undefined]
135
+ .filter(Boolean)
136
+ .join(', ')
131
137
 
132
138
  return (
133
139
  <File.Source name={name} isExportable isIndexable>
@@ -4,7 +4,7 @@ import { File, Function, FunctionParams, Type } from '@kubb/react'
4
4
  import type { Operation } from '@kubb/oas'
5
5
  import type { OperationSchemas } from '@kubb/plugin-oas'
6
6
  import type { ReactNode } from 'react'
7
- import type { PluginReactQuery } from '../types'
7
+ import type { PluginReactQuery, Transformer } from '../types'
8
8
 
9
9
  type Props = {
10
10
  name: string
@@ -12,7 +12,7 @@ type Props = {
12
12
  typeSchemas: OperationSchemas
13
13
  operation: Operation
14
14
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
15
- keysFn: ((keys: unknown[]) => unknown[]) | undefined
15
+ transformer: Transformer | undefined
16
16
  }
17
17
 
18
18
  type GetParamsProps = {
@@ -24,16 +24,21 @@ function getParams({}: GetParamsProps) {
24
24
  return FunctionParams.factory({})
25
25
  }
26
26
 
27
- export function MutationKey({ name, typeSchemas, pathParamsType, operation, typeName, keysFn = (name) => name }: Props): ReactNode {
27
+ const getTransformer: Transformer = ({ operation }) => {
28
28
  const path = new URLPath(operation.path)
29
+
30
+ return [JSON.stringify({ url: path.path })].filter(Boolean)
31
+ }
32
+
33
+ export function MutationKey({ name, typeSchemas, pathParamsType, operation, typeName, transformer = getTransformer }: Props): ReactNode {
29
34
  const params = getParams({ pathParamsType, typeSchemas })
30
- const keys = [JSON.stringify({ url: path.path })].filter(Boolean)
35
+ const keys = transformer({ operation, schemas: typeSchemas })
31
36
 
32
37
  return (
33
38
  <>
34
39
  <File.Source name={name} isExportable isIndexable>
35
40
  <Function.Arrow name={name} export params={params.toConstructor()} singleLine>
36
- {`[${keysFn(keys).join(', ')}] as const`}
41
+ {`[${keys.join(', ')}] as const`}
37
42
  </Function.Arrow>
38
43
  </File.Source>
39
44
  <File.Source name={typeName} isExportable isIndexable isTypeOnly>
@@ -46,3 +51,4 @@ export function MutationKey({ name, typeSchemas, pathParamsType, operation, type
46
51
  }
47
52
 
48
53
  MutationKey.getParams = getParams
54
+ MutationKey.getTransformer = getTransformer
@@ -18,24 +18,68 @@ type Props = {
18
18
  queryKeyTypeName: string
19
19
  typeSchemas: OperationSchemas
20
20
  operation: Operation
21
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
21
22
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
22
23
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
23
24
  }
24
25
 
25
26
  type GetParamsProps = {
27
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
26
28
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
27
29
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
28
30
  typeSchemas: OperationSchemas
29
31
  }
30
32
 
31
- function getParams({ pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
33
+ function getParams({ paramsType, pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
32
34
  const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
33
35
 
36
+ if (paramsType === 'object') {
37
+ return FunctionParams.factory({
38
+ data: {
39
+ mode: 'object',
40
+ children: {
41
+ ...getPathParams(typeSchemas.pathParams, { typed: true }),
42
+ data: typeSchemas.request?.name
43
+ ? {
44
+ type: typeSchemas.request?.name,
45
+ optional: isOptional(typeSchemas.request?.schema),
46
+ }
47
+ : undefined,
48
+ params: typeSchemas.queryParams?.name
49
+ ? {
50
+ type: typeSchemas.queryParams?.name,
51
+ optional: isOptional(typeSchemas.queryParams?.schema),
52
+ }
53
+ : undefined,
54
+ headers: typeSchemas.headerParams?.name
55
+ ? {
56
+ type: typeSchemas.headerParams?.name,
57
+ optional: isOptional(typeSchemas.headerParams?.schema),
58
+ }
59
+ : undefined,
60
+ },
61
+ },
62
+ options: {
63
+ type: `
64
+ {
65
+ query?: Partial<QueryObserverOptions<${[TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', 'TData', 'TQueryData', 'TQueryKey'].join(', ')}>>,
66
+ client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>>` : 'Partial<RequestConfig>'}
67
+ }
68
+ `,
69
+ default: '{}',
70
+ },
71
+ })
72
+ }
73
+
34
74
  return FunctionParams.factory({
35
- pathParams: {
36
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
37
- children: getPathParams(typeSchemas.pathParams, { typed: true }),
38
- },
75
+ pathParams: typeSchemas.pathParams?.name
76
+ ? {
77
+ mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
78
+ children: getPathParams(typeSchemas.pathParams, { typed: true }),
79
+ type: typeSchemas.pathParams?.name,
80
+ optional: isOptional(typeSchemas.pathParams?.schema),
81
+ }
82
+ : undefined,
39
83
  data: typeSchemas.request?.name
40
84
  ? {
41
85
  type: typeSchemas.request?.name,
@@ -66,7 +110,17 @@ function getParams({ pathParamsType, dataReturnType, typeSchemas }: GetParamsPro
66
110
  })
67
111
  }
68
112
 
69
- export function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, pathParamsType, dataReturnType, typeSchemas, operation }: Props): ReactNode {
113
+ export function Query({
114
+ name,
115
+ queryKeyTypeName,
116
+ queryOptionsName,
117
+ queryKeyName,
118
+ paramsType,
119
+ pathParamsType,
120
+ dataReturnType,
121
+ typeSchemas,
122
+ operation,
123
+ }: Props): ReactNode {
70
124
  const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
71
125
  const returnType = `UseQueryResult<${['TData', typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error'].join(', ')}> & { queryKey: TQueryKey }`
72
126
  const generics = [`TData = ${TData}`, `TQueryData = ${TData}`, `TQueryKey extends QueryKey = ${queryKeyTypeName}`]
@@ -76,10 +130,12 @@ export function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
76
130
  typeSchemas,
77
131
  })
78
132
  const queryOptionsParams = QueryOptions.getParams({
133
+ paramsType,
79
134
  pathParamsType,
80
135
  typeSchemas,
81
136
  })
82
137
  const params = getParams({
138
+ paramsType,
83
139
  pathParamsType,
84
140
  dataReturnType,
85
141
  typeSchemas,
@@ -5,7 +5,7 @@ import { File, Function, FunctionParams, Type } from '@kubb/react'
5
5
  import { type Operation, isOptional } from '@kubb/oas'
6
6
  import type { OperationSchemas } from '@kubb/plugin-oas'
7
7
  import type { ReactNode } from 'react'
8
- import type { PluginReactQuery } from '../types'
8
+ import type { PluginReactQuery, Transformer } from '../types'
9
9
 
10
10
  type Props = {
11
11
  name: string
@@ -13,7 +13,7 @@ type Props = {
13
13
  typeSchemas: OperationSchemas
14
14
  operation: Operation
15
15
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
16
- keysFn: ((keys: unknown[]) => unknown[]) | undefined
16
+ transformer: Transformer | undefined
17
17
  }
18
18
 
19
19
  type GetParamsProps = {
@@ -42,23 +42,32 @@ function getParams({ pathParamsType, typeSchemas }: GetParamsProps) {
42
42
  })
43
43
  }
44
44
 
45
- export function QueryKey({ name, typeSchemas, pathParamsType, operation, typeName, keysFn = (name) => name }: Props): ReactNode {
45
+ const getTransformer: Transformer = ({ operation, schemas }) => {
46
46
  const path = new URLPath(operation.path)
47
- const params = getParams({ pathParamsType, typeSchemas })
48
47
  const keys = [
49
48
  path.toObject({
50
49
  type: 'path',
51
50
  stringify: true,
52
51
  }),
53
- typeSchemas.queryParams?.name ? '...(params ? [params] : [])' : undefined,
54
- typeSchemas.request?.name ? '...(data ? [data] : [])' : undefined,
52
+ schemas.queryParams?.name ? '...(params ? [params] : [])' : undefined,
53
+ schemas.request?.name ? '...(data ? [data] : [])' : undefined,
55
54
  ].filter(Boolean)
56
55
 
56
+ return keys
57
+ }
58
+
59
+ export function QueryKey({ name, typeSchemas, pathParamsType, operation, typeName, transformer = getTransformer }: Props): ReactNode {
60
+ const params = getParams({ pathParamsType, typeSchemas })
61
+ const keys = transformer({
62
+ operation,
63
+ schemas: typeSchemas,
64
+ })
65
+
57
66
  return (
58
67
  <>
59
68
  <File.Source name={name} isExportable isIndexable>
60
69
  <Function.Arrow name={name} export params={params.toConstructor()} singleLine>
61
- {`[${keysFn(keys).join(', ')}] as const`}
70
+ {`[${keys.join(', ')}] as const`}
62
71
  </Function.Arrow>
63
72
  </File.Source>
64
73
  <File.Source name={typeName} isExportable isIndexable isTypeOnly>
@@ -71,3 +80,4 @@ export function QueryKey({ name, typeSchemas, pathParamsType, operation, typeNam
71
80
  }
72
81
 
73
82
  QueryKey.getParams = getParams
83
+ QueryKey.getTransformer = getTransformer
@@ -14,20 +14,59 @@ type Props = {
14
14
  clientName: string
15
15
  queryKeyName: string
16
16
  typeSchemas: OperationSchemas
17
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
17
18
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
18
19
  }
19
20
 
20
21
  type GetParamsProps = {
22
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
21
23
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
22
24
  typeSchemas: OperationSchemas
23
25
  }
24
26
 
25
- function getParams({ pathParamsType, typeSchemas }: GetParamsProps) {
27
+ function getParams({ paramsType, pathParamsType, typeSchemas }: GetParamsProps) {
28
+ if (paramsType === 'object') {
29
+ return FunctionParams.factory({
30
+ data: {
31
+ mode: 'object',
32
+ children: {
33
+ ...getPathParams(typeSchemas.pathParams, { typed: true }),
34
+ data: typeSchemas.request?.name
35
+ ? {
36
+ type: typeSchemas.request?.name,
37
+ optional: isOptional(typeSchemas.request?.schema),
38
+ }
39
+ : undefined,
40
+ params: typeSchemas.queryParams?.name
41
+ ? {
42
+ type: typeSchemas.queryParams?.name,
43
+ optional: isOptional(typeSchemas.queryParams?.schema),
44
+ }
45
+ : undefined,
46
+ headers: typeSchemas.headerParams?.name
47
+ ? {
48
+ type: typeSchemas.headerParams?.name,
49
+ optional: isOptional(typeSchemas.headerParams?.schema),
50
+ }
51
+ : undefined,
52
+ },
53
+ },
54
+ config: {
55
+ type: typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>>` : 'Partial<RequestConfig>',
56
+ default: '{}',
57
+ },
58
+ })
59
+ }
60
+
26
61
  return FunctionParams.factory({
27
- pathParams: {
28
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
29
- children: getPathParams(typeSchemas.pathParams, { typed: true }),
30
- },
62
+ pathParams: typeSchemas.pathParams?.name
63
+ ? {
64
+ mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
65
+ children: getPathParams(typeSchemas.pathParams, { typed: true }),
66
+ type: typeSchemas.pathParams?.name,
67
+ optional: isOptional(typeSchemas.pathParams?.schema),
68
+ }
69
+ : undefined,
31
70
  data: typeSchemas.request?.name
32
71
  ? {
33
72
  type: typeSchemas.request?.name,
@@ -53,10 +92,11 @@ function getParams({ pathParamsType, typeSchemas }: GetParamsProps) {
53
92
  })
54
93
  }
55
94
 
56
- export function QueryOptions({ name, clientName, typeSchemas, pathParamsType, queryKeyName }: Props): ReactNode {
57
- const params = getParams({ pathParamsType, typeSchemas })
95
+ export function QueryOptions({ name, clientName, typeSchemas, paramsType, pathParamsType, queryKeyName }: Props): ReactNode {
96
+ const params = getParams({ paramsType, pathParamsType, typeSchemas })
58
97
  const clientParams = Client.getParams({
59
98
  typeSchemas,
99
+ paramsType,
60
100
  pathParamsType,
61
101
  })
62
102
  const queryKeyParams = QueryKey.getParams({
@@ -18,24 +18,68 @@ type Props = {
18
18
  queryKeyTypeName: string
19
19
  typeSchemas: OperationSchemas
20
20
  operation: Operation
21
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
21
22
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
22
23
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
23
24
  }
24
25
 
25
26
  type GetParamsProps = {
27
+ paramsType: PluginReactQuery['resolvedOptions']['paramsType']
26
28
  pathParamsType: PluginReactQuery['resolvedOptions']['pathParamsType']
27
29
  dataReturnType: PluginReactQuery['resolvedOptions']['client']['dataReturnType']
28
30
  typeSchemas: OperationSchemas
29
31
  }
30
32
 
31
- function getParams({ pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
33
+ function getParams({ paramsType, pathParamsType, dataReturnType, typeSchemas }: GetParamsProps) {
32
34
  const TData = dataReturnType === 'data' ? typeSchemas.response.name : `ResponseConfig<${typeSchemas.response.name}>`
33
35
 
36
+ if (paramsType === 'object') {
37
+ return FunctionParams.factory({
38
+ data: {
39
+ mode: 'object',
40
+ children: {
41
+ ...getPathParams(typeSchemas.pathParams, { typed: true }),
42
+ data: typeSchemas.request?.name
43
+ ? {
44
+ type: typeSchemas.request?.name,
45
+ optional: isOptional(typeSchemas.request?.schema),
46
+ }
47
+ : undefined,
48
+ params: typeSchemas.queryParams?.name
49
+ ? {
50
+ type: typeSchemas.queryParams?.name,
51
+ optional: isOptional(typeSchemas.queryParams?.schema),
52
+ }
53
+ : undefined,
54
+ headers: typeSchemas.headerParams?.name
55
+ ? {
56
+ type: typeSchemas.headerParams?.name,
57
+ optional: isOptional(typeSchemas.headerParams?.schema),
58
+ }
59
+ : undefined,
60
+ },
61
+ },
62
+ options: {
63
+ type: `
64
+ {
65
+ query?: Partial<UseSuspenseQueryOptions<${[TData, typeSchemas.errors?.map((item) => item.name).join(' | ') || 'Error', 'TData', 'TQueryKey'].join(', ')}>>,
66
+ client?: ${typeSchemas.request?.name ? `Partial<RequestConfig<${typeSchemas.request?.name}>>` : 'Partial<RequestConfig>'}
67
+ }
68
+ `,
69
+ default: '{}',
70
+ },
71
+ })
72
+ }
73
+
34
74
  return FunctionParams.factory({
35
- pathParams: {
36
- mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
37
- children: getPathParams(typeSchemas.pathParams, { typed: true }),
38
- },
75
+ pathParams: typeSchemas.pathParams?.name
76
+ ? {
77
+ mode: pathParamsType === 'object' ? 'object' : 'inlineSpread',
78
+ children: getPathParams(typeSchemas.pathParams, { typed: true }),
79
+ type: typeSchemas.pathParams?.name,
80
+ optional: isOptional(typeSchemas.pathParams?.schema),
81
+ }
82
+ : undefined,
39
83
  data: typeSchemas.request?.name
40
84
  ? {
41
85
  type: typeSchemas.request?.name,
@@ -71,6 +115,7 @@ export function SuspenseQuery({
71
115
  queryKeyTypeName,
72
116
  queryOptionsName,
73
117
  queryKeyName,
118
+ paramsType,
74
119
  pathParamsType,
75
120
  dataReturnType,
76
121
  typeSchemas,
@@ -85,10 +130,12 @@ export function SuspenseQuery({
85
130
  typeSchemas,
86
131
  })
87
132
  const queryOptionsParams = QueryOptions.getParams({
133
+ paramsType,
88
134
  pathParamsType,
89
135
  typeSchemas,
90
136
  })
91
137
  const params = getParams({
138
+ paramsType,
92
139
  pathParamsType,
93
140
  dataReturnType,
94
141
  typeSchemas,
@@ -1,7 +1,7 @@
1
1
  import client from "@kubb/plugin-client/client";
2
2
  import type { RequestConfig, ResponseConfig } from "@kubb/plugin-client/client";
3
3
  import type { QueryKey, QueryObserverOptions, UseQueryResult } from "@tanstack/react-query";
4
- import { useQuery, queryOptions } from "@tanstack/react-query";
4
+ import { queryOptions, useQuery } from "@tanstack/react-query";
5
5
 
6
6
  export const findPetsByTagsQueryKey = (params?: FindPetsByTagsQueryParams) => [{ url: "/pet/findByTags" }, ...(params ? [params] : [])] as const;
7
7
 
@@ -1,7 +1,7 @@
1
1
  import client from "axios";
2
2
  import type { QueryKey, QueryObserverOptions, UseQueryResult } from "@tanstack/react-query";
3
3
  import type { RequestConfig } from "axios";
4
- import { useQuery, queryOptions } from "@tanstack/react-query";
4
+ import { queryOptions, useQuery } from "@tanstack/react-query";
5
5
 
6
6
  export const findPetsByTagsQueryKey = (params?: FindPetsByTagsQueryParams) => [{ url: "/pet/findByTags" }, ...(params ? [params] : [])] as const;
7
7
 
@@ -1,7 +1,7 @@
1
1
  import client from "@kubb/plugin-client/client";
2
2
  import type { RequestConfig } from "@kubb/plugin-client/client";
3
3
  import type { QueryKey, QueryObserverOptions, UseQueryResult } from "@tanstack/react-query";
4
- import { useQuery, queryOptions } from "@tanstack/react-query";
4
+ import { queryOptions, useQuery } from "@tanstack/react-query";
5
5
 
6
6
  export const findPetsByTagsQueryKey = (params?: FindPetsByTagsQueryParams) => [{ url: "/pet/findByTags" }, ...(params ? [params] : [])] as const;
7
7