@kubb/swagger-ts 1.0.0 → 1.0.2
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 +59 -63
- package/dist/index.js +61 -64
- package/package.json +8 -9
- package/src/builders/TypeBuilder.ts +3 -3
- package/src/builders/index.ts +1 -1
- package/src/generators/OperationGenerator.ts +2 -2
- package/src/generators/TypeGenerator.ts +5 -6
- package/src/generators/index.ts +2 -2
- package/src/index.ts +7 -6
- package/src/plugin.ts +4 -4
- package/src/utils/index.ts +1 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -9,14 +9,12 @@ var core = require('@kubb/core');
|
|
|
9
9
|
var swagger = require('@kubb/swagger');
|
|
10
10
|
var tsCodegen = require('@kubb/ts-codegen');
|
|
11
11
|
var ts = require('typescript');
|
|
12
|
-
var uniq = require('lodash.uniq');
|
|
13
12
|
var uniqueId = require('lodash.uniqueid');
|
|
14
13
|
|
|
15
14
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
15
|
|
|
17
16
|
var pathParser__default = /*#__PURE__*/_interopDefault(pathParser);
|
|
18
17
|
var ts__default = /*#__PURE__*/_interopDefault(ts);
|
|
19
|
-
var uniq__default = /*#__PURE__*/_interopDefault(uniq);
|
|
20
18
|
var uniqueId__default = /*#__PURE__*/_interopDefault(uniqueId);
|
|
21
19
|
|
|
22
20
|
module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('out.js', document.baseURI).href)));
|
|
@@ -143,7 +141,7 @@ var _TypeGenerator = class extends core.SchemaGenerator {
|
|
|
143
141
|
const { $ref } = obj;
|
|
144
142
|
let ref = this.refs[$ref];
|
|
145
143
|
if (ref) {
|
|
146
|
-
return factory2.createTypeReferenceNode(ref.propertyName, void 0);
|
|
144
|
+
return factory2.createTypeReferenceNode(ref.name ?? ref.propertyName, void 0);
|
|
147
145
|
}
|
|
148
146
|
const originalName = changeCase.pascalCase(core.getUniqueName($ref.replace(/.+\//, ""), this.usedAliasNames), { delimiter: "" });
|
|
149
147
|
const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName;
|
|
@@ -205,9 +203,9 @@ var _TypeGenerator = class extends core.SchemaGenerator {
|
|
|
205
203
|
}
|
|
206
204
|
if (schema.enum && baseName) {
|
|
207
205
|
const enumName = core.getUniqueName(baseName, _TypeGenerator.usedEnumNames);
|
|
208
|
-
let enums =
|
|
206
|
+
let enums = [...new Set(schema.enum)].map((key) => [key, key]);
|
|
209
207
|
if ("x-enumNames" in schema) {
|
|
210
|
-
enums =
|
|
208
|
+
enums = [...new Set(schema["x-enumNames"])].map((key, index) => {
|
|
211
209
|
return [key, schema.enum[index]];
|
|
212
210
|
});
|
|
213
211
|
}
|
|
@@ -274,6 +272,62 @@ var _TypeGenerator = class extends core.SchemaGenerator {
|
|
|
274
272
|
var TypeGenerator = _TypeGenerator;
|
|
275
273
|
// Collect the types of all referenced schemas so we can export them later
|
|
276
274
|
__publicField(TypeGenerator, "usedEnumNames", {});
|
|
275
|
+
|
|
276
|
+
// src/builders/TypeBuilder.ts
|
|
277
|
+
function refsSorter(a, b) {
|
|
278
|
+
if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {
|
|
279
|
+
return -1;
|
|
280
|
+
}
|
|
281
|
+
if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {
|
|
282
|
+
return 1;
|
|
283
|
+
}
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
var TypeBuilder = class extends swagger.OasBuilder {
|
|
287
|
+
configure(config) {
|
|
288
|
+
this.config = config;
|
|
289
|
+
if (this.config.fileResolver) {
|
|
290
|
+
this.config.withImports = true;
|
|
291
|
+
}
|
|
292
|
+
return this;
|
|
293
|
+
}
|
|
294
|
+
async print(name) {
|
|
295
|
+
const codes = [];
|
|
296
|
+
const generated = this.items.filter((gen) => name ? gen.name === name : true).sort(core.nameSorter).map((gen) => {
|
|
297
|
+
const generator = new TypeGenerator(this.oas, {
|
|
298
|
+
withJSDocs: this.config.withJSDocs,
|
|
299
|
+
resolveName: this.config.resolveName,
|
|
300
|
+
enumType: this.config.enumType
|
|
301
|
+
});
|
|
302
|
+
const nodes = generator.build(gen.schema, gen.name, gen.description);
|
|
303
|
+
return {
|
|
304
|
+
import: {
|
|
305
|
+
refs: generator.refs,
|
|
306
|
+
name: gen.name
|
|
307
|
+
},
|
|
308
|
+
sources: nodes
|
|
309
|
+
};
|
|
310
|
+
}).sort(refsSorter);
|
|
311
|
+
generated.forEach((item) => {
|
|
312
|
+
codes.push(tsCodegen.print(item.sources));
|
|
313
|
+
});
|
|
314
|
+
if (this.config.withImports) {
|
|
315
|
+
const importsGenerator = new swagger.ImportsGenerator({ fileResolver: this.config.fileResolver });
|
|
316
|
+
const importMeta = await importsGenerator.build(generated.map((item) => item.import));
|
|
317
|
+
if (importMeta) {
|
|
318
|
+
const nodes = importMeta.map((item) => {
|
|
319
|
+
return tsCodegen.createImportDeclaration({
|
|
320
|
+
name: [{ propertyName: item.ref.propertyName, name: item.ref.name }],
|
|
321
|
+
path: item.path,
|
|
322
|
+
isTypeOnly: true
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
codes.unshift(tsCodegen.print(nodes));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return codes.join("\n");
|
|
329
|
+
}
|
|
330
|
+
};
|
|
277
331
|
var OperationGenerator = class extends swagger.OperationGenerator {
|
|
278
332
|
resolve(operation) {
|
|
279
333
|
const { resolvePath, resolveName } = this.options;
|
|
@@ -366,62 +420,6 @@ var OperationGenerator = class extends swagger.OperationGenerator {
|
|
|
366
420
|
}
|
|
367
421
|
};
|
|
368
422
|
|
|
369
|
-
// src/builders/TypeBuilder.ts
|
|
370
|
-
function refsSorter(a, b) {
|
|
371
|
-
if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {
|
|
372
|
-
return -1;
|
|
373
|
-
}
|
|
374
|
-
if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {
|
|
375
|
-
return 1;
|
|
376
|
-
}
|
|
377
|
-
return 0;
|
|
378
|
-
}
|
|
379
|
-
var TypeBuilder = class extends swagger.OasBuilder {
|
|
380
|
-
configure(config) {
|
|
381
|
-
this.config = config;
|
|
382
|
-
if (this.config.fileResolver) {
|
|
383
|
-
this.config.withImports = true;
|
|
384
|
-
}
|
|
385
|
-
return this;
|
|
386
|
-
}
|
|
387
|
-
async print(name) {
|
|
388
|
-
const codes = [];
|
|
389
|
-
const generated = this.items.filter((gen) => name ? gen.name === name : true).sort(core.nameSorter).map((gen) => {
|
|
390
|
-
const generator = new TypeGenerator(this.oas, {
|
|
391
|
-
withJSDocs: this.config.withJSDocs,
|
|
392
|
-
resolveName: this.config.resolveName,
|
|
393
|
-
enumType: this.config.enumType
|
|
394
|
-
});
|
|
395
|
-
const nodes = generator.build(gen.schema, gen.name, gen.description);
|
|
396
|
-
return {
|
|
397
|
-
import: {
|
|
398
|
-
refs: generator.refs,
|
|
399
|
-
name: gen.name
|
|
400
|
-
},
|
|
401
|
-
sources: nodes
|
|
402
|
-
};
|
|
403
|
-
}).sort(refsSorter);
|
|
404
|
-
generated.forEach((item) => {
|
|
405
|
-
codes.push(tsCodegen.print(item.sources));
|
|
406
|
-
});
|
|
407
|
-
if (this.config.withImports) {
|
|
408
|
-
const importsGenerator = new swagger.ImportsGenerator({ fileResolver: this.config.fileResolver });
|
|
409
|
-
const importMeta = await importsGenerator.build(generated.map((item) => item.import));
|
|
410
|
-
if (importMeta) {
|
|
411
|
-
const nodes = importMeta.map((item) => {
|
|
412
|
-
return tsCodegen.createImportDeclaration({
|
|
413
|
-
name: [{ propertyName: item.ref.propertyName, name: item.ref.name }],
|
|
414
|
-
path: item.path,
|
|
415
|
-
isTypeOnly: true
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
codes.unshift(tsCodegen.print(nodes));
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return codes.join("\n");
|
|
422
|
-
}
|
|
423
|
-
};
|
|
424
|
-
|
|
425
423
|
// src/plugin.ts
|
|
426
424
|
var pluginName = "swagger-ts";
|
|
427
425
|
var definePlugin = core.createPlugin((options) => {
|
|
@@ -553,5 +551,3 @@ exports.default = src_default;
|
|
|
553
551
|
exports.definePlugin = definePlugin;
|
|
554
552
|
exports.keywordTypeNodes = keywordTypeNodes;
|
|
555
553
|
exports.pluginName = pluginName;
|
|
556
|
-
//# sourceMappingURL=out.js.map
|
|
557
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'module';
|
|
2
|
-
import pathParser from 'path';
|
|
2
|
+
import pathParser from 'node:path';
|
|
3
3
|
import { pascalCase, pascalCaseTransformMerge, camelCase } from 'change-case';
|
|
4
4
|
import { createPlugin, validatePlugins, getPathMode, renderTemplate, getRelativePath, writeIndexes, nameSorter, SchemaGenerator, getUniqueName } from '@kubb/core';
|
|
5
|
-
import { pluginName as pluginName$1, OperationGenerator as OperationGenerator$1,
|
|
5
|
+
import { pluginName as pluginName$1, OasBuilder, ImportsGenerator, OperationGenerator as OperationGenerator$1, isReference } from '@kubb/swagger';
|
|
6
6
|
import { print, createImportDeclaration, createTypeAliasDeclaration, modifier, appendJSDocToNode, createUnionDeclaration, createPropertySignature, createIndexSignature, createIntersectionDeclaration, createEnumDeclaration, createTupleDeclaration } from '@kubb/ts-codegen';
|
|
7
7
|
import ts from 'typescript';
|
|
8
|
-
import uniq from 'lodash.uniq';
|
|
9
8
|
import uniqueId from 'lodash.uniqueid';
|
|
10
9
|
|
|
11
10
|
createRequire(import.meta.url);
|
|
@@ -132,7 +131,7 @@ var _TypeGenerator = class extends SchemaGenerator {
|
|
|
132
131
|
const { $ref } = obj;
|
|
133
132
|
let ref = this.refs[$ref];
|
|
134
133
|
if (ref) {
|
|
135
|
-
return factory2.createTypeReferenceNode(ref.propertyName, void 0);
|
|
134
|
+
return factory2.createTypeReferenceNode(ref.name ?? ref.propertyName, void 0);
|
|
136
135
|
}
|
|
137
136
|
const originalName = pascalCase(getUniqueName($ref.replace(/.+\//, ""), this.usedAliasNames), { delimiter: "" });
|
|
138
137
|
const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName;
|
|
@@ -194,9 +193,9 @@ var _TypeGenerator = class extends SchemaGenerator {
|
|
|
194
193
|
}
|
|
195
194
|
if (schema.enum && baseName) {
|
|
196
195
|
const enumName = getUniqueName(baseName, _TypeGenerator.usedEnumNames);
|
|
197
|
-
let enums =
|
|
196
|
+
let enums = [...new Set(schema.enum)].map((key) => [key, key]);
|
|
198
197
|
if ("x-enumNames" in schema) {
|
|
199
|
-
enums =
|
|
198
|
+
enums = [...new Set(schema["x-enumNames"])].map((key, index) => {
|
|
200
199
|
return [key, schema.enum[index]];
|
|
201
200
|
});
|
|
202
201
|
}
|
|
@@ -263,6 +262,62 @@ var _TypeGenerator = class extends SchemaGenerator {
|
|
|
263
262
|
var TypeGenerator = _TypeGenerator;
|
|
264
263
|
// Collect the types of all referenced schemas so we can export them later
|
|
265
264
|
__publicField(TypeGenerator, "usedEnumNames", {});
|
|
265
|
+
|
|
266
|
+
// src/builders/TypeBuilder.ts
|
|
267
|
+
function refsSorter(a, b) {
|
|
268
|
+
if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {
|
|
269
|
+
return -1;
|
|
270
|
+
}
|
|
271
|
+
if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {
|
|
272
|
+
return 1;
|
|
273
|
+
}
|
|
274
|
+
return 0;
|
|
275
|
+
}
|
|
276
|
+
var TypeBuilder = class extends OasBuilder {
|
|
277
|
+
configure(config) {
|
|
278
|
+
this.config = config;
|
|
279
|
+
if (this.config.fileResolver) {
|
|
280
|
+
this.config.withImports = true;
|
|
281
|
+
}
|
|
282
|
+
return this;
|
|
283
|
+
}
|
|
284
|
+
async print(name) {
|
|
285
|
+
const codes = [];
|
|
286
|
+
const generated = this.items.filter((gen) => name ? gen.name === name : true).sort(nameSorter).map((gen) => {
|
|
287
|
+
const generator = new TypeGenerator(this.oas, {
|
|
288
|
+
withJSDocs: this.config.withJSDocs,
|
|
289
|
+
resolveName: this.config.resolveName,
|
|
290
|
+
enumType: this.config.enumType
|
|
291
|
+
});
|
|
292
|
+
const nodes = generator.build(gen.schema, gen.name, gen.description);
|
|
293
|
+
return {
|
|
294
|
+
import: {
|
|
295
|
+
refs: generator.refs,
|
|
296
|
+
name: gen.name
|
|
297
|
+
},
|
|
298
|
+
sources: nodes
|
|
299
|
+
};
|
|
300
|
+
}).sort(refsSorter);
|
|
301
|
+
generated.forEach((item) => {
|
|
302
|
+
codes.push(print(item.sources));
|
|
303
|
+
});
|
|
304
|
+
if (this.config.withImports) {
|
|
305
|
+
const importsGenerator = new ImportsGenerator({ fileResolver: this.config.fileResolver });
|
|
306
|
+
const importMeta = await importsGenerator.build(generated.map((item) => item.import));
|
|
307
|
+
if (importMeta) {
|
|
308
|
+
const nodes = importMeta.map((item) => {
|
|
309
|
+
return createImportDeclaration({
|
|
310
|
+
name: [{ propertyName: item.ref.propertyName, name: item.ref.name }],
|
|
311
|
+
path: item.path,
|
|
312
|
+
isTypeOnly: true
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
codes.unshift(print(nodes));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return codes.join("\n");
|
|
319
|
+
}
|
|
320
|
+
};
|
|
266
321
|
var OperationGenerator = class extends OperationGenerator$1 {
|
|
267
322
|
resolve(operation) {
|
|
268
323
|
const { resolvePath, resolveName } = this.options;
|
|
@@ -355,62 +410,6 @@ var OperationGenerator = class extends OperationGenerator$1 {
|
|
|
355
410
|
}
|
|
356
411
|
};
|
|
357
412
|
|
|
358
|
-
// src/builders/TypeBuilder.ts
|
|
359
|
-
function refsSorter(a, b) {
|
|
360
|
-
if (Object.keys(a.import.refs)?.length < Object.keys(b.import.refs)?.length) {
|
|
361
|
-
return -1;
|
|
362
|
-
}
|
|
363
|
-
if (Object.keys(a.import.refs)?.length > Object.keys(b.import.refs)?.length) {
|
|
364
|
-
return 1;
|
|
365
|
-
}
|
|
366
|
-
return 0;
|
|
367
|
-
}
|
|
368
|
-
var TypeBuilder = class extends OasBuilder {
|
|
369
|
-
configure(config) {
|
|
370
|
-
this.config = config;
|
|
371
|
-
if (this.config.fileResolver) {
|
|
372
|
-
this.config.withImports = true;
|
|
373
|
-
}
|
|
374
|
-
return this;
|
|
375
|
-
}
|
|
376
|
-
async print(name) {
|
|
377
|
-
const codes = [];
|
|
378
|
-
const generated = this.items.filter((gen) => name ? gen.name === name : true).sort(nameSorter).map((gen) => {
|
|
379
|
-
const generator = new TypeGenerator(this.oas, {
|
|
380
|
-
withJSDocs: this.config.withJSDocs,
|
|
381
|
-
resolveName: this.config.resolveName,
|
|
382
|
-
enumType: this.config.enumType
|
|
383
|
-
});
|
|
384
|
-
const nodes = generator.build(gen.schema, gen.name, gen.description);
|
|
385
|
-
return {
|
|
386
|
-
import: {
|
|
387
|
-
refs: generator.refs,
|
|
388
|
-
name: gen.name
|
|
389
|
-
},
|
|
390
|
-
sources: nodes
|
|
391
|
-
};
|
|
392
|
-
}).sort(refsSorter);
|
|
393
|
-
generated.forEach((item) => {
|
|
394
|
-
codes.push(print(item.sources));
|
|
395
|
-
});
|
|
396
|
-
if (this.config.withImports) {
|
|
397
|
-
const importsGenerator = new ImportsGenerator({ fileResolver: this.config.fileResolver });
|
|
398
|
-
const importMeta = await importsGenerator.build(generated.map((item) => item.import));
|
|
399
|
-
if (importMeta) {
|
|
400
|
-
const nodes = importMeta.map((item) => {
|
|
401
|
-
return createImportDeclaration({
|
|
402
|
-
name: [{ propertyName: item.ref.propertyName, name: item.ref.name }],
|
|
403
|
-
path: item.path,
|
|
404
|
-
isTypeOnly: true
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
codes.unshift(print(nodes));
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
return codes.join("\n");
|
|
411
|
-
}
|
|
412
|
-
};
|
|
413
|
-
|
|
414
413
|
// src/plugin.ts
|
|
415
414
|
var pluginName = "swagger-ts";
|
|
416
415
|
var definePlugin = createPlugin((options) => {
|
|
@@ -536,5 +535,3 @@ var definePlugin = createPlugin((options) => {
|
|
|
536
535
|
var src_default = definePlugin;
|
|
537
536
|
|
|
538
537
|
export { OperationGenerator, TypeBuilder, TypeGenerator, src_default as default, definePlugin, keywordTypeNodes, pluginName };
|
|
539
|
-
//# sourceMappingURL=out.js.map
|
|
540
|
-
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/swagger-ts",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Generator swagger-ts",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -38,16 +38,14 @@
|
|
|
38
38
|
"!/**/__tests__/**"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@kubb/core": "1.0.0",
|
|
42
|
-
"@kubb/swagger": "1.0.0",
|
|
43
|
-
"@kubb/ts-codegen": "1.0.0",
|
|
44
41
|
"change-case": "^4.1.2",
|
|
45
|
-
"lodash.uniq": "^4.5.0",
|
|
46
42
|
"lodash.uniqueid": "^4.0.1",
|
|
47
|
-
"typescript": "^5.1.3"
|
|
43
|
+
"typescript": "^5.1.3",
|
|
44
|
+
"@kubb/core": "1.0.2",
|
|
45
|
+
"@kubb/swagger": "1.0.2",
|
|
46
|
+
"@kubb/ts-codegen": "1.0.2"
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
|
-
"@types/lodash.uniq": "^4.5.7",
|
|
51
49
|
"@types/lodash.uniqueid": "^4.0.7",
|
|
52
50
|
"tsup": "^6.7.0"
|
|
53
51
|
},
|
|
@@ -56,7 +54,8 @@
|
|
|
56
54
|
"registry": "https://registry.npmjs.org/"
|
|
57
55
|
},
|
|
58
56
|
"engines": {
|
|
59
|
-
"node": "
|
|
57
|
+
"node": ">=16",
|
|
58
|
+
"pnpm": ">=8"
|
|
60
59
|
},
|
|
61
60
|
"scripts": {
|
|
62
61
|
"build": "tsup",
|
|
@@ -67,6 +66,6 @@
|
|
|
67
66
|
"test": "vitest --passWithNoTests",
|
|
68
67
|
"upgrade": "ncu -u",
|
|
69
68
|
"upgrade:local": "ncu --interactive --doctor",
|
|
70
|
-
"typecheck": "tsc -p ./tsconfig.json --noEmit"
|
|
69
|
+
"typecheck": "tsc -p ./tsconfig.json --noEmit --emitDeclarationOnly false"
|
|
71
70
|
}
|
|
72
71
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { FileResolver, Refs } from '@kubb/swagger'
|
|
2
|
+
import { OasBuilder, ImportsGenerator } from '@kubb/swagger'
|
|
3
3
|
import type { PluginContext } from '@kubb/core'
|
|
4
4
|
import { nameSorter } from '@kubb/core'
|
|
5
5
|
import { createImportDeclaration, print } from '@kubb/ts-codegen'
|
|
6
6
|
|
|
7
|
-
import { TypeGenerator } from '../generators'
|
|
7
|
+
import { TypeGenerator } from '../generators/TypeGenerator.ts'
|
|
8
8
|
|
|
9
9
|
import type ts from 'typescript'
|
|
10
10
|
|
package/src/builders/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './TypeBuilder'
|
|
1
|
+
export * from './TypeBuilder.ts'
|
|
@@ -3,8 +3,8 @@ import { getRelativePath } from '@kubb/core'
|
|
|
3
3
|
import { OperationGenerator as Generator } from '@kubb/swagger'
|
|
4
4
|
import type { FileResolver, Oas, Operation, OperationSchemas, Resolver } from '@kubb/swagger'
|
|
5
5
|
|
|
6
|
-
import { TypeBuilder } from '../builders'
|
|
7
|
-
import { pluginName } from '../plugin'
|
|
6
|
+
import { TypeBuilder } from '../builders/index.ts'
|
|
7
|
+
import { pluginName } from '../plugin.ts'
|
|
8
8
|
|
|
9
9
|
type Options = {
|
|
10
10
|
oas: Oas
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-param-reassign */
|
|
2
2
|
import ts from 'typescript'
|
|
3
3
|
import { pascalCase, camelCase } from 'change-case'
|
|
4
|
-
import uniq from 'lodash.uniq'
|
|
5
4
|
import uniqueId from 'lodash.uniqueid'
|
|
6
5
|
|
|
7
6
|
import type { PluginContext } from '@kubb/core'
|
|
@@ -20,8 +19,8 @@ import {
|
|
|
20
19
|
modifier,
|
|
21
20
|
} from '@kubb/ts-codegen'
|
|
22
21
|
|
|
23
|
-
import { keywordTypeNodes } from '../utils'
|
|
24
|
-
import { pluginName } from '../plugin'
|
|
22
|
+
import { keywordTypeNodes } from '../utils/index.ts'
|
|
23
|
+
import { pluginName } from '../plugin.ts'
|
|
25
24
|
|
|
26
25
|
const { factory } = ts
|
|
27
26
|
|
|
@@ -163,7 +162,7 @@ export class TypeGenerator extends SchemaGenerator<Options, OpenAPIV3.SchemaObje
|
|
|
163
162
|
let ref = this.refs[$ref]
|
|
164
163
|
|
|
165
164
|
if (ref) {
|
|
166
|
-
return factory.createTypeReferenceNode(ref.propertyName, undefined)
|
|
165
|
+
return factory.createTypeReferenceNode(ref.name ?? ref.propertyName, undefined)
|
|
167
166
|
}
|
|
168
167
|
|
|
169
168
|
const originalName = pascalCase(getUniqueName($ref.replace(/.+\//, ''), this.usedAliasNames), { delimiter: '' })
|
|
@@ -251,10 +250,10 @@ export class TypeGenerator extends SchemaGenerator<Options, OpenAPIV3.SchemaObje
|
|
|
251
250
|
if (schema.enum && baseName) {
|
|
252
251
|
const enumName = getUniqueName(baseName, TypeGenerator.usedEnumNames)
|
|
253
252
|
|
|
254
|
-
let enums: [key: string, value: string | number][] =
|
|
253
|
+
let enums: [key: string, value: string | number][] = [...new Set(schema.enum)]!.map((key) => [key, key])
|
|
255
254
|
|
|
256
255
|
if ('x-enumNames' in schema) {
|
|
257
|
-
enums =
|
|
256
|
+
enums = [...new Set(schema['x-enumNames'] as string[])].map((key: string, index) => {
|
|
258
257
|
return [key, schema.enum![index]]
|
|
259
258
|
})
|
|
260
259
|
}
|
package/src/generators/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './TypeGenerator'
|
|
2
|
-
export * from './OperationGenerator'
|
|
1
|
+
export * from './TypeGenerator.ts'
|
|
2
|
+
export * from './OperationGenerator.ts'
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { definePlugin } from './plugin'
|
|
1
|
+
import { definePlugin } from './plugin.ts'
|
|
2
2
|
|
|
3
|
-
export * from './plugin'
|
|
4
|
-
export * from './
|
|
5
|
-
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
3
|
+
export * from './plugin.ts'
|
|
4
|
+
export * from './types.ts'
|
|
5
|
+
|
|
6
|
+
export * from './generators/index.ts'
|
|
7
|
+
export * from './builders/index.ts'
|
|
8
|
+
export * from './utils/index.ts'
|
|
8
9
|
export default definePlugin
|
package/src/plugin.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
3
|
/* eslint-disable no-console */
|
|
4
4
|
|
|
5
|
-
import pathParser from 'path'
|
|
5
|
+
import pathParser from 'node:path'
|
|
6
6
|
|
|
7
7
|
import { pascalCase, pascalCaseTransformMerge } from 'change-case'
|
|
8
8
|
|
|
@@ -10,10 +10,10 @@ import { getRelativePath, createPlugin, getPathMode, validatePlugins, writeIndex
|
|
|
10
10
|
import { pluginName as swaggerPluginName } from '@kubb/swagger'
|
|
11
11
|
import type { Api as SwaggerApi, OpenAPIV3 } from '@kubb/swagger'
|
|
12
12
|
|
|
13
|
-
import { TypeBuilder } from './builders'
|
|
14
|
-
import { OperationGenerator } from './generators/
|
|
13
|
+
import { TypeBuilder } from './builders/index.ts'
|
|
14
|
+
import { OperationGenerator } from './generators/index.ts'
|
|
15
15
|
|
|
16
|
-
import type { PluginOptions } from './types'
|
|
16
|
+
import type { PluginOptions } from './types.ts'
|
|
17
17
|
|
|
18
18
|
export const pluginName = 'swagger-ts' as const
|
|
19
19
|
|
package/src/utils/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './keywordTypeNodes'
|
|
1
|
+
export * from './keywordTypeNodes.ts'
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/builders/TypeBuilder.ts","../src/generators/TypeGenerator.ts","../src/utils/keywordTypeNodes.ts","../src/generators/OperationGenerator.ts","../src/index.ts"],"names":["pascalCase","getRelativePath","ts","factory","node","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, writeIndexes, renderTemplate } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\nimport type { Api as SwaggerApi, OpenAPIV3 } from '@kubb/swagger'\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 === false) {\n return\n }\n\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const files = await writeIndexes(root, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n\n if (files) {\n await this.addFile(...files)\n }\n },\n }\n})\n","import { OasBuilder } from '@kubb/swagger'\nimport { FileResolver, ImportsGenerator, Refs } from '@kubb/swagger'\nimport type { PluginContext } from '@kubb/core'\nimport { nameSorter } from '@kubb/core'\nimport { createImportDeclaration, print } from '@kubb/ts-codegen'\n\nimport { TypeGenerator } from '../generators'\n\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}\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 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 import: {\n refs: generator.refs,\n name: gen.name,\n },\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 importMeta = await 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, name: item.ref.name }],\n path: item.path,\n isTypeOnly: true,\n })\n })\n\n codes.unshift(print(nodes))\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'\nimport uniqueId from 'lodash.uniqueid'\n\nimport type { PluginContext } from '@kubb/core'\nimport { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport type { Oas, OpenAPIV3, Refs } from '@kubb/swagger'\nimport { isReference } from '@kubb/swagger'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createPropertySignature,\n createTupleDeclaration,\n createTypeAliasDeclaration,\n createUnionDeclaration,\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\ntype Options = {\n withJSDocs?: boolean\n resolveName: PluginContext['resolveName']\n enumType: 'enum' | 'asConst' | 'asPascalConst'\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, baseName: string, description?: string) {\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: [modifier.export],\n name: this.options.resolveName({ name: baseName, pluginName }) || baseName,\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 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 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 = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n\n if (!type) {\n return null\n }\n\n if (!isRequired) {\n type = createUnionDeclaration({ nodes: [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, 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 = pascalCase(getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames), { delimiter: '' })\n const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName\n\n if (originalName === baseName) {\n // eslint-disable-next-line no-multi-assign\n ref = this.refs[$ref] = {\n propertyName,\n originalName,\n name: uniqueId(propertyName),\n }\n\n return factory.createTypeReferenceNode(ref.name!, undefined)\n }\n\n // eslint-disable-next-line no-multi-assign\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 return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutOneOf, baseName),\n factory.createParenthesizedType(\n createUnionDeclaration({\n nodes: 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, baseName),\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 /**\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][] = 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 (schema.enum) {\n return createUnionDeclaration({\n nodes: schema.enum.map((name) => {\n return factory.createLiteralTypeNode(typeof name === 'number' ? factory.createNumericLiteral(name) : factory.createStringLiteral(`${name}`))\n }),\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 }),\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\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 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 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' | 'asPascalConst'\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.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/builders/TypeBuilder.ts","../src/generators/TypeGenerator.ts","../src/utils/keywordTypeNodes.ts","../src/generators/OperationGenerator.ts","../src/index.ts"],"names":["pascalCase","getRelativePath","ts","factory","node","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, writeIndexes, renderTemplate } from '@kubb/core'\nimport { pluginName as swaggerPluginName } from '@kubb/swagger'\nimport type { Api as SwaggerApi, OpenAPIV3 } from '@kubb/swagger'\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 === false) {\n return\n }\n\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n const files = await writeIndexes(root, { extensions: /\\.ts/, exclude: [/schemas/, /json/] })\n\n if (files) {\n await this.addFile(...files)\n }\n },\n }\n})\n","import { OasBuilder } from '@kubb/swagger'\nimport { FileResolver, ImportsGenerator, Refs } from '@kubb/swagger'\nimport type { PluginContext } from '@kubb/core'\nimport { nameSorter } from '@kubb/core'\nimport { createImportDeclaration, print } from '@kubb/ts-codegen'\n\nimport { TypeGenerator } from '../generators'\n\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}\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 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 import: {\n refs: generator.refs,\n name: gen.name,\n },\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 importMeta = await 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, name: item.ref.name }],\n path: item.path,\n isTypeOnly: true,\n })\n })\n\n codes.unshift(print(nodes))\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'\nimport uniqueId from 'lodash.uniqueid'\n\nimport type { PluginContext } from '@kubb/core'\nimport { getUniqueName, SchemaGenerator } from '@kubb/core'\nimport type { Oas, OpenAPIV3, Refs } from '@kubb/swagger'\nimport { isReference } from '@kubb/swagger'\nimport {\n appendJSDocToNode,\n createEnumDeclaration,\n createIndexSignature,\n createIntersectionDeclaration,\n createPropertySignature,\n createTupleDeclaration,\n createTypeAliasDeclaration,\n createUnionDeclaration,\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\ntype Options = {\n withJSDocs?: boolean\n resolveName: PluginContext['resolveName']\n enumType: 'enum' | 'asConst' | 'asPascalConst'\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, baseName: string, description?: string) {\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: [modifier.export],\n name: this.options.resolveName({ name: baseName, pluginName }) || baseName,\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 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 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 = this.getTypeFromSchema(schema, pascalCase(`${baseName} ${name}`, { delimiter: '' }))\n\n if (!type) {\n return null\n }\n\n if (!isRequired) {\n type = createUnionDeclaration({ nodes: [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, 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 = pascalCase(getUniqueName($ref.replace(/.+\\//, ''), this.usedAliasNames), { delimiter: '' })\n const propertyName = this.options.resolveName({ name: originalName, pluginName }) || originalName\n\n if (originalName === baseName) {\n // eslint-disable-next-line no-multi-assign\n ref = this.refs[$ref] = {\n propertyName,\n originalName,\n name: uniqueId(propertyName),\n }\n\n return factory.createTypeReferenceNode(ref.name!, undefined)\n }\n\n // eslint-disable-next-line no-multi-assign\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 return createIntersectionDeclaration({\n nodes: [\n this.getBaseTypeFromSchema(schemaWithoutOneOf, baseName),\n factory.createParenthesizedType(\n createUnionDeclaration({\n nodes: 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, baseName),\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 /**\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][] = 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 (schema.enum) {\n return createUnionDeclaration({\n nodes: schema.enum.map((name) => {\n return factory.createLiteralTypeNode(typeof name === 'number' ? factory.createNumericLiteral(name) : factory.createStringLiteral(`${name}`))\n }),\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 }),\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\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 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 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' | 'asPascalConst'\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"]}
|