@kubb/swagger-ts 2.18.5 → 2.18.6
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.
- package/dist/{chunk-L3VGPEJS.cjs → chunk-DRW5SRC6.cjs} +92 -90
- package/dist/chunk-DRW5SRC6.cjs.map +1 -0
- package/dist/{chunk-THUX7LK4.js → chunk-UJR52JIE.js} +109 -107
- package/dist/chunk-UJR52JIE.js.map +1 -0
- package/dist/components.cjs +4 -2
- package/dist/components.d.cts +20 -7
- package/dist/components.d.ts +20 -7
- package/dist/components.js +5 -3
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +12 -12
- package/src/SchemaGenerator.tsx +5 -48
- package/src/components/OperationSchema.tsx +12 -7
- package/src/components/Schema.tsx +135 -0
- package/src/components/index.ts +1 -0
- package/src/{typeParser.ts → parser/index.ts} +8 -90
- package/dist/chunk-L3VGPEJS.cjs.map +0 -1
- package/dist/chunk-THUX7LK4.js.map +0 -1
package/dist/components.d.ts
CHANGED
@@ -13,7 +13,7 @@ declare function Template({ name, typeName, api }: TemplateProps): ReactNode;
|
|
13
13
|
declare const defaultTemplates: {
|
14
14
|
readonly default: typeof Template;
|
15
15
|
};
|
16
|
-
type Props$
|
16
|
+
type Props$2 = {
|
17
17
|
name: string;
|
18
18
|
typeName: string;
|
19
19
|
/**
|
@@ -21,14 +21,14 @@ type Props$1 = {
|
|
21
21
|
*/
|
22
22
|
Template?: React.ComponentType<React.ComponentProps<typeof Template>>;
|
23
23
|
};
|
24
|
-
declare function OasType({ name, typeName, Template }: Props$
|
24
|
+
declare function OasType({ name, typeName, Template }: Props$2): ReactNode;
|
25
25
|
declare namespace OasType {
|
26
|
-
var File: ({ name, typeName, templates }: FileProps$
|
26
|
+
var File: ({ name, typeName, templates }: FileProps$2) => ReactNode;
|
27
27
|
var templates: {
|
28
28
|
readonly default: typeof Template;
|
29
29
|
};
|
30
30
|
}
|
31
|
-
type FileProps$
|
31
|
+
type FileProps$2 = {
|
32
32
|
name: string;
|
33
33
|
typeName: string;
|
34
34
|
/**
|
@@ -37,11 +37,24 @@ type FileProps$1 = {
|
|
37
37
|
templates?: typeof defaultTemplates;
|
38
38
|
};
|
39
39
|
|
40
|
-
type Props = {
|
41
|
-
|
40
|
+
type Props$1 = {
|
41
|
+
description?: string;
|
42
|
+
keysToOmit?: string[];
|
43
|
+
};
|
44
|
+
declare function OperationSchema({ keysToOmit, description }: Props$1): ReactNode;
|
42
45
|
declare namespace OperationSchema {
|
46
|
+
var File: ({}: FileProps$1) => ReactNode;
|
47
|
+
}
|
48
|
+
type FileProps$1 = {};
|
49
|
+
|
50
|
+
type Props = {
|
51
|
+
description?: string;
|
52
|
+
keysToOmit?: string[];
|
53
|
+
};
|
54
|
+
declare function Schema(props: Props): ReactNode;
|
55
|
+
declare namespace Schema {
|
43
56
|
var File: ({}: FileProps) => ReactNode;
|
44
57
|
}
|
45
58
|
type FileProps = {};
|
46
59
|
|
47
|
-
export { OasType, OperationSchema };
|
60
|
+
export { OasType, OperationSchema, Schema };
|
package/dist/components.js
CHANGED
package/dist/index.cjs
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
|
6
|
-
var
|
6
|
+
var _chunkDRW5SRC6cjs = require('./chunk-DRW5SRC6.cjs');
|
7
7
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
11
|
|
12
|
-
exports.default =
|
12
|
+
exports.default = _chunkDRW5SRC6cjs.src_default; exports.definePlugin = _chunkDRW5SRC6cjs.definePlugin; exports.pluginTs = _chunkDRW5SRC6cjs.pluginTs; exports.pluginTsName = _chunkDRW5SRC6cjs.pluginTsName;
|
13
13
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@kubb/swagger-ts",
|
3
|
-
"version": "2.18.
|
3
|
+
"version": "2.18.6",
|
4
4
|
"description": "Generator swagger-ts",
|
5
5
|
"keywords": [
|
6
6
|
"typescript",
|
@@ -56,25 +56,25 @@
|
|
56
56
|
"!/**/__tests__/**"
|
57
57
|
],
|
58
58
|
"dependencies": {
|
59
|
-
"@kubb/core": "2.18.
|
60
|
-
"@kubb/fs": "2.18.
|
61
|
-
"@kubb/oas": "2.18.
|
62
|
-
"@kubb/parser-ts": "2.18.
|
63
|
-
"@kubb/plugin-oas": "2.18.
|
64
|
-
"@kubb/react": "2.18.
|
65
|
-
"@kubb/types": "2.18.
|
59
|
+
"@kubb/core": "2.18.6",
|
60
|
+
"@kubb/fs": "2.18.6",
|
61
|
+
"@kubb/oas": "2.18.6",
|
62
|
+
"@kubb/parser-ts": "2.18.6",
|
63
|
+
"@kubb/plugin-oas": "2.18.6",
|
64
|
+
"@kubb/react": "2.18.6",
|
65
|
+
"@kubb/types": "2.18.6"
|
66
66
|
},
|
67
67
|
"devDependencies": {
|
68
68
|
"@types/react": "^18.3.2",
|
69
69
|
"prettier": "^3.2.5",
|
70
70
|
"react": "^18.3.1",
|
71
71
|
"tsup": "^8.0.2",
|
72
|
-
"@kubb/config-biome": "2.18.
|
73
|
-
"@kubb/config-ts": "2.18.
|
74
|
-
"@kubb/config-tsup": "2.18.
|
72
|
+
"@kubb/config-biome": "2.18.6",
|
73
|
+
"@kubb/config-ts": "2.18.6",
|
74
|
+
"@kubb/config-tsup": "2.18.6"
|
75
75
|
},
|
76
76
|
"peerDependencies": {
|
77
|
-
"@kubb/react": "2.18.
|
77
|
+
"@kubb/react": "2.18.6"
|
78
78
|
},
|
79
79
|
"engines": {
|
80
80
|
"node": ">=18",
|
package/src/SchemaGenerator.tsx
CHANGED
@@ -1,32 +1,26 @@
|
|
1
|
+
import type { SchemaObject } from '@kubb/oas'
|
1
2
|
import { SchemaGenerator as Generator } from '@kubb/plugin-oas'
|
3
|
+
import type { SchemaMethodResult } from '@kubb/plugin-oas'
|
2
4
|
import { Oas } from '@kubb/plugin-oas/components'
|
3
5
|
import { App, createRoot } from '@kubb/react'
|
4
|
-
|
5
|
-
import { pluginTsName } from './plugin.ts'
|
6
|
-
import { typeParser } from './typeParser.ts'
|
7
|
-
|
8
|
-
import type { SchemaObject } from '@kubb/oas'
|
9
|
-
import type { SchemaGeneratorBuildOptions, SchemaMethodResult, Schema as SchemaType } from '@kubb/plugin-oas'
|
6
|
+
import { Schema } from './components/Schema.tsx'
|
10
7
|
import type { FileMeta, PluginTs } from './types.ts'
|
11
8
|
|
12
9
|
export class SchemaGenerator extends Generator<PluginTs['resolvedOptions'], PluginTs> {
|
13
10
|
async schema(name: string, schema: SchemaObject): SchemaMethodResult<FileMeta> {
|
14
|
-
const { oas, pluginManager,
|
11
|
+
const { oas, pluginManager, plugin, mode, output } = this.context
|
15
12
|
|
16
13
|
const root = createRoot({
|
17
14
|
logger: pluginManager.logger,
|
18
15
|
})
|
19
16
|
|
20
17
|
const tree = this.parse({ schema, name })
|
21
|
-
const source = this.getSource(name, tree)
|
22
18
|
|
23
19
|
root.render(
|
24
20
|
<App pluginManager={pluginManager} plugin={plugin} mode={mode}>
|
25
21
|
<Oas oas={oas}>
|
26
22
|
<Oas.Schema name={name} value={schema} tree={tree}>
|
27
|
-
<
|
28
|
-
{source.join('\n')}
|
29
|
-
</Oas.Schema.File>
|
23
|
+
<Schema.File />
|
30
24
|
</Oas.Schema>
|
31
25
|
</Oas>
|
32
26
|
</App>,
|
@@ -34,41 +28,4 @@ export class SchemaGenerator extends Generator<PluginTs['resolvedOptions'], Plug
|
|
34
28
|
|
35
29
|
return root.files
|
36
30
|
}
|
37
|
-
// TODO convert to a react component called `Schema.Parser` with props parser as part of the SchemaContext
|
38
|
-
getSource(name: string, schemas: SchemaType[], { keysToOmit, description }: SchemaGeneratorBuildOptions = {}): string[] {
|
39
|
-
const texts: string[] = []
|
40
|
-
|
41
|
-
const resolvedName = this.context.pluginManager.resolveName({
|
42
|
-
name,
|
43
|
-
pluginKey: [pluginTsName],
|
44
|
-
type: 'function',
|
45
|
-
})
|
46
|
-
const resolvedTypeName = this.context.pluginManager.resolveName({
|
47
|
-
name,
|
48
|
-
pluginKey: [pluginTsName],
|
49
|
-
type: 'type',
|
50
|
-
})
|
51
|
-
|
52
|
-
const typeOutput = typeParser(schemas, {
|
53
|
-
name: resolvedName,
|
54
|
-
typeName: resolvedTypeName,
|
55
|
-
description,
|
56
|
-
enumType: this.options.enumType || 'asConst',
|
57
|
-
optionalType: this.options.optionalType,
|
58
|
-
keysToOmit,
|
59
|
-
})
|
60
|
-
|
61
|
-
texts.push(typeOutput)
|
62
|
-
|
63
|
-
return texts
|
64
|
-
}
|
65
|
-
/**
|
66
|
-
* @deprecated only used for testing
|
67
|
-
*/
|
68
|
-
|
69
|
-
buildSource(name: string, schema: SchemaObject, options: SchemaGeneratorBuildOptions = {}): string[] {
|
70
|
-
const schemas = this.parse({ schema, name })
|
71
|
-
|
72
|
-
return this.getSource(name, schemas, options)
|
73
|
-
}
|
74
31
|
}
|
@@ -15,8 +15,7 @@ import type { OperationSchemas } from '@kubb/plugin-oas'
|
|
15
15
|
import { pluginTsName } from '@kubb/swagger-ts'
|
16
16
|
import type { ReactNode } from 'react'
|
17
17
|
import type { FileMeta, PluginTs } from '../types.ts'
|
18
|
-
|
19
|
-
type Props = {}
|
18
|
+
import { Schema } from './Schema.tsx'
|
20
19
|
|
21
20
|
function printCombinedSchema({
|
22
21
|
name,
|
@@ -108,8 +107,13 @@ function printCombinedSchema({
|
|
108
107
|
return print(namespaceNode)
|
109
108
|
}
|
110
109
|
|
111
|
-
|
112
|
-
|
110
|
+
type Props = {
|
111
|
+
description?: string
|
112
|
+
keysToOmit?: string[]
|
113
|
+
}
|
114
|
+
|
115
|
+
export function OperationSchema({ keysToOmit, description }: Props): ReactNode {
|
116
|
+
return <Schema keysToOmit={keysToOmit} description={description} />
|
113
117
|
}
|
114
118
|
|
115
119
|
type FileProps = {}
|
@@ -132,14 +136,15 @@ OperationSchema.File = function ({}: FileProps): ReactNode {
|
|
132
136
|
})
|
133
137
|
const items = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response].flat().filter(Boolean)
|
134
138
|
|
135
|
-
const mapItem = ({ name, schema, ...options }: OperationSchemaType, i: number) => {
|
139
|
+
const mapItem = ({ name, schema, description, keysToOmit, ...options }: OperationSchemaType, i: number) => {
|
136
140
|
const tree = generator.parse({ schema, name })
|
137
|
-
const source = generator.getSource(name, tree, options)
|
138
141
|
|
139
142
|
return (
|
140
143
|
<Oas.Schema key={i} name={name} value={schema} tree={tree}>
|
141
144
|
{mode === 'split' && <Oas.Schema.Imports isTypeOnly />}
|
142
|
-
<File.Source>
|
145
|
+
<File.Source>
|
146
|
+
<OperationSchema description={description} keysToOmit={keysToOmit} />
|
147
|
+
</File.Source>
|
143
148
|
</Oas.Schema>
|
144
149
|
)
|
145
150
|
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
import { Oas } from '@kubb/plugin-oas/components'
|
2
|
+
import { File, useApp } from '@kubb/react'
|
3
|
+
|
4
|
+
import transformers from '@kubb/core/transformers'
|
5
|
+
import { print, type ts } from '@kubb/parser-ts'
|
6
|
+
import * as factory from '@kubb/parser-ts/factory'
|
7
|
+
import { SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'
|
8
|
+
import { useSchema } from '@kubb/plugin-oas/hooks'
|
9
|
+
import type { ReactNode } from 'react'
|
10
|
+
import { parse, typeKeywordMapper } from '../parser/index.ts'
|
11
|
+
import { pluginTsName } from '../plugin.ts'
|
12
|
+
import type { PluginTs } from '../types.ts'
|
13
|
+
|
14
|
+
type Props = {
|
15
|
+
description?: string
|
16
|
+
keysToOmit?: string[]
|
17
|
+
}
|
18
|
+
|
19
|
+
export function Schema(props: Props): ReactNode {
|
20
|
+
const { keysToOmit, description } = props
|
21
|
+
const { tree, name } = useSchema()
|
22
|
+
const {
|
23
|
+
pluginManager,
|
24
|
+
plugin: {
|
25
|
+
options: { enumType, optionalType },
|
26
|
+
},
|
27
|
+
} = useApp<PluginTs>()
|
28
|
+
|
29
|
+
// all checks are also inside this.schema(React)
|
30
|
+
const resolvedName = pluginManager.resolveName({
|
31
|
+
name,
|
32
|
+
pluginKey: [pluginTsName],
|
33
|
+
type: 'function',
|
34
|
+
})
|
35
|
+
|
36
|
+
const typeName = pluginManager.resolveName({
|
37
|
+
name,
|
38
|
+
pluginKey: [pluginTsName],
|
39
|
+
type: 'type',
|
40
|
+
})
|
41
|
+
|
42
|
+
const nodes: ts.Node[] = []
|
43
|
+
const extraNodes: ts.Node[] = []
|
44
|
+
|
45
|
+
if (!tree.length) {
|
46
|
+
return ''
|
47
|
+
}
|
48
|
+
|
49
|
+
const isNullish = tree.some((item) => item.keyword === schemaKeywords.nullish)
|
50
|
+
const isNullable = tree.some((item) => item.keyword === schemaKeywords.nullable)
|
51
|
+
const isOptional = tree.some((item) => item.keyword === schemaKeywords.optional)
|
52
|
+
|
53
|
+
let type =
|
54
|
+
(tree
|
55
|
+
.map((schema) => parse(undefined, schema, { name: resolvedName, typeName, description, keysToOmit, optionalType, enumType }))
|
56
|
+
.filter(Boolean)
|
57
|
+
.at(0) as ts.TypeNode) || typeKeywordMapper.undefined()
|
58
|
+
|
59
|
+
if (isNullable) {
|
60
|
+
type = factory.createUnionDeclaration({
|
61
|
+
nodes: [type, factory.keywordTypeNodes.null],
|
62
|
+
}) as ts.TypeNode
|
63
|
+
}
|
64
|
+
|
65
|
+
if (isNullish && ['undefined', 'questionTokenAndUndefined'].includes(optionalType as string)) {
|
66
|
+
type = factory.createUnionDeclaration({
|
67
|
+
nodes: [type, factory.keywordTypeNodes.undefined],
|
68
|
+
}) as ts.TypeNode
|
69
|
+
}
|
70
|
+
|
71
|
+
if (isOptional && ['undefined', 'questionTokenAndUndefined'].includes(optionalType as string)) {
|
72
|
+
type = factory.createUnionDeclaration({
|
73
|
+
nodes: [type, factory.keywordTypeNodes.undefined],
|
74
|
+
}) as ts.TypeNode
|
75
|
+
}
|
76
|
+
|
77
|
+
const node = factory.createTypeAliasDeclaration({
|
78
|
+
modifiers: [factory.modifiers.export],
|
79
|
+
name: resolvedName,
|
80
|
+
type: keysToOmit?.length
|
81
|
+
? factory.createOmitDeclaration({
|
82
|
+
keys: keysToOmit,
|
83
|
+
type,
|
84
|
+
nonNullable: true,
|
85
|
+
})
|
86
|
+
: type,
|
87
|
+
})
|
88
|
+
|
89
|
+
const enumSchemas = SchemaGenerator.deepSearch(tree, schemaKeywords.enum)
|
90
|
+
if (enumSchemas) {
|
91
|
+
enumSchemas.forEach((enumSchema) => {
|
92
|
+
extraNodes.push(
|
93
|
+
...factory.createEnumDeclaration({
|
94
|
+
name: transformers.camelCase(enumSchema.args.name),
|
95
|
+
typeName: enumSchema.args.typeName,
|
96
|
+
enums: enumSchema.args.items
|
97
|
+
.map((item) => (item.value === undefined ? undefined : [transformers.trimQuotes(item.name?.toString()), item.value]))
|
98
|
+
.filter(Boolean) as unknown as [string, string][],
|
99
|
+
type: enumType,
|
100
|
+
}),
|
101
|
+
)
|
102
|
+
})
|
103
|
+
}
|
104
|
+
|
105
|
+
nodes.push(
|
106
|
+
factory.appendJSDocToNode({
|
107
|
+
node,
|
108
|
+
comments: [description ? `@description ${transformers.jsStringEscape(description)}` : undefined].filter(Boolean),
|
109
|
+
}),
|
110
|
+
)
|
111
|
+
|
112
|
+
const filterdNodes = nodes.filter(
|
113
|
+
(node: ts.Node) =>
|
114
|
+
!extraNodes.some(
|
115
|
+
(extraNode: ts.Node) => (extraNode as ts.TypeAliasDeclaration)?.name?.escapedText === (node as ts.TypeAliasDeclaration)?.name?.escapedText,
|
116
|
+
),
|
117
|
+
)
|
118
|
+
|
119
|
+
return print([...extraNodes, ...filterdNodes])
|
120
|
+
}
|
121
|
+
|
122
|
+
type FileProps = {}
|
123
|
+
|
124
|
+
Schema.File = function ({}: FileProps): ReactNode {
|
125
|
+
const { pluginManager } = useApp<PluginTs>()
|
126
|
+
const { schema } = useSchema()
|
127
|
+
|
128
|
+
return (
|
129
|
+
<Oas.Schema.File output={pluginManager.config.output.path}>
|
130
|
+
<File.Source>
|
131
|
+
<Schema description={schema?.description} />
|
132
|
+
</File.Source>
|
133
|
+
</Oas.Schema.File>
|
134
|
+
)
|
135
|
+
}
|
package/src/components/index.ts
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
import transformers from '@kubb/core/transformers'
|
2
|
-
import { print } from '@kubb/parser-ts'
|
3
2
|
import * as factory from '@kubb/parser-ts/factory'
|
4
|
-
import {
|
3
|
+
import { isKeyword, schemaKeywords } from '@kubb/plugin-oas'
|
5
4
|
|
6
5
|
import type { ts } from '@kubb/parser-ts'
|
7
6
|
import type { Schema, SchemaKeywordMapper, SchemaMapper } from '@kubb/plugin-oas'
|
@@ -127,7 +126,7 @@ type ParserOptions = {
|
|
127
126
|
mapper?: SchemaMapper
|
128
127
|
}
|
129
128
|
|
130
|
-
export function
|
129
|
+
export function parse(parent: Schema | undefined, current: Schema, options: ParserOptions): ts.Node | null | undefined {
|
131
130
|
const value = typeKeywordMapper[current.keyword as keyof typeof typeKeywordMapper]
|
132
131
|
|
133
132
|
if (!value) {
|
@@ -135,15 +134,15 @@ export function parseTypeMeta(parent: Schema | undefined, current: Schema, optio
|
|
135
134
|
}
|
136
135
|
|
137
136
|
if (isKeyword(current, schemaKeywords.union)) {
|
138
|
-
return typeKeywordMapper.union(current.args.map((schema) =>
|
137
|
+
return typeKeywordMapper.union(current.args.map((schema) => parse(current, schema, options)).filter(Boolean) as ts.TypeNode[])
|
139
138
|
}
|
140
139
|
|
141
140
|
if (isKeyword(current, schemaKeywords.and)) {
|
142
|
-
return typeKeywordMapper.and(current.args.map((schema) =>
|
141
|
+
return typeKeywordMapper.and(current.args.map((schema) => parse(current, schema, options)).filter(Boolean) as ts.TypeNode[])
|
143
142
|
}
|
144
143
|
|
145
144
|
if (isKeyword(current, schemaKeywords.array)) {
|
146
|
-
return typeKeywordMapper.array(current.args.items.map((schema) =>
|
145
|
+
return typeKeywordMapper.array(current.args.items.map((schema) => parse(current, schema, options)).filter(Boolean) as ts.TypeNode[])
|
147
146
|
}
|
148
147
|
|
149
148
|
if (isKeyword(current, schemaKeywords.enum)) {
|
@@ -159,7 +158,7 @@ export function parseTypeMeta(parent: Schema | undefined, current: Schema, optio
|
|
159
158
|
}
|
160
159
|
|
161
160
|
if (isKeyword(current, schemaKeywords.tuple)) {
|
162
|
-
return typeKeywordMapper.tuple(current.args.map((schema) =>
|
161
|
+
return typeKeywordMapper.tuple(current.args.map((schema) => parse(current, schema, options)).filter(Boolean) as ts.TypeNode[])
|
163
162
|
}
|
164
163
|
|
165
164
|
if (isKeyword(current, schemaKeywords.const)) {
|
@@ -190,7 +189,7 @@ export function parseTypeMeta(parent: Schema | undefined, current: Schema, optio
|
|
190
189
|
const exampleSchema = schemas.find((schema) => schema.keyword === schemaKeywords.example) as SchemaKeywordMapper['example'] | undefined
|
191
190
|
const schemaSchema = schemas.find((schema) => schema.keyword === schemaKeywords.schema) as SchemaKeywordMapper['schema'] | undefined
|
192
191
|
|
193
|
-
let type = schemas.map((schema) =>
|
192
|
+
let type = schemas.map((schema) => parse(current, schema, options)).filter(Boolean)[0] as ts.TypeNode
|
194
193
|
|
195
194
|
if (isNullable) {
|
196
195
|
type = factory.createUnionDeclaration({
|
@@ -234,7 +233,7 @@ export function parseTypeMeta(parent: Schema | undefined, current: Schema, optio
|
|
234
233
|
const additionalProperties = current.args?.additionalProperties?.length
|
235
234
|
? factory.createIndexSignature(
|
236
235
|
current.args.additionalProperties
|
237
|
-
.map((schema) =>
|
236
|
+
.map((schema) => parse(current, schema, options))
|
238
237
|
.filter(Boolean)
|
239
238
|
.at(0) as ts.TypeNode,
|
240
239
|
)
|
@@ -261,84 +260,3 @@ export function parseTypeMeta(parent: Schema | undefined, current: Schema, optio
|
|
261
260
|
|
262
261
|
return undefined
|
263
262
|
}
|
264
|
-
|
265
|
-
export function typeParser(schemas: Schema[], options: ParserOptions): string {
|
266
|
-
const nodes: ts.Node[] = []
|
267
|
-
const extraNodes: ts.Node[] = []
|
268
|
-
|
269
|
-
if (!schemas.length) {
|
270
|
-
return ''
|
271
|
-
}
|
272
|
-
|
273
|
-
const isNullish = schemas.some((item) => item.keyword === schemaKeywords.nullish)
|
274
|
-
const isNullable = schemas.some((item) => item.keyword === schemaKeywords.nullable)
|
275
|
-
const isOptional = schemas.some((item) => item.keyword === schemaKeywords.optional)
|
276
|
-
|
277
|
-
let type =
|
278
|
-
(schemas
|
279
|
-
.map((schema) => parseTypeMeta(undefined, schema, options))
|
280
|
-
.filter(Boolean)
|
281
|
-
.at(0) as ts.TypeNode) || typeKeywordMapper.undefined()
|
282
|
-
|
283
|
-
if (isNullable) {
|
284
|
-
type = factory.createUnionDeclaration({
|
285
|
-
nodes: [type, factory.keywordTypeNodes.null],
|
286
|
-
}) as ts.TypeNode
|
287
|
-
}
|
288
|
-
|
289
|
-
if (isNullish && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {
|
290
|
-
type = factory.createUnionDeclaration({
|
291
|
-
nodes: [type, factory.keywordTypeNodes.undefined],
|
292
|
-
}) as ts.TypeNode
|
293
|
-
}
|
294
|
-
|
295
|
-
if (isOptional && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {
|
296
|
-
type = factory.createUnionDeclaration({
|
297
|
-
nodes: [type, factory.keywordTypeNodes.undefined],
|
298
|
-
}) as ts.TypeNode
|
299
|
-
}
|
300
|
-
|
301
|
-
const node = factory.createTypeAliasDeclaration({
|
302
|
-
modifiers: [factory.modifiers.export],
|
303
|
-
name: options.name,
|
304
|
-
type: options.keysToOmit?.length
|
305
|
-
? factory.createOmitDeclaration({
|
306
|
-
keys: options.keysToOmit,
|
307
|
-
type,
|
308
|
-
nonNullable: true,
|
309
|
-
})
|
310
|
-
: type,
|
311
|
-
})
|
312
|
-
|
313
|
-
const enumSchemas = SchemaGenerator.deepSearch(schemas, schemaKeywords.enum)
|
314
|
-
if (enumSchemas) {
|
315
|
-
enumSchemas.forEach((enumSchema) => {
|
316
|
-
extraNodes.push(
|
317
|
-
...factory.createEnumDeclaration({
|
318
|
-
name: transformers.camelCase(enumSchema.args.name),
|
319
|
-
typeName: enumSchema.args.typeName,
|
320
|
-
enums: enumSchema.args.items
|
321
|
-
.map((item) => (item.value === undefined ? undefined : [transformers.trimQuotes(item.name?.toString()), item.value]))
|
322
|
-
.filter(Boolean) as unknown as [string, string][],
|
323
|
-
type: options.enumType,
|
324
|
-
}),
|
325
|
-
)
|
326
|
-
})
|
327
|
-
}
|
328
|
-
|
329
|
-
nodes.push(
|
330
|
-
factory.appendJSDocToNode({
|
331
|
-
node,
|
332
|
-
comments: [options.description ? `@description ${transformers.jsStringEscape(options.description)}` : undefined].filter(Boolean),
|
333
|
-
}),
|
334
|
-
)
|
335
|
-
|
336
|
-
const filterdNodes = nodes.filter(
|
337
|
-
(node: ts.Node) =>
|
338
|
-
!extraNodes.some(
|
339
|
-
(extraNode: ts.Node) => (extraNode as ts.TypeAliasDeclaration)?.name?.escapedText === (node as ts.TypeAliasDeclaration)?.name?.escapedText,
|
340
|
-
),
|
341
|
-
)
|
342
|
-
|
343
|
-
return print([...extraNodes, ...filterdNodes])
|
344
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/OperationGenerator.tsx","../src/components/OasType.tsx","../src/components/OperationSchema.tsx","../src/SchemaGenerator.tsx","../src/typeParser.ts","../src/index.ts"],"names":["Generator","Oas","App","createRoot","Template","transformers","print","factory","useOas","File","Parser","useApp","node","jsx","SchemaGenerator","Fragment","jsxs","options","path"],"mappings":"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","sourcesContent":["import path from 'node:path'\n\nimport { FileManager, PluginManager, createPlugin } from '@kubb/core'\nimport { camelCase, pascalCase } from '@kubb/core/transformers'\nimport { renderTemplate } from '@kubb/core/utils'\nimport { pluginOasName } from '@kubb/plugin-oas'\n\nimport { OperationGenerator } from './OperationGenerator.tsx'\nimport { SchemaGenerator } from './SchemaGenerator.tsx'\n\nimport type { Plugin } from '@kubb/core'\nimport type { PluginOas as SwaggerPluginOptions } from '@kubb/plugin-oas'\nimport type { PluginTs } from './types.ts'\n\nexport const pluginTsName = 'plugin-ts' satisfies PluginTs['name']\n\nexport const pluginTs = createPlugin<PluginTs>((options) => {\n const {\n output = { path: 'types' },\n group,\n exclude = [],\n include,\n override = [],\n enumType = 'asConst',\n enumSuffix = '',\n dateType = 'string',\n unknownType = 'any',\n optionalType = 'questionToken',\n transformers = {},\n oasType = false,\n } = options\n const template = group?.output ? group.output : `${output.path}/{{tag}}Controller`\n\n return {\n name: pluginTsName,\n options: {\n transformers,\n dateType,\n optionalType,\n oasType,\n enumType,\n enumSuffix,\n // keep the used enumnames between SchemaGenerator and OperationGenerator per plugin(pluginKey)\n usedEnumNames: {},\n unknownType,\n override,\n },\n pre: [pluginOasName],\n resolvePath(baseName, pathMode, options) {\n const root = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? FileManager.getMode(path.resolve(root, output.path))\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (options?.tag && group?.type === 'tag') {\n const tag = camelCase(options.tag)\n\n return path.resolve(root, renderTemplate(template, { tag }), baseName)\n }\n\n return path.resolve(root, output.path, baseName)\n },\n resolveName(name, type) {\n const resolvedName = pascalCase(name, { isFile: type === 'file' })\n\n if (type) {\n return transformers?.name?.(resolvedName, type) || resolvedName\n }\n\n return resolvedName\n },\n async writeFile(path, source) {\n if (!path.endsWith('.ts') || !source) {\n return\n }\n\n return this.fileManager.write(path, source, { sanity: false })\n },\n async buildStart() {\n const [swaggerPlugin]: [Plugin<SwaggerPluginOptions>] = PluginManager.getDependedPlugins<SwaggerPluginOptions>(this.plugins, [pluginOasName])\n\n const oas = await swaggerPlugin.api.getOas()\n const root = path.resolve(this.config.root, this.config.output.path)\n const mode = FileManager.getMode(path.resolve(root, output.path))\n\n const schemaGenerator = new SchemaGenerator(this.plugin.options, {\n oas,\n pluginManager: this.pluginManager,\n plugin: this.plugin,\n contentType: swaggerPlugin.api.contentType,\n include: undefined,\n override,\n mode,\n output: output.path,\n })\n\n const schemaFiles = await schemaGenerator.build()\n await this.addFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n oas,\n pluginManager: this.pluginManager,\n plugin: this.plugin,\n contentType: swaggerPlugin.api.contentType,\n exclude,\n include,\n override,\n mode,\n })\n\n const operationFiles = await operationGenerator.build()\n await this.addFile(...operationFiles)\n },\n async buildEnd() {\n if (this.config.output.write === false) {\n return\n }\n\n const root = path.resolve(this.config.root, this.config.output.path)\n\n await this.fileManager.addIndexes({\n root,\n output,\n meta: { pluginKey: this.plugin.key },\n logger: this.logger,\n })\n },\n }\n})\n","import { OperationGenerator as Generator } from '@kubb/plugin-oas'\nimport { Oas } from '@kubb/plugin-oas/components'\nimport { App, createRoot } from '@kubb/react'\n\nimport { OasType } from './components/OasType.tsx'\nimport { OperationSchema } from './components/OperationSchema.tsx'\n\nimport type { Operation } from '@kubb/oas'\nimport type { OperationMethodResult } from '@kubb/plugin-oas'\nimport type { FileMeta, PluginTs } from './types.ts'\n\nexport class OperationGenerator extends Generator<PluginTs['resolvedOptions'], PluginTs> {\n async all(operations: Operation[]): OperationMethodResult<FileMeta> {\n const { oas, pluginManager, plugin, mode } = this.context\n\n const root = createRoot({\n logger: pluginManager.logger,\n })\n\n root.render(\n <App pluginManager={pluginManager} plugin={plugin} mode={mode}>\n <Oas oas={oas} operations={operations} generator={this}>\n {plugin.options.oasType && <OasType.File name=\"oas\" typeName=\"Oas\" />}\n </Oas>\n </App>,\n )\n\n return root.files\n }\n\n async operation(operation: Operation, options: PluginTs['resolvedOptions']): OperationMethodResult<FileMeta> {\n const { oas, pluginManager, plugin, mode } = this.context\n\n const root = createRoot({\n logger: pluginManager.logger,\n })\n root.render(\n <App pluginManager={pluginManager} plugin={{ ...plugin, options }} mode={mode}>\n <Oas oas={oas} operations={[operation]} generator={this}>\n <Oas.Operation operation={operation}>\n <OperationSchema.File />\n </Oas.Operation>\n </Oas>\n </App>,\n )\n\n return root.files\n }\n}\n","import { Parser, File, Type, useApp } from '@kubb/react'\nimport { useOas } from '@kubb/plugin-oas/hooks'\n\nimport type { OasTypes } from '@kubb/oas'\nimport type { ReactNode } from 'react'\nimport type { FileMeta, PluginTs } from '../types.ts'\n\ntype TemplateProps = {\n /**\n * Name of the function\n */\n name: string\n typeName: string\n api: OasTypes.OASDocument\n}\n\nfunction Template({ name, typeName, api }: TemplateProps): ReactNode {\n return (\n <>\n {`export const ${name} = ${JSON.stringify(api, undefined, 2)} as const`}\n <br />\n <Type name={typeName} export>\n {`Infer<typeof ${name}>`}\n </Type>\n </>\n )\n}\n\nconst defaultTemplates = { default: Template } as const\n\ntype Props = {\n name: string\n typeName: string\n /**\n * This will make it possible to override the default behaviour.\n */\n Template?: React.ComponentType<React.ComponentProps<typeof Template>>\n}\n\nexport function OasType({ name, typeName, Template = defaultTemplates.default }: Props): ReactNode {\n const oas = useOas()\n\n return <Template name={name} typeName={typeName} api={oas.api} />\n}\n\ntype FileProps = {\n name: string\n typeName: string\n /**\n * This will make it possible to override the default behaviour.\n */\n templates?: typeof defaultTemplates\n}\n\nOasType.File = function ({ name, typeName, templates = defaultTemplates }: FileProps): ReactNode {\n const {\n pluginManager,\n plugin: { key: pluginKey },\n } = useApp<PluginTs>()\n const file = pluginManager.getFile({ name, extName: '.ts', pluginKey })\n\n const Template = templates.default\n\n return (\n <Parser language=\"typescript\">\n <File<FileMeta> baseName={file.baseName} path={file.path} meta={file.meta}>\n <File.Import name={['Infer']} path=\"@kubb/swagger-ts/oas\" isTypeOnly />\n <File.Source>\n <OasType Template={Template} name={name} typeName={typeName} />\n </File.Source>\n </File>\n </Parser>\n )\n}\n\nOasType.templates = defaultTemplates\n","import transformers from '@kubb/core/transformers'\nimport { print } from '@kubb/parser-ts'\nimport * as factory from '@kubb/parser-ts/factory'\nimport { Oas } from '@kubb/plugin-oas/components'\nimport { useOas, useOperation, useOperationManager } from '@kubb/plugin-oas/hooks'\nimport { File, Parser, useApp } from '@kubb/react'\n\nimport { SchemaGenerator } from '../SchemaGenerator.tsx'\n\nimport type { PluginManager } from '@kubb/core'\nimport type { Operation } from '@kubb/oas'\nimport type { ts } from '@kubb/parser-ts'\nimport type { OperationSchema as OperationSchemaType } from '@kubb/plugin-oas'\nimport type { OperationSchemas } from '@kubb/plugin-oas'\nimport { pluginTsName } from '@kubb/swagger-ts'\nimport type { ReactNode } from 'react'\nimport type { FileMeta, PluginTs } from '../types.ts'\n\ntype Props = {}\n\nfunction printCombinedSchema({\n name,\n operation,\n schemas,\n pluginManager,\n}: { name: string; operation: Operation; schemas: OperationSchemas; pluginManager: PluginManager }): string {\n const properties: Record<string, ts.TypeNode> = {}\n\n if (schemas.response) {\n const identifier = pluginManager.resolveName({\n name: schemas.response.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['response'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.request) {\n const identifier = pluginManager.resolveName({\n name: schemas.request.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['request'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.pathParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.pathParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['pathParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.queryParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.queryParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['queryParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.headerParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.headerParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['headerParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.errors) {\n properties['errors'] = factory.createUnionDeclaration({\n nodes: schemas.errors.map((error) => {\n const identifier = pluginManager.resolveName({\n name: error.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n\n return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }),\n })!\n }\n\n const namespaceNode = factory.createTypeAliasDeclaration({\n name: operation.method === 'get' ? `${name}Query` : `${name}Mutation`,\n type: factory.createTypeLiteralNode(\n Object.keys(properties)\n .map((key) => {\n const type = properties[key]\n if (!type) {\n return undefined\n }\n\n return factory.createPropertySignature({\n name: transformers.pascalCase(key),\n type,\n })\n })\n .filter(Boolean),\n ),\n modifiers: [factory.modifiers.export],\n })\n\n return print(namespaceNode)\n}\n\nexport function OperationSchema({}: Props): ReactNode {\n return <></>\n}\n\ntype FileProps = {}\n\nOperationSchema.File = function ({}: FileProps): ReactNode {\n const { pluginManager, plugin, mode, fileManager } = useApp<PluginTs>()\n const oas = useOas()\n const { getSchemas, getFile, getName } = useOperationManager()\n const operation = useOperation()\n\n const file = getFile(operation)\n const schemas = getSchemas(operation)\n const factoryName = getName(operation, { type: 'type' })\n const generator = new SchemaGenerator(plugin.options, {\n oas,\n plugin,\n pluginManager,\n mode,\n override: plugin.options.override,\n })\n const items = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response].flat().filter(Boolean)\n\n const mapItem = ({ name, schema, ...options }: OperationSchemaType, i: number) => {\n const tree = generator.parse({ schema, name })\n const source = generator.getSource(name, tree, options)\n\n return (\n <Oas.Schema key={i} name={name} value={schema} tree={tree}>\n {mode === 'split' && <Oas.Schema.Imports isTypeOnly />}\n <File.Source>{source.join('\\n')}</File.Source>\n </Oas.Schema>\n )\n }\n\n return (\n <Parser language=\"typescript\">\n <File<FileMeta> baseName={file.baseName} path={file.path} meta={file.meta}>\n {items.map(mapItem)}\n\n <File.Source>{printCombinedSchema({ name: factoryName, operation, schemas, pluginManager })}</File.Source>\n </File>\n </Parser>\n )\n}\n","import { SchemaGenerator as Generator } from '@kubb/plugin-oas'\nimport { Oas } from '@kubb/plugin-oas/components'\nimport { App, createRoot } from '@kubb/react'\n\nimport { pluginTsName } from './plugin.ts'\nimport { typeParser } from './typeParser.ts'\n\nimport type { SchemaObject } from '@kubb/oas'\nimport type { SchemaGeneratorBuildOptions, SchemaMethodResult, Schema as SchemaType } from '@kubb/plugin-oas'\nimport type { FileMeta, PluginTs } from './types.ts'\n\nexport class SchemaGenerator extends Generator<PluginTs['resolvedOptions'], PluginTs> {\n async schema(name: string, schema: SchemaObject): SchemaMethodResult<FileMeta> {\n const { oas, pluginManager, mode, plugin, output } = this.context\n\n const root = createRoot({\n logger: pluginManager.logger,\n })\n\n const tree = this.parse({ schema, name })\n const source = this.getSource(name, tree)\n\n root.render(\n <App pluginManager={pluginManager} plugin={plugin} mode={mode}>\n <Oas oas={oas}>\n <Oas.Schema name={name} value={schema} tree={tree}>\n <Oas.Schema.File isTypeOnly output={output}>\n {source.join('\\n')}\n </Oas.Schema.File>\n </Oas.Schema>\n </Oas>\n </App>,\n )\n\n return root.files\n }\n // TODO convert to a react component called `Schema.Parser` with props parser as part of the SchemaContext\n getSource(name: string, schemas: SchemaType[], { keysToOmit, description }: SchemaGeneratorBuildOptions = {}): string[] {\n const texts: string[] = []\n\n const resolvedName = this.context.pluginManager.resolveName({\n name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n const resolvedTypeName = this.context.pluginManager.resolveName({\n name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n const typeOutput = typeParser(schemas, {\n name: resolvedName,\n typeName: resolvedTypeName,\n description,\n enumType: this.options.enumType || 'asConst',\n optionalType: this.options.optionalType,\n keysToOmit,\n })\n\n texts.push(typeOutput)\n\n return texts\n }\n /**\n * @deprecated only used for testing\n */\n\n buildSource(name: string, schema: SchemaObject, options: SchemaGeneratorBuildOptions = {}): string[] {\n const schemas = this.parse({ schema, name })\n\n return this.getSource(name, schemas, options)\n }\n}\n","import transformers from '@kubb/core/transformers'\nimport { print } from '@kubb/parser-ts'\nimport * as factory from '@kubb/parser-ts/factory'\nimport { SchemaGenerator, isKeyword, schemaKeywords } from '@kubb/plugin-oas'\n\nimport type { ts } from '@kubb/parser-ts'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper } from '@kubb/plugin-oas'\n\nexport const typeKeywordMapper = {\n any: () => factory.keywordTypeNodes.any,\n unknown: () => factory.keywordTypeNodes.unknown,\n number: () => factory.keywordTypeNodes.number,\n integer: () => factory.keywordTypeNodes.number,\n object: (nodes?: ts.TypeElement[]) => {\n if (!nodes) {\n return factory.keywordTypeNodes.object\n }\n\n return factory.createTypeLiteralNode(nodes)\n },\n string: () => factory.keywordTypeNodes.string,\n boolean: () => factory.keywordTypeNodes.boolean,\n undefined: () => factory.keywordTypeNodes.undefined,\n nullable: undefined,\n null: () => factory.keywordTypeNodes.null,\n nullish: undefined,\n array: (nodes?: ts.TypeNode[]) => {\n if (!nodes) {\n return undefined\n }\n\n return factory.createArrayDeclaration({ nodes })\n },\n tuple: (nodes?: ts.TypeNode[]) => {\n if (!nodes) {\n return undefined\n }\n\n return factory.createTupleTypeNode(nodes)\n },\n enum: (name?: string) => {\n if (!name) {\n return undefined\n }\n\n return factory.createTypeReferenceNode(name, undefined)\n },\n union: (nodes?: ts.TypeNode[]) => {\n if (!nodes) {\n return undefined\n }\n\n return factory.createUnionDeclaration({\n withParentheses: true,\n nodes,\n })\n },\n const: (name?: string | number, format?: 'string' | 'number') => {\n if (!name) {\n return undefined\n }\n\n if (format === 'number') {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(name))\n }\n\n return factory.createLiteralTypeNode(factory.createStringLiteral(name.toString()))\n },\n datetime: () => factory.keywordTypeNodes.string,\n date: (type: 'date' | 'string' = 'string') =>\n type === 'string' ? factory.keywordTypeNodes.string : factory.createTypeReferenceNode(factory.createIdentifier('Date')),\n time: (type: 'date' | 'string' = 'string') =>\n type === 'string' ? factory.keywordTypeNodes.string : factory.createTypeReferenceNode(factory.createIdentifier('Date')),\n uuid: undefined,\n url: undefined,\n strict: undefined,\n default: undefined,\n and: (nodes?: ts.TypeNode[]) => {\n if (!nodes) {\n return undefined\n }\n\n return factory.createIntersectionDeclaration({\n withParentheses: true,\n nodes,\n })\n },\n describe: undefined,\n min: undefined,\n max: undefined,\n optional: undefined,\n matches: undefined,\n email: undefined,\n firstName: undefined,\n lastName: undefined,\n password: undefined,\n phone: undefined,\n readOnly: undefined,\n ref: (propertyName?: string) => {\n if (!propertyName) {\n return undefined\n }\n\n return factory.createTypeReferenceNode(propertyName, undefined)\n },\n blob: () => factory.createTypeReferenceNode('Blob', []),\n deprecated: undefined,\n example: undefined,\n schema: undefined,\n catchall: undefined,\n name: undefined,\n} satisfies SchemaMapper<ts.Node | null | undefined>\n\ntype ParserOptions = {\n name: string\n typeName?: string\n description?: string\n /**\n * @default `'questionToken'`\n */\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n /**\n * @default `'asConst'`\n */\n enumType: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal'\n keysToOmit?: string[]\n mapper?: SchemaMapper\n}\n\nexport function parseTypeMeta(parent: Schema | undefined, current: Schema, options: ParserOptions): ts.Node | null | undefined {\n const value = typeKeywordMapper[current.keyword as keyof typeof typeKeywordMapper]\n\n if (!value) {\n return undefined\n }\n\n if (isKeyword(current, schemaKeywords.union)) {\n return typeKeywordMapper.union(current.args.map((schema) => parseTypeMeta(current, schema, options)).filter(Boolean) as ts.TypeNode[])\n }\n\n if (isKeyword(current, schemaKeywords.and)) {\n return typeKeywordMapper.and(current.args.map((schema) => parseTypeMeta(current, schema, options)).filter(Boolean) as ts.TypeNode[])\n }\n\n if (isKeyword(current, schemaKeywords.array)) {\n return typeKeywordMapper.array(current.args.items.map((schema) => parseTypeMeta(current, schema, options)).filter(Boolean) as ts.TypeNode[])\n }\n\n if (isKeyword(current, schemaKeywords.enum)) {\n return typeKeywordMapper.enum(current.args.typeName)\n }\n\n if (isKeyword(current, schemaKeywords.ref)) {\n return typeKeywordMapper.ref(current.args.name)\n }\n\n if (isKeyword(current, schemaKeywords.blob)) {\n return value()\n }\n\n if (isKeyword(current, schemaKeywords.tuple)) {\n return typeKeywordMapper.tuple(current.args.map((schema) => parseTypeMeta(current, schema, options)).filter(Boolean) as ts.TypeNode[])\n }\n\n if (isKeyword(current, schemaKeywords.const)) {\n return typeKeywordMapper.const(current.args.name, current.args.format)\n }\n\n if (isKeyword(current, schemaKeywords.object)) {\n const properties = Object.entries(current.args?.properties || {})\n .filter((item) => {\n const schemas = item[1]\n return schemas && typeof schemas.map === 'function'\n })\n .map(([_name, schemas]) => {\n let name = _name\n const nameSchema = schemas.find((schema) => schema.keyword === schemaKeywords.name) as SchemaKeywordMapper['name']\n\n if (nameSchema) {\n name = nameSchema.args\n }\n\n const isNullish = schemas.some((schema) => schema.keyword === schemaKeywords.nullish)\n const isNullable = schemas.some((schema) => schema.keyword === schemaKeywords.nullable)\n const isOptional = schemas.some((schema) => schema.keyword === schemaKeywords.optional)\n const isReadonly = schemas.some((schema) => schema.keyword === schemaKeywords.readOnly)\n const describeSchema = schemas.find((schema) => schema.keyword === schemaKeywords.describe) as SchemaKeywordMapper['describe'] | undefined\n const deprecatedSchema = schemas.find((schema) => schema.keyword === schemaKeywords.deprecated) as SchemaKeywordMapper['deprecated'] | undefined\n const defaultSchema = schemas.find((schema) => schema.keyword === schemaKeywords.default) as SchemaKeywordMapper['default'] | undefined\n const exampleSchema = schemas.find((schema) => schema.keyword === schemaKeywords.example) as SchemaKeywordMapper['example'] | undefined\n const schemaSchema = schemas.find((schema) => schema.keyword === schemaKeywords.schema) as SchemaKeywordMapper['schema'] | undefined\n\n let type = schemas.map((schema) => parseTypeMeta(current, schema, options)).filter(Boolean)[0] as ts.TypeNode\n\n if (isNullable) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.null],\n }) as ts.TypeNode\n }\n\n if (isNullish && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.undefined],\n }) as ts.TypeNode\n }\n\n if (isOptional && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.undefined],\n }) as ts.TypeNode\n }\n\n const propertySignature = factory.createPropertySignature({\n questionToken: isOptional || isNullish ? ['questionToken', 'questionTokenAndUndefined'].includes(options.optionalType as string) : false,\n name,\n type,\n readOnly: isReadonly,\n })\n\n return factory.appendJSDocToNode({\n node: propertySignature,\n comments: [\n describeSchema ? `@description ${transformers.jsStringEscape(describeSchema.args)}` : undefined,\n deprecatedSchema ? '@deprecated' : undefined,\n defaultSchema ? `@default ${defaultSchema.args}` : undefined,\n exampleSchema ? `@example ${exampleSchema.args}` : undefined,\n schemaSchema?.args?.type || schemaSchema?.args?.format\n ? [`@type ${schemaSchema?.args?.type || 'unknown'}${!isOptional ? '' : ' | undefined'}`, schemaSchema?.args?.format].filter(Boolean).join(', ')\n : undefined,\n ].filter(Boolean),\n })\n })\n\n const additionalProperties = current.args?.additionalProperties?.length\n ? factory.createIndexSignature(\n current.args.additionalProperties\n .map((schema) => parseTypeMeta(current, schema, options))\n .filter(Boolean)\n .at(0) as ts.TypeNode,\n )\n : undefined\n\n return typeKeywordMapper.object([...properties, additionalProperties].filter(Boolean))\n }\n\n if (isKeyword(current, schemaKeywords.datetime)) {\n return typeKeywordMapper.datetime()\n }\n\n if (isKeyword(current, schemaKeywords.date)) {\n return typeKeywordMapper.date(current.args.type)\n }\n\n if (isKeyword(current, schemaKeywords.time)) {\n return typeKeywordMapper.time(current.args.type)\n }\n\n if (current.keyword in typeKeywordMapper) {\n return value()\n }\n\n return undefined\n}\n\nexport function typeParser(schemas: Schema[], options: ParserOptions): string {\n const nodes: ts.Node[] = []\n const extraNodes: ts.Node[] = []\n\n if (!schemas.length) {\n return ''\n }\n\n const isNullish = schemas.some((item) => item.keyword === schemaKeywords.nullish)\n const isNullable = schemas.some((item) => item.keyword === schemaKeywords.nullable)\n const isOptional = schemas.some((item) => item.keyword === schemaKeywords.optional)\n\n let type =\n (schemas\n .map((schema) => parseTypeMeta(undefined, schema, options))\n .filter(Boolean)\n .at(0) as ts.TypeNode) || typeKeywordMapper.undefined()\n\n if (isNullable) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.null],\n }) as ts.TypeNode\n }\n\n if (isNullish && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.undefined],\n }) as ts.TypeNode\n }\n\n if (isOptional && ['undefined', 'questionTokenAndUndefined'].includes(options.optionalType as string)) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.undefined],\n }) as ts.TypeNode\n }\n\n const node = factory.createTypeAliasDeclaration({\n modifiers: [factory.modifiers.export],\n name: options.name,\n type: options.keysToOmit?.length\n ? factory.createOmitDeclaration({\n keys: options.keysToOmit,\n type,\n nonNullable: true,\n })\n : type,\n })\n\n const enumSchemas = SchemaGenerator.deepSearch(schemas, schemaKeywords.enum)\n if (enumSchemas) {\n enumSchemas.forEach((enumSchema) => {\n extraNodes.push(\n ...factory.createEnumDeclaration({\n name: transformers.camelCase(enumSchema.args.name),\n typeName: enumSchema.args.typeName,\n enums: enumSchema.args.items\n .map((item) => (item.value === undefined ? undefined : [transformers.trimQuotes(item.name?.toString()), item.value]))\n .filter(Boolean) as unknown as [string, string][],\n type: options.enumType,\n }),\n )\n })\n }\n\n nodes.push(\n factory.appendJSDocToNode({\n node,\n comments: [options.description ? `@description ${transformers.jsStringEscape(options.description)}` : undefined].filter(Boolean),\n }),\n )\n\n const filterdNodes = nodes.filter(\n (node: ts.Node) =>\n !extraNodes.some(\n (extraNode: ts.Node) => (extraNode as ts.TypeAliasDeclaration)?.name?.escapedText === (node as ts.TypeAliasDeclaration)?.name?.escapedText,\n ),\n )\n\n return print([...extraNodes, ...filterdNodes])\n}\n","import { pluginTs } from './plugin.ts'\n\nexport { pluginTs, pluginTsName } from './plugin.ts'\nexport type { PluginTs } from './types.ts'\n\n/**\n * @deprecated Use `import { pluginTs } from '@kubb/swagger-ts'` instead\n */\nconst definePluginDefault = pluginTs\n/**\n * @deprecated Use `import { pluginTs } from '@kubb/swagger-ts'` instead\n */\nexport const definePlugin = pluginTs\n\nexport default definePluginDefault\n"]}
|