@kubb/plugin-ts 5.0.0-alpha.2 → 5.0.0-alpha.20

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-B70QnSzH.cjs +688 -0
  2. package/dist/Type-B70QnSzH.cjs.map +1 -0
  3. package/dist/Type-CMC7L-38.js +671 -0
  4. package/dist/Type-CMC7L-38.js.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 -11
  11. package/dist/components.js +2 -2
  12. package/dist/generators-BFkr7ecU.js +556 -0
  13. package/dist/generators-BFkr7ecU.js.map +1 -0
  14. package/dist/generators-xHWQCNd9.cjs +560 -0
  15. package/dist/generators-xHWQCNd9.cjs.map +1 -0
  16. package/dist/generators.cjs +2 -2
  17. package/dist/generators.d.ts +3 -491
  18. package/dist/generators.js +1 -1
  19. package/dist/index.cjs +146 -3
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +145 -1
  23. package/dist/index.js.map +1 -0
  24. package/dist/resolvers-DsKabI0F.js +184 -0
  25. package/dist/resolvers-DsKabI0F.js.map +1 -0
  26. package/dist/resolvers-YIpeP5YD.cjs +194 -0
  27. package/dist/resolvers-YIpeP5YD.cjs.map +1 -0
  28. package/dist/resolvers.cjs +4 -0
  29. package/dist/resolvers.d.ts +52 -0
  30. package/dist/resolvers.js +2 -0
  31. package/dist/types-zqLMbIqZ.d.ts +340 -0
  32. package/package.json +15 -8
  33. package/src/components/Enum.tsx +83 -0
  34. package/src/components/Type.tsx +25 -144
  35. package/src/components/index.ts +1 -0
  36. package/src/constants.ts +29 -0
  37. package/src/factory.ts +14 -16
  38. package/src/generators/typeGenerator.tsx +221 -414
  39. package/src/generators/utils.ts +308 -0
  40. package/src/index.ts +1 -1
  41. package/src/plugin.ts +74 -87
  42. package/src/presets.ts +23 -0
  43. package/src/printer.ts +256 -92
  44. package/src/resolvers/index.ts +2 -0
  45. package/src/resolvers/resolverTs.ts +104 -0
  46. package/src/resolvers/resolverTsLegacy.ts +87 -0
  47. package/src/types.ts +234 -63
  48. package/dist/components-9wydyqUx.cjs +0 -848
  49. package/dist/components-9wydyqUx.cjs.map +0 -1
  50. package/dist/components-LmqJfxMv.js +0 -721
  51. package/dist/components-LmqJfxMv.js.map +0 -1
  52. package/dist/plugin-CNkzbtpl.cjs +0 -508
  53. package/dist/plugin-CNkzbtpl.cjs.map +0 -1
  54. package/dist/plugin-DoLrDl9P.js +0 -476
  55. package/dist/plugin-DoLrDl9P.js.map +0 -1
  56. package/dist/types-BpeKGgCn.d.ts +0 -170
  57. package/src/parser.ts +0 -396
