@goast/kotlin 0.0.7 → 0.1.0
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/cjs/lib/file-builder.js +6 -6
- package/cjs/lib/generators/models/model-generator.js +61 -58
- package/cjs/lib/generators/models/models-generator.js +1 -1
- package/cjs/lib/generators/services/okhttp3-clients/okhttp3-client-generator.js +57 -51
- package/cjs/lib/generators/services/spring-controllers/spring-controller-generator.js +51 -37
- package/esm/lib/file-builder.js +6 -6
- package/esm/lib/generators/models/model-generator.js +62 -59
- package/esm/lib/generators/models/models-generator.js +1 -1
- package/esm/lib/generators/services/okhttp3-clients/okhttp3-client-generator.js +57 -51
- package/esm/lib/generators/services/spring-controllers/spring-controller-generator.js +51 -37
- package/package.json +2 -2
- package/types/lib/generators/models/model-generator.d.ts +2 -1
- package/types/lib/generators/models/models.d.ts +0 -1
|
@@ -30,11 +30,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
30
30
|
}
|
|
31
31
|
generateApiInterfaceFileContent(ctx, builder) {
|
|
32
32
|
builder
|
|
33
|
-
.
|
|
33
|
+
.append((builder) => this.generateApiInterfaceAnnotations(ctx, builder))
|
|
34
34
|
.ensureCurrentLineEmpty()
|
|
35
|
-
.
|
|
35
|
+
.append((builder) => this.generateApiInterfaceSignature(ctx, builder))
|
|
36
36
|
.append(' ')
|
|
37
|
-
.
|
|
37
|
+
.parenthesize('{}', (builder) => this.generateApiInterfaceContent(ctx, builder), { multiline: true });
|
|
38
38
|
}
|
|
39
39
|
generateApiInterfaceAnnotations(ctx, builder) {
|
|
40
40
|
builder
|
|
@@ -48,23 +48,25 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
48
48
|
}
|
|
49
49
|
generateApiInterfaceContent(ctx, builder) {
|
|
50
50
|
builder
|
|
51
|
-
.
|
|
51
|
+
.append((builder) => this.generateApiInterfaceDelegateAccessor(ctx, builder))
|
|
52
52
|
.ensurePreviousLineEmpty()
|
|
53
|
-
.
|
|
53
|
+
.append((builder) => this.generateApiInterfaceMethods(ctx, builder));
|
|
54
54
|
}
|
|
55
55
|
generateApiInterfaceDelegateAccessor(ctx, builder) {
|
|
56
56
|
builder.appendLine(`fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = object : ${this.getApiDelegateInterfaceName(ctx)} {}`);
|
|
57
57
|
}
|
|
58
58
|
generateApiInterfaceMethods(ctx, builder) {
|
|
59
|
-
builder.forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().
|
|
59
|
+
builder.forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().append((builder) => this.generateApiInterfaceMethod(ctx, builder, endpoint)));
|
|
60
60
|
}
|
|
61
61
|
generateApiInterfaceMethod(ctx, builder, endpoint) {
|
|
62
62
|
builder
|
|
63
|
-
.
|
|
63
|
+
.append((builder) => this.generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint))
|
|
64
64
|
.ensureCurrentLineEmpty()
|
|
65
|
-
.
|
|
65
|
+
.append((builder) => this.generateApiInterfaceMethodSignature(ctx, builder, endpoint))
|
|
66
66
|
.append(' ')
|
|
67
|
-
.
|
|
67
|
+
.parenthesize('{}', (builder) => this.generateApiInterfaceMethodContent(ctx, builder, endpoint), {
|
|
68
|
+
multiline: true,
|
|
69
|
+
});
|
|
68
70
|
}
|
|
69
71
|
generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint) {
|
|
70
72
|
var _a, _b, _c;
|
|
@@ -75,7 +77,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
75
77
|
['description', this.toStringLiteral(ctx, (_b = endpoint.description) === null || _b === void 0 ? void 0 : _b.trim())],
|
|
76
78
|
[
|
|
77
79
|
'responses',
|
|
78
|
-
(builder) => builder.
|
|
80
|
+
(builder) => builder.parenthesize('[]', (builder) => builder.forEach(endpoint.responses, (builder, response) => builder
|
|
79
81
|
.append('ApiResponse')
|
|
80
82
|
.addImport('ApiResponse', 'io.swagger.v3.oas.annotations.responses')
|
|
81
83
|
.parenthesize('()', (builder) => {
|
|
@@ -83,7 +85,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
83
85
|
return builder
|
|
84
86
|
.append(`responseCode = ${this.toStringLiteral(ctx, (_a = response.statusCode) === null || _a === void 0 ? void 0 : _a.toString())}, `)
|
|
85
87
|
.append(`description = ${this.toStringLiteral(ctx, (_b = response.description) === null || _b === void 0 ? void 0 : _b.trim())}`);
|
|
86
|
-
}))),
|
|
88
|
+
}), { separator: ',\n' }), { multiline: true }),
|
|
87
89
|
endpoint.responses.length > 0,
|
|
88
90
|
],
|
|
89
91
|
])
|
|
@@ -101,13 +103,15 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
101
103
|
generateApiInterfaceMethodSignature(ctx, builder, endpoint) {
|
|
102
104
|
builder
|
|
103
105
|
.append(`suspend fun ${(0, core_1.toCasing)(endpoint.name, 'camel')}`)
|
|
104
|
-
.
|
|
106
|
+
.parenthesize('()', (builder) => this.generateApiInterfaceMethodParameters(ctx, builder, endpoint), {
|
|
107
|
+
multiline: true,
|
|
108
|
+
})
|
|
105
109
|
.append(': ')
|
|
106
|
-
.
|
|
110
|
+
.append((builder) => this.generateApiInterfaceMethodReturnType(ctx, builder, endpoint));
|
|
107
111
|
}
|
|
108
112
|
generateApiInterfaceMethodParameters(ctx, builder, endpoint) {
|
|
109
113
|
const parameters = this.getAllParameters(ctx, endpoint);
|
|
110
|
-
builder.
|
|
114
|
+
builder.forEach(parameters, (builder, parameter) => this.generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
|
|
111
115
|
}
|
|
112
116
|
generateApiInterfaceMethodReturnType(ctx, builder, endpoint) {
|
|
113
117
|
var _a, _b;
|
|
@@ -115,9 +119,9 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
115
119
|
}
|
|
116
120
|
generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
|
|
117
121
|
builder
|
|
118
|
-
.
|
|
122
|
+
.append((builder) => this.generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
|
|
119
123
|
.ensureCurrentLineEmpty()
|
|
120
|
-
.
|
|
124
|
+
.append((builder) => this.generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
|
|
121
125
|
}
|
|
122
126
|
generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
|
|
123
127
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
@@ -158,16 +162,20 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
158
162
|
}
|
|
159
163
|
}
|
|
160
164
|
generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
|
|
165
|
+
var _a;
|
|
161
166
|
builder
|
|
162
167
|
.append((0, core_1.toCasing)(parameter.name, 'camel'))
|
|
163
168
|
.append(': ')
|
|
164
|
-
.
|
|
169
|
+
.append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema))
|
|
170
|
+
.append(!parameter.required && !((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.nullable) ? '?' : '');
|
|
165
171
|
}
|
|
166
172
|
generateApiInterfaceMethodContent(ctx, builder, endpoint) {
|
|
167
173
|
const parameters = this.getAllParameters(ctx, endpoint);
|
|
168
174
|
builder
|
|
169
175
|
.append(`return getDelegate().${(0, core_1.toCasing)(endpoint.name, 'camel')}(`)
|
|
170
|
-
.
|
|
176
|
+
.forEach(parameters, (builder, parameter) => builder.append((0, core_1.toCasing)(parameter.name, 'camel')), {
|
|
177
|
+
separator: ', ',
|
|
178
|
+
})
|
|
171
179
|
.append(')');
|
|
172
180
|
}
|
|
173
181
|
generateApiControllerFile(ctx, dirPath, packageName) {
|
|
@@ -182,11 +190,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
182
190
|
}
|
|
183
191
|
generateApiControllerFileContent(ctx, builder) {
|
|
184
192
|
builder
|
|
185
|
-
.
|
|
193
|
+
.append((builder) => this.generateApiControllerAnnotations(ctx, builder))
|
|
186
194
|
.ensureCurrentLineEmpty()
|
|
187
|
-
.
|
|
195
|
+
.append((builder) => this.generateApiControllerSignature(ctx, builder))
|
|
188
196
|
.append(' ')
|
|
189
|
-
.
|
|
197
|
+
.parenthesize('{}', (builder) => this.generateApiControllerContent(ctx, builder), { multiline: true });
|
|
190
198
|
}
|
|
191
199
|
generateApiControllerAnnotations(ctx, builder) {
|
|
192
200
|
builder
|
|
@@ -202,7 +210,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
202
210
|
builder
|
|
203
211
|
.append('class ')
|
|
204
212
|
.append(this.getApiControllerName(ctx))
|
|
205
|
-
.
|
|
213
|
+
.parenthesize('()', (builder) => this.generateApiControllerParameters(ctx, builder), { multiline: true })
|
|
206
214
|
.append(' : ')
|
|
207
215
|
.append(this.getApiInterfaceName(ctx));
|
|
208
216
|
}
|
|
@@ -219,10 +227,10 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
219
227
|
.appendLine(this.getApiDelegateInterfaceName(ctx))
|
|
220
228
|
.appendLine()
|
|
221
229
|
.append('init ')
|
|
222
|
-
.
|
|
230
|
+
.parenthesize('{}', (builder) => builder
|
|
223
231
|
.append('this.delegate = Optional.ofNullable(delegate).orElse')
|
|
224
232
|
.addImport('Optional', 'java.util')
|
|
225
|
-
.parenthesize('()', (builder) => builder.append('object : ').append(this.getApiDelegateInterfaceName(ctx)).append(' {}')))
|
|
233
|
+
.parenthesize('()', (builder) => builder.append('object : ').append(this.getApiDelegateInterfaceName(ctx)).append(' {}')), { multiline: true })
|
|
226
234
|
.appendLine()
|
|
227
235
|
.appendLine()
|
|
228
236
|
.appendLine(`override fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = delegate`);
|
|
@@ -239,11 +247,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
239
247
|
}
|
|
240
248
|
generateApiDelegateInterfaceFileContent(ctx, builder) {
|
|
241
249
|
builder
|
|
242
|
-
.
|
|
250
|
+
.append((builder) => this.generateApiDelegateInterfaceAnnotations(ctx, builder))
|
|
243
251
|
.ensureCurrentLineEmpty()
|
|
244
|
-
.
|
|
252
|
+
.append((builder) => this.generateApiDelegateInterfaceSignature(ctx, builder))
|
|
245
253
|
.append(' ')
|
|
246
|
-
.
|
|
254
|
+
.parenthesize('{}', (builder) => this.generateApiDelegateInterfaceContent(ctx, builder), { multiline: true });
|
|
247
255
|
}
|
|
248
256
|
generateApiDelegateInterfaceAnnotations(ctx, builder) {
|
|
249
257
|
builder.appendAnnotation('Generated', 'jakarta.annotation', [
|
|
@@ -260,15 +268,17 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
260
268
|
.addImport('NativeWebRequest', 'org.springframework.web.context.request')
|
|
261
269
|
.forEach(ctx.service.endpoints, (builder, endpoint) => builder
|
|
262
270
|
.ensurePreviousLineEmpty()
|
|
263
|
-
.
|
|
271
|
+
.append((builder) => this.generateApiDelegateInterfaceMethod(ctx, builder, endpoint)));
|
|
264
272
|
}
|
|
265
273
|
generateApiDelegateInterfaceMethod(ctx, builder, endpoint) {
|
|
266
274
|
builder
|
|
267
|
-
.
|
|
275
|
+
.append((builder) => this.generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint))
|
|
268
276
|
.ensureCurrentLineEmpty()
|
|
269
|
-
.
|
|
277
|
+
.append((builder) => this.generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint))
|
|
270
278
|
.append(' ')
|
|
271
|
-
.
|
|
279
|
+
.parenthesize('{}', (builder) => this.generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint), {
|
|
280
|
+
multiline: true,
|
|
281
|
+
});
|
|
272
282
|
}
|
|
273
283
|
generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint) {
|
|
274
284
|
// None for now.
|
|
@@ -276,13 +286,15 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
276
286
|
generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint) {
|
|
277
287
|
builder
|
|
278
288
|
.append(`suspend fun ${(0, core_1.toCasing)(endpoint.name, 'camel')}`)
|
|
279
|
-
.
|
|
289
|
+
.parenthesize('()', (builder) => this.generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint), {
|
|
290
|
+
multiline: true,
|
|
291
|
+
})
|
|
280
292
|
.append(': ')
|
|
281
|
-
.
|
|
293
|
+
.append((builder) => this.generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint));
|
|
282
294
|
}
|
|
283
295
|
generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint) {
|
|
284
296
|
const parameters = this.getAllParameters(ctx, endpoint);
|
|
285
|
-
builder.
|
|
297
|
+
builder.forEach(parameters, (builder, parameter) => this.generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
|
|
286
298
|
}
|
|
287
299
|
generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint) {
|
|
288
300
|
var _a, _b;
|
|
@@ -290,18 +302,20 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
|
|
|
290
302
|
}
|
|
291
303
|
generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
|
|
292
304
|
builder
|
|
293
|
-
.
|
|
305
|
+
.append((builder) => this.generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
|
|
294
306
|
.ensureCurrentLineEmpty()
|
|
295
|
-
.
|
|
307
|
+
.append((builder) => this.generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
|
|
296
308
|
}
|
|
297
309
|
generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
|
|
298
310
|
// None for now.
|
|
299
311
|
}
|
|
300
312
|
generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
|
|
313
|
+
var _a;
|
|
301
314
|
builder
|
|
302
315
|
.append((0, core_1.toCasing)(parameter.name, 'camel'))
|
|
303
316
|
.append(': ')
|
|
304
|
-
.
|
|
317
|
+
.append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema))
|
|
318
|
+
.append(!parameter.required && !((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.nullable) ? '?' : '');
|
|
305
319
|
}
|
|
306
320
|
generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint) {
|
|
307
321
|
builder
|
package/esm/lib/file-builder.js
CHANGED
|
@@ -35,9 +35,9 @@ export class KotlinFileBuilder extends SourceBuilder {
|
|
|
35
35
|
allArgs.reduce((c, [key, value]) => { var _a; return c + (key ? key.length + 3 : 0) + ((_a = value === null || value === void 0 ? void 0 : value.length) !== null && _a !== void 0 ? _a : 0); }, 0) > 80;
|
|
36
36
|
this.parenthesize('()', (builder) => builder
|
|
37
37
|
.appendLineIf(multiline)
|
|
38
|
-
.
|
|
38
|
+
.forEach(allArgs, (builder, [name, value]) => builder
|
|
39
39
|
.append(name ? `${name} = ` : '')
|
|
40
|
-
.
|
|
40
|
+
.append((builder) => (typeof value === 'string' ? builder.append(value) : value(builder))), { separator: multiline ? ',\n' : ', ' })
|
|
41
41
|
.appendLineIf(multiline));
|
|
42
42
|
}
|
|
43
43
|
this.appendLine();
|
|
@@ -49,11 +49,11 @@ export class KotlinFileBuilder extends SourceBuilder {
|
|
|
49
49
|
}
|
|
50
50
|
toString(addPadding = true) {
|
|
51
51
|
return new SourceBuilder(this.options)
|
|
52
|
-
.
|
|
53
|
-
.
|
|
54
|
-
.
|
|
52
|
+
.if(this.packageName !== undefined, (builder) => builder.appendLine(`package ${this.packageName}`).appendLine())
|
|
53
|
+
.append((builder) => this.imports.writeTo(builder))
|
|
54
|
+
.if(addPadding, (builder) => builder.ensurePreviousLineEmpty())
|
|
55
55
|
.append(super.toString())
|
|
56
|
-
.
|
|
56
|
+
.if(addPadding, (builder) => builder.ensureCurrentLineEmpty())
|
|
57
57
|
.toString();
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dirname } from 'path';
|
|
2
2
|
import { ensureDirSync, writeFileSync } from 'fs-extra';
|
|
3
|
-
import { resolveAnyOfAndAllOf, toCasing } from '@goast/core';
|
|
3
|
+
import { getSchemaReference, resolveAnyOfAndAllOf, toCasing, } from '@goast/core';
|
|
4
4
|
import { KotlinFileBuilder } from '../../file-builder';
|
|
5
5
|
import { KotlinFileGenerator } from '../file-generator';
|
|
6
6
|
export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
@@ -28,7 +28,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
if (this.shouldGenerateTypeDeclaration(ctx, ctx.schema)) {
|
|
31
|
-
const typeName = this.getDeclarationTypeName(ctx);
|
|
31
|
+
const typeName = this.getDeclarationTypeName(ctx, ctx.schema);
|
|
32
32
|
const packageName = ctx.config.packageName + ctx.config.packageSuffix;
|
|
33
33
|
const filePath = `${ctx.config.outputDir}/${packageName.replace(/\./g, '/')}/${typeName}.kt`;
|
|
34
34
|
console.log(`Generating model ${packageName}.${typeName} to ${filePath}...`);
|
|
@@ -49,8 +49,9 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
49
49
|
generateFileContent(ctx, builder) {
|
|
50
50
|
let schema = ctx.schema;
|
|
51
51
|
if (schema.kind === 'oneOf') {
|
|
52
|
-
schema =
|
|
53
|
-
|
|
52
|
+
schema =
|
|
53
|
+
ctx.config.oneOfBehavior === 'treat-as-any-of'
|
|
54
|
+
? Object.assign(Object.assign({}, schema), { kind: 'combined', anyOf: schema.oneOf, allOf: [], oneOf: undefined }) : Object.assign(Object.assign({}, schema), { kind: 'combined', allOf: schema.oneOf, anyOf: [], oneOf: undefined });
|
|
54
55
|
ctx.schema = schema;
|
|
55
56
|
}
|
|
56
57
|
if (schema.kind === 'object' || schema.kind === 'combined') {
|
|
@@ -69,6 +70,20 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
69
70
|
this.generateType(ctx, builder, schema);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
73
|
+
generateTypeUsage(ctx, builder, schema) {
|
|
74
|
+
schema = getSchemaReference(schema, ['description']);
|
|
75
|
+
if (this.shouldGenerateTypeDeclaration(ctx, schema)) {
|
|
76
|
+
const name = this.getDeclarationTypeName(ctx, schema);
|
|
77
|
+
const packageName = ctx.config.packageName + ctx.config.packageSuffix;
|
|
78
|
+
if (packageName) {
|
|
79
|
+
builder.addImport(name, packageName);
|
|
80
|
+
}
|
|
81
|
+
builder.append(name);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.generateType(ctx, builder, schema);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
72
87
|
generateObjectType(ctx, builder, schema) {
|
|
73
88
|
if (schema.properties.size === 0) {
|
|
74
89
|
if (schema.additionalProperties) {
|
|
@@ -92,13 +107,13 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
92
107
|
}
|
|
93
108
|
generateObjectInterface(ctx, builder, schema) {
|
|
94
109
|
builder
|
|
95
|
-
.
|
|
110
|
+
.append((builder) => this.generateDocumentation(ctx, builder, schema))
|
|
96
111
|
.ensureCurrentLineEmpty()
|
|
97
|
-
.
|
|
112
|
+
.append((builder) => this.generateObjectInterfaceAnnotations(ctx, builder, schema))
|
|
98
113
|
.ensureCurrentLineEmpty()
|
|
99
|
-
.
|
|
114
|
+
.append((builder) => this.generateObjectInterfaceSignature(ctx, builder, schema))
|
|
100
115
|
.append(' ')
|
|
101
|
-
.
|
|
116
|
+
.parenthesize('{}', (builder) => this.generateObjectInterfaceMembers(ctx, builder, schema), { multiline: true });
|
|
102
117
|
}
|
|
103
118
|
generateObjectInterfaceAnnotations(ctx, builder, schema) {
|
|
104
119
|
if (schema.discriminator) {
|
|
@@ -110,66 +125,64 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
110
125
|
]);
|
|
111
126
|
const entries = Object.entries(schema.discriminator.mapping);
|
|
112
127
|
if (entries.length > 0) {
|
|
113
|
-
builder.appendAnnotation('JsonSubTypes', 'com.fasterxml.jackson.annotation', entries.map(([value, schema]) => (builder) => {
|
|
114
|
-
const schemaResult = ctx.getSchemaResult(schema);
|
|
115
|
-
builder
|
|
116
|
-
.append(`JsonSubTypes.Type(value = ${schemaResult.typeName}::class, name = ${this.toStringLiteral(ctx, value)})`)
|
|
117
|
-
.addImport(schemaResult.typeName, schemaResult.packageName);
|
|
118
|
-
}));
|
|
128
|
+
builder.appendAnnotation('JsonSubTypes', 'com.fasterxml.jackson.annotation', entries.map(([value, schema]) => (builder) => builder.append('JsonSubTypes.Type(value = ', (builder) => this.generateTypeUsage(ctx, builder, schema), `::class, name = ${this.toStringLiteral(ctx, value)})`)));
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
}
|
|
122
132
|
generateObjectInterfaceSignature(ctx, builder, schema) {
|
|
123
|
-
builder.append('interface ').append(this.getDeclarationTypeName(ctx));
|
|
133
|
+
builder.append('interface ').append(this.getDeclarationTypeName(ctx, schema));
|
|
124
134
|
}
|
|
125
135
|
generateObjectInterfaceMembers(ctx, builder, schema) {
|
|
126
136
|
builder.forEach(this.sortProperties(ctx, schema, schema.properties.values()), (builder, property) => builder
|
|
127
137
|
.ensurePreviousLineEmpty()
|
|
128
|
-
.
|
|
138
|
+
.append((builder) => this.generateJsonPropertyAnnotation(ctx, builder, schema, property, 'get'))
|
|
129
139
|
.ensureCurrentLineEmpty()
|
|
130
140
|
.append(`val ${toCasing(property.name, 'camel')}: `)
|
|
131
|
-
.
|
|
132
|
-
.
|
|
141
|
+
.append((builder) => this.generateTypeUsage(ctx, builder, property.schema))
|
|
142
|
+
.if(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null')));
|
|
133
143
|
}
|
|
134
144
|
generateObjectDataClass(ctx, builder, schema) {
|
|
135
|
-
const inheritedSchemas = schema.inheritedSchemas
|
|
145
|
+
const inheritedSchemas = schema.inheritedSchemas
|
|
146
|
+
.filter((x) => this.shouldGenerateTypeDeclaration(ctx, x) && !x.isNameGenerated)
|
|
147
|
+
.filter((item, index, self) => self.indexOf(item) === index);
|
|
136
148
|
builder
|
|
137
|
-
.
|
|
149
|
+
.append((builder) => this.generateDocumentation(ctx, builder, schema))
|
|
138
150
|
.append('data class ')
|
|
139
|
-
.append(this.getDeclarationTypeName(ctx))
|
|
140
|
-
.
|
|
151
|
+
.append(this.getDeclarationTypeName(ctx, schema))
|
|
152
|
+
.parenthesizeIf(schema.properties.size > 0, '()', (builder) => builder.forEach(this.sortProperties(ctx, schema, schema.properties.values()), (builder, property) => builder
|
|
141
153
|
.ensurePreviousLineEmpty()
|
|
142
|
-
.
|
|
154
|
+
.append((builder) => this.generateObjectDataClassParameterAnnotations(ctx, builder, schema, property))
|
|
143
155
|
.appendIf(inheritedSchemas.some((x) => this.hasProperty(ctx, x, property.name)), 'override ')
|
|
144
156
|
.append(`val ${toCasing(property.name, 'camel')}: `)
|
|
145
|
-
.
|
|
146
|
-
.
|
|
147
|
-
.
|
|
157
|
+
.append((builder) => this.generateTypeUsage(ctx, builder, property.schema))
|
|
158
|
+
.if(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null')), { separator: ',\n' }), { multiline: true })
|
|
159
|
+
.if(inheritedSchemas.length > 0, (builder) => builder
|
|
148
160
|
.append(' : ')
|
|
149
|
-
.
|
|
150
|
-
|
|
161
|
+
.forEach(inheritedSchemas, (builder, schema) => this.generateTypeUsage(ctx, builder, schema), {
|
|
162
|
+
separator: ', ',
|
|
163
|
+
}))
|
|
151
164
|
.append(' ')
|
|
152
|
-
.
|
|
165
|
+
.parenthesizeIf(schema.additionalProperties !== undefined && schema.additionalProperties !== false, '{}', (builder) => builder.if(schema.additionalProperties !== undefined && schema.additionalProperties !== false, (builder) => builder
|
|
153
166
|
.appendLine('@JsonIgnore')
|
|
154
167
|
.addImport('JsonIgnore', 'com.fasterxml.jackson.annotation')
|
|
155
168
|
.append('val additionalProperties: Mutable')
|
|
156
|
-
.
|
|
169
|
+
.append((builder) => this.generateMapType(ctx, builder, schema))
|
|
157
170
|
.appendLine(' = mutableMapOf()')
|
|
158
171
|
.appendLine()
|
|
159
172
|
.appendLine('@JsonAnySetter')
|
|
160
173
|
.addImport('JsonAnySetter', 'com.fasterxml.jackson.annotation')
|
|
161
174
|
.append('fun set')
|
|
162
|
-
.parenthesize('()', (builder) => builder.append('name: String, value: ').
|
|
175
|
+
.parenthesize('()', (builder) => builder.append('name: String, value: ').if(schema.additionalProperties === true, (builder) => builder.append('Any?'), (builder) => this.generateTypeUsage(ctx, builder, schema.additionalProperties)))
|
|
163
176
|
.append(' ')
|
|
164
|
-
.
|
|
177
|
+
.parenthesize('{}', 'this.additionalProperties[name] = value', { multiline: true })
|
|
165
178
|
.appendLine()
|
|
166
179
|
.appendLine()
|
|
167
180
|
.appendLine('@JsonAnyGetter')
|
|
168
181
|
.addImport('JsonAnyGetter', 'com.fasterxml.jackson.annotation')
|
|
169
182
|
.append('fun getMap(): ')
|
|
170
|
-
.
|
|
183
|
+
.append((builder) => this.generateMapType(ctx, builder, schema))
|
|
171
184
|
.append(' ')
|
|
172
|
-
.
|
|
185
|
+
.parenthesize('{}', 'return this.additionalProperties', { multiline: true })), { multiline: true });
|
|
173
186
|
}
|
|
174
187
|
generateObjectDataClassParameterAnnotations(ctx, builder, schema, property) {
|
|
175
188
|
this.generatePropertyValidationAnnotations(ctx, builder, schema, property);
|
|
@@ -203,7 +216,9 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
203
216
|
builder
|
|
204
217
|
.append('@Schema')
|
|
205
218
|
.addImport('Schema', 'io.swagger.v3.oas.annotations.media')
|
|
206
|
-
.parenthesizeIf(parts.size > 0, '()', (builder) => builder.
|
|
219
|
+
.parenthesizeIf(parts.size > 0, '()', (builder) => builder.forEach(parts.entries(), (builder, [key, value]) => builder.append(`${key} = ${value}`), {
|
|
220
|
+
separator: ', ',
|
|
221
|
+
}))
|
|
207
222
|
.appendLine();
|
|
208
223
|
}
|
|
209
224
|
generateJsonPropertyAnnotation(ctx, builder, schema, property, scope) {
|
|
@@ -214,7 +229,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
214
229
|
.append(this.toStringLiteral(ctx, property.name))
|
|
215
230
|
.appendIf(schema.required.has(property.name), ', required = true'))
|
|
216
231
|
.appendLine()
|
|
217
|
-
.
|
|
232
|
+
.if(property.schema.custom['exclude-when-null'] === true, (builder) => builder
|
|
218
233
|
.append('@get:JsonInclude')
|
|
219
234
|
.addImport('JsonInclude', 'com.fasterxml.jackson.annotation')
|
|
220
235
|
.parenthesize('()', 'JsonInclude.Include.NON_NULL')
|
|
@@ -228,22 +243,10 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
228
243
|
const propertiesType = schema.additionalProperties;
|
|
229
244
|
builder
|
|
230
245
|
.append('Map')
|
|
231
|
-
.parenthesize('<>', (builder) => builder.append('String, ').
|
|
246
|
+
.parenthesize('<>', (builder) => builder.append('String, ').append((builder) => this.generateTypeUsage(ctx, builder, propertiesType)));
|
|
232
247
|
}
|
|
233
248
|
}
|
|
234
249
|
generateType(ctx, builder, schema) {
|
|
235
|
-
if (this.shouldGenerateTypeDeclaration(ctx, schema)) {
|
|
236
|
-
if (schema === ctx.schema) {
|
|
237
|
-
builder.append('Any?');
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
const schemaResult = ctx.getSchemaResult(schema);
|
|
241
|
-
builder.append(schemaResult.typeName);
|
|
242
|
-
if (schemaResult.packageName) {
|
|
243
|
-
builder.addImport(schemaResult.typeName, schemaResult.packageName);
|
|
244
|
-
}
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
250
|
switch (schema.kind) {
|
|
248
251
|
case 'boolean':
|
|
249
252
|
builder.append('Boolean');
|
|
@@ -320,23 +323,23 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
320
323
|
}
|
|
321
324
|
generateEnum(ctx, builder, schema) {
|
|
322
325
|
builder
|
|
323
|
-
.
|
|
326
|
+
.append((builder) => this.generateDocumentation(ctx, builder, schema))
|
|
324
327
|
.append('enum class ')
|
|
325
|
-
.append(this.getDeclarationTypeName(ctx))
|
|
328
|
+
.append(this.getDeclarationTypeName(ctx, schema))
|
|
326
329
|
.append('(val value: String) ')
|
|
327
|
-
.
|
|
330
|
+
.parenthesize('{}', (builder) => {
|
|
328
331
|
var _a;
|
|
329
|
-
return builder.
|
|
332
|
+
return builder.forEach((_a = schema.enum) !== null && _a !== void 0 ? _a : [], (builder, value) => builder
|
|
330
333
|
.append('@JsonProperty')
|
|
331
334
|
.addImport('JsonProperty', 'com.fasterxml.jackson.annotation')
|
|
332
335
|
.parenthesize('()', this.toStringLiteral(ctx, String(value)))
|
|
333
336
|
.appendLine()
|
|
334
337
|
.append(toCasing(String(value), 'snake'))
|
|
335
|
-
.parenthesize('()', this.toStringLiteral(ctx, String(value))));
|
|
336
|
-
});
|
|
338
|
+
.parenthesize('()', this.toStringLiteral(ctx, String(value))), { separator: (builder) => builder.appendLine(',').appendLine() });
|
|
339
|
+
}, { multiline: true });
|
|
337
340
|
}
|
|
338
341
|
generateArrayType(ctx, builder, schema) {
|
|
339
|
-
builder.append('List').parenthesize('<>', (builder) => builder.
|
|
342
|
+
builder.append('List').parenthesize('<>', (builder) => builder.if(schema.items === undefined, (builder) => builder.append('Any?'), (builder) => this.generateTypeUsage(ctx, builder, schema.items)));
|
|
340
343
|
}
|
|
341
344
|
generateDocumentation(ctx, builder, schema) {
|
|
342
345
|
var _a, _b;
|
|
@@ -345,7 +348,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
345
348
|
builder
|
|
346
349
|
.ensurePreviousLineEmpty()
|
|
347
350
|
.appendLine('/**')
|
|
348
|
-
.
|
|
351
|
+
.appendWithLinePrefix(' * ', (builder) => builder
|
|
349
352
|
.appendLineIf(!!schema.description, schema.description)
|
|
350
353
|
.forEach(propertiesWithDescription, (builder, property) => { var _a; return builder.appendLine(`@param ${toCasing(property.name, 'camel')} ${(_a = property.schema.description) === null || _a === void 0 ? void 0 : _a.trim()}`); }))
|
|
351
354
|
.appendLine(' */');
|
|
@@ -372,8 +375,8 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
|
|
|
372
375
|
}
|
|
373
376
|
return true;
|
|
374
377
|
}
|
|
375
|
-
getDeclarationTypeName(ctx) {
|
|
376
|
-
return toCasing(
|
|
378
|
+
getDeclarationTypeName(ctx, schema) {
|
|
379
|
+
return toCasing(schema.name, 'pascal');
|
|
377
380
|
}
|
|
378
381
|
sortProperties(ctx, schema, properties) {
|
|
379
382
|
return [...properties].sort((a, b) => {
|
|
@@ -16,7 +16,7 @@ export class KotlinModelsGenerator extends OpenApiSchemasGenerationProviderBase
|
|
|
16
16
|
}
|
|
17
17
|
generateSchema(ctx, schema) {
|
|
18
18
|
const modelGenerator = this._modelGeneratorFactory.create();
|
|
19
|
-
return modelGenerator.generate(Object.assign(Object.assign({}, ctx), { schema
|
|
19
|
+
return modelGenerator.generate(Object.assign(Object.assign({}, ctx), { schema }));
|
|
20
20
|
}
|
|
21
21
|
addSchemaResult(ctx, schema, result) {
|
|
22
22
|
ctx.output.models[schema.id] = result;
|