@goast/kotlin 0.5.11-beta.2 → 0.5.12

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 (112) hide show
  1. package/LICENSE +21 -21
  2. package/assets/client/okhttp3/ApiAbstractions.kt +30 -30
  3. package/assets/client/okhttp3/ApiClient.kt +252 -252
  4. package/assets/client/okhttp3/ApiResponse.kt +43 -43
  5. package/assets/client/okhttp3/Errors.kt +21 -21
  6. package/assets/client/okhttp3/PartConfig.kt +11 -11
  7. package/assets/client/okhttp3/RequestConfig.kt +18 -18
  8. package/assets/client/okhttp3/RequestMethod.kt +8 -8
  9. package/assets/client/okhttp3/ResponseExtensions.kt +24 -24
  10. package/assets/client/spring-reactive-web-clients/ApiRequestFile.kt +33 -33
  11. package/esm/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
  12. package/esm/src/generators/services/okhttp3-clients/okhttp3-clients-generator.js +9 -9
  13. package/esm/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
  14. package/esm/src/generators/services/spring-reactive-web-clients/args.d.ts +10 -0
  15. package/esm/src/generators/services/spring-reactive-web-clients/args.d.ts.map +1 -1
  16. package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts +14 -0
  17. package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
  18. package/esm/src/generators/services/spring-reactive-web-clients/models.js +1 -0
  19. package/esm/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts +8 -0
  20. package/esm/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
  21. package/esm/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.js +57 -20
  22. package/package.json +1 -1
  23. package/script/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
  24. package/script/src/generators/services/okhttp3-clients/okhttp3-clients-generator.js +9 -9
  25. package/script/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
  26. package/script/src/generators/services/spring-reactive-web-clients/args.d.ts +10 -0
  27. package/script/src/generators/services/spring-reactive-web-clients/args.d.ts.map +1 -1
  28. package/script/src/generators/services/spring-reactive-web-clients/models.d.ts +14 -0
  29. package/script/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
  30. package/script/src/generators/services/spring-reactive-web-clients/models.js +1 -0
  31. package/script/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts +8 -0
  32. package/script/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
  33. package/script/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.js +57 -20
  34. package/src/mod.ts +8 -0
  35. package/src/src/assets.ts +9 -0
  36. package/src/src/ast/_index.ts +66 -0
  37. package/src/src/ast/common.ts +1 -0
  38. package/src/src/ast/index.ts +1 -0
  39. package/src/src/ast/node.ts +10 -0
  40. package/src/src/ast/nodes/annotation.ts +79 -0
  41. package/src/src/ast/nodes/argument.ts +62 -0
  42. package/src/src/ast/nodes/call.ts +75 -0
  43. package/src/src/ast/nodes/class.ts +178 -0
  44. package/src/src/ast/nodes/collection-literal.ts +49 -0
  45. package/src/src/ast/nodes/constructor.ts +126 -0
  46. package/src/src/ast/nodes/doc-tag.ts +138 -0
  47. package/src/src/ast/nodes/doc.ts +111 -0
  48. package/src/src/ast/nodes/enum-value.ts +100 -0
  49. package/src/src/ast/nodes/enum.ts +163 -0
  50. package/src/src/ast/nodes/function.ts +178 -0
  51. package/src/src/ast/nodes/generic-parameter.ts +54 -0
  52. package/src/src/ast/nodes/init-block.ts +38 -0
  53. package/src/src/ast/nodes/interface.ts +133 -0
  54. package/src/src/ast/nodes/lambda-type.ts +73 -0
  55. package/src/src/ast/nodes/lambda.ts +74 -0
  56. package/src/src/ast/nodes/object.ts +102 -0
  57. package/src/src/ast/nodes/parameter.ts +118 -0
  58. package/src/src/ast/nodes/property.ts +225 -0
  59. package/src/src/ast/nodes/reference.ts +178 -0
  60. package/src/src/ast/nodes/string.ts +114 -0
  61. package/src/src/ast/nodes/types.ts +23 -0
  62. package/src/src/ast/references/index.ts +10 -0
  63. package/src/src/ast/references/jackson.ts +59 -0
  64. package/src/src/ast/references/jakarta.ts +14 -0
  65. package/src/src/ast/references/java.ts +27 -0
  66. package/src/src/ast/references/kotlin.ts +41 -0
  67. package/src/src/ast/references/kotlinx.ts +14 -0
  68. package/src/src/ast/references/okhttp3.ts +5 -0
  69. package/src/src/ast/references/reactor.ts +5 -0
  70. package/src/src/ast/references/spring-reactive.ts +37 -0
  71. package/src/src/ast/references/spring.ts +86 -0
  72. package/src/src/ast/references/swagger.ts +23 -0
  73. package/src/src/ast/utils/get-kotlin-builder-options.ts +19 -0
  74. package/src/src/ast/utils/to-kt-node.ts +31 -0
  75. package/src/src/ast/utils/write-kt-annotations.ts +15 -0
  76. package/src/src/ast/utils/write-kt-arguments.ts +45 -0
  77. package/src/src/ast/utils/write-kt-enum-values.ts +27 -0
  78. package/src/src/ast/utils/write-kt-generic-parameters.ts +12 -0
  79. package/src/src/ast/utils/write-kt-members.ts +25 -0
  80. package/src/src/ast/utils/write-kt-node.ts +37 -0
  81. package/src/src/ast/utils/write-kt-parameters.ts +25 -0
  82. package/src/src/common-results.ts +4 -0
  83. package/src/src/config.ts +61 -0
  84. package/src/src/file-builder.ts +112 -0
  85. package/src/src/generators/file-generator.ts +29 -0
  86. package/src/src/generators/index.ts +5 -0
  87. package/src/src/generators/models/args.ts +136 -0
  88. package/src/src/generators/models/index.ts +4 -0
  89. package/src/src/generators/models/model-generator.ts +725 -0
  90. package/src/src/generators/models/models-generator.ts +65 -0
  91. package/src/src/generators/models/models.ts +95 -0
  92. package/src/src/generators/services/okhttp3-clients/args.ts +90 -0
  93. package/src/src/generators/services/okhttp3-clients/index.ts +4 -0
  94. package/src/src/generators/services/okhttp3-clients/models.ts +73 -0
  95. package/src/src/generators/services/okhttp3-clients/okhttp3-client-generator.ts +613 -0
  96. package/src/src/generators/services/okhttp3-clients/okhttp3-clients-generator.ts +188 -0
  97. package/src/src/generators/services/okhttp3-clients/refs.ts +59 -0
  98. package/src/src/generators/services/spring-controllers/args.ts +95 -0
  99. package/src/src/generators/services/spring-controllers/index.ts +4 -0
  100. package/src/src/generators/services/spring-controllers/models.ts +76 -0
  101. package/src/src/generators/services/spring-controllers/refs.ts +17 -0
  102. package/src/src/generators/services/spring-controllers/spring-controller-generator.ts +1109 -0
  103. package/src/src/generators/services/spring-controllers/spring-controllers-generator.ts +140 -0
  104. package/src/src/generators/services/spring-reactive-web-clients/args.ts +112 -0
  105. package/src/src/generators/services/spring-reactive-web-clients/index.ts +4 -0
  106. package/src/src/generators/services/spring-reactive-web-clients/models.ts +78 -0
  107. package/src/src/generators/services/spring-reactive-web-clients/refs.ts +11 -0
  108. package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts +625 -0
  109. package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-clients-generator.ts +125 -0
  110. package/src/src/import-collection.ts +98 -0
  111. package/src/src/types.ts +3 -0
  112. package/src/src/utils.ts +47 -0