@@ -1,468 +1,275 @@
1
- import { pascalCase } from '@internals/utils'
2
- import type { PluginManager } from '@kubb/core'
3
- import { useMode, usePluginManager } 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 { caseParams, composeTransformers, narrowSchema, schemaTypes, transform } 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, pluginManager }: { name: string; schemas: OperationSchemas; pluginManager: PluginManager }): 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 = pluginManager.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 = pluginManager.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 = pluginManager.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 = pluginManager.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 = pluginManager.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 = pluginManager.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
- pluginManager,
113
- }: {
114
- baseName: string
115
- operation: Operation
116
- schemas: OperationSchemas
117
- pluginManager: PluginManager
118
- }): string {
119
- const name = pluginManager.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 = pluginManager.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 = pluginManager.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 = pluginManager.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 = pluginManager.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
- pluginManager,
247
- unknownType,
248
- }: {
249
- baseName: string
250
- schemas: OperationSchemas
251
- pluginManager: PluginManager
252
- unknownType: PluginTs['resolvedOptions']['unknownType']
253
- }): string {
254
- const results: string[] = []
255
-
256
- const name = pluginManager.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 = pluginManager.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, '1'>({
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
- version: '1',
315
- Operation({ operation, generator, plugin }) {
22
+ type: 'react',
23
+ Operation({ node, adapter, options }) {
316
24
  const {
317
- options,
318
- options: { mapper, enumType, enumKeyCasing, syntaxType, optionalType, arrayType, unknownType, paramsCasing },
319
- } = plugin
320
-
321
- const mode = useMode()
322
- const pluginManager = usePluginManager()
323
-
324
- const oas = useOas()
325
- const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator)
326
- const schemaManager = useSchemaManager()
327
-
328
- const name = getName(operation, { type: 'type', pluginName: pluginTsName })
329
-
330
- const file = getFile(operation)
331
- const schemas = getSchemas(operation)
332
- const schemaGenerator = new SchemaGenerator(options, {
333
- fabric: generator.context.fabric,
334
- oas,
335
- events: generator.context.events,
336
- plugin,
337
- pluginManager,
25
+ enumType,
26
+ enumKeyCasing,
27
+ optionalType,
28
+ arrayType,
29
+ syntaxType,
30
+ paramsCasing,
31
+ group,
32
+ resolver,
33
+ baseResolver,
34
+ compatibilityPreset,
35
+ transformers = [],
36
+ } = options
37
+ const isKubbV4Compatibility = compatibilityPreset === 'kubbV4'
38
+ const { mode, getFile, resolveBanner, resolveFooter } = useKubb<PluginTs>()
39
+
40
+ const file = getFile({
41
+ name: node.operationId,
42
+ extname: '.ts',
338
43
  mode,
339
- override: options.override,
44
+ options: {
45
+ group: group ? (group.type === 'tag' ? { tag: node.tags[0] ?? 'default' } : { path: node.path }) : undefined,
46
+ },
340
47
  })
48
+ const params = caseParams(node.parameters, paramsCasing)
341
49
 
342
- const operationSchemas = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response]
343
- .flat()
344
- .filter(Boolean)
345
-
346
- const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options }: OperationSchemaType) => {
347
- // Apply paramsCasing transformation to pathParams, queryParams, and headerParams (not response)
348
- const shouldTransform = paramsCasing && isParameterSchema(name)
349
- const transformedSchema = shouldTransform ? applyParamsCasing(schema, paramsCasing) : schema
50
+ function renderSchemaType({
51
+ node: schemaNode,
52
+ name,
53
+ typedName,
54
+ description,
55
+ keysToOmit,
56
+ }: {
57
+ node: SchemaNode | null
58
+ name: string
59
+ typedName: string
60
+ description?: string
61
+ keysToOmit?: Array<string>
62
+ }) {
63
+ if (!schemaNode) {
64
+ return null
65
+ }
350
66
 
351
- const tree = schemaGenerator.parse({ schema: transformedSchema, name, parentName: null })
352
- const imports = getImports(tree)
353
- const group = options.operation ? getGroup(options.operation) : undefined
67
+ const transformedNode = transform(schemaNode, composeTransformers(...transformers))
354
68
 
355
- const type = {
356
- name: schemaManager.getName(name, { type: 'type' }),
357
- typedName: schemaManager.getName(name, { type: 'type' }),
358
- file: schemaManager.getFile(options.operationName || name, { group }),
359
- }
69
+ const imports = adapter.getImports(transformedNode, (schemaName) => ({
70
+ name: resolver.default(schemaName, 'type'),
71
+ path: getFile({ name: schemaName, extname: '.ts', mode }).path,
72
+ }))
360
73
 
361
74
  return (
362
75
  <>
363
76
  {mode === 'split' &&
364
- imports.map((imp) => (
365
- <File.Import key={[name, imp.name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />
366
- ))}
77
+ imports.map((imp) => <File.Import key={[name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />)}
367
78
  <Type
368
- name={type.name}
369
- typedName={type.typedName}
79
+ name={name}
80
+ typedName={typedName}
81
+ node={transformedNode}
370
82
  description={description}
371
- tree={tree}
372
- schema={transformedSchema}
373
- mapper={mapper}
374
83
  enumType={enumType}
375
84
  enumKeyCasing={enumKeyCasing}
376
85
  optionalType={optionalType}
377
86
  arrayType={arrayType}
378
- keysToOmit={keysToOmit}
379
87
  syntaxType={syntaxType}
88
+ resolver={resolver}
89
+ keysToOmit={keysToOmit}
90
+ legacy={isKubbV4Compatibility}
380
91
  />
381
92
  </>
382
93
  )
383
94
  }
384
95
 
385
- const responseName = schemaManager.getName(schemas.response.name, {
386
- type: 'type',
96
+ const responseTypes = isKubbV4Compatibility
97
+ ? node.responses.map((res) => {
98
+ const responseName = resolver.resolveResponseStatusName(node, res.statusCode)
99
+ const baseResponseName = baseResolver.resolveResponseStatusName(node, res.statusCode)
100
+
101
+ return renderSchemaType({
102
+ node: res.schema ? nameUnnamedEnums(res.schema, baseResponseName) : res.schema,
103
+ name: responseName,
104
+ typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
105
+ description: res.description,
106
+ keysToOmit: res.keysToOmit,
107
+ })
108
+ })
109
+ : node.responses.map((res) =>
110
+ renderSchemaType({
111
+ node: res.schema,
112
+ name: resolver.resolveResponseStatusName(node, res.statusCode),
113
+ typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
114
+ description: res.description,
115
+ keysToOmit: res.keysToOmit,
116
+ }),
117
+ )
118
+
119
+ const requestType = node.requestBody?.schema
120
+ ? renderSchemaType({
121
+ node: isKubbV4Compatibility ? nameUnnamedEnums(node.requestBody.schema, baseResolver.resolveDataName(node)) : node.requestBody.schema,
122
+ name: resolver.resolveDataName(node),
123
+ typedName: resolver.resolveDataTypedName(node),
124
+ description: node.requestBody.description ?? node.requestBody.schema.description,
125
+ keysToOmit: node.requestBody.keysToOmit,
126
+ })
127
+ : null
128
+
129
+ if (isKubbV4Compatibility) {
130
+ const pathParams = params.filter((p) => p.in === 'path')
131
+ const queryParams = params.filter((p) => p.in === 'query')
132
+ const headerParams = params.filter((p) => p.in === 'header')
133
+
134
+ const legacyParamTypes = [
135
+ pathParams.length > 0
136
+ ? renderSchemaType({
137
+ node: buildGroupedParamsSchema({ params: pathParams, parentName: baseResolver.resolvePathParamsName!(node) }),
138
+ name: resolver.resolvePathParamsName!(node),
139
+ typedName: resolver.resolvePathParamsTypedName!(node),
140
+ })
141
+ : null,
142
+ queryParams.length > 0
143
+ ? renderSchemaType({
144
+ node: buildGroupedParamsSchema({ params: queryParams, parentName: baseResolver.resolveQueryParamsName!(node) }),
145
+ name: resolver.resolveQueryParamsName!(node),
146
+ typedName: resolver.resolveQueryParamsTypedName!(node),
147
+ })
148
+ : null,
149
+ headerParams.length > 0
150
+ ? renderSchemaType({
151
+ node: buildGroupedParamsSchema({ params: headerParams, parentName: baseResolver.resolveHeaderParamsName!(node) }),
152
+ name: resolver.resolveHeaderParamsName!(node),
153
+ typedName: resolver.resolveHeaderParamsTypedName!(node),
154
+ })
155
+ : null,
156
+ ]
157
+
158
+ const legacyResponsesType = renderSchemaType({
159
+ node: buildLegacyResponsesSchemaNode({ node, resolver }),
160
+ name: resolver.resolveResponsesName(node),
161
+ typedName: resolver.resolveResponsesTypedName(node),
162
+ })
163
+
164
+ const legacyResponseType = renderSchemaType({
165
+ node: buildLegacyResponseUnionSchemaNode({ node, resolver }),
166
+ name: resolver.resolveResponseName(node),
167
+ typedName: resolver.resolveResponseTypedName(node),
168
+ })
169
+
170
+ return (
171
+ <File baseName={file.baseName} path={file.path} meta={file.meta} banner={resolveBanner()} footer={resolveFooter()}>
172
+ {legacyParamTypes}
173
+ {responseTypes}
174
+ {requestType}
175
+ {legacyResponseType}
176
+ {legacyResponsesType}
177
+ </File>
178
+ )
179
+ }
180
+
181
+ const paramTypes = params.map((param) =>
182
+ renderSchemaType({
183
+ node: param.schema,
184
+ name: resolver.resolveParamName(node, param),
185
+ typedName: resolver.resolveParamTypedName(node, param),
186
+ }),
187
+ )
188
+
189
+ const queryParamsList = params.filter((p) => p.in === 'query')
190
+ const queryParamsType =
191
+ queryParamsList.length > 0
192
+ ? renderSchemaType({
193
+ node: buildParamsSchema({ params: queryParamsList, node, resolver }),
194
+ name: resolver.resolveQueryParamsName!(node),
195
+ typedName: resolver.resolveQueryParamsTypedName!(node),
196
+ })
197
+ : null
198
+
199
+ const dataType = renderSchemaType({
200
+ node: buildDataSchemaNode({ node: { ...node, parameters: params }, resolver }),
201
+ name: resolver.resolveRequestConfigName(node),
202
+ typedName: resolver.resolveRequestConfigTypedName(node),
387
203
  })
388
- const combinedSchemaName = operation.method === 'get' ? `${name}Query` : `${name}Mutation`
389
204
 
390
- return (
391
- <File
392
- baseName={file.baseName}
393
- path={file.path}
394
- meta={file.meta}
395
- banner={getBanner({ oas, output: plugin.options.output, config: pluginManager.config })}
396
- footer={getFooter({ oas, output: plugin.options.output })}
397
- >
398
- {operationSchemas.map(mapOperationSchema)}
205
+ const responsesType = renderSchemaType({
206
+ node: buildResponsesSchemaNode({ node, resolver }),
207
+ name: resolver.resolveResponsesName(node),
208
+ typedName: resolver.resolveResponsesTypedName(node),
209
+ })
210
+
211
+ const responseType = renderSchemaType({
212
+ node: buildResponseUnionSchemaNode({ node, resolver }),
213
+ name: resolver.resolveResponseName(node),
214
+ typedName: resolver.resolveResponseTypedName(node),
215
+ description: 'Union of all possible responses',
216
+ })
399
217
 
400
- {generator.context.UNSTABLE_NAMING ? (
401
- <>
402
- <File.Source name={`${name}Request`} isExportable isIndexable isTypeOnly>
403
- {printRequestSchema({ baseName: name, operation, schemas, pluginManager })}
404
- </File.Source>
405
- <File.Source name={responseName} isExportable isIndexable isTypeOnly>
406
- {printResponseSchema({ baseName: name, schemas, pluginManager, unknownType })}
407
- </File.Source>
408
- </>
409
- ) : (
410
- <File.Source name={combinedSchemaName} isExportable isIndexable isTypeOnly>
411
- {printCombinedSchema({ name: combinedSchemaName, schemas, pluginManager })}
412
- </File.Source>
413
- )}
218
+ return (
219
+ <File baseName={file.baseName} path={file.path} meta={file.meta} banner={resolveBanner()} footer={resolveFooter()}>
220
+ {paramTypes}
221
+ {queryParamsType}
222
+ {responseTypes}
223
+ {requestType}
224
+ {dataType}
225
+ {responsesType}
226
+ {responseType}
414
227
  </File>
415
228
  )
416
229
  },
417
- Schema({ schema, plugin }) {
418
- const {
419
- options: { mapper, enumType, enumKeyCasing, syntaxType, optionalType, arrayType, output },
420
- } = plugin
421
- const mode = useMode()
230
+ Schema({ node, adapter, options }) {
231
+ const { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, resolver, compatibilityPreset, transformers = [] } = options
232
+ const isKubbV4Compatibility = compatibilityPreset === 'kubbV4'
233
+ const { mode, getFile, resolveBanner, resolveFooter } = useKubb<PluginTs>()
234
+
235
+ if (!node.name) {
236
+ return
237
+ }
422
238
 
423
- const oas = useOas()
424
- const pluginManager = usePluginManager()
239
+ const transformedNode = transform(node, composeTransformers(...transformers))
425
240
 
426
- const { getName, getFile } = useSchemaManager()
427
- const imports = getImports(schema.tree)
428
- const schemaFromTree = schema.tree.find((item) => item.keyword === schemaKeywords.schema)
241
+ const imports = adapter.getImports(transformedNode, (schemaName) => ({
242
+ name: resolver.default(schemaName, 'type'),
243
+ path: getFile({ name: schemaName, extname: '.ts', mode }).path,
244
+ }))
429
245
 
430
- let typedName = getName(schema.name, { type: 'type' })
246
+ const isEnumSchema = !!narrowSchema(node, schemaTypes.enum)
431
247
 
432
- if (['asConst', 'asPascalConst'].includes(enumType) && schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.enum)) {
433
- typedName = typedName += 'Key' //Suffix for avoiding collisions (https://github.com/kubb-labs/kubb/issues/1873)
434
- }
248
+ const typedName = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node) : resolver.resolveTypedName(node.name)
435
249
 
436
250
  const type = {
437
- name: getName(schema.name, { type: 'function' }),
251
+ name: resolver.resolveName(node.name),
438
252
  typedName,
439
- file: getFile(schema.name),
440
- }
253
+ file: getFile({ name: node.name, extname: '.ts', mode }),
254
+ } as const
441
255
 
442
256
  return (
443
- <File
444
- baseName={type.file.baseName}
445
- path={type.file.path}
446
- meta={type.file.meta}
447
- banner={getBanner({ oas, output, config: pluginManager.config })}
448
- footer={getFooter({ oas, output })}
449
- >
257
+ <File baseName={type.file.baseName} path={type.file.path} meta={type.file.meta} banner={resolveBanner()} footer={resolveFooter()}>
450
258
  {mode === 'split' &&
451
259
  imports.map((imp) => (
452
- <File.Import key={[schema.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />
260
+ <File.Import key={[node.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />
453
261
  ))}
454
262
  <Type
455
263
  name={type.name}
456
264
  typedName={type.typedName}
457
- description={schema.value.description}
458
- tree={schema.tree}
459
- schema={schema.value}
460
- mapper={mapper}
265
+ node={transformedNode}
461
266
  enumType={enumType}
462
267
  enumKeyCasing={enumKeyCasing}
463
268
  optionalType={optionalType}
464
269
  arrayType={arrayType}
465
270
  syntaxType={syntaxType}
271
+ resolver={resolver}
272
+ legacy={isKubbV4Compatibility}
466
273
  />
467
274
  </File>
468
275
  )