@kubb/plugin-ts 4.14.0 → 4.15.0
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/{components-HKIi69kI.js → components-BE9rQGox.js} +60 -28
- package/dist/components-BE9rQGox.js.map +1 -0
- package/dist/{components-pzX1Kb4u.cjs → components-CGcs8968.cjs} +90 -28
- package/dist/components-CGcs8968.cjs.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.cts +3 -1
- package/dist/components.d.ts +3 -1
- package/dist/components.js +1 -1
- package/dist/generators.cjs +1 -1
- package/dist/generators.d.cts +1 -1
- package/dist/generators.d.ts +1 -1
- package/dist/generators.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{plugin-DljW3znk.cjs → plugin-B96TNDf4.cjs} +174 -21
- package/dist/plugin-B96TNDf4.cjs.map +1 -0
- package/dist/{plugin-BEfry-Dm.js → plugin-DXyNbr_u.js} +173 -21
- package/dist/plugin-DXyNbr_u.js.map +1 -0
- package/dist/{types-DcA3qMIF.d.ts → types-D59kq_S_.d.ts} +27 -1
- package/dist/{types-C51mhXW0.d.cts → types-njfY0PGo.d.cts} +27 -1
- package/package.json +4 -4
- package/src/components/Type.tsx +8 -2
- package/src/factory.ts +77 -3
- package/src/generators/__snapshots__/createPet.ts +1 -1
- package/src/generators/__snapshots__/createPetWithEmptySchemaTypeUnknown.ts +1 -1
- package/src/generators/__snapshots__/createPetWithEmptySchemaTypeVoid.ts +1 -1
- package/src/generators/__snapshots__/createPetWithUnknownTypeUnknown.ts +1 -1
- package/src/generators/__snapshots__/createPetWithUnknownTypeVoid.ts +1 -1
- package/src/generators/__snapshots__/deletePet.ts +1 -1
- package/src/generators/__snapshots__/getPets.ts +1 -1
- package/src/generators/__snapshots__/showPetById.ts +1 -1
- package/src/generators/__snapshots__/systemsWithExplodeForm.ts +1 -1
- package/src/generators/typeGenerator.tsx +232 -8
- package/src/parser.ts +9 -20
- package/src/plugin.ts +4 -0
- package/src/types.ts +12 -0
- package/dist/components-HKIi69kI.js.map +0 -1
- package/dist/components-pzX1Kb4u.cjs.map +0 -1
- package/dist/plugin-BEfry-Dm.js.map +0 -1
- package/dist/plugin-DljW3znk.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as createTypeAliasDeclaration, c as createTypeReferenceNode, d as getUnknownType, f as keywordTypeNodes, i as createPropertySignature, l as createUnionDeclaration, n as createIdentifier, o as createTypeLiteralNode, p as modifiers, r as createIndexedAccessTypeNode, s as createTypeOperatorNode, t as Type, u as createUrlTemplateType } from "./components-BE9rQGox.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { definePlugin, getBarrelFiles, getMode } from "@kubb/core";
|
|
4
4
|
import transformers, { camelCase, pascalCase } from "@kubb/core/transformers";
|
|
@@ -9,6 +9,7 @@ import { createReactGenerator } from "@kubb/plugin-oas/generators";
|
|
|
9
9
|
import { useOas, useOperationManager, useSchemaManager } from "@kubb/plugin-oas/hooks";
|
|
10
10
|
import { getBanner, getFooter } from "@kubb/plugin-oas/utils";
|
|
11
11
|
import { File } from "@kubb/react-fabric";
|
|
12
|
+
import ts from "typescript";
|
|
12
13
|
import { Fragment, jsx, jsxs } from "@kubb/react-fabric/jsx-runtime";
|
|
13
14
|
|
|
14
15
|
//#region src/generators/typeGenerator.tsx
|
|
@@ -75,22 +76,145 @@ function printCombinedSchema({ name, schemas, pluginManager }) {
|
|
|
75
76
|
modifiers: [modifiers.export]
|
|
76
77
|
}));
|
|
77
78
|
}
|
|
79
|
+
function printRequestSchema({ baseName, operation, schemas, pluginManager }) {
|
|
80
|
+
const name = pluginManager.resolveName({
|
|
81
|
+
name: `${baseName} Request`,
|
|
82
|
+
pluginKey: [pluginTsName],
|
|
83
|
+
type: "type"
|
|
84
|
+
});
|
|
85
|
+
const results = [];
|
|
86
|
+
const dataRequestProperties = [];
|
|
87
|
+
if (schemas.request) {
|
|
88
|
+
const identifier = pluginManager.resolveName({
|
|
89
|
+
name: schemas.request.name,
|
|
90
|
+
pluginKey: [pluginTsName],
|
|
91
|
+
type: "type"
|
|
92
|
+
});
|
|
93
|
+
dataRequestProperties.push(createPropertySignature({
|
|
94
|
+
name: "data",
|
|
95
|
+
questionToken: true,
|
|
96
|
+
type: createTypeReferenceNode(createIdentifier(identifier), void 0)
|
|
97
|
+
}));
|
|
98
|
+
} else dataRequestProperties.push(createPropertySignature({
|
|
99
|
+
name: "data",
|
|
100
|
+
questionToken: true,
|
|
101
|
+
type: keywordTypeNodes.never
|
|
102
|
+
}));
|
|
103
|
+
if (schemas.pathParams) {
|
|
104
|
+
const identifier = pluginManager.resolveName({
|
|
105
|
+
name: schemas.pathParams.name,
|
|
106
|
+
pluginKey: [pluginTsName],
|
|
107
|
+
type: "type"
|
|
108
|
+
});
|
|
109
|
+
dataRequestProperties.push(createPropertySignature({
|
|
110
|
+
name: "pathParams",
|
|
111
|
+
type: createTypeReferenceNode(createIdentifier(identifier), void 0)
|
|
112
|
+
}));
|
|
113
|
+
} else dataRequestProperties.push(createPropertySignature({
|
|
114
|
+
name: "pathParams",
|
|
115
|
+
questionToken: true,
|
|
116
|
+
type: keywordTypeNodes.never
|
|
117
|
+
}));
|
|
118
|
+
if (schemas.queryParams) {
|
|
119
|
+
const identifier = pluginManager.resolveName({
|
|
120
|
+
name: schemas.queryParams.name,
|
|
121
|
+
pluginKey: [pluginTsName],
|
|
122
|
+
type: "type"
|
|
123
|
+
});
|
|
124
|
+
dataRequestProperties.push(createPropertySignature({
|
|
125
|
+
name: "queryParams",
|
|
126
|
+
questionToken: true,
|
|
127
|
+
type: createTypeReferenceNode(createIdentifier(identifier), void 0)
|
|
128
|
+
}));
|
|
129
|
+
} else dataRequestProperties.push(createPropertySignature({
|
|
130
|
+
name: "queryParams",
|
|
131
|
+
questionToken: true,
|
|
132
|
+
type: keywordTypeNodes.never
|
|
133
|
+
}));
|
|
134
|
+
if (schemas.headerParams) {
|
|
135
|
+
const identifier = pluginManager.resolveName({
|
|
136
|
+
name: schemas.headerParams.name,
|
|
137
|
+
pluginKey: [pluginTsName],
|
|
138
|
+
type: "type"
|
|
139
|
+
});
|
|
140
|
+
dataRequestProperties.push(createPropertySignature({
|
|
141
|
+
name: "headerParams",
|
|
142
|
+
questionToken: true,
|
|
143
|
+
type: createTypeReferenceNode(createIdentifier(identifier), void 0)
|
|
144
|
+
}));
|
|
145
|
+
} else dataRequestProperties.push(createPropertySignature({
|
|
146
|
+
name: "headerParams",
|
|
147
|
+
questionToken: true,
|
|
148
|
+
type: keywordTypeNodes.never
|
|
149
|
+
}));
|
|
150
|
+
dataRequestProperties.push(createPropertySignature({
|
|
151
|
+
name: "url",
|
|
152
|
+
type: createUrlTemplateType(operation.path)
|
|
153
|
+
}));
|
|
154
|
+
const dataRequestNode = createTypeAliasDeclaration({
|
|
155
|
+
name,
|
|
156
|
+
type: createTypeLiteralNode(dataRequestProperties),
|
|
157
|
+
modifiers: [modifiers.export]
|
|
158
|
+
});
|
|
159
|
+
results.push(safePrint(dataRequestNode));
|
|
160
|
+
return results.join("\n\n");
|
|
161
|
+
}
|
|
162
|
+
function printResponseSchema({ baseName, schemas, pluginManager, unknownType }) {
|
|
163
|
+
const results = [];
|
|
164
|
+
const name = pluginManager.resolveName({
|
|
165
|
+
name: `${baseName} ResponseData`,
|
|
166
|
+
pluginKey: [pluginTsName],
|
|
167
|
+
type: "type"
|
|
168
|
+
});
|
|
169
|
+
if (schemas.responses && schemas.responses.length > 0) {
|
|
170
|
+
const responsesProperties = schemas.responses.map((res) => {
|
|
171
|
+
const identifier = pluginManager.resolveName({
|
|
172
|
+
name: res.name,
|
|
173
|
+
pluginKey: [pluginTsName],
|
|
174
|
+
type: "type"
|
|
175
|
+
});
|
|
176
|
+
return createPropertySignature({
|
|
177
|
+
name: res.statusCode?.toString() ?? "default",
|
|
178
|
+
type: createTypeReferenceNode(createIdentifier(identifier), void 0)
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
const responsesNode = createTypeAliasDeclaration({
|
|
182
|
+
name: `${baseName}Responses`,
|
|
183
|
+
type: createTypeLiteralNode(responsesProperties),
|
|
184
|
+
modifiers: [modifiers.export]
|
|
185
|
+
});
|
|
186
|
+
results.push(safePrint(responsesNode));
|
|
187
|
+
const responseNode = createTypeAliasDeclaration({
|
|
188
|
+
name,
|
|
189
|
+
type: createIndexedAccessTypeNode(createTypeReferenceNode(createIdentifier(`${baseName}Responses`), void 0), createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, createTypeReferenceNode(createIdentifier(`${baseName}Responses`), void 0))),
|
|
190
|
+
modifiers: [modifiers.export]
|
|
191
|
+
});
|
|
192
|
+
results.push(safePrint(responseNode));
|
|
193
|
+
} else {
|
|
194
|
+
const responseNode = createTypeAliasDeclaration({
|
|
195
|
+
name,
|
|
196
|
+
modifiers: [modifiers.export],
|
|
197
|
+
type: getUnknownType(unknownType)
|
|
198
|
+
});
|
|
199
|
+
results.push(safePrint(responseNode));
|
|
200
|
+
}
|
|
201
|
+
return results.join("\n\n");
|
|
202
|
+
}
|
|
78
203
|
const typeGenerator = createReactGenerator({
|
|
79
204
|
name: "typescript",
|
|
80
205
|
Operation({ operation, generator, plugin }) {
|
|
81
|
-
const { options, options: { mapper, enumType, syntaxType, optionalType } } = plugin;
|
|
206
|
+
const { options, options: { mapper, enumType, syntaxType, optionalType, arrayType, unknownType } } = plugin;
|
|
82
207
|
const mode = useMode();
|
|
83
208
|
const pluginManager = usePluginManager();
|
|
84
209
|
const oas = useOas();
|
|
85
210
|
const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator);
|
|
86
211
|
const schemaManager = useSchemaManager();
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
const type = getName(operation, {
|
|
90
|
-
type: "function",
|
|
212
|
+
const name = getName(operation, {
|
|
213
|
+
type: "type",
|
|
91
214
|
pluginKey: [pluginTsName]
|
|
92
215
|
});
|
|
93
|
-
const
|
|
216
|
+
const file = getFile(operation);
|
|
217
|
+
const schemas = getSchemas(operation);
|
|
94
218
|
const schemaGenerator = new SchemaGenerator(options, {
|
|
95
219
|
fabric: generator.context.fabric,
|
|
96
220
|
oas,
|
|
@@ -108,18 +232,18 @@ const typeGenerator = createReactGenerator({
|
|
|
108
232
|
schemas.request,
|
|
109
233
|
schemas.response
|
|
110
234
|
].flat().filter(Boolean);
|
|
111
|
-
const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options$1 }) => {
|
|
235
|
+
const mapOperationSchema = ({ name: name$1, schema, description, keysToOmit, ...options$1 }) => {
|
|
112
236
|
const tree = schemaGenerator.parse({
|
|
113
237
|
schema,
|
|
114
|
-
name,
|
|
238
|
+
name: name$1,
|
|
115
239
|
parentName: null
|
|
116
240
|
});
|
|
117
241
|
const imports = schemaManager.getImports(tree);
|
|
118
242
|
const group = options$1.operation ? getGroup(options$1.operation) : void 0;
|
|
119
|
-
const type
|
|
120
|
-
name: schemaManager.getName(name, { type: "type" }),
|
|
121
|
-
typedName: schemaManager.getName(name, { type: "type" }),
|
|
122
|
-
file: schemaManager.getFile(options$1.operationName || name, { group })
|
|
243
|
+
const type = {
|
|
244
|
+
name: schemaManager.getName(name$1, { type: "type" }),
|
|
245
|
+
typedName: schemaManager.getName(name$1, { type: "type" }),
|
|
246
|
+
file: schemaManager.getFile(options$1.operationName || name$1, { group })
|
|
123
247
|
};
|
|
124
248
|
return /* @__PURE__ */ jsxs(Fragment, { children: [mode === "split" && imports.map((imp) => /* @__PURE__ */ jsx(File.Import, {
|
|
125
249
|
root: file.path,
|
|
@@ -127,23 +251,26 @@ const typeGenerator = createReactGenerator({
|
|
|
127
251
|
name: imp.name,
|
|
128
252
|
isTypeOnly: true
|
|
129
253
|
}, [
|
|
130
|
-
name,
|
|
254
|
+
name$1,
|
|
131
255
|
imp.name,
|
|
132
256
|
imp.path,
|
|
133
257
|
imp.isTypeOnly
|
|
134
258
|
].join("-"))), /* @__PURE__ */ jsx(Type, {
|
|
135
|
-
name: type
|
|
136
|
-
typedName: type
|
|
259
|
+
name: type.name,
|
|
260
|
+
typedName: type.typedName,
|
|
137
261
|
description,
|
|
138
262
|
tree,
|
|
139
263
|
schema,
|
|
140
264
|
mapper,
|
|
141
265
|
enumType,
|
|
142
266
|
optionalType,
|
|
267
|
+
arrayType,
|
|
143
268
|
keysToOmit,
|
|
144
269
|
syntaxType
|
|
145
270
|
})] });
|
|
146
271
|
};
|
|
272
|
+
const responseName = schemaManager.getName(schemas.response.name, { type: "type" });
|
|
273
|
+
const combinedSchemaName = operation.method === "get" ? `${name}Query` : `${name}Mutation`;
|
|
147
274
|
return /* @__PURE__ */ jsxs(File, {
|
|
148
275
|
baseName: file.baseName,
|
|
149
276
|
path: file.path,
|
|
@@ -157,7 +284,29 @@ const typeGenerator = createReactGenerator({
|
|
|
157
284
|
oas,
|
|
158
285
|
output: plugin.options.output
|
|
159
286
|
}),
|
|
160
|
-
children: [operationSchemas.map(mapOperationSchema), /* @__PURE__ */ jsx(File.Source, {
|
|
287
|
+
children: [operationSchemas.map(mapOperationSchema), generator.context.UNSTABLE_NAMING ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(File.Source, {
|
|
288
|
+
name: `${name}Request`,
|
|
289
|
+
isExportable: true,
|
|
290
|
+
isIndexable: true,
|
|
291
|
+
isTypeOnly: true,
|
|
292
|
+
children: printRequestSchema({
|
|
293
|
+
baseName: name,
|
|
294
|
+
operation,
|
|
295
|
+
schemas,
|
|
296
|
+
pluginManager
|
|
297
|
+
})
|
|
298
|
+
}), /* @__PURE__ */ jsx(File.Source, {
|
|
299
|
+
name: responseName,
|
|
300
|
+
isExportable: true,
|
|
301
|
+
isIndexable: true,
|
|
302
|
+
isTypeOnly: true,
|
|
303
|
+
children: printResponseSchema({
|
|
304
|
+
baseName: name,
|
|
305
|
+
schemas,
|
|
306
|
+
pluginManager,
|
|
307
|
+
unknownType
|
|
308
|
+
})
|
|
309
|
+
})] }) : /* @__PURE__ */ jsx(File.Source, {
|
|
161
310
|
name: combinedSchemaName,
|
|
162
311
|
isExportable: true,
|
|
163
312
|
isIndexable: true,
|
|
@@ -171,7 +320,7 @@ const typeGenerator = createReactGenerator({
|
|
|
171
320
|
});
|
|
172
321
|
},
|
|
173
322
|
Schema({ schema, plugin }) {
|
|
174
|
-
const { options: { mapper, enumType, syntaxType, optionalType, output } } = plugin;
|
|
323
|
+
const { options: { mapper, enumType, syntaxType, optionalType, arrayType, output } } = plugin;
|
|
175
324
|
const mode = useMode();
|
|
176
325
|
const oas = useOas();
|
|
177
326
|
const pluginManager = usePluginManager();
|
|
@@ -216,6 +365,7 @@ const typeGenerator = createReactGenerator({
|
|
|
216
365
|
mapper,
|
|
217
366
|
enumType,
|
|
218
367
|
optionalType,
|
|
368
|
+
arrayType,
|
|
219
369
|
syntaxType
|
|
220
370
|
})]
|
|
221
371
|
});
|
|
@@ -229,7 +379,7 @@ const pluginTs = definePlugin((options) => {
|
|
|
229
379
|
const { output = {
|
|
230
380
|
path: "types",
|
|
231
381
|
barrelType: "named"
|
|
232
|
-
}, group, exclude = [], include, override = [], enumType = "asConst", enumSuffix = "enum", dateType = "string", unknownType = "any", optionalType = "questionToken", emptySchemaType = unknownType, syntaxType = "type", transformers: transformers$1 = {}, mapper = {}, generators = [typeGenerator].filter(Boolean), contentType } = options;
|
|
382
|
+
}, group, exclude = [], include, override = [], enumType = "asConst", enumSuffix = "enum", dateType = "string", unknownType = "any", optionalType = "questionToken", arrayType = "array", emptySchemaType = unknownType, syntaxType = "type", transformers: transformers$1 = {}, mapper = {}, generators = [typeGenerator].filter(Boolean), contentType, UNSTABLE_NAMING } = options;
|
|
233
383
|
return {
|
|
234
384
|
name: pluginTsName,
|
|
235
385
|
options: {
|
|
@@ -237,6 +387,7 @@ const pluginTs = definePlugin((options) => {
|
|
|
237
387
|
transformers: transformers$1,
|
|
238
388
|
dateType,
|
|
239
389
|
optionalType,
|
|
390
|
+
arrayType,
|
|
240
391
|
enumType,
|
|
241
392
|
enumSuffix,
|
|
242
393
|
unknownType,
|
|
@@ -297,7 +448,8 @@ const pluginTs = definePlugin((options) => {
|
|
|
297
448
|
exclude,
|
|
298
449
|
include,
|
|
299
450
|
override,
|
|
300
|
-
mode
|
|
451
|
+
mode,
|
|
452
|
+
UNSTABLE_NAMING
|
|
301
453
|
}).build(...generators);
|
|
302
454
|
await this.upsertFile(...operationFiles);
|
|
303
455
|
const barrelFiles = await getBarrelFiles(this.fabric.files, {
|
|
@@ -313,4 +465,4 @@ const pluginTs = definePlugin((options) => {
|
|
|
313
465
|
|
|
314
466
|
//#endregion
|
|
315
467
|
export { pluginTsName as n, typeGenerator as r, pluginTs as t };
|
|
316
|
-
//# sourceMappingURL=plugin-
|
|
468
|
+
//# sourceMappingURL=plugin-DXyNbr_u.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-DXyNbr_u.js","names":["properties: Record<string, ts.TypeNode>","factory.createUnionDeclaration","factory.createTypeReferenceNode","factory.createIdentifier","factory.createTypeAliasDeclaration","factory.createTypeLiteralNode","factory.createPropertySignature","results: string[]","dataRequestProperties: ts.PropertySignature[]","responsesProperties: ts.PropertySignature[]","factory.createIndexedAccessTypeNode","factory.createTypeOperatorNode","options","name","options","groupName: Group['name']","transformers"],"sources":["../src/generators/typeGenerator.tsx","../src/plugin.ts"],"sourcesContent":["import type { PluginManager } from '@kubb/core'\nimport { useMode, usePluginManager } from '@kubb/core/hooks'\nimport transformers from '@kubb/core/transformers'\nimport { safePrint } from '@kubb/fabric-core/parsers/typescript'\nimport type { Operation } from '@kubb/oas'\nimport { isKeyword, type OperationSchemas, type OperationSchema as OperationSchemaType, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'\nimport { createReactGenerator } from '@kubb/plugin-oas/generators'\nimport { useOas, useOperationManager, useSchemaManager } from '@kubb/plugin-oas/hooks'\nimport { getBanner, getFooter } from '@kubb/plugin-oas/utils'\nimport { File } from '@kubb/react-fabric'\nimport ts from 'typescript'\nimport { Type } from '../components'\nimport * as factory from '../factory.ts'\nimport { createUrlTemplateType, getUnknownType, keywordTypeNodes } from '../factory.ts'\nimport { pluginTsName } from '../plugin.ts'\nimport type { PluginTs } from '../types'\n\nfunction printCombinedSchema({ name, schemas, pluginManager }: { name: string; schemas: OperationSchemas; pluginManager: PluginManager }): string {\n const properties: Record<string, ts.TypeNode> = {}\n\n if (schemas.response) {\n properties['response'] = factory.createUnionDeclaration({\n nodes: schemas.responses.map((res) => {\n const identifier = pluginManager.resolveName({\n name: res.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n\n return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }),\n })!\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,\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 safePrint(namespaceNode)\n}\n\nfunction printRequestSchema({\n baseName,\n operation,\n schemas,\n pluginManager,\n}: {\n baseName: string\n operation: Operation\n schemas: OperationSchemas\n pluginManager: PluginManager\n}): string {\n const name = pluginManager.resolveName({\n name: `${baseName} Request`,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n const results: string[] = []\n\n // Generate DataRequest type\n const dataRequestProperties: ts.PropertySignature[] = []\n\n if (schemas.request) {\n const identifier = pluginManager.resolveName({\n name: schemas.request.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'data',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'data',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add pathParams property\n if (schemas.pathParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.pathParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'pathParams',\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'pathParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add queryParams property\n if (schemas.queryParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.queryParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'queryParams',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'queryParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add headerParams property\n if (schemas.headerParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.headerParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'headerParams',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'headerParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add url property with template literal type\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'url',\n type: createUrlTemplateType(operation.path),\n }),\n )\n\n const dataRequestNode = factory.createTypeAliasDeclaration({\n name,\n type: factory.createTypeLiteralNode(dataRequestProperties),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(dataRequestNode))\n\n return results.join('\\n\\n')\n}\n\nfunction printResponseSchema({\n baseName,\n schemas,\n pluginManager,\n unknownType,\n}: {\n baseName: string\n schemas: OperationSchemas\n pluginManager: PluginManager\n unknownType: PluginTs['resolvedOptions']['unknownType']\n}): string {\n const results: string[] = []\n\n const name = pluginManager.resolveName({\n name: `${baseName} ResponseData`,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n // Generate Responses type (mapping status codes to response types)\n if (schemas.responses && schemas.responses.length > 0) {\n const responsesProperties: ts.PropertySignature[] = schemas.responses.map((res) => {\n const identifier = pluginManager.resolveName({\n name: res.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n return factory.createPropertySignature({\n name: res.statusCode?.toString() ?? 'default',\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n })\n })\n\n const responsesNode = factory.createTypeAliasDeclaration({\n name: `${baseName}Responses`,\n type: factory.createTypeLiteralNode(responsesProperties),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(responsesNode))\n\n // Generate Response type (union via indexed access)\n const responseNode = factory.createTypeAliasDeclaration({\n name,\n type: factory.createIndexedAccessTypeNode(\n factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),\n factory.createTypeOperatorNode(\n ts.SyntaxKind.KeyOfKeyword,\n factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),\n ),\n ),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(responseNode))\n } else {\n const responseNode = factory.createTypeAliasDeclaration({\n name,\n modifiers: [factory.modifiers.export],\n type: getUnknownType(unknownType),\n })\n\n results.push(safePrint(responseNode))\n }\n\n return results.join('\\n\\n')\n}\n\nexport const typeGenerator = createReactGenerator<PluginTs>({\n name: 'typescript',\n Operation({ operation, generator, plugin }) {\n const {\n options,\n options: { mapper, enumType, syntaxType, optionalType, arrayType, unknownType },\n } = plugin\n\n const mode = useMode()\n const pluginManager = usePluginManager()\n\n const oas = useOas()\n const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator)\n const schemaManager = useSchemaManager()\n\n const name = getName(operation, { type: 'type', pluginKey: [pluginTsName] })\n\n const file = getFile(operation)\n const schemas = getSchemas(operation)\n const schemaGenerator = new SchemaGenerator(options, {\n fabric: generator.context.fabric,\n oas,\n events: generator.context.events,\n plugin,\n pluginManager,\n mode,\n override: options.override,\n })\n\n const operationSchemas = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response]\n .flat()\n .filter(Boolean)\n\n const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options }: OperationSchemaType) => {\n const tree = schemaGenerator.parse({ schema, name, parentName: null })\n const imports = schemaManager.getImports(tree)\n const group = options.operation ? getGroup(options.operation) : undefined\n\n const type = {\n name: schemaManager.getName(name, { type: 'type' }),\n typedName: schemaManager.getName(name, { type: 'type' }),\n file: schemaManager.getFile(options.operationName || name, { group }),\n }\n\n return (\n <>\n {mode === 'split' &&\n imports.map((imp) => (\n <File.Import key={[name, imp.name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />\n ))}\n <Type\n name={type.name}\n typedName={type.typedName}\n description={description}\n tree={tree}\n schema={schema}\n mapper={mapper}\n enumType={enumType}\n optionalType={optionalType}\n arrayType={arrayType}\n keysToOmit={keysToOmit}\n syntaxType={syntaxType}\n />\n </>\n )\n }\n\n const responseName = schemaManager.getName(schemas.response.name, {\n type: 'type',\n })\n const combinedSchemaName = operation.method === 'get' ? `${name}Query` : `${name}Mutation`\n\n return (\n <File\n baseName={file.baseName}\n path={file.path}\n meta={file.meta}\n banner={getBanner({ oas, output: plugin.options.output, config: pluginManager.config })}\n footer={getFooter({ oas, output: plugin.options.output })}\n >\n {operationSchemas.map(mapOperationSchema)}\n\n {generator.context.UNSTABLE_NAMING ? (\n <>\n <File.Source name={`${name}Request`} isExportable isIndexable isTypeOnly>\n {printRequestSchema({ baseName: name, operation, schemas, pluginManager })}\n </File.Source>\n <File.Source name={responseName} isExportable isIndexable isTypeOnly>\n {printResponseSchema({ baseName: name, schemas, pluginManager, unknownType })}\n </File.Source>\n </>\n ) : (\n <File.Source name={combinedSchemaName} isExportable isIndexable isTypeOnly>\n {printCombinedSchema({ name: combinedSchemaName, schemas, pluginManager })}\n </File.Source>\n )}\n </File>\n )\n },\n Schema({ schema, plugin }) {\n const {\n options: { mapper, enumType, syntaxType, optionalType, arrayType, output },\n } = plugin\n const mode = useMode()\n\n const oas = useOas()\n const pluginManager = usePluginManager()\n\n const { getName, getImports, getFile } = useSchemaManager()\n const imports = getImports(schema.tree)\n const schemaFromTree = schema.tree.find((item) => item.keyword === schemaKeywords.schema)\n\n let typedName = getName(schema.name, { type: 'type' })\n\n if (enumType === 'asConst' && schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.enum)) {\n typedName = typedName += 'Key' //Suffix for avoiding collisions (https://github.com/kubb-labs/kubb/issues/1873)\n }\n\n const type = {\n name: getName(schema.name, { type: 'function' }),\n typedName,\n file: getFile(schema.name),\n }\n\n return (\n <File\n baseName={type.file.baseName}\n path={type.file.path}\n meta={type.file.meta}\n banner={getBanner({ oas, output, config: pluginManager.config })}\n footer={getFooter({ oas, output })}\n >\n {mode === 'split' &&\n imports.map((imp) => (\n <File.Import key={[schema.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />\n ))}\n <Type\n name={type.name}\n typedName={type.typedName}\n description={schema.value.description}\n tree={schema.tree}\n schema={schema.value}\n mapper={mapper}\n enumType={enumType}\n optionalType={optionalType}\n arrayType={arrayType}\n syntaxType={syntaxType}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { definePlugin, type Group, getBarrelFiles, getMode } from '@kubb/core'\nimport { camelCase, pascalCase } from '@kubb/core/transformers'\nimport { OperationGenerator, pluginOasName, SchemaGenerator } from '@kubb/plugin-oas'\nimport { typeGenerator } from './generators'\nimport type { PluginTs } from './types.ts'\n\nexport const pluginTsName = 'plugin-ts' satisfies PluginTs['name']\n\nexport const pluginTs = definePlugin<PluginTs>((options) => {\n const {\n output = { path: 'types', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n enumType = 'asConst',\n enumSuffix = 'enum',\n dateType = 'string',\n unknownType = 'any',\n optionalType = 'questionToken',\n arrayType = 'array',\n emptySchemaType = unknownType,\n syntaxType = 'type',\n transformers = {},\n mapper = {},\n generators = [typeGenerator].filter(Boolean),\n contentType,\n UNSTABLE_NAMING,\n } = options\n\n const usedEnumNames = {}\n\n return {\n name: pluginTsName,\n options: {\n output,\n transformers,\n dateType,\n optionalType,\n arrayType,\n enumType,\n enumSuffix,\n unknownType,\n emptySchemaType,\n syntaxType,\n group,\n override,\n mapper,\n usedEnumNames,\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 ?? 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 (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: Group['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\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 install() {\n const root = path.resolve(this.config.root, this.config.output.path)\n const mode = getMode(path.resolve(root, output.path))\n const oas = await this.getOas()\n\n const schemaGenerator = new SchemaGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n pluginManager: this.pluginManager,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override,\n mode,\n output: output.path,\n })\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n pluginManager: this.pluginManager,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude,\n include,\n override,\n mode,\n UNSTABLE_NAMING,\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n await this.upsertFile(...operationFiles)\n\n const barrelFiles = await getBarrelFiles(this.fabric.files, {\n type: output.barrelType ?? 'named',\n root,\n output,\n meta: {\n pluginKey: this.plugin.key,\n },\n })\n\n await this.upsertFile(...barrelFiles)\n },\n }\n})\n"],"mappings":"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"}
|
|
@@ -392,6 +392,13 @@ type Config<TInput = Input> = {
|
|
|
392
392
|
* @default 'simple'
|
|
393
393
|
*/
|
|
394
394
|
defaultBanner?: 'simple' | 'full' | false;
|
|
395
|
+
/**
|
|
396
|
+
* Whether to override existing external files if they already exist.
|
|
397
|
+
* When setting the option in the global configuration, all plugins inherit the same behavior by default.
|
|
398
|
+
* However, all plugins also have an `output.override` option, which can be used to override the behavior for a specific plugin.
|
|
399
|
+
* @default false
|
|
400
|
+
*/
|
|
401
|
+
override?: boolean;
|
|
395
402
|
};
|
|
396
403
|
/**
|
|
397
404
|
* An array of Kubb plugins that will be used in the generation.
|
|
@@ -579,6 +586,11 @@ type Output<TOptions> = {
|
|
|
579
586
|
* Add a footer text in the beginning of every file
|
|
580
587
|
*/
|
|
581
588
|
footer?: string | ((options: TOptions) => string);
|
|
589
|
+
/**
|
|
590
|
+
* Whether to override existing external files if they already exist.
|
|
591
|
+
* @default false
|
|
592
|
+
*/
|
|
593
|
+
override?: boolean;
|
|
582
594
|
};
|
|
583
595
|
type GroupContext = {
|
|
584
596
|
group: string;
|
|
@@ -828,9 +840,11 @@ type Context$1<TOptions, TPluginOptions extends PluginFactoryOptions> = {
|
|
|
828
840
|
*/
|
|
829
841
|
plugin: Plugin<TPluginOptions>;
|
|
830
842
|
mode: KubbFile.Mode;
|
|
843
|
+
UNSTABLE_NAMING?: true;
|
|
831
844
|
};
|
|
832
845
|
declare class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> extends BaseGenerator<TPluginOptions['resolvedOptions'], Context$1<TPluginOptions['resolvedOptions'], TPluginOptions>> {
|
|
833
846
|
#private;
|
|
847
|
+
getOptions(operation: Operation$1, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']>;
|
|
834
848
|
getSchemas(operation: Operation$1, {
|
|
835
849
|
resolveName
|
|
836
850
|
}?: {
|
|
@@ -1236,6 +1250,13 @@ type Options = {
|
|
|
1236
1250
|
* @default 'questionToken'
|
|
1237
1251
|
*/
|
|
1238
1252
|
optionalType?: 'questionToken' | 'undefined' | 'questionTokenAndUndefined';
|
|
1253
|
+
/**
|
|
1254
|
+
* Choose between `Array<string>` or `string[]` for array types.
|
|
1255
|
+
* - `generic`: Array<Type>
|
|
1256
|
+
* - `array`: Type[]
|
|
1257
|
+
* @default 'array'
|
|
1258
|
+
*/
|
|
1259
|
+
arrayType?: 'generic' | 'array';
|
|
1239
1260
|
transformers?: {
|
|
1240
1261
|
/**
|
|
1241
1262
|
* Customize the names based on the type that is provided by the plugin.
|
|
@@ -1257,6 +1278,10 @@ type Options = {
|
|
|
1257
1278
|
* Define some generators next to the ts generators
|
|
1258
1279
|
*/
|
|
1259
1280
|
generators?: Array<Generator<PluginTs>>;
|
|
1281
|
+
/**
|
|
1282
|
+
* Unstable naming for v5
|
|
1283
|
+
*/
|
|
1284
|
+
UNSTABLE_NAMING?: true;
|
|
1260
1285
|
};
|
|
1261
1286
|
type ResolvedOptions = {
|
|
1262
1287
|
output: Output<Oas>;
|
|
@@ -1268,6 +1293,7 @@ type ResolvedOptions = {
|
|
|
1268
1293
|
unknownType: NonNullable<Options['unknownType']>;
|
|
1269
1294
|
emptySchemaType: NonNullable<Options['emptySchemaType']>;
|
|
1270
1295
|
optionalType: NonNullable<Options['optionalType']>;
|
|
1296
|
+
arrayType: NonNullable<Options['arrayType']>;
|
|
1271
1297
|
transformers: NonNullable<Options['transformers']>;
|
|
1272
1298
|
syntaxType: NonNullable<Options['syntaxType']>;
|
|
1273
1299
|
mapper: Record<string, any>;
|
|
@@ -1275,4 +1301,4 @@ type ResolvedOptions = {
|
|
|
1275
1301
|
type PluginTs = PluginFactoryOptions<'plugin-ts', Options, ResolvedOptions, never, ResolvePathOptions>;
|
|
1276
1302
|
//#endregion
|
|
1277
1303
|
export { UserPluginWithLifeCycle as a, Schema as i, PluginTs as n, SchemaObject$1 as o, ReactGenerator as r, Options as t };
|
|
1278
|
-
//# sourceMappingURL=types-
|
|
1304
|
+
//# sourceMappingURL=types-D59kq_S_.d.ts.map
|
|
@@ -392,6 +392,13 @@ type Config<TInput = Input> = {
|
|
|
392
392
|
* @default 'simple'
|
|
393
393
|
*/
|
|
394
394
|
defaultBanner?: 'simple' | 'full' | false;
|
|
395
|
+
/**
|
|
396
|
+
* Whether to override existing external files if they already exist.
|
|
397
|
+
* When setting the option in the global configuration, all plugins inherit the same behavior by default.
|
|
398
|
+
* However, all plugins also have an `output.override` option, which can be used to override the behavior for a specific plugin.
|
|
399
|
+
* @default false
|
|
400
|
+
*/
|
|
401
|
+
override?: boolean;
|
|
395
402
|
};
|
|
396
403
|
/**
|
|
397
404
|
* An array of Kubb plugins that will be used in the generation.
|
|
@@ -579,6 +586,11 @@ type Output<TOptions> = {
|
|
|
579
586
|
* Add a footer text in the beginning of every file
|
|
580
587
|
*/
|
|
581
588
|
footer?: string | ((options: TOptions) => string);
|
|
589
|
+
/**
|
|
590
|
+
* Whether to override existing external files if they already exist.
|
|
591
|
+
* @default false
|
|
592
|
+
*/
|
|
593
|
+
override?: boolean;
|
|
582
594
|
};
|
|
583
595
|
type GroupContext = {
|
|
584
596
|
group: string;
|
|
@@ -828,9 +840,11 @@ type Context$1<TOptions, TPluginOptions extends PluginFactoryOptions> = {
|
|
|
828
840
|
*/
|
|
829
841
|
plugin: Plugin<TPluginOptions>;
|
|
830
842
|
mode: KubbFile.Mode;
|
|
843
|
+
UNSTABLE_NAMING?: true;
|
|
831
844
|
};
|
|
832
845
|
declare class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> extends BaseGenerator<TPluginOptions['resolvedOptions'], Context$1<TPluginOptions['resolvedOptions'], TPluginOptions>> {
|
|
833
846
|
#private;
|
|
847
|
+
getOptions(operation: Operation$1, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']>;
|
|
834
848
|
getSchemas(operation: Operation$1, {
|
|
835
849
|
resolveName
|
|
836
850
|
}?: {
|
|
@@ -1236,6 +1250,13 @@ type Options = {
|
|
|
1236
1250
|
* @default 'questionToken'
|
|
1237
1251
|
*/
|
|
1238
1252
|
optionalType?: 'questionToken' | 'undefined' | 'questionTokenAndUndefined';
|
|
1253
|
+
/**
|
|
1254
|
+
* Choose between `Array<string>` or `string[]` for array types.
|
|
1255
|
+
* - `generic`: Array<Type>
|
|
1256
|
+
* - `array`: Type[]
|
|
1257
|
+
* @default 'array'
|
|
1258
|
+
*/
|
|
1259
|
+
arrayType?: 'generic' | 'array';
|
|
1239
1260
|
transformers?: {
|
|
1240
1261
|
/**
|
|
1241
1262
|
* Customize the names based on the type that is provided by the plugin.
|
|
@@ -1257,6 +1278,10 @@ type Options = {
|
|
|
1257
1278
|
* Define some generators next to the ts generators
|
|
1258
1279
|
*/
|
|
1259
1280
|
generators?: Array<Generator<PluginTs>>;
|
|
1281
|
+
/**
|
|
1282
|
+
* Unstable naming for v5
|
|
1283
|
+
*/
|
|
1284
|
+
UNSTABLE_NAMING?: true;
|
|
1260
1285
|
};
|
|
1261
1286
|
type ResolvedOptions = {
|
|
1262
1287
|
output: Output<Oas>;
|
|
@@ -1268,6 +1293,7 @@ type ResolvedOptions = {
|
|
|
1268
1293
|
unknownType: NonNullable<Options['unknownType']>;
|
|
1269
1294
|
emptySchemaType: NonNullable<Options['emptySchemaType']>;
|
|
1270
1295
|
optionalType: NonNullable<Options['optionalType']>;
|
|
1296
|
+
arrayType: NonNullable<Options['arrayType']>;
|
|
1271
1297
|
transformers: NonNullable<Options['transformers']>;
|
|
1272
1298
|
syntaxType: NonNullable<Options['syntaxType']>;
|
|
1273
1299
|
mapper: Record<string, any>;
|
|
@@ -1275,4 +1301,4 @@ type ResolvedOptions = {
|
|
|
1275
1301
|
type PluginTs = PluginFactoryOptions<'plugin-ts', Options, ResolvedOptions, never, ResolvePathOptions>;
|
|
1276
1302
|
//#endregion
|
|
1277
1303
|
export { UserPluginWithLifeCycle as a, Schema as i, PluginTs as n, SchemaObject$1 as o, ReactGenerator as r, Options as t };
|
|
1278
|
-
//# sourceMappingURL=types-
|
|
1304
|
+
//# sourceMappingURL=types-njfY0PGo.d.cts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/plugin-ts",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.15.0",
|
|
4
4
|
"description": "TypeScript code generation plugin for Kubb, transforming OpenAPI schemas into TypeScript interfaces, types, and utility functions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
"natural-orderby": "^5.0.0",
|
|
70
70
|
"remeda": "^2.33.1",
|
|
71
71
|
"typescript": "5.9.3",
|
|
72
|
-
"@kubb/core": "4.
|
|
73
|
-
"@kubb/oas": "4.
|
|
74
|
-
"@kubb/plugin-oas": "4.
|
|
72
|
+
"@kubb/core": "4.15.0",
|
|
73
|
+
"@kubb/oas": "4.15.0",
|
|
74
|
+
"@kubb/plugin-oas": "4.15.0"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
77
|
"@kubb/react-fabric": "0.9.2",
|
package/src/components/Type.tsx
CHANGED
|
@@ -15,6 +15,7 @@ type Props = {
|
|
|
15
15
|
schema: SchemaObject
|
|
16
16
|
tree: Array<Schema>
|
|
17
17
|
optionalType: PluginTs['resolvedOptions']['optionalType']
|
|
18
|
+
arrayType: PluginTs['resolvedOptions']['arrayType']
|
|
18
19
|
enumType: PluginTs['resolvedOptions']['enumType']
|
|
19
20
|
mapper: PluginTs['resolvedOptions']['mapper']
|
|
20
21
|
syntaxType: PluginTs['resolvedOptions']['syntaxType']
|
|
@@ -22,7 +23,7 @@ type Props = {
|
|
|
22
23
|
keysToOmit?: string[]
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
export function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxType, enumType, mapper, description }: Props): KubbNode {
|
|
26
|
+
export function Type({ name, typedName, tree, keysToOmit, schema, optionalType, arrayType, syntaxType, enumType, mapper, description }: Props): KubbNode {
|
|
26
27
|
const typeNodes: ts.Node[] = []
|
|
27
28
|
|
|
28
29
|
if (!tree.length) {
|
|
@@ -39,6 +40,7 @@ export function Type({ name, typedName, tree, keysToOmit, schema, optionalType,
|
|
|
39
40
|
{ name, schema, parent: undefined, current, siblings },
|
|
40
41
|
{
|
|
41
42
|
optionalType,
|
|
43
|
+
arrayType,
|
|
42
44
|
enumType,
|
|
43
45
|
mapper,
|
|
44
46
|
},
|
|
@@ -59,7 +61,11 @@ export function Type({ name, typedName, tree, keysToOmit, schema, optionalType,
|
|
|
59
61
|
type = factory.createTypeReferenceNode(typeNameWithKey)
|
|
60
62
|
|
|
61
63
|
if (schema.type === 'array') {
|
|
62
|
-
|
|
64
|
+
if (arrayType === 'generic') {
|
|
65
|
+
type = factory.createTypeReferenceNode(factory.createIdentifier('Array'), [type])
|
|
66
|
+
} else {
|
|
67
|
+
type = factory.createArrayTypeNode(type)
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
}
|