@kubb/plugin-ts 5.0.0-alpha.11 → 5.0.0-alpha.13

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 (57) hide show
  1. package/dist/Type-C8EHVKjc.js +663 -0
  2. package/dist/Type-C8EHVKjc.js.map +1 -0
  3. package/dist/Type-DrOq6-nh.cjs +680 -0
  4. package/dist/Type-DrOq6-nh.cjs.map +1 -0
  5. package/dist/casing-Cp-jbC_k.js +84 -0
  6. package/dist/casing-Cp-jbC_k.js.map +1 -0
  7. package/dist/casing-D2uQKLWS.cjs +144 -0
  8. package/dist/casing-D2uQKLWS.cjs.map +1 -0
  9. package/dist/components.cjs +3 -2
  10. package/dist/components.d.ts +41 -9
  11. package/dist/components.js +2 -2
  12. package/dist/generators-CX3cSSdF.cjs +551 -0
  13. package/dist/generators-CX3cSSdF.cjs.map +1 -0
  14. package/dist/generators-dCqW0ECC.js +547 -0
  15. package/dist/generators-dCqW0ECC.js.map +1 -0
  16. package/dist/generators.cjs +2 -3
  17. package/dist/generators.d.ts +3 -503
  18. package/dist/generators.js +2 -2
  19. package/dist/index.cjs +135 -4
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.ts +2 -41
  22. package/dist/index.js +134 -2
  23. package/dist/index.js.map +1 -0
  24. package/dist/resolvers-CH7hINyz.js +181 -0
  25. package/dist/resolvers-CH7hINyz.js.map +1 -0
  26. package/dist/resolvers-ebHaaCyw.cjs +191 -0
  27. package/dist/resolvers-ebHaaCyw.cjs.map +1 -0
  28. package/dist/resolvers.cjs +4 -0
  29. package/dist/resolvers.d.ts +51 -0
  30. package/dist/resolvers.js +2 -0
  31. package/dist/{types-mSXmB8WU.d.ts → types-BSRhtbGl.d.ts} +80 -57
  32. package/package.json +12 -5
  33. package/src/components/{v2/Enum.tsx → Enum.tsx} +27 -11
  34. package/src/components/Type.tsx +24 -141
  35. package/src/components/index.ts +1 -0
  36. package/src/generators/index.ts +0 -1
  37. package/src/generators/typeGenerator.tsx +204 -413
  38. package/src/generators/utils.ts +300 -0
  39. package/src/index.ts +0 -1
  40. package/src/plugin.ts +81 -126
  41. package/src/printer.ts +20 -6
  42. package/src/resolvers/index.ts +2 -0
  43. package/src/{resolverTs.ts → resolvers/resolverTs.ts} +26 -2
  44. package/src/resolvers/resolverTsLegacy.ts +85 -0
  45. package/src/types.ts +75 -52
  46. package/dist/components-CRu8IKY3.js +0 -729
  47. package/dist/components-CRu8IKY3.js.map +0 -1
  48. package/dist/components-DeNDKlzf.cjs +0 -982
  49. package/dist/components-DeNDKlzf.cjs.map +0 -1
  50. package/dist/plugin-CJ29AwE2.cjs +0 -1320
  51. package/dist/plugin-CJ29AwE2.cjs.map +0 -1
  52. package/dist/plugin-D60XNJSD.js +0 -1267
  53. package/dist/plugin-D60XNJSD.js.map +0 -1
  54. package/src/components/v2/Type.tsx +0 -59
  55. package/src/generators/v2/typeGenerator.tsx +0 -167
  56. package/src/generators/v2/utils.ts +0 -140
  57. package/src/parser.ts +0 -389
