@kubb/swagger-ts 1.13.0 → 1.14.0-canary.20231018T192933

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