@kubb/plugin-ts 5.0.0-alpha.21 → 5.0.0-alpha.23

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 (66) hide show
  1. package/dist/index.cjs +1698 -42
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +485 -4
  4. package/dist/index.js +1667 -41
  5. package/dist/index.js.map +1 -1
  6. package/package.json +3 -42
  7. package/src/components/Enum.tsx +15 -11
  8. package/src/components/Type.tsx +18 -7
  9. package/src/generators/typeGenerator.tsx +12 -21
  10. package/src/generators/typeGeneratorLegacy.tsx +30 -37
  11. package/src/index.ts +13 -1
  12. package/src/plugin.ts +62 -22
  13. package/src/presets.ts +22 -23
  14. package/src/printers/functionPrinter.ts +194 -0
  15. package/src/printers/printerTs.ts +16 -8
  16. package/src/resolvers/resolverTs.ts +10 -47
  17. package/src/resolvers/resolverTsLegacy.ts +4 -31
  18. package/src/types.ts +95 -205
  19. package/src/utils.ts +103 -0
  20. package/dist/Type-B6fo0gSk.js +0 -120
  21. package/dist/Type-B6fo0gSk.js.map +0 -1
  22. package/dist/Type-oFwUfkZv.cjs +0 -131
  23. package/dist/Type-oFwUfkZv.cjs.map +0 -1
  24. package/dist/builderTs-Cd3juc2G.cjs +0 -120
  25. package/dist/builderTs-Cd3juc2G.cjs.map +0 -1
  26. package/dist/builderTs-DausqHpc.js +0 -116
  27. package/dist/builderTs-DausqHpc.js.map +0 -1
  28. package/dist/builders.cjs +0 -3
  29. package/dist/builders.d.ts +0 -8
  30. package/dist/builders.js +0 -2
  31. package/dist/casing-BJHFg-zZ.js +0 -84
  32. package/dist/casing-BJHFg-zZ.js.map +0 -1
  33. package/dist/casing-DHfdqpLi.cjs +0 -107
  34. package/dist/casing-DHfdqpLi.cjs.map +0 -1
  35. package/dist/chunk-ByKO4r7w.cjs +0 -38
  36. package/dist/components.cjs +0 -4
  37. package/dist/components.d.ts +0 -67
  38. package/dist/components.js +0 -2
  39. package/dist/generators-ByK18qUn.js +0 -551
  40. package/dist/generators-ByK18qUn.js.map +0 -1
  41. package/dist/generators-aSsiTfUO.cjs +0 -563
  42. package/dist/generators-aSsiTfUO.cjs.map +0 -1
  43. package/dist/generators.cjs +0 -4
  44. package/dist/generators.d.ts +0 -12
  45. package/dist/generators.js +0 -2
  46. package/dist/printerTs-BgZucv4T.js +0 -559
  47. package/dist/printerTs-BgZucv4T.js.map +0 -1
  48. package/dist/printerTs-CFXc_LpP.cjs +0 -595
  49. package/dist/printerTs-CFXc_LpP.cjs.map +0 -1
  50. package/dist/printers.cjs +0 -3
  51. package/dist/printers.d.ts +0 -75
  52. package/dist/printers.js +0 -2
  53. package/dist/resolverTsLegacy-DLl854-P.js +0 -185
  54. package/dist/resolverTsLegacy-DLl854-P.js.map +0 -1
  55. package/dist/resolverTsLegacy-sJ16Iqrl.cjs +0 -196
  56. package/dist/resolverTsLegacy-sJ16Iqrl.cjs.map +0 -1
  57. package/dist/resolvers.cjs +0 -4
  58. package/dist/resolvers.d.ts +0 -52
  59. package/dist/resolvers.js +0 -2
  60. package/dist/types-BcyuFDn9.d.ts +0 -344
  61. package/src/builders/builderTs.ts +0 -92
  62. package/src/builders/index.ts +0 -1
  63. package/src/components/index.ts +0 -2
  64. package/src/generators/index.ts +0 -2
  65. package/src/printers/index.ts +0 -1
  66. package/src/resolvers/index.ts +0 -2
@@ -3,16 +3,16 @@ import { caseParams, composeTransformers, narrowSchema, schemaTypes, transform }
3
3
  import type { SchemaNode } from '@kubb/ast/types'
4
4
  import { defineGenerator, getMode } from '@kubb/core'
5
5
  import { File } from '@kubb/react-fabric'
6
- import { builderTs } from '../builders/builderTs.ts'
7
6
  import { Type } from '../components/Type.tsx'
8
7
  import { ENUM_TYPES_WITH_KEY_SUFFIX } from '../constants.ts'
9
8
  import type { PluginTs } from '../types'
9
+ import { buildData, buildResponses, buildResponseUnion } from '../utils.ts'
10
10
 
11
11
  export const typeGenerator = defineGenerator<PluginTs>({
12
12
  name: 'typescript',
13
13
  type: 'react',
14
- Operation({ node, adapter, options, config }) {
15
- const { enumType, enumKeyCasing, optionalType, arrayType, syntaxType, paramsCasing, group, output, resolver, transformers = [] } = options
14
+ Operation({ node, adapter, options, config, resolver }) {
15
+ const { enumType, enumTypeSuffix, enumKeyCasing, optionalType, arrayType, syntaxType, paramsCasing, group, output, transformers = [] } = options
16
16
 
17
17
  const root = path.resolve(config.root, config.output.path)
18
18
  const mode = getMode(path.resolve(root, output.path))
@@ -24,13 +24,11 @@ export const typeGenerator = defineGenerator<PluginTs>({
24
24
  function renderSchemaType({
25
25
  node: schemaNode,
26
26
  name,
27
- typedName,
28
27
  description,
29
28
  keysToOmit,
30
29
  }: {
31
30
  node: SchemaNode | null
32
31
  name: string
33
- typedName: string
34
32
  description?: string
35
33
  keysToOmit?: Array<string>
36
34
  }) {
@@ -51,10 +49,10 @@ export const typeGenerator = defineGenerator<PluginTs>({
51
49
  imports.map((imp) => <File.Import key={[name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />)}
52
50
  <Type
53
51
  name={name}
54
- typedName={typedName}
55
52
  node={transformedNode}
56
53
  description={description}
57
54
  enumType={enumType}
55
+ enumTypeSuffix={enumTypeSuffix}
58
56
  enumKeyCasing={enumKeyCasing}
59
57
  optionalType={optionalType}
60
58
  arrayType={arrayType}
@@ -70,7 +68,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
70
68
  renderSchemaType({
71
69
  node: param.schema,
72
70
  name: resolver.resolveParamName(node, param),
73
- typedName: resolver.resolveParamTypedName(node, param),
74
71
  }),
75
72
  )
76
73
 
@@ -78,7 +75,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
78
75
  ? renderSchemaType({
79
76
  node: node.requestBody.schema,
80
77
  name: resolver.resolveDataName(node),
81
- typedName: resolver.resolveDataTypedName(node),
82
78
  description: node.requestBody.description ?? node.requestBody.schema.description,
83
79
  keysToOmit: node.requestBody.keysToOmit,
84
80
  })
@@ -88,28 +84,24 @@ export const typeGenerator = defineGenerator<PluginTs>({
88
84
  renderSchemaType({
89
85
  node: res.schema,
90
86
  name: resolver.resolveResponseStatusName(node, res.statusCode),
91
- typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
92
87
  description: res.description,
93
88
  keysToOmit: res.keysToOmit,
94
89
  }),
95
90
  )
96
91
 
97
92
  const dataType = renderSchemaType({
98
- node: builderTs.buildData({ node: { ...node, parameters: params }, resolver }),
93
+ node: buildData({ node: { ...node, parameters: params }, resolver }),
99
94
  name: resolver.resolveRequestConfigName(node),
100
- typedName: resolver.resolveRequestConfigTypedName(node),
101
95
  })
102
96
 
103
97
  const responsesType = renderSchemaType({
104
- node: builderTs.buildResponses({ node, resolver }),
98
+ node: buildResponses({ node, resolver }),
105
99
  name: resolver.resolveResponsesName(node),
106
- typedName: resolver.resolveResponsesTypedName(node),
107
100
  })
108
101
 
109
102
  const responseType = renderSchemaType({
110
- node: builderTs.buildResponseUnion({ node, resolver }),
103
+ node: buildResponseUnion({ node, resolver }),
111
104
  name: resolver.resolveResponseName(node),
112
- typedName: resolver.resolveResponseTypedName(node),
113
105
  description: 'Union of all possible responses',
114
106
  })
115
107
 
@@ -130,8 +122,8 @@ export const typeGenerator = defineGenerator<PluginTs>({
130
122
  </File>
131
123
  )
132
124
  },
133
- Schema({ node, adapter, options, config }) {
134
- const { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, resolver, transformers = [] } = options
125
+ Schema({ node, adapter, options, config, resolver }) {
126
+ const { enumType, enumTypeSuffix, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, transformers = [] } = options
135
127
 
136
128
  const root = path.resolve(config.root, config.output.path)
137
129
  const mode = getMode(path.resolve(root, output.path))
@@ -149,11 +141,10 @@ export const typeGenerator = defineGenerator<PluginTs>({
149
141
 
150
142
  const isEnumSchema = !!narrowSchema(node, schemaTypes.enum)
151
143
 
152
- const typedName = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node) : resolver.resolveTypedName(node.name)
144
+ const name = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyName(node, enumTypeSuffix) : resolver.resolveName(node.name)
153
145
 
154
146
  const type = {
155
- name: resolver.resolveName(node.name),
156
- typedName,
147
+ name,
157
148
  file: resolver.resolveFile({ name: node.name, extname: '.ts' }, { root, output, group }),
158
149
  } as const
159
150
 
@@ -171,9 +162,9 @@ export const typeGenerator = defineGenerator<PluginTs>({
171
162
  ))}
172
163
  <Type
173
164
  name={type.name}
174
- typedName={type.typedName}
175
165
  node={transformedNode}
176
166
  enumType={enumType}
167
+ enumTypeSuffix={enumTypeSuffix}
177
168
  enumKeyCasing={enumKeyCasing}
178
169
  optionalType={optionalType}
179
170
  arrayType={arrayType}
@@ -47,20 +47,20 @@ function buildLegacyResponsesSchemaNode({ node, resolver }: BuildOperationSchema
47
47
  const responseSchema =
48
48
  successResponses.length > 0
49
49
  ? successResponses.length === 1
50
- ? createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, successResponses[0]!.statusCode) })
50
+ ? createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, successResponses[0]!.statusCode) })
51
51
  : createSchema({
52
52
  type: 'union',
53
- members: successResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, res.statusCode) })),
53
+ members: successResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, res.statusCode) })),
54
54
  })
55
55
  : createSchema({ type: 'any' })
56
56
 
57
57
  const errorsSchema =
58
58
  errorResponses.length > 0
59
59
  ? errorResponses.length === 1
60
- ? createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, errorResponses[0]!.statusCode) })
60
+ ? createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, errorResponses[0]!.statusCode) })
61
61
  : createSchema({
62
62
  type: 'union',
63
- members: errorResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, res.statusCode) })),
63
+ members: errorResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, res.statusCode) })),
64
64
  })
65
65
  : createSchema({ type: 'any' })
66
66
 
@@ -71,37 +71,40 @@ function buildLegacyResponsesSchemaNode({ node, resolver }: BuildOperationSchema
71
71
  createProperty({
72
72
  name: 'Request',
73
73
  required: true,
74
- schema: createSchema({ type: 'ref', name: resolver.resolveDataTypedName(node) }),
74
+ schema: createSchema({ type: 'ref', name: resolver.resolveDataName(node) }),
75
75
  }),
76
76
  )
77
77
  }
78
78
 
79
- if (node.parameters.some((p) => p.in === 'query') && resolver.resolveQueryParamsTypedName) {
79
+ const queryParam = node.parameters.find((p) => p.in === 'query')
80
+ if (queryParam) {
80
81
  properties.push(
81
82
  createProperty({
82
83
  name: 'QueryParams',
83
84
  required: true,
84
- schema: createSchema({ type: 'ref', name: resolver.resolveQueryParamsTypedName(node) }),
85
+ schema: createSchema({ type: 'ref', name: resolver.resolveQueryParamsName(node, queryParam) }),
85
86
  }),
86
87
  )
87
88
  }
88
89
 
89
- if (node.parameters.some((p) => p.in === 'path') && resolver.resolvePathParamsTypedName) {
90
+ const pathParam = node.parameters.find((p) => p.in === 'path')
91
+ if (pathParam) {
90
92
  properties.push(
91
93
  createProperty({
92
94
  name: 'PathParams',
93
95
  required: true,
94
- schema: createSchema({ type: 'ref', name: resolver.resolvePathParamsTypedName(node) }),
96
+ schema: createSchema({ type: 'ref', name: resolver.resolvePathParamsName(node, pathParam) }),
95
97
  }),
96
98
  )
97
99
  }
98
100
 
99
- if (node.parameters.some((p) => p.in === 'header') && resolver.resolveHeaderParamsTypedName) {
101
+ const headerParam = node.parameters.find((p) => p.in === 'header')
102
+ if (headerParam) {
100
103
  properties.push(
101
104
  createProperty({
102
105
  name: 'HeaderParams',
103
106
  required: true,
104
- schema: createSchema({ type: 'ref', name: resolver.resolveHeaderParamsTypedName(node) }),
107
+ schema: createSchema({ type: 'ref', name: resolver.resolveHeaderParamsName(node, headerParam) }),
105
108
  }),
106
109
  )
107
110
  }
@@ -122,12 +125,12 @@ function buildLegacyResponseUnionSchemaNode({ node, resolver }: BuildOperationSc
122
125
  }
123
126
 
124
127
  if (successResponses.length === 1) {
125
- return createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, successResponses[0]!.statusCode) })
128
+ return createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, successResponses[0]!.statusCode) })
126
129
  }
127
130
 
128
131
  return createSchema({
129
132
  type: 'union',
130
- members: successResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusTypedName(node, res.statusCode) })),
133
+ members: successResponses.map((res) => createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, res.statusCode) })),
131
134
  })
132
135
  }
133
136
 
@@ -156,8 +159,8 @@ function nameUnnamedEnums(node: SchemaNode, parentName: string): SchemaNode {
156
159
  export const typeGeneratorLegacy = defineGenerator<PluginTs>({
157
160
  name: 'typescript-legacy',
158
161
  type: 'react',
159
- Operation({ node, adapter, options, config }) {
160
- const { enumType, enumKeyCasing, optionalType, arrayType, syntaxType, paramsCasing, group, output, resolver, transformers = [] } = options
162
+ Operation({ node, adapter, options, config, resolver }) {
163
+ const { enumType, enumTypeSuffix, enumKeyCasing, optionalType, arrayType, syntaxType, paramsCasing, group, output, transformers = [] } = options
161
164
 
162
165
  const root = path.resolve(config.root, config.output.path)
163
166
  const mode = getMode(path.resolve(root, output.path))
@@ -168,13 +171,11 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
168
171
  function renderSchemaType({
169
172
  node: schemaNode,
170
173
  name,
171
- typedName,
172
174
  description,
173
175
  keysToOmit,
174
176
  }: {
175
177
  node: SchemaNode | null
176
178
  name: string
177
- typedName: string
178
179
  description?: string
179
180
  keysToOmit?: Array<string>
180
181
  }) {
@@ -195,10 +196,10 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
195
196
  imports.map((imp) => <File.Import key={[name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />)}
196
197
  <Type
197
198
  name={name}
198
- typedName={typedName}
199
199
  node={transformedNode}
200
200
  description={description}
201
201
  enumType={enumType}
202
+ enumTypeSuffix={enumTypeSuffix}
202
203
  enumKeyCasing={enumKeyCasing}
203
204
  optionalType={optionalType}
204
205
  arrayType={arrayType}
@@ -221,7 +222,6 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
221
222
  return renderSchemaType({
222
223
  node: res.schema ? nameUnnamedEnums(res.schema, baseResponseName) : res.schema,
223
224
  name: responseName,
224
- typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
225
225
  description: res.description,
226
226
  keysToOmit: res.keysToOmit,
227
227
  })
@@ -231,7 +231,6 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
231
231
  ? renderSchemaType({
232
232
  node: nameUnnamedEnums(node.requestBody.schema, resolverTsLegacy.resolveDataName(node)),
233
233
  name: resolver.resolveDataName(node),
234
- typedName: resolver.resolveDataTypedName(node),
235
234
  description: node.requestBody.description ?? node.requestBody.schema.description,
236
235
  keysToOmit: node.requestBody.keysToOmit,
237
236
  })
@@ -240,23 +239,20 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
240
239
  const legacyParamTypes = [
241
240
  pathParams.length > 0
242
241
  ? renderSchemaType({
243
- node: buildGroupedParamsSchema({ params: pathParams, parentName: resolverTsLegacy.resolvePathParamsName!(node) }),
244
- name: resolver.resolvePathParamsName!(node),
245
- typedName: resolver.resolvePathParamsTypedName!(node),
242
+ node: buildGroupedParamsSchema({ params: pathParams, parentName: resolverTsLegacy.resolvePathParamsName(node, pathParams[0]!) }),
243
+ name: resolver.resolvePathParamsName(node, pathParams[0]!),
246
244
  })
247
245
  : null,
248
246
  queryParams.length > 0
249
247
  ? renderSchemaType({
250
- node: buildGroupedParamsSchema({ params: queryParams, parentName: resolverTsLegacy.resolveQueryParamsName!(node) }),
251
- name: resolver.resolveQueryParamsName!(node),
252
- typedName: resolver.resolveQueryParamsTypedName!(node),
248
+ node: buildGroupedParamsSchema({ params: queryParams, parentName: resolverTsLegacy.resolveQueryParamsName(node, queryParams[0]!) }),
249
+ name: resolver.resolveQueryParamsName(node, queryParams[0]!),
253
250
  })
254
251
  : null,
255
252
  headerParams.length > 0
256
253
  ? renderSchemaType({
257
- node: buildGroupedParamsSchema({ params: headerParams, parentName: resolverTsLegacy.resolveHeaderParamsName!(node) }),
258
- name: resolver.resolveHeaderParamsName!(node),
259
- typedName: resolver.resolveHeaderParamsTypedName!(node),
254
+ node: buildGroupedParamsSchema({ params: headerParams, parentName: resolverTsLegacy.resolveHeaderParamsName(node, headerParams[0]!) }),
255
+ name: resolver.resolveHeaderParamsName(node, headerParams[0]!),
260
256
  })
261
257
  : null,
262
258
  ]
@@ -264,13 +260,11 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
264
260
  const legacyResponsesType = renderSchemaType({
265
261
  node: buildLegacyResponsesSchemaNode({ node, resolver }),
266
262
  name: resolver.resolveResponsesName(node),
267
- typedName: resolver.resolveResponsesTypedName(node),
268
263
  })
269
264
 
270
265
  const legacyResponseType = renderSchemaType({
271
266
  node: buildLegacyResponseUnionSchemaNode({ node, resolver }),
272
267
  name: resolver.resolveResponseName(node),
273
- typedName: resolver.resolveResponseTypedName(node),
274
268
  })
275
269
 
276
270
  return (
@@ -289,8 +283,8 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
289
283
  </File>
290
284
  )
291
285
  },
292
- Schema({ node, adapter, options, config }) {
293
- const { enumType, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, resolver, transformers = [] } = options
286
+ Schema({ node, adapter, options, config, resolver }) {
287
+ const { enumType, enumTypeSuffix, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, transformers = [] } = options
294
288
 
295
289
  const root = path.resolve(config.root, config.output.path)
296
290
  const mode = getMode(path.resolve(root, output.path))
@@ -308,11 +302,10 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
308
302
 
309
303
  const isEnumSchema = !!narrowSchema(node, schemaTypes.enum)
310
304
 
311
- const typedName = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node) : resolver.resolveTypedName(node.name)
305
+ const name = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyName(node, enumTypeSuffix) : resolver.resolveName(node.name)
312
306
 
313
307
  const type = {
314
- name: resolver.resolveName(node.name),
315
- typedName,
308
+ name,
316
309
  file: resolver.resolveFile({ name: node.name, extname: '.ts' }, { root, output, group }),
317
310
  } as const
318
311
 
@@ -330,9 +323,9 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
330
323
  ))}
331
324
  <Type
332
325
  name={type.name}
333
- typedName={type.typedName}
334
326
  node={transformedNode}
335
327
  enumType={enumType}
328
+ enumTypeSuffix={enumTypeSuffix}
336
329
  enumKeyCasing={enumKeyCasing}
337
330
  optionalType={optionalType}
338
331
  arrayType={arrayType}
package/src/index.ts CHANGED
@@ -1,2 +1,14 @@
1
+ export { Enum } from './components/Enum.tsx'
2
+ export { Type } from './components/Type.tsx'
3
+
4
+ export { typeGenerator } from './generators/typeGenerator.tsx'
5
+
1
6
  export { pluginTs, pluginTsName } from './plugin.ts'
2
- export type { PluginTs } from './types.ts'
7
+
8
+ export { functionPrinter } from './printers/functionPrinter.ts'
9
+ export { printerTs } from './printers/printerTs.ts'
10
+
11
+ export { resolverTs } from './resolvers/resolverTs.ts'
12
+ export { resolverTsLegacy } from './resolvers/resolverTsLegacy.ts'
13
+
14
+ export type { PluginTs, ResolverTs } from './types.ts'
package/src/plugin.ts CHANGED
@@ -1,11 +1,31 @@
1
1
  import path from 'node:path'
2
+ import { camelCase } from '@internals/utils'
2
3
  import { walk } from '@kubb/ast'
3
- import { createPlugin, getBarrelFiles, renderOperation, renderSchema } from '@kubb/core'
4
- import { getPreset } from './presets.ts'
4
+ import { createPlugin, type Group, getBarrelFiles, getPreset, renderOperation, renderSchema } from '@kubb/core'
5
+ import { presets } from './presets.ts'
5
6
  import type { PluginTs } from './types.ts'
6
7
 
8
+ /**
9
+ * Canonical plugin name for `@kubb/plugin-ts`, used to identify the plugin in driver lookups and warnings.
10
+ */
7
11
  export const pluginTsName = 'plugin-ts' satisfies PluginTs['name']
8
12
 
13
+ /**
14
+ * The `@kubb/plugin-ts` plugin factory.
15
+ *
16
+ * Generates TypeScript type declarations from an OpenAPI/AST `RootNode`.
17
+ * Walks schemas and operations, delegates rendering to the active generators,
18
+ * and writes barrel files based on `output.barrelType`.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { pluginTs } from '@kubb/plugin-ts'
23
+ *
24
+ * export default defineConfig({
25
+ * plugins: [pluginTs({ output: { path: 'types' }, enumType: 'asConst' })],
26
+ * })
27
+ * ```
28
+ */
9
29
  export const pluginTs = createPlugin<PluginTs>((options) => {
10
30
  const {
11
31
  output = { path: 'types', barrelType: 'named' },
@@ -14,6 +34,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
14
34
  include,
15
35
  override = [],
16
36
  enumType = 'asConst',
37
+ enumTypeSuffix = 'Key',
17
38
  enumKeyCasing = 'none',
18
39
  optionalType = 'questionToken',
19
40
  arrayType = 'array',
@@ -25,7 +46,9 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
25
46
  generators: userGenerators = [],
26
47
  } = options
27
48
 
28
- const { resolver, transformers, generators } = getPreset(compatibilityPreset, {
49
+ const preset = getPreset({
50
+ preset: compatibilityPreset,
51
+ presets: presets,
29
52
  resolvers: userResolvers,
30
53
  transformers: userTransformers,
31
54
  generators: userGenerators,
@@ -36,39 +59,54 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
36
59
 
37
60
  return {
38
61
  name: pluginTsName,
39
- options: {
40
- output,
41
- optionalType,
42
- group,
43
- arrayType,
44
- enumType,
45
- enumKeyCasing,
46
- syntaxType,
47
- paramsCasing,
48
- resolver,
49
- transformers,
62
+ get resolver() {
63
+ return preset.resolver
64
+ },
65
+ get options() {
66
+ return {
67
+ output,
68
+ optionalType,
69
+ group: group
70
+ ? ({
71
+ ...options.group,
72
+ name: (ctx) => {
73
+ if (options.group?.type === 'path') {
74
+ return `${ctx.group.split('/')[1]}`
75
+ }
76
+ return `${camelCase(ctx.group)}Controller`
77
+ },
78
+ } as Group)
79
+ : undefined,
80
+ arrayType,
81
+ enumType,
82
+ enumTypeSuffix,
83
+ enumKeyCasing,
84
+ syntaxType,
85
+ paramsCasing,
86
+ transformers: preset.transformers,
87
+ }
50
88
  },
51
89
  resolvePath(baseName, pathMode, options) {
52
90
  if (!resolvePathWarning) {
53
- this.driver.events.emit('warn', 'Do not use resolvePath for pluginTs, use resolverTs.resolvePath instead')
91
+ this.events.emit('warn', 'Do not use resolvePath for pluginTs, use resolverTs.resolvePath instead')
54
92
  resolvePathWarning = true
55
93
  }
56
94
 
57
- return resolver.resolvePath(
95
+ return this.plugin.resolver.resolvePath(
58
96
  { baseName, pathMode, tag: options?.group?.tag, path: options?.group?.path },
59
- { root: path.resolve(this.config.root, this.config.output.path), output, group },
97
+ { root: path.resolve(this.config.root, this.config.output.path), output, group: this.plugin.options.group },
60
98
  )
61
99
  },
62
100
  resolveName(name, type) {
63
101
  if (!resolveNameWarning) {
64
- this.driver.events.emit('warn', 'Do not use resolveName for pluginTs, use resolverTs.default instead')
102
+ this.events.emit('warn', 'Do not use resolveName for pluginTs, use resolverTs.default instead')
65
103
  resolveNameWarning = true
66
104
  }
67
105
 
68
- return resolver.default(name, type)
106
+ return this.plugin.resolver.default(name, type)
69
107
  },
70
108
  async install() {
71
- const { config, fabric, plugin, adapter, rootNode, driver, openInStudio } = this
109
+ const { config, fabric, plugin, adapter, rootNode, driver, openInStudio, resolver } = this
72
110
 
73
111
  const root = path.resolve(config.root, config.output.path)
74
112
 
@@ -81,7 +119,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
81
119
  await walk(rootNode, {
82
120
  depth: 'shallow',
83
121
  async schema(schemaNode) {
84
- const writeTasks = generators.map(async (generator) => {
122
+ const writeTasks = preset.generators.map(async (generator) => {
85
123
  if (generator.type === 'react' && generator.version === '2') {
86
124
  const options = resolver.resolveOptions(schemaNode, { options: plugin.options, exclude, include, override })
87
125
 
@@ -91,6 +129,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
91
129
 
92
130
  await renderSchema(schemaNode, {
93
131
  options,
132
+ resolver,
94
133
  adapter,
95
134
  config,
96
135
  fabric,
@@ -104,7 +143,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
104
143
  await Promise.all(writeTasks)
105
144
  },
106
145
  async operation(operationNode) {
107
- const writeTasks = generators.map(async (generator) => {
146
+ const writeTasks = preset.generators.map(async (generator) => {
108
147
  if (generator.type === 'react' && generator.version === '2') {
109
148
  const options = resolver.resolveOptions(operationNode, { options: plugin.options, exclude, include, override })
110
149
 
@@ -114,6 +153,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
114
153
 
115
154
  await renderOperation(operationNode, {
116
155
  options,
156
+ resolver,
117
157
  adapter,
118
158
  config,
119
159
  fabric,
package/src/presets.ts CHANGED
@@ -1,26 +1,25 @@
1
- import type { Visitor } from '@kubb/ast/types'
2
- import { type CompatibilityPreset, definePreset, definePresets, type Generator, getPreset as getCorePreset } from '@kubb/core'
3
- import { typeGenerator, typeGeneratorLegacy } from './generators/index.ts'
4
- import { resolverTs, resolverTsLegacy } from './resolvers/index.ts'
5
- import type { PluginTs, ResolverTs } from './types.ts'
1
+ import { definePresets } from '@kubb/core'
2
+ import { typeGenerator } from './generators/typeGenerator.tsx'
3
+ import { typeGeneratorLegacy } from './generators/typeGeneratorLegacy.tsx'
4
+ import { resolverTs } from './resolvers/resolverTs.ts'
5
+ import { resolverTsLegacy } from './resolvers/resolverTsLegacy.ts'
6
+ import type { ResolverTs } from './types.ts'
6
7
 
8
+ /**
9
+ * Built-in preset registry for `@kubb/plugin-ts`.
10
+ *
11
+ * - `default` — uses `resolverTs` and `typeGenerator` (current naming conventions).
12
+ * - `kubbV4` — uses `resolverTsLegacy` and `typeGeneratorLegacy` (Kubb v4 naming conventions).
13
+ */
7
14
  export const presets = definePresets<ResolverTs>({
8
- default: definePreset('default', { resolvers: [resolverTs], generators: [typeGenerator] }),
9
- kubbV4: definePreset('kubbV4', { resolvers: [resolverTsLegacy], generators: [typeGeneratorLegacy] }),
15
+ default: {
16
+ name: 'default',
17
+ resolvers: [resolverTs],
18
+ generators: [typeGenerator],
19
+ },
20
+ kubbV4: {
21
+ name: 'kubbV4',
22
+ resolvers: [resolverTsLegacy],
23
+ generators: [typeGeneratorLegacy],
24
+ },
10
25
  })
11
-
12
- type GetPresetOptions = {
13
- resolvers: Array<ResolverTs>
14
- transformers: Array<Visitor>
15
- generators: Array<Generator<PluginTs>>
16
- }
17
-
18
- export function getPreset(preset: CompatibilityPreset, { resolvers, transformers, generators }: GetPresetOptions) {
19
- return getCorePreset({
20
- preset,
21
- presets,
22
- resolvers: [resolverTs, ...(resolvers ?? [])],
23
- transformers,
24
- generators,
25
- })
26
- }