@kubb/swagger-ts 1.0.0-beta.10 → 1.0.0-beta.12

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 CHANGED
@@ -224,11 +224,6 @@ var _TypeGenerator = class extends core.SchemaGenerator {
224
224
  return this.getTypeFromProperties(schema, name);
225
225
  }
226
226
  if (schema.type) {
227
- if (schema.type === "object") {
228
- if (!schema.additionalProperties && !schema.properties && schema.type === "object") {
229
- return null;
230
- }
231
- }
232
227
  if (Array.isArray(schema.type)) {
233
228
  const [type, nullable] = schema.type;
234
229
  return factory2.createUnionTypeNode(
@@ -275,7 +270,7 @@ var ImportsGenerator = class extends core.Generator {
275
270
  );
276
271
  }).map(async ($ref) => {
277
272
  const { name } = refs[$ref];
278
- const path = await this.options.fileResolver?.(name) || `./${name}`;
273
+ const path = this.options.fileResolver?.(name) || `./${name}`;
279
274
  if (path === "./" || path === ".") {
280
275
  return void 0;
281
276
  }
@@ -289,11 +284,11 @@ var ImportsGenerator = class extends core.Generator {
289
284
  }
290
285
  };
291
286
  var OperationGenerator = class extends swagger.OperationGenerator {
292
- async resolve(operation) {
293
- const { directory, resolvePath, resolveName } = this.options;
287
+ resolve(operation) {
288
+ const { resolvePath, resolveName } = this.options;
294
289
  const name = resolveName({ name: operation.getOperationId(), pluginName });
295
290
  const fileName = `${name}.ts`;
296
- const filePath = await resolvePath(fileName, directory, { tag: operation.getTags()[0]?.name });
291
+ const filePath = resolvePath({ fileName, pluginName, options: { tag: operation.getTags()[0]?.name } });
297
292
  if (!filePath || !name) {
298
293
  throw new Error("Filepath should be defined");
299
294
  }
@@ -307,14 +302,17 @@ var OperationGenerator = class extends swagger.OperationGenerator {
307
302
  return null;
308
303
  }
309
304
  async get(operation, schemas) {
310
- const { resolvePath, directory, mode, resolveName, oas, enumType } = this.options;
311
- const type = await this.resolve(operation);
312
- const fileResolver = async (name) => {
313
- const filePath = await resolvePath(mode === "file" ? "" : type.name, directory, { tag: operation.getTags()[0]?.name });
314
- const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
305
+ const { resolvePath, mode, resolveName, oas, enumType } = this.options;
306
+ const type = this.resolve(operation);
307
+ const fileResolver = (name) => {
308
+ const filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } });
309
+ const resolvedTypeId = resolvePath({
310
+ fileName: `${name}.ts`,
311
+ pluginName
312
+ });
315
313
  return core.getRelativePath(filePath, resolvedTypeId);
316
314
  };
317
- const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.response).add(schemas.errors).configure({ fileResolver, withJSDocs: true, resolveName, enumType }).print();
315
+ const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.response).add(schemas.errors).configure({ fileResolver: mode === "file" ? void 0 : fileResolver, withJSDocs: true, resolveName, enumType }).print();
318
316
  return {
319
317
  path: type.filePath,
320
318
  fileName: type.fileName,
@@ -322,14 +320,17 @@ var OperationGenerator = class extends swagger.OperationGenerator {
322
320
  };
323
321
  }
324
322
  async post(operation, schemas) {
325
- const { resolvePath, directory, mode, resolveName, oas, enumType } = this.options;
326
- const type = await this.resolve(operation);
327
- const fileResolver = async (name) => {
328
- const filePath = await resolvePath(mode === "file" ? "" : type.name, directory, { tag: operation.getTags()[0]?.name });
329
- const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
323
+ const { resolvePath, mode, resolveName, oas, enumType } = this.options;
324
+ const type = this.resolve(operation);
325
+ const fileResolver = (name) => {
326
+ const filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } });
327
+ const resolvedTypeId = resolvePath({
328
+ fileName: `${name}.ts`,
329
+ pluginName
330
+ });
330
331
  return core.getRelativePath(filePath, resolvedTypeId);
331
332
  };
332
- const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure({ fileResolver, withJSDocs: true, resolveName, enumType }).print();
333
+ const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure({ fileResolver: mode === "file" ? void 0 : fileResolver, withJSDocs: true, resolveName, enumType }).print();
333
334
  return {
334
335
  path: type.filePath,
335
336
  fileName: type.fileName,
@@ -337,14 +338,17 @@ var OperationGenerator = class extends swagger.OperationGenerator {
337
338
  };
338
339
  }
339
340
  async put(operation, schemas) {
340
- const { resolvePath, directory, mode, resolveName, oas, enumType } = this.options;
341
- const type = await this.resolve(operation);
342
- const fileResolver = async (name) => {
343
- const filePath = await resolvePath(mode === "file" ? "" : type.name, directory, { tag: operation.getTags()[0]?.name });
344
- const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
341
+ const { resolvePath, mode, resolveName, oas, enumType } = this.options;
342
+ const type = this.resolve(operation);
343
+ const fileResolver = (name) => {
344
+ const filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } });
345
+ const resolvedTypeId = resolvePath({
346
+ fileName: `${name}.ts`,
347
+ pluginName
348
+ });
345
349
  return core.getRelativePath(filePath, resolvedTypeId);
346
350
  };
347
- const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure({ fileResolver, withJSDocs: true, resolveName, enumType }).print();
351
+ const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.queryParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure({ fileResolver: mode === "file" ? void 0 : fileResolver, withJSDocs: true, resolveName, enumType }).print();
348
352
  return {
349
353
  path: type.filePath,
350
354
  fileName: type.fileName,
@@ -352,14 +356,17 @@ var OperationGenerator = class extends swagger.OperationGenerator {
352
356
  };
353
357
  }
354
358
  async delete(operation, schemas) {
355
- const { resolvePath, directory, mode, resolveName, oas, enumType } = this.options;
356
- const type = await this.resolve(operation);
357
- const fileResolver = async (name) => {
358
- const filePath = await resolvePath(mode === "file" ? "" : type.name, directory, { tag: operation.getTags()[0]?.name });
359
- const resolvedTypeId = await resolvePath(`${name}.ts`, directory);
359
+ const { resolvePath, mode, resolveName, oas, enumType } = this.options;
360
+ const type = this.resolve(operation);
361
+ const fileResolver = (name) => {
362
+ const filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } });
363
+ const resolvedTypeId = resolvePath({
364
+ fileName: `${name}.ts`,
365
+ pluginName
366
+ });
360
367
  return core.getRelativePath(filePath, resolvedTypeId);
361
368
  };
362
- const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.request).add(schemas.response).add(schemas.errors).configure({ fileResolver, withJSDocs: true, resolveName, enumType }).print();
369
+ const source = await new TypeBuilder(oas).add(schemas.pathParams).add(schemas.request).add(schemas.queryParams).add(schemas.response).add(schemas.errors).configure({ fileResolver: mode === "file" ? void 0 : fileResolver, withJSDocs: true, resolveName, enumType }).print();
363
370
  return {
364
371
  path: type.filePath,
365
372
  fileName: type.fileName,
@@ -420,27 +427,10 @@ var pluginName = "swagger-ts";
420
427
  var definePlugin = core.createPlugin((options) => {
421
428
  const { output = "models", groupBy, enumType = "asConst" } = options;
422
429
  let swaggerApi;
423
- const api = {
424
- resolvePath(fileName, directory, options2) {
425
- if (!directory) {
426
- return null;
427
- }
428
- const mode = core.getPathMode(pathParser__default.default.resolve(directory, output));
429
- if (mode === "file") {
430
- return pathParser__default.default.resolve(directory, output);
431
- }
432
- if (options2?.tag && groupBy?.type === "tag") {
433
- const template = groupBy.output ? groupBy.output : `${output}/{{tag}}Controller`;
434
- return pathParser__default.default.resolve(directory, core.renderTemplate(template, { tag: options2.tag }), fileName);
435
- }
436
- return pathParser__default.default.resolve(directory, output, fileName);
437
- }
438
- };
439
430
  return {
440
431
  name: pluginName,
441
432
  options,
442
433
  kind: "schema",
443
- api,
444
434
  validate(plugins) {
445
435
  const valid = core.validatePlugins(plugins, [swagger.pluginName]);
446
436
  if (valid) {
@@ -449,7 +439,16 @@ var definePlugin = core.createPlugin((options) => {
449
439
  return valid;
450
440
  },
451
441
  resolvePath(fileName, directory, options2) {
452
- return api.resolvePath(fileName, directory, options2);
442
+ const root = pathParser__default.default.resolve(this.config.root, this.config.output.path);
443
+ const mode = core.getPathMode(pathParser__default.default.resolve(root, output));
444
+ if (mode === "file") {
445
+ return pathParser__default.default.resolve(root, output);
446
+ }
447
+ if (options2?.tag && groupBy?.type === "tag") {
448
+ const template = groupBy.output ? groupBy.output : `${output}/{{tag}}Controller`;
449
+ return pathParser__default.default.resolve(root, core.renderTemplate(template, { tag: options2.tag }), fileName);
450
+ }
451
+ return pathParser__default.default.resolve(root, output, fileName);
453
452
  },
454
453
  resolveName(name) {
455
454
  return changeCase.pascalCase(name, { delimiter: "", transform: changeCase.pascalCaseTransformMerge });
@@ -463,19 +462,18 @@ var definePlugin = core.createPlugin((options) => {
463
462
  async buildStart() {
464
463
  const oas = await swaggerApi.getOas(this.config);
465
464
  const schemas = oas.getDefinition().components?.schemas || {};
466
- const directory = pathParser__default.default.resolve(this.config.root, this.config.output.path);
467
- const mode = core.getPathMode(pathParser__default.default.resolve(directory, output));
465
+ const root = pathParser__default.default.resolve(this.config.root, this.config.output.path);
466
+ const mode = core.getPathMode(pathParser__default.default.resolve(root, output));
468
467
  if (mode === "directory") {
469
468
  const builder = await new TypeBuilder(oas).configure({
470
469
  resolveName: (params) => this.resolveName({ pluginName, ...params }),
471
- fileResolver: async (name) => {
472
- const resolvedTypeId = await this.resolvePath({
470
+ fileResolver: (name) => {
471
+ const resolvedTypeId = this.resolvePath({
473
472
  fileName: `${name}.ts`,
474
- directory,
475
473
  pluginName
476
474
  });
477
- const root = await this.resolvePath({ fileName: ``, directory, pluginName });
478
- return core.getRelativePath(root, resolvedTypeId);
475
+ const root2 = this.resolvePath({ fileName: ``, pluginName });
476
+ return core.getRelativePath(root2, resolvedTypeId);
479
477
  },
480
478
  withJSDocs: true,
481
479
  enumType
@@ -487,7 +485,7 @@ var definePlugin = core.createPlugin((options) => {
487
485
  });
488
486
  });
489
487
  const mapFolderSchema = async ([name]) => {
490
- const path = await this.resolvePath({ fileName: `${this.resolveName({ name, pluginName })}.ts`, directory, pluginName });
488
+ const path = this.resolvePath({ fileName: `${this.resolveName({ name, pluginName })}.ts`, pluginName });
491
489
  if (!path) {
492
490
  return null;
493
491
  }
@@ -512,7 +510,7 @@ var definePlugin = core.createPlugin((options) => {
512
510
  name
513
511
  });
514
512
  });
515
- const path = await this.resolvePath({ fileName: "", directory, pluginName });
513
+ const path = this.resolvePath({ fileName: "", pluginName });
516
514
  if (!path) {
517
515
  return;
518
516
  }
@@ -525,20 +523,19 @@ var definePlugin = core.createPlugin((options) => {
525
523
  const operationGenerator = new OperationGenerator({
526
524
  oas,
527
525
  mode,
528
- directory,
529
- fileManager: this.fileManager,
530
- resolvePath: api.resolvePath,
526
+ resolvePath: (params) => this.resolvePath({ pluginName, ...params }),
531
527
  resolveName: (params) => this.resolveName({ pluginName, ...params }),
532
528
  enumType
533
529
  });
534
- await operationGenerator.build();
530
+ const files = await operationGenerator.build();
531
+ await this.addFile(...files);
535
532
  },
536
533
  async buildEnd() {
537
534
  if (this.config.output.write || this.config.output.write === void 0) {
538
535
  const files = await tsCodegen.writeIndexes(this.config.root, this.config.output.path, { extensions: /\.ts/, exclude: [/schemas/, /json/] });
539
- files?.forEach((file) => {
540
- this.fileManager.add(file);
541
- });
536
+ if (files) {
537
+ await this.addFile(...files);
538
+ }
542
539
  }
543
540
  }
544
541
  };
@@ -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","options"],"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, pascalCaseTransformMerge } from 'change-case'\n\nimport { getRelativePath, createPlugin, getPathMode, validatePlugins, renderTemplate } 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\n// Register your plugin for maximum type safety\ndeclare module '@kubb/core' {\n interface Register {\n ['@kubb/swagger-ts']: PluginOptions['options']\n }\n}\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const { output = 'models', groupBy, enumType = 'asConst' } = options\n let swaggerApi: SwaggerApi\n\n const api: Api = {\n resolvePath(fileName, directory, options) {\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 if (options?.tag && groupBy?.type === 'tag') {\n const template = groupBy.output ? groupBy.output : `${output}/{{tag}}Controller`\n return pathParser.resolve(directory, renderTemplate(template, { tag: options.tag }), fileName)\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, options) {\n return api.resolvePath(fileName, directory, options)\n },\n resolveName(name) {\n return pascalCase(name, { delimiter: '', transform: pascalCaseTransformMerge })\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 enumType,\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 enumType,\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 enumType,\n })\n\n await operationGenerator.build()\n },\n async buildEnd() {\n if (this.config.output.write || this.config.output.write === undefined) {\n const files = await writeIndexes(this.config.root, this.config.output.path, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n files?.forEach((file) => {\n this.fileManager.add(file)\n })\n }\n },\n }\n})\n","import { OasBuilder } 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 enumType: 'enum' | 'asConst'\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, {\n withJSDocs: this.config.withJSDocs,\n resolveName: this.config.resolveName,\n enumType: this.config.enumType,\n })\n const nodes = generator.build(gen.schema, 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 enumType: 'enum' | 'asConst'\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, enumType: 'asConst' }) {\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: this.options.resolveName({ name, pluginName }) || 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\n let enums: [key: string, value: string | number][] = uniq(schema.enum)!.map((key) => [key, key])\n\n if ('x-enumNames' in schema) {\n enums = uniq(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, { delimiter: '' }),\n typeName: pascalCase(enumName, { delimiter: '' }),\n enums,\n type: this.options.enumType,\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 enumType: 'enum' | 'asConst'\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, { tag: operation.getTags()[0]?.name })\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, enumType } = 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, { tag: operation.getTags()[0]?.name })\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 .add(schemas.errors)\n .configure({ fileResolver, withJSDocs: true, resolveName, enumType })\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, enumType } = 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, { tag: operation.getTags()[0]?.name })\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 .add(schemas.errors)\n .configure({ fileResolver, withJSDocs: true, resolveName, enumType })\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, enumType } = 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, { tag: operation.getTags()[0]?.name })\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 .add(schemas.errors)\n .configure({ fileResolver, withJSDocs: true, resolveName, enumType })\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, enumType } = 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, { tag: operation.getTags()[0]?.name })\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 .add(schemas.errors)\n .configure({ fileResolver, withJSDocs: true, resolveName, enumType })\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"]}
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","options","root"],"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, pascalCaseTransformMerge } from 'change-case'\n\nimport { getRelativePath, createPlugin, getPathMode, validatePlugins, renderTemplate } 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 { PluginOptions } from './types'\n\nexport const pluginName = 'swagger-ts' as const\n\n// Register your plugin for maximum type safety\ndeclare module '@kubb/core' {\n interface Register {\n ['@kubb/swagger-ts']: PluginOptions['options']\n }\n}\n\nexport const definePlugin = createPlugin<PluginOptions>((options) => {\n const { output = 'models', groupBy, enumType = 'asConst' } = options\n let swaggerApi: SwaggerApi\n\n return {\n name: pluginName,\n options,\n kind: 'schema',\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, 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 template = groupBy.output ? groupBy.output : `${output}/{{tag}}Controller`\n\n return pathParser.resolve(root, renderTemplate(template, { tag: options.tag }), fileName)\n }\n\n return pathParser.resolve(root, output, fileName)\n },\n resolveName(name) {\n return pascalCase(name, { delimiter: '', transform: pascalCaseTransformMerge })\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 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 fileName: `${name}.ts`,\n pluginName,\n })\n\n const root = this.resolvePath({ fileName: ``, pluginName })\n\n return getRelativePath(root, resolvedTypeId)\n },\n withJSDocs: true,\n enumType,\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({ fileName: `${this.resolveName({ name, pluginName })}.ts`, 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 enumType,\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({ fileName: '', 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 resolvePath: (params) => this.resolvePath({ pluginName, ...params }),\n resolveName: (params) => this.resolveName({ pluginName, ...params }),\n enumType,\n })\n\n const files = await operationGenerator.build()\n await this.addFile(...files)\n },\n async buildEnd() {\n if (this.config.output.write || this.config.output.write === undefined) {\n const files = await writeIndexes(this.config.root, this.config.output.path, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n\n if (files) {\n await this.addFile(...files)\n }\n }\n },\n }\n})\n","import { OasBuilder } 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 enumType: 'enum' | 'asConst'\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, {\n withJSDocs: this.config.withJSDocs,\n resolveName: this.config.resolveName,\n enumType: this.config.enumType,\n })\n const nodes = generator.build(gen.schema, 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 enumType: 'enum' | 'asConst'\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, enumType: 'asConst' }) {\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: this.options.resolveName({ name, pluginName }) || 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\n let enums: [key: string, value: string | number][] = uniq(schema.enum)!.map((key) => [key, key])\n\n if ('x-enumNames' in schema) {\n enums = uniq(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, { delimiter: '' }),\n typeName: pascalCase(enumName, { delimiter: '' }),\n enums,\n type: this.options.enumType,\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 (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 = 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, 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\ntype Options = {\n oas: Oas\n resolvePath: PluginContext['resolvePath']\n resolveName: PluginContext['resolveName']\n mode: PathMode\n enumType: 'enum' | 'asConst'\n}\n\nexport class OperationGenerator extends Generator<Options> {\n resolve(operation: Operation): Resolver {\n const { resolvePath, resolveName } = this.options\n\n const name = resolveName({ name: operation.getOperationId(), pluginName })\n const fileName = `${name}.ts`\n const filePath = resolvePath({ fileName, pluginName, options: { tag: operation.getTags()[0]?.name } })\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, mode, resolveName, oas, enumType } = 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 filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = resolvePath({\n fileName: `${name}.ts`,\n pluginName,\n })\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 .add(schemas.errors)\n .configure({ fileResolver: mode === 'file' ? undefined : fileResolver, withJSDocs: true, resolveName, enumType })\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, mode, resolveName, oas, enumType } = 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 filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = resolvePath({\n fileName: `${name}.ts`,\n pluginName,\n })\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 .add(schemas.errors)\n .configure({ fileResolver: mode === 'file' ? undefined : fileResolver, withJSDocs: true, resolveName, enumType })\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, mode, resolveName, oas, enumType } = 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 filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = resolvePath({\n fileName: `${name}.ts`,\n pluginName,\n })\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 .add(schemas.errors)\n .configure({ fileResolver: mode === 'file' ? undefined : fileResolver, withJSDocs: true, resolveName, enumType })\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, mode, resolveName, oas, enumType } = 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 filePath = resolvePath({ fileName: type.fileName, pluginName, options: { tag: operation.getTags()[0]?.name } })\n // refs import, will always been created with the SwaggerTS plugin, our global type\n const resolvedTypeId = resolvePath({\n fileName: `${name}.ts`,\n pluginName,\n })\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.queryParams)\n .add(schemas.response)\n .add(schemas.errors)\n .configure({ fileResolver: mode === 'file' ? undefined : fileResolver, withJSDocs: true, resolveName, enumType })\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,11 +1,8 @@
1
1
  import * as _kubb_core from '@kubb/core';
2
- import { PluginFactoryOptions, SchemaGenerator, PluginContext, Generator, File, PathMode, FileManager } from '@kubb/core';
2
+ import { PluginFactoryOptions, SchemaGenerator, PluginContext, Generator, File, PathMode } from '@kubb/core';
3
3
  import ts from 'typescript';
4
4
  import { OpenAPIV3, Oas, FileResolver, OperationGenerator as OperationGenerator$1, Operation, Resolver, OperationSchemas, OasBuilder } from '@kubb/swagger';
5
5
 
6
- type Api = {
7
- resolvePath: (fileName: string, directory: string | undefined, options?: ResolvePathOptions) => string | null;
8
- };
9
6
  type Options$3 = {
10
7
  /**
11
8
  * Relative path to save the TypeScript types.
@@ -39,7 +36,7 @@ type Options$3 = {
39
36
  type ResolvePathOptions = {
40
37
  tag?: string;
41
38
  };
42
- type PluginOptions = PluginFactoryOptions<Options$3, false, Api, ResolvePathOptions>;
39
+ type PluginOptions = PluginFactoryOptions<Options$3, false, unknown, ResolvePathOptions>;
43
40
 
44
41
  declare const pluginName: "swagger-ts";
45
42
  declare module '@kubb/core' {
@@ -105,15 +102,13 @@ declare class ImportsGenerator extends Generator<Options$1> {
105
102
 
106
103
  type Options = {
107
104
  oas: Oas;
108
- resolvePath: Api['resolvePath'];
105
+ resolvePath: PluginContext['resolvePath'];
109
106
  resolveName: PluginContext['resolveName'];
110
107
  mode: PathMode;
111
- fileManager: FileManager;
112
- directory: string;
113
108
  enumType: 'enum' | 'asConst';
114
109
  };
115
110
  declare class OperationGenerator extends OperationGenerator$1<Options> {
116
- resolve(operation: Operation): Promise<Resolver>;
111
+ resolve(operation: Operation): Resolver;
117
112
  all(): Promise<File | null>;
118
113
  get(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
119
114
  post(operation: Operation, schemas: OperationSchemas): Promise<File | null>;
@@ -144,4 +139,4 @@ declare const keywordTypeNodes: {
144
139
  readonly null: ts.LiteralTypeNode;
145
140
  };
146
141
 
147
- export { Api, ImportsGenerator, OperationGenerator, Options$3 as Options, PluginOptions, Refs, ResolvePathOptions, TypeBuilder, TypeGenerator, definePlugin as default, definePlugin, keywordTypeNodes, pluginName };
142
+ export { ImportsGenerator, OperationGenerator, Options$3 as Options, PluginOptions, Refs, ResolvePathOptions, TypeBuilder, TypeGenerator, definePlugin as default, definePlugin, keywordTypeNodes, pluginName };