@@ -1,466 +1,257 @@
1
- import { pascalCase } from '@internals/utils'
2
- import type { PluginDriver } from '@kubb/core'
3
- import { useMode, usePluginDriver } from '@kubb/core/hooks'
4
- import { safePrint } from '@kubb/fabric-core/parsers/typescript'
5
- import type { Operation } from '@kubb/oas'
6
- import { isKeyword, type OperationSchemas, type OperationSchema as OperationSchemaType, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'
7
- import { createReactGenerator } from '@kubb/plugin-oas/generators'
8
- import { useOas, useOperationManager, useSchemaManager } from '@kubb/plugin-oas/hooks'
9
- import { applyParamsCasing, getBanner, getFooter, getImports, isParameterSchema } from '@kubb/plugin-oas/utils'
1
+ import { applyParamsCasing } from '@kubb/ast'
2
+ import type { SchemaNode } from '@kubb/ast/types'
3
+ import { defineGenerator } from '@kubb/core'
4
+ import { useKubb } from '@kubb/core/hooks'
10
5
  import { File } from '@kubb/react-fabric'
11
- import ts from 'typescript'
12
- import { Type } from '../components'
13
- import * as factory from '../factory.ts'
14
- import { createUrlTemplateType, getUnknownType, keywordTypeNodes } from '../factory.ts'
15
- import { pluginTsName } from '../plugin.ts'
6
+ import { Type } from '../components/Type.tsx'
7
+ import { ENUM_TYPES_WITH_KEY_SUFFIX } from '../constants.ts'
16
8
  import type { PluginTs } from '../types'
17
-
18
- function printCombinedSchema({ name, schemas, driver }: { name: string; schemas: OperationSchemas; driver: PluginDriver }): string {
19
- const properties: Record<string, ts.TypeNode> = {}
20
-
21
- if (schemas.response) {
22
- properties['response'] = factory.createUnionDeclaration({
23
- nodes: schemas.responses.map((res) => {
24
- const identifier = driver.resolveName({
25
- name: res.name,
26
- pluginName: pluginTsName,
27
- type: 'function',
28
- })
29
-
30
- return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
31
- }),
32
- })!
33
- }
34
-
35
- if (schemas.request) {
36
- const identifier = driver.resolveName({
37
- name: schemas.request.name,
38
- pluginName: pluginTsName,
39
- type: 'function',
40
- })
41
- properties['request'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
42
- }
43
-
44
- if (schemas.pathParams) {
45
- const identifier = driver.resolveName({
46
- name: schemas.pathParams.name,
47
- pluginName: pluginTsName,
48
- type: 'function',
49
- })
50
- properties['pathParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
51
- }
52
-
53
- if (schemas.queryParams) {
54
- const identifier = driver.resolveName({
55
- name: schemas.queryParams.name,
56
- pluginName: pluginTsName,
57
- type: 'function',
58
- })
59
- properties['queryParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
60
- }
61
-
62
- if (schemas.headerParams) {
63
- const identifier = driver.resolveName({
64
- name: schemas.headerParams.name,
65
- pluginName: pluginTsName,
66
- type: 'function',
67
- })
68
- properties['headerParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
69
- }
70
-
71
- if (schemas.errors) {
72
- properties['errors'] = factory.createUnionDeclaration({
73
- nodes: schemas.errors.map((error) => {
74
- const identifier = driver.resolveName({
75
- name: error.name,
76
- pluginName: pluginTsName,
77
- type: 'function',
78
- })
79
-
80
- return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)
81
- }),
82
- })!
83
- }
84
-
85
- const namespaceNode = factory.createTypeAliasDeclaration({
86
- name,
87
- type: factory.createTypeLiteralNode(
88
- Object.keys(properties)
89
- .map((key) => {
90
- const type = properties[key]
91
- if (!type) {
92
- return undefined
93
- }
94
-
95
- return factory.createPropertySignature({
96
- name: pascalCase(key),
97
- type,
98
- })
99
- })
100
- .filter(Boolean),
101
- ),
102
- modifiers: [factory.modifiers.export],
103
- })
104
-
105
- return safePrint(namespaceNode)
106
- }
107
-
108
- function printRequestSchema({
109
- baseName,
110
- operation,
111
- schemas,
112
- driver,
113
- }: {
114
- baseName: string
115
- operation: Operation
116
- schemas: OperationSchemas
117
- driver: PluginDriver
118
- }): string {
119
- const name = driver.resolveName({
120
- name: `${baseName} Request`,
121
- pluginName: pluginTsName,
122
- type: 'type',
123
- })
124
-
125
- const results: string[] = []
126
-
127
- // Generate DataRequest type
128
- const dataRequestProperties: ts.PropertySignature[] = []
129
-
130
- if (schemas.request) {
131
- const identifier = driver.resolveName({
132
- name: schemas.request.name,
133
- pluginName: pluginTsName,
134
- type: 'type',
135
- })
136
- dataRequestProperties.push(
137
- factory.createPropertySignature({
138
- name: 'data',
139
- questionToken: true,
140
- type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),
141
- }),
142
- )
143
- } else {
144
- dataRequestProperties.push(
145
- factory.createPropertySignature({
146
- name: 'data',
147
- questionToken: true,
148
- type: keywordTypeNodes.never,
149
- }),
150
- )
151
- }
152
-
153
- // Add pathParams property
154
- if (schemas.pathParams) {
155
- const identifier = driver.resolveName({
156
- name: schemas.pathParams.name,
157
- pluginName: pluginTsName,
158
- type: 'type',
159
- })
160
- dataRequestProperties.push(
161
- factory.createPropertySignature({
162
- name: 'pathParams',
163
- type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),
164
- }),
165
- )
166
- } else {
167
- dataRequestProperties.push(
168
- factory.createPropertySignature({
169
- name: 'pathParams',
170
- questionToken: true,
171
- type: keywordTypeNodes.never,
172
- }),
173
- )
174
- }
175
-
176
- // Add queryParams property
177
- if (schemas.queryParams) {
178
- const identifier = driver.resolveName({
179
- name: schemas.queryParams.name,
180
- pluginName: pluginTsName,
181
- type: 'type',
182
- })
183
- dataRequestProperties.push(
184
- factory.createPropertySignature({
185
- name: 'queryParams',
186
- questionToken: true,
187
- type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),
188
- }),
189
- )
190
- } else {
191
- dataRequestProperties.push(
192
- factory.createPropertySignature({
193
- name: 'queryParams',
194
- questionToken: true,
195
- type: keywordTypeNodes.never,
196
- }),
197
- )
198
- }
199
-
200
- // Add headerParams property
201
- if (schemas.headerParams) {
202
- const identifier = driver.resolveName({
203
- name: schemas.headerParams.name,
204
- pluginName: pluginTsName,
205
- type: 'type',
206
- })
207
- dataRequestProperties.push(
208
- factory.createPropertySignature({
209
- name: 'headerParams',
210
- questionToken: true,
211
- type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),
212
- }),
213
- )
214
- } else {
215
- dataRequestProperties.push(
216
- factory.createPropertySignature({
217
- name: 'headerParams',
218
- questionToken: true,
219
- type: keywordTypeNodes.never,
220
- }),
221
- )
222
- }
223
-
224
- // Add url property with template literal type
225
- dataRequestProperties.push(
226
- factory.createPropertySignature({
227
- name: 'url',
228
- type: createUrlTemplateType(operation.path),
229
- }),
230
- )
231
-
232
- const dataRequestNode = factory.createTypeAliasDeclaration({
233
- name,
234
- type: factory.createTypeLiteralNode(dataRequestProperties),
235
- modifiers: [factory.modifiers.export],
236
- })
237
-
238
- results.push(safePrint(dataRequestNode))
239
-
240
- return results.join('\n\n')
241
- }
242
-
243
- function printResponseSchema({
244
- baseName,
245
- schemas,
246
- driver,
247
- unknownType,
248
- }: {
249
- baseName: string
250
- schemas: OperationSchemas
251
- driver: PluginDriver
252
- unknownType: PluginTs['resolvedOptions']['unknownType']
253
- }): string {
254
- const results: string[] = []
255
-
256
- const name = driver.resolveName({
257
- name: `${baseName} ResponseData`,
258
- pluginName: pluginTsName,
259
- type: 'type',
260
- })
261
-
262
- // Generate Responses type (mapping status codes to response types)
263
- if (schemas.responses && schemas.responses.length > 0) {
264
- const responsesProperties: ts.PropertySignature[] = schemas.responses.map((res) => {
265
- const identifier = driver.resolveName({
266
- name: res.name,
267
- pluginName: pluginTsName,
268
- type: 'type',
269
- })
270
-
271
- return factory.createPropertySignature({
272
- name: res.statusCode?.toString() ?? 'default',
273
- type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),
274
- })
275
- })
276
-
277
- const responsesNode = factory.createTypeAliasDeclaration({
278
- name: `${baseName}Responses`,
279
- type: factory.createTypeLiteralNode(responsesProperties),
280
- modifiers: [factory.modifiers.export],
281
- })
282
-
283
- results.push(safePrint(responsesNode))
284
-
285
- // Generate Response type (union via indexed access)
286
- const responseNode = factory.createTypeAliasDeclaration({
287
- name,
288
- type: factory.createIndexedAccessTypeNode(
289
- factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),
290
- factory.createTypeOperatorNode(
291
- ts.SyntaxKind.KeyOfKeyword,
292
- factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),
293
- ),
294
- ),
295
- modifiers: [factory.modifiers.export],
296
- })
297
-
298
- results.push(safePrint(responseNode))
299
- } else {
300
- const responseNode = factory.createTypeAliasDeclaration({
301
- name,
302
- modifiers: [factory.modifiers.export],
303
- type: getUnknownType(unknownType),
304
- })
305
-
306
- results.push(safePrint(responseNode))
307
- }
308
-
309
- return results.join('\n\n')
310
- }
311
-
312
- export const typeGenerator = createReactGenerator<PluginTs>({
9
+ import {
10
+ buildDataSchemaNode,
11
+ buildGroupedParamsSchema,
12
+ buildLegacyResponsesSchemaNode,
13
+ buildLegacyResponseUnionSchemaNode,
14
+ buildParamsSchema,
15
+ buildResponsesSchemaNode,
16
+ buildResponseUnionSchemaNode,
17
+ nameUnnamedEnums,
18
+ } from './utils.ts'
19
+
20
+ export const typeGenerator = defineGenerator<PluginTs>({
313
21
  name: 'typescript',
314
- Operation({ operation, generator, plugin }) {
315
- const {
316
- options,
317
- options: { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, unknownType, paramsCasing },
318
- } = plugin
319
-
320
- const mode = useMode()
321
- const driver = usePluginDriver()
322
-
323
- const oas = useOas()
324
- const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator)
325
- const schemaManager = useSchemaManager()
326
-
327
- const name = getName(operation, { type: 'type', pluginName: pluginTsName })
328
-
329
- const file = getFile(operation)
330
- const schemas = getSchemas(operation)
331
- const schemaGenerator = new SchemaGenerator(options, {
332
- fabric: generator.context.fabric,
333
- oas,
334
- events: generator.context.events,
335
- plugin,
336
- driver,
22
+ type: 'react',
23
+ Operation({ node, adapter, options }) {
24
+ const { enumType, enumKeyCasing, optionalType, arrayType, syntaxType, paramsCasing, group, resolver, baseResolver, legacy } = options
25
+ const { mode, getFile, resolveBanner, resolveFooter } = useKubb<PluginTs>()
26
+
27
+ const file = getFile({
28
+ name: node.operationId,
29
+ extname: '.ts',
337
30
  mode,
338
- override: options.override,
31
+ options: {
32
+ group: group ? (group.type === 'tag' ? { tag: node.tags[0] ?? 'default' } : { path: node.path }) : undefined,
33
+ },
339
34
  })
35
+ const params = applyParamsCasing(node.parameters, paramsCasing)
340
36
 
341
- const operationSchemas = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response]
342
- .flat()
343
- .filter(Boolean)
344
-
345
- const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options }: OperationSchemaType) => {
346
- // Apply paramsCasing transformation to pathParams, queryParams, and headerParams (not response)
347
- const shouldTransform = paramsCasing && isParameterSchema(name)
348
- const transformedSchema = shouldTransform ? applyParamsCasing(schema, paramsCasing) : schema
349
-
350
- const tree = schemaGenerator.parse({ schema: transformedSchema, name, parentName: null })
351
- const imports = getImports(tree)
352
- const group = options.operation ? getGroup(options.operation) : undefined
353
-
354
- const type = {
355
- name: schemaManager.getName(name, { type: 'type' }),
356
- typedName: schemaManager.getName(name, { type: 'type' }),
357
- file: schemaManager.getFile(options.operationName || name, { group }),
37
+ function renderSchemaType({
38
+ node: schemaNode,
39
+ name,
40
+ typedName,
41
+ description,
42
+ keysToOmit,
43
+ }: {
44
+ node: SchemaNode | null
45
+ name: string
46
+ typedName: string
47
+ description?: string
48
+ keysToOmit?: Array<string>
49
+ }) {
50
+ if (!schemaNode) {
51
+ return null
358
52
  }
359
53
 
54
+ const imports = adapter.getImports(schemaNode, (schemaName) => ({
55
+ name: resolver.default(schemaName, 'type'),
56
+ path: getFile({ name: schemaName, extname: '.ts', mode }).path,
57
+ }))
58
+
360
59
  return (
361
60
  <>
362
61
  {mode === 'split' &&
363
- imports.map((imp) => (
364
- <File.Import key={[name, imp.name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />
365
- ))}
62
+ imports.map((imp) => <File.Import key={[name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />)}
366
63
  <Type
367
- name={type.name}
368
- typedName={type.typedName}
64
+ name={name}
65
+ typedName={typedName}
66
+ node={schemaNode}
369
67
  description={description}
370
- tree={tree}
371
- schema={transformedSchema}
372
68
  enumType={enumType}
373
69
  enumKeyCasing={enumKeyCasing}
374
70
  optionalType={optionalType}
375
71
  arrayType={arrayType}
376
- keysToOmit={keysToOmit}
377
72
  syntaxType={syntaxType}
73
+ resolver={resolver}
74
+ keysToOmit={keysToOmit}
75
+ legacy={legacy}
378
76
  />
379
77
  </>
380
78
  )
381
79
  }
382
80
 
383
- const responseName = schemaManager.getName(schemas.response.name, {
384
- type: 'type',
81
+ const responseTypes = legacy
82
+ ? node.responses.map((res) => {
83
+ const responseName = resolver.resolveResponseStatusName(node, res.statusCode)
84
+ const baseResponseName = (baseResolver ?? resolver).resolveResponseStatusName(node, res.statusCode)
85
+
86
+ return renderSchemaType({
87
+ node: res.schema ? nameUnnamedEnums(res.schema, baseResponseName) : res.schema,
88
+ name: responseName,
89
+ typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
90
+ description: res.description,
91
+ keysToOmit: res.keysToOmit,
92
+ })
93
+ })
94
+ : node.responses.map((res) =>
95
+ renderSchemaType({
96
+ node: res.schema,
97
+ name: resolver.resolveResponseStatusName(node, res.statusCode),
98
+ typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
99
+ description: res.description,
100
+ keysToOmit: res.keysToOmit,
101
+ }),
102
+ )
103
+
104
+ const requestType = node.requestBody?.schema
105
+ ? renderSchemaType({
106
+ node: legacy ? nameUnnamedEnums(node.requestBody.schema, (baseResolver ?? resolver).resolveDataName(node)) : node.requestBody.schema,
107
+ name: resolver.resolveDataName(node),
108
+ typedName: resolver.resolveDataTypedName(node),
109
+ description: node.requestBody.description ?? node.requestBody.schema.description,
110
+ keysToOmit: node.requestBody.keysToOmit,
111
+ })
112
+ : null
113
+
114
+ if (legacy) {
115
+ const pathParams = params.filter((p) => p.in === 'path')
116
+ const queryParams = params.filter((p) => p.in === 'query')
117
+ const headerParams = params.filter((p) => p.in === 'header')
118
+
119
+ const legacyParamTypes = [
120
+ pathParams.length > 0
121
+ ? renderSchemaType({
122
+ node: buildGroupedParamsSchema({ params: pathParams, parentName: (baseResolver ?? resolver).resolvePathParamsName!(node) }),
123
+ name: resolver.resolvePathParamsName!(node),
124
+ typedName: resolver.resolvePathParamsTypedName!(node),
125
+ })
126
+ : null,
127
+ queryParams.length > 0
128
+ ? renderSchemaType({
129
+ node: buildGroupedParamsSchema({ params: queryParams, parentName: (baseResolver ?? resolver).resolveQueryParamsName!(node) }),
130
+ name: resolver.resolveQueryParamsName!(node),
131
+ typedName: resolver.resolveQueryParamsTypedName!(node),
132
+ })
133
+ : null,
134
+ headerParams.length > 0
135
+ ? renderSchemaType({
136
+ node: buildGroupedParamsSchema({ params: headerParams, parentName: (baseResolver ?? resolver).resolveHeaderParamsName!(node) }),
137
+ name: resolver.resolveHeaderParamsName!(node),
138
+ typedName: resolver.resolveHeaderParamsTypedName!(node),
139
+ })
140
+ : null,
141
+ ]
142
+
143
+ const legacyResponsesType = renderSchemaType({
144
+ node: buildLegacyResponsesSchemaNode({ node, resolver }),
145
+ name: resolver.resolveResponsesName(node),
146
+ typedName: resolver.resolveResponsesTypedName(node),
147
+ })
148
+
149
+ const legacyResponseType = renderSchemaType({
150
+ node: buildLegacyResponseUnionSchemaNode({ node, resolver }),
151
+ name: resolver.resolveResponseName(node),
152
+ typedName: resolver.resolveResponseTypedName(node),
153
+ })
154
+
155
+ return (
156
+ <File baseName={file.baseName} path={file.path} meta={file.meta} banner={resolveBanner()} footer={resolveFooter()}>
157
+ {legacyParamTypes}
158
+ {responseTypes}
159
+ {requestType}
160
+ {legacyResponseType}
161
+ {legacyResponsesType}
162
+ </File>
163
+ )
164
+ }
165
+
166
+ const paramTypes = params.map((param) =>
167
+ renderSchemaType({
168
+ node: param.schema,
169
+ name: resolver.resolveParamName(node, param),
170
+ typedName: resolver.resolveParamTypedName(node, param),
171
+ }),
172
+ )
173
+
174
+ const queryParamsList = params.filter((p) => p.in === 'query')
175
+ const queryParamsType =
176
+ queryParamsList.length > 0
177
+ ? renderSchemaType({
178
+ node: buildParamsSchema({ params: queryParamsList, node, resolver }),
179
+ name: resolver.resolveQueryParamsName!(node),
180
+ typedName: resolver.resolveQueryParamsTypedName!(node),
181
+ })
182
+ : null
183
+
184
+ const dataType = renderSchemaType({
185
+ node: buildDataSchemaNode({ node: { ...node, parameters: params }, resolver }),
186
+ name: resolver.resolveRequestConfigName(node),
187
+ typedName: resolver.resolveRequestConfigTypedName(node),
385
188
  })
386
189
 
387
- const combinedSchemaName = operation.method === 'get' ? `${name}Query` : `${name}Mutation`
190
+ const responsesType = renderSchemaType({
191
+ node: buildResponsesSchemaNode({ node, resolver }),
192
+ name: resolver.resolveResponsesName(node),
193
+ typedName: resolver.resolveResponsesTypedName(node),
194
+ })
388
195
 
389
- return (
390
- <File
391
- baseName={file.baseName}
392
- path={file.path}
393
- meta={file.meta}
394
- banner={getBanner({ oas, output: plugin.options.output, config: driver.config })}
395
- footer={getFooter({ oas, output: plugin.options.output })}
396
- >
397
- {operationSchemas.map(mapOperationSchema)}
196
+ const responseType = renderSchemaType({
197
+ node: buildResponseUnionSchemaNode({ node, resolver }),
198
+ name: resolver.resolveResponseName(node),
199
+ typedName: resolver.resolveResponseTypedName(node),
200
+ description: 'Union of all possible responses',
201
+ })
398
202
 
399
- {generator.context.UNSTABLE_NAMING ? (
400
- <>
401
- <File.Source name={`${name}Request`} isExportable isIndexable isTypeOnly>
402
- {printRequestSchema({ baseName: name, operation, schemas, driver })}
403
- </File.Source>
404
- <File.Source name={responseName} isExportable isIndexable isTypeOnly>
405
- {printResponseSchema({ baseName: name, schemas, driver, unknownType })}
406
- </File.Source>
407
- </>
408
- ) : (
409
- <File.Source name={combinedSchemaName} isExportable isIndexable isTypeOnly>
410
- {printCombinedSchema({ name: combinedSchemaName, schemas, driver })}
411
- </File.Source>
412
- )}
203
+ return (
204
+ <File baseName={file.baseName} path={file.path} meta={file.meta} banner={resolveBanner()} footer={resolveFooter()}>
205
+ {paramTypes}
206
+ {queryParamsType}
207
+ {responseTypes}
208
+ {requestType}
209
+ {dataType}
210
+ {responsesType}
211
+ {responseType}
413
212
  </File>
414
213
  )
415
214
  },
416
- Schema({ schema, plugin }) {
417
- const {
418
- options: { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, output },
419
- } = plugin
420
- const mode = useMode()
215
+ Schema({ node, adapter, options }) {
216
+ const { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, resolver, legacy } = options
217
+ const { mode, getFile, resolveBanner, resolveFooter } = useKubb<PluginTs>()
421
218
 
422
- const oas = useOas()
423
- const driver = usePluginDriver()
219
+ if (!node.name) {
220
+ return
221
+ }
424
222
 
425
- const { getName, getFile } = useSchemaManager()
426
- const imports = getImports(schema.tree)
427
- const schemaFromTree = schema.tree.find((item) => item.keyword === schemaKeywords.schema)
223
+ const imports = adapter.getImports(node, (schemaName) => ({
224
+ name: resolver.default(schemaName, 'type'),
225
+ path: getFile({ name: schemaName, extname: '.ts', mode }).path,
226
+ }))
428
227
 
429
- let typedName = getName(schema.name, { type: 'type' })
228
+ const isEnumSchema = node.type === 'enum'
430
229
 
431
- if (['asConst', 'asPascalConst'].includes(enumType) && schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.enum)) {
432
- typedName = typedName += 'Key' //Suffix for avoiding collisions (https://github.com/kubb-labs/kubb/issues/1873)
433
- }
230
+ const typedName = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node) : resolver.resolveTypedName(node.name)
434
231
 
435
232
  const type = {
436
- name: getName(schema.name, { type: 'function' }),
233
+ name: resolver.resolveName(node.name),
437
234
  typedName,
438
- file: getFile(schema.name),
439
- }
235
+ file: getFile({ name: node.name, extname: '.ts', mode }),
236
+ } as const
440
237
 
441
238
  return (
442
- <File
443
- baseName={type.file.baseName}
444
- path={type.file.path}
445
- meta={type.file.meta}
446
- banner={getBanner({ oas, output, config: driver.config })}
447
- footer={getFooter({ oas, output })}
448
- >
239
+ <File baseName={type.file.baseName} path={type.file.path} meta={type.file.meta} banner={resolveBanner()} footer={resolveFooter()}>
449
240
  {mode === 'split' &&
450
241
  imports.map((imp) => (
451
- <File.Import key={[schema.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />
242
+ <File.Import key={[node.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />
452
243
  ))}
453
244
  <Type
454
245
  name={type.name}
455
246
  typedName={type.typedName}
456
- description={schema.value.description}
457
- tree={schema.tree}
458
- schema={schema.value}
247
+ node={node}
459
248
  enumType={enumType}
460
249
  enumKeyCasing={enumKeyCasing}
461
250
  optionalType={optionalType}
462
251
  arrayType={arrayType}
463
252
  syntaxType={syntaxType}
253
+ resolver={resolver}
254
+ legacy={legacy}
464
255
  />
465
256
  </File>
466
257
  )