@@ -127,7 +127,7 @@ export class DefaultKotlinSpringReactiveWebClientGenerator extends KotlinFileGen
127
127
  const { endpoint, parameters, responseSchema } = args;
128
128
  const result = appendValueGroup([], '\n');
129
129
  const callChain = [];
130
- callChain.push(s `return this.method(${kt.refs.spring.httpMethod()}.${endpoint.method.toUpperCase()})`, kt.call('uri', [kt.call([this.getEndpointUriFunctionName(ctx, { endpoint })], parameters.filter((p) => p.target === 'path' || p.target === 'query').map((p) => toCasing(p.name, ctx.config.parameterNameCasing)))]));
130
+ callChain.push(s `return this.method(${kt.refs.spring.httpMethod()}.${endpoint.method.toUpperCase()})`, this.getEndpointUriCall(ctx, { endpoint, parameters }));
131
131
  if (responseSchema) {
132
132
  callChain.push(s `accept(${kt.refs.spring.mediaType()}.APPLICATION_JSON)`);
133
133
  }
@@ -201,6 +201,57 @@ export class DefaultKotlinSpringReactiveWebClientGenerator extends KotlinFileGen
201
201
  result.values.push(kt.call(callChain));
202
202
  return result;
203
203
  }
204
+ /**
205
+ * Emits the `uri(...)` call of the request function. If `preserveUriTemplate` is enabled, the URI template is
206
+ * passed to `WebClient` verbatim, so Spring can record it (`ClientRequestObservationContext.uriTemplate`) and tag
207
+ * `http.client.requests` with the route instead of the expanded path.
208
+ */
209
+ getEndpointUriCall(ctx, args) {
210
+ const { endpoint, parameters } = args;
211
+ if (!ctx.config.preserveUriTemplate) {
212
+ return kt.call('uri', [kt.call([this.getEndpointUriFunctionName(ctx, { endpoint })], parameters.filter((p) => p.target === 'path' || p.target === 'query').map((p) => toCasing(p.name, ctx.config.parameterNameCasing)))]);
213
+ }
214
+ const uriTemplate = kt.string(this.getEndpointPath(ctx, { endpoint }));
215
+ const pathVariables = this.getUriPathVariablesValue(ctx, { endpoint });
216
+ const queryParameterCalls = this.getUriQueryParameterCalls(ctx, { endpoint });
217
+ // Without query parameters the template and its variables can be handed to `uri` directly.
218
+ if (!queryParameterCalls) {
219
+ return kt.call('uri', [uriTemplate, pathVariables]);
220
+ }
221
+ // Query parameters need a `UriBuilder`, which the `uri(String, Function<UriBuilder, URI>)` overload provides
222
+ // while still recording the template.
223
+ return kt.call('uri', [
224
+ uriTemplate,
225
+ kt.lambda(['uriBuilder'], kt.call([
226
+ 'uriBuilder',
227
+ kt.call('apply', [kt.lambda([], queryParameterCalls)]),
228
+ kt.call('build', [pathVariables]),
229
+ ])),
230
+ ]);
231
+ }
232
+ getUriPathVariablesValue(ctx, args) {
233
+ const { endpoint } = args;
234
+ const pathParameters = endpoint.parameters.filter((p) => p.target === 'path');
235
+ if (pathParameters.length === 0)
236
+ return null;
237
+ return kt.call([kt.refs.mapOf.infer()], pathParameters.map((p) => s `${kt.string(p.name)} to ${toCasing(p.name, ctx.config.parameterNameCasing)}${this.getParameterToString(ctx, { endpoint, parameter: p })}`));
238
+ }
239
+ getUriQueryParameterCalls(ctx, args) {
240
+ const { endpoint } = args;
241
+ const queryParameters = endpoint.parameters.filter((p) => p.target === 'query');
242
+ if (queryParameters.length === 0)
243
+ return null;
244
+ return appendValueGroup(queryParameters.map((p) => {
245
+ var _a;
246
+ const parameterName = toCasing(p.name, ctx.config.parameterNameCasing);
247
+ const toString = this.getParameterToString(ctx, { endpoint, parameter: p });
248
+ return p.required && !((_a = p.schema) === null || _a === void 0 ? void 0 : _a.nullable)
249
+ ? kt.call('queryParam', [kt.string(p.name), parameterName + toString])
250
+ : kt.call([`${parameterName}?`, 'also'], [
251
+ kt.lambda([], kt.call('queryParam', [kt.string(p.name), 'it' + toString]), { singleline: true }),
252
+ ]);
253
+ }), '\n');
254
+ }
204
255
  getEndpointUriFunctionName(ctx, args) {
205
256
  const { endpoint } = args;
206
257
  return toCasing(`${this.getEndpointFunctionName(ctx, { endpoint })}_uri`, ctx.config.functionNameCasing);
@@ -219,26 +270,12 @@ export class DefaultKotlinSpringReactiveWebClientGenerator extends KotlinFileGen
219
270
  const result = appendValueGroup([], '\n');
220
271
  const callChain = [];
221
272
  callChain.push(s `${kt.refs.spring.uriComponentsBuilder()}.fromPath(${kt.string(this.getEndpointPath(ctx, { endpoint }))})`);
222
- if (endpoint.parameters.some((x) => x.target === 'query')) {
223
- callChain.push(kt.call('apply', [kt.lambda([], appendValueGroup(endpoint.parameters.filter((x) => x.target === 'query').map((p) => {
224
- var _a;
225
- const parameterName = toCasing(p.name, ctx.config.parameterNameCasing);
226
- const toString = this.getParameterToString(ctx, { endpoint, parameter: p });
227
- return p.required && !((_a = p.schema) === null || _a === void 0 ? void 0 : _a.nullable)
228
- ? kt.call('queryParam', [kt.string(p.name), parameterName + toString])
229
- : kt.call([`${parameterName}?`, 'also'], [
230
- kt.lambda([], kt.call('queryParam', [kt.string(p.name), 'it' + toString]), { singleline: true }),
231
- ]);
232
- }), '\n'))]));
233
- }
234
- if (endpoint.parameters.some((x) => x.target === 'path')) {
235
- callChain.push(kt.call('buildAndExpand', [
236
- kt.call([kt.refs.mapOf.infer()], endpoint.parameters.filter((p) => p.target === 'path').map((p) => s `${kt.string(p.name)} to ${toCasing(p.name, ctx.config.parameterNameCasing)}${this.getParameterToString(ctx, { endpoint, parameter: p })}`)),
237
- ]));
238
- }
239
- else {
240
- callChain.push(kt.call('build', []));
273
+ const queryParameterCalls = this.getUriQueryParameterCalls(ctx, { endpoint });
274
+ if (queryParameterCalls) {
275
+ callChain.push(kt.call('apply', [kt.lambda([], queryParameterCalls)]));
241
276
  }
277
+ const pathVariables = this.getUriPathVariablesValue(ctx, { endpoint });
278
+ callChain.push(pathVariables ? kt.call('buildAndExpand', [pathVariables]) : kt.call('build', []));
242
279
  callChain.push('toUriString');
243
280
  result.values.push(s `return ${kt.call(callChain, [])}`);
244
281
  return result;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goast/kotlin",
3
- "version": "0.5.11-beta.2",
3
+ "version": "0.5.12",
4
4
  "description": "Provides gOAst generators for generating Kotlin code from OpenAPI specifications.",
5
5
  "author": {
6
6
  "name": "Marc Schmidt (MaSch0212)",
@@ -112,31 +112,31 @@ class DefaultKotlinOkHttp3Generator extends file_generator_js_1.KotlinFileGenera
112
112
  return (0, core_1.appendValueGroup)([
113
113
  (0, core_1.builderTemplate) `val localVarResponse = ${index_js_1.kt.call([(0, core_1.toCasing)(endpoint.name + '_WithHttpInfo', ctx.config.functionNameCasing)], parameters.map((x) => (0, core_1.toCasing)(x.name, ctx.config.parameterNameCasing)))}`,
114
114
  '',
115
- (0, core_1.builderTemplate) `return when (localVarResponse.responseType) {${core_1.builderTemplate.indent `
115
+ (0, core_1.builderTemplate) `return when (localVarResponse.responseType) {${core_1.builderTemplate.indent `
116
116
  ${ctx.refs.responseType()}.Success -> ${responseSchema === undefined
117
117
  ? index_js_1.kt.refs.unit()
118
118
  : (0, core_1.builderTemplate) `(localVarResponse as ${ctx.refs.success(['*'])}).data as ${this.getTypeUsage(ctx, {
119
119
  schema: responseSchema,
120
- })}`}
121
- ${ctx.refs.responseType()}.Informational -> throw ${index_js_1.kt.refs.java.unsupportedOperationException()}("Client does not support Informational responses.")
122
- ${ctx.refs.responseType()}.Redirection -> throw ${index_js_1.kt.refs.java.unsupportedOperationException()}("Client does not support Redirection responses.")
123
- ${ctx.refs.responseType()}.ClientError -> {${core_1.builderTemplate.indent `
124
- val localVarError = localVarResponse as ${ctx.refs.clientError(['*'])}
125
- throw ${ctx.refs.clientException()}(${core_1.builderTemplate.indent `
126
- "Client error : \${localVarError.statusCode} \${localVarError.message.orEmpty()}",
127
- localVarError.statusCode,
128
- localVarResponse`}
129
- )`}
130
- }
131
-
132
- ${ctx.refs.responseType()}.ServerError -> {${core_1.builderTemplate.indent `
133
- val localVarError = localVarResponse as ${ctx.refs.serverError(['*'])}
134
- throw ${ctx.refs.serverException()}(${core_1.builderTemplate.indent `
135
- "Server error : \${localVarError.statusCode} \${localVarError.message.orEmpty()}",
136
- localVarError.statusCode,
137
- localVarResponse`}
138
- )`}
139
- }`}
120
+ })}`}
121
+ ${ctx.refs.responseType()}.Informational -> throw ${index_js_1.kt.refs.java.unsupportedOperationException()}("Client does not support Informational responses.")
122
+ ${ctx.refs.responseType()}.Redirection -> throw ${index_js_1.kt.refs.java.unsupportedOperationException()}("Client does not support Redirection responses.")
123
+ ${ctx.refs.responseType()}.ClientError -> {${core_1.builderTemplate.indent `
124
+ val localVarError = localVarResponse as ${ctx.refs.clientError(['*'])}
125
+ throw ${ctx.refs.clientException()}(${core_1.builderTemplate.indent `
126
+ "Client error : \${localVarError.statusCode} \${localVarError.message.orEmpty()}",
127
+ localVarError.statusCode,
128
+ localVarResponse`}
129
+ )`}
130
+ }
131
+
132
+ ${ctx.refs.responseType()}.ServerError -> {${core_1.builderTemplate.indent `
133
+ val localVarError = localVarResponse as ${ctx.refs.serverError(['*'])}
134
+ throw ${ctx.refs.serverException()}(${core_1.builderTemplate.indent `
135
+ "Server error : \${localVarError.statusCode} \${localVarError.message.orEmpty()}",
136
+ localVarError.statusCode,
137
+ localVarResponse`}
138
+ )`}
139
+ }`}
140
140
  }`,
141
141
  ], '\n');
142
142
  }
@@ -215,16 +215,16 @@ class DefaultKotlinOkHttp3Generator extends file_generator_js_1.KotlinFileGenera
215
215
  result.values.push(`val localVariableBody = ${bodyParamName}`);
216
216
  }
217
217
  }
218
- result.values.push((0, core_1.builderTemplate) `val localVariableQuery: ${ctx.refs.multiValueMap()} = ${index_js_1.kt.call([index_js_1.kt.refs.mutableMapOf([index_js_1.kt.refs.string(), index_js_1.kt.refs.list([index_js_1.kt.refs.string()])])], [])}${queryParameters.length === 0 ? '' : core_1.builderTemplate.indent `
219
- .apply {${core_1.builderTemplate.indent `
218
+ result.values.push((0, core_1.builderTemplate) `val localVariableQuery: ${ctx.refs.multiValueMap()} = ${index_js_1.kt.call([index_js_1.kt.refs.mutableMapOf([index_js_1.kt.refs.string(), index_js_1.kt.refs.list([index_js_1.kt.refs.string()])])], [])}${queryParameters.length === 0 ? '' : core_1.builderTemplate.indent `
219
+ .apply {${core_1.builderTemplate.indent `
220
220
  ${(0, core_1.appendValueGroup)(queryParameters.map((param) => {
221
221
  const paramName = (0, core_1.toCasing)(param.name, ctx.config.parameterNameCasing);
222
222
  const toString = this.getParameterToString(ctx, { endpoint, parameter: param });
223
223
  const put = (0, core_1.builderTemplate) `put(${index_js_1.kt.string(param.name)}, listOf(${paramName}${toString}))`;
224
- return param.required ? put : (0, core_1.builderTemplate) `if (${paramName} != null) {${core_1.builderTemplate.indent `
225
- ${put}`}
224
+ return param.required ? put : (0, core_1.builderTemplate) `if (${paramName} != null) {${core_1.builderTemplate.indent `
225
+ ${put}`}
226
226
  }`;
227
- }), '\n')}`}
227
+ }), '\n')}`}
228
228
  }`}`);
229
229
  result.values.push('val localVariableHeaders: MutableMap<String, String> = mutableMapOf()');
230
230
  if (((_b = endpoint.requestBody) === null || _b === void 0 ? void 0 : _b.content[0]) !== undefined) {
@@ -233,8 +233,8 @@ class DefaultKotlinOkHttp3Generator extends file_generator_js_1.KotlinFileGenera
233
233
  for (const header of headerParameters) {
234
234
  const paramName = (0, core_1.toCasing)(header.name, ctx.config.parameterNameCasing);
235
235
  const toString = this.getParameterToString(ctx, { endpoint, parameter: header });
236
- result.values.push((0, core_1.builderTemplate) `if (${paramName} != null) {${core_1.builderTemplate.indent `
237
- localVariableHeaders["${header.name}"] = ${paramName}${toString}`}
236
+ result.values.push((0, core_1.builderTemplate) `if (${paramName} != null) {${core_1.builderTemplate.indent `
237
+ localVariableHeaders["${header.name}"] = ${paramName}${toString}`}
238
238
  }`);
239
239
  }
240
240
  result.values.push((0, core_1.builderTemplate) `return ${index_js_1.kt.call([ctx.refs.requestConfig.infer()], [
@@ -103,16 +103,16 @@ class KotlinOkHttp3ClientsGenerator extends core_1.OpenApiServicesGenerationProv
103
103
  const jsonIncludeMember = (0, core_1.toCasing)(ctx.config.serializerJsonInclude, 'snake');
104
104
  const defaultFactory = springBootVersion === 4
105
105
  // Jackson 3's ObjectMapper is immutable; configuration moved to the (Kotlin) mapper builder.
106
- ? (0, core_1.builderTemplate) `${index_js_1.kt.refs.jackson.jacksonMapperBuilder(springBootVersion)}()${core_1.builderTemplate.indent `
107
- .findAndAddModules()
108
- .changeDefaultPropertyInclusion { it.withValueInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember}).withContentInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember}) }
109
- .configure(${index_js_1.kt.refs.jackson.serializationFeature(springBootVersion)}.WRITE_DATES_AS_TIMESTAMPS, false)
110
- .configure(${index_js_1.kt.refs.jackson.deserializationFeature(springBootVersion)}.FAIL_ON_UNKNOWN_PROPERTIES, false)
106
+ ? (0, core_1.builderTemplate) `${index_js_1.kt.refs.jackson.jacksonMapperBuilder(springBootVersion)}()${core_1.builderTemplate.indent `
107
+ .findAndAddModules()
108
+ .changeDefaultPropertyInclusion { it.withValueInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember}).withContentInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember}) }
109
+ .configure(${index_js_1.kt.refs.jackson.serializationFeature(springBootVersion)}.WRITE_DATES_AS_TIMESTAMPS, false)
110
+ .configure(${index_js_1.kt.refs.jackson.deserializationFeature(springBootVersion)}.FAIL_ON_UNKNOWN_PROPERTIES, false)
111
111
  .build()`}`
112
- : (0, core_1.builderTemplate) `${index_js_1.kt.refs.jackson.jacksonObjectMapper(springBootVersion)}()${core_1.builderTemplate.indent `
113
- .findAndRegisterModules()
114
- .setSerializationInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember})
115
- .configure(${index_js_1.kt.refs.jackson.serializationFeature(springBootVersion)}.WRITE_DATES_AS_TIMESTAMPS, false)
112
+ : (0, core_1.builderTemplate) `${index_js_1.kt.refs.jackson.jacksonObjectMapper(springBootVersion)}()${core_1.builderTemplate.indent `
113
+ .findAndRegisterModules()
114
+ .setSerializationInclusion(${index_js_1.kt.refs.jackson.jsonInclude()}.Include.${jsonIncludeMember})
115
+ .configure(${index_js_1.kt.refs.jackson.serializationFeature(springBootVersion)}.WRITE_DATES_AS_TIMESTAMPS, false)
116
116
  .configure(${index_js_1.kt.refs.jackson.deserializationFeature(springBootVersion)}.FAIL_ON_UNKNOWN_PROPERTIES, false)`}`;
117
117
  const factory = typeof ctx.config.serializer === 'object'
118
118
  ? ctx.config.serializer.factory
@@ -261,13 +261,13 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_js_1.KotlinF
261
261
  }
262
262
  }
263
263
  });
264
- body.values.push((0, core_1.builderTemplate) `try {${core_1.builderTemplate.indent `
264
+ body.values.push((0, core_1.builderTemplate) `try {${core_1.builderTemplate.indent `
265
265
  return ${index_js_1.kt.call([
266
266
  index_js_1.kt.call(index_js_1.kt.reference('getDelegate'), []),
267
267
  (0, core_1.toCasing)(endpoint.name, ctx.config.functionNameCasing),
268
- ], parameters.map((x) => (0, core_1.toCasing)(x.name, ctx.config.parameterNameCasing)))}`}
269
- } catch (e: ${index_js_1.kt.refs.throwable()}) {${core_1.builderTemplate.indent `
270
- return getExceptionHandler()?.handleApiException(e) ?: throw e`}
268
+ ], parameters.map((x) => (0, core_1.toCasing)(x.name, ctx.config.parameterNameCasing)))}`}
269
+ } catch (e: ${index_js_1.kt.refs.throwable()}) {${core_1.builderTemplate.indent `
270
+ return getExceptionHandler()?.handleApiException(e) ?: throw e`}
271
271
  }`);
272
272
  return body;
273
273
  }
@@ -329,11 +329,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_js_1.KotlinF
329
329
  hasResponseBody ? index_js_1.kt.argument('body') : index_js_1.kt.toNode(null),
330
330
  index_js_1.kt.toNode(code),
331
331
  contentType
332
- ? (0, core_1.builderTemplate) `${index_js_1.kt.refs.spring.linkedMultiValueMap([index_js_1.kt.refs.string(), index_js_1.kt.refs.string()])}().also {
333
- if (headers != null) {
334
- it.putAll(headers)
335
- }
336
- it.addIfAbsent("Content-Type", ${index_js_1.kt.string(contentType)})
332
+ ? (0, core_1.builderTemplate) `${index_js_1.kt.refs.spring.linkedMultiValueMap([index_js_1.kt.refs.string(), index_js_1.kt.refs.string()])}().also {
333
+ if (headers != null) {
334
+ it.putAll(headers)
335
+ }
336
+ it.addIfAbsent("Content-Type", ${index_js_1.kt.string(contentType)})
337
337
  }`
338
338
  : index_js_1.kt.argument('headers'),
339
339
  ]),
@@ -43,6 +43,16 @@ export type GetEndpointFunctionWithHandlerBody = {
43
43
  parameters: ApiParameterWithMultipartInfo[];
44
44
  responseSchema: ApiSchema | undefined;
45
45
  };
46
+ export type GetEndpointUriCall = {
47
+ endpoint: ApiEndpoint;
48
+ parameters: ApiParameterWithMultipartInfo[];
49
+ };
50
+ export type GetUriPathVariablesValue = {
51
+ endpoint: ApiEndpoint;
52
+ };
53
+ export type GetUriQueryParameterCalls = {
54
+ endpoint: ApiEndpoint;
55
+ };
46
56
  export type GetEndpointUriFunctionName = {
47
57
  endpoint: ApiEndpoint;
48
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,6BAA6B,EAAE,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,uBAAuB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,6BAA6B,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,6BAA6B,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,QAAQ,SAAS,aAAa,IAAI;IACzD,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,uBAAuB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,yBAAyB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/args.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,20 @@ export type KotlinSpringReactiveWebClientsGeneratorConfig = KotlinGeneratorConfi
13
13
  basePath?: string | RegExp | ((basePath: string, service: ApiService) => string);
14
14
  pathModifier?: RegExp | ((path: string, endpoint: ApiEndpoint) => string);
15
15
  serializerJsonInclude: 'always' | 'non-null' | 'non-absent' | 'non-default' | 'non-empty' | 'use-defaults';
16
+ /**
17
+ * Whether the generated request functions pass the URI template (e.g. `pets/{id}`) to `WebClient` instead of an
18
+ * already expanded URI string. Only with the template does Spring populate
19
+ * `ClientRequestObservationContext.uriTemplate`, which keeps the `uri` tag of `http.client.requests` bounded by the
20
+ * number of endpoints instead of by the number of distinct path parameter values.
21
+ *
22
+ * Note that path parameter values are then encoded as URI variables, i.e. reserved characters (`/`, `?`, `#`, `%`)
23
+ * inside a value are percent-encoded. Values consisting of unreserved characters are unaffected, so for those the
24
+ * request is byte-identical to the expanded form.
25
+ *
26
+ * The `<endpoint>Uri(...)` helper functions are generated either way.
27
+ * @default true
28
+ */
29
+ preserveUriTemplate: boolean;
16
30
  };
17
31
  export declare const defaultKotlinSpringReactiveWebClientsGeneratorConfig: DefaultGenerationProviderConfig<KotlinSpringReactiveWebClientsGeneratorConfig>;
18
32
  export type KotlinSpringReactiveWebClientsGeneratorInput = KotlinModelsGeneratorOutput;
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,+BAA+B,EAC/B,wCAAwC,EACzC,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAgC,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,6CAA6C,GAAG,qBAAqB,GAAG;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IAC3D,yBAAyB,EACrB,MAAM,GACN;QAAE,IAAI,EAAE,qBAAqB,GAAG,0BAA0B,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAE5F,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IACjF,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;IAC1E,qBAAqB,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,CAAC;CAC5G,CAAC;AAEF,eAAO,MAAM,oDAAoD,EAAE,+BAA+B,CAChG,6CAA6C,CAQ9C,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG,2BAA2B,CAAC;AAEvF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,MAAM,EAAE;QACN,OAAO,EAAE;YACP,CAAC,SAAS,EAAE,MAAM,GAAG,4CAA4C,CAAC;SACnE,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG,YAAY,CAAC;AAExE,MAAM,MAAM,8CAA8C,GACtD,wCAAwC,CACxC,4CAA4C,EAC5C,6CAA6C,EAC7C,6CAA6C,EAC7C,4CAA4C,CAC7C,GACC;IACA,yBAAyB,EAAE,MAAM,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CAChD,CAAC;AAEJ,MAAM,MAAM,6CAA6C,GAAG,8CAA8C,GAAG;IAC3G,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,+BAA+B,EAC/B,wCAAwC,EACzC,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAgC,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,6CAA6C,GAAG,qBAAqB,GAAG;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IAC3D,yBAAyB,EACrB,MAAM,GACN;QAAE,IAAI,EAAE,qBAAqB,GAAG,0BAA0B,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAE5F,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IACjF,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;IAC1E,qBAAqB,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,CAAC;IAE3G;;;;;;;;;;;;OAYG;IACH,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,oDAAoD,EAAE,+BAA+B,CAChG,6CAA6C,CAS9C,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG,2BAA2B,CAAC;AAEvF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,MAAM,EAAE;QACN,OAAO,EAAE;YACP,CAAC,SAAS,EAAE,MAAM,GAAG,4CAA4C,CAAC;SACnE,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG,YAAY,CAAC;AAExE,MAAM,MAAM,8CAA8C,GACtD,wCAAwC,CACxC,4CAA4C,EAC5C,6CAA6C,EAC7C,6CAA6C,EAC7C,4CAA4C,CAC7C,GACC;IACA,yBAAyB,EAAE,MAAM,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CAChD,CAAC;AAEJ,MAAM,MAAM,6CAA6C,GAAG,8CAA8C,GAAG;IAC3G,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC"}
@@ -8,4 +8,5 @@ exports.defaultKotlinSpringReactiveWebClientsGeneratorConfig = {
8
8
  packageSuffix: '.api.client',
9
9
  infrastructurePackageName: { mode: 'append-full-package-name', value: '.infrastructure' },
10
10
  serializerJsonInclude: 'non-absent',
11
+ preserveUriTemplate: true,
11
12
  };
@@ -24,6 +24,14 @@ export declare class DefaultKotlinSpringReactiveWebClientGenerator extends Kotli
24
24
  protected getEndpointRequestFunctionName(ctx: Context, args: Args.GetEndpointRequestFunctionName): string;
25
25
  protected getEndpointRequestFunction(ctx: Context, args: Args.GetEndpointRequestFunction): kt.Function<Builder>;
26
26
  protected getEndpointRequestFunctionBody(ctx: Context, args: Args.GetEndpointRequestFunctionBody): AppendValueGroup<Builder>;
27
+ /**
28
+ * Emits the `uri(...)` call of the request function. If `preserveUriTemplate` is enabled, the URI template is
29
+ * passed to `WebClient` verbatim, so Spring can record it (`ClientRequestObservationContext.uriTemplate`) and tag
30
+ * `http.client.requests` with the route instead of the expanded path.
31
+ */
32
+ protected getEndpointUriCall(ctx: Context, args: Args.GetEndpointUriCall): kt.Value<Builder>;
33
+ protected getUriPathVariablesValue(ctx: Context, args: Args.GetUriPathVariablesValue): kt.Value<Builder> | null;
34
+ protected getUriQueryParameterCalls(ctx: Context, args: Args.GetUriQueryParameterCalls): AppendValueGroup<Builder> | null;
27
35
  protected getEndpointUriFunctionName(ctx: Context, args: Args.GetEndpointUriFunctionName): string;
28
36
  protected getEndpointUriFunction(ctx: Context, args: Args.GetEndpointUriFunction): kt.Function<Builder>;
29
37
  protected getEndpointUriFunctionBody(ctx: Context, args: Args.GetEndpointUriFunctionBody): AppendValueGroup<Builder>;
@@ -1 +1 @@
1
- {"version":3,"file":"spring-reactive-web-client-generator.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spring-reactive-web-client-generator.d.ts","sourceRoot":"","sources":["../../../../../src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts"],"names":[],"mappings":"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"}
@@ -130,7 +130,7 @@ class DefaultKotlinSpringReactiveWebClientGenerator extends file_generator_js_1.
130
130
  const { endpoint, parameters, responseSchema } = args;
131
131
  const result = (0, core_1.appendValueGroup)([], '\n');
132
132
  const callChain = [];
133
- callChain.push((0, core_1.builderTemplate) `return this.method(${index_js_1.kt.refs.spring.httpMethod()}.${endpoint.method.toUpperCase()})`, index_js_1.kt.call('uri', [index_js_1.kt.call([this.getEndpointUriFunctionName(ctx, { endpoint })], parameters.filter((p) => p.target === 'path' || p.target === 'query').map((p) => (0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing)))]));
133
+ callChain.push((0, core_1.builderTemplate) `return this.method(${index_js_1.kt.refs.spring.httpMethod()}.${endpoint.method.toUpperCase()})`, this.getEndpointUriCall(ctx, { endpoint, parameters }));
134
134
  if (responseSchema) {
135
135
  callChain.push((0, core_1.builderTemplate) `accept(${index_js_1.kt.refs.spring.mediaType()}.APPLICATION_JSON)`);
136
136
  }
@@ -204,6 +204,57 @@ class DefaultKotlinSpringReactiveWebClientGenerator extends file_generator_js_1.
204
204
  result.values.push(index_js_1.kt.call(callChain));
205
205
  return result;
206
206
  }
207
+ /**
208
+ * Emits the `uri(...)` call of the request function. If `preserveUriTemplate` is enabled, the URI template is
209
+ * passed to `WebClient` verbatim, so Spring can record it (`ClientRequestObservationContext.uriTemplate`) and tag
210
+ * `http.client.requests` with the route instead of the expanded path.
211
+ */
212
+ getEndpointUriCall(ctx, args) {
213
+ const { endpoint, parameters } = args;
214
+ if (!ctx.config.preserveUriTemplate) {
215
+ return index_js_1.kt.call('uri', [index_js_1.kt.call([this.getEndpointUriFunctionName(ctx, { endpoint })], parameters.filter((p) => p.target === 'path' || p.target === 'query').map((p) => (0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing)))]);
216
+ }
217
+ const uriTemplate = index_js_1.kt.string(this.getEndpointPath(ctx, { endpoint }));
218
+ const pathVariables = this.getUriPathVariablesValue(ctx, { endpoint });
219
+ const queryParameterCalls = this.getUriQueryParameterCalls(ctx, { endpoint });
220
+ // Without query parameters the template and its variables can be handed to `uri` directly.
221
+ if (!queryParameterCalls) {
222
+ return index_js_1.kt.call('uri', [uriTemplate, pathVariables]);
223
+ }
224
+ // Query parameters need a `UriBuilder`, which the `uri(String, Function<UriBuilder, URI>)` overload provides
225
+ // while still recording the template.
226
+ return index_js_1.kt.call('uri', [
227
+ uriTemplate,
228
+ index_js_1.kt.lambda(['uriBuilder'], index_js_1.kt.call([
229
+ 'uriBuilder',
230
+ index_js_1.kt.call('apply', [index_js_1.kt.lambda([], queryParameterCalls)]),
231
+ index_js_1.kt.call('build', [pathVariables]),
232
+ ])),
233
+ ]);
234
+ }
235
+ getUriPathVariablesValue(ctx, args) {
236
+ const { endpoint } = args;
237
+ const pathParameters = endpoint.parameters.filter((p) => p.target === 'path');
238
+ if (pathParameters.length === 0)
239
+ return null;
240
+ return index_js_1.kt.call([index_js_1.kt.refs.mapOf.infer()], pathParameters.map((p) => (0, core_1.builderTemplate) `${index_js_1.kt.string(p.name)} to ${(0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing)}${this.getParameterToString(ctx, { endpoint, parameter: p })}`));
241
+ }
242
+ getUriQueryParameterCalls(ctx, args) {
243
+ const { endpoint } = args;
244
+ const queryParameters = endpoint.parameters.filter((p) => p.target === 'query');
245
+ if (queryParameters.length === 0)
246
+ return null;
247
+ return (0, core_1.appendValueGroup)(queryParameters.map((p) => {
248
+ var _a;
249
+ const parameterName = (0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing);
250
+ const toString = this.getParameterToString(ctx, { endpoint, parameter: p });
251
+ return p.required && !((_a = p.schema) === null || _a === void 0 ? void 0 : _a.nullable)
252
+ ? index_js_1.kt.call('queryParam', [index_js_1.kt.string(p.name), parameterName + toString])
253
+ : index_js_1.kt.call([`${parameterName}?`, 'also'], [
254
+ index_js_1.kt.lambda([], index_js_1.kt.call('queryParam', [index_js_1.kt.string(p.name), 'it' + toString]), { singleline: true }),
255
+ ]);
256
+ }), '\n');
257
+ }
207
258
  getEndpointUriFunctionName(ctx, args) {
208
259
  const { endpoint } = args;
209
260
  return (0, core_1.toCasing)(`${this.getEndpointFunctionName(ctx, { endpoint })}_uri`, ctx.config.functionNameCasing);
@@ -222,26 +273,12 @@ class DefaultKotlinSpringReactiveWebClientGenerator extends file_generator_js_1.
222
273
  const result = (0, core_1.appendValueGroup)([], '\n');
223
274
  const callChain = [];
224
275
  callChain.push((0, core_1.builderTemplate) `${index_js_1.kt.refs.spring.uriComponentsBuilder()}.fromPath(${index_js_1.kt.string(this.getEndpointPath(ctx, { endpoint }))})`);
225
- if (endpoint.parameters.some((x) => x.target === 'query')) {
226
- callChain.push(index_js_1.kt.call('apply', [index_js_1.kt.lambda([], (0, core_1.appendValueGroup)(endpoint.parameters.filter((x) => x.target === 'query').map((p) => {
227
- var _a;
228
- const parameterName = (0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing);
229
- const toString = this.getParameterToString(ctx, { endpoint, parameter: p });
230
- return p.required && !((_a = p.schema) === null || _a === void 0 ? void 0 : _a.nullable)
231
- ? index_js_1.kt.call('queryParam', [index_js_1.kt.string(p.name), parameterName + toString])
232
- : index_js_1.kt.call([`${parameterName}?`, 'also'], [
233
- index_js_1.kt.lambda([], index_js_1.kt.call('queryParam', [index_js_1.kt.string(p.name), 'it' + toString]), { singleline: true }),
234
- ]);
235
- }), '\n'))]));
236
- }
237
- if (endpoint.parameters.some((x) => x.target === 'path')) {
238
- callChain.push(index_js_1.kt.call('buildAndExpand', [
239
- index_js_1.kt.call([index_js_1.kt.refs.mapOf.infer()], endpoint.parameters.filter((p) => p.target === 'path').map((p) => (0, core_1.builderTemplate) `${index_js_1.kt.string(p.name)} to ${(0, core_1.toCasing)(p.name, ctx.config.parameterNameCasing)}${this.getParameterToString(ctx, { endpoint, parameter: p })}`)),
240
- ]));
241
- }
242
- else {
243
- callChain.push(index_js_1.kt.call('build', []));
276
+ const queryParameterCalls = this.getUriQueryParameterCalls(ctx, { endpoint });
277
+ if (queryParameterCalls) {
278
+ callChain.push(index_js_1.kt.call('apply', [index_js_1.kt.lambda([], queryParameterCalls)]));
244
279
  }
280
+ const pathVariables = this.getUriPathVariablesValue(ctx, { endpoint });
281
+ callChain.push(pathVariables ? index_js_1.kt.call('buildAndExpand', [pathVariables]) : index_js_1.kt.call('build', []));
245
282
  callChain.push('toUriString');
246
283
  result.values.push((0, core_1.builderTemplate) `return ${index_js_1.kt.call(callChain, [])}`);
247
284
  return result;
package/src/mod.ts ADDED
@@ -0,0 +1,8 @@
1
+ export * from './src/ast/index.js';
2
+ export * from './src/common-results.js';
3
+ export * from './src/config.js';
4
+ export * from './src/file-builder.js';
5
+ export * from './src/generators/index.js';
6
+ export * from './src/import-collection.js';
7
+ export * from './src/types.js';
8
+ export * from './src/utils.js';
@@ -0,0 +1,9 @@
1
+ import { AssetManager } from '@goast/core';
2
+ import { pathToFileURL, URL } from 'node:url';
3
+
4
+ declare const __filename: string | undefined;
5
+ const scriptUrl = typeof __filename === 'undefined' ? import.meta.url : pathToFileURL(__filename);
6
+
7
+ const manager = new AssetManager(new URL('../assets/', scriptUrl));
8
+ export const getAssetFileContent = manager.getAssetFileContent.bind(manager);
9
+ export const copyAssetFile = manager.copyAssetFile.bind(manager);
@@ -0,0 +1,66 @@
1
+ export { type KtAccessModifier as AccessModifier } from './common.js';
2
+ export { KtNode as Node } from './node.js';
3
+ export {
4
+ KtAnnotation as Annotation,
5
+ ktAnnotation as annotation,
6
+ type KtAnnotationTarget as AnnotationTarget,
7
+ } from './nodes/annotation.js';
8
+ export { KtArgument as Argument, ktArgument as argument } from './nodes/argument.js';
9
+ export { KtCall as Call, ktCall as call } from './nodes/call.js';
10
+ export {
11
+ KtClass as Class,
12
+ ktClass as class,
13
+ type KtClassKind as ClassKind,
14
+ type KtClassMember as ClassMember,
15
+ } from './nodes/class.js';
16
+ export {
17
+ KtCollectionLiteral as CollectionLiteral,
18
+ ktCollectionLiteral as collectionLiteral,
19
+ } from './nodes/collection-literal.js';
20
+ export {
21
+ KtConstructor as Constructor,
22
+ ktConstructor as constructor,
23
+ type KtDelegateTarget as DelegateTarget,
24
+ } from './nodes/constructor.js';
25
+ export { KtDocTag as DocTag, ktDocTag as docTag } from './nodes/doc-tag.js';
26
+ export { KtDoc as Doc, ktDoc as doc } from './nodes/doc.js';
27
+ export {
28
+ KtEnumValue as EnumValue,
29
+ ktEnumValue as enumValue,
30
+ type KtEnumValueMember as EnumValueMember,
31
+ } from './nodes/enum-value.js';
32
+ export { KtEnum as Enum, ktEnum as enum, type KtEnumMember as EnumMember } from './nodes/enum.js';
33
+ export { KtFunction as Function, ktFunction as function } from './nodes/function.js';
34
+ export {
35
+ KtGenericParameter as GenericParameter,
36
+ ktGenericParameter as genericParameter,
37
+ } from './nodes/generic-parameter.js';
38
+ export { KtInitBlock as InitBlock, ktInitBlock as initBlock } from './nodes/init-block.js';
39
+ export {
40
+ KtInterface as Interface,
41
+ ktInterface as interface,
42
+ type KtInterfaceMember as InterfaceMember,
43
+ } from './nodes/interface.js';
44
+ export { KtLambdaType as LambdaType, ktLambdaType as lambdaType } from './nodes/lambda-type.js';
45
+ export { KtLambda as Lambda, ktLambda as lambda } from './nodes/lambda.js';
46
+ export { KtObject as Object, ktObject as object, type KtObjectMember as ObjectMember } from './nodes/object.js';
47
+ export { KtParameter as Parameter, ktParameter as parameter } from './nodes/parameter.js';
48
+ export {
49
+ KtProperty as Property,
50
+ ktProperty as property,
51
+ KtPropertyAccessor as PropertyAccessor,
52
+ KtPropertyGetter as PropertyGetter,
53
+ KtPropertySetter as PropertySetter,
54
+ } from './nodes/property.js';
55
+ export {
56
+ type KtGenericReferenceFactory as GenericReferenceFactory,
57
+ KtReference as Reference,
58
+ ktReference as reference,
59
+ type KtReferenceFactory as ReferenceFactory,
60
+ } from './nodes/reference.js';
61
+ export { KtString as String, ktString as string } from './nodes/string.js';
62
+ export { type KtType as Type, type KtValue as Value } from './nodes/types.js';
63
+ export * as refs from './references/index.js';
64
+ export { getKotlinBuilderOptions as getBuilderOptions } from './utils/get-kotlin-builder-options.js';
65
+ export { toKtNode as toNode } from './utils/to-kt-node.js';
66
+ export { writeKtNode as writeNode, writeKtNodes as writeNodes } from './utils/write-kt-node.js';
@@ -0,0 +1 @@
1
+ export type KtAccessModifier = 'public' | 'protected' | 'internal' | 'private';
@@ -0,0 +1 @@
1
+ export * as kt from './_index.js';
@@ -0,0 +1,10 @@
1
+ import { AstNode, type AstNodeOptions, type SourceBuilder } from '@goast/core';
2
+
3
+ export abstract class KtNode<TBuilder extends SourceBuilder, TInjects extends string = never> extends AstNode<
4
+ TBuilder,
5
+ TInjects
6
+ > {
7
+ constructor(options: AstNodeOptions<typeof AstNode<TBuilder, TInjects>>) {
8
+ super(options);
9
+ }
10
+ }