@kubb/plugin-client 5.0.0-alpha.28 → 5.0.0-alpha.29

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 (41) hide show
  1. package/dist/index.cjs +1911 -62
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +468 -2
  4. package/dist/index.js +1903 -65
  5. package/dist/index.js.map +1 -1
  6. package/package.json +5 -20
  7. package/src/components/ClassClient.tsx +42 -138
  8. package/src/components/Client.tsx +85 -125
  9. package/src/components/ClientLegacy.tsx +501 -0
  10. package/src/components/Operations.tsx +8 -8
  11. package/src/components/StaticClassClient.tsx +41 -135
  12. package/src/components/Url.tsx +37 -46
  13. package/src/generators/classClientGenerator.tsx +121 -131
  14. package/src/generators/clientGenerator.tsx +104 -80
  15. package/src/generators/groupedClientGenerator.tsx +28 -30
  16. package/src/generators/operationsGenerator.tsx +11 -17
  17. package/src/generators/staticClassClientGenerator.tsx +115 -121
  18. package/src/index.ts +11 -1
  19. package/src/plugin.ts +121 -92
  20. package/src/presets.ts +25 -0
  21. package/src/resolvers/resolverClient.ts +26 -0
  22. package/src/resolvers/resolverClientLegacy.ts +26 -0
  23. package/src/types.ts +93 -39
  24. package/src/utils.ts +148 -0
  25. package/dist/StaticClassClient-D6v3vhZL.js +0 -695
  26. package/dist/StaticClassClient-D6v3vhZL.js.map +0 -1
  27. package/dist/StaticClassClient-GyNiWMHA.cjs +0 -736
  28. package/dist/StaticClassClient-GyNiWMHA.cjs.map +0 -1
  29. package/dist/components.cjs +0 -7
  30. package/dist/components.d.ts +0 -216
  31. package/dist/components.js +0 -2
  32. package/dist/generators-C0t5dIvZ.js +0 -723
  33. package/dist/generators-C0t5dIvZ.js.map +0 -1
  34. package/dist/generators-D8A8QE4S.cjs +0 -753
  35. package/dist/generators-D8A8QE4S.cjs.map +0 -1
  36. package/dist/generators.cjs +0 -7
  37. package/dist/generators.d.ts +0 -21
  38. package/dist/generators.js +0 -2
  39. package/dist/types-jdcuAELq.d.ts +0 -169
  40. package/src/components/index.ts +0 -5
  41. package/src/generators/index.ts +0 -5
package/src/utils.ts ADDED
@@ -0,0 +1,148 @@
1
+ import { URLPath } from '@internals/utils'
2
+ import type { OperationNode, ParameterNode } from '@kubb/ast/types'
3
+ import type { PluginTs } from '@kubb/plugin-ts'
4
+ import type { PluginZod } from '@kubb/plugin-zod'
5
+ import { FunctionParams } from '@kubb/react-fabric'
6
+ import type { PluginClient } from './types.ts'
7
+
8
+ export function getComments(node: OperationNode): Array<string> {
9
+ return [
10
+ node.description && `@description ${node.description}`,
11
+ node.summary && `@summary ${node.summary}`,
12
+ node.path && `{@link ${new URLPath(node.path).URL}}`,
13
+ node.deprecated && '@deprecated',
14
+ ]
15
+ .filter((x): x is string => Boolean(x))
16
+ .flatMap((text) => text.split(/\r?\n/).map((line) => line.trim()))
17
+ .filter((x): x is string => Boolean(x))
18
+ }
19
+
20
+ export function buildParamsMapping(originalParams: Array<ParameterNode>, casedParams: Array<ParameterNode>): Record<string, string> | undefined {
21
+ const mapping: Record<string, string> = {}
22
+ let hasChanged = false
23
+ originalParams.forEach((param, i) => {
24
+ const casedName = casedParams[i]?.name ?? param.name
25
+ mapping[param.name] = casedName
26
+ if (param.name !== casedName) {
27
+ hasChanged = true
28
+ }
29
+ })
30
+ return hasChanged ? mapping : undefined
31
+ }
32
+
33
+ export function buildHeaders(contentType: string, hasHeaderParams: boolean): Array<string> {
34
+ return [
35
+ contentType !== 'application/json' && contentType !== 'multipart/form-data' ? `'Content-Type': '${contentType}'` : undefined,
36
+ hasHeaderParams ? '...headers' : undefined,
37
+ ].filter(Boolean) as Array<string>
38
+ }
39
+
40
+ export function buildGenerics(node: OperationNode, tsResolver: PluginTs['resolver']): Array<string> {
41
+ const responseName = tsResolver.resolveResponseName(node)
42
+ const requestName = node.requestBody?.schema ? tsResolver.resolveDataName(node) : undefined
43
+ const errorNames = node.responses.filter((r) => Number.parseInt(r.statusCode, 10) >= 400).map((r) => tsResolver.resolveResponseStatusName(node, r.statusCode))
44
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
45
+ return [responseName, TError, requestName || 'unknown'].filter(Boolean)
46
+ }
47
+
48
+ export function buildClassClientParams({
49
+ node,
50
+ path,
51
+ baseURL,
52
+ tsResolver,
53
+ isFormData,
54
+ headers,
55
+ }: {
56
+ node: OperationNode
57
+ path: URLPath
58
+ baseURL: string | undefined
59
+ tsResolver: PluginTs['resolver']
60
+ isFormData: boolean
61
+ headers: Array<string>
62
+ }) {
63
+ const queryParamsName =
64
+ node.parameters.filter((p) => p.in === 'query').length > 0
65
+ ? tsResolver.resolveQueryParamsName(node, node.parameters.filter((p) => p.in === 'query')[0]!)
66
+ : undefined
67
+ const requestName = node.requestBody?.schema ? tsResolver.resolveDataName(node) : undefined
68
+
69
+ return FunctionParams.factory({
70
+ config: {
71
+ mode: 'object',
72
+ children: {
73
+ requestConfig: {
74
+ mode: 'inlineSpread',
75
+ },
76
+ method: {
77
+ value: JSON.stringify(node.method.toUpperCase()),
78
+ },
79
+ url: {
80
+ value: path.template,
81
+ },
82
+ baseURL: baseURL
83
+ ? {
84
+ value: JSON.stringify(baseURL),
85
+ }
86
+ : undefined,
87
+ params: queryParamsName ? {} : undefined,
88
+ data: requestName
89
+ ? {
90
+ value: isFormData ? 'formData as FormData' : 'requestData',
91
+ }
92
+ : undefined,
93
+ headers: headers.length
94
+ ? {
95
+ value: `{ ${headers.join(', ')}, ...requestConfig.headers }`,
96
+ }
97
+ : undefined,
98
+ },
99
+ },
100
+ })
101
+ }
102
+
103
+ export function buildRequestDataLine({
104
+ parser,
105
+ node,
106
+ zodResolver,
107
+ }: {
108
+ parser: PluginClient['resolvedOptions']['parser'] | undefined
109
+ node: OperationNode
110
+ zodResolver?: PluginZod['resolver']
111
+ }): string {
112
+ const zodRequestName = zodResolver && parser === 'zod' && node.requestBody?.schema ? zodResolver.resolveDataName?.(node) : undefined
113
+ if (parser === 'zod' && zodRequestName) {
114
+ return `const requestData = ${zodRequestName}.parse(data)`
115
+ }
116
+ if (node.requestBody?.schema) {
117
+ return 'const requestData = data'
118
+ }
119
+ return ''
120
+ }
121
+
122
+ export function buildFormDataLine(isFormData: boolean, hasRequest: boolean): string {
123
+ return isFormData && hasRequest ? 'const formData = buildFormData(requestData)' : ''
124
+ }
125
+
126
+ export function buildReturnStatement({
127
+ dataReturnType,
128
+ parser,
129
+ node,
130
+ zodResolver,
131
+ }: {
132
+ dataReturnType: PluginClient['resolvedOptions']['dataReturnType']
133
+ parser: PluginClient['resolvedOptions']['parser'] | undefined
134
+ node: OperationNode
135
+ zodResolver?: PluginZod['resolver']
136
+ }): string {
137
+ const zodResponseName = zodResolver && parser === 'zod' ? zodResolver.resolveResponseName?.(node) : undefined
138
+ if (dataReturnType === 'full' && parser === 'zod' && zodResponseName) {
139
+ return `return {...res, data: ${zodResponseName}.parse(res.data)}`
140
+ }
141
+ if (dataReturnType === 'data' && parser === 'zod' && zodResponseName) {
142
+ return `return ${zodResponseName}.parse(res.data)`
143
+ }
144
+ if (dataReturnType === 'full' && parser === 'client') {
145
+ return 'return res'
146
+ }
147
+ return 'return res.data'
148
+ }