@kubb/plugin-ts 5.0.0-alpha.22 → 5.0.0-alpha.24

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 +1680 -49
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +529 -4
  4. package/dist/index.js +1653 -52
  5. package/dist/index.js.map +1 -1
  6. package/package.json +3 -42
  7. package/src/components/Enum.tsx +2 -7
  8. package/src/components/Type.tsx +11 -5
  9. package/src/generators/typeGenerator.tsx +36 -24
  10. package/src/generators/typeGeneratorLegacy.tsx +28 -38
  11. package/src/index.ts +13 -1
  12. package/src/plugin.ts +42 -23
  13. package/src/presets.ts +16 -34
  14. package/src/printers/functionPrinter.ts +194 -0
  15. package/src/printers/printerTs.ts +23 -7
  16. package/src/resolvers/resolverTs.ts +10 -47
  17. package/src/resolvers/resolverTsLegacy.ts +4 -31
  18. package/src/types.ts +169 -254
  19. package/src/utils.ts +103 -0
  20. package/dist/Type-Bf8raoQX.cjs +0 -124
  21. package/dist/Type-Bf8raoQX.cjs.map +0 -1
  22. package/dist/Type-BpXxT4l_.js +0 -113
  23. package/dist/Type-BpXxT4l_.js.map +0 -1
  24. package/dist/builderTs-COUg3xtQ.cjs +0 -135
  25. package/dist/builderTs-COUg3xtQ.cjs.map +0 -1
  26. package/dist/builderTs-DPpkJKd1.js +0 -131
  27. package/dist/builderTs-DPpkJKd1.js.map +0 -1
  28. package/dist/builders.cjs +0 -3
  29. package/dist/builders.d.ts +0 -23
  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 -71
  38. package/dist/components.js +0 -2
  39. package/dist/generators-DFDut8o-.js +0 -555
  40. package/dist/generators-DFDut8o-.js.map +0 -1
  41. package/dist/generators-DKd7MYbx.cjs +0 -567
  42. package/dist/generators-DKd7MYbx.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-BcHudagv.cjs +0 -594
  47. package/dist/printerTs-BcHudagv.cjs.map +0 -1
  48. package/dist/printerTs-CMBCOuqd.js +0 -558
  49. package/dist/printerTs-CMBCOuqd.js.map +0 -1
  50. package/dist/printers.cjs +0 -3
  51. package/dist/printers.d.ts +0 -81
  52. package/dist/printers.js +0 -2
  53. package/dist/resolverTsLegacy-CPiqqsO6.js +0 -185
  54. package/dist/resolverTsLegacy-CPiqqsO6.js.map +0 -1
  55. package/dist/resolverTsLegacy-CuR9XbKk.cjs +0 -196
  56. package/dist/resolverTsLegacy-CuR9XbKk.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-CRtcZOCz.d.ts +0 -374
  61. package/src/builders/builderTs.ts +0 -107
  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, enumTypeSuffix, 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))
@@ -21,16 +21,25 @@ export const typeGenerator = defineGenerator<PluginTs>({
21
21
 
22
22
  const params = caseParams(node.parameters, paramsCasing)
23
23
 
24
+ // Build a set of schema names that are enums so the ref handler and getImports
25
+ // callback can use the suffixed type name (e.g. `StatusKey`) for those refs.
26
+ const enumSchemaNames = new Set((adapter.rootNode?.schemas ?? []).filter((s) => narrowSchema(s, schemaTypes.enum) && s.name).map((s) => s.name!))
27
+
28
+ function resolveImportName(schemaName: string): string {
29
+ if (ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && enumTypeSuffix && enumSchemaNames.has(schemaName)) {
30
+ return resolver.resolveEnumKeyName({ name: schemaName } as SchemaNode, enumTypeSuffix)
31
+ }
32
+ return resolver.default(schemaName, 'type')
33
+ }
34
+
24
35
  function renderSchemaType({
25
36
  node: schemaNode,
26
37
  name,
27
- typedName,
28
38
  description,
29
39
  keysToOmit,
30
40
  }: {
31
41
  node: SchemaNode | null
32
42
  name: string
33
- typedName: string
34
43
  description?: string
35
44
  keysToOmit?: Array<string>
36
45
  }) {
@@ -41,7 +50,7 @@ export const typeGenerator = defineGenerator<PluginTs>({
41
50
  const transformedNode = transform(schemaNode, composeTransformers(...transformers))
42
51
 
43
52
  const imports = adapter.getImports(transformedNode, (schemaName) => ({
44
- name: resolver.default(schemaName, 'type'),
53
+ name: resolveImportName(schemaName),
45
54
  path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
46
55
  }))
47
56
 
@@ -51,7 +60,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
51
60
  imports.map((imp) => <File.Import key={[name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />)}
52
61
  <Type
53
62
  name={name}
54
- typedName={typedName}
55
63
  node={transformedNode}
56
64
  description={description}
57
65
  enumType={enumType}
@@ -62,6 +70,7 @@ export const typeGenerator = defineGenerator<PluginTs>({
62
70
  syntaxType={syntaxType}
63
71
  resolver={resolver}
64
72
  keysToOmit={keysToOmit}
73
+ enumSchemaNames={enumSchemaNames}
65
74
  />
66
75
  </>
67
76
  )
@@ -71,7 +80,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
71
80
  renderSchemaType({
72
81
  node: param.schema,
73
82
  name: resolver.resolveParamName(node, param),
74
- typedName: resolver.resolveParamTypedName(node, param),
75
83
  }),
76
84
  )
77
85
 
@@ -79,7 +87,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
79
87
  ? renderSchemaType({
80
88
  node: node.requestBody.schema,
81
89
  name: resolver.resolveDataName(node),
82
- typedName: resolver.resolveDataTypedName(node),
83
90
  description: node.requestBody.description ?? node.requestBody.schema.description,
84
91
  keysToOmit: node.requestBody.keysToOmit,
85
92
  })
@@ -89,28 +96,24 @@ export const typeGenerator = defineGenerator<PluginTs>({
89
96
  renderSchemaType({
90
97
  node: res.schema,
91
98
  name: resolver.resolveResponseStatusName(node, res.statusCode),
92
- typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
93
99
  description: res.description,
94
100
  keysToOmit: res.keysToOmit,
95
101
  }),
96
102
  )
97
103
 
98
104
  const dataType = renderSchemaType({
99
- node: builderTs.buildData({ node: { ...node, parameters: params }, resolver }),
105
+ node: buildData({ node: { ...node, parameters: params }, resolver }),
100
106
  name: resolver.resolveRequestConfigName(node),
101
- typedName: resolver.resolveRequestConfigTypedName(node),
102
107
  })
103
108
 
104
109
  const responsesType = renderSchemaType({
105
- node: builderTs.buildResponses({ node, resolver }),
110
+ node: buildResponses({ node, resolver }),
106
111
  name: resolver.resolveResponsesName(node),
107
- typedName: resolver.resolveResponsesTypedName(node),
108
112
  })
109
113
 
110
114
  const responseType = renderSchemaType({
111
- node: builderTs.buildResponseUnion({ node, resolver }),
115
+ node: buildResponseUnion({ node, resolver }),
112
116
  name: resolver.resolveResponseName(node),
113
- typedName: resolver.resolveResponseTypedName(node),
114
117
  description: 'Union of all possible responses',
115
118
  })
116
119
 
@@ -131,8 +134,8 @@ export const typeGenerator = defineGenerator<PluginTs>({
131
134
  </File>
132
135
  )
133
136
  },
134
- Schema({ node, adapter, options, config }) {
135
- const { enumType, enumTypeSuffix, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, resolver, transformers = [] } = options
137
+ Schema({ node, adapter, options, config, resolver }) {
138
+ const { enumType, enumTypeSuffix, enumKeyCasing, syntaxType, optionalType, arrayType, output, group, transformers = [] } = options
136
139
 
137
140
  const root = path.resolve(config.root, config.output.path)
138
141
  const mode = getMode(path.resolve(root, output.path))
@@ -143,19 +146,28 @@ export const typeGenerator = defineGenerator<PluginTs>({
143
146
 
144
147
  const transformedNode = transform(node, composeTransformers(...transformers))
145
148
 
149
+ // Build a set of schema names that are enums so the ref handler and getImports
150
+ // callback can use the suffixed type name (e.g. `StatusKey`) for those refs.
151
+ const enumSchemaNames = new Set((adapter.rootNode?.schemas ?? []).filter((s) => narrowSchema(s, schemaTypes.enum) && s.name).map((s) => s.name!))
152
+
153
+ function resolveImportName(schemaName: string): string {
154
+ if (ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && enumTypeSuffix && enumSchemaNames.has(schemaName)) {
155
+ return resolver.resolveEnumKeyName({ name: schemaName } as SchemaNode, enumTypeSuffix)
156
+ }
157
+ return resolver.default(schemaName, 'type')
158
+ }
159
+
146
160
  const imports = adapter.getImports(transformedNode, (schemaName) => ({
147
- name: resolver.default(schemaName, 'type'),
161
+ name: resolveImportName(schemaName),
148
162
  path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
149
163
  }))
150
164
 
151
165
  const isEnumSchema = !!narrowSchema(node, schemaTypes.enum)
152
166
 
153
- const typedName =
154
- ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node, enumTypeSuffix) : resolver.resolveTypedName(node.name)
167
+ const name = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyName(node, enumTypeSuffix) : resolver.resolveName(node.name)
155
168
 
156
169
  const type = {
157
- name: resolver.resolveName(node.name),
158
- typedName,
170
+ name,
159
171
  file: resolver.resolveFile({ name: node.name, extname: '.ts' }, { root, output, group }),
160
172
  } as const
161
173
 
@@ -173,7 +185,6 @@ export const typeGenerator = defineGenerator<PluginTs>({
173
185
  ))}
174
186
  <Type
175
187
  name={type.name}
176
- typedName={type.typedName}
177
188
  node={transformedNode}
178
189
  enumType={enumType}
179
190
  enumTypeSuffix={enumTypeSuffix}
@@ -182,6 +193,7 @@ export const typeGenerator = defineGenerator<PluginTs>({
182
193
  arrayType={arrayType}
183
194
  syntaxType={syntaxType}
184
195
  resolver={resolver}
196
+ enumSchemaNames={enumSchemaNames}
185
197
  />
186
198
  </File>
187
199
  )
@@ -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, enumTypeSuffix, 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,7 +196,6 @@ 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}
@@ -222,7 +222,6 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
222
222
  return renderSchemaType({
223
223
  node: res.schema ? nameUnnamedEnums(res.schema, baseResponseName) : res.schema,
224
224
  name: responseName,
225
- typedName: resolver.resolveResponseStatusTypedName(node, res.statusCode),
226
225
  description: res.description,
227
226
  keysToOmit: res.keysToOmit,
228
227
  })
@@ -232,7 +231,6 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
232
231
  ? renderSchemaType({
233
232
  node: nameUnnamedEnums(node.requestBody.schema, resolverTsLegacy.resolveDataName(node)),
234
233
  name: resolver.resolveDataName(node),
235
- typedName: resolver.resolveDataTypedName(node),
236
234
  description: node.requestBody.description ?? node.requestBody.schema.description,
237
235
  keysToOmit: node.requestBody.keysToOmit,
238
236
  })
@@ -241,23 +239,20 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
241
239
  const legacyParamTypes = [
242
240
  pathParams.length > 0
243
241
  ? renderSchemaType({
244
- node: buildGroupedParamsSchema({ params: pathParams, parentName: resolverTsLegacy.resolvePathParamsName!(node) }),
245
- name: resolver.resolvePathParamsName!(node),
246
- typedName: resolver.resolvePathParamsTypedName!(node),
242
+ node: buildGroupedParamsSchema({ params: pathParams, parentName: resolverTsLegacy.resolvePathParamsName(node, pathParams[0]!) }),
243
+ name: resolver.resolvePathParamsName(node, pathParams[0]!),
247
244
  })
248
245
  : null,
249
246
  queryParams.length > 0
250
247
  ? renderSchemaType({
251
- node: buildGroupedParamsSchema({ params: queryParams, parentName: resolverTsLegacy.resolveQueryParamsName!(node) }),
252
- name: resolver.resolveQueryParamsName!(node),
253
- typedName: resolver.resolveQueryParamsTypedName!(node),
248
+ node: buildGroupedParamsSchema({ params: queryParams, parentName: resolverTsLegacy.resolveQueryParamsName(node, queryParams[0]!) }),
249
+ name: resolver.resolveQueryParamsName(node, queryParams[0]!),
254
250
  })
255
251
  : null,
256
252
  headerParams.length > 0
257
253
  ? renderSchemaType({
258
- node: buildGroupedParamsSchema({ params: headerParams, parentName: resolverTsLegacy.resolveHeaderParamsName!(node) }),
259
- name: resolver.resolveHeaderParamsName!(node),
260
- typedName: resolver.resolveHeaderParamsTypedName!(node),
254
+ node: buildGroupedParamsSchema({ params: headerParams, parentName: resolverTsLegacy.resolveHeaderParamsName(node, headerParams[0]!) }),
255
+ name: resolver.resolveHeaderParamsName(node, headerParams[0]!),
261
256
  })
262
257
  : null,
263
258
  ]
@@ -265,13 +260,11 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
265
260
  const legacyResponsesType = renderSchemaType({
266
261
  node: buildLegacyResponsesSchemaNode({ node, resolver }),
267
262
  name: resolver.resolveResponsesName(node),
268
- typedName: resolver.resolveResponsesTypedName(node),
269
263
  })
270
264
 
271
265
  const legacyResponseType = renderSchemaType({
272
266
  node: buildLegacyResponseUnionSchemaNode({ node, resolver }),
273
267
  name: resolver.resolveResponseName(node),
274
- typedName: resolver.resolveResponseTypedName(node),
275
268
  })
276
269
 
277
270
  return (
@@ -290,8 +283,8 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
290
283
  </File>
291
284
  )
292
285
  },
293
- Schema({ node, adapter, options, config }) {
294
- const { enumType, enumTypeSuffix, 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
295
288
 
296
289
  const root = path.resolve(config.root, config.output.path)
297
290
  const mode = getMode(path.resolve(root, output.path))
@@ -309,12 +302,10 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
309
302
 
310
303
  const isEnumSchema = !!narrowSchema(node, schemaTypes.enum)
311
304
 
312
- const typedName =
313
- ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyTypedName(node, enumTypeSuffix) : resolver.resolveTypedName(node.name)
305
+ const name = ENUM_TYPES_WITH_KEY_SUFFIX.has(enumType) && isEnumSchema ? resolver.resolveEnumKeyName(node, enumTypeSuffix) : resolver.resolveName(node.name)
314
306
 
315
307
  const type = {
316
- name: resolver.resolveName(node.name),
317
- typedName,
308
+ name,
318
309
  file: resolver.resolveFile({ name: node.name, extname: '.ts' }, { root, output, group }),
319
310
  } as const
320
311
 
@@ -332,7 +323,6 @@ export const typeGeneratorLegacy = defineGenerator<PluginTs>({
332
323
  ))}
333
324
  <Type
334
325
  name={type.name}
335
- typedName={type.typedName}
336
326
  node={transformedNode}
337
327
  enumType={enumType}
338
328
  enumTypeSuffix={enumTypeSuffix}
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,7 +1,8 @@
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
 
7
8
  /**
@@ -45,7 +46,9 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
45
46
  generators: userGenerators = [],
46
47
  } = options
47
48
 
48
- const { resolver, transformers, generators } = getPreset(compatibilityPreset, {
49
+ const preset = getPreset({
50
+ preset: compatibilityPreset,
51
+ presets: presets,
49
52
  resolvers: userResolvers,
50
53
  transformers: userTransformers,
51
54
  generators: userGenerators,
@@ -56,40 +59,54 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
56
59
 
57
60
  return {
58
61
  name: pluginTsName,
59
- options: {
60
- output,
61
- optionalType,
62
- group,
63
- arrayType,
64
- enumType,
65
- enumTypeSuffix,
66
- enumKeyCasing,
67
- syntaxType,
68
- paramsCasing,
69
- resolver,
70
- 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
+ }
71
88
  },
72
89
  resolvePath(baseName, pathMode, options) {
73
90
  if (!resolvePathWarning) {
74
- 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')
75
92
  resolvePathWarning = true
76
93
  }
77
94
 
78
- return resolver.resolvePath(
95
+ return this.plugin.resolver.resolvePath(
79
96
  { baseName, pathMode, tag: options?.group?.tag, path: options?.group?.path },
80
- { 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 },
81
98
  )
82
99
  },
83
100
  resolveName(name, type) {
84
101
  if (!resolveNameWarning) {
85
- 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')
86
103
  resolveNameWarning = true
87
104
  }
88
105
 
89
- return resolver.default(name, type)
106
+ return this.plugin.resolver.default(name, type)
90
107
  },
91
108
  async install() {
92
- const { config, fabric, plugin, adapter, rootNode, driver, openInStudio } = this
109
+ const { config, fabric, plugin, adapter, rootNode, driver, openInStudio, resolver } = this
93
110
 
94
111
  const root = path.resolve(config.root, config.output.path)
95
112
 
@@ -102,7 +119,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
102
119
  await walk(rootNode, {
103
120
  depth: 'shallow',
104
121
  async schema(schemaNode) {
105
- const writeTasks = generators.map(async (generator) => {
122
+ const writeTasks = preset.generators.map(async (generator) => {
106
123
  if (generator.type === 'react' && generator.version === '2') {
107
124
  const options = resolver.resolveOptions(schemaNode, { options: plugin.options, exclude, include, override })
108
125
 
@@ -112,6 +129,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
112
129
 
113
130
  await renderSchema(schemaNode, {
114
131
  options,
132
+ resolver,
115
133
  adapter,
116
134
  config,
117
135
  fabric,
@@ -125,7 +143,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
125
143
  await Promise.all(writeTasks)
126
144
  },
127
145
  async operation(operationNode) {
128
- const writeTasks = generators.map(async (generator) => {
146
+ const writeTasks = preset.generators.map(async (generator) => {
129
147
  if (generator.type === 'react' && generator.version === '2') {
130
148
  const options = resolver.resolveOptions(operationNode, { options: plugin.options, exclude, include, override })
131
149
 
@@ -135,6 +153,7 @@ export const pluginTs = createPlugin<PluginTs>((options) => {
135
153
 
136
154
  await renderOperation(operationNode, {
137
155
  options,
156
+ resolver,
138
157
  adapter,
139
158
  config,
140
159
  fabric,
package/src/presets.ts CHANGED
@@ -1,8 +1,9 @@
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
 
7
8
  /**
8
9
  * Built-in preset registry for `@kubb/plugin-ts`.
@@ -11,33 +12,14 @@ import type { PluginTs, ResolverTs } from './types.ts'
11
12
  * - `kubbV4` — uses `resolverTsLegacy` and `typeGeneratorLegacy` (Kubb v4 naming conventions).
12
13
  */
13
14
  export const presets = definePresets<ResolverTs>({
14
- default: definePreset('default', { resolvers: [resolverTs], generators: [typeGenerator] }),
15
- 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
+ },
16
25
  })
17
-
18
- type GetPresetOptions = {
19
- resolvers: Array<ResolverTs>
20
- transformers: Array<Visitor>
21
- generators: Array<Generator<PluginTs>>
22
- }
23
-
24
- /**
25
- * Resolves a compatibility preset for `plugin-ts`, merging user-supplied resolvers,
26
- * transformers, and generators on top of the built-in preset defaults.
27
- *
28
- * `resolverTs` is always prepended to the resolver list as the baseline.
29
- *
30
- * @example
31
- * ```ts
32
- * const preset = getPreset('kubbV4', { resolvers: [], transformers: [], generators: [] })
33
- * ```
34
- */
35
- export function getPreset(preset: CompatibilityPreset, { resolvers, transformers, generators }: GetPresetOptions) {
36
- return getCorePreset({
37
- preset,
38
- presets,
39
- resolvers: [resolverTs, ...(resolvers ?? [])],
40
- transformers,
41
- generators,
42
- })
43
- }