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

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 (76) hide show
  1. package/dist/Type-B6fo0gSk.js +120 -0
  2. package/dist/Type-B6fo0gSk.js.map +1 -0
  3. package/dist/Type-oFwUfkZv.cjs +131 -0
  4. package/dist/Type-oFwUfkZv.cjs.map +1 -0
  5. package/dist/builderTs-Cd3juc2G.cjs +120 -0
  6. package/dist/builderTs-Cd3juc2G.cjs.map +1 -0
  7. package/dist/builderTs-DausqHpc.js +116 -0
  8. package/dist/builderTs-DausqHpc.js.map +1 -0
  9. package/dist/builders.cjs +3 -0
  10. package/dist/builders.d.ts +8 -0
  11. package/dist/builders.js +2 -0
  12. package/dist/casing-BJHFg-zZ.js +84 -0
  13. package/dist/casing-BJHFg-zZ.js.map +1 -0
  14. package/dist/casing-DHfdqpLi.cjs +107 -0
  15. package/dist/casing-DHfdqpLi.cjs.map +1 -0
  16. package/dist/chunk-ByKO4r7w.cjs +38 -0
  17. package/dist/components.cjs +3 -2
  18. package/dist/components.d.ts +40 -11
  19. package/dist/components.js +2 -2
  20. package/dist/generators-ByK18qUn.js +551 -0
  21. package/dist/generators-ByK18qUn.js.map +1 -0
  22. package/dist/generators-aSsiTfUO.cjs +563 -0
  23. package/dist/generators-aSsiTfUO.cjs.map +1 -0
  24. package/dist/generators.cjs +3 -2
  25. package/dist/generators.d.ts +7 -492
  26. package/dist/generators.js +2 -2
  27. package/dist/index.cjs +148 -3
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +146 -1
  31. package/dist/index.js.map +1 -0
  32. package/dist/printerTs-BgZucv4T.js +559 -0
  33. package/dist/printerTs-BgZucv4T.js.map +1 -0
  34. package/dist/printerTs-CFXc_LpP.cjs +595 -0
  35. package/dist/printerTs-CFXc_LpP.cjs.map +1 -0
  36. package/dist/printers.cjs +3 -0
  37. package/dist/printers.d.ts +75 -0
  38. package/dist/printers.js +2 -0
  39. package/dist/resolverTsLegacy-DLl854-P.js +185 -0
  40. package/dist/resolverTsLegacy-DLl854-P.js.map +1 -0
  41. package/dist/resolverTsLegacy-sJ16Iqrl.cjs +196 -0
  42. package/dist/resolverTsLegacy-sJ16Iqrl.cjs.map +1 -0
  43. package/dist/resolvers.cjs +4 -0
  44. package/dist/resolvers.d.ts +52 -0
  45. package/dist/resolvers.js +2 -0
  46. package/dist/types-BcyuFDn9.d.ts +344 -0
  47. package/package.json +27 -8
  48. package/src/builders/builderTs.ts +92 -0
  49. package/src/builders/index.ts +1 -0
  50. package/src/components/Enum.tsx +83 -0
  51. package/src/components/Type.tsx +24 -145
  52. package/src/components/index.ts +1 -0
  53. package/src/constants.ts +29 -0
  54. package/src/factory.ts +14 -48
  55. package/src/generators/index.ts +1 -0
  56. package/src/generators/typeGenerator.tsx +119 -403
  57. package/src/generators/typeGeneratorLegacy.tsx +345 -0
  58. package/src/plugin.ts +80 -122
  59. package/src/presets.ts +26 -0
  60. package/src/printers/index.ts +1 -0
  61. package/src/printers/printerTs.ts +389 -0
  62. package/src/resolvers/index.ts +2 -0
  63. package/src/resolvers/resolverTs.ts +107 -0
  64. package/src/resolvers/resolverTsLegacy.ts +87 -0
  65. package/src/types.ts +261 -72
  66. package/dist/components-9wydyqUx.cjs +0 -848
  67. package/dist/components-9wydyqUx.cjs.map +0 -1
  68. package/dist/components-LmqJfxMv.js +0 -721
  69. package/dist/components-LmqJfxMv.js.map +0 -1
  70. package/dist/plugin-CNkzbtpl.cjs +0 -508
  71. package/dist/plugin-CNkzbtpl.cjs.map +0 -1
  72. package/dist/plugin-DoLrDl9P.js +0 -476
  73. package/dist/plugin-DoLrDl9P.js.map +0 -1
  74. package/dist/types-BpeKGgCn.d.ts +0 -170
  75. package/src/parser.ts +0 -396
  76. package/src/printer.ts +0 -221
package/src/printer.ts DELETED
@@ -1,221 +0,0 @@
1
- import { jsStringEscape, stringify } from '@internals/utils'
2
- import type { ArraySchemaNode, SchemaNode } from '@kubb/ast/types'
3
- import type { PrinterFactoryOptions } from '@kubb/core'
4
- import { definePrinter } from '@kubb/core'
5
- import type ts from 'typescript'
6
- import * as factory from './factory.ts'
7
-
8
- type TsOptions = {
9
- /**
10
- * @default `'questionToken'`
11
- */
12
- optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'
13
- /**
14
- * @default `'array'`
15
- */
16
- arrayType: 'array' | 'generic'
17
- /**
18
- * @default `'inlineLiteral'`
19
- */
20
- enumType: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal' | 'inlineLiteral'
21
- }
22
-
23
- type TsPrinter = PrinterFactoryOptions<'typescript', TsOptions, ts.TypeNode>
24
-
25
- function constToTypeNode(value: string | number | boolean, format: 'string' | 'number' | 'boolean'): ts.TypeNode | undefined {
26
- if (format === 'boolean') {
27
- return factory.createLiteralTypeNode(value === true ? factory.createTrue() : factory.createFalse())
28
- }
29
- if (format === 'number' && typeof value === 'number') {
30
- if (value < 0) {
31
- return factory.createLiteralTypeNode(factory.createPrefixUnaryExpression(factory.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value))))
32
- }
33
- return factory.createLiteralTypeNode(factory.createNumericLiteral(value))
34
- }
35
- return factory.createLiteralTypeNode(factory.createStringLiteral(String(value)))
36
- }
37
-
38
- function dateOrStringNode(node: { representation?: string }): ts.TypeNode {
39
- return node.representation === 'date' ? factory.createTypeReferenceNode(factory.createIdentifier('Date')) : factory.keywordTypeNodes.string
40
- }
41
-
42
- function buildMemberNodes(members: Array<SchemaNode> | undefined, print: (node: SchemaNode) => ts.TypeNode | null | undefined): Array<ts.TypeNode> {
43
- return (members ?? []).map(print).filter(Boolean) as Array<ts.TypeNode>
44
- }
45
-
46
- function buildTupleNode(node: ArraySchemaNode, print: (node: SchemaNode) => ts.TypeNode | null | undefined): ts.TypeNode | undefined {
47
- let items = (node.items ?? []).map(print).filter(Boolean) as Array<ts.TypeNode>
48
-
49
- const restNode = node.rest ? (print(node.rest) ?? undefined) : undefined
50
- const { min, max } = node
51
-
52
- if (max !== undefined) {
53
- items = items.slice(0, max)
54
- if (items.length < max && restNode) {
55
- items = [...items, ...Array(max - items.length).fill(restNode)]
56
- }
57
- }
58
-
59
- if (min !== undefined) {
60
- items = items.map((item, i) => (i >= min ? factory.createOptionalTypeNode(item) : item))
61
- }
62
-
63
- if (max === undefined && restNode) {
64
- items.push(factory.createRestTypeNode(factory.createArrayTypeNode(restNode)))
65
- }
66
-
67
- return factory.createTupleTypeNode(items)
68
- }
69
-
70
- function buildPropertyType(schema: SchemaNode, baseType: ts.TypeNode, optionalType: TsOptions['optionalType']): ts.TypeNode {
71
- const addsUndefined = ['undefined', 'questionTokenAndUndefined'].includes(optionalType)
72
-
73
- let type = baseType
74
-
75
- if (schema.nullable) {
76
- type = factory.createUnionDeclaration({ nodes: [type, factory.keywordTypeNodes.null] }) as ts.TypeNode
77
- }
78
-
79
- if ((schema.nullish || schema.optional) && addsUndefined) {
80
- type = factory.createUnionDeclaration({ nodes: [type, factory.keywordTypeNodes.undefined] }) as ts.TypeNode
81
- }
82
-
83
- return type
84
- }
85
-
86
- function buildPropertyJSDocComments(schema: SchemaNode): Array<string | undefined> {
87
- return [
88
- 'description' in schema && schema.description ? `@description ${jsStringEscape(schema.description as string)}` : undefined,
89
- 'deprecated' in schema && schema.deprecated ? '@deprecated' : undefined,
90
- 'min' in schema && schema.min !== undefined ? `@minLength ${schema.min}` : undefined,
91
- 'max' in schema && schema.max !== undefined ? `@maxLength ${schema.max}` : undefined,
92
- 'pattern' in schema && schema.pattern ? `@pattern ${schema.pattern}` : undefined,
93
- 'default' in schema && schema.default !== undefined
94
- ? `@default ${'primitive' in schema && schema.primitive === 'string' ? stringify(schema.default as string) : schema.default}`
95
- : undefined,
96
- 'example' in schema && schema.example !== undefined ? `@example ${schema.example}` : undefined,
97
- 'primitive' in schema && schema.primitive
98
- ? [`@type ${schema.primitive || 'unknown'}`, 'optional' in schema && schema.optional ? ' | undefined' : undefined].filter(Boolean).join('')
99
- : undefined,
100
- ]
101
- }
102
-
103
- function buildIndexSignatures(
104
- node: { additionalProperties?: SchemaNode | boolean; patternProperties?: Record<string, SchemaNode> },
105
- propertyCount: number,
106
- print: (node: SchemaNode) => ts.TypeNode | null | undefined,
107
- ): Array<ts.TypeElement> {
108
- const elements: Array<ts.TypeElement> = []
109
-
110
- if (node.additionalProperties && node.additionalProperties !== true) {
111
- const additionalType = (print(node.additionalProperties as SchemaNode) ?? factory.keywordTypeNodes.unknown) as ts.TypeNode
112
- elements.push(factory.createIndexSignature(propertyCount > 0 ? factory.keywordTypeNodes.unknown : additionalType))
113
- } else if (node.additionalProperties === true) {
114
- elements.push(factory.createIndexSignature(factory.keywordTypeNodes.unknown))
115
- }
116
-
117
- if (node.patternProperties) {
118
- const first = Object.values(node.patternProperties)[0]
119
- if (first) {
120
- let patternType = (print(first) ?? factory.keywordTypeNodes.unknown) as ts.TypeNode
121
- if (first.nullable) {
122
- patternType = factory.createUnionDeclaration({ nodes: [patternType, factory.keywordTypeNodes.null] }) as ts.TypeNode
123
- }
124
- elements.push(factory.createIndexSignature(patternType))
125
- }
126
- }
127
-
128
- return elements
129
- }
130
-
131
- /**
132
- * Converts a `SchemaNode` AST node into a TypeScript `ts.TypeNode`.
133
- *
134
- * Built on `definePrinter` — dispatches on `node.type`, with options closed over
135
- * per printer instance. Produces the same `ts.TypeNode` output as the keyword-based
136
- * `parse` in `parser.ts`.
137
- */
138
- export const printerTs = definePrinter<TsPrinter>((options) => ({
139
- name: 'typescript',
140
- options,
141
- nodes: {
142
- any: () => factory.keywordTypeNodes.any,
143
- unknown: () => factory.keywordTypeNodes.unknown,
144
- void: () => factory.keywordTypeNodes.void,
145
- boolean: () => factory.keywordTypeNodes.boolean,
146
- null: () => factory.keywordTypeNodes.null,
147
- blob: () => factory.createTypeReferenceNode('Blob', []),
148
- string: () => factory.keywordTypeNodes.string,
149
- uuid: () => factory.keywordTypeNodes.string,
150
- email: () => factory.keywordTypeNodes.string,
151
- url: () => factory.keywordTypeNodes.string,
152
- datetime: () => factory.keywordTypeNodes.string,
153
- number: () => factory.keywordTypeNodes.number,
154
- integer: () => factory.keywordTypeNodes.number,
155
- bigint: () => factory.keywordTypeNodes.bigint,
156
- date: (node) => dateOrStringNode(node),
157
- time: (node) => dateOrStringNode(node),
158
- ref(node) {
159
- if (!node.name) {
160
- return undefined
161
- }
162
- return factory.createTypeReferenceNode(node.name, undefined)
163
- },
164
- enum(node) {
165
- const values = node.namedEnumValues?.map((v) => v.value) ?? node.enumValues ?? []
166
-
167
- if (this.options.enumType === 'inlineLiteral' || !node.name) {
168
- const literalNodes = values
169
- .filter((v): v is string | number | boolean => v !== null)
170
- .map((value) => constToTypeNode(value, typeof value === 'number' ? 'number' : typeof value === 'boolean' ? 'boolean' : 'string'))
171
- .filter(Boolean) as Array<ts.TypeNode>
172
-
173
- return factory.createUnionDeclaration({ withParentheses: true, nodes: literalNodes }) ?? undefined
174
- }
175
-
176
- const typeName = ['asConst', 'asPascalConst'].includes(this.options.enumType) ? `${node.name}Key` : node.name
177
-
178
- return factory.createTypeReferenceNode(typeName, undefined)
179
- },
180
- union(node) {
181
- return factory.createUnionDeclaration({ withParentheses: true, nodes: buildMemberNodes(node.members, this.print) }) ?? undefined
182
- },
183
- intersection(node) {
184
- return factory.createIntersectionDeclaration({ withParentheses: true, nodes: buildMemberNodes(node.members, this.print) }) ?? undefined
185
- },
186
- array(node) {
187
- const itemNodes = (node.items ?? []).map((item) => this.print(item)).filter(Boolean) as Array<ts.TypeNode>
188
-
189
- return factory.createArrayDeclaration({ nodes: itemNodes, arrayType: this.options.arrayType }) ?? undefined
190
- },
191
- tuple(node) {
192
- return buildTupleNode(node, this.print)
193
- },
194
- object(node) {
195
- const addsQuestionToken = ['questionToken', 'questionTokenAndUndefined'].includes(this.options.optionalType)
196
- const { print } = this
197
-
198
- const propertyNodes: Array<ts.TypeElement> = node.properties.map((prop) => {
199
- const baseType = (print(prop.schema) ?? factory.keywordTypeNodes.unknown) as ts.TypeNode
200
- const type = buildPropertyType(prop.schema, baseType, this.options.optionalType)
201
-
202
- const propertyNode = factory.createPropertySignature({
203
- questionToken: prop.schema.optional || prop.schema.nullish ? addsQuestionToken : false,
204
- name: prop.name,
205
- type,
206
- readOnly: prop.schema.readOnly,
207
- })
208
-
209
- return factory.appendJSDocToNode({ node: propertyNode, comments: buildPropertyJSDocComments(prop.schema) })
210
- })
211
-
212
- const allElements = [...propertyNodes, ...buildIndexSignatures(node, propertyNodes.length, print)]
213
-
214
- if (!allElements.length) {
215
- return factory.keywordTypeNodes.object
216
- }
217
-
218
- return factory.createTypeLiteralNode(allElements)
219
- },
220
- },
221
- }))