@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
|
@@ -2,9 +2,9 @@ import transformers from "@kubb/core/transformers";
|
|
|
2
2
|
import { SchemaGenerator, createParser, isKeyword, schemaKeywords } from "@kubb/plugin-oas";
|
|
3
3
|
import { safePrint } from "@kubb/fabric-core/parsers/typescript";
|
|
4
4
|
import { File } from "@kubb/react-fabric";
|
|
5
|
+
import ts from "typescript";
|
|
5
6
|
import "natural-orderby";
|
|
6
7
|
import { isNumber } from "remeda";
|
|
7
|
-
import ts from "typescript";
|
|
8
8
|
import { Fragment, jsx, jsxs } from "@kubb/react-fabric/jsx-runtime";
|
|
9
9
|
|
|
10
10
|
//#region src/factory.ts
|
|
@@ -16,6 +16,11 @@ const modifiers = {
|
|
|
16
16
|
static: factory.createModifier(ts.SyntaxKind.StaticKeyword)
|
|
17
17
|
};
|
|
18
18
|
const syntaxKind = { union: SyntaxKind.UnionType };
|
|
19
|
+
function getUnknownType(unknownType) {
|
|
20
|
+
if (unknownType === "any") return keywordTypeNodes.any;
|
|
21
|
+
if (unknownType === "void") return keywordTypeNodes.void;
|
|
22
|
+
return keywordTypeNodes.unknown;
|
|
23
|
+
}
|
|
19
24
|
function isValidIdentifier(str) {
|
|
20
25
|
if (!str.length || str.trim() !== str) return false;
|
|
21
26
|
const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest);
|
|
@@ -38,10 +43,17 @@ function createIntersectionDeclaration({ nodes, withParentheses }) {
|
|
|
38
43
|
if (withParentheses) return factory.createParenthesizedType(node);
|
|
39
44
|
return node;
|
|
40
45
|
}
|
|
41
|
-
function createArrayDeclaration({ nodes }) {
|
|
46
|
+
function createArrayDeclaration({ nodes, arrayType = "array" }) {
|
|
42
47
|
if (!nodes.length) return factory.createTupleTypeNode([]);
|
|
43
|
-
if (nodes.length === 1)
|
|
44
|
-
|
|
48
|
+
if (nodes.length === 1) {
|
|
49
|
+
const node = nodes[0];
|
|
50
|
+
if (!node) return null;
|
|
51
|
+
if (arrayType === "generic") return factory.createTypeReferenceNode(factory.createIdentifier("Array"), [node]);
|
|
52
|
+
return factory.createArrayTypeNode(node);
|
|
53
|
+
}
|
|
54
|
+
const unionType = factory.createUnionTypeNode(nodes);
|
|
55
|
+
if (arrayType === "generic") return factory.createTypeReferenceNode(factory.createIdentifier("Array"), [unionType]);
|
|
56
|
+
return factory.createArrayTypeNode(factory.createParenthesizedType(unionType));
|
|
45
57
|
}
|
|
46
58
|
/**
|
|
47
59
|
* Minimum nodes length of 2
|
|
@@ -139,13 +151,40 @@ const keywordTypeNodes = {
|
|
|
139
151
|
string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
|
140
152
|
boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),
|
|
141
153
|
undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),
|
|
142
|
-
null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword))
|
|
154
|
+
null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),
|
|
155
|
+
never: factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword)
|
|
143
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* Converts a path like '/pet/{petId}/uploadImage' to a template literal type
|
|
159
|
+
* like `/pet/${string}/uploadImage`
|
|
160
|
+
*/
|
|
161
|
+
function createUrlTemplateType(path) {
|
|
162
|
+
if (!path.includes("{")) return factory.createLiteralTypeNode(factory.createStringLiteral(path));
|
|
163
|
+
const segments = path.split(/(\{[^}]+\})/);
|
|
164
|
+
const parts = [];
|
|
165
|
+
const parameterIndices = [];
|
|
166
|
+
segments.forEach((segment) => {
|
|
167
|
+
if (segment.startsWith("{") && segment.endsWith("}")) {
|
|
168
|
+
parameterIndices.push(parts.length);
|
|
169
|
+
parts.push(segment);
|
|
170
|
+
} else if (segment) parts.push(segment);
|
|
171
|
+
});
|
|
172
|
+
const head = ts.factory.createTemplateHead(parts[0] || "");
|
|
173
|
+
const templateSpans = [];
|
|
174
|
+
parameterIndices.forEach((paramIndex, i) => {
|
|
175
|
+
const isLast = i === parameterIndices.length - 1;
|
|
176
|
+
const nextPart = parts[paramIndex + 1] || "";
|
|
177
|
+
const literal = isLast ? ts.factory.createTemplateTail(nextPart) : ts.factory.createTemplateMiddle(nextPart);
|
|
178
|
+
templateSpans.push(ts.factory.createTemplateLiteralTypeSpan(keywordTypeNodes.string, literal));
|
|
179
|
+
});
|
|
180
|
+
return ts.factory.createTemplateLiteralType(head, templateSpans);
|
|
181
|
+
}
|
|
144
182
|
const createTypeLiteralNode = factory.createTypeLiteralNode;
|
|
145
183
|
const createTypeReferenceNode = factory.createTypeReferenceNode;
|
|
146
184
|
const createNumericLiteral = factory.createNumericLiteral;
|
|
147
185
|
const createStringLiteral = factory.createStringLiteral;
|
|
148
186
|
const createArrayTypeNode = factory.createArrayTypeNode;
|
|
187
|
+
const createParenthesizedType = factory.createParenthesizedType;
|
|
149
188
|
const createLiteralTypeNode = factory.createLiteralTypeNode;
|
|
150
189
|
const createNull = factory.createNull;
|
|
151
190
|
const createIdentifier = factory.createIdentifier;
|
|
@@ -154,6 +193,8 @@ const createTupleTypeNode = factory.createTupleTypeNode;
|
|
|
154
193
|
const createRestTypeNode = factory.createRestTypeNode;
|
|
155
194
|
const createTrue = factory.createTrue;
|
|
156
195
|
const createFalse = factory.createFalse;
|
|
196
|
+
const createIndexedAccessTypeNode = factory.createIndexedAccessTypeNode;
|
|
197
|
+
const createTypeOperatorNode = factory.createTypeOperatorNode;
|
|
157
198
|
|
|
158
199
|
//#endregion
|
|
159
200
|
//#region src/parser.ts
|
|
@@ -173,9 +214,12 @@ const typeKeywordMapper = {
|
|
|
173
214
|
nullable: void 0,
|
|
174
215
|
null: () => keywordTypeNodes.null,
|
|
175
216
|
nullish: void 0,
|
|
176
|
-
array: (nodes) => {
|
|
217
|
+
array: (nodes, arrayType) => {
|
|
177
218
|
if (!nodes) return;
|
|
178
|
-
return createArrayDeclaration({
|
|
219
|
+
return createArrayDeclaration({
|
|
220
|
+
nodes,
|
|
221
|
+
arrayType
|
|
222
|
+
});
|
|
179
223
|
},
|
|
180
224
|
tuple: (nodes, rest, min, max) => {
|
|
181
225
|
if (!nodes) return;
|
|
@@ -262,7 +306,6 @@ const parse = createParser({
|
|
|
262
306
|
handlers: {
|
|
263
307
|
union(tree, options) {
|
|
264
308
|
const { current, schema, name } = tree;
|
|
265
|
-
if (!isKeyword(current, schemaKeywords.union)) return void 0;
|
|
266
309
|
return typeKeywordMapper.union(current.args.map((it) => this.parse({
|
|
267
310
|
schema,
|
|
268
311
|
parent: current,
|
|
@@ -273,7 +316,6 @@ const parse = createParser({
|
|
|
273
316
|
},
|
|
274
317
|
and(tree, options) {
|
|
275
318
|
const { current, schema, name } = tree;
|
|
276
|
-
if (!isKeyword(current, schemaKeywords.and)) return void 0;
|
|
277
319
|
return typeKeywordMapper.and(current.args.map((it) => this.parse({
|
|
278
320
|
schema,
|
|
279
321
|
parent: current,
|
|
@@ -284,18 +326,16 @@ const parse = createParser({
|
|
|
284
326
|
},
|
|
285
327
|
array(tree, options) {
|
|
286
328
|
const { current, schema, name } = tree;
|
|
287
|
-
if (!isKeyword(current, schemaKeywords.array)) return void 0;
|
|
288
329
|
return typeKeywordMapper.array(current.args.items.map((it) => this.parse({
|
|
289
330
|
schema,
|
|
290
331
|
parent: current,
|
|
291
332
|
name,
|
|
292
333
|
current: it,
|
|
293
334
|
siblings: []
|
|
294
|
-
}, options)).filter(Boolean));
|
|
335
|
+
}, options)).filter(Boolean), options.arrayType);
|
|
295
336
|
},
|
|
296
337
|
enum(tree, options) {
|
|
297
338
|
const { current } = tree;
|
|
298
|
-
if (!isKeyword(current, schemaKeywords.enum)) return void 0;
|
|
299
339
|
if (options.enumType === "inlineLiteral") {
|
|
300
340
|
const enumValues = current.args.items.map((item) => item.value).filter((value) => value !== void 0 && value !== null).map((value) => {
|
|
301
341
|
const format = typeof value === "number" ? "number" : typeof value === "boolean" ? "boolean" : "string";
|
|
@@ -307,17 +347,13 @@ const parse = createParser({
|
|
|
307
347
|
},
|
|
308
348
|
ref(tree, _options) {
|
|
309
349
|
const { current } = tree;
|
|
310
|
-
if (!isKeyword(current, schemaKeywords.ref)) return void 0;
|
|
311
350
|
return typeKeywordMapper.ref(current.args.name);
|
|
312
351
|
},
|
|
313
|
-
blob(
|
|
314
|
-
const { current } = tree;
|
|
315
|
-
if (!isKeyword(current, schemaKeywords.blob)) return void 0;
|
|
352
|
+
blob() {
|
|
316
353
|
return typeKeywordMapper.blob();
|
|
317
354
|
},
|
|
318
355
|
tuple(tree, options) {
|
|
319
356
|
const { current, schema, name } = tree;
|
|
320
|
-
if (!isKeyword(current, schemaKeywords.tuple)) return void 0;
|
|
321
357
|
return typeKeywordMapper.tuple(current.args.items.map((it) => this.parse({
|
|
322
358
|
schema,
|
|
323
359
|
parent: current,
|
|
@@ -334,12 +370,10 @@ const parse = createParser({
|
|
|
334
370
|
},
|
|
335
371
|
const(tree, _options) {
|
|
336
372
|
const { current } = tree;
|
|
337
|
-
if (!isKeyword(current, schemaKeywords.const)) return void 0;
|
|
338
373
|
return typeKeywordMapper.const(current.args.name, current.args.format);
|
|
339
374
|
},
|
|
340
375
|
object(tree, options) {
|
|
341
376
|
const { current, schema, name } = tree;
|
|
342
|
-
if (!isKeyword(current, schemaKeywords.object)) return void 0;
|
|
343
377
|
const properties = Object.entries(current.args?.properties || {}).filter((item) => {
|
|
344
378
|
const schemas = item[1];
|
|
345
379
|
return schemas && typeof schemas.map === "function";
|
|
@@ -421,19 +455,15 @@ const parse = createParser({
|
|
|
421
455
|
patternProperties
|
|
422
456
|
].filter(Boolean));
|
|
423
457
|
},
|
|
424
|
-
datetime(
|
|
425
|
-
const { current } = tree;
|
|
426
|
-
if (!isKeyword(current, schemaKeywords.datetime)) return void 0;
|
|
458
|
+
datetime() {
|
|
427
459
|
return typeKeywordMapper.datetime();
|
|
428
460
|
},
|
|
429
461
|
date(tree) {
|
|
430
462
|
const { current } = tree;
|
|
431
|
-
if (!isKeyword(current, schemaKeywords.date)) return void 0;
|
|
432
463
|
return typeKeywordMapper.date(current.args.type);
|
|
433
464
|
},
|
|
434
465
|
time(tree) {
|
|
435
466
|
const { current } = tree;
|
|
436
|
-
if (!isKeyword(current, schemaKeywords.time)) return void 0;
|
|
437
467
|
return typeKeywordMapper.time(current.args.type);
|
|
438
468
|
}
|
|
439
469
|
}
|
|
@@ -441,7 +471,7 @@ const parse = createParser({
|
|
|
441
471
|
|
|
442
472
|
//#endregion
|
|
443
473
|
//#region src/components/Type.tsx
|
|
444
|
-
function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxType, enumType, mapper, description }) {
|
|
474
|
+
function Type({ name, typedName, tree, keysToOmit, schema, optionalType, arrayType, syntaxType, enumType, mapper, description }) {
|
|
445
475
|
const typeNodes = [];
|
|
446
476
|
if (!tree.length) return "";
|
|
447
477
|
const schemaFromTree = tree.find((item) => item.keyword === schemaKeywords.schema);
|
|
@@ -454,6 +484,7 @@ function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxT
|
|
|
454
484
|
siblings
|
|
455
485
|
}, {
|
|
456
486
|
optionalType,
|
|
487
|
+
arrayType,
|
|
457
488
|
enumType,
|
|
458
489
|
mapper
|
|
459
490
|
})).filter(Boolean).at(0) || typeKeywordMapper.undefined();
|
|
@@ -463,7 +494,8 @@ function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxT
|
|
|
463
494
|
if (isDirectEnum || isEnumOnly) {
|
|
464
495
|
const typeNameWithKey = `${enumSchemas[0].args.typeName}Key`;
|
|
465
496
|
type = createTypeReferenceNode(typeNameWithKey);
|
|
466
|
-
if (schema.type === "array") type =
|
|
497
|
+
if (schema.type === "array") if (arrayType === "generic") type = createTypeReferenceNode(createIdentifier("Array"), [type]);
|
|
498
|
+
else type = createArrayTypeNode(type);
|
|
467
499
|
}
|
|
468
500
|
}
|
|
469
501
|
if (schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.schema)) {
|
|
@@ -543,5 +575,5 @@ function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxT
|
|
|
543
575
|
}
|
|
544
576
|
|
|
545
577
|
//#endregion
|
|
546
|
-
export {
|
|
547
|
-
//# sourceMappingURL=components-
|
|
578
|
+
export { createTypeAliasDeclaration as a, createTypeReferenceNode as c, getUnknownType as d, keywordTypeNodes as f, createPropertySignature as i, createUnionDeclaration as l, createIdentifier as n, createTypeLiteralNode as o, modifiers as p, createIndexedAccessTypeNode as r, createTypeOperatorNode as s, Type as t, createUrlTemplateType as u };
|
|
579
|
+
//# sourceMappingURL=components-BE9rQGox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-BE9rQGox.js","names":["modifiers","questionToken","initializer: ts.Expression","parts: string[]","parameterIndices: number[]","templateSpans: ts.TemplateLiteralTypeSpan[]","factory.createTypeLiteralNode","factory.createArrayDeclaration","factory.createOptionalTypeNode","factory.createRestTypeNode","factory.createArrayTypeNode","factory.createTupleTypeNode","factory.createTypeReferenceNode","factory.createUnionDeclaration","factory.createLiteralTypeNode","factory.createTrue","factory.createFalse","factory.createNumericLiteral","factory.createStringLiteral","factory.createIdentifier","factory.createIntersectionDeclaration","propertyName","name","schema","factory.createPropertySignature","factory.appendJSDocToNode","additionalProperties: any","factory.createIndexSignature","patternProperties: ts.TypeNode | ts.IndexSignatureDeclaration | undefined","typeNodes: ts.Node[]","factory.createTypeReferenceNode","factory.createIdentifier","factory.createArrayTypeNode","factory.createUnionDeclaration","factory.createTypeDeclaration","factory.createOmitDeclaration","name","factory.createEnumDeclaration"],"sources":["../src/factory.ts","../src/parser.ts","../src/components/Type.tsx"],"sourcesContent":["import { orderBy } from 'natural-orderby'\nimport { isNumber } from 'remeda'\nimport ts from 'typescript'\n\nconst { SyntaxKind, factory } = ts\n\n// https://ts-ast-viewer.com/\n\nexport const modifiers = {\n async: factory.createModifier(ts.SyntaxKind.AsyncKeyword),\n export: factory.createModifier(ts.SyntaxKind.ExportKeyword),\n const: factory.createModifier(ts.SyntaxKind.ConstKeyword),\n static: factory.createModifier(ts.SyntaxKind.StaticKeyword),\n} as const\n\nexport const syntaxKind = {\n union: SyntaxKind.UnionType as 192,\n} as const\n\nexport function getUnknownType(unknownType: 'any' | 'unknown' | 'void' | undefined) {\n if (unknownType === 'any') {\n return keywordTypeNodes.any\n }\n if (unknownType === 'void') {\n return keywordTypeNodes.void\n }\n\n return keywordTypeNodes.unknown\n}\nfunction isValidIdentifier(str: string): boolean {\n if (!str.length || str.trim() !== str) {\n return false\n }\n const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest)\n\n return !!node && node.kind === ts.SyntaxKind.Identifier && ts.identifierToKeywordKind(node.kind as unknown as ts.Identifier) === undefined\n}\n\nfunction propertyName(name: string | ts.PropertyName): ts.PropertyName {\n if (typeof name === 'string') {\n const isValid = isValidIdentifier(name)\n return isValid ? factory.createIdentifier(name) : factory.createStringLiteral(name)\n }\n return name\n}\n\nconst questionToken = factory.createToken(ts.SyntaxKind.QuestionToken)\n\nexport function createQuestionToken(token?: boolean | ts.QuestionToken) {\n if (!token) {\n return undefined\n }\n if (token === true) {\n return questionToken\n }\n return token\n}\n\nexport function createIntersectionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createIntersectionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string & number`\n */\nexport function createTupleDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createTupleTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createArrayDeclaration({ nodes, arrayType = 'array' }: { nodes: Array<ts.TypeNode>; arrayType?: 'array' | 'generic' }): ts.TypeNode | null {\n if (!nodes.length) {\n return factory.createTupleTypeNode([])\n }\n\n if (nodes.length === 1) {\n const node = nodes[0]\n if (!node) {\n return null\n }\n if (arrayType === 'generic') {\n return factory.createTypeReferenceNode(factory.createIdentifier('Array'), [node])\n }\n return factory.createArrayTypeNode(node)\n }\n\n // For union types (multiple nodes), respect arrayType preference\n const unionType = factory.createUnionTypeNode(nodes)\n if (arrayType === 'generic') {\n return factory.createTypeReferenceNode(factory.createIdentifier('Array'), [unionType])\n }\n // For array syntax with unions, we need parentheses: (string | number)[]\n return factory.createArrayTypeNode(factory.createParenthesizedType(unionType))\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string | number`\n */\nexport function createUnionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode {\n if (!nodes.length) {\n return keywordTypeNodes.any\n }\n\n if (nodes.length === 1) {\n return nodes[0] as ts.TypeNode\n }\n\n const node = factory.createUnionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createPropertySignature({\n readOnly,\n modifiers = [],\n name,\n questionToken,\n type,\n}: {\n readOnly?: boolean\n modifiers?: Array<ts.Modifier>\n name: ts.PropertyName | string\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n}) {\n return factory.createPropertySignature(\n [...modifiers, readOnly ? factory.createToken(ts.SyntaxKind.ReadonlyKeyword) : undefined].filter(Boolean),\n propertyName(name),\n createQuestionToken(questionToken),\n type,\n )\n}\n\nexport function createParameterSignature(\n name: string | ts.BindingName,\n {\n modifiers,\n dotDotDotToken,\n questionToken,\n type,\n initializer,\n }: {\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n dotDotDotToken?: ts.DotDotDotToken\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n initializer?: ts.Expression\n },\n): ts.ParameterDeclaration {\n return factory.createParameterDeclaration(modifiers, dotDotDotToken, name, createQuestionToken(questionToken), type, initializer)\n}\n\nexport function createJSDoc({ comments }: { comments: string[] }) {\n if (!comments.length) {\n return null\n }\n return factory.createJSDocComment(\n factory.createNodeArray(\n comments.map((comment, i) => {\n if (i === comments.length - 1) {\n return factory.createJSDocText(comment)\n }\n\n return factory.createJSDocText(`${comment}\\n`)\n }),\n ),\n )\n}\n\n/**\n * @link https://github.com/microsoft/TypeScript/issues/44151\n */\nexport function appendJSDocToNode<TNode extends ts.Node>({ node, comments }: { node: TNode; comments: Array<string | undefined> }) {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return node\n }\n\n const text = filteredComments.reduce((acc = '', comment = '') => {\n return `${acc}\\n * ${comment.replaceAll('*/', '*\\\\/')}`\n }, '*')\n\n // Use the node directly instead of spreading to avoid creating Unknown nodes\n // TypeScript's addSyntheticLeadingComment accepts the node as-is\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, `${text || '*'}\\n`, true)\n}\n\nexport function createIndexSignature(\n type: ts.TypeNode,\n {\n modifiers,\n indexName = 'key',\n indexType = factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n }: {\n indexName?: string\n indexType?: ts.TypeNode\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n } = {},\n) {\n return factory.createIndexSignature(modifiers, [createParameterSignature(indexName, { type: indexType })], type)\n}\n\nexport function createTypeAliasDeclaration({\n modifiers,\n name,\n typeParameters,\n type,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n type: ts.TypeNode\n}) {\n return factory.createTypeAliasDeclaration(modifiers, name, typeParameters, type)\n}\n\nexport function createInterfaceDeclaration({\n modifiers,\n name,\n typeParameters,\n members,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n members: Array<ts.TypeElement>\n}) {\n return factory.createInterfaceDeclaration(modifiers, name, typeParameters, undefined, members)\n}\n\nexport function createTypeDeclaration({\n syntax,\n isExportable,\n comments,\n name,\n type,\n}: {\n syntax: 'type' | 'interface'\n comments: Array<string | undefined>\n isExportable?: boolean\n name: string | ts.Identifier\n type: ts.TypeNode\n}) {\n if (syntax === 'interface' && 'members' in type) {\n const node = createInterfaceDeclaration({\n members: type.members as Array<ts.TypeElement>,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n }\n\n const node = createTypeAliasDeclaration({\n type,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n}\n\nexport function createNamespaceDeclaration({ statements, name }: { name: string; statements: ts.Statement[] }) {\n return factory.createModuleDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(name),\n factory.createModuleBlock(statements),\n ts.NodeFlags.Namespace,\n )\n}\n\n/**\n * In { propertyName: string; name?: string } is `name` being used to make the type more unique when multiple same names are used.\n * @example `import { Pet as Cat } from './Pet'`\n */\nexport function createImportDeclaration({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean\n isNameSpace?: boolean\n}) {\n if (!Array.isArray(name)) {\n let importPropertyName: ts.Identifier | undefined = factory.createIdentifier(name)\n let importName: ts.NamedImportBindings | undefined\n\n if (isNameSpace) {\n importPropertyName = undefined\n importName = factory.createNamespaceImport(factory.createIdentifier(name))\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, importPropertyName, importName),\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n // Sort the imports alphabetically for consistent output across platforms\n const sortedName = orderBy(name, [(item) => (typeof item === 'object' ? item.propertyName : item)])\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n isTypeOnly,\n undefined,\n factory.createNamedImports(\n sortedName.map((item) => {\n if (typeof item === 'object') {\n const obj = item as { propertyName: string; name?: string }\n if (obj.name) {\n return factory.createImportSpecifier(false, factory.createIdentifier(obj.propertyName), factory.createIdentifier(obj.name))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(obj.propertyName))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n }),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createExportDeclaration({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n asAlias?: boolean\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}) {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name?.match(/^\\d/) ? `_${name?.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n // Sort the exports alphabetically for consistent output across platforms\n const sortedName = orderBy(name, [(propertyName) => (typeof propertyName === 'string' ? propertyName : propertyName.text)])\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n sortedName.map((propertyName) => {\n return factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName)\n }),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createEnumDeclaration({\n type = 'enum',\n name,\n typeName,\n enums,\n}: {\n /**\n * Choose to use `enum`, `asConst`, `asPascalConst`, `constEnum`, or `literal` for enums.\n * - `enum`: TypeScript enum\n * - `asConst`: const with camelCase name (e.g., `petType`)\n * - `asPascalConst`: const with PascalCase name (e.g., `PetType`)\n * - `constEnum`: const enum\n * - `literal`: literal union type\n * @default `'enum'`\n */\n type?: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal' | 'inlineLiteral'\n /**\n * Enum name in camelCase.\n */\n name: string\n /**\n * Enum name in PascalCase.\n */\n typeName: string\n enums: [key: string | number, value: string | number | boolean][]\n}): [name: ts.Node | undefined, type: ts.Node] {\n if (type === 'literal' || type === 'inlineLiteral') {\n return [\n undefined,\n factory.createTypeAliasDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createUnionTypeNode(\n enums\n .map(([_key, value]) => {\n if (isNumber(value)) {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value?.toString()))\n }\n\n if (typeof value === 'boolean') {\n return factory.createLiteralTypeNode(value ? factory.createTrue() : factory.createFalse())\n }\n if (value) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value.toString()))\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ),\n ]\n }\n\n if (type === 'enum' || type === 'constEnum') {\n return [\n undefined,\n factory.createEnumDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword), type === 'constEnum' ? factory.createToken(ts.SyntaxKind.ConstKeyword) : undefined].filter(Boolean),\n factory.createIdentifier(typeName),\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n const isExactNumber = Number.parseInt(value.toString(), 10) === value\n\n if (isExactNumber && isNumber(Number.parseInt(value.toString(), 10))) {\n initializer = factory.createNumericLiteral(value as number)\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (isNumber(Number.parseInt(key.toString(), 10))) {\n return factory.createEnumMember(factory.createStringLiteral(`${typeName}_${key}`), initializer)\n }\n\n if (key) {\n return factory.createEnumMember(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ]\n }\n\n // used when using `as const` instead of an TypeScript enum.\n const identifierName = type === 'asPascalConst' ? typeName : name\n\n return [\n factory.createVariableStatement(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(identifierName),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createObjectLiteralExpression(\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n\n if (isNumber(value)) {\n // Error: Negative numbers should be created in combination with createPrefixUnaryExpression factory.\n // The method createNumericLiteral only accepts positive numbers\n // or those combined with createPrefixUnaryExpression.\n // Therefore, we need to ensure that the number is not negative.\n if (value < 0) {\n initializer = factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value)))\n } else {\n initializer = factory.createNumericLiteral(value)\n }\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (key) {\n return factory.createPropertyAssignment(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n true,\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createTypeAliasDeclaration(\n type === 'asPascalConst' ? [] : [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createParenthesizedType(factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n ),\n ),\n ]\n}\n\nexport function createOmitDeclaration({ keys, type, nonNullable }: { keys: Array<string> | string; type: ts.TypeNode; nonNullable?: boolean }) {\n const node = nonNullable ? factory.createTypeReferenceNode(factory.createIdentifier('NonNullable'), [type]) : type\n\n if (Array.isArray(keys)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [\n node,\n factory.createUnionTypeNode(\n keys.map((key) => {\n return factory.createLiteralTypeNode(factory.createStringLiteral(key))\n }),\n ),\n ])\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [node, factory.createLiteralTypeNode(factory.createStringLiteral(keys))])\n}\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n unknown: factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n void: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n number: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n integer: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n object: factory.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword),\n string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),\n undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),\n never: factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword),\n} as const\n\n/**\n * Converts a path like '/pet/{petId}/uploadImage' to a template literal type\n * like `/pet/${string}/uploadImage`\n */\nexport function createUrlTemplateType(path: string): ts.TypeNode {\n // If no parameters, return literal string type\n if (!path.includes('{')) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(path))\n }\n\n // Split path by parameter placeholders, e.g. '/pet/{petId}/upload' -> ['/pet/', 'petId', '/upload']\n const segments = path.split(/(\\{[^}]+\\})/)\n\n // Separate static parts from parameter placeholders\n const parts: string[] = []\n const parameterIndices: number[] = []\n\n segments.forEach((segment) => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n // This is a parameter placeholder\n parameterIndices.push(parts.length)\n parts.push(segment) // Will be replaced with ${string}\n } else if (segment) {\n // This is a static part\n parts.push(segment)\n }\n })\n\n // Build template literal type\n // Template literal structure: head + templateSpans[]\n // For '/pet/{petId}/upload': head = '/pet/', spans = [{ type: string, literal: '/upload' }]\n\n const head = ts.factory.createTemplateHead(parts[0] || '')\n const templateSpans: ts.TemplateLiteralTypeSpan[] = []\n\n parameterIndices.forEach((paramIndex, i) => {\n const isLast = i === parameterIndices.length - 1\n const nextPart = parts[paramIndex + 1] || ''\n\n const literal = isLast ? ts.factory.createTemplateTail(nextPart) : ts.factory.createTemplateMiddle(nextPart)\n\n templateSpans.push(ts.factory.createTemplateLiteralTypeSpan(keywordTypeNodes.string, literal))\n })\n\n return ts.factory.createTemplateLiteralType(head, templateSpans)\n}\n\nexport const createTypeLiteralNode = factory.createTypeLiteralNode\n\nexport const createTypeReferenceNode = factory.createTypeReferenceNode\nexport const createNumericLiteral = factory.createNumericLiteral\nexport const createStringLiteral = factory.createStringLiteral\n\nexport const createArrayTypeNode = factory.createArrayTypeNode\nexport const createParenthesizedType = factory.createParenthesizedType\n\nexport const createLiteralTypeNode = factory.createLiteralTypeNode\nexport const createNull = factory.createNull\nexport const createIdentifier = factory.createIdentifier\n\nexport const createOptionalTypeNode = factory.createOptionalTypeNode\nexport const createTupleTypeNode = factory.createTupleTypeNode\nexport const createRestTypeNode = factory.createRestTypeNode\nexport const createTrue = factory.createTrue\nexport const createFalse = factory.createFalse\nexport const createIndexedAccessTypeNode = factory.createIndexedAccessTypeNode\nexport const createTypeOperatorNode = factory.createTypeOperatorNode\n","import transformers from '@kubb/core/transformers'\nimport type { SchemaKeywordMapper, SchemaMapper } from '@kubb/plugin-oas'\nimport { createParser, isKeyword, schemaKeywords } from '@kubb/plugin-oas'\nimport type ts from 'typescript'\nimport * as factory from './factory.ts'\n\nexport const typeKeywordMapper = {\n any: () => factory.keywordTypeNodes.any,\n unknown: () => factory.keywordTypeNodes.unknown,\n void: () => factory.keywordTypeNodes.void,\n number: () => factory.keywordTypeNodes.number,\n integer: () => factory.keywordTypeNodes.number,\n object: (nodes?: ts.TypeElement[]) => {\n if (!nodes || !nodes.length) {\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[], arrayType?: 'array' | 'generic') => {\n if (!nodes) {\n return undefined\n }\n\n return factory.createArrayDeclaration({ nodes, arrayType })\n },\n tuple: (nodes?: ts.TypeNode[], rest?: ts.TypeNode, min?: number, max?: number) => {\n if (!nodes) {\n return undefined\n }\n\n if (max) {\n nodes = nodes.slice(0, max)\n\n if (nodes.length < max && rest) {\n nodes = [...nodes, ...Array(max - nodes.length).fill(rest)]\n }\n }\n\n if (min) {\n nodes = nodes.map((node, index) => (index >= min ? factory.createOptionalTypeNode(node) : node))\n }\n\n if (typeof max === 'undefined' && rest) {\n nodes.push(factory.createRestTypeNode(factory.createArrayTypeNode(rest)))\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 | boolean, format?: 'string' | 'number' | 'boolean') => {\n if (name === null || name === undefined || name === '') {\n return undefined\n }\n\n if (format === 'boolean') {\n if (name === true) {\n return factory.createLiteralTypeNode(factory.createTrue())\n }\n\n return factory.createLiteralTypeNode(factory.createFalse())\n }\n\n if (format === 'number' && typeof name === '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: () => factory.keywordTypeNodes.string,\n url: () => factory.keywordTypeNodes.string,\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: () => factory.keywordTypeNodes.string,\n email: () => factory.keywordTypeNodes.string,\n firstName: undefined,\n lastName: undefined,\n password: undefined,\n phone: undefined,\n readOnly: undefined,\n writeOnly: 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 interface: undefined,\n exclusiveMaximum: undefined,\n exclusiveMinimum: undefined,\n} satisfies SchemaMapper<ts.TypeNode | null | undefined>\n\ntype ParserOptions = {\n /**\n * @default `'questionToken'`\n */\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n /**\n * @default `'array'`\n */\n arrayType: 'array' | 'generic'\n /**\n * Choose to use `enum`, `asConst`, `asPascalConst`, `constEnum`, `literal`, or `inlineLiteral` for enums.\n * - `enum`: TypeScript enum\n * - `asConst`: const with camelCase name (e.g., `petType`)\n * - `asPascalConst`: const with PascalCase name (e.g., `PetType`)\n * - `constEnum`: const enum\n * - `literal`: literal union type\n * - `inlineLiteral`: inline enum values directly into the type (default in v5)\n * @default `'asConst'`\n * @note In Kubb v5, `inlineLiteral` will become the default.\n */\n enumType: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal' | 'inlineLiteral'\n mapper?: Record<string, ts.PropertySignature>\n}\n\n/**\n * Recursively parses a schema tree node into a corresponding TypeScript AST node.\n *\n * Maps OpenAPI schema keywords to TypeScript AST nodes using the `typeKeywordMapper`, handling complex types such as unions, intersections, arrays, tuples (with optional/rest elements and length constraints), enums, constants, references, and objects with property modifiers and documentation annotations.\n *\n * @param current - The schema node to parse.\n * @param siblings - Sibling schema nodes, used for context in certain mappings.\n * @param name - The name of the schema or property being parsed.\n * @param options - Parsing options controlling output style, property handling, and custom mappers.\n * @returns The generated TypeScript AST node, or `undefined` if the schema keyword is not mapped.\n */\nexport const parse = createParser<ts.Node | null, ParserOptions>({\n mapper: typeKeywordMapper,\n handlers: {\n union(tree, options) {\n const { current, schema, name } = tree\n\n return typeKeywordMapper.union(\n current.args.map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options)).filter(Boolean) as ts.TypeNode[],\n )\n },\n and(tree, options) {\n const { current, schema, name } = tree\n\n return typeKeywordMapper.and(\n current.args.map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options)).filter(Boolean) as ts.TypeNode[],\n )\n },\n array(tree, options) {\n const { current, schema, name } = tree\n\n return typeKeywordMapper.array(\n current.args.items.map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options)).filter(Boolean) as ts.TypeNode[],\n options.arrayType,\n )\n },\n enum(tree, options) {\n const { current } = tree\n\n // If enumType is 'inlineLiteral', generate the literal union inline instead of a type reference\n if (options.enumType === 'inlineLiteral') {\n const enumValues = current.args.items\n .map((item) => item.value)\n .filter((value): value is string | number | boolean => value !== undefined && value !== null)\n .map((value) => {\n const format = typeof value === 'number' ? 'number' : typeof value === 'boolean' ? 'boolean' : 'string'\n return typeKeywordMapper.const(value, format)\n })\n .filter(Boolean) as ts.TypeNode[]\n\n return typeKeywordMapper.union(enumValues)\n }\n\n // Adding suffix to enum (see https://github.com/kubb-labs/kubb/issues/1873)\n return typeKeywordMapper.enum(options.enumType === 'asConst' ? `${current.args.typeName}Key` : current.args.typeName)\n },\n ref(tree, _options) {\n const { current } = tree\n\n return typeKeywordMapper.ref(current.args.name)\n },\n blob() {\n return typeKeywordMapper.blob()\n },\n tuple(tree, options) {\n const { current, schema, name } = tree\n\n return typeKeywordMapper.tuple(\n current.args.items.map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options)).filter(Boolean) as ts.TypeNode[],\n current.args.rest &&\n ((this.parse({ schema, parent: current, name, current: current.args.rest, siblings: [] }, options) ?? undefined) as ts.TypeNode | undefined),\n current.args.min,\n current.args.max,\n )\n },\n const(tree, _options) {\n const { current } = tree\n\n return typeKeywordMapper.const(current.args.name, current.args.format)\n },\n object(tree, options) {\n const { current, schema, name } = tree\n\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 const nameSchema = schemas.find((schema) => schema.keyword === schemaKeywords.name) as SchemaKeywordMapper['name']\n const mappedName = nameSchema?.args || name\n\n // custom mapper(pluginOptions)\n // Use Object.hasOwn to avoid matching inherited properties like 'toString', 'valueOf', etc.\n if (options.mapper && Object.hasOwn(options.mapper, mappedName)) {\n return options.mapper[mappedName]\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 const minSchema = schemas.find((schema) => schema.keyword === schemaKeywords.min) as SchemaKeywordMapper['min'] | undefined\n const maxSchema = schemas.find((schema) => schema.keyword === schemaKeywords.max) as SchemaKeywordMapper['max'] | undefined\n const matchesSchema = schemas.find((schema) => schema.keyword === schemaKeywords.matches) as SchemaKeywordMapper['matches'] | undefined\n\n let type = schemas\n .map((it) =>\n this.parse(\n {\n schema,\n parent: current,\n name,\n current: it,\n siblings: schemas,\n },\n options,\n ),\n )\n .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 propertyNode = factory.createPropertySignature({\n questionToken: isOptional || isNullish ? ['questionToken', 'questionTokenAndUndefined'].includes(options.optionalType as string) : false,\n name: mappedName,\n type,\n readOnly: isReadonly,\n })\n\n return factory.appendJSDocToNode({\n node: propertyNode,\n comments: [\n describeSchema ? `@description ${transformers.jsStringEscape(describeSchema.args)}` : undefined,\n deprecatedSchema ? '@deprecated' : undefined,\n minSchema ? `@minLength ${minSchema.args}` : undefined,\n maxSchema ? `@maxLength ${maxSchema.args}` : undefined,\n matchesSchema ? `@pattern ${matchesSchema.args}` : 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 let additionalProperties: any\n\n if (current.args?.additionalProperties?.length) {\n additionalProperties = current.args.additionalProperties\n .map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options))\n .filter(Boolean)\n .at(0) as ts.TypeNode\n\n const isNullable = current.args?.additionalProperties.some((schema) => isKeyword(schema, schemaKeywords.nullable))\n if (isNullable) {\n additionalProperties = factory.createUnionDeclaration({\n nodes: [additionalProperties, factory.keywordTypeNodes.null],\n }) as ts.TypeNode\n }\n\n additionalProperties = factory.createIndexSignature(additionalProperties)\n }\n\n let patternProperties: ts.TypeNode | ts.IndexSignatureDeclaration | undefined\n\n if (current.args?.patternProperties) {\n const allPatternSchemas = Object.values(current.args.patternProperties).flat()\n\n if (allPatternSchemas.length > 0) {\n patternProperties = allPatternSchemas\n .map((it) => this.parse({ schema, parent: current, name, current: it, siblings: [] }, options))\n .filter(Boolean)\n .at(0) as ts.TypeNode\n\n const isNullable = allPatternSchemas.some((schema) => isKeyword(schema, schemaKeywords.nullable))\n if (isNullable) {\n patternProperties = factory.createUnionDeclaration({\n nodes: [patternProperties, factory.keywordTypeNodes.null],\n }) as ts.TypeNode\n }\n\n patternProperties = factory.createIndexSignature(patternProperties)\n }\n }\n\n return typeKeywordMapper.object([...properties, additionalProperties, patternProperties].filter(Boolean))\n },\n datetime() {\n return typeKeywordMapper.datetime()\n },\n date(tree) {\n const { current } = tree\n\n return typeKeywordMapper.date(current.args.type)\n },\n time(tree) {\n const { current } = tree\n\n return typeKeywordMapper.time(current.args.type)\n },\n },\n})\n","import transformers from '@kubb/core/transformers'\nimport { safePrint } from '@kubb/fabric-core/parsers/typescript'\nimport type { SchemaObject } from '@kubb/oas'\nimport { isKeyword, type Schema, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'\nimport { File } from '@kubb/react-fabric'\nimport type { KubbNode } from '@kubb/react-fabric/types'\nimport type ts from 'typescript'\nimport * as factory from '../factory.ts'\nimport { parse, typeKeywordMapper } from '../parser.ts'\nimport type { PluginTs } from '../types.ts'\n\ntype Props = {\n name: string\n typedName: string\n schema: SchemaObject\n tree: Array<Schema>\n optionalType: PluginTs['resolvedOptions']['optionalType']\n arrayType: PluginTs['resolvedOptions']['arrayType']\n enumType: PluginTs['resolvedOptions']['enumType']\n mapper: PluginTs['resolvedOptions']['mapper']\n syntaxType: PluginTs['resolvedOptions']['syntaxType']\n description?: string\n keysToOmit?: string[]\n}\n\nexport function Type({ name, typedName, tree, keysToOmit, schema, optionalType, arrayType, syntaxType, enumType, mapper, description }: Props): KubbNode {\n const typeNodes: ts.Node[] = []\n\n if (!tree.length) {\n return ''\n }\n\n const schemaFromTree = tree.find((item) => item.keyword === schemaKeywords.schema)\n const enumSchemas = SchemaGenerator.deepSearch(tree, schemaKeywords.enum)\n\n let type =\n (tree\n .map((current, _index, siblings) =>\n parse(\n { name, schema, parent: undefined, current, siblings },\n {\n optionalType,\n arrayType,\n enumType,\n mapper,\n },\n ),\n )\n .filter(Boolean)\n .at(0) as ts.TypeNode) || typeKeywordMapper.undefined()\n\n // Add a \"Key\" suffix to avoid collisions where necessary\n if (enumType === 'asConst' && enumSchemas.length > 0) {\n const isDirectEnum = schema.type === 'array' && schema.items !== undefined\n const isEnumOnly = 'enum' in schema && schema.enum\n\n if (isDirectEnum || isEnumOnly) {\n const enumSchema = enumSchemas[0]!\n const typeNameWithKey = `${enumSchema.args.typeName}Key`\n\n type = factory.createTypeReferenceNode(typeNameWithKey)\n\n if (schema.type === 'array') {\n if (arrayType === 'generic') {\n type = factory.createTypeReferenceNode(factory.createIdentifier('Array'), [type])\n } else {\n type = factory.createArrayTypeNode(type)\n }\n }\n }\n }\n\n if (schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.schema)) {\n const isNullish = tree.some((item) => item.keyword === schemaKeywords.nullish)\n const isNullable = tree.some((item) => item.keyword === schemaKeywords.nullable)\n const isOptional = tree.some((item) => item.keyword === schemaKeywords.optional)\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(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(optionalType as string)) {\n type = factory.createUnionDeclaration({\n nodes: [type, factory.keywordTypeNodes.undefined],\n }) as ts.TypeNode\n }\n }\n\n const useTypeGeneration = syntaxType === 'type' || [factory.syntaxKind.union].includes(type.kind as typeof factory.syntaxKind.union) || !!keysToOmit?.length\n\n typeNodes.push(\n factory.createTypeDeclaration({\n name,\n isExportable: true,\n type: keysToOmit?.length\n ? factory.createOmitDeclaration({\n keys: keysToOmit,\n type,\n nonNullable: true,\n })\n : type,\n syntax: useTypeGeneration ? 'type' : 'interface',\n comments: [\n description ? `@description ${transformers.jsStringEscape(description)}` : undefined,\n schema.deprecated ? '@deprecated' : undefined,\n schema.minLength ? `@minLength ${schema.minLength}` : undefined,\n schema.maxLength ? `@maxLength ${schema.maxLength}` : undefined,\n schema.pattern ? `@pattern ${schema.pattern}` : undefined,\n schema.default ? `@default ${schema.default}` : undefined,\n schema.example ? `@example ${schema.example}` : undefined,\n ],\n }),\n )\n\n const enums = [...new Set(enumSchemas)].map((enumSchema) => {\n const name = enumType === 'asPascalConst' ? transformers.pascalCase(enumSchema.args.name) : transformers.camelCase(enumSchema.args.name)\n const typeName = enumType === 'asConst' ? `${enumSchema.args.typeName}Key` : enumSchema.args.typeName\n\n const [nameNode, typeNode] = factory.createEnumDeclaration({\n name,\n 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 Array<[string, string]>,\n type: enumType,\n })\n\n return {\n nameNode,\n typeNode,\n name,\n typeName,\n }\n })\n\n // Skip enum exports when using inlineLiteral\n const shouldExportEnums = enumType !== 'inlineLiteral'\n const shouldExportType = enumType === 'inlineLiteral' || enums.every((item) => item.typeName !== name)\n\n return (\n <>\n {shouldExportEnums &&\n enums.map(({ name, nameNode, typeName, typeNode }) => (\n <>\n {nameNode && (\n <File.Source name={name} isExportable isIndexable>\n {safePrint(nameNode)}\n </File.Source>\n )}\n {\n <File.Source\n name={typeName}\n isIndexable\n isExportable={['enum', 'asConst', 'constEnum', 'literal', undefined].includes(enumType)}\n isTypeOnly={['asConst', 'literal', undefined].includes(enumType)}\n >\n {safePrint(typeNode)}\n </File.Source>\n }\n </>\n ))}\n {shouldExportType && (\n <File.Source name={typedName} isTypeOnly isExportable isIndexable>\n {safePrint(...typeNodes)}\n </File.Source>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -30,10 +30,10 @@ _kubb_core_transformers = __toESM(_kubb_core_transformers);
|
|
|
30
30
|
let _kubb_plugin_oas = require("@kubb/plugin-oas");
|
|
31
31
|
let _kubb_fabric_core_parsers_typescript = require("@kubb/fabric-core/parsers/typescript");
|
|
32
32
|
let _kubb_react_fabric = require("@kubb/react-fabric");
|
|
33
|
-
require("natural-orderby");
|
|
34
|
-
let remeda = require("remeda");
|
|
35
33
|
let typescript = require("typescript");
|
|
36
34
|
typescript = __toESM(typescript);
|
|
35
|
+
require("natural-orderby");
|
|
36
|
+
let remeda = require("remeda");
|
|
37
37
|
let _kubb_react_fabric_jsx_runtime = require("@kubb/react-fabric/jsx-runtime");
|
|
38
38
|
|
|
39
39
|
//#region src/factory.ts
|
|
@@ -45,6 +45,11 @@ const modifiers = {
|
|
|
45
45
|
static: factory.createModifier(typescript.default.SyntaxKind.StaticKeyword)
|
|
46
46
|
};
|
|
47
47
|
const syntaxKind = { union: SyntaxKind.UnionType };
|
|
48
|
+
function getUnknownType(unknownType) {
|
|
49
|
+
if (unknownType === "any") return keywordTypeNodes.any;
|
|
50
|
+
if (unknownType === "void") return keywordTypeNodes.void;
|
|
51
|
+
return keywordTypeNodes.unknown;
|
|
52
|
+
}
|
|
48
53
|
function isValidIdentifier(str) {
|
|
49
54
|
if (!str.length || str.trim() !== str) return false;
|
|
50
55
|
const node = typescript.default.parseIsolatedEntityName(str, typescript.default.ScriptTarget.Latest);
|
|
@@ -67,10 +72,17 @@ function createIntersectionDeclaration({ nodes, withParentheses }) {
|
|
|
67
72
|
if (withParentheses) return factory.createParenthesizedType(node);
|
|
68
73
|
return node;
|
|
69
74
|
}
|
|
70
|
-
function createArrayDeclaration({ nodes }) {
|
|
75
|
+
function createArrayDeclaration({ nodes, arrayType = "array" }) {
|
|
71
76
|
if (!nodes.length) return factory.createTupleTypeNode([]);
|
|
72
|
-
if (nodes.length === 1)
|
|
73
|
-
|
|
77
|
+
if (nodes.length === 1) {
|
|
78
|
+
const node = nodes[0];
|
|
79
|
+
if (!node) return null;
|
|
80
|
+
if (arrayType === "generic") return factory.createTypeReferenceNode(factory.createIdentifier("Array"), [node]);
|
|
81
|
+
return factory.createArrayTypeNode(node);
|
|
82
|
+
}
|
|
83
|
+
const unionType = factory.createUnionTypeNode(nodes);
|
|
84
|
+
if (arrayType === "generic") return factory.createTypeReferenceNode(factory.createIdentifier("Array"), [unionType]);
|
|
85
|
+
return factory.createArrayTypeNode(factory.createParenthesizedType(unionType));
|
|
74
86
|
}
|
|
75
87
|
/**
|
|
76
88
|
* Minimum nodes length of 2
|
|
@@ -168,13 +180,40 @@ const keywordTypeNodes = {
|
|
|
168
180
|
string: factory.createKeywordTypeNode(typescript.default.SyntaxKind.StringKeyword),
|
|
169
181
|
boolean: factory.createKeywordTypeNode(typescript.default.SyntaxKind.BooleanKeyword),
|
|
170
182
|
undefined: factory.createKeywordTypeNode(typescript.default.SyntaxKind.UndefinedKeyword),
|
|
171
|
-
null: factory.createLiteralTypeNode(factory.createToken(typescript.default.SyntaxKind.NullKeyword))
|
|
183
|
+
null: factory.createLiteralTypeNode(factory.createToken(typescript.default.SyntaxKind.NullKeyword)),
|
|
184
|
+
never: factory.createKeywordTypeNode(typescript.default.SyntaxKind.NeverKeyword)
|
|
172
185
|
};
|
|
186
|
+
/**
|
|
187
|
+
* Converts a path like '/pet/{petId}/uploadImage' to a template literal type
|
|
188
|
+
* like `/pet/${string}/uploadImage`
|
|
189
|
+
*/
|
|
190
|
+
function createUrlTemplateType(path) {
|
|
191
|
+
if (!path.includes("{")) return factory.createLiteralTypeNode(factory.createStringLiteral(path));
|
|
192
|
+
const segments = path.split(/(\{[^}]+\})/);
|
|
193
|
+
const parts = [];
|
|
194
|
+
const parameterIndices = [];
|
|
195
|
+
segments.forEach((segment) => {
|
|
196
|
+
if (segment.startsWith("{") && segment.endsWith("}")) {
|
|
197
|
+
parameterIndices.push(parts.length);
|
|
198
|
+
parts.push(segment);
|
|
199
|
+
} else if (segment) parts.push(segment);
|
|
200
|
+
});
|
|
201
|
+
const head = typescript.default.factory.createTemplateHead(parts[0] || "");
|
|
202
|
+
const templateSpans = [];
|
|
203
|
+
parameterIndices.forEach((paramIndex, i) => {
|
|
204
|
+
const isLast = i === parameterIndices.length - 1;
|
|
205
|
+
const nextPart = parts[paramIndex + 1] || "";
|
|
206
|
+
const literal = isLast ? typescript.default.factory.createTemplateTail(nextPart) : typescript.default.factory.createTemplateMiddle(nextPart);
|
|
207
|
+
templateSpans.push(typescript.default.factory.createTemplateLiteralTypeSpan(keywordTypeNodes.string, literal));
|
|
208
|
+
});
|
|
209
|
+
return typescript.default.factory.createTemplateLiteralType(head, templateSpans);
|
|
210
|
+
}
|
|
173
211
|
const createTypeLiteralNode = factory.createTypeLiteralNode;
|
|
174
212
|
const createTypeReferenceNode = factory.createTypeReferenceNode;
|
|
175
213
|
const createNumericLiteral = factory.createNumericLiteral;
|
|
176
214
|
const createStringLiteral = factory.createStringLiteral;
|
|
177
215
|
const createArrayTypeNode = factory.createArrayTypeNode;
|
|
216
|
+
const createParenthesizedType = factory.createParenthesizedType;
|
|
178
217
|
const createLiteralTypeNode = factory.createLiteralTypeNode;
|
|
179
218
|
const createNull = factory.createNull;
|
|
180
219
|
const createIdentifier = factory.createIdentifier;
|
|
@@ -183,6 +222,8 @@ const createTupleTypeNode = factory.createTupleTypeNode;
|
|
|
183
222
|
const createRestTypeNode = factory.createRestTypeNode;
|
|
184
223
|
const createTrue = factory.createTrue;
|
|
185
224
|
const createFalse = factory.createFalse;
|
|
225
|
+
const createIndexedAccessTypeNode = factory.createIndexedAccessTypeNode;
|
|
226
|
+
const createTypeOperatorNode = factory.createTypeOperatorNode;
|
|
186
227
|
|
|
187
228
|
//#endregion
|
|
188
229
|
//#region src/parser.ts
|
|
@@ -202,9 +243,12 @@ const typeKeywordMapper = {
|
|
|
202
243
|
nullable: void 0,
|
|
203
244
|
null: () => keywordTypeNodes.null,
|
|
204
245
|
nullish: void 0,
|
|
205
|
-
array: (nodes) => {
|
|
246
|
+
array: (nodes, arrayType) => {
|
|
206
247
|
if (!nodes) return;
|
|
207
|
-
return createArrayDeclaration({
|
|
248
|
+
return createArrayDeclaration({
|
|
249
|
+
nodes,
|
|
250
|
+
arrayType
|
|
251
|
+
});
|
|
208
252
|
},
|
|
209
253
|
tuple: (nodes, rest, min, max) => {
|
|
210
254
|
if (!nodes) return;
|
|
@@ -291,7 +335,6 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
291
335
|
handlers: {
|
|
292
336
|
union(tree, options) {
|
|
293
337
|
const { current, schema, name } = tree;
|
|
294
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.union)) return void 0;
|
|
295
338
|
return typeKeywordMapper.union(current.args.map((it) => this.parse({
|
|
296
339
|
schema,
|
|
297
340
|
parent: current,
|
|
@@ -302,7 +345,6 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
302
345
|
},
|
|
303
346
|
and(tree, options) {
|
|
304
347
|
const { current, schema, name } = tree;
|
|
305
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.and)) return void 0;
|
|
306
348
|
return typeKeywordMapper.and(current.args.map((it) => this.parse({
|
|
307
349
|
schema,
|
|
308
350
|
parent: current,
|
|
@@ -313,18 +355,16 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
313
355
|
},
|
|
314
356
|
array(tree, options) {
|
|
315
357
|
const { current, schema, name } = tree;
|
|
316
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.array)) return void 0;
|
|
317
358
|
return typeKeywordMapper.array(current.args.items.map((it) => this.parse({
|
|
318
359
|
schema,
|
|
319
360
|
parent: current,
|
|
320
361
|
name,
|
|
321
362
|
current: it,
|
|
322
363
|
siblings: []
|
|
323
|
-
}, options)).filter(Boolean));
|
|
364
|
+
}, options)).filter(Boolean), options.arrayType);
|
|
324
365
|
},
|
|
325
366
|
enum(tree, options) {
|
|
326
367
|
const { current } = tree;
|
|
327
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.enum)) return void 0;
|
|
328
368
|
if (options.enumType === "inlineLiteral") {
|
|
329
369
|
const enumValues = current.args.items.map((item) => item.value).filter((value) => value !== void 0 && value !== null).map((value) => {
|
|
330
370
|
const format = typeof value === "number" ? "number" : typeof value === "boolean" ? "boolean" : "string";
|
|
@@ -336,17 +376,13 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
336
376
|
},
|
|
337
377
|
ref(tree, _options) {
|
|
338
378
|
const { current } = tree;
|
|
339
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.ref)) return void 0;
|
|
340
379
|
return typeKeywordMapper.ref(current.args.name);
|
|
341
380
|
},
|
|
342
|
-
blob(
|
|
343
|
-
const { current } = tree;
|
|
344
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.blob)) return void 0;
|
|
381
|
+
blob() {
|
|
345
382
|
return typeKeywordMapper.blob();
|
|
346
383
|
},
|
|
347
384
|
tuple(tree, options) {
|
|
348
385
|
const { current, schema, name } = tree;
|
|
349
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.tuple)) return void 0;
|
|
350
386
|
return typeKeywordMapper.tuple(current.args.items.map((it) => this.parse({
|
|
351
387
|
schema,
|
|
352
388
|
parent: current,
|
|
@@ -363,12 +399,10 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
363
399
|
},
|
|
364
400
|
const(tree, _options) {
|
|
365
401
|
const { current } = tree;
|
|
366
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.const)) return void 0;
|
|
367
402
|
return typeKeywordMapper.const(current.args.name, current.args.format);
|
|
368
403
|
},
|
|
369
404
|
object(tree, options) {
|
|
370
405
|
const { current, schema, name } = tree;
|
|
371
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.object)) return void 0;
|
|
372
406
|
const properties = Object.entries(current.args?.properties || {}).filter((item) => {
|
|
373
407
|
const schemas = item[1];
|
|
374
408
|
return schemas && typeof schemas.map === "function";
|
|
@@ -450,19 +484,15 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
450
484
|
patternProperties
|
|
451
485
|
].filter(Boolean));
|
|
452
486
|
},
|
|
453
|
-
datetime(
|
|
454
|
-
const { current } = tree;
|
|
455
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.datetime)) return void 0;
|
|
487
|
+
datetime() {
|
|
456
488
|
return typeKeywordMapper.datetime();
|
|
457
489
|
},
|
|
458
490
|
date(tree) {
|
|
459
491
|
const { current } = tree;
|
|
460
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.date)) return void 0;
|
|
461
492
|
return typeKeywordMapper.date(current.args.type);
|
|
462
493
|
},
|
|
463
494
|
time(tree) {
|
|
464
495
|
const { current } = tree;
|
|
465
|
-
if (!(0, _kubb_plugin_oas.isKeyword)(current, _kubb_plugin_oas.schemaKeywords.time)) return void 0;
|
|
466
496
|
return typeKeywordMapper.time(current.args.type);
|
|
467
497
|
}
|
|
468
498
|
}
|
|
@@ -470,7 +500,7 @@ const parse = (0, _kubb_plugin_oas.createParser)({
|
|
|
470
500
|
|
|
471
501
|
//#endregion
|
|
472
502
|
//#region src/components/Type.tsx
|
|
473
|
-
function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxType, enumType, mapper, description }) {
|
|
503
|
+
function Type({ name, typedName, tree, keysToOmit, schema, optionalType, arrayType, syntaxType, enumType, mapper, description }) {
|
|
474
504
|
const typeNodes = [];
|
|
475
505
|
if (!tree.length) return "";
|
|
476
506
|
const schemaFromTree = tree.find((item) => item.keyword === _kubb_plugin_oas.schemaKeywords.schema);
|
|
@@ -483,6 +513,7 @@ function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxT
|
|
|
483
513
|
siblings
|
|
484
514
|
}, {
|
|
485
515
|
optionalType,
|
|
516
|
+
arrayType,
|
|
486
517
|
enumType,
|
|
487
518
|
mapper
|
|
488
519
|
})).filter(Boolean).at(0) || typeKeywordMapper.undefined();
|
|
@@ -492,7 +523,8 @@ function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxT
|
|
|
492
523
|
if (isDirectEnum || isEnumOnly) {
|
|
493
524
|
const typeNameWithKey = `${enumSchemas[0].args.typeName}Key`;
|
|
494
525
|
type = createTypeReferenceNode(typeNameWithKey);
|
|
495
|
-
if (schema.type === "array") type =
|
|
526
|
+
if (schema.type === "array") if (arrayType === "generic") type = createTypeReferenceNode(createIdentifier("Array"), [type]);
|
|
527
|
+
else type = createArrayTypeNode(type);
|
|
496
528
|
}
|
|
497
529
|
}
|
|
498
530
|
if (schemaFromTree && (0, _kubb_plugin_oas.isKeyword)(schemaFromTree, _kubb_plugin_oas.schemaKeywords.schema)) {
|
|
@@ -590,6 +622,12 @@ Object.defineProperty(exports, 'createIdentifier', {
|
|
|
590
622
|
return createIdentifier;
|
|
591
623
|
}
|
|
592
624
|
});
|
|
625
|
+
Object.defineProperty(exports, 'createIndexedAccessTypeNode', {
|
|
626
|
+
enumerable: true,
|
|
627
|
+
get: function () {
|
|
628
|
+
return createIndexedAccessTypeNode;
|
|
629
|
+
}
|
|
630
|
+
});
|
|
593
631
|
Object.defineProperty(exports, 'createPropertySignature', {
|
|
594
632
|
enumerable: true,
|
|
595
633
|
get: function () {
|
|
@@ -608,6 +646,12 @@ Object.defineProperty(exports, 'createTypeLiteralNode', {
|
|
|
608
646
|
return createTypeLiteralNode;
|
|
609
647
|
}
|
|
610
648
|
});
|
|
649
|
+
Object.defineProperty(exports, 'createTypeOperatorNode', {
|
|
650
|
+
enumerable: true,
|
|
651
|
+
get: function () {
|
|
652
|
+
return createTypeOperatorNode;
|
|
653
|
+
}
|
|
654
|
+
});
|
|
611
655
|
Object.defineProperty(exports, 'createTypeReferenceNode', {
|
|
612
656
|
enumerable: true,
|
|
613
657
|
get: function () {
|
|
@@ -620,10 +664,28 @@ Object.defineProperty(exports, 'createUnionDeclaration', {
|
|
|
620
664
|
return createUnionDeclaration;
|
|
621
665
|
}
|
|
622
666
|
});
|
|
667
|
+
Object.defineProperty(exports, 'createUrlTemplateType', {
|
|
668
|
+
enumerable: true,
|
|
669
|
+
get: function () {
|
|
670
|
+
return createUrlTemplateType;
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
Object.defineProperty(exports, 'getUnknownType', {
|
|
674
|
+
enumerable: true,
|
|
675
|
+
get: function () {
|
|
676
|
+
return getUnknownType;
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
Object.defineProperty(exports, 'keywordTypeNodes', {
|
|
680
|
+
enumerable: true,
|
|
681
|
+
get: function () {
|
|
682
|
+
return keywordTypeNodes;
|
|
683
|
+
}
|
|
684
|
+
});
|
|
623
685
|
Object.defineProperty(exports, 'modifiers', {
|
|
624
686
|
enumerable: true,
|
|
625
687
|
get: function () {
|
|
626
688
|
return modifiers;
|
|
627
689
|
}
|
|
628
690
|
});
|
|
629
|
-
//# sourceMappingURL=components-
|
|
691
|
+
//# sourceMappingURL=components-CGcs8968.cjs.map
|