@goast/kotlin 0.1.18 → 0.2.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.
Files changed (179) hide show
  1. package/cjs/index.js +3 -0
  2. package/cjs/lib/ast/_index.js +81 -0
  3. package/cjs/lib/ast/common.js +2 -0
  4. package/cjs/lib/ast/index.js +5 -0
  5. package/cjs/lib/ast/node.js +10 -0
  6. package/cjs/lib/ast/nodes/annotation.js +39 -0
  7. package/cjs/lib/ast/nodes/argument.js +32 -0
  8. package/cjs/lib/ast/nodes/call.js +37 -0
  9. package/cjs/lib/ast/nodes/class.js +94 -0
  10. package/cjs/lib/ast/nodes/collection-literal.js +24 -0
  11. package/cjs/lib/ast/nodes/constructor.js +75 -0
  12. package/cjs/lib/ast/nodes/doc-tag.js +60 -0
  13. package/cjs/lib/ast/nodes/doc.js +55 -0
  14. package/cjs/lib/ast/nodes/enum-value.js +50 -0
  15. package/cjs/lib/ast/nodes/enum.js +83 -0
  16. package/cjs/lib/ast/nodes/function.js +105 -0
  17. package/cjs/lib/ast/nodes/generic-parameter.js +29 -0
  18. package/cjs/lib/ast/nodes/init-block.js +19 -0
  19. package/cjs/lib/ast/nodes/interface.js +68 -0
  20. package/cjs/lib/ast/nodes/lambda-type.js +44 -0
  21. package/cjs/lib/ast/nodes/lambda.js +36 -0
  22. package/cjs/lib/ast/nodes/object.js +58 -0
  23. package/cjs/lib/ast/nodes/parameter.js +57 -0
  24. package/cjs/lib/ast/nodes/property.js +142 -0
  25. package/cjs/lib/ast/nodes/reference.js +79 -0
  26. package/cjs/lib/ast/nodes/string.js +87 -0
  27. package/cjs/lib/ast/nodes/types.js +2 -0
  28. package/cjs/lib/ast/references/index.js +12 -0
  29. package/cjs/lib/ast/references/jackson.js +12 -0
  30. package/cjs/lib/ast/references/jakarta.js +10 -0
  31. package/cjs/lib/ast/references/java.js +14 -0
  32. package/cjs/lib/ast/references/kotlin.js +27 -0
  33. package/cjs/lib/ast/references/okhttp3.js +7 -0
  34. package/cjs/lib/ast/references/reactor.js +6 -0
  35. package/cjs/lib/ast/references/spring.js +21 -0
  36. package/cjs/lib/ast/references/swagger.js +11 -0
  37. package/cjs/lib/ast/utils/get-kotlin-builder-options.js +19 -0
  38. package/cjs/lib/ast/utils/to-kt-node.js +22 -0
  39. package/cjs/lib/ast/utils/write-kt-annotations.js +13 -0
  40. package/cjs/lib/ast/utils/write-kt-arguments.js +33 -0
  41. package/cjs/lib/ast/utils/write-kt-enum-values.js +17 -0
  42. package/cjs/lib/ast/utils/write-kt-generic-parameters.js +12 -0
  43. package/cjs/lib/ast/utils/write-kt-members.js +16 -0
  44. package/cjs/lib/ast/utils/write-kt-node.js +24 -0
  45. package/cjs/lib/ast/utils/write-kt-parameters.js +13 -0
  46. package/cjs/lib/config.js +15 -1
  47. package/cjs/lib/file-builder.js +17 -2
  48. package/cjs/lib/generators/models/args.js +2 -0
  49. package/cjs/lib/generators/models/index.js +2 -0
  50. package/cjs/lib/generators/models/model-generator.js +277 -322
  51. package/cjs/lib/generators/services/okhttp3-clients/args.js +2 -0
  52. package/cjs/lib/generators/services/okhttp3-clients/index.js +2 -0
  53. package/cjs/lib/generators/services/okhttp3-clients/okhttp3-client-generator.js +240 -348
  54. package/cjs/lib/generators/services/okhttp3-clients/okhttp3-clients-generator.js +4 -1
  55. package/cjs/lib/generators/services/okhttp3-clients/refs.js +34 -0
  56. package/cjs/lib/generators/services/spring-controllers/args.js +2 -0
  57. package/cjs/lib/generators/services/spring-controllers/index.js +2 -0
  58. package/cjs/lib/generators/services/spring-controllers/spring-controller-generator.js +270 -346
  59. package/cjs/lib/import-collection.js +24 -15
  60. package/esm/index.js +3 -0
  61. package/esm/lib/ast/_index.js +27 -0
  62. package/esm/lib/ast/common.js +1 -0
  63. package/esm/lib/ast/index.js +2 -0
  64. package/esm/lib/ast/node.js +6 -0
  65. package/esm/lib/ast/nodes/annotation.js +35 -0
  66. package/esm/lib/ast/nodes/argument.js +28 -0
  67. package/esm/lib/ast/nodes/call.js +33 -0
  68. package/esm/lib/ast/nodes/class.js +90 -0
  69. package/esm/lib/ast/nodes/collection-literal.js +20 -0
  70. package/esm/lib/ast/nodes/constructor.js +71 -0
  71. package/esm/lib/ast/nodes/doc-tag.js +56 -0
  72. package/esm/lib/ast/nodes/doc.js +51 -0
  73. package/esm/lib/ast/nodes/enum-value.js +46 -0
  74. package/esm/lib/ast/nodes/enum.js +79 -0
  75. package/esm/lib/ast/nodes/function.js +101 -0
  76. package/esm/lib/ast/nodes/generic-parameter.js +25 -0
  77. package/esm/lib/ast/nodes/init-block.js +15 -0
  78. package/esm/lib/ast/nodes/interface.js +64 -0
  79. package/esm/lib/ast/nodes/lambda-type.js +40 -0
  80. package/esm/lib/ast/nodes/lambda.js +32 -0
  81. package/esm/lib/ast/nodes/object.js +54 -0
  82. package/esm/lib/ast/nodes/parameter.js +53 -0
  83. package/esm/lib/ast/nodes/property.js +135 -0
  84. package/esm/lib/ast/nodes/reference.js +75 -0
  85. package/esm/lib/ast/nodes/string.js +83 -0
  86. package/esm/lib/ast/nodes/types.js +1 -0
  87. package/esm/lib/ast/references/index.js +15 -0
  88. package/esm/lib/ast/references/jackson.js +9 -0
  89. package/esm/lib/ast/references/jakarta.js +7 -0
  90. package/esm/lib/ast/references/java.js +11 -0
  91. package/esm/lib/ast/references/kotlin.js +24 -0
  92. package/esm/lib/ast/references/okhttp3.js +4 -0
  93. package/esm/lib/ast/references/reactor.js +3 -0
  94. package/esm/lib/ast/references/spring.js +18 -0
  95. package/esm/lib/ast/references/swagger.js +8 -0
  96. package/esm/lib/ast/utils/get-kotlin-builder-options.js +15 -0
  97. package/esm/lib/ast/utils/to-kt-node.js +18 -0
  98. package/esm/lib/ast/utils/write-kt-annotations.js +9 -0
  99. package/esm/lib/ast/utils/write-kt-arguments.js +29 -0
  100. package/esm/lib/ast/utils/write-kt-enum-values.js +13 -0
  101. package/esm/lib/ast/utils/write-kt-generic-parameters.js +8 -0
  102. package/esm/lib/ast/utils/write-kt-members.js +12 -0
  103. package/esm/lib/ast/utils/write-kt-node.js +19 -0
  104. package/esm/lib/ast/utils/write-kt-parameters.js +9 -0
  105. package/esm/lib/config.js +15 -1
  106. package/esm/lib/file-builder.js +16 -2
  107. package/esm/lib/generators/models/args.js +1 -0
  108. package/esm/lib/generators/models/index.js +2 -0
  109. package/esm/lib/generators/models/model-generator.js +278 -323
  110. package/esm/lib/generators/services/okhttp3-clients/args.js +1 -0
  111. package/esm/lib/generators/services/okhttp3-clients/index.js +2 -0
  112. package/esm/lib/generators/services/okhttp3-clients/okhttp3-client-generator.js +242 -350
  113. package/esm/lib/generators/services/okhttp3-clients/okhttp3-clients-generator.js +4 -1
  114. package/esm/lib/generators/services/okhttp3-clients/refs.js +30 -0
  115. package/esm/lib/generators/services/spring-controllers/args.js +1 -0
  116. package/esm/lib/generators/services/spring-controllers/index.js +2 -0
  117. package/esm/lib/generators/services/spring-controllers/spring-controller-generator.js +269 -346
  118. package/esm/lib/import-collection.js +23 -14
  119. package/package.json +6 -6
  120. package/types/index.d.ts +2 -0
  121. package/types/lib/ast/_index.d.ts +28 -0
  122. package/types/lib/ast/common.d.ts +1 -0
  123. package/types/lib/ast/index.d.ts +1 -0
  124. package/types/lib/ast/node.d.ts +4 -0
  125. package/types/lib/ast/nodes/annotation.d.ts +23 -0
  126. package/types/lib/ast/nodes/argument.d.ts +22 -0
  127. package/types/lib/ast/nodes/call.d.ts +22 -0
  128. package/types/lib/ast/nodes/class.d.ts +54 -0
  129. package/types/lib/ast/nodes/collection-literal.d.ts +17 -0
  130. package/types/lib/ast/nodes/constructor.d.ts +34 -0
  131. package/types/lib/ast/nodes/doc-tag.d.ts +34 -0
  132. package/types/lib/ast/nodes/doc.d.ts +26 -0
  133. package/types/lib/ast/nodes/enum-value.d.ts +30 -0
  134. package/types/lib/ast/nodes/enum.d.ts +45 -0
  135. package/types/lib/ast/nodes/function.d.ts +58 -0
  136. package/types/lib/ast/nodes/generic-parameter.d.ts +21 -0
  137. package/types/lib/ast/nodes/init-block.d.ts +16 -0
  138. package/types/lib/ast/nodes/interface.d.ts +41 -0
  139. package/types/lib/ast/nodes/lambda-type.d.ts +21 -0
  140. package/types/lib/ast/nodes/lambda.d.ts +20 -0
  141. package/types/lib/ast/nodes/object.d.ts +34 -0
  142. package/types/lib/ast/nodes/parameter.d.ts +48 -0
  143. package/types/lib/ast/nodes/property.d.ts +87 -0
  144. package/types/lib/ast/nodes/reference.d.ts +63 -0
  145. package/types/lib/ast/nodes/string.d.ts +30 -0
  146. package/types/lib/ast/nodes/types.d.ts +10 -0
  147. package/types/lib/ast/references/index.d.ts +8 -0
  148. package/types/lib/ast/references/jackson.d.ts +77 -0
  149. package/types/lib/ast/references/jakarta.d.ts +33 -0
  150. package/types/lib/ast/references/java.d.ts +71 -0
  151. package/types/lib/ast/references/kotlin.d.ts +265 -0
  152. package/types/lib/ast/references/okhttp3.d.ts +22 -0
  153. package/types/lib/ast/references/reactor.d.ts +16 -0
  154. package/types/lib/ast/references/spring.d.ts +126 -0
  155. package/types/lib/ast/references/swagger.d.ts +44 -0
  156. package/types/lib/ast/utils/get-kotlin-builder-options.d.ts +3 -0
  157. package/types/lib/ast/utils/to-kt-node.d.ts +7 -0
  158. package/types/lib/ast/utils/write-kt-annotations.d.ts +5 -0
  159. package/types/lib/ast/utils/write-kt-arguments.d.ts +3 -0
  160. package/types/lib/ast/utils/write-kt-enum-values.d.ts +3 -0
  161. package/types/lib/ast/utils/write-kt-generic-parameters.d.ts +3 -0
  162. package/types/lib/ast/utils/write-kt-members.d.ts +5 -0
  163. package/types/lib/ast/utils/write-kt-node.d.ts +7 -0
  164. package/types/lib/ast/utils/write-kt-parameters.d.ts +3 -0
  165. package/types/lib/config.d.ts +4 -0
  166. package/types/lib/file-builder.d.ts +10 -3
  167. package/types/lib/generators/models/args.d.ts +99 -0
  168. package/types/lib/generators/models/index.d.ts +1 -0
  169. package/types/lib/generators/models/model-generator.d.ts +35 -32
  170. package/types/lib/generators/models/models.d.ts +4 -4
  171. package/types/lib/generators/services/okhttp3-clients/args.d.ts +66 -0
  172. package/types/lib/generators/services/okhttp3-clients/index.d.ts +1 -0
  173. package/types/lib/generators/services/okhttp3-clients/models.d.ts +2 -0
  174. package/types/lib/generators/services/okhttp3-clients/okhttp3-client-generator.d.ts +25 -47
  175. package/types/lib/generators/services/okhttp3-clients/refs.d.ts +235 -0
  176. package/types/lib/generators/services/spring-controllers/args.d.ts +70 -0
  177. package/types/lib/generators/services/spring-controllers/index.d.ts +1 -0
  178. package/types/lib/generators/services/spring-controllers/spring-controller-generator.d.ts +37 -51
  179. package/types/lib/import-collection.d.ts +7 -1
@@ -1,413 +1,340 @@
1
+ /* eslint-disable unused-imports/no-unused-vars */
1
2
  import { ensureDirSync, writeFileSync } from 'fs-extra';
2
- import { notNullish, toCasing } from '@goast/core';
3
+ import { SourceBuilder, appendValueGroup, builderTemplate as s, createOverwriteProxy, notNullish, toCasing, } from '@goast/core';
4
+ import { kt } from '../../../ast';
3
5
  import { KotlinFileBuilder } from '../../../file-builder';
4
6
  import { modifyString } from '../../../utils';
5
7
  import { KotlinFileGenerator } from '../../file-generator';
6
8
  export class DefaultKotlinSpringControllerGenerator extends KotlinFileGenerator {
7
9
  generate(ctx) {
8
- const packageName = this.getPackageName(ctx);
9
- const dirPath = this.getDirectoryPath(ctx, packageName);
10
+ const packageName = this.getPackageName(ctx, {});
11
+ const dirPath = this.getDirectoryPath(ctx, { packageName });
10
12
  ensureDirSync(dirPath);
11
13
  console.log(`Generating service ${ctx.service.id} to ${dirPath}...`);
12
14
  return {
13
- apiInterface: this.generateApiInterfaceFile(ctx, dirPath, packageName),
14
- apiController: this.generateApiControllerFile(ctx, dirPath, packageName),
15
- apiDelegate: this.generateApiDelegateInterfaceFile(ctx, dirPath, packageName),
15
+ apiInterface: this.generateApiInterfaceFile(ctx, { dirPath, packageName }),
16
+ apiController: this.generateApiControllerFile(ctx, { dirPath, packageName }),
17
+ apiDelegate: this.generateApiDelegateInterfaceFile(ctx, { dirPath, packageName }),
16
18
  };
17
19
  }
18
- generateApiInterfaceFile(ctx, dirPath, packageName) {
19
- const typeName = this.getApiInterfaceName(ctx);
20
+ // #region API Interface
21
+ generateApiInterfaceFile(ctx, args) {
22
+ const { dirPath, packageName } = args;
23
+ const typeName = this.getApiInterfaceName(ctx, {});
20
24
  const fileName = `${typeName}.kt`;
21
25
  const filePath = `${dirPath}/${fileName}`;
22
26
  console.log(` Generating API interface ${typeName} to ${fileName}...`);
23
27
  const builder = new KotlinFileBuilder(packageName, ctx.config);
24
- this.generateApiInterfaceFileContent(ctx, builder);
28
+ builder.append(this.getApiInterfaceFileContent(ctx, { interfaceName: typeName }));
25
29
  writeFileSync(filePath, builder.toString());
26
- return { typeName: builder.toString(), packageName };
27
- }
28
- generateApiInterfaceFileContent(ctx, builder) {
29
- builder
30
- .append((builder) => this.generateApiInterfaceAnnotations(ctx, builder))
31
- .ensureCurrentLineEmpty()
32
- .append((builder) => this.generateApiInterfaceSignature(ctx, builder))
33
- .append(' ')
34
- .parenthesize('{}', (builder) => this.generateApiInterfaceContent(ctx, builder), { multiline: true });
35
- }
36
- generateApiInterfaceAnnotations(ctx, builder) {
37
- builder
38
- .appendAnnotation('Validated', 'org.springframework.validation.annotation')
39
- .appendAnnotation('RequestMapping', 'org.springframework.web.bind.annotation', [
40
- this.getControllerRequestMapping(ctx, 'api'),
41
- ]);
30
+ return { typeName, packageName };
31
+ }
32
+ getApiInterfaceFileContent(ctx, args) {
33
+ const { interfaceName } = args;
34
+ return appendValueGroup([this.getApiInterface(ctx, { interfaceName })], '\n');
42
35
  }
43
- generateApiInterfaceSignature(ctx, builder) {
44
- builder.append('interface ').append(this.getApiInterfaceName(ctx));
45
- }
46
- generateApiInterfaceContent(ctx, builder) {
47
- builder
48
- .append((builder) => this.generateApiInterfaceDelegateAccessor(ctx, builder))
49
- .ensurePreviousLineEmpty()
50
- .append((builder) => this.generateApiInterfaceMethods(ctx, builder));
51
- }
52
- generateApiInterfaceDelegateAccessor(ctx, builder) {
53
- builder.appendLine(`fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = object : ${this.getApiDelegateInterfaceName(ctx)} {}`);
54
- }
55
- generateApiInterfaceMethods(ctx, builder) {
56
- builder.forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().append((builder) => this.generateApiInterfaceMethod(ctx, builder, endpoint)));
57
- }
58
- generateApiInterfaceMethod(ctx, builder, endpoint) {
59
- builder
60
- .append((builder) => this.generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint))
61
- .ensureCurrentLineEmpty()
62
- .append((builder) => this.generateApiInterfaceMethodSignature(ctx, builder, endpoint))
63
- .append(' ')
64
- .parenthesize('{}', (builder) => this.generateApiInterfaceMethodContent(ctx, builder, endpoint), {
65
- multiline: true,
36
+ getApiInterface(ctx, args) {
37
+ const { interfaceName } = args;
38
+ return kt.interface(interfaceName, {
39
+ annotations: this.getApiInterfaceAnnotations(ctx),
40
+ members: this.getApiInterfaceMembers(ctx),
66
41
  });
67
42
  }
68
- generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint) {
69
- var _a;
70
- builder
71
- .if(ctx.config.addSwaggerAnnotations, (builder) => {
72
- var _a, _b;
73
- return builder.appendAnnotation('Operation', 'io.swagger.v3.oas.annotations', [
74
- ['summary', this.toStringLiteral(ctx, (_a = endpoint.summary) === null || _a === void 0 ? void 0 : _a.trim())],
75
- ['operationId', this.toStringLiteral(ctx, endpoint.name)],
76
- ['description', this.toStringLiteral(ctx, (_b = endpoint.description) === null || _b === void 0 ? void 0 : _b.trim())],
77
- [
78
- 'responses',
79
- (builder) => builder.parenthesize('[]', (builder) => builder.forEach(endpoint.responses, (builder, response) => builder
80
- .append('ApiResponse')
81
- .addImport('ApiResponse', 'io.swagger.v3.oas.annotations.responses')
82
- .parenthesize('()', (builder) => {
83
- var _a, _b;
84
- return builder
85
- .append(`responseCode = ${this.toStringLiteral(ctx, (_a = response.statusCode) === null || _a === void 0 ? void 0 : _a.toString())}, `)
86
- .append(`description = ${this.toStringLiteral(ctx, (_b = response.description) === null || _b === void 0 ? void 0 : _b.trim())}`);
87
- }), { separator: ',\n' }), { multiline: true }),
88
- endpoint.responses.length > 0,
89
- ],
90
- ]);
91
- })
92
- .appendAnnotation('RequestMapping', 'org.springframework.web.bind.annotation', [
93
- ['method', '[RequestMethod.' + endpoint.method.toUpperCase() + ']'],
94
- ['value', '[' + this.toStringLiteral(ctx, this.getEndpointPath(ctx, endpoint)) + ']'],
95
- [
96
- 'consumes',
97
- '[' + ((_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content.map((x) => this.toStringLiteral(ctx, x.type)).join(', ')) + ']',
98
- !!endpoint.requestBody && endpoint.requestBody.content.length > 0,
99
- ],
100
- ])
101
- .addImport('RequestMethod', 'org.springframework.web.bind.annotation');
102
- }
103
- generateApiInterfaceMethodSignature(ctx, builder, endpoint) {
104
- builder
105
- .append(`suspend fun ${toCasing(endpoint.name, 'camel')}`)
106
- .parenthesize('()', (builder) => this.generateApiInterfaceMethodParameters(ctx, builder, endpoint), {
107
- multiline: true,
108
- })
109
- .append(': ')
110
- .append((builder) => this.generateApiInterfaceMethodReturnType(ctx, builder, endpoint));
111
- }
112
- generateApiInterfaceMethodParameters(ctx, builder, endpoint) {
113
- const parameters = this.getAllParameters(ctx, endpoint);
114
- builder.forEach(parameters, (builder, parameter) => this.generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
115
- }
116
- generateApiInterfaceMethodReturnType(ctx, builder, endpoint) {
117
- this.generateResponseEntityType(ctx, builder, endpoint);
118
- }
119
- generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
120
- builder
121
- .append((builder) => this.generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
122
- .ensureCurrentLineEmpty()
123
- .append((builder) => this.generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
124
- }
125
- generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
126
- var _a, _b, _c, _d, _e, _f, _g, _h;
127
- const parameterSchemaInfo = this.getSchemaInfo(ctx, parameter.schema);
43
+ getApiInterfaceAnnotations(ctx) {
44
+ const validated = kt.annotation(kt.refs.spring.validated());
45
+ const requestMapping = kt.annotation(kt.refs.spring.requestMapping(), [
46
+ kt.argument(this.getControllerRequestMapping(ctx, { prefix: 'api' })),
47
+ ]);
48
+ return [validated, requestMapping];
49
+ }
50
+ getApiInterfaceMembers(ctx) {
51
+ const members = [];
52
+ const delegateInterfaceName = this.getApiDelegateInterfaceName(ctx, {});
53
+ members.push(kt.function('getDelegate', {
54
+ returnType: delegateInterfaceName,
55
+ singleExpression: true,
56
+ body: kt.object({
57
+ implements: [delegateInterfaceName],
58
+ }),
59
+ }));
60
+ ctx.service.endpoints.forEach((endpoint) => {
61
+ members.push(this.getApiInterfaceEndpointMethod(ctx, { endpoint }));
62
+ });
63
+ return members;
64
+ }
65
+ getApiInterfaceEndpointMethod(ctx, args) {
66
+ const { endpoint } = args;
67
+ const parameters = this.getAllParameters(ctx, { endpoint });
68
+ return kt.function(toCasing(endpoint.name, ctx.config.functionNameCasing), {
69
+ suspend: true,
70
+ annotations: this.getApiInterfaceEndpointMethodAnnnotations(ctx, endpoint),
71
+ parameters: parameters.map((parameter) => this.getApiInterfaceEndpointMethodParameter(ctx, endpoint, parameter)),
72
+ returnType: kt.refs.spring.responseEntity([this.getResponseType(ctx, { endpoint })]),
73
+ body: this.getApiInterfaceEndpointMethodBody(ctx, endpoint, parameters),
74
+ });
75
+ }
76
+ getApiInterfaceEndpointMethodAnnnotations(ctx, endpoint) {
77
+ var _a, _b, _c;
78
+ const operation = kt.annotation(kt.refs.swagger.operation(), [
79
+ kt.argument.named('summary', kt.string((_a = endpoint.summary) === null || _a === void 0 ? void 0 : _a.trim())),
80
+ kt.argument.named('operationId', kt.string(endpoint.name)),
81
+ kt.argument.named('description', kt.string((_b = endpoint.description) === null || _b === void 0 ? void 0 : _b.trim())),
82
+ kt.argument.named('responses', kt.collectionLiteral(endpoint.responses.map((response) => {
83
+ var _a, _b;
84
+ return kt.call(kt.refs.swagger.apiResponse(), [
85
+ kt.argument.named('responseCode', kt.string((_a = response.statusCode) === null || _a === void 0 ? void 0 : _a.toString())),
86
+ kt.argument.named('description', kt.string((_b = response.description) === null || _b === void 0 ? void 0 : _b.trim())),
87
+ ]);
88
+ }))),
89
+ ]);
90
+ const requestMapping = kt.annotation(kt.refs.spring.requestMapping(), [
91
+ kt.argument.named('method', kt.collectionLiteral([kt.call([kt.refs.spring.requestMethod(), endpoint.method.toUpperCase()])])),
92
+ kt.argument.named('value', kt.collectionLiteral([kt.string(this.getEndpointPath(ctx, { endpoint }))])),
93
+ ]);
94
+ if (endpoint.requestBody && endpoint.requestBody.content.length > 0) {
95
+ requestMapping.arguments.push(kt.argument.named('consumes', kt.collectionLiteral((_c = endpoint.requestBody) === null || _c === void 0 ? void 0 : _c.content.map((x) => kt.string(x.type)))));
96
+ }
97
+ return [operation, requestMapping];
98
+ }
99
+ getApiInterfaceEndpointMethodParameter(ctx, endpoint, parameter) {
100
+ var _a, _b, _c, _d, _e;
101
+ const schemaType = this.getSchemaType(ctx, { schema: parameter.schema });
102
+ const result = kt.parameter(toCasing(parameter.name, ctx.config.parameterNameCasing), this.getParameterType(ctx, { endpoint, parameter }), {});
128
103
  if (ctx.config.addSwaggerAnnotations) {
129
- if (((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.default) !== undefined) {
130
- builder.addImport('Schema', 'io.swagger.v3.oas.annotations.media');
131
- }
132
- builder.appendAnnotation('Parameter', 'io.swagger.v3.oas.annotations', [
133
- ['description', this.toStringLiteral(ctx, (_b = parameter.description) === null || _b === void 0 ? void 0 : _b.trim())],
134
- ['required', (_c = parameter.required) === null || _c === void 0 ? void 0 : _c.toString()],
135
- [
136
- 'schema',
137
- `Schema(defaultValue = ${this.toStringLiteral(ctx, String((_d = parameter.schema) === null || _d === void 0 ? void 0 : _d.default))})`,
138
- ((_e = parameter.schema) === null || _e === void 0 ? void 0 : _e.default) !== undefined,
139
- ],
104
+ const annotation = kt.annotation(kt.refs.swagger.parameter(), [
105
+ kt.argument.named('description', kt.string((_a = parameter.description) === null || _a === void 0 ? void 0 : _a.trim())),
106
+ kt.argument.named('required', parameter.required),
140
107
  ]);
108
+ if (((_b = parameter.schema) === null || _b === void 0 ? void 0 : _b.default) !== undefined) {
109
+ annotation.arguments.push(kt.argument.named('schema', kt.call([kt.refs.swagger.schema()], [kt.argument.named('defaultValue', kt.string(String((_c = parameter.schema) === null || _c === void 0 ? void 0 : _c.default)))])));
110
+ }
111
+ result.annotations.push(annotation);
141
112
  }
142
- if (parameterSchemaInfo.packageName && ctx.config.addJakartaValidationAnnotations) {
143
- builder.appendAnnotation('Valid', 'jakarta.validation');
113
+ const isCorePackage = !(schemaType === null || schemaType === void 0 ? void 0 : schemaType.packageName) || /^(kotlin|java)(\..*|$)/.test(schemaType.packageName);
114
+ if (!isCorePackage && ctx.config.addJakartaValidationAnnotations) {
115
+ result.annotations.push(kt.annotation(kt.refs.jakarta.valid()));
144
116
  }
145
117
  if (parameter.target === 'body') {
146
- builder.appendAnnotation('RequestBody', 'org.springframework.web.bind.annotation');
118
+ result.annotations.push(kt.annotation(kt.refs.spring.requestBody()));
147
119
  }
148
120
  if (parameter.target === 'query') {
149
- builder.appendAnnotation('RequestParam', 'org.springframework.web.bind.annotation', [
150
- ['value', this.toStringLiteral(ctx, parameter.name)],
151
- ['required', (_f = parameter.required) === null || _f === void 0 ? void 0 : _f.toString()],
152
- [
153
- 'defaultValue',
154
- this.toStringLiteral(ctx, String((_g = parameter.schema) === null || _g === void 0 ? void 0 : _g.default)),
155
- ((_h = parameter.schema) === null || _h === void 0 ? void 0 : _h.default) !== undefined,
156
- ],
121
+ const annotation = kt.annotation(kt.refs.spring.requestParam(), [
122
+ kt.argument.named('value', kt.string(parameter.name)),
123
+ kt.argument.named('required', parameter.required),
157
124
  ]);
125
+ if (((_d = parameter.schema) === null || _d === void 0 ? void 0 : _d.default) !== undefined) {
126
+ annotation.arguments.push(kt.argument.named('defaultValue', kt.string(String((_e = parameter.schema) === null || _e === void 0 ? void 0 : _e.default))));
127
+ }
128
+ result.annotations.push(annotation);
158
129
  }
159
130
  if (parameter.target === 'path') {
160
- builder.appendAnnotation('PathVariable', 'org.springframework.web.bind.annotation', [
161
- this.toStringLiteral(ctx, parameter.name),
162
- ]);
131
+ result.annotations.push(kt.annotation(kt.refs.spring.pathVariable(), [kt.string(parameter.name)]));
163
132
  }
164
- }
165
- generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
166
- var _a, _b;
167
- builder
168
- .append(toCasing(parameter.name, 'camel'))
169
- .append(': ')
170
- .append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema, parameter.target === 'body'))
171
- .append(!parameter.required && ((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.default) === undefined && !((_b = parameter.schema) === null || _b === void 0 ? void 0 : _b.nullable) ? '?' : '');
172
- }
173
- generateApiInterfaceMethodContent(ctx, builder, endpoint) {
174
- const parameters = this.getAllParameters(ctx, endpoint);
175
- builder
176
- .append(`return getDelegate().${toCasing(endpoint.name, 'camel')}(`)
177
- .forEach(parameters, (builder, parameter) => builder.append(toCasing(parameter.name, 'camel')), {
178
- separator: ', ',
179
- })
180
- .append(')');
181
- }
182
- generateApiControllerFile(ctx, dirPath, packageName) {
183
- const typeName = this.getApiControllerName(ctx);
133
+ return result;
134
+ }
135
+ getApiInterfaceEndpointMethodBody(ctx, endpoint, parameters) {
136
+ return appendValueGroup([
137
+ s `return ${kt.call([kt.call(kt.reference('getDelegate'), []), toCasing(endpoint.name, ctx.config.functionNameCasing)], parameters.map((x) => toCasing(x.name, ctx.config.parameterNameCasing)))}`,
138
+ ], '\n');
139
+ }
140
+ // #endregion
141
+ // #region API Controller
142
+ generateApiControllerFile(ctx, args) {
143
+ const { dirPath, packageName } = args;
144
+ const typeName = this.getApiControllerName(ctx, {});
184
145
  const fileName = `${typeName}.kt`;
185
146
  const filePath = `${dirPath}/${fileName}`;
186
147
  console.log(` Generating API controller ${typeName} to ${fileName}...`);
187
148
  const builder = new KotlinFileBuilder(packageName, ctx.config);
188
- this.generateApiControllerFileContent(ctx, builder);
149
+ builder.append(this.getApiControllerFileContent(ctx, { controllerName: typeName }));
189
150
  writeFileSync(filePath, builder.toString());
190
- return { typeName: builder.toString(), packageName };
191
- }
192
- generateApiControllerFileContent(ctx, builder) {
193
- builder
194
- .append((builder) => this.generateApiControllerAnnotations(ctx, builder))
195
- .ensureCurrentLineEmpty()
196
- .append((builder) => this.generateApiControllerSignature(ctx, builder))
197
- .append(' ')
198
- .parenthesize('{}', (builder) => this.generateApiControllerContent(ctx, builder), { multiline: true });
199
- }
200
- generateApiControllerAnnotations(ctx, builder) {
201
- builder
202
- .if(ctx.config.addJakartaValidationAnnotations, (builder) => builder.appendAnnotation('Generated', 'jakarta.annotation', [
203
- ['value', '[' + this.toStringLiteral(ctx, 'com.goast.kotlin.spring-service-generator') + ']'],
204
- ]))
205
- .appendAnnotation('Controller', 'org.springframework.stereotype')
206
- .appendAnnotation('RequestMapping', 'org.springframework.web.bind.annotation', [
207
- this.getControllerRequestMapping(ctx),
208
- ]);
151
+ return { typeName, packageName };
152
+ }
153
+ getApiControllerFileContent(ctx, args) {
154
+ const { controllerName } = args;
155
+ return appendValueGroup([this.getApiController(ctx, { controllerName })], '\n');
156
+ }
157
+ getApiController(ctx, args) {
158
+ const { controllerName } = args;
159
+ return kt.class(controllerName, {
160
+ annotations: this.getApiControllerAnnotations(ctx),
161
+ primaryConstructor: kt.constructor([
162
+ kt.parameter.class('delegate', kt.reference(this.getApiDelegateInterfaceName(ctx, {}), null, { nullable: true }), {
163
+ annotations: [kt.annotation(kt.refs.spring.autowired(), [kt.argument.named('required', 'false')])],
164
+ }),
165
+ ]),
166
+ implements: [this.getApiInterfaceName(ctx, {})],
167
+ members: this.getApiControllerMembers(ctx),
168
+ });
209
169
  }
210
- generateApiControllerSignature(ctx, builder) {
211
- builder
212
- .append('class ')
213
- .append(this.getApiControllerName(ctx))
214
- .parenthesize('()', (builder) => this.generateApiControllerParameters(ctx, builder), { multiline: true })
215
- .append(' : ')
216
- .append(this.getApiInterfaceName(ctx));
217
- }
218
- generateApiControllerParameters(ctx, builder) {
219
- builder
220
- .appendAnnotation('Autowired', 'org.springframework.beans.factory.annotation', [['required', 'false']])
221
- .append('delegate: ')
222
- .append(this.getApiDelegateInterfaceName(ctx))
223
- .append('?');
224
- }
225
- generateApiControllerContent(ctx, builder) {
226
- builder
227
- .append('private val delegate: ')
228
- .appendLine(this.getApiDelegateInterfaceName(ctx))
229
- .appendLine()
230
- .append('init ')
231
- .parenthesize('{}', (builder) => builder
232
- .append('this.delegate = Optional.ofNullable(delegate).orElse')
233
- .addImport('Optional', 'java.util')
234
- .parenthesize('()', (builder) => builder.append('object : ').append(this.getApiDelegateInterfaceName(ctx)).append(' {}')), { multiline: true })
235
- .appendLine()
236
- .appendLine()
237
- .appendLine(`override fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = delegate`);
238
- }
239
- generateApiDelegateInterfaceFile(ctx, dirPath, packageName) {
240
- const typeName = this.getApiDelegateInterfaceName(ctx);
170
+ getApiControllerAnnotations(ctx) {
171
+ const annotations = [];
172
+ if (ctx.config.addJakartaValidationAnnotations) {
173
+ annotations.push(kt.annotation(kt.refs.jakarta.generated(), [
174
+ kt.argument.named('value', kt.collectionLiteral([kt.string('com.goast.kotlin.spring-service-generator')])),
175
+ ]));
176
+ }
177
+ annotations.push(kt.annotation(kt.refs.spring.controller()));
178
+ annotations.push(kt.annotation(kt.refs.spring.requestMapping(), [this.getControllerRequestMapping(ctx, {})]));
179
+ return annotations;
180
+ }
181
+ getApiControllerMembers(ctx) {
182
+ const delegateInterfaceName = this.getApiDelegateInterfaceName(ctx, {});
183
+ const delegateProp = kt.property('delegate', {
184
+ accessModifier: 'private',
185
+ type: kt.reference(delegateInterfaceName),
186
+ });
187
+ const initBlock = kt.initBlock(appendValueGroup([
188
+ s `this.delegate = ${kt.refs.java.optional.infer()}.ofNullable(delegate).orElse(object : ${delegateInterfaceName} {})`,
189
+ ], '\n'));
190
+ const getDelegateFun = kt.function('getDelegate', {
191
+ override: true,
192
+ returnType: delegateInterfaceName,
193
+ singleExpression: true,
194
+ body: kt.reference('delegate'),
195
+ });
196
+ return [delegateProp, initBlock, getDelegateFun];
197
+ }
198
+ // #endregion
199
+ // #region API Delegate Interface
200
+ generateApiDelegateInterfaceFile(ctx, args) {
201
+ const { dirPath, packageName } = args;
202
+ const typeName = this.getApiDelegateInterfaceName(ctx, {});
241
203
  const fileName = `${typeName}.kt`;
242
204
  const filePath = `${dirPath}/${fileName}`;
243
205
  console.log(` Generating API delegate ${typeName} to ${fileName}...`);
244
206
  const builder = new KotlinFileBuilder(packageName, ctx.config);
245
- this.generateApiDelegateInterfaceFileContent(ctx, builder);
207
+ builder.append(this.getApiDelegateInterfaceFileContent(ctx, { delegateInterfaceName: typeName }));
246
208
  writeFileSync(filePath, builder.toString());
247
- return { typeName: builder.toString(), packageName };
209
+ return { typeName, packageName };
210
+ }
211
+ getApiDelegateInterfaceFileContent(ctx, args) {
212
+ const { delegateInterfaceName } = args;
213
+ return appendValueGroup([this.getApiDelegateInterface(ctx, { delegateInterfaceName })], '\n');
248
214
  }
249
- generateApiDelegateInterfaceFileContent(ctx, builder) {
250
- builder
251
- .append((builder) => this.generateApiDelegateInterfaceAnnotations(ctx, builder))
252
- .ensureCurrentLineEmpty()
253
- .append((builder) => this.generateApiDelegateInterfaceSignature(ctx, builder))
254
- .append(' ')
255
- .parenthesize('{}', (builder) => this.generateApiDelegateInterfaceContent(ctx, builder), { multiline: true });
215
+ getApiDelegateInterface(ctx, args) {
216
+ const { delegateInterfaceName } = args;
217
+ return kt.interface(delegateInterfaceName, {
218
+ annotations: this.getApiDelegateInterfaceAnnotations(ctx),
219
+ members: this.getApiDelegateInterfaceMembers(ctx),
220
+ });
256
221
  }
257
- generateApiDelegateInterfaceAnnotations(ctx, builder) {
222
+ getApiDelegateInterfaceAnnotations(ctx) {
223
+ const annotations = [];
258
224
  if (ctx.config.addJakartaValidationAnnotations) {
259
- builder.appendAnnotation('Generated', 'jakarta.annotation', [
260
- ['value', '[' + this.toStringLiteral(ctx, 'com.goast.kotlin.spring-service-generator') + ']'],
261
- ]);
225
+ annotations.push(kt.annotation(kt.refs.jakarta.generated(), [
226
+ kt.argument.named('value', kt.collectionLiteral([kt.string('com.goast.kotlin.spring-service-generator')])),
227
+ ]));
262
228
  }
263
- }
264
- generateApiDelegateInterfaceSignature(ctx, builder) {
265
- builder.append('interface ').append(this.getApiDelegateInterfaceName(ctx));
266
- }
267
- generateApiDelegateInterfaceContent(ctx, builder) {
268
- builder
269
- .appendLine(`fun getRequest(): Optional<NativeWebRequest> = Optional.empty()`)
270
- .addImport('Optional', 'java.util')
271
- .addImport('NativeWebRequest', 'org.springframework.web.context.request')
272
- .forEach(ctx.service.endpoints, (builder, endpoint) => builder
273
- .ensurePreviousLineEmpty()
274
- .append((builder) => this.generateApiDelegateInterfaceMethod(ctx, builder, endpoint)));
275
- }
276
- generateApiDelegateInterfaceMethod(ctx, builder, endpoint) {
277
- builder
278
- .append((builder) => this.generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint))
279
- .ensureCurrentLineEmpty()
280
- .append((builder) => this.generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint))
281
- .append(' ')
282
- .parenthesize('{}', (builder) => this.generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint), {
283
- multiline: true,
229
+ return annotations;
230
+ }
231
+ getApiDelegateInterfaceMembers(ctx) {
232
+ const members = [];
233
+ members.push(kt.function('getRequest', {
234
+ returnType: kt.refs.java.optional([kt.refs.spring.nativeWebRequest()]),
235
+ singleExpression: true,
236
+ body: kt.call([kt.refs.java.optional.infer(), 'empty'], []),
237
+ }));
238
+ ctx.service.endpoints.forEach((endpoint) => {
239
+ members.push(this.getApiDelegateInterfaceEndpointMethod(ctx, { endpoint }));
284
240
  });
285
- }
286
- generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint) {
287
- // None for now.
288
- }
289
- generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint) {
290
- builder
291
- .append(`suspend fun ${toCasing(endpoint.name, 'camel')}`)
292
- .parenthesize('()', (builder) => this.generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint), {
293
- multiline: true,
294
- })
295
- .append(': ')
296
- .append((builder) => this.generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint));
297
- }
298
- generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint) {
299
- const parameters = this.getAllParameters(ctx, endpoint);
300
- builder.forEach(parameters, (builder, parameter) => this.generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
301
- }
302
- generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint) {
303
- this.generateResponseEntityType(ctx, builder, endpoint);
304
- }
305
- generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
306
- builder
307
- .append((builder) => this.generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
308
- .ensureCurrentLineEmpty()
309
- .append((builder) => this.generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
310
- }
311
- generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
312
- // None for now.
313
- }
314
- generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
315
- var _a, _b;
316
- builder
317
- .append(toCasing(parameter.name, 'camel'))
318
- .append(': ')
319
- .append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema, parameter.target === 'body'))
320
- .append(!parameter.required && ((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.default) === undefined && !((_b = parameter.schema) === null || _b === void 0 ? void 0 : _b.nullable) ? '?' : '');
321
- }
322
- generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint) {
323
- builder
324
- .appendLine('return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)')
325
- .addImport('ResponseEntity', 'org.springframework.http')
326
- .addImport('HttpStatus', 'org.springframework.http');
327
- }
328
- generateResponseEntityType(ctx, builder, endpoint) {
329
- builder
330
- .append('ResponseEntity')
331
- .addImport('ResponseEntity', 'org.springframework.http')
332
- .parenthesize('<>', (builder) => {
333
- const responseSchemas = endpoint.responses
334
- .flatMap((x) => x.contentOptions.flatMap((x) => x.schema))
335
- .filter(notNullish)
336
- .filter((x, i, a) => a.findIndex((y) => {
337
- const xInfo = this.getSchemaInfo(ctx, x);
338
- const yInfo = this.getSchemaInfo(ctx, y);
339
- return xInfo.typeName === yInfo.typeName && xInfo.packageName === yInfo.packageName;
340
- }) === i);
341
- if (responseSchemas.length === 1) {
342
- this.generateTypeUsage(ctx, builder, responseSchemas[0], true, 'Unit');
343
- }
344
- else if (responseSchemas.length === 0) {
345
- builder.append('Unit');
346
- }
347
- else {
348
- builder.append('Any?');
349
- }
241
+ return members;
242
+ }
243
+ getApiDelegateInterfaceEndpointMethod(ctx, args) {
244
+ const { endpoint } = args;
245
+ const parameters = this.getAllParameters(ctx, { endpoint });
246
+ return kt.function(toCasing(endpoint.name, ctx.config.functionNameCasing), {
247
+ suspend: true,
248
+ parameters: parameters.map((parameter) => {
249
+ return kt.parameter(toCasing(parameter.name, ctx.config.parameterNameCasing), this.getParameterType(ctx, { endpoint, parameter }));
250
+ }),
251
+ returnType: kt.refs.spring.responseEntity([this.getResponseType(ctx, { endpoint })]),
252
+ body: appendValueGroup([s `return ${kt.refs.spring.responseEntity.infer()}(${kt.refs.spring.httpStatus()}.NOT_IMPLEMENTED)`], '\n'),
350
253
  });
351
254
  }
352
- generateTypeUsage(ctx, builder, schema, arrayAsFlux, fallback) {
353
- if (schema && schema.kind === 'array') {
354
- const schemaInfo = this.getSchemaInfo(ctx, schema.items);
355
- if (arrayAsFlux) {
356
- builder.append(`Flux<${schemaInfo.typeName}>`).addImport('Flux', 'reactor.core.publisher');
357
- }
358
- else {
359
- builder.append(`List<${schemaInfo.typeName}>`);
360
- }
361
- builder.imports.addImports([schemaInfo, ...schemaInfo.additionalImports]);
255
+ // #endregion
256
+ getParameterType(ctx, args) {
257
+ var _a;
258
+ const { parameter } = args;
259
+ const type = this.getTypeUsage(ctx, {
260
+ schema: parameter.schema,
261
+ nullable: (!parameter.required && ((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.default) === undefined) || undefined,
262
+ });
263
+ return parameter.target === 'body' ? listToFlux(type) : type;
264
+ }
265
+ getResponseType(ctx, args) {
266
+ const { endpoint } = args;
267
+ const responseSchemas = endpoint.responses
268
+ .flatMap((x) => x.contentOptions.flatMap((x) => x.schema))
269
+ .filter(notNullish)
270
+ .filter((x, i, a) => a.findIndex((y) => {
271
+ const xType = this.getSchemaType(ctx, { schema: x });
272
+ const yType = this.getSchemaType(ctx, { schema: y });
273
+ return (xType === null || xType === void 0 ? void 0 : xType.name) === (yType === null || yType === void 0 ? void 0 : yType.name) && (xType === null || xType === void 0 ? void 0 : xType.packageName) === (yType === null || yType === void 0 ? void 0 : yType.packageName);
274
+ }) === i);
275
+ if (responseSchemas.length === 1) {
276
+ return listToFlux(this.getTypeUsage(ctx, { schema: responseSchemas[0], fallback: kt.refs.unit() }));
362
277
  }
363
- else if (schema || !fallback) {
364
- const schemaInfo = this.getSchemaInfo(ctx, schema);
365
- builder.append(schemaInfo.typeName);
366
- builder.imports.addImports([schemaInfo, ...schemaInfo.additionalImports]);
278
+ else if (responseSchemas.length === 0) {
279
+ return kt.refs.unit();
367
280
  }
368
281
  else {
369
- builder.append(fallback);
282
+ return kt.refs.any({ nullable: true });
370
283
  }
371
284
  }
372
- getControllerRequestMapping(ctx, prefix) {
373
- const basePath = this.getBasePath(ctx);
374
- prefix !== null && prefix !== void 0 ? prefix : (prefix = `openapi.${toCasing(ctx.service.name, 'camel')}`);
375
- return this.toStringLiteral(ctx, `\${${prefix}.base-path:${basePath}}`);
285
+ getTypeUsage(ctx, args) {
286
+ const { schema, nullable, fallback } = args;
287
+ const type = this.getSchemaType(ctx, { schema });
288
+ return type
289
+ ? createOverwriteProxy(type, { nullable: nullable !== null && nullable !== void 0 ? nullable : type.nullable })
290
+ : fallback !== null && fallback !== void 0 ? fallback : kt.refs.any({ nullable });
291
+ }
292
+ getSchemaType(ctx, args) {
293
+ const { schema } = args;
294
+ return schema && ctx.input.models[schema.id].type;
295
+ }
296
+ getControllerRequestMapping(ctx, args) {
297
+ let { prefix } = args;
298
+ const basePath = this.getBasePath(ctx, {});
299
+ prefix !== null && prefix !== void 0 ? prefix : (prefix = `openapi.${toCasing(ctx.service.name, ctx.config.propertyNameCasing)}`);
300
+ return kt.string(`\${${prefix}.base-path:${basePath}}`);
376
301
  }
377
- getBasePath(ctx) {
302
+ getBasePath(ctx, args) {
378
303
  var _a, _b, _c, _d, _e, _f;
379
304
  return modifyString((_f = (_e = (_d = (_c = ((_a = ctx.service.$src) !== null && _a !== void 0 ? _a : (_b = ctx.service.endpoints[0]) === null || _b === void 0 ? void 0 : _b.$src)) === null || _c === void 0 ? void 0 : _c.document.servers) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.url) !== null && _f !== void 0 ? _f : '/', ctx.config.basePath, ctx.service);
380
305
  }
381
- getEndpointPath(ctx, endpoint) {
306
+ getEndpointPath(ctx, args) {
307
+ const { endpoint } = args;
382
308
  return modifyString(endpoint.path, ctx.config.pathModifier, endpoint);
383
309
  }
384
- getDirectoryPath(ctx, packageName) {
310
+ getDirectoryPath(ctx, args) {
311
+ const { packageName } = args;
385
312
  return `${ctx.config.outputDir}/${packageName.replace(/\./g, '/')}`;
386
313
  }
387
- getPackageName(ctx) {
314
+ getPackageName(ctx, args) {
388
315
  const packageSuffix = typeof ctx.config.packageSuffix === 'string' ? ctx.config.packageSuffix : ctx.config.packageSuffix(ctx.service);
389
316
  return ctx.config.packageName + packageSuffix;
390
317
  }
391
- getApiInterfaceName(ctx) {
392
- return toCasing(ctx.service.name, 'pascal') + 'Api';
318
+ getApiInterfaceName(ctx, args) {
319
+ return toCasing(ctx.service.name + '_Api', ctx.config.typeNameCasing);
393
320
  }
394
- getApiControllerName(ctx) {
395
- return toCasing(ctx.service.name, 'pascal') + 'ApiController';
321
+ getApiControllerName(ctx, args) {
322
+ return toCasing(ctx.service.name + '_ApiController', ctx.config.typeNameCasing);
396
323
  }
397
- getApiDelegateInterfaceName(ctx) {
398
- return toCasing(ctx.service.name, 'pascal') + 'ApiDelegate';
324
+ getApiDelegateInterfaceName(ctx, args) {
325
+ return toCasing(ctx.service.name + '_ApiDelegate', ctx.config.typeNameCasing);
399
326
  }
400
- getSchemaInfo(ctx, schema) {
401
- var _a;
402
- return ((_a = (schema && ctx.input.models[schema.id])) !== null && _a !== void 0 ? _a : { typeName: 'Any?', packageName: undefined, additionalImports: [] });
403
- }
404
- getAllParameters(ctx, endpoint) {
327
+ getAllParameters(ctx, args) {
328
+ const { endpoint } = args;
405
329
  const parameters = endpoint.parameters.filter((parameter) => parameter.target === 'query' || parameter.target === 'path');
406
330
  if (endpoint.requestBody) {
407
331
  const schema = endpoint.requestBody.content[0].schema;
408
- const schemaInfo = this.getSchemaInfo(ctx, schema);
409
- const name = /^Any\??$/.test(schemaInfo.typeName) ? 'body' : schemaInfo.typeName;
332
+ const schemaType = this.getSchemaType(ctx, { schema });
333
+ const name = !schemaType || /^Any\??$/.test(schemaType.name)
334
+ ? 'body'
335
+ : SourceBuilder.build((b) => kt.reference.write(b, schemaType));
410
336
  parameters.push({
337
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
411
338
  $src: undefined,
412
339
  $ref: undefined,
413
340
  id: 'body',
@@ -425,11 +352,7 @@ export class DefaultKotlinSpringControllerGenerator extends KotlinFileGenerator
425
352
  }
426
353
  return parameters;
427
354
  }
428
- sortParameters(ctx, parameters) {
429
- return [...parameters].sort((a, b) => {
430
- const aRequired = a.required ? 1 : 0;
431
- const bRequired = b.required ? 1 : 0;
432
- return aRequired - bRequired;
433
- });
434
- }
355
+ }
356
+ export function listToFlux(type) {
357
+ return kt.refs.list.matches(type) ? kt.refs.reactor.flux([type.generics[0]]) : type;
435
358
  }