@kubb/swagger-ts 1.0.0-beta.4 → 1.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +100 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +31 -14
- package/dist/index.js +101 -101
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/builders/TypeBuilder.ts +5 -4
- package/src/generators/OperationGenerator.ts +63 -64
- package/src/generators/TypeGenerator.ts +5 -3
- package/src/generators/index.ts +1 -0
- package/src/plugin.ts +16 -15
- package/src/types.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -39,7 +39,7 @@ var keywordTypeNodes = {
|
|
|
39
39
|
// src/generators/TypeGenerator.ts
|
|
40
40
|
var { factory: factory2 } = ts__default.default;
|
|
41
41
|
var _TypeGenerator = class extends core.SchemaGenerator {
|
|
42
|
-
constructor(oas, options = { withJSDocs: true,
|
|
42
|
+
constructor(oas, options = { withJSDocs: true, resolveName: ({ name }) => name }) {
|
|
43
43
|
super(options);
|
|
44
44
|
this.oas = oas;
|
|
45
45
|
return this;
|
|
@@ -148,7 +148,7 @@ var _TypeGenerator = class extends core.SchemaGenerator {
|
|
|
148
148
|
if (!ref) {
|
|
149
149
|
const name = changeCase.pascalCase(core.getUniqueName($ref.replace(/.+\//, ""), this.usedAliasNames), { delimiter: "" });
|
|
150
150
|
ref = this.refs[$ref] = {
|
|
151
|
-
name: this.options.
|
|
151
|
+
name: this.options.resolveName({ name, pluginName }) || name,
|
|
152
152
|
key: name
|
|
153
153
|
};
|
|
154
154
|
}
|
|
@@ -281,6 +281,85 @@ var ImportsGenerator = class extends core.Generator {
|
|
|
281
281
|
return nodes.filter(Boolean);
|
|
282
282
|
}
|
|
283
283
|
};
|
|
284
|
+
var OperationGenerator = class extends swagger.OperationGenerator {
|
|
285
|
+
async resolve(operation) {
|
|
286
|
+
const { directory, resolvePath, resolveName } = this.options;
|
|
287
|
+
const name = resolveName({ name: operation.getOperationId(), pluginName });
|
|
288
|
+
const fileName = `${name}.ts`;
|
|
289
|
+
const filePath = await resolvePath(fileName, directory);
|
|
290
|
+
if (!filePath || !name) {
|
|
291
|
+
throw new Error("Filepath should be defined");
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
name,
|
|
295
|
+
fileName,
|
|
296
|
+
filePath
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
async all() {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
async get(operation, schemas) {
|
|
303
|
+
const { resolvePath, directory, mode, resolveName, oas } = this.options;
|
|
304
|
+
const type = await this.resolve(operation);
|
|
305
|
+
const fileResolver = async (name) => {
|
|
306
|
+
const filePath = await resolvePath(mode === "file" ? "" : type.name, directory);
|
|
307
|
+
const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
|
|
308
|
+
return core.getRelativePath(filePath, resolvedTypeId);
|
|
309
|
+
};
|
|
310
|
+
const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.response).configure({ fileResolver, withJSDocs: true, resolveName }).print();
|
|
311
|
+
return {
|
|
312
|
+
path: type.filePath,
|
|
313
|
+
fileName: type.fileName,
|
|
314
|
+
source
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
async post(operation, schemas) {
|
|
318
|
+
const { resolvePath, directory, mode, resolveName, oas } = this.options;
|
|
319
|
+
const type = await this.resolve(operation);
|
|
320
|
+
const fileResolver = async (name) => {
|
|
321
|
+
const filePath = await resolvePath(mode === "file" ? "" : type.name, directory);
|
|
322
|
+
const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
|
|
323
|
+
return core.getRelativePath(filePath, resolvedTypeId);
|
|
324
|
+
};
|
|
325
|
+
const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true, resolveName }).print();
|
|
326
|
+
return {
|
|
327
|
+
path: type.filePath,
|
|
328
|
+
fileName: type.fileName,
|
|
329
|
+
source
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
async put(operation, schemas) {
|
|
333
|
+
const { resolvePath, directory, mode, resolveName, oas } = this.options;
|
|
334
|
+
const type = await this.resolve(operation);
|
|
335
|
+
const fileResolver = async (name) => {
|
|
336
|
+
const filePath = await resolvePath(mode === "file" ? "" : type.name, directory);
|
|
337
|
+
const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
|
|
338
|
+
return core.getRelativePath(filePath, resolvedTypeId);
|
|
339
|
+
};
|
|
340
|
+
const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true, resolveName }).print();
|
|
341
|
+
return {
|
|
342
|
+
path: type.filePath,
|
|
343
|
+
fileName: type.fileName,
|
|
344
|
+
source
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
async delete(operation, schemas) {
|
|
348
|
+
const { resolvePath, directory, mode, resolveName, oas } = this.options;
|
|
349
|
+
const type = await this.resolve(operation);
|
|
350
|
+
const fileResolver = async (name) => {
|
|
351
|
+
const filePath = await resolvePath(mode === "file" ? "" : type.name, directory);
|
|
352
|
+
const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
|
|
353
|
+
return core.getRelativePath(filePath, resolvedTypeId);
|
|
354
|
+
};
|
|
355
|
+
const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true, resolveName }).print();
|
|
356
|
+
return {
|
|
357
|
+
path: type.filePath,
|
|
358
|
+
fileName: type.fileName,
|
|
359
|
+
source
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
};
|
|
284
363
|
|
|
285
364
|
// src/builders/TypeBuilder.ts
|
|
286
365
|
function refsSorter(a, b) {
|
|
@@ -303,8 +382,8 @@ var TypeBuilder = class extends swagger.OasBuilder {
|
|
|
303
382
|
async print(name) {
|
|
304
383
|
const codes = [];
|
|
305
384
|
const generated = this.items.filter((gen) => name ? gen.name === name : true).sort(core.nameSorter).map((gen) => {
|
|
306
|
-
const generator = new TypeGenerator(this.oas, { withJSDocs: this.config.withJSDocs,
|
|
307
|
-
const nodes = generator.build(gen.schema, this.config.
|
|
385
|
+
const generator = new TypeGenerator(this.oas, { withJSDocs: this.config.withJSDocs, resolveName: this.config.resolveName });
|
|
386
|
+
const nodes = generator.build(gen.schema, this.config.resolveName({ name: gen.name, pluginName: swagger.pluginName }) || gen.name, gen.description);
|
|
308
387
|
return {
|
|
309
388
|
refs: generator.refs,
|
|
310
389
|
name: gen.name,
|
|
@@ -324,87 +403,6 @@ var TypeBuilder = class extends swagger.OasBuilder {
|
|
|
324
403
|
return codes.join("\n");
|
|
325
404
|
}
|
|
326
405
|
};
|
|
327
|
-
var OperationGenerator = class extends swagger.OperationGenerator {
|
|
328
|
-
async all() {
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
async get(operation, schemas) {
|
|
332
|
-
const { resolveId, directory, mode, nameResolver, oas } = this.options;
|
|
333
|
-
const typeName = `${nameResolver(operation.getOperationId())}.ts`;
|
|
334
|
-
const typeFilePath = await resolveId(typeName, directory);
|
|
335
|
-
const fileResolver = async (name) => {
|
|
336
|
-
const filePath = await resolveId(mode === "file" ? "" : typeName, directory);
|
|
337
|
-
const resolvedTypeId = await resolveId(`${name}.ts`, directory);
|
|
338
|
-
return core.getRelativePath(filePath, resolvedTypeId);
|
|
339
|
-
};
|
|
340
|
-
const typeSource = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.response).configure({ fileResolver, withJSDocs: true }).print();
|
|
341
|
-
if (typeFilePath) {
|
|
342
|
-
return {
|
|
343
|
-
path: typeFilePath,
|
|
344
|
-
fileName: typeName,
|
|
345
|
-
source: typeSource
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
async post(operation, schemas) {
|
|
351
|
-
const { resolveId, directory, mode, nameResolver, oas } = this.options;
|
|
352
|
-
const typeName = `${nameResolver(operation.getOperationId())}.ts`;
|
|
353
|
-
const typeFilePath = await resolveId(typeName, directory);
|
|
354
|
-
const fileResolver = async (name) => {
|
|
355
|
-
const filePath = await resolveId(mode === "file" ? "" : typeName, directory);
|
|
356
|
-
const resolvedTypeId = await resolveId(`${name}.ts`, directory);
|
|
357
|
-
return core.getRelativePath(filePath, resolvedTypeId);
|
|
358
|
-
};
|
|
359
|
-
const typeSource = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true }).print();
|
|
360
|
-
if (typeFilePath) {
|
|
361
|
-
return {
|
|
362
|
-
path: typeFilePath,
|
|
363
|
-
fileName: typeName,
|
|
364
|
-
source: typeSource
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
async put(operation, schemas) {
|
|
370
|
-
const { resolveId, directory, mode, nameResolver, oas } = this.options;
|
|
371
|
-
const typeName = `${nameResolver(operation.getOperationId())}.ts`;
|
|
372
|
-
const typeFilePath = await resolveId(typeName, directory);
|
|
373
|
-
const fileResolver = async (name) => {
|
|
374
|
-
const filePath = await resolveId(mode === "file" ? "" : typeName, directory);
|
|
375
|
-
const resolvedTypeId = await resolveId(`${name}.ts`, directory);
|
|
376
|
-
return core.getRelativePath(filePath, resolvedTypeId);
|
|
377
|
-
};
|
|
378
|
-
const typeSource = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true }).print();
|
|
379
|
-
if (typeFilePath) {
|
|
380
|
-
return {
|
|
381
|
-
path: typeFilePath,
|
|
382
|
-
fileName: typeName,
|
|
383
|
-
source: typeSource
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
async delete(operation, schemas) {
|
|
389
|
-
const { resolveId, directory, mode, nameResolver, oas } = this.options;
|
|
390
|
-
const typeName = `${nameResolver(operation.getOperationId())}.ts`;
|
|
391
|
-
const typeFilePath = await resolveId(typeName, directory);
|
|
392
|
-
const fileResolver = async (name) => {
|
|
393
|
-
const filePath = await resolveId(mode === "file" ? "" : typeName, directory);
|
|
394
|
-
const resolvedTypeId = await resolveId(`${name}.ts`, directory);
|
|
395
|
-
return core.getRelativePath(filePath, resolvedTypeId);
|
|
396
|
-
};
|
|
397
|
-
const typeSource = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.request).add(schemas.response).configure({ fileResolver, withJSDocs: true }).print();
|
|
398
|
-
if (typeFilePath) {
|
|
399
|
-
return {
|
|
400
|
-
path: typeFilePath,
|
|
401
|
-
fileName: typeName,
|
|
402
|
-
source: typeSource
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
return null;
|
|
406
|
-
}
|
|
407
|
-
};
|
|
408
406
|
|
|
409
407
|
// src/plugin.ts
|
|
410
408
|
var pluginName = "swagger-ts";
|
|
@@ -412,7 +410,7 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
412
410
|
const { output = "models" } = options;
|
|
413
411
|
let swaggerApi;
|
|
414
412
|
const api = {
|
|
415
|
-
|
|
413
|
+
resolvePath(fileName, directory) {
|
|
416
414
|
if (!directory) {
|
|
417
415
|
return null;
|
|
418
416
|
}
|
|
@@ -435,8 +433,11 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
435
433
|
}
|
|
436
434
|
return valid;
|
|
437
435
|
},
|
|
438
|
-
|
|
439
|
-
return api.
|
|
436
|
+
resolvePath(fileName, directory) {
|
|
437
|
+
return api.resolvePath(fileName, directory);
|
|
438
|
+
},
|
|
439
|
+
resolveName(name) {
|
|
440
|
+
return changeCase.pascalCase(name, { delimiter: "" });
|
|
440
441
|
},
|
|
441
442
|
async writeFile(source, path) {
|
|
442
443
|
if (!path.endsWith(".ts") || !source) {
|
|
@@ -449,17 +450,16 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
449
450
|
const schemas = oas.getDefinition().components?.schemas || {};
|
|
450
451
|
const directory = pathParser__default.default.resolve(this.config.root, this.config.output.path);
|
|
451
452
|
const mode = core.getPathMode(pathParser__default.default.resolve(directory, output));
|
|
452
|
-
const nameResolver = (name) => changeCase.pascalCase(name, { delimiter: "" });
|
|
453
453
|
if (mode === "directory") {
|
|
454
454
|
const builder = await new TypeBuilder(oas).configure({
|
|
455
|
-
|
|
455
|
+
resolveName: (params) => this.resolveName({ pluginName, ...params }),
|
|
456
456
|
fileResolver: async (name) => {
|
|
457
|
-
const resolvedTypeId = await this.
|
|
457
|
+
const resolvedTypeId = await this.resolvePath({
|
|
458
458
|
fileName: `${name}.ts`,
|
|
459
459
|
directory,
|
|
460
460
|
pluginName
|
|
461
461
|
});
|
|
462
|
-
const root = await this.
|
|
462
|
+
const root = await this.resolvePath({ fileName: ``, directory, pluginName });
|
|
463
463
|
return core.getRelativePath(root, resolvedTypeId);
|
|
464
464
|
},
|
|
465
465
|
withJSDocs: true
|
|
@@ -471,13 +471,13 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
471
471
|
});
|
|
472
472
|
});
|
|
473
473
|
const mapFolderSchema = async ([name]) => {
|
|
474
|
-
const path = await this.
|
|
474
|
+
const path = await this.resolvePath({ fileName: `${this.resolveName({ name, pluginName })}.ts`, directory, pluginName });
|
|
475
475
|
if (!path) {
|
|
476
476
|
return null;
|
|
477
477
|
}
|
|
478
478
|
return this.addFile({
|
|
479
479
|
path,
|
|
480
|
-
fileName: `${
|
|
480
|
+
fileName: `${this.resolveName({ name, pluginName })}.ts`,
|
|
481
481
|
source: await builder.print(name)
|
|
482
482
|
});
|
|
483
483
|
};
|
|
@@ -486,7 +486,7 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
486
486
|
}
|
|
487
487
|
if (mode === "file") {
|
|
488
488
|
const builder = new TypeBuilder(oas).configure({
|
|
489
|
-
|
|
489
|
+
resolveName: (params) => this.resolveName({ pluginName, ...params }),
|
|
490
490
|
withJSDocs: true
|
|
491
491
|
});
|
|
492
492
|
Object.entries(schemas).forEach(([name, schema]) => {
|
|
@@ -495,13 +495,13 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
495
495
|
name
|
|
496
496
|
});
|
|
497
497
|
});
|
|
498
|
-
const path = await this.
|
|
498
|
+
const path = await this.resolvePath({ fileName: "", directory, pluginName });
|
|
499
499
|
if (!path) {
|
|
500
500
|
return;
|
|
501
501
|
}
|
|
502
502
|
await this.addFile({
|
|
503
503
|
path,
|
|
504
|
-
fileName: `${
|
|
504
|
+
fileName: `${this.resolveName({ name: output, pluginName })}.ts`,
|
|
505
505
|
source: await builder.print()
|
|
506
506
|
});
|
|
507
507
|
}
|
|
@@ -510,8 +510,8 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
510
510
|
mode,
|
|
511
511
|
directory,
|
|
512
512
|
fileManager: this.fileManager,
|
|
513
|
-
|
|
514
|
-
|
|
513
|
+
resolvePath: api.resolvePath,
|
|
514
|
+
resolveName: (params) => this.resolveName({ pluginName, ...params })
|
|
515
515
|
});
|
|
516
516
|
await operationGenerator.build();
|
|
517
517
|
},
|
|
@@ -525,6 +525,7 @@ var definePlugin = core.createPlugin((options) => {
|
|
|
525
525
|
var src_default = definePlugin;
|
|
526
526
|
|
|
527
527
|
exports.ImportsGenerator = ImportsGenerator;
|
|
528
|
+
exports.OperationGenerator = OperationGenerator;
|
|
528
529
|
exports.TypeBuilder = TypeBuilder;
|
|
529
530
|
exports.TypeGenerator = TypeGenerator;
|
|
530
531
|
exports.default = src_default;
|
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/generators/ImportsGenerator.ts","../src/generators/OperationGenerator.ts","../src/index.ts"],"names":["pascalCase","getRelativePath","ts","factory","node","uniq","Generator"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-console */\n\nimport pathParser from 'path'\n\nimport { pascalCase } from 'change-case'\n\nimport { getRelativePath, createPlugin, getPathMode, validatePlugins } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\nimport type { Api as SwaggerApi, OpenAPIV3 } from '@kubb/swagger'\nimport { writeIndexes } from '@kubb/ts-codegen'\n\nimport { TypeBuilder } from './builders'\nimport { OperationGenerator } from './generators/OperationGenerator'\n\nimport type { Api, PluginOptions } from './types'\n\nexport const pluginName = 'swagger-ts' as const\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const { output = 'models' } = options\n let swaggerApi: SwaggerApi\n\n const api: Api = {\n resolveId(fileName, directory) {\n if (!directory) {\n return null\n }\n\n const mode = getPathMode(pathParser.resolve(directory, 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(directory, output)\n }\n\n return pathParser.resolve(directory, output, fileName)\n },\n }\n\n return {\n name: pluginName,\n options,\n kind: 'schema',\n api,\n validate(plugins) {\n const valid = validatePlugins(plugins, [swaggerPluginName])\n if (valid) {\n swaggerApi = plugins.find((plugin) => plugin.name === swaggerPluginName)?.api\n }\n\n return valid\n },\n resolveId(fileName, directory) {\n return api.resolveId(fileName, directory)\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 oas = await swaggerApi.getOas(this.config)\n\n const schemas = oas.getDefinition().components?.schemas || {}\n const directory = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(directory, output))\n\n const nameResolver = (name: string) => pascalCase(name, { delimiter: '' })\n\n if (mode === 'directory') {\n const builder = await new TypeBuilder(oas).configure({\n nameResolver,\n fileResolver: async (name) => {\n const resolvedTypeId = await this.resolveId({\n fileName: `${name}.ts`,\n directory,\n pluginName,\n })\n\n const root = await this.resolveId({ fileName: ``, directory, pluginName })\n\n return getRelativePath(root, resolvedTypeId)\n },\n withJSDocs: true,\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 = await this.resolveId({ fileName: `${nameResolver(name)}.ts`, directory, pluginName })\n\n if (!path) {\n return null\n }\n\n return this.addFile({\n path,\n fileName: `${nameResolver(name)}.ts`,\n source: await builder.print(name),\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 nameResolver,\n withJSDocs: true,\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 = await this.resolveId({ fileName: '', directory, pluginName })\n if (!path) {\n return\n }\n\n await this.addFile({\n path,\n fileName: `${nameResolver(output)}.ts`,\n source: await builder.print(),\n })\n }\n\n const operationGenerator = new OperationGenerator({\n oas,\n mode,\n directory,\n fileManager: this.fileManager,\n nameResolver,\n resolveId: api.resolveId,\n })\n\n await operationGenerator.build()\n },\n async buildEnd() {\n await writeIndexes(this.config.root, this.config.output.path, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n },\n }\n})\n","import { OasBuilder } from '@kubb/swagger'\nimport type { FileResolver } from '@kubb/swagger'\nimport { nameSorter } from '@kubb/core'\nimport { print } from '@kubb/ts-codegen'\n\nimport { ImportsGenerator, TypeGenerator } from '../generators'\n\nimport type ts from 'typescript'\nimport type { Refs } from '../generators'\n\ntype Generated = { refs: Refs; name: string; sources: ts.Node[] }\ntype Config = {\n fileResolver?: FileResolver\n nameResolver?: (name: string) => string\n withJSDocs?: boolean\n withImports?: boolean\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.refs)?.length < Object.keys(b.refs)?.length) {\n return -1\n }\n if (Object.keys(a.refs)?.length > Object.keys(b.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 async print(name?: string) {\n const codes: string[] = []\n\n const generated = this.items\n .filter((gen) => (name ? gen.name === name : true))\n .sort(nameSorter)\n .map((gen) => {\n const generator = new TypeGenerator(this.oas, { withJSDocs: this.config.withJSDocs, nameResolver: this.config.nameResolver })\n const nodes = generator.build(gen.schema, this.config.nameResolver?.(gen.name) || gen.name, gen.description)\n\n return {\n refs: generator.refs,\n name: gen.name,\n sources: nodes,\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 codeImports = await importsGenerator.build(generated)\n\n if (codeImports) {\n codes.unshift(print(codeImports))\n }\n }\n\n return codes.join('\\n')\n }\n}\n","/* eslint-disable no-param-reassign */\nimport ts from 'typescript'\nimport { pascalCase, camelCase } from 'change-case'\nimport uniq from 'lodash.uniq'\n\nimport { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport type { Oas, OpenAPIV3 } from '@kubb/swagger'\nimport { isReference } from '@kubb/swagger'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createPropertySignature,\n createTypeAliasDeclaration,\n modifier,\n} from '@kubb/ts-codegen'\n\nimport { keywordTypeNodes } from '../utils'\n\nconst { factory } = ts\n\n// based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n\n/**\n * Name is the ref name + resolved with the nameResolver\n * Key is the original name used\n */\nexport type Refs = Record<string, { name: string; key: string }>\n\ntype Options = {\n withJSDocs?: boolean\n nameResolver?: (name: string) => string\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 constructor(public readonly oas: Oas, options: Options = { withJSDocs: true, nameResolver: (name) => name }) {\n super(options)\n\n return this\n }\n\n build(schema: OpenAPIV3.SchemaObject, name: string, description?: string) {\n const nodes: ts.Node[] = []\n const type = this.getTypeFromSchema(schema, name)\n\n if (!type) {\n return this.extraNodes\n }\n\n const node = createTypeAliasDeclaration({\n modifiers: [modifier.export],\n name,\n 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) {\n return type\n }\n\n return factory.createUnionTypeNode([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 props = baseSchema?.properties || {}\n const required = baseSchema?.required\n const additionalProperties = baseSchema?.additionalProperties\n\n const members: Array<ts.TypeElement | null> = Object.keys(props).map((name) => {\n const schema = props[name] as OpenAPIV3.SchemaObject\n\n const isRequired = required && required.includes(name)\n let type: ts.TypeNode | null\n if (schema.enum) {\n type = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n } else {\n type = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n }\n\n if (!type) {\n return null\n }\n\n if (!isRequired) {\n type = factory.createUnionTypeNode([type, keywordTypeNodes.undefined])\n }\n const propertySignature = createPropertySignature({\n questionToken: !isRequired,\n name,\n type,\n })\n if (this.options.withJSDocs) {\n return appendJSDocToNode({\n node: propertySignature,\n comments: [\n schema.description && `@description ${schema.description}`,\n schema.type && `@type ${schema.type}${isRequired ? '' : ' | undefined'} ${schema.format || ''}`,\n schema.example && `@example ${schema.example}`,\n ],\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) as ts.TypeElement[])\n }\n\n /**\n * Create a type alias for the schema referenced by the given ReferenceObject\n */\n private getRefAlias(obj: OpenAPIV3.ReferenceObject) {\n const { $ref } = obj\n let ref = this.refs[$ref]\n\n if (!ref) {\n const name = pascalCase(getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames), { delimiter: '' })\n\n // eslint-disable-next-line no-multi-assign\n ref = this.refs[$ref] = {\n name: this.options.nameResolver?.(name) || name,\n key: name,\n }\n }\n\n return factory.createTypeReferenceNode(ref.name, 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, name?: string): ts.TypeNode | null {\n if (!schema) {\n return keywordTypeNodes.any\n }\n\n if (isReference(schema)) {\n return this.getRefAlias(schema)\n }\n\n if (schema.oneOf) {\n // union\n const schemaWithoutOneOf = { ...schema, oneOf: undefined }\n\n return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutOneOf, name),\n factory.createParenthesizedType(\n factory.createUnionTypeNode(\n schema.oneOf\n .map((item) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter(Boolean) as ts.TypeNode[]\n )\n ),\n ].filter(Boolean) as ts.TypeNode[],\n })\n }\n\n if (schema.anyOf) {\n // TODO anyOf -> union\n }\n if (schema.allOf) {\n // intersection/add\n const schemaWithoutAllOf = { ...schema, allOf: undefined }\n\n return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutAllOf, name),\n factory.createParenthesizedType(\n factory.createIntersectionTypeNode(\n schema.allOf\n .map((item) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter(Boolean) as ts.TypeNode[]\n )\n ),\n ].filter(Boolean) as ts.TypeNode[],\n })\n }\n\n if (schema.enum && name) {\n const enumName = getUniqueName(name, TypeGenerator.usedEnumNames)\n this.extraNodes.push(\n ...createEnumDeclaration({\n name: camelCase(enumName, { delimiter: '' }),\n typeName: pascalCase(enumName, { delimiter: '' }),\n enums: uniq(schema.enum),\n })\n )\n return factory.createTypeReferenceNode(pascalCase(enumName, { delimiter: '' }), undefined)\n }\n\n if ('items' in schema) {\n // items -> array\n const node = this.getTypeFromSchema(schema.items as OpenAPIV3.SchemaObject, name)\n if (node) {\n return factory.createArrayTypeNode(node)\n }\n }\n\n if (schema.properties || schema.additionalProperties) {\n // properties -> literal type\n return this.getTypeFromProperties(schema, name)\n }\n\n if (schema.type) {\n if (schema.type === 'object') {\n if (!schema.additionalProperties && !schema.properties && schema.type === 'object') {\n return null\n }\n }\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\n\n return factory.createUnionTypeNode(\n [\n this.getBaseTypeFromSchema(\n {\n ...schema,\n type,\n },\n name\n )!,\n nullable ? factory.createLiteralTypeNode(factory.createNull()) : undefined,\n ].filter(Boolean) as ts.TypeNode[]\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 uniq from 'lodash.uniq'\n\nimport { Generator } from '@kubb/core'\nimport type { FileResolver } from '@kubb/swagger'\nimport { createImportDeclaration } from '@kubb/ts-codegen'\n\nimport type { Refs } from './TypeGenerator'\nimport type ts from 'typescript'\n\ntype Options = {\n fileResolver?: FileResolver\n}\nexport class ImportsGenerator extends Generator<Options> {\n async build(items: Array<{ refs: Refs; sources: ts.Node[]; name: string }>): Promise<Array<ts.ImportDeclaration> | undefined> {\n const refs = items.reduce((acc, currentValue) => {\n return {\n ...acc,\n ...currentValue.refs,\n }\n }, {} as Refs)\n\n if (Object.keys(refs).length === 0) {\n return undefined\n }\n\n // add imports based on $ref\n const importPromises = uniq(Object.keys(refs))\n .filter(($ref: string) => {\n // when using a $ref inside a type we should not repeat that import\n const { key } = refs[$ref]\n return !items.find((item) =>\n item.sources.find((node: ts.Node) => (node as ts.TypeAliasDeclaration).name?.escapedText.toString().toLowerCase() === key.toLowerCase())\n )\n })\n .map(async ($ref: string) => {\n const { name } = refs[$ref]\n\n const path = (await this.options.fileResolver?.(name)) || `./${name}`\n\n // TODO weird hacky fix\n if (path === './' || path === '.') {\n return undefined\n }\n\n return createImportDeclaration({\n name: [name],\n path: path.replace('./../', '../'),\n })\n })\n\n const nodes = await Promise.all(importPromises)\n\n return nodes.filter(Boolean) as ts.ImportDeclaration[]\n }\n}\n","import type { File, FileManager, PathMode } from '@kubb/core'\nimport { getRelativePath } from '@kubb/core'\nimport { OperationGenerator as Generator } from '@kubb/swagger'\nimport type { FileResolver, Oas, Operation, OperationSchemas } from '@kubb/swagger'\n\nimport { TypeBuilder } from '../builders'\n\nimport type { Api } from '../types'\n\ntype Options = {\n oas: Oas\n resolveId: Api['resolveId']\n mode: PathMode\n fileManager: FileManager\n nameResolver: (name: string) => string\n directory: string\n}\n\nexport class OperationGenerator extends Generator<Options> {\n async all(): Promise<File | null> {\n return null\n }\n\n async get(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolveId, directory, mode, nameResolver, oas } = this.options\n\n const typeName = `${nameResolver(operation.getOperationId())}.ts`\n const typeFilePath = await resolveId(typeName, directory)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolveId(mode === 'file' ? '' : typeName, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolveId(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const typeSource = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true })\n .print()\n\n if (typeFilePath) {\n return {\n path: typeFilePath,\n fileName: typeName,\n source: typeSource,\n }\n }\n\n return null\n }\n\n async post(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolveId, directory, mode, nameResolver, oas } = this.options\n\n const typeName = `${nameResolver(operation.getOperationId())}.ts`\n const typeFilePath = await resolveId(typeName, directory)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolveId(mode === 'file' ? '' : typeName, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolveId(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const typeSource = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true })\n .print()\n\n if (typeFilePath) {\n return {\n path: typeFilePath,\n fileName: typeName,\n source: typeSource,\n }\n }\n\n return null\n }\n\n async put(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolveId, directory, mode, nameResolver, oas } = this.options\n\n const typeName = `${nameResolver(operation.getOperationId())}.ts`\n const typeFilePath = await resolveId(typeName, directory)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolveId(mode === 'file' ? '' : typeName, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolveId(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const typeSource = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true })\n .print()\n\n if (typeFilePath) {\n return {\n path: typeFilePath,\n fileName: typeName,\n source: typeSource,\n }\n }\n\n return null\n }\n\n async delete(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolveId, directory, mode, nameResolver, oas } = this.options\n\n const typeName = `${nameResolver(operation.getOperationId())}.ts`\n const typeFilePath = await resolveId(typeName, directory)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolveId(mode === 'file' ? '' : typeName, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolveId(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const typeSource = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true })\n .print()\n\n if (typeFilePath) {\n return {\n path: typeFilePath,\n fileName: typeName,\n source: typeSource,\n }\n }\n\n return null\n }\n}\n","import { definePlugin } from './plugin'\n\nexport * from './plugin'\nexport * from './generators'\nexport * from './builders'\nexport * from './types'\nexport * from './utils'\nexport default definePlugin\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/builders/TypeBuilder.ts","../src/generators/TypeGenerator.ts","../src/utils/keywordTypeNodes.ts","../src/generators/ImportsGenerator.ts","../src/generators/OperationGenerator.ts","../src/index.ts"],"names":["pascalCase","getRelativePath","pluginName","ts","factory","node","uniq","Generator"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-console */\n\nimport pathParser from 'path'\n\nimport { pascalCase } from 'change-case'\n\nimport { getRelativePath, createPlugin, getPathMode, validatePlugins } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\nimport type { Api as SwaggerApi, OpenAPIV3 } from '@kubb/swagger'\nimport { writeIndexes } from '@kubb/ts-codegen'\n\nimport { TypeBuilder } from './builders'\nimport { OperationGenerator } from './generators/OperationGenerator'\n\nimport type { Api, PluginOptions } from './types'\n\nexport const pluginName = 'swagger-ts' as const\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const { output = 'models' } = options\n let swaggerApi: SwaggerApi\n\n const api: Api = {\n resolvePath(fileName, directory) {\n if (!directory) {\n return null\n }\n\n const mode = getPathMode(pathParser.resolve(directory, 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(directory, output)\n }\n\n return pathParser.resolve(directory, output, fileName)\n },\n }\n\n return {\n name: pluginName,\n options,\n kind: 'schema',\n api,\n validate(plugins) {\n const valid = validatePlugins(plugins, [swaggerPluginName])\n if (valid) {\n swaggerApi = plugins.find((plugin) => plugin.name === swaggerPluginName)?.api\n }\n\n return valid\n },\n resolvePath(fileName, directory) {\n return api.resolvePath(fileName, directory)\n },\n resolveName(name) {\n return pascalCase(name, { delimiter: '' })\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 oas = await swaggerApi.getOas(this.config)\n\n const schemas = oas.getDefinition().components?.schemas || {}\n const directory = pathParser.resolve(this.config.root, this.config.output.path)\n const mode = getPathMode(pathParser.resolve(directory, output))\n\n if (mode === 'directory') {\n const builder = await new TypeBuilder(oas).configure({\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n fileResolver: async (name) => {\n const resolvedTypeId = await this.resolvePath({\n fileName: `${name}.ts`,\n directory,\n pluginName,\n })\n\n const root = await this.resolvePath({ fileName: ``, directory, pluginName })\n\n return getRelativePath(root, resolvedTypeId)\n },\n withJSDocs: true,\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 = await this.resolvePath({ fileName: `${this.resolveName({ name, pluginName })}.ts`, directory, pluginName })\n\n if (!path) {\n return null\n }\n\n return this.addFile({\n path,\n fileName: `${this.resolveName({ name, pluginName })}.ts`,\n source: await builder.print(name),\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 })\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 = await this.resolvePath({ fileName: '', directory, pluginName })\n if (!path) {\n return\n }\n\n await this.addFile({\n path,\n fileName: `${this.resolveName({ name: output, pluginName })}.ts`,\n source: await builder.print(),\n })\n }\n\n const operationGenerator = new OperationGenerator({\n oas,\n mode,\n directory,\n fileManager: this.fileManager,\n resolvePath: api.resolvePath,\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n })\n\n await operationGenerator.build()\n },\n async buildEnd() {\n await writeIndexes(this.config.root, this.config.output.path, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n },\n }\n})\n","import { OasBuilder, pluginName } from '@kubb/swagger'\nimport type { FileResolver } from '@kubb/swagger'\nimport type { PluginContext } from '@kubb/core'\nimport { nameSorter } from '@kubb/core'\nimport { print } from '@kubb/ts-codegen'\n\nimport { ImportsGenerator, TypeGenerator } from '../generators'\n\nimport type ts from 'typescript'\nimport type { Refs } from '../generators'\n\ntype Generated = { refs: Refs; name: string; sources: ts.Node[] }\ntype Config = {\n resolveName: PluginContext['resolveName']\n fileResolver?: FileResolver\n withJSDocs?: boolean\n withImports?: boolean\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.refs)?.length < Object.keys(b.refs)?.length) {\n return -1\n }\n if (Object.keys(a.refs)?.length > Object.keys(b.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 async print(name?: string) {\n const codes: string[] = []\n\n const generated = this.items\n .filter((gen) => (name ? gen.name === name : true))\n .sort(nameSorter)\n .map((gen) => {\n const generator = new TypeGenerator(this.oas, { withJSDocs: this.config.withJSDocs, resolveName: this.config.resolveName })\n const nodes = generator.build(gen.schema, this.config.resolveName({ name: gen.name, pluginName }) || gen.name, gen.description)\n\n return {\n refs: generator.refs,\n name: gen.name,\n sources: nodes,\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 codeImports = await importsGenerator.build(generated)\n\n if (codeImports) {\n codes.unshift(print(codeImports))\n }\n }\n\n return codes.join('\\n')\n }\n}\n","/* eslint-disable no-param-reassign */\nimport ts from 'typescript'\nimport { pascalCase, camelCase } from 'change-case'\nimport uniq from 'lodash.uniq'\n\nimport type { PluginContext } from '@kubb/core'\nimport { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport type { Oas, OpenAPIV3 } from '@kubb/swagger'\nimport { isReference } from '@kubb/swagger'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createPropertySignature,\n createTypeAliasDeclaration,\n modifier,\n} from '@kubb/ts-codegen'\n\nimport { keywordTypeNodes } from '../utils'\nimport { pluginName } from '../plugin'\n\nconst { factory } = ts\n\n// based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n\n/**\n * Name is the ref name + resolved with the nameResolver\n * Key is the original name used\n */\nexport type Refs = Record<string, { name: string; key: string }>\n\ntype Options = {\n withJSDocs?: boolean\n resolveName: PluginContext['resolveName']\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 constructor(public readonly oas: Oas, options: Options = { withJSDocs: true, resolveName: ({ name }) => name }) {\n super(options)\n\n return this\n }\n\n build(schema: OpenAPIV3.SchemaObject, name: string, description?: string) {\n const nodes: ts.Node[] = []\n const type = this.getTypeFromSchema(schema, name)\n\n if (!type) {\n return this.extraNodes\n }\n\n const node = createTypeAliasDeclaration({\n modifiers: [modifier.export],\n name,\n 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) {\n return type\n }\n\n return factory.createUnionTypeNode([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 props = baseSchema?.properties || {}\n const required = baseSchema?.required\n const additionalProperties = baseSchema?.additionalProperties\n\n const members: Array<ts.TypeElement | null> = Object.keys(props).map((name) => {\n const schema = props[name] as OpenAPIV3.SchemaObject\n\n const isRequired = required && required.includes(name)\n let type: ts.TypeNode | null\n if (schema.enum) {\n type = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n } else {\n type = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n }\n\n if (!type) {\n return null\n }\n\n if (!isRequired) {\n type = factory.createUnionTypeNode([type, keywordTypeNodes.undefined])\n }\n const propertySignature = createPropertySignature({\n questionToken: !isRequired,\n name,\n type,\n })\n if (this.options.withJSDocs) {\n return appendJSDocToNode({\n node: propertySignature,\n comments: [\n schema.description && `@description ${schema.description}`,\n schema.type && `@type ${schema.type}${isRequired ? '' : ' | undefined'} ${schema.format || ''}`,\n schema.example && `@example ${schema.example}`,\n ],\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) as ts.TypeElement[])\n }\n\n /**\n * Create a type alias for the schema referenced by the given ReferenceObject\n */\n private getRefAlias(obj: OpenAPIV3.ReferenceObject) {\n const { $ref } = obj\n let ref = this.refs[$ref]\n\n if (!ref) {\n const name = pascalCase(getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames), { delimiter: '' })\n\n // eslint-disable-next-line no-multi-assign\n ref = this.refs[$ref] = {\n name: this.options.resolveName({ name, pluginName }) || name,\n key: name,\n }\n }\n\n return factory.createTypeReferenceNode(ref.name, 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, name?: string): ts.TypeNode | null {\n if (!schema) {\n return keywordTypeNodes.any\n }\n\n if (isReference(schema)) {\n return this.getRefAlias(schema)\n }\n\n if (schema.oneOf) {\n // union\n const schemaWithoutOneOf = { ...schema, oneOf: undefined }\n\n return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutOneOf, name),\n factory.createParenthesizedType(\n factory.createUnionTypeNode(\n schema.oneOf\n .map((item) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter(Boolean) as ts.TypeNode[]\n )\n ),\n ].filter(Boolean) as ts.TypeNode[],\n })\n }\n\n if (schema.anyOf) {\n // TODO anyOf -> union\n }\n if (schema.allOf) {\n // intersection/add\n const schemaWithoutAllOf = { ...schema, allOf: undefined }\n\n return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutAllOf, name),\n factory.createParenthesizedType(\n factory.createIntersectionTypeNode(\n schema.allOf\n .map((item) => {\n return this.getBaseTypeFromSchema(item)\n })\n .filter(Boolean) as ts.TypeNode[]\n )\n ),\n ].filter(Boolean) as ts.TypeNode[],\n })\n }\n\n if (schema.enum && name) {\n const enumName = getUniqueName(name, TypeGenerator.usedEnumNames)\n this.extraNodes.push(\n ...createEnumDeclaration({\n name: camelCase(enumName, { delimiter: '' }),\n typeName: pascalCase(enumName, { delimiter: '' }),\n enums: uniq(schema.enum),\n })\n )\n return factory.createTypeReferenceNode(pascalCase(enumName, { delimiter: '' }), undefined)\n }\n\n if ('items' in schema) {\n // items -> array\n const node = this.getTypeFromSchema(schema.items as OpenAPIV3.SchemaObject, name)\n if (node) {\n return factory.createArrayTypeNode(node)\n }\n }\n\n if (schema.properties || schema.additionalProperties) {\n // properties -> literal type\n return this.getTypeFromProperties(schema, name)\n }\n\n if (schema.type) {\n if (schema.type === 'object') {\n if (!schema.additionalProperties && !schema.properties && schema.type === 'object') {\n return null\n }\n }\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\n\n return factory.createUnionTypeNode(\n [\n this.getBaseTypeFromSchema(\n {\n ...schema,\n type,\n },\n name\n )!,\n nullable ? factory.createLiteralTypeNode(factory.createNull()) : undefined,\n ].filter(Boolean) as ts.TypeNode[]\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 uniq from 'lodash.uniq'\n\nimport { Generator } from '@kubb/core'\nimport type { FileResolver } from '@kubb/swagger'\nimport { createImportDeclaration } from '@kubb/ts-codegen'\n\nimport type { Refs } from './TypeGenerator'\nimport type ts from 'typescript'\n\ntype Options = {\n fileResolver?: FileResolver\n}\nexport class ImportsGenerator extends Generator<Options> {\n async build(items: Array<{ refs: Refs; sources: ts.Node[]; name: string }>): Promise<Array<ts.ImportDeclaration> | undefined> {\n const refs = items.reduce((acc, currentValue) => {\n return {\n ...acc,\n ...currentValue.refs,\n }\n }, {} as Refs)\n\n if (Object.keys(refs).length === 0) {\n return undefined\n }\n\n // add imports based on $ref\n const importPromises = uniq(Object.keys(refs))\n .filter(($ref: string) => {\n // when using a $ref inside a type we should not repeat that import\n const { key } = refs[$ref]\n return !items.find((item) =>\n item.sources.find((node: ts.Node) => (node as ts.TypeAliasDeclaration).name?.escapedText.toString().toLowerCase() === key.toLowerCase())\n )\n })\n .map(async ($ref: string) => {\n const { name } = refs[$ref]\n\n const path = (await this.options.fileResolver?.(name)) || `./${name}`\n\n // TODO weird hacky fix\n if (path === './' || path === '.') {\n return undefined\n }\n\n return createImportDeclaration({\n name: [name],\n path: path.replace('./../', '../'),\n })\n })\n\n const nodes = await Promise.all(importPromises)\n\n return nodes.filter(Boolean) as ts.ImportDeclaration[]\n }\n}\n","import type { File, FileManager, PathMode, PluginContext } from '@kubb/core'\nimport { getRelativePath } from '@kubb/core'\nimport { OperationGenerator as Generator } from '@kubb/swagger'\nimport type { FileResolver, Oas, Operation, OperationSchemas, Resolver } from '@kubb/swagger'\n\nimport { TypeBuilder } from '../builders'\nimport { pluginName } from '../plugin'\n\nimport type { Api } from '../types'\n\ntype Options = {\n oas: Oas\n resolvePath: Api['resolvePath']\n resolveName: PluginContext['resolveName']\n mode: PathMode\n fileManager: FileManager\n directory: string\n}\n\nexport class OperationGenerator extends Generator<Options> {\n async resolve(operation: Operation): Promise<Resolver> {\n const { directory, resolvePath, resolveName } = this.options\n\n const name = resolveName({ name: operation.getOperationId(), pluginName })\n const fileName = `${name}.ts`\n const filePath = await resolvePath(fileName, directory)\n\n if (!filePath || !name) {\n throw new Error('Filepath should be defined')\n }\n\n return {\n name,\n fileName,\n filePath,\n }\n }\n\n async all(): Promise<File | null> {\n return null\n }\n\n async get(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolvePath, directory, mode, resolveName, oas } = this.options\n\n const type = await this.resolve(operation)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolvePath(mode === 'file' ? '' : type.name, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolvePath(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const source = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true, resolveName })\n .print()\n\n return {\n path: type.filePath,\n fileName: type.fileName,\n source,\n }\n }\n\n async post(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolvePath, directory, mode, resolveName, oas } = this.options\n\n const type = await this.resolve(operation)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolvePath(mode === 'file' ? '' : type.name, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolvePath(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const source = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true, resolveName })\n .print()\n\n return {\n path: type.filePath,\n fileName: type.fileName,\n source,\n }\n }\n\n async put(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolvePath, directory, mode, resolveName, oas } = this.options\n\n const type = await this.resolve(operation)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolvePath(mode === 'file' ? '' : type.name, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolvePath(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const source = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.queryParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true, resolveName })\n .print()\n\n return {\n path: type.filePath,\n fileName: type.fileName,\n source,\n }\n }\n\n async delete(operation: Operation, schemas: OperationSchemas): Promise<File | null> {\n const { resolvePath, directory, mode, resolveName, oas } = this.options\n\n const type = await this.resolve(operation)\n\n const fileResolver: FileResolver = async (name) => {\n // Used when a react-query type(request, response, params) has an import of a global type\n const filePath = await resolvePath(mode === 'file' ? '' : type.name, directory)\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = await resolvePath(`${name}.ts`, directory)\n\n return getRelativePath(filePath, resolvedTypeId)\n }\n\n const source = await new TypeBuilder(oas)\n .add(schemas.pathParams)\n .add(schemas.request)\n .add(schemas.response)\n .configure({ fileResolver, withJSDocs: true, resolveName })\n .print()\n\n return {\n path: type.filePath,\n fileName: type.fileName,\n source,\n }\n }\n}\n","import { definePlugin } from './plugin'\n\nexport * from './plugin'\nexport * from './generators'\nexport * from './builders'\nexport * from './types'\nexport * from './utils'\nexport default definePlugin\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as _kubb_core from '@kubb/core';
|
|
2
|
-
import { PluginFactoryOptions, SchemaGenerator, Generator } from '@kubb/core';
|
|
2
|
+
import { PluginFactoryOptions, SchemaGenerator, PluginContext, Generator, File, PathMode, FileManager } from '@kubb/core';
|
|
3
3
|
import ts from 'typescript';
|
|
4
|
-
import { OpenAPIV3, Oas, FileResolver, OasBuilder } from '@kubb/swagger';
|
|
4
|
+
import { OpenAPIV3, Oas, FileResolver, OperationGenerator as OperationGenerator$1, Operation, Resolver, OperationSchemas, OasBuilder } from '@kubb/swagger';
|
|
5
5
|
|
|
6
6
|
type Api = {
|
|
7
|
-
|
|
7
|
+
resolvePath: (fileName: string, directory: string | undefined) => string | null;
|
|
8
8
|
};
|
|
9
|
-
type Options$
|
|
9
|
+
type Options$3 = {
|
|
10
10
|
/**
|
|
11
11
|
* Relative path to save the TypeScript types.
|
|
12
12
|
* When output is a file it will save all models inside that file else it will create a file per schema item.
|
|
@@ -14,10 +14,10 @@ type Options$2 = {
|
|
|
14
14
|
*/
|
|
15
15
|
output?: string;
|
|
16
16
|
};
|
|
17
|
-
type PluginOptions = PluginFactoryOptions<Options$
|
|
17
|
+
type PluginOptions = PluginFactoryOptions<Options$3, false, Api>;
|
|
18
18
|
|
|
19
19
|
declare const pluginName: "swagger-ts";
|
|
20
|
-
declare const definePlugin: (options: Options$
|
|
20
|
+
declare const definePlugin: (options: Options$3) => _kubb_core.KubbPlugin<PluginOptions>;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Name is the ref name + resolved with the nameResolver
|
|
@@ -27,18 +27,18 @@ type Refs = Record<string, {
|
|
|
27
27
|
name: string;
|
|
28
28
|
key: string;
|
|
29
29
|
}>;
|
|
30
|
-
type Options$
|
|
30
|
+
type Options$2 = {
|
|
31
31
|
withJSDocs?: boolean;
|
|
32
|
-
|
|
32
|
+
resolveName: PluginContext['resolveName'];
|
|
33
33
|
};
|
|
34
|
-
declare class TypeGenerator extends SchemaGenerator<Options$
|
|
34
|
+
declare class TypeGenerator extends SchemaGenerator<Options$2, OpenAPIV3.SchemaObject, ts.Node[]> {
|
|
35
35
|
readonly oas: Oas;
|
|
36
36
|
static usedEnumNames: Record<string, number>;
|
|
37
37
|
refs: Refs;
|
|
38
38
|
extraNodes: ts.Node[];
|
|
39
39
|
aliases: ts.TypeAliasDeclaration[];
|
|
40
40
|
usedAliasNames: Record<string, number>;
|
|
41
|
-
constructor(oas: Oas, options?: Options$
|
|
41
|
+
constructor(oas: Oas, options?: Options$2);
|
|
42
42
|
build(schema: OpenAPIV3.SchemaObject, name: string, description?: string): ts.Node[];
|
|
43
43
|
/**
|
|
44
44
|
* Creates a type node from a given schema.
|
|
@@ -61,10 +61,10 @@ declare class TypeGenerator extends SchemaGenerator<Options$1, OpenAPIV3.SchemaO
|
|
|
61
61
|
private getBaseTypeFromSchema;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
type Options = {
|
|
64
|
+
type Options$1 = {
|
|
65
65
|
fileResolver?: FileResolver;
|
|
66
66
|
};
|
|
67
|
-
declare class ImportsGenerator extends Generator<Options> {
|
|
67
|
+
declare class ImportsGenerator extends Generator<Options$1> {
|
|
68
68
|
build(items: Array<{
|
|
69
69
|
refs: Refs;
|
|
70
70
|
sources: ts.Node[];
|
|
@@ -72,9 +72,26 @@ declare class ImportsGenerator extends Generator<Options> {
|
|
|
72
72
|
}>): Promise<Array<ts.ImportDeclaration> | undefined>;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
type Options = {
|
|
76
|
+
oas: Oas;
|
|
77
|
+
resolvePath: Api['resolvePath'];
|
|
78
|
+
resolveName: PluginContext['resolveName'];
|
|
79
|
+
mode: PathMode;
|
|
80
|
+
fileManager: FileManager;
|
|
81
|
+
directory: string;
|
|
82
|
+
};
|
|
83
|
+
declare class OperationGenerator extends OperationGenerator$1<Options> {
|
|
84
|
+
resolve(operation: Operation): Promise<Resolver>;
|
|
85
|
+
all(): Promise<File | null>;
|
|
86
|
+
get(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
|
|
87
|
+
post(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
|
|
88
|
+
put(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
|
|
89
|
+
delete(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
|
|
90
|
+
}
|
|
91
|
+
|
|
75
92
|
type Config = {
|
|
93
|
+
resolveName: PluginContext['resolveName'];
|
|
76
94
|
fileResolver?: FileResolver;
|
|
77
|
-
nameResolver?: (name: string) => string;
|
|
78
95
|
withJSDocs?: boolean;
|
|
79
96
|
withImports?: boolean;
|
|
80
97
|
};
|
|
@@ -94,4 +111,4 @@ declare const keywordTypeNodes: {
|
|
|
94
111
|
readonly null: ts.LiteralTypeNode;
|
|
95
112
|
};
|
|
96
113
|
|
|
97
|
-
export { Api, ImportsGenerator, Options$
|
|
114
|
+
export { Api, ImportsGenerator, OperationGenerator, Options$3 as Options, PluginOptions, Refs, TypeBuilder, TypeGenerator, definePlugin as default, definePlugin, keywordTypeNodes, pluginName };
|