@goast/kotlin 0.1.18 → 0.2.1

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