@kubb/swagger-ts 1.13.0 → 1.14.0-canary.20231020T164558
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/index.cjs +78 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -44
- package/dist/index.d.ts +33 -44
- package/dist/index.js +78 -60
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
@@ -55,7 +55,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
55
55
|
keysToOmit
|
56
56
|
}) {
|
57
57
|
const nodes = [];
|
58
|
-
const type = this
|
58
|
+
const type = this.#getTypeFromSchema(schema, baseName);
|
59
59
|
if (!type) {
|
60
60
|
return this.extraNodes;
|
61
61
|
}
|
@@ -86,8 +86,8 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
86
86
|
* Delegates to getBaseTypeFromSchema internally and
|
87
87
|
* optionally adds a union with null.
|
88
88
|
*/
|
89
|
-
getTypeFromSchema(schema, name) {
|
90
|
-
const type = this
|
89
|
+
#getTypeFromSchema(schema, name) {
|
90
|
+
const type = this.#getBaseTypeFromSchema(schema, name);
|
91
91
|
if (!type) {
|
92
92
|
return null;
|
93
93
|
}
|
@@ -99,7 +99,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
99
99
|
/**
|
100
100
|
* Recursively creates a type literal with the given props.
|
101
101
|
*/
|
102
|
-
getTypeFromProperties(baseSchema, baseName) {
|
102
|
+
#getTypeFromProperties(baseSchema, baseName) {
|
103
103
|
const { optionalType } = this.options;
|
104
104
|
const properties = baseSchema?.properties || {};
|
105
105
|
const required = baseSchema?.required;
|
@@ -107,7 +107,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
107
107
|
const members = Object.keys(properties).map((name) => {
|
108
108
|
const schema = properties[name];
|
109
109
|
const isRequired = required && required.includes(name);
|
110
|
-
let type = this
|
110
|
+
let type = this.#getTypeFromSchema(schema, this.options.resolveName({ name: `${baseName || ""} ${name}`, pluginName }));
|
111
111
|
if (!type) {
|
112
112
|
return null;
|
113
113
|
}
|
@@ -136,7 +136,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
136
136
|
return propertySignature;
|
137
137
|
});
|
138
138
|
if (additionalProperties) {
|
139
|
-
const type = additionalProperties === true ? keywordTypeNodes.any : this
|
139
|
+
const type = additionalProperties === true ? keywordTypeNodes.any : this.#getTypeFromSchema(additionalProperties);
|
140
140
|
if (type) {
|
141
141
|
members.push(parser.createIndexSignature(type));
|
142
142
|
}
|
@@ -146,7 +146,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
146
146
|
/**
|
147
147
|
* Create a type alias for the schema referenced by the given ReferenceObject
|
148
148
|
*/
|
149
|
-
getRefAlias(obj, baseName) {
|
149
|
+
#getRefAlias(obj, baseName) {
|
150
150
|
const { $ref } = obj;
|
151
151
|
let ref = this.refs[$ref];
|
152
152
|
if (ref) {
|
@@ -164,26 +164,26 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
164
164
|
* This is the very core of the OpenAPI to TS conversion - it takes a
|
165
165
|
* schema and returns the appropriate type.
|
166
166
|
*/
|
167
|
-
getBaseTypeFromSchema(schema, baseName) {
|
167
|
+
#getBaseTypeFromSchema(schema, baseName) {
|
168
168
|
if (!schema) {
|
169
169
|
return keywordTypeNodes.any;
|
170
170
|
}
|
171
171
|
if (swagger.isReference(schema)) {
|
172
|
-
return this
|
172
|
+
return this.#getRefAlias(schema, baseName);
|
173
173
|
}
|
174
174
|
if (schema.oneOf) {
|
175
175
|
const schemaWithoutOneOf = { ...schema, oneOf: void 0 };
|
176
176
|
const union = parser.createUnionDeclaration({
|
177
177
|
withParentheses: true,
|
178
178
|
nodes: schema.oneOf.map((item) => {
|
179
|
-
return this
|
179
|
+
return this.#getBaseTypeFromSchema(item);
|
180
180
|
}).filter((item) => {
|
181
181
|
return item && item !== keywordTypeNodes.any;
|
182
182
|
})
|
183
183
|
});
|
184
184
|
if (schemaWithoutOneOf.properties) {
|
185
185
|
return parser.createIntersectionDeclaration({
|
186
|
-
nodes: [this
|
186
|
+
nodes: [this.#getBaseTypeFromSchema(schemaWithoutOneOf, baseName), union].filter(Boolean)
|
187
187
|
});
|
188
188
|
}
|
189
189
|
return union;
|
@@ -193,14 +193,14 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
193
193
|
const union = parser.createUnionDeclaration({
|
194
194
|
withParentheses: true,
|
195
195
|
nodes: schema.anyOf.map((item) => {
|
196
|
-
return this
|
196
|
+
return this.#getBaseTypeFromSchema(item);
|
197
197
|
}).filter((item) => {
|
198
198
|
return item && item !== keywordTypeNodes.any;
|
199
199
|
})
|
200
200
|
});
|
201
201
|
if (schemaWithoutAnyOf.properties) {
|
202
202
|
return parser.createIntersectionDeclaration({
|
203
|
-
nodes: [this
|
203
|
+
nodes: [this.#getBaseTypeFromSchema(schemaWithoutAnyOf, baseName), union].filter(Boolean)
|
204
204
|
});
|
205
205
|
}
|
206
206
|
return union;
|
@@ -210,14 +210,14 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
210
210
|
const and = parser.createIntersectionDeclaration({
|
211
211
|
withParentheses: true,
|
212
212
|
nodes: schema.allOf.map((item) => {
|
213
|
-
return this
|
213
|
+
return this.#getBaseTypeFromSchema(item);
|
214
214
|
}).filter((item) => {
|
215
215
|
return item && item !== keywordTypeNodes.any;
|
216
216
|
})
|
217
217
|
});
|
218
218
|
if (schemaWithoutAllOf.properties) {
|
219
219
|
return parser.createIntersectionDeclaration({
|
220
|
-
nodes: [this
|
220
|
+
nodes: [this.#getBaseTypeFromSchema(schemaWithoutAllOf, baseName), and].filter(Boolean)
|
221
221
|
});
|
222
222
|
}
|
223
223
|
return and;
|
@@ -248,7 +248,7 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
248
248
|
});
|
249
249
|
}
|
250
250
|
if ("items" in schema) {
|
251
|
-
const node = this
|
251
|
+
const node = this.#getTypeFromSchema(schema.items, baseName);
|
252
252
|
if (node) {
|
253
253
|
return factory2.createArrayTypeNode(node);
|
254
254
|
}
|
@@ -257,19 +257,19 @@ var TypeGenerator = class _TypeGenerator extends core.SchemaGenerator {
|
|
257
257
|
const prefixItems = schema.prefixItems;
|
258
258
|
return parser.createTupleDeclaration({
|
259
259
|
nodes: prefixItems.map((item) => {
|
260
|
-
return this
|
260
|
+
return this.#getBaseTypeFromSchema(item, void 0);
|
261
261
|
})
|
262
262
|
});
|
263
263
|
}
|
264
264
|
if (schema.properties || schema.additionalProperties) {
|
265
|
-
return this
|
265
|
+
return this.#getTypeFromProperties(schema, baseName);
|
266
266
|
}
|
267
267
|
if (schema.type) {
|
268
268
|
if (Array.isArray(schema.type)) {
|
269
269
|
const [type, nullable] = schema.type;
|
270
270
|
return parser.createUnionDeclaration({
|
271
271
|
nodes: [
|
272
|
-
this
|
272
|
+
this.#getBaseTypeFromSchema(
|
273
273
|
{
|
274
274
|
...schema,
|
275
275
|
type
|
@@ -305,10 +305,12 @@ function refsSorter(a, b) {
|
|
305
305
|
return 0;
|
306
306
|
}
|
307
307
|
var TypeBuilder = class extends swagger.OasBuilder {
|
308
|
-
configure(
|
309
|
-
|
310
|
-
|
311
|
-
|
308
|
+
configure(options) {
|
309
|
+
if (options) {
|
310
|
+
this.options = options;
|
311
|
+
}
|
312
|
+
if (this.options.fileResolver) {
|
313
|
+
this.options.withImports = true;
|
312
314
|
}
|
313
315
|
return this;
|
314
316
|
}
|
@@ -316,11 +318,11 @@ var TypeBuilder = class extends swagger.OasBuilder {
|
|
316
318
|
const codes = [];
|
317
319
|
const generated = this.items.filter((operationSchema) => name ? operationSchema.name === name : true).sort(core.nameSorter).map((operationSchema) => {
|
318
320
|
const generator = new TypeGenerator({
|
319
|
-
withJSDocs: this.
|
320
|
-
resolveName: this.
|
321
|
-
enumType: this.
|
322
|
-
dateType: this.
|
323
|
-
optionalType: this.
|
321
|
+
withJSDocs: this.options.withJSDocs,
|
322
|
+
resolveName: this.options.resolveName,
|
323
|
+
enumType: this.options.enumType,
|
324
|
+
dateType: this.options.dateType,
|
325
|
+
optionalType: this.options.optionalType
|
324
326
|
});
|
325
327
|
const sources = generator.build({
|
326
328
|
schema: operationSchema.schema,
|
@@ -339,8 +341,8 @@ var TypeBuilder = class extends swagger.OasBuilder {
|
|
339
341
|
generated.forEach((item) => {
|
340
342
|
codes.push(parser.print(item.sources));
|
341
343
|
});
|
342
|
-
if (this.
|
343
|
-
const importsGenerator = new swagger.ImportsGenerator({ fileResolver: this.
|
344
|
+
if (this.options.withImports) {
|
345
|
+
const importsGenerator = new swagger.ImportsGenerator({ fileResolver: this.options.fileResolver });
|
344
346
|
const importMeta = importsGenerator.build(generated.map((item) => item.import));
|
345
347
|
if (importMeta) {
|
346
348
|
const nodes = importMeta.map((item) => {
|
@@ -358,7 +360,7 @@ var TypeBuilder = class extends swagger.OasBuilder {
|
|
358
360
|
};
|
359
361
|
var OperationGenerator = class extends swagger.OperationGenerator {
|
360
362
|
resolve(operation) {
|
361
|
-
const { pluginManager } = this.
|
363
|
+
const { pluginManager } = this.context;
|
362
364
|
return swagger.resolve({
|
363
365
|
operation,
|
364
366
|
resolveName: pluginManager.resolveName,
|
@@ -369,8 +371,9 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
369
371
|
async all() {
|
370
372
|
return null;
|
371
373
|
}
|
372
|
-
async get(operation, schemas) {
|
373
|
-
const {
|
374
|
+
async get(operation, schemas, options) {
|
375
|
+
const { mode, enumType, dateType, optionalType } = options;
|
376
|
+
const { pluginManager } = this.context;
|
374
377
|
const type = this.resolve(operation);
|
375
378
|
const fileResolver = (name) => {
|
376
379
|
const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } });
|
@@ -380,14 +383,14 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
380
383
|
});
|
381
384
|
return core.getRelativePath(root, resolvedTypeId);
|
382
385
|
};
|
383
|
-
const source = new TypeBuilder(
|
386
|
+
const source = new TypeBuilder({
|
384
387
|
fileResolver: mode === "file" ? void 0 : fileResolver,
|
385
388
|
withJSDocs: true,
|
386
389
|
resolveName: pluginManager.resolveName,
|
387
390
|
enumType,
|
388
391
|
optionalType,
|
389
392
|
dateType
|
390
|
-
}).print();
|
393
|
+
}).add(schemas.pathParams).add(schemas.queryParams).add(schemas.headerParams).add(schemas.response).add(schemas.errors).configure().print();
|
391
394
|
return {
|
392
395
|
path: type.path,
|
393
396
|
baseName: type.baseName,
|
@@ -398,8 +401,9 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
398
401
|
}
|
399
402
|
};
|
400
403
|
}
|
401
|
-
async post(operation, schemas) {
|
402
|
-
const {
|
404
|
+
async post(operation, schemas, options) {
|
405
|
+
const { mode, enumType, dateType, optionalType } = options;
|
406
|
+
const { pluginManager } = this.context;
|
403
407
|
const type = this.resolve(operation);
|
404
408
|
const fileResolver = (name) => {
|
405
409
|
const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } });
|
@@ -409,14 +413,14 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
409
413
|
});
|
410
414
|
return core.getRelativePath(root, resolvedTypeId);
|
411
415
|
};
|
412
|
-
const source = new TypeBuilder(
|
416
|
+
const source = new TypeBuilder({
|
413
417
|
fileResolver: mode === "file" ? void 0 : fileResolver,
|
414
418
|
withJSDocs: true,
|
415
419
|
resolveName: pluginManager.resolveName,
|
416
420
|
enumType,
|
417
421
|
optionalType,
|
418
422
|
dateType
|
419
|
-
}).print();
|
423
|
+
}).add(schemas.pathParams).add(schemas.queryParams).add(schemas.headerParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure().print();
|
420
424
|
return {
|
421
425
|
path: type.path,
|
422
426
|
baseName: type.baseName,
|
@@ -427,21 +431,30 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
427
431
|
}
|
428
432
|
};
|
429
433
|
}
|
430
|
-
async put(operation, schemas) {
|
431
|
-
return this.post(operation, schemas);
|
434
|
+
async put(operation, schemas, options) {
|
435
|
+
return this.post(operation, schemas, options);
|
432
436
|
}
|
433
|
-
async patch(operation, schemas) {
|
434
|
-
return this.post(operation, schemas);
|
437
|
+
async patch(operation, schemas, options) {
|
438
|
+
return this.post(operation, schemas, options);
|
435
439
|
}
|
436
|
-
async delete(operation, schemas) {
|
437
|
-
return this.post(operation, schemas);
|
440
|
+
async delete(operation, schemas, options) {
|
441
|
+
return this.post(operation, schemas, options);
|
438
442
|
}
|
439
443
|
};
|
440
444
|
|
441
445
|
// src/plugin.ts
|
442
446
|
var pluginName = "swagger-ts";
|
443
447
|
var definePlugin = core.createPlugin((options) => {
|
444
|
-
const {
|
448
|
+
const {
|
449
|
+
output = "types",
|
450
|
+
groupBy,
|
451
|
+
skipBy = [],
|
452
|
+
overrideBy = [],
|
453
|
+
enumType = "asConst",
|
454
|
+
dateType = "string",
|
455
|
+
optionalType = "questionToken",
|
456
|
+
transformers = {}
|
457
|
+
} = options;
|
445
458
|
const template = groupBy?.output ? groupBy.output : `${output}/{{tag}}Controller`;
|
446
459
|
let pluginsOptions;
|
447
460
|
return {
|
@@ -481,7 +494,7 @@ var definePlugin = core.createPlugin((options) => {
|
|
481
494
|
const root = pathParser__default.default.resolve(this.config.root, this.config.output.path);
|
482
495
|
const mode = core.getPathMode(pathParser__default.default.resolve(root, output));
|
483
496
|
if (mode === "directory") {
|
484
|
-
const builder = await new TypeBuilder(
|
497
|
+
const builder = await new TypeBuilder({
|
485
498
|
resolveName: (params) => this.resolveName({ pluginName, ...params }),
|
486
499
|
fileResolver: (name) => {
|
487
500
|
const resolvedTypeId = this.resolvePath({
|
@@ -495,7 +508,7 @@ var definePlugin = core.createPlugin((options) => {
|
|
495
508
|
enumType,
|
496
509
|
dateType,
|
497
510
|
optionalType
|
498
|
-
});
|
511
|
+
}).configure();
|
499
512
|
Object.entries(schemas).forEach(([name, schema]) => {
|
500
513
|
return builder.add({
|
501
514
|
schema,
|
@@ -520,13 +533,13 @@ var definePlugin = core.createPlugin((options) => {
|
|
520
533
|
await Promise.all(promises);
|
521
534
|
}
|
522
535
|
if (mode === "file") {
|
523
|
-
const builder = new TypeBuilder(
|
536
|
+
const builder = new TypeBuilder({
|
524
537
|
resolveName: (params) => this.resolveName({ pluginName, ...params }),
|
525
538
|
withJSDocs: true,
|
526
539
|
enumType,
|
527
540
|
dateType,
|
528
541
|
optionalType
|
529
|
-
});
|
542
|
+
}).configure();
|
530
543
|
Object.entries(schemas).forEach(([name, schema]) => {
|
531
544
|
return builder.add({
|
532
545
|
schema,
|
@@ -546,16 +559,21 @@ var definePlugin = core.createPlugin((options) => {
|
|
546
559
|
}
|
547
560
|
});
|
548
561
|
}
|
549
|
-
const operationGenerator = new OperationGenerator(
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
562
|
+
const operationGenerator = new OperationGenerator(
|
563
|
+
{
|
564
|
+
mode,
|
565
|
+
enumType,
|
566
|
+
dateType,
|
567
|
+
optionalType
|
568
|
+
},
|
569
|
+
{
|
570
|
+
oas,
|
571
|
+
pluginManager: this.pluginManager,
|
572
|
+
contentType: swaggerPlugin.api.contentType,
|
573
|
+
skipBy,
|
574
|
+
overrideBy
|
575
|
+
}
|
576
|
+
);
|
559
577
|
const files = await operationGenerator.build();
|
560
578
|
await this.addFile(...files);
|
561
579
|
},
|
package/dist/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/builders/TypeBuilder.ts","../src/generators/TypeGenerator.ts","../src/utils/keywordTypeNodes.ts","../src/utils/resolve.ts","../src/generators/OperationGenerator.ts","../src/hooks/useResolve.ts","../src/index.ts"],"names":["getRelativePath","camelCase","ts","factory","node","resolve","options","root"],"mappings":"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","sourcesContent":["import pathParser from 'node:path'\n\nimport { createPlugin, getDependedPlugins, getIndexes, getPathMode, getRelativePath, renderTemplate, timeout } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\n\nimport { camelCase, camelCaseTransformMerge, pascalCase, pascalCaseTransformMerge } from 'change-case'\n\nimport { TypeBuilder } from './builders/index.ts'\nimport { OperationGenerator } from './generators/index.ts'\n\nimport type { OpenAPIV3, PluginOptions as SwaggerPluginOptions } from '@kubb/swagger'\nimport type { PluginOptions } from './types.ts'\n\nexport const pluginName: PluginOptions['name'] = 'swagger-ts' as const\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const { output = 'models', groupBy, skipBy = [], enumType = 'asConst', dateType = 'string', optionalType = 'questionToken', transformers = {} } = options\n const template = groupBy?.output ? groupBy.output : `${output}/{{tag}}Controller`\n let pluginsOptions: [SwaggerPluginOptions]\n\n return {\n name: pluginName,\n options,\n kind: 'schema',\n validate(plugins) {\n pluginsOptions = getDependedPlugins<[SwaggerPluginOptions]>(plugins, [swaggerPluginName])\n\n return true\n },\n resolvePath(baseName, directory, options) {\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(root, output))\n\n if (mode === 'file') {\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 pathParser.resolve(root, output)\n }\n\n if (options?.tag && groupBy?.type === 'tag') {\n const tag = camelCase(options.tag, { delimiter: '', transform: camelCaseTransformMerge })\n\n return pathParser.resolve(root, renderTemplate(template, { tag }), baseName)\n }\n\n return pathParser.resolve(root, output, baseName)\n },\n resolveName(name) {\n const resolvedName = pascalCase(name, { delimiter: '', stripRegexp: /[^A-Z0-9$]/gi, transform: pascalCaseTransformMerge })\n\n return transformers?.name?.(resolvedName) || resolvedName\n },\n async writeFile(source, path) {\n if (!path.endsWith('.ts') || !source) {\n return\n }\n\n await this.fileManager.write(source, path)\n },\n async buildStart() {\n const [swaggerPlugin] = pluginsOptions\n\n const oas = await swaggerPlugin.api.getOas()\n\n const schemas = await swaggerPlugin.api.getSchemas()\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(root, output))\n\n if (mode === 'directory') {\n const builder = await new TypeBuilder(oas).configure({\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n fileResolver: (name) => {\n const resolvedTypeId = this.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n const root = this.resolvePath({ baseName: ``, pluginName })\n\n return getRelativePath(root, resolvedTypeId)\n },\n withJSDocs: true,\n enumType,\n dateType,\n optionalType,\n })\n Object.entries(schemas).forEach(([name, schema]: [string, OpenAPIV3.SchemaObject]) => {\n // generate and pass through new code back to the core so it can be write to that file\n return builder.add({\n schema,\n name,\n })\n })\n\n const mapFolderSchema = async ([name]: [string, OpenAPIV3.SchemaObject]) => {\n const path = this.resolvePath({ baseName: `${this.resolveName({ name, pluginName })}.ts`, pluginName })\n\n if (!path) {\n return null\n }\n\n return this.addFile({\n path,\n baseName: `${this.resolveName({ name, pluginName })}.ts`,\n source: builder.print(name),\n meta: {\n pluginName,\n },\n })\n }\n\n const promises = Object.entries(schemas).map(mapFolderSchema)\n\n await Promise.all(promises)\n }\n\n if (mode === 'file') {\n // outside the loop because we need to add files to just one instance to have the correct sorting, see refsSorter\n const builder = new TypeBuilder(oas).configure({\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n withJSDocs: true,\n enumType,\n dateType,\n optionalType,\n })\n Object.entries(schemas).forEach(([name, schema]: [string, OpenAPIV3.SchemaObject]) => {\n // generate and pass through new code back to the core so it can be write to that file\n return builder.add({\n schema,\n name,\n })\n })\n\n const path = this.resolvePath({ baseName: '', pluginName })\n if (!path) {\n return\n }\n\n await this.addFile({\n path,\n baseName: `${this.resolveName({ name: output, pluginName })}.ts`,\n source: builder.print(),\n meta: {\n pluginName,\n },\n })\n }\n\n const operationGenerator = new OperationGenerator({\n oas,\n pluginManager: this.pluginManager,\n contentType: swaggerPlugin.api.contentType,\n skipBy,\n mode,\n enumType,\n dateType,\n optionalType,\n })\n\n const files = await operationGenerator.build()\n await this.addFile(...files)\n },\n async buildEnd() {\n if (this.config.output.write === false) {\n return\n }\n\n while (this.fileManager.isExecuting) {\n await timeout(100)\n }\n\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const files = await getIndexes(root, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n\n if (files) {\n await this.addFile(...files)\n }\n },\n }\n})\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport { combineCodes, nameSorter } from '@kubb/core'\nimport { createImportDeclaration, print } from '@kubb/parser'\nimport { ImportsGenerator, OasBuilder } from '@kubb/swagger'\n\nimport { TypeGenerator } from '../generators/TypeGenerator.ts'\n\nimport type { PluginContext } from '@kubb/core'\nimport type { FileResolver, Refs } from '@kubb/swagger'\nimport type ts from 'typescript'\n\ntype Generated = { import: { refs: Refs; name: string }; sources: ts.Node[] }\ntype Config = {\n resolveName: PluginContext['resolveName']\n fileResolver?: FileResolver\n withJSDocs?: boolean\n withImports?: boolean\n enumType: 'enum' | 'asConst' | 'asPascalConst'\n dateType: 'string' | 'date'\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n}\n\n// TODO create another function that sort based on the refs(first the ones without refs)\nfunction refsSorter(a: Generated, b: Generated) {\n if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {\n return -1\n }\n if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {\n return 1\n }\n return 0\n}\n\nexport class TypeBuilder extends OasBuilder<Config> {\n configure(config: Config) {\n this.config = config\n\n if (this.config.fileResolver) {\n this.config.withImports = true\n }\n\n return this\n }\n\n print(name?: string): string {\n const codes: string[] = []\n\n const generated = this.items\n .filter((operationSchema) => (name ? operationSchema.name === name : true))\n .sort(nameSorter)\n .map((operationSchema) => {\n const generator = new TypeGenerator({\n withJSDocs: this.config.withJSDocs,\n resolveName: this.config.resolveName,\n enumType: this.config.enumType,\n dateType: this.config.dateType,\n optionalType: this.config.optionalType,\n })\n const sources = generator.build({\n schema: operationSchema.schema,\n baseName: operationSchema.name,\n description: operationSchema.description,\n keysToOmit: operationSchema.keysToOmit,\n })\n\n return {\n import: {\n refs: generator.refs,\n name: operationSchema.name,\n },\n sources,\n }\n })\n .sort(refsSorter)\n\n generated.forEach((item) => {\n codes.push(print(item.sources))\n })\n\n if (this.config.withImports) {\n const importsGenerator = new ImportsGenerator({ fileResolver: this.config.fileResolver })\n const importMeta = importsGenerator.build(generated.map((item) => item.import))\n\n if (importMeta) {\n const nodes = importMeta.map((item) => {\n return createImportDeclaration({\n name: [{ propertyName: item.ref.propertyName }],\n path: item.path,\n isTypeOnly: true,\n })\n })\n\n codes.unshift(print(nodes))\n }\n }\n\n return combineCodes(codes)\n }\n}\n","import { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createOmitDeclaration,\n createPropertySignature,\n createTupleDeclaration,\n createTypeAliasDeclaration,\n createUnionDeclaration,\n modifiers,\n} from '@kubb/parser'\nimport { isReference } from '@kubb/swagger'\n\nimport { camelCase } from 'change-case'\nimport ts from 'typescript'\n\nimport { pluginName } from '../plugin.ts'\nimport { keywordTypeNodes } from '../utils/index.ts'\n\nimport type { PluginContext } from '@kubb/core'\nimport type { ArrayTwoOrMore } from '@kubb/parser'\nimport type { OpenAPIV3, Refs } from '@kubb/swagger'\nimport type { Options as CaseOptions } from 'change-case'\n\nconst { factory } = ts\n\n// based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n\ntype Options = {\n withJSDocs?: boolean\n resolveName: PluginContext['resolveName']\n enumType: 'enum' | 'asConst' | 'asPascalConst'\n dateType: 'string' | 'date'\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n}\nexport class TypeGenerator extends SchemaGenerator<Options, OpenAPIV3.SchemaObject, ts.Node[]> {\n // Collect the types of all referenced schemas so we can export them later\n public static usedEnumNames: Record<string, number> = {}\n\n refs: Refs = {}\n\n extraNodes: ts.Node[] = []\n\n aliases: ts.TypeAliasDeclaration[] = []\n\n // Keep track of already used type aliases\n usedAliasNames: Record<string, number> = {}\n\n caseOptions: CaseOptions = {\n delimiter: '',\n stripRegexp: /[^A-Z0-9$]/gi,\n }\n\n constructor(\n options: Options = { withJSDocs: true, resolveName: ({ name }) => name, enumType: 'asConst', dateType: 'string', optionalType: 'questionToken' },\n ) {\n super(options)\n\n return this\n }\n\n build({\n schema,\n baseName,\n description,\n keysToOmit,\n }: {\n schema: OpenAPIV3.SchemaObject\n baseName: string\n description?: string\n keysToOmit?: string[]\n }): ts.Node[] {\n const nodes: ts.Node[] = []\n const type = this.getTypeFromSchema(schema, baseName)\n\n if (!type) {\n return this.extraNodes\n }\n\n const node = createTypeAliasDeclaration({\n modifiers: [modifiers.export],\n name: this.options.resolveName({ name: baseName, pluginName }) || baseName,\n type: keysToOmit?.length ? createOmitDeclaration({ keys: keysToOmit, type, nonNullable: true }) : type,\n })\n\n if (description) {\n nodes.push(\n appendJSDocToNode({\n node,\n comments: [`@description ${description}`],\n }),\n )\n } else {\n nodes.push(node)\n }\n\n // filter out if the export name is the same as one that we already defined in extraNodes(see enum)\n const filterdNodes = nodes.filter(\n (node: ts.Node) =>\n !this.extraNodes.some(\n (extraNode: ts.Node) => (extraNode as ts.TypeAliasDeclaration)?.name?.escapedText === (node as ts.TypeAliasDeclaration)?.name?.escapedText,\n ),\n )\n\n return [...this.extraNodes, ...filterdNodes]\n }\n\n /**\n * Creates a type node from a given schema.\n * Delegates to getBaseTypeFromSchema internally and\n * optionally adds a union with null.\n */\n private getTypeFromSchema(schema?: OpenAPIV3.SchemaObject, name?: string): ts.TypeNode | null {\n const type = this.getBaseTypeFromSchema(schema, name)\n\n if (!type) {\n return null\n }\n\n if (schema && !schema.nullable) {\n return type\n }\n\n return createUnionDeclaration({ nodes: [type, keywordTypeNodes.null] })\n }\n\n /**\n * Recursively creates a type literal with the given props.\n */\n private getTypeFromProperties(baseSchema?: OpenAPIV3.SchemaObject, baseName?: string) {\n const { optionalType } = this.options\n const properties = baseSchema?.properties || {}\n const required = baseSchema?.required\n const additionalProperties = baseSchema?.additionalProperties\n\n const members: Array<ts.TypeElement | null> = Object.keys(properties).map((name) => {\n const schema = properties[name] as OpenAPIV3.SchemaObject\n\n const isRequired = required && required.includes(name)\n let type = this.getTypeFromSchema(schema, this.options.resolveName({ name: `${baseName || ''} ${name}`, pluginName }))\n\n if (!type) {\n return null\n }\n\n if (!isRequired && ['undefined', 'questionTokenAndUndefined'].includes(optionalType)) {\n type = createUnionDeclaration({ nodes: [type, keywordTypeNodes.undefined] })\n }\n const propertySignature = createPropertySignature({\n questionToken: ['questionToken', 'questionTokenAndUndefined'].includes(optionalType) && !isRequired,\n name,\n type: type as ts.TypeNode,\n readOnly: schema.readOnly,\n })\n if (this.options.withJSDocs) {\n return appendJSDocToNode({\n node: propertySignature,\n comments: [\n schema.description ? `@description ${schema.description}` : undefined,\n schema.type ? `@type ${schema.type}${isRequired ? '' : ' | undefined'} ${schema.format || ''}` : undefined,\n schema.example ? `@example ${schema.example as string}` : undefined,\n schema.deprecated ? `@deprecated` : undefined,\n schema.default !== undefined && typeof schema.default === 'string' ? `@default '${schema.default}'` : undefined,\n schema.default !== undefined && typeof schema.default !== 'string' ? `@default ${schema.default as string}` : undefined,\n ].filter(Boolean),\n })\n }\n\n return propertySignature\n })\n if (additionalProperties) {\n const type = additionalProperties === true ? keywordTypeNodes.any : this.getTypeFromSchema(additionalProperties as OpenAPIV3.SchemaObject)\n\n if (type) {\n members.push(createIndexSignature(type))\n }\n }\n return factory.createTypeLiteralNode(members.filter(Boolean))\n }\n\n /**\n * Create a type alias for the schema referenced by the given ReferenceObject\n */\n private getRefAlias(obj: OpenAPIV3.ReferenceObject, baseName?: string) {\n const { $ref } = obj\n let ref = this.refs[$ref]\n\n if (ref) {\n return factory.createTypeReferenceNode(ref.propertyName, undefined)\n }\n\n const originalName = getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames)\n const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName\n\n ref = this.refs[$ref] = {\n propertyName,\n originalName,\n }\n\n return factory.createTypeReferenceNode(ref.propertyName, undefined)\n }\n\n /**\n * This is the very core of the OpenAPI to TS conversion - it takes a\n * schema and returns the appropriate type.\n */\n private getBaseTypeFromSchema(schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined, baseName?: string): ts.TypeNode | null {\n if (!schema) {\n return keywordTypeNodes.any\n }\n\n if (isReference(schema)) {\n return this.getRefAlias(schema, baseName)\n }\n\n if (schema.oneOf) {\n // union\n const schemaWithoutOneOf = { ...schema, oneOf: undefined }\n\n const union = createUnionDeclaration({\n withParentheses: true,\n nodes: schema.oneOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutOneOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.getBaseTypeFromSchema(schemaWithoutOneOf, baseName), union].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return union\n }\n\n if (schema.anyOf) {\n const schemaWithoutAnyOf = { ...schema, anyOf: undefined }\n\n const union = createUnionDeclaration({\n withParentheses: true,\n nodes: schema.anyOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutAnyOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.getBaseTypeFromSchema(schemaWithoutAnyOf, baseName), union].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return union\n }\n if (schema.allOf) {\n // intersection/add\n const schemaWithoutAllOf = { ...schema, allOf: undefined }\n\n const and = createIntersectionDeclaration({\n withParentheses: true,\n nodes: schema.allOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutAllOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.getBaseTypeFromSchema(schemaWithoutAllOf, baseName), and].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return and\n }\n\n /**\n * Enum will be defined outside the baseType(hints the baseName check)\n */\n if (schema.enum && baseName) {\n const enumName = getUniqueName(baseName, TypeGenerator.usedEnumNames)\n\n let enums: [key: string, value: string | number][] = [...new Set(schema.enum)].map((key) => [key, key])\n\n if ('x-enumNames' in schema) {\n enums = [...new Set(schema['x-enumNames'] as string[])].map((key: string, index) => {\n return [key, schema.enum?.[index]]\n })\n }\n\n this.extraNodes.push(\n ...createEnumDeclaration({\n name: camelCase(enumName, this.caseOptions),\n typeName: this.options.resolveName({ name: enumName, pluginName }),\n enums,\n type: this.options.enumType,\n }),\n )\n return factory.createTypeReferenceNode(this.options.resolveName({ name: enumName, pluginName }), undefined)\n }\n\n if (schema.enum) {\n return createUnionDeclaration({\n nodes: schema.enum.map((name: string) => {\n return factory.createLiteralTypeNode(typeof name === 'number' ? factory.createNumericLiteral(name) : factory.createStringLiteral(`${name}`))\n }) as unknown as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if ('items' in schema) {\n // items -> array\n const node = this.getTypeFromSchema(schema.items as OpenAPIV3.SchemaObject, baseName)\n if (node) {\n return factory.createArrayTypeNode(node)\n }\n }\n /**\n * OpenAPI 3.1\n * @link https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation\n */\n if ('prefixItems' in schema) {\n const prefixItems = schema.prefixItems as OpenAPIV3.SchemaObject[]\n\n return createTupleDeclaration({\n nodes: prefixItems.map((item) => {\n // no baseType so we can fall back on an union when using enum\n return this.getBaseTypeFromSchema(item, undefined)\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if (schema.properties || schema.additionalProperties) {\n // properties -> literal type\n return this.getTypeFromProperties(schema, baseName)\n }\n\n if (schema.type) {\n if (Array.isArray(schema.type)) {\n // OPENAPI v3.1.0: https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0\n const [type, nullable] = schema.type as Array<OpenAPIV3.NonArraySchemaObjectType>\n\n return createUnionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(\n {\n ...schema,\n type,\n },\n baseName,\n ),\n nullable ? factory.createLiteralTypeNode(factory.createNull()) : undefined,\n ].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if (this.options.dateType === 'date' && ['date', 'date-time'].some((item) => item === schema.format)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Date'))\n }\n\n // string, boolean, null, number\n if (schema.type in keywordTypeNodes) {\n return keywordTypeNodes[schema.type as keyof typeof keywordTypeNodes]\n }\n }\n\n if (schema.format === 'binary') {\n return factory.createTypeReferenceNode('Blob', [])\n }\n\n return keywordTypeNodes.any\n }\n}\n","import ts from 'typescript'\n\nconst { factory } = ts\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\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} as const\n","import { resolve as swaggerResolve } from '@kubb/swagger'\n\nimport { pluginName } from '../plugin.ts'\n\nimport type { ResolveProps, Resolver } from '@kubb/swagger'\n\ntype Props = ResolveProps & { pluginName?: never }\n\nexport function resolve(props: Props): Resolver {\n return swaggerResolve({ ...props, pluginName })\n}\n","import { getRelativePath } from '@kubb/core'\nimport { OperationGenerator as Generator, resolve } from '@kubb/swagger'\n\nimport { TypeBuilder } from '../builders/index.ts'\nimport { pluginName } from '../plugin.ts'\n\nimport type { KubbFile } from '@kubb/core'\nimport type { FileResolver, Operation, OperationSchemas, Resolver } from '@kubb/swagger'\nimport type { FileMeta, Options as PluginOptions } from '../types.ts'\n\ntype Options = {\n mode: KubbFile.Mode\n enumType: NonNullable<PluginOptions['enumType']>\n dateType: NonNullable<PluginOptions['dateType']>\n optionalType: NonNullable<PluginOptions['optionalType']>\n}\n\nexport class OperationGenerator extends Generator<Options> {\n resolve(operation: Operation): Resolver {\n const { pluginManager } = this.options\n\n return resolve({\n operation,\n resolveName: pluginManager.resolveName,\n resolvePath: pluginManager.resolvePath,\n pluginName,\n })\n }\n\n async all(): Promise<KubbFile.File | null> {\n return null\n }\n\n async get(operation: Operation, schemas: OperationSchemas): Promise<KubbFile.File<FileMeta> | null> {\n const { pluginManager, mode, oas, enumType, dateType, optionalType } = this.options\n\n const type = this.resolve(operation)\n\n const fileResolver: FileResolver = (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = pluginManager.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n return getRelativePath(root, resolvedTypeId)\n }\n\n const source = new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.headerParams)\n .add(schemas.response)\n .add(schemas.errors)\n .configure({\n fileResolver: mode === 'file' ? undefined : fileResolver,\n withJSDocs: true,\n resolveName: pluginManager.resolveName,\n enumType,\n optionalType,\n dateType,\n })\n .print()\n\n return {\n path: type.path,\n baseName: type.baseName,\n source,\n meta: {\n pluginName,\n tag: operation.getTags()[0]?.name,\n },\n }\n }\n\n async post(operation: Operation, schemas: OperationSchemas): Promise<KubbFile.File<FileMeta> | null> {\n const { pluginManager, mode, oas, enumType, dateType, optionalType } = this.options\n\n const type = this.resolve(operation)\n\n const fileResolver: FileResolver = (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = pluginManager.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n return getRelativePath(root, resolvedTypeId)\n }\n\n const source = new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.headerParams)\n .add(schemas.request)\n .add(schemas.response)\n .add(schemas.errors)\n .configure({\n fileResolver: mode === 'file' ? undefined : fileResolver,\n withJSDocs: true,\n resolveName: pluginManager.resolveName,\n enumType,\n optionalType,\n dateType,\n })\n .print()\n\n return {\n path: type.path,\n baseName: type.baseName,\n source,\n meta: {\n pluginName,\n tag: operation.getTags()[0]?.name,\n },\n }\n }\n\n async put(operation: Operation, schemas: OperationSchemas): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas)\n }\n async patch(operation: Operation, schemas: OperationSchemas): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas)\n }\n async delete(operation: Operation, schemas: OperationSchemas): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas)\n }\n}\n","import { useResolve as useResolveSwagger } from '@kubb/swagger'\n\nimport { pluginName } from '../plugin.ts'\n\nimport type { Resolver, UseResolveProps } from '@kubb/swagger'\n\ntype Props = UseResolveProps & { pluginName?: never }\n\nexport function useResolve(props: Props = {}): Resolver {\n return useResolveSwagger({ pluginName, ...props })\n}\n","import { definePlugin } from './plugin.ts'\n\nexport * from './plugin.ts'\nexport * from './types.ts'\n\nexport * from './generators/index.ts'\nexport * from './builders/index.ts'\nexport * from './utils/index.ts'\nexport * from './hooks/index.ts'\n\nexport default definePlugin\n"]}
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/builders/TypeBuilder.ts","../src/generators/TypeGenerator.ts","../src/utils/keywordTypeNodes.ts","../src/utils/resolve.ts","../src/generators/OperationGenerator.ts","../src/hooks/useResolve.ts","../src/index.ts"],"names":["getRelativePath","camelCase","ts","factory","node","resolve","options","root"],"mappings":"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","sourcesContent":["import pathParser from 'node:path'\n\nimport { createPlugin, getDependedPlugins, getIndexes, getPathMode, getRelativePath, renderTemplate, timeout } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\n\nimport { camelCase, camelCaseTransformMerge, pascalCase, pascalCaseTransformMerge } from 'change-case'\n\nimport { TypeBuilder } from './builders/index.ts'\nimport { OperationGenerator } from './generators/index.ts'\n\nimport type { OpenAPIV3, PluginOptions as SwaggerPluginOptions } from '@kubb/swagger'\nimport type { PluginOptions } from './types.ts'\n\nexport const pluginName: PluginOptions['name'] = 'swagger-ts' as const\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const {\n output = 'types',\n groupBy,\n skipBy = [],\n overrideBy = [],\n enumType = 'asConst',\n dateType = 'string',\n optionalType = 'questionToken',\n transformers = {},\n } = options\n const template = groupBy?.output ? groupBy.output : `${output}/{{tag}}Controller`\n let pluginsOptions: [SwaggerPluginOptions]\n\n return {\n name: pluginName,\n options,\n kind: 'schema',\n validate(plugins) {\n pluginsOptions = getDependedPlugins<[SwaggerPluginOptions]>(plugins, [swaggerPluginName])\n\n return true\n },\n resolvePath(baseName, directory, options) {\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(root, output))\n\n if (mode === 'file') {\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 pathParser.resolve(root, output)\n }\n\n if (options?.tag && groupBy?.type === 'tag') {\n const tag = camelCase(options.tag, { delimiter: '', transform: camelCaseTransformMerge })\n\n return pathParser.resolve(root, renderTemplate(template, { tag }), baseName)\n }\n\n return pathParser.resolve(root, output, baseName)\n },\n resolveName(name) {\n const resolvedName = pascalCase(name, { delimiter: '', stripRegexp: /[^A-Z0-9$]/gi, transform: pascalCaseTransformMerge })\n\n return transformers?.name?.(resolvedName) || resolvedName\n },\n async writeFile(source, path) {\n if (!path.endsWith('.ts') || !source) {\n return\n }\n\n await this.fileManager.write(source, path)\n },\n async buildStart() {\n const [swaggerPlugin] = pluginsOptions\n\n const oas = await swaggerPlugin.api.getOas()\n\n const schemas = await swaggerPlugin.api.getSchemas()\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(root, output))\n\n if (mode === 'directory') {\n const builder = await new TypeBuilder({\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n fileResolver: (name) => {\n const resolvedTypeId = this.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n const root = this.resolvePath({ baseName: ``, pluginName })\n\n return getRelativePath(root, resolvedTypeId)\n },\n withJSDocs: true,\n enumType,\n dateType,\n optionalType,\n }).configure()\n Object.entries(schemas).forEach(([name, schema]: [string, OpenAPIV3.SchemaObject]) => {\n // generate and pass through new code back to the core so it can be write to that file\n return builder.add({\n schema,\n name,\n })\n })\n\n const mapFolderSchema = async ([name]: [string, OpenAPIV3.SchemaObject]) => {\n const path = this.resolvePath({ baseName: `${this.resolveName({ name, pluginName })}.ts`, pluginName })\n\n if (!path) {\n return null\n }\n\n return this.addFile({\n path,\n baseName: `${this.resolveName({ name, pluginName })}.ts`,\n source: builder.print(name),\n meta: {\n pluginName,\n },\n })\n }\n\n const promises = Object.entries(schemas).map(mapFolderSchema)\n\n await Promise.all(promises)\n }\n\n if (mode === 'file') {\n // outside the loop because we need to add files to just one instance to have the correct sorting, see refsSorter\n const builder = new TypeBuilder({\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n withJSDocs: true,\n enumType,\n dateType,\n optionalType,\n }).configure()\n Object.entries(schemas).forEach(([name, schema]: [string, OpenAPIV3.SchemaObject]) => {\n // generate and pass through new code back to the core so it can be write to that file\n return builder.add({\n schema,\n name,\n })\n })\n\n const path = this.resolvePath({ baseName: '', pluginName })\n if (!path) {\n return\n }\n\n await this.addFile({\n path,\n baseName: `${this.resolveName({ name: output, pluginName })}.ts`,\n source: builder.print(),\n meta: {\n pluginName,\n },\n })\n }\n\n const operationGenerator = new OperationGenerator(\n {\n mode,\n enumType,\n dateType,\n optionalType,\n },\n {\n oas,\n pluginManager: this.pluginManager,\n contentType: swaggerPlugin.api.contentType,\n skipBy,\n overrideBy,\n },\n )\n\n const files = await operationGenerator.build()\n await this.addFile(...files)\n },\n async buildEnd() {\n if (this.config.output.write === false) {\n return\n }\n\n while (this.fileManager.isExecuting) {\n await timeout(100)\n }\n\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const files = await getIndexes(root, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n\n if (files) {\n await this.addFile(...files)\n }\n },\n }\n})\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport { combineCodes, nameSorter } from '@kubb/core'\nimport { createImportDeclaration, print } from '@kubb/parser'\nimport { ImportsGenerator, OasBuilder } from '@kubb/swagger'\n\nimport { TypeGenerator } from '../generators/TypeGenerator.ts'\n\nimport type { PluginContext } from '@kubb/core'\nimport type { FileResolver, Refs } from '@kubb/swagger'\nimport type ts from 'typescript'\n\ntype Generated = { import: { refs: Refs; name: string }; sources: ts.Node[] }\ntype Options = {\n resolveName: PluginContext['resolveName']\n fileResolver?: FileResolver\n withJSDocs?: boolean\n withImports?: boolean\n enumType: 'enum' | 'asConst' | 'asPascalConst'\n dateType: 'string' | 'date'\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n}\n\n// TODO create another function that sort based on the refs(first the ones without refs)\nfunction refsSorter(a: Generated, b: Generated) {\n if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {\n return -1\n }\n if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {\n return 1\n }\n return 0\n}\n\nexport class TypeBuilder extends OasBuilder<Options, never> {\n configure(options?: Options) {\n if (options) {\n this.options = options\n }\n\n if (this.options.fileResolver) {\n this.options.withImports = true\n }\n\n return this\n }\n\n print(name?: string): string {\n const codes: string[] = []\n\n const generated = this.items\n .filter((operationSchema) => (name ? operationSchema.name === name : true))\n .sort(nameSorter)\n .map((operationSchema) => {\n const generator = new TypeGenerator({\n withJSDocs: this.options.withJSDocs,\n resolveName: this.options.resolveName,\n enumType: this.options.enumType,\n dateType: this.options.dateType,\n optionalType: this.options.optionalType,\n })\n const sources = generator.build({\n schema: operationSchema.schema,\n baseName: operationSchema.name,\n description: operationSchema.description,\n keysToOmit: operationSchema.keysToOmit,\n })\n\n return {\n import: {\n refs: generator.refs,\n name: operationSchema.name,\n },\n sources,\n }\n })\n .sort(refsSorter)\n\n generated.forEach((item) => {\n codes.push(print(item.sources))\n })\n\n if (this.options.withImports) {\n const importsGenerator = new ImportsGenerator({ fileResolver: this.options.fileResolver })\n const importMeta = importsGenerator.build(generated.map((item) => item.import))\n\n if (importMeta) {\n const nodes = importMeta.map((item) => {\n return createImportDeclaration({\n name: [{ propertyName: item.ref.propertyName }],\n path: item.path,\n isTypeOnly: true,\n })\n })\n\n codes.unshift(print(nodes))\n }\n }\n\n return combineCodes(codes)\n }\n}\n","import { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createOmitDeclaration,\n createPropertySignature,\n createTupleDeclaration,\n createTypeAliasDeclaration,\n createUnionDeclaration,\n modifiers,\n} from '@kubb/parser'\nimport { isReference } from '@kubb/swagger'\n\nimport { camelCase } from 'change-case'\nimport ts from 'typescript'\n\nimport { pluginName } from '../plugin.ts'\nimport { keywordTypeNodes } from '../utils/index.ts'\n\nimport type { PluginContext } from '@kubb/core'\nimport type { ArrayTwoOrMore } from '@kubb/parser'\nimport type { OpenAPIV3, Refs } from '@kubb/swagger'\nimport type { Options as CaseOptions } from 'change-case'\n\nconst { factory } = ts\n\n// based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n\ntype Options = {\n withJSDocs?: boolean\n resolveName: PluginContext['resolveName']\n enumType: 'enum' | 'asConst' | 'asPascalConst'\n dateType: 'string' | 'date'\n optionalType: 'questionToken' | 'undefined' | 'questionTokenAndUndefined'\n}\nexport class TypeGenerator extends SchemaGenerator<Options, OpenAPIV3.SchemaObject, ts.Node[]> {\n // Collect the types of all referenced schemas so we can export them later\n public static usedEnumNames: Record<string, number> = {}\n\n refs: Refs = {}\n\n extraNodes: ts.Node[] = []\n\n aliases: ts.TypeAliasDeclaration[] = []\n\n // Keep track of already used type aliases\n usedAliasNames: Record<string, number> = {}\n\n caseOptions: CaseOptions = {\n delimiter: '',\n stripRegexp: /[^A-Z0-9$]/gi,\n }\n\n constructor(\n options: Options = { withJSDocs: true, resolveName: ({ name }) => name, enumType: 'asConst', dateType: 'string', optionalType: 'questionToken' },\n ) {\n super(options)\n\n return this\n }\n\n build({\n schema,\n baseName,\n description,\n keysToOmit,\n }: {\n schema: OpenAPIV3.SchemaObject\n baseName: string\n description?: string\n keysToOmit?: string[]\n }): ts.Node[] {\n const nodes: ts.Node[] = []\n const type = this.#getTypeFromSchema(schema, baseName)\n\n if (!type) {\n return this.extraNodes\n }\n\n const node = createTypeAliasDeclaration({\n modifiers: [modifiers.export],\n name: this.options.resolveName({ name: baseName, pluginName }) || baseName,\n type: keysToOmit?.length ? createOmitDeclaration({ keys: keysToOmit, type, nonNullable: true }) : type,\n })\n\n if (description) {\n nodes.push(\n appendJSDocToNode({\n node,\n comments: [`@description ${description}`],\n }),\n )\n } else {\n nodes.push(node)\n }\n\n // filter out if the export name is the same as one that we already defined in extraNodes(see enum)\n const filterdNodes = nodes.filter(\n (node: ts.Node) =>\n !this.extraNodes.some(\n (extraNode: ts.Node) => (extraNode as ts.TypeAliasDeclaration)?.name?.escapedText === (node as ts.TypeAliasDeclaration)?.name?.escapedText,\n ),\n )\n\n return [...this.extraNodes, ...filterdNodes]\n }\n\n /**\n * Creates a type node from a given schema.\n * Delegates to getBaseTypeFromSchema internally and\n * optionally adds a union with null.\n */\n #getTypeFromSchema(schema?: OpenAPIV3.SchemaObject, name?: string): ts.TypeNode | null {\n const type = this.#getBaseTypeFromSchema(schema, name)\n\n if (!type) {\n return null\n }\n\n if (schema && !schema.nullable) {\n return type\n }\n\n return createUnionDeclaration({ nodes: [type, keywordTypeNodes.null] })\n }\n\n /**\n * Recursively creates a type literal with the given props.\n */\n #getTypeFromProperties(baseSchema?: OpenAPIV3.SchemaObject, baseName?: string) {\n const { optionalType } = this.options\n const properties = baseSchema?.properties || {}\n const required = baseSchema?.required\n const additionalProperties = baseSchema?.additionalProperties\n\n const members: Array<ts.TypeElement | null> = Object.keys(properties).map((name) => {\n const schema = properties[name] as OpenAPIV3.SchemaObject\n\n const isRequired = required && required.includes(name)\n let type = this.#getTypeFromSchema(schema, this.options.resolveName({ name: `${baseName || ''} ${name}`, pluginName }))\n\n if (!type) {\n return null\n }\n\n if (!isRequired && ['undefined', 'questionTokenAndUndefined'].includes(optionalType)) {\n type = createUnionDeclaration({ nodes: [type, keywordTypeNodes.undefined] })\n }\n const propertySignature = createPropertySignature({\n questionToken: ['questionToken', 'questionTokenAndUndefined'].includes(optionalType) && !isRequired,\n name,\n type: type as ts.TypeNode,\n readOnly: schema.readOnly,\n })\n if (this.options.withJSDocs) {\n return appendJSDocToNode({\n node: propertySignature,\n comments: [\n schema.description ? `@description ${schema.description}` : undefined,\n schema.type ? `@type ${schema.type}${isRequired ? '' : ' | undefined'} ${schema.format || ''}` : undefined,\n schema.example ? `@example ${schema.example as string}` : undefined,\n schema.deprecated ? `@deprecated` : undefined,\n schema.default !== undefined && typeof schema.default === 'string' ? `@default '${schema.default}'` : undefined,\n schema.default !== undefined && typeof schema.default !== 'string' ? `@default ${schema.default as string}` : undefined,\n ].filter(Boolean),\n })\n }\n\n return propertySignature\n })\n if (additionalProperties) {\n const type = additionalProperties === true ? keywordTypeNodes.any : this.#getTypeFromSchema(additionalProperties as OpenAPIV3.SchemaObject)\n\n if (type) {\n members.push(createIndexSignature(type))\n }\n }\n return factory.createTypeLiteralNode(members.filter(Boolean))\n }\n\n /**\n * Create a type alias for the schema referenced by the given ReferenceObject\n */\n #getRefAlias(obj: OpenAPIV3.ReferenceObject, baseName?: string) {\n const { $ref } = obj\n let ref = this.refs[$ref]\n\n if (ref) {\n return factory.createTypeReferenceNode(ref.propertyName, undefined)\n }\n\n const originalName = getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames)\n const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName\n\n ref = this.refs[$ref] = {\n propertyName,\n originalName,\n }\n\n return factory.createTypeReferenceNode(ref.propertyName, undefined)\n }\n\n /**\n * This is the very core of the OpenAPI to TS conversion - it takes a\n * schema and returns the appropriate type.\n */\n #getBaseTypeFromSchema(schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined, baseName?: string): ts.TypeNode | null {\n if (!schema) {\n return keywordTypeNodes.any\n }\n\n if (isReference(schema)) {\n return this.#getRefAlias(schema, baseName)\n }\n\n if (schema.oneOf) {\n // union\n const schemaWithoutOneOf = { ...schema, oneOf: undefined }\n\n const union = createUnionDeclaration({\n withParentheses: true,\n nodes: schema.oneOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.#getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutOneOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.#getBaseTypeFromSchema(schemaWithoutOneOf, baseName), union].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return union\n }\n\n if (schema.anyOf) {\n const schemaWithoutAnyOf = { ...schema, anyOf: undefined }\n\n const union = createUnionDeclaration({\n withParentheses: true,\n nodes: schema.anyOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.#getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutAnyOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.#getBaseTypeFromSchema(schemaWithoutAnyOf, baseName), union].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return union\n }\n if (schema.allOf) {\n // intersection/add\n const schemaWithoutAllOf = { ...schema, allOf: undefined }\n\n const and = createIntersectionDeclaration({\n withParentheses: true,\n nodes: schema.allOf\n .map((item: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject) => {\n return this.#getBaseTypeFromSchema(item)\n })\n .filter((item) => {\n return item && item !== keywordTypeNodes.any\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n\n if (schemaWithoutAllOf.properties) {\n return createIntersectionDeclaration({\n nodes: [this.#getBaseTypeFromSchema(schemaWithoutAllOf, baseName), and].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n return and\n }\n\n /**\n * Enum will be defined outside the baseType(hints the baseName check)\n */\n if (schema.enum && baseName) {\n const enumName = getUniqueName(baseName, TypeGenerator.usedEnumNames)\n\n let enums: [key: string, value: string | number][] = [...new Set(schema.enum)].map((key) => [key, key])\n\n if ('x-enumNames' in schema) {\n enums = [...new Set(schema['x-enumNames'] as string[])].map((key: string, index) => {\n return [key, schema.enum?.[index]]\n })\n }\n\n this.extraNodes.push(\n ...createEnumDeclaration({\n name: camelCase(enumName, this.caseOptions),\n typeName: this.options.resolveName({ name: enumName, pluginName }),\n enums,\n type: this.options.enumType,\n }),\n )\n return factory.createTypeReferenceNode(this.options.resolveName({ name: enumName, pluginName }), undefined)\n }\n\n if (schema.enum) {\n return createUnionDeclaration({\n nodes: schema.enum.map((name: string) => {\n return factory.createLiteralTypeNode(typeof name === 'number' ? factory.createNumericLiteral(name) : factory.createStringLiteral(`${name}`))\n }) as unknown as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if ('items' in schema) {\n // items -> array\n const node = this.#getTypeFromSchema(schema.items as OpenAPIV3.SchemaObject, baseName)\n if (node) {\n return factory.createArrayTypeNode(node)\n }\n }\n /**\n * OpenAPI 3.1\n * @link https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation\n */\n if ('prefixItems' in schema) {\n const prefixItems = schema.prefixItems as OpenAPIV3.SchemaObject[]\n\n return createTupleDeclaration({\n nodes: prefixItems.map((item) => {\n // no baseType so we can fall back on an union when using enum\n return this.#getBaseTypeFromSchema(item, undefined)\n }) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if (schema.properties || schema.additionalProperties) {\n // properties -> literal type\n return this.#getTypeFromProperties(schema, baseName)\n }\n\n if (schema.type) {\n if (Array.isArray(schema.type)) {\n // OPENAPI v3.1.0: https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0\n const [type, nullable] = schema.type as Array<OpenAPIV3.NonArraySchemaObjectType>\n\n return createUnionDeclaration({\n nodes: [\n this.#getBaseTypeFromSchema(\n {\n ...schema,\n type,\n },\n baseName,\n ),\n nullable ? factory.createLiteralTypeNode(factory.createNull()) : undefined,\n ].filter(Boolean) as ArrayTwoOrMore<ts.TypeNode>,\n })\n }\n\n if (this.options.dateType === 'date' && ['date', 'date-time'].some((item) => item === schema.format)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Date'))\n }\n\n // string, boolean, null, number\n if (schema.type in keywordTypeNodes) {\n return keywordTypeNodes[schema.type as keyof typeof keywordTypeNodes]\n }\n }\n\n if (schema.format === 'binary') {\n return factory.createTypeReferenceNode('Blob', [])\n }\n\n return keywordTypeNodes.any\n }\n}\n","import ts from 'typescript'\n\nconst { factory } = ts\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\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} as const\n","import { resolve as swaggerResolve } from '@kubb/swagger'\n\nimport { pluginName } from '../plugin.ts'\n\nimport type { ResolveProps, Resolver } from '@kubb/swagger'\n\ntype Props = ResolveProps & { pluginName?: never }\n\nexport function resolve(props: Props): Resolver {\n return swaggerResolve({ ...props, pluginName })\n}\n","import { getRelativePath } from '@kubb/core'\nimport { OperationGenerator as Generator, resolve } from '@kubb/swagger'\n\nimport { TypeBuilder } from '../builders/index.ts'\nimport { pluginName } from '../plugin.ts'\n\nimport type { KubbFile } from '@kubb/core'\nimport type { FileResolver, Operation, OperationSchemas, Resolver } from '@kubb/swagger'\nimport type { FileMeta, Options as PluginOptions } from '../types.ts'\n\ntype Options = {\n mode: KubbFile.Mode\n enumType: NonNullable<PluginOptions['enumType']>\n dateType: NonNullable<PluginOptions['dateType']>\n optionalType: NonNullable<PluginOptions['optionalType']>\n}\n\nexport class OperationGenerator extends Generator<Options> {\n resolve(operation: Operation): Resolver {\n const { pluginManager } = this.context\n\n return resolve({\n operation,\n resolveName: pluginManager.resolveName,\n resolvePath: pluginManager.resolvePath,\n pluginName,\n })\n }\n\n async all(): Promise<KubbFile.File | null> {\n return null\n }\n\n async get(operation: Operation, schemas: OperationSchemas, options: Options): Promise<KubbFile.File<FileMeta> | null> {\n const { mode, enumType, dateType, optionalType } = options\n const { pluginManager } = this.context\n\n const type = this.resolve(operation)\n\n const fileResolver: FileResolver = (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = pluginManager.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n return getRelativePath(root, resolvedTypeId)\n }\n\n const source = new TypeBuilder({\n fileResolver: mode === 'file' ? undefined : fileResolver,\n withJSDocs: true,\n resolveName: pluginManager.resolveName,\n enumType,\n optionalType,\n dateType,\n })\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.headerParams)\n .add(schemas.response)\n .add(schemas.errors)\n .configure()\n .print()\n\n return {\n path: type.path,\n baseName: type.baseName,\n source,\n meta: {\n pluginName,\n tag: operation.getTags()[0]?.name,\n },\n }\n }\n\n async post(operation: Operation, schemas: OperationSchemas, options: Options): Promise<KubbFile.File<FileMeta> | null> {\n const { mode, enumType, dateType, optionalType } = options\n const { pluginManager } = this.context\n\n const type = this.resolve(operation)\n\n const fileResolver: FileResolver = (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const root = pluginManager.resolvePath({ baseName: type.baseName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = pluginManager.resolvePath({\n baseName: `${name}.ts`,\n pluginName,\n })\n\n return getRelativePath(root, resolvedTypeId)\n }\n\n const source = new TypeBuilder({\n fileResolver: mode === 'file' ? undefined : fileResolver,\n withJSDocs: true,\n resolveName: pluginManager.resolveName,\n enumType,\n optionalType,\n dateType,\n })\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.headerParams)\n .add(schemas.request)\n .add(schemas.response)\n .add(schemas.errors)\n .configure()\n .print()\n\n return {\n path: type.path,\n baseName: type.baseName,\n source,\n meta: {\n pluginName,\n tag: operation.getTags()[0]?.name,\n },\n }\n }\n\n async put(operation: Operation, schemas: OperationSchemas, options: Options): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas, options)\n }\n async patch(operation: Operation, schemas: OperationSchemas, options: Options): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas, options)\n }\n async delete(operation: Operation, schemas: OperationSchemas, options: Options): Promise<KubbFile.File<FileMeta> | null> {\n return this.post(operation, schemas, options)\n }\n}\n","import { useResolve as useResolveSwagger } from '@kubb/swagger'\n\nimport { pluginName } from '../plugin.ts'\n\nimport type { Resolver, UseResolveProps } from '@kubb/swagger'\n\ntype Props = UseResolveProps & { pluginName?: never }\n\nexport function useResolve(props: Props = {}): Resolver {\n return useResolveSwagger({ pluginName, ...props })\n}\n","import { definePlugin } from './plugin.ts'\n\nexport * from './plugin.ts'\nexport * from './types.ts'\n\nexport * from './generators/index.ts'\nexport * from './builders/index.ts'\nexport * from './utils/index.ts'\nexport * from './hooks/index.ts'\n\nexport default definePlugin\n"]}
|