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

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 (53) 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/extension.yaml +938 -0
  24. package/package.json +59 -62
  25. package/src/components/InfiniteQuery.tsx +75 -139
  26. package/src/components/InfiniteQueryOptions.tsx +62 -164
  27. package/src/components/Mutation.tsx +58 -113
  28. package/src/components/MutationOptions.tsx +61 -80
  29. package/src/components/Query.tsx +67 -140
  30. package/src/components/QueryOptions.tsx +75 -135
  31. package/src/components/SuspenseInfiniteQuery.tsx +75 -139
  32. package/src/components/SuspenseInfiniteQueryOptions.tsx +62 -164
  33. package/src/components/SuspenseQuery.tsx +67 -150
  34. package/src/generators/customHookOptionsFileGenerator.tsx +33 -45
  35. package/src/generators/hookOptionsGenerator.tsx +115 -175
  36. package/src/generators/infiniteQueryGenerator.tsx +183 -176
  37. package/src/generators/mutationGenerator.tsx +127 -138
  38. package/src/generators/queryGenerator.tsx +141 -141
  39. package/src/generators/suspenseInfiniteQueryGenerator.tsx +175 -155
  40. package/src/generators/suspenseQueryGenerator.tsx +149 -148
  41. package/src/index.ts +1 -1
  42. package/src/plugin.ts +133 -183
  43. package/src/resolvers/resolverReactQuery.ts +22 -0
  44. package/src/types.ts +67 -45
  45. package/src/utils.ts +40 -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
package/package.json CHANGED
@@ -1,35 +1,56 @@
1
1
  {
2
2
  "name": "@kubb/plugin-react-query",
3
- "version": "5.0.0-alpha.9",
3
+ "version": "5.0.0-beta.4",
4
4
  "description": "React Query hooks generator plugin for Kubb, creating type-safe API client hooks from OpenAPI specifications for React applications.",
5
5
  "keywords": [
6
- "react-query",
7
- "tanstack-query",
8
- "react",
9
- "react-hooks",
10
- "hooks",
11
- "data-fetching",
12
6
  "api-client",
13
- "sdk-generator",
14
- "typescript",
15
- "type-safe",
16
- "openapi",
17
- "swagger",
18
- "oas",
19
7
  "code-generator",
20
8
  "codegen",
9
+ "data-fetching",
10
+ "hooks",
11
+ "kubb",
12
+ "oas",
13
+ "openapi",
21
14
  "plugins",
22
- "kubb"
15
+ "react",
16
+ "react-hooks",
17
+ "react-query",
18
+ "sdk-generator",
19
+ "swagger",
20
+ "tanstack-query",
21
+ "type-safe",
22
+ "typescript"
23
23
  ],
24
+ "license": "MIT",
25
+ "author": "stijnvanhulle",
24
26
  "repository": {
25
27
  "type": "git",
26
- "url": "git+https://github.com/kubb-labs/kubb.git",
28
+ "url": "git+https://github.com/kubb-labs/plugins.git",
27
29
  "directory": "packages/plugin-react-query"
28
30
  },
29
- "license": "MIT",
30
- "author": "stijnvanhulle",
31
- "sideEffects": false,
31
+ "files": [
32
+ "src",
33
+ "dist",
34
+ "extension.yaml",
35
+ "!/**/**.test.**",
36
+ "!/**/__tests__/**",
37
+ "!/**/__snapshots__/**"
38
+ ],
32
39
  "type": "module",
40
+ "sideEffects": false,
41
+ "main": "./dist/index.cjs",
42
+ "module": "./dist/index.js",
43
+ "types": "./dist/index.d.ts",
44
+ "typesVersions": {
45
+ "*": {
46
+ "components": [
47
+ "./dist/components.d.ts"
48
+ ],
49
+ "generators": [
50
+ "./dist/generators.d.ts"
51
+ ]
52
+ }
53
+ },
33
54
  "exports": {
34
55
  ".": {
35
56
  "import": "./dist/index.js",
@@ -45,24 +66,25 @@
45
66
  },
46
67
  "./package.json": "./package.json"
47
68
  },
48
- "types": "./dist/index.d.ts",
49
- "typesVersions": {
50
- "*": {
51
- "components": [
52
- "./dist/components.d.ts"
53
- ],
54
- "generators": [
55
- "./dist/generators.d.ts"
56
- ]
57
- }
69
+ "publishConfig": {
70
+ "access": "public",
71
+ "registry": "https://registry.npmjs.org/"
72
+ },
73
+ "dependencies": {
74
+ "@kubb/core": "5.0.0-beta.4",
75
+ "@kubb/renderer-jsx": "5.0.0-beta.4",
76
+ "remeda": "^2.34.0",
77
+ "@kubb/plugin-client": "5.0.0-beta.4",
78
+ "@kubb/plugin-ts": "5.0.0-beta.4",
79
+ "@kubb/plugin-zod": "5.0.0-beta.4"
80
+ },
81
+ "devDependencies": {
82
+ "@internals/tanstack-query": "0.0.0",
83
+ "@internals/utils": "0.0.0"
84
+ },
85
+ "peerDependencies": {
86
+ "@kubb/renderer-jsx": "5.0.0-beta.4"
58
87
  },
59
- "files": [
60
- "src",
61
- "dist",
62
- "!/**/**.test.**",
63
- "!/**/__tests__/**",
64
- "!/**/__snapshots__/**"
65
- ],
66
88
  "size-limit": [
67
89
  {
68
90
  "path": "./dist/*.js",
@@ -70,39 +92,14 @@
70
92
  "gzip": true
71
93
  }
72
94
  ],
73
- "dependencies": {
74
- "@kubb/fabric-core": "0.14.0",
75
- "@kubb/react-fabric": "0.14.0",
76
- "remeda": "^2.33.6",
77
- "@kubb/core": "5.0.0-alpha.9",
78
- "@kubb/oas": "5.0.0-alpha.9",
79
- "@kubb/plugin-client": "5.0.0-alpha.9",
80
- "@kubb/plugin-oas": "5.0.0-alpha.9",
81
- "@kubb/plugin-ts": "5.0.0-alpha.9",
82
- "@kubb/plugin-zod": "5.0.0-alpha.9"
83
- },
84
- "peerDependencies": {
85
- "@kubb/fabric-core": "0.14.0",
86
- "@kubb/react-fabric": "0.14.0"
87
- },
88
95
  "engines": {
89
96
  "node": ">=22"
90
97
  },
91
- "publishConfig": {
92
- "access": "public",
93
- "registry": "https://registry.npmjs.org/"
94
- },
95
- "main": "./dist/index.cjs",
96
- "module": "./dist/index.js",
97
- "devDependencies": {
98
- "@internals/tanstack-query": "0.0.0",
99
- "@internals/utils": "0.0.0"
100
- },
101
98
  "scripts": {
102
99
  "build": "tsdown && size-limit",
103
100
  "clean": "npx rimraf ./dist",
104
- "lint": "bun biome lint .",
105
- "lint:fix": "bun biome lint --fix --unsafe .",
101
+ "lint": "oxlint .",
102
+ "lint:fix": "oxlint --fix .",
106
103
  "release": "pnpm publish --no-git-check",
107
104
  "release:canary": "bash ../../.github/canary.sh && node ../../scripts/build.js canary && pnpm publish --no-git-check",
108
105
  "start": "tsdown --watch",
@@ -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}