@nestia/sdk 11.2.1 → 12.0.0-dev.20260521.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 (277) hide show
  1. package/assets/bundle/distribute/package.json +1 -1
  2. package/lib/NestiaSdkApplication.js +5 -4
  3. package/lib/NestiaSdkApplication.js.map +1 -1
  4. package/lib/NestiaSwaggerComposer.js +2 -2
  5. package/lib/NestiaSwaggerComposer.js.map +1 -1
  6. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  7. package/lib/analyses/ConfigAnalyzer.js +133 -7
  8. package/lib/analyses/ConfigAnalyzer.js.map +1 -1
  9. package/lib/analyses/ImportAnalyzer.d.ts +9 -2
  10. package/lib/analyses/ImportAnalyzer.js +13 -50
  11. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  12. package/lib/analyses/PathAnalyzer.js.map +1 -1
  13. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  14. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
  15. package/lib/analyses/ReflectHttpOperationAnalyzer.js +5 -4
  16. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  17. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.d.ts +1 -1
  18. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +22 -5
  19. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
  20. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.d.ts +1 -1
  21. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +8 -8
  22. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  23. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
  24. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +15 -15
  25. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  26. package/lib/analyses/ReflectMetadataAnalyzer.js.map +1 -1
  27. package/lib/analyses/ReflectWebSocketOperationAnalyzer.d.ts +1 -1
  28. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +1 -1
  29. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
  30. package/lib/analyses/SecurityAnalyzer.js.map +1 -1
  31. package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +2 -1
  32. package/lib/analyses/TypedHttpRouteAnalyzer.js +296 -39
  33. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  34. package/lib/analyses/TypedWebSocketRouteAnalyzer.js +1 -4
  35. package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
  36. package/lib/decorators/OperationMetadata.d.ts +12 -2
  37. package/lib/decorators/OperationMetadata.js +14 -1
  38. package/lib/decorators/OperationMetadata.js.map +1 -1
  39. package/lib/executable/internal/CommandParser.js.map +1 -1
  40. package/lib/executable/internal/NestiaConfigLoader.d.ts +6 -2
  41. package/lib/executable/internal/NestiaConfigLoader.js +285 -793
  42. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  43. package/lib/executable/internal/NestiaSdkCommand.js +6 -4
  44. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  45. package/lib/executable/sdk.js +17 -5
  46. package/lib/executable/sdk.js.map +1 -1
  47. package/lib/generates/CloneGenerator.js +2 -2
  48. package/lib/generates/CloneGenerator.js.map +1 -1
  49. package/lib/generates/E2eGenerator.js.map +1 -1
  50. package/lib/generates/SdkGenerator.js +6 -9
  51. package/lib/generates/SdkGenerator.js.map +1 -1
  52. package/lib/generates/SwaggerGenerator.js +20 -107
  53. package/lib/generates/SwaggerGenerator.js.map +1 -1
  54. package/lib/generates/internal/E2eFileProgrammer.js +44 -28
  55. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  56. package/lib/generates/internal/FilePrinter.d.ts +4 -4
  57. package/lib/generates/internal/FilePrinter.js +25 -16
  58. package/lib/generates/internal/FilePrinter.js.map +1 -1
  59. package/lib/generates/internal/ImportDictionary.d.ts +2 -2
  60. package/lib/generates/internal/ImportDictionary.js +7 -5
  61. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  62. package/lib/generates/internal/SdkAliasCollection.d.ts +11 -11
  63. package/lib/generates/internal/SdkAliasCollection.js +27 -31
  64. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  65. package/lib/generates/internal/SdkDistributionComposer.js +15 -70
  66. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  67. package/lib/generates/internal/SdkFileProgrammer.js +2 -2
  68. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  69. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +2 -2
  70. package/lib/generates/internal/SdkHttpCloneProgrammer.js +6 -12
  71. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  72. package/lib/generates/internal/SdkHttpCloneReferencer.js +2 -1
  73. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  74. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +2 -2
  75. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +73 -77
  76. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  77. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +2 -2
  78. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +64 -66
  79. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  80. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +4 -10
  81. package/lib/generates/internal/SdkHttpParameterProgrammer.js +15 -22
  82. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  83. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +2 -2
  84. package/lib/generates/internal/SdkHttpRouteProgrammer.js +18 -20
  85. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  86. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +3 -3
  87. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +47 -49
  88. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  89. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  90. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  91. package/lib/generates/internal/SdkTypeProgrammer.d.ts +4 -4
  92. package/lib/generates/internal/SdkTypeProgrammer.js +66 -67
  93. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  94. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +1 -2
  95. package/lib/generates/internal/SdkTypeTagProgrammer.js +29 -11
  96. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  97. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +2 -2
  98. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +55 -55
  99. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  100. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +3 -3
  101. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +9 -12
  102. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  103. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +2 -2
  104. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +43 -45
  105. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  106. package/lib/generates/internal/SwaggerDescriptionComposer.js.map +1 -1
  107. package/lib/generates/internal/SwaggerOperationComposer.d.ts +1 -1
  108. package/lib/generates/internal/SwaggerOperationComposer.js +5 -4
  109. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  110. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +0 -3
  111. package/lib/generates/internal/SwaggerOperationParameterComposer.js +19 -20
  112. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  113. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  114. package/lib/generates/internal/SwaggerOperationResponseComposer.js +4 -3
  115. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  116. package/lib/index.js.map +1 -1
  117. package/lib/internal/legacy.d.ts +180 -0
  118. package/lib/internal/legacy.js +361 -0
  119. package/lib/internal/legacy.js.map +1 -0
  120. package/lib/structures/INestiaProject.d.ts +0 -2
  121. package/lib/{transformers → structures}/IOperationMetadata.d.ts +2 -7
  122. package/lib/structures/IOperationMetadata.js.map +1 -0
  123. package/lib/structures/IReflectHttpOperationException.d.ts +1 -1
  124. package/lib/structures/IReflectHttpOperationParameter.d.ts +1 -1
  125. package/lib/structures/IReflectHttpOperationSuccess.d.ts +1 -1
  126. package/lib/structures/IReflectOperationError.d.ts +1 -1
  127. package/lib/structures/IReflectOperationError.js.map +1 -1
  128. package/lib/structures/IReflectWebSocketOperation.d.ts +2 -2
  129. package/lib/structures/ITypedApplication.d.ts +1 -1
  130. package/lib/structures/ITypedHttpRouteException.d.ts +1 -1
  131. package/lib/structures/ITypedHttpRouteParameter.d.ts +1 -1
  132. package/lib/structures/ITypedHttpRouteSuccess.d.ts +1 -1
  133. package/lib/structures/ITypedWebSocketRoute.d.ts +2 -2
  134. package/lib/transform.d.ts +16 -3
  135. package/lib/transform.js +47 -5
  136. package/lib/transform.js.map +1 -1
  137. package/lib/utils/ArrayUtil.js.map +1 -1
  138. package/lib/utils/FileRetriever.js.map +1 -1
  139. package/lib/utils/MapUtil.js.map +1 -1
  140. package/lib/utils/PathUtil.js.map +1 -1
  141. package/lib/utils/SourceFinder.js.map +1 -1
  142. package/lib/utils/StringUtil.js.map +1 -1
  143. package/lib/utils/TsConfigReader.d.ts +7 -0
  144. package/lib/utils/TsConfigReader.js +102 -0
  145. package/lib/utils/TsConfigReader.js.map +1 -0
  146. package/lib/utils/TtscExecutor.d.ts +8 -0
  147. package/lib/utils/TtscExecutor.js +58 -0
  148. package/lib/utils/TtscExecutor.js.map +1 -0
  149. package/lib/utils/VersioningStrategy.js.map +1 -1
  150. package/lib/validators/HttpHeadersValidator.d.ts +8 -5
  151. package/lib/validators/HttpHeadersValidator.js +7 -26
  152. package/lib/validators/HttpHeadersValidator.js.map +1 -1
  153. package/lib/validators/HttpQueryValidator.d.ts +8 -5
  154. package/lib/validators/HttpQueryValidator.js +7 -26
  155. package/lib/validators/HttpQueryValidator.js.map +1 -1
  156. package/lib/{transformers → validators}/TextPlainValidator.d.ts +1 -1
  157. package/lib/{transformers → validators}/TextPlainValidator.js +2 -1
  158. package/lib/validators/TextPlainValidator.js.map +1 -0
  159. package/native/go.mod +52 -0
  160. package/native/go.sum +54 -0
  161. package/native/sdk/register.go +130 -0
  162. package/native/sdk/sdk.go +17 -0
  163. package/native/sdk/sdk_metadata_json.go +327 -0
  164. package/native/sdk/sdk_transform.go +1542 -0
  165. package/package.json +19 -19
  166. package/src/NestiaSdkApplication.ts +9 -5
  167. package/src/NestiaSwaggerComposer.ts +2 -3
  168. package/src/analyses/ConfigAnalyzer.ts +175 -1
  169. package/src/analyses/ImportAnalyzer.ts +15 -49
  170. package/src/analyses/ReflectControllerAnalyzer.ts +1 -1
  171. package/src/analyses/ReflectHttpOperationAnalyzer.ts +1 -1
  172. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +24 -6
  173. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +3 -3
  174. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +14 -10
  175. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +2 -2
  176. package/src/analyses/TypedHttpRouteAnalyzer.ts +354 -22
  177. package/src/decorators/OperationMetadata.ts +17 -3
  178. package/src/executable/internal/NestiaConfigLoader.ts +419 -53
  179. package/src/executable/internal/NestiaSdkCommand.ts +9 -10
  180. package/src/executable/sdk.ts +15 -4
  181. package/src/generates/CloneGenerator.ts +10 -10
  182. package/src/generates/SwaggerGenerator.ts +28 -9
  183. package/src/generates/internal/E2eFileProgrammer.ts +80 -43
  184. package/src/generates/internal/FilePrinter.ts +38 -37
  185. package/src/generates/internal/ImportDictionary.ts +18 -16
  186. package/src/generates/internal/SdkAliasCollection.ts +41 -40
  187. package/src/generates/internal/SdkDistributionComposer.ts +21 -8
  188. package/src/generates/internal/SdkFileProgrammer.ts +7 -5
  189. package/src/generates/internal/SdkHttpCloneProgrammer.ts +10 -10
  190. package/src/generates/internal/SdkHttpCloneReferencer.ts +6 -6
  191. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +101 -78
  192. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +153 -145
  193. package/src/generates/internal/SdkHttpParameterProgrammer.ts +20 -33
  194. package/src/generates/internal/SdkHttpRouteProgrammer.ts +2 -2
  195. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +88 -86
  196. package/src/generates/internal/SdkTypeProgrammer.ts +93 -99
  197. package/src/generates/internal/SdkTypeTagProgrammer.ts +12 -12
  198. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +128 -118
  199. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +15 -13
  200. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +133 -112
  201. package/src/generates/internal/SwaggerOperationComposer.ts +1 -1
  202. package/src/generates/internal/SwaggerOperationParameterComposer.ts +10 -9
  203. package/src/generates/internal/SwaggerOperationResponseComposer.ts +1 -1
  204. package/src/internal/legacy.ts +492 -0
  205. package/src/structures/INestiaProject.ts +0 -3
  206. package/src/{transformers → structures}/IOperationMetadata.ts +2 -7
  207. package/src/structures/IReflectHttpOperationException.ts +1 -1
  208. package/src/structures/IReflectHttpOperationParameter.ts +1 -1
  209. package/src/structures/IReflectHttpOperationSuccess.ts +1 -1
  210. package/src/structures/IReflectOperationError.ts +1 -1
  211. package/src/structures/IReflectWebSocketOperation.ts +2 -2
  212. package/src/structures/ITypedApplication.ts +1 -1
  213. package/src/structures/ITypedHttpRouteException.ts +1 -1
  214. package/src/structures/ITypedHttpRouteParameter.ts +1 -1
  215. package/src/structures/ITypedHttpRouteSuccess.ts +1 -1
  216. package/src/structures/ITypedWebSocketRoute.ts +2 -2
  217. package/src/transform.ts +57 -7
  218. package/src/utils/TsConfigReader.ts +108 -0
  219. package/src/utils/TtscExecutor.ts +63 -0
  220. package/src/validators/HttpHeadersValidator.ts +8 -37
  221. package/src/validators/HttpQueryValidator.ts +8 -37
  222. package/src/{transformers → validators}/TextPlainValidator.ts +2 -2
  223. package/lib/analyses/DtoAnalyzer.d.ts +0 -21
  224. package/lib/analyses/DtoAnalyzer.js +0 -219
  225. package/lib/analyses/DtoAnalyzer.js.map +0 -1
  226. package/lib/analyses/ExceptionAnalyzer.d.ts +0 -0
  227. package/lib/analyses/ExceptionAnalyzer.js +0 -2
  228. package/lib/analyses/ExceptionAnalyzer.js.map +0 -1
  229. package/lib/analyses/GenericAnalyzer.d.ts +0 -4
  230. package/lib/analyses/GenericAnalyzer.js +0 -42
  231. package/lib/analyses/GenericAnalyzer.js.map +0 -1
  232. package/lib/structures/IReflectApplication.d.ts +0 -6
  233. package/lib/structures/IReflectApplication.js +0 -3
  234. package/lib/structures/IReflectApplication.js.map +0 -1
  235. package/lib/structures/MethodType.d.ts +0 -4
  236. package/lib/structures/MethodType.js +0 -8
  237. package/lib/structures/MethodType.js.map +0 -1
  238. package/lib/structures/ParamCategory.d.ts +0 -1
  239. package/lib/structures/ParamCategory.js +0 -3
  240. package/lib/structures/ParamCategory.js.map +0 -1
  241. package/lib/structures/TypeEntry.d.ts +0 -9
  242. package/lib/structures/TypeEntry.js +0 -21
  243. package/lib/structures/TypeEntry.js.map +0 -1
  244. package/lib/transformers/IOperationMetadata.js.map +0 -1
  245. package/lib/transformers/ISdkOperationTransformerContext.d.ts +0 -7
  246. package/lib/transformers/ISdkOperationTransformerContext.js +0 -3
  247. package/lib/transformers/ISdkOperationTransformerContext.js.map +0 -1
  248. package/lib/transformers/SdkOperationProgrammer.d.ts +0 -15
  249. package/lib/transformers/SdkOperationProgrammer.js +0 -186
  250. package/lib/transformers/SdkOperationProgrammer.js.map +0 -1
  251. package/lib/transformers/SdkOperationTransformer.d.ts +0 -4
  252. package/lib/transformers/SdkOperationTransformer.js +0 -128
  253. package/lib/transformers/SdkOperationTransformer.js.map +0 -1
  254. package/lib/transformers/TextPlainValidator.js.map +0 -1
  255. package/lib/utils/MetadataUtil.d.ts +0 -4
  256. package/lib/utils/MetadataUtil.js +0 -34
  257. package/lib/utils/MetadataUtil.js.map +0 -1
  258. package/lib/utils/StripEnums.d.ts +0 -3
  259. package/lib/utils/StripEnums.js +0 -3
  260. package/lib/utils/StripEnums.js.map +0 -1
  261. package/lib/utils/TypeLiteralExpression.d.ts +0 -0
  262. package/lib/utils/TypeLiteralExpression.js +0 -2
  263. package/lib/utils/TypeLiteralExpression.js.map +0 -1
  264. package/src/analyses/DtoAnalyzer.ts +0 -260
  265. package/src/analyses/ExceptionAnalyzer.ts +0 -154
  266. package/src/analyses/GenericAnalyzer.ts +0 -49
  267. package/src/structures/IReflectApplication.ts +0 -8
  268. package/src/structures/MethodType.ts +0 -5
  269. package/src/structures/ParamCategory.ts +0 -1
  270. package/src/structures/TypeEntry.ts +0 -22
  271. package/src/transformers/ISdkOperationTransformerContext.ts +0 -8
  272. package/src/transformers/SdkOperationProgrammer.ts +0 -240
  273. package/src/transformers/SdkOperationTransformer.ts +0 -248
  274. package/src/utils/MetadataUtil.ts +0 -26
  275. package/src/utils/StripEnums.ts +0 -5
  276. package/src/utils/TypeLiteralExpression.ts +0 -0
  277. /package/lib/{transformers → structures}/IOperationMetadata.js +0 -0
@@ -1,10 +1,13 @@
1
1
  import {
2
2
  IMetadataDictionary,
3
+ MetadataAliasType,
4
+ MetadataArrayType,
3
5
  MetadataComponents,
4
6
  MetadataFactory,
5
7
  MetadataObjectType,
6
8
  MetadataSchema,
7
- } from "@typia/core";
9
+ MetadataTupleType,
10
+ } from "../internal/legacy";
8
11
  import { NamingConvention } from "@typia/utils";
9
12
  import { IMetadataComponents, IMetadataSchema } from "typia";
10
13
 
@@ -31,26 +34,10 @@ export namespace TypedHttpRouteAnalyzer {
31
34
  individual.push(e.components);
32
35
  }
33
36
  const components: MetadataComponents = MetadataComponents.from({
34
- objects: Object.values(
35
- Object.fromEntries(
36
- individual.map((c) => c.objects.map((o) => [o.name, o])).flat(),
37
- ),
38
- ),
39
- arrays: Object.values(
40
- Object.fromEntries(
41
- individual.map((c) => c.arrays.map((a) => [a.name, a])).flat(),
42
- ),
43
- ),
44
- tuples: Object.values(
45
- Object.fromEntries(
46
- individual.map((c) => c.tuples.map((t) => [t.name, t])).flat(),
47
- ),
48
- ),
49
- aliases: Object.values(
50
- Object.fromEntries(
51
- individual.map((c) => c.aliases.map((a) => [a.name, a])).flat(),
52
- ),
53
- ),
37
+ objects: uniqueComponents(individual.flatMap((c) => c.objects)),
38
+ arrays: uniqueComponents(individual.flatMap((c) => c.arrays)),
39
+ tuples: uniqueComponents(individual.flatMap((c) => c.tuples)),
40
+ aliases: uniqueComponents(individual.flatMap((c) => c.aliases)),
54
41
  });
55
42
  return components.dictionary;
56
43
  };
@@ -66,14 +53,18 @@ export namespace TypedHttpRouteAnalyzer {
66
53
  const cast = (
67
54
  next: {
68
55
  metadata: IMetadataSchema;
56
+ components: IMetadataComponents;
69
57
  validate: MetadataFactory.Validator;
70
58
  },
71
59
  from: string,
72
60
  escape: boolean,
73
61
  ): MetadataSchema => {
62
+ const components: MetadataComponents = MetadataComponents.from(
63
+ next.components,
64
+ );
74
65
  const metadata: MetadataSchema = MetadataSchema.from(
75
66
  next.metadata,
76
- props.dictionary,
67
+ components.dictionary,
77
68
  );
78
69
  const metaErrors: MetadataFactory.IError[] = MetadataFactory.validate({
79
70
  options: {
@@ -192,8 +183,349 @@ export namespace TypedHttpRouteAnalyzer {
192
183
  }) satisfies ITypedHttpRoute,
193
184
  );
194
185
  };
186
+
187
+ export const routeDictionary = (
188
+ routes: Array<ITypedHttpRoute>,
189
+ ): IMetadataDictionary => {
190
+ renameDuplicateComponents(routes);
191
+ const dictionary: IMetadataDictionary = {
192
+ objects: new Map(),
193
+ aliases: new Map(),
194
+ arrays: new Map(),
195
+ tuples: new Map(),
196
+ };
197
+ for (const route of routes) {
198
+ for (const p of [
199
+ ...route.pathParameters,
200
+ ...route.queryParameters,
201
+ ...route.headerParameters,
202
+ ...(route.queryObject ? [route.queryObject] : []),
203
+ ...(route.body ? [route.body] : []),
204
+ ...(route.headerObject ? [route.headerObject] : []),
205
+ ])
206
+ enrollMetadata(dictionary, p.metadata);
207
+ for (const e of Object.values(route.exceptions))
208
+ enrollMetadata(dictionary, e.metadata);
209
+ enrollMetadata(dictionary, route.success.metadata);
210
+ }
211
+ return dictionary;
212
+ };
195
213
  }
196
214
 
215
+ type ComponentKind = "objects" | "aliases" | "arrays" | "tuples";
216
+ type ComponentType =
217
+ | MetadataObjectType
218
+ | MetadataAliasType
219
+ | MetadataArrayType
220
+ | MetadataTupleType;
221
+
222
+ interface IComponentEntry {
223
+ kind: ComponentKind;
224
+ route: ITypedHttpRoute;
225
+ signature: string;
226
+ type: ComponentType;
227
+ }
228
+
229
+ const renameDuplicateComponents = (routes: ITypedHttpRoute[]): void => {
230
+ const entries: IComponentEntry[] = [];
231
+ for (const route of routes)
232
+ for (const metadata of routeMetadatas(route))
233
+ collectComponentEntries(entries, route, metadata);
234
+
235
+ const used: Set<string> = new Set(entries.map((e) => e.type!.name));
236
+ const groups: Map<string, IComponentEntry[]> = new Map();
237
+ for (const entry of entries) {
238
+ const key: string = `${entry.kind}:${entry.type!.name}`;
239
+ const group: IComponentEntry[] | undefined = groups.get(key);
240
+ if (group === undefined) groups.set(key, [entry]);
241
+ else group.push(entry);
242
+ }
243
+ for (const group of groups.values()) {
244
+ const signatures: Set<string> = new Set(group.map((e) => e.signature));
245
+ if (signatures.size <= 1) continue;
246
+
247
+ const renamed: Map<string, string> = new Map();
248
+ for (const entry of group) {
249
+ const oldName: string = entry.type!.name;
250
+ const next: string =
251
+ renamed.get(entry.signature) ??
252
+ (() => {
253
+ const prefix: string = normalizeComponentNamespace(
254
+ entry.route.controller.class.name,
255
+ );
256
+ const name: string = escapeComponentName(
257
+ used,
258
+ `${prefix}.${oldName}`,
259
+ );
260
+ renamed.set(entry.signature, name);
261
+ used.add(name);
262
+ return name;
263
+ })();
264
+ (entry.type as { name: string }).name = next;
265
+ }
266
+ }
267
+ for (const route of routes)
268
+ for (const metadata of routeMetadatas(route)) clearMetadataNameCache(metadata);
269
+ };
270
+
271
+ const routeMetadatas = (route: ITypedHttpRoute): MetadataSchema[] => [
272
+ ...[
273
+ ...route.pathParameters,
274
+ ...route.queryParameters,
275
+ ...route.headerParameters,
276
+ ...(route.queryObject ? [route.queryObject] : []),
277
+ ...(route.body ? [route.body] : []),
278
+ ...(route.headerObject ? [route.headerObject] : []),
279
+ ].map((p) => p.metadata),
280
+ ...Object.values(route.exceptions).map((e) => e.metadata),
281
+ route.success.metadata,
282
+ ];
283
+
284
+ const collectComponentEntries = (
285
+ entries: IComponentEntry[],
286
+ route: ITypedHttpRoute,
287
+ metadata: MetadataSchema,
288
+ visited: ICollectVisited = createCollectVisited(),
289
+ ): void => {
290
+ if (visited.schemas.has(metadata)) return;
291
+ visited.schemas.add(metadata);
292
+
293
+ if (metadata.rest !== null)
294
+ collectComponentEntries(entries, route, metadata.rest, visited);
295
+ if (metadata.escaped !== null) {
296
+ collectComponentEntries(entries, route, metadata.escaped.original, visited);
297
+ collectComponentEntries(entries, route, metadata.escaped.returns, visited);
298
+ }
299
+ for (const func of metadata.functions) {
300
+ for (const p of func.parameters)
301
+ collectComponentEntries(entries, route, p.type, visited);
302
+ collectComponentEntries(entries, route, func.output, visited);
303
+ }
304
+ for (const set of metadata.sets)
305
+ collectComponentEntries(entries, route, set.value, visited);
306
+ for (const map of metadata.maps) {
307
+ collectComponentEntries(entries, route, map.key, visited);
308
+ collectComponentEntries(entries, route, map.value, visited);
309
+ }
310
+ for (const array of metadata.arrays)
311
+ if (visited.arrays.has((array.type as MetadataArrayType)) === false) {
312
+ visited.arrays.add((array.type as MetadataArrayType));
313
+ entries.push(componentEntry(route, "arrays", (array.type as MetadataArrayType)));
314
+ collectComponentEntries(entries, route, ((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
315
+ }
316
+ for (const tuple of metadata.tuples)
317
+ if (visited.tuples.has((tuple.type as MetadataTupleType)) === false) {
318
+ visited.tuples.add((tuple.type as MetadataTupleType));
319
+ entries.push(componentEntry(route, "tuples", (tuple.type as MetadataTupleType)));
320
+ for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
321
+ collectComponentEntries(entries, route, elem, visited);
322
+ }
323
+ for (const alias of metadata.aliases)
324
+ if (visited.aliases.has((alias.type as MetadataAliasType)) === false) {
325
+ visited.aliases.add((alias.type as MetadataAliasType));
326
+ entries.push(componentEntry(route, "aliases", (alias.type as MetadataAliasType)));
327
+ collectComponentEntries(entries, route, ((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
328
+ }
329
+ for (const obj of metadata.objects)
330
+ if (visited.objects.has((obj.type as MetadataObjectType)) === false) {
331
+ visited.objects.add((obj.type as MetadataObjectType));
332
+ entries.push(componentEntry(route, "objects", (obj.type as MetadataObjectType)));
333
+ for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
334
+ collectComponentEntries(entries, route, p.key, visited);
335
+ collectComponentEntries(entries, route, p.value, visited);
336
+ }
337
+ }
338
+ };
339
+
340
+ const componentEntry = <T extends ComponentType>(
341
+ route: ITypedHttpRoute,
342
+ kind: ComponentKind,
343
+ type: T,
344
+ ): IComponentEntry => ({
345
+ kind,
346
+ route,
347
+ signature: componentSignature(type),
348
+ type,
349
+ });
350
+
351
+ const componentSignature = (type: ComponentType): string =>
352
+ JSON.stringify(type, (key, value) =>
353
+ // `type` is the resolved back-reference attached by
354
+ // `MetadataSchema.from`; it closes a cycle on recursive schemas.
355
+ // `index` carries the per-route ordinal and is not part of the
356
+ // component's identity.
357
+ key === "index" || key === "type" ? undefined : value,
358
+ );
359
+
360
+ const normalizeComponentNamespace = (name: string): string => {
361
+ const next: string = name.replace(/[^A-Za-z0-9_$]/g, "_");
362
+ return next.length ? next : "Route";
363
+ };
364
+
365
+ const escapeComponentName = (used: Set<string>, name: string): string =>
366
+ used.has(name) ? escapeComponentName(used, `_${name}`) : name;
367
+
368
+ const clearMetadataNameCache = (
369
+ metadata: MetadataSchema,
370
+ visited: WeakSet<MetadataSchema> = new WeakSet(),
371
+ ): void => {
372
+ if (visited.has(metadata)) return;
373
+ visited.add(metadata);
374
+ (metadata as unknown as { name_?: string }).name_ = undefined;
375
+
376
+ if (metadata.rest !== null) clearMetadataNameCache(metadata.rest, visited);
377
+ if (metadata.escaped !== null) {
378
+ clearMetadataNameCache(metadata.escaped.original, visited);
379
+ clearMetadataNameCache(metadata.escaped.returns, visited);
380
+ }
381
+ for (const func of metadata.functions) {
382
+ for (const p of func.parameters) clearMetadataNameCache(p.type, visited);
383
+ clearMetadataNameCache(func.output, visited);
384
+ }
385
+ for (const set of metadata.sets) {
386
+ (set as unknown as { name_?: string }).name_ = undefined;
387
+ clearMetadataNameCache(set.value, visited);
388
+ }
389
+ for (const map of metadata.maps) {
390
+ (map as unknown as { name_?: string }).name_ = undefined;
391
+ clearMetadataNameCache(map.key, visited);
392
+ clearMetadataNameCache(map.value, visited);
393
+ }
394
+ for (const array of metadata.arrays) {
395
+ (array as unknown as { name_?: string }).name_ = undefined;
396
+ clearMetadataNameCache(((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
397
+ }
398
+ for (const tuple of metadata.tuples) {
399
+ (tuple as unknown as { name_?: string }).name_ = undefined;
400
+ for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
401
+ clearMetadataNameCache(elem, visited);
402
+ }
403
+ for (const alias of metadata.aliases) {
404
+ (alias as unknown as { name_?: string }).name_ = undefined;
405
+ clearMetadataNameCache(((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
406
+ }
407
+ for (const obj of metadata.objects) {
408
+ (obj as unknown as { name_?: string }).name_ = undefined;
409
+ for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
410
+ clearMetadataNameCache(p.key, visited);
411
+ clearMetadataNameCache(p.value, visited);
412
+ }
413
+ }
414
+ };
415
+
416
+ interface ICollectVisited {
417
+ aliases: WeakSet<MetadataAliasType>;
418
+ arrays: WeakSet<MetadataArrayType>;
419
+ objects: WeakSet<MetadataObjectType>;
420
+ schemas: WeakSet<MetadataSchema>;
421
+ tuples: WeakSet<MetadataTupleType>;
422
+ }
423
+
424
+ const createCollectVisited = (): ICollectVisited => ({
425
+ aliases: new WeakSet<MetadataAliasType>(),
426
+ arrays: new WeakSet<MetadataArrayType>(),
427
+ objects: new WeakSet<MetadataObjectType>(),
428
+ schemas: new WeakSet<MetadataSchema>(),
429
+ tuples: new WeakSet<MetadataTupleType>(),
430
+ });
431
+
432
+ const uniqueComponents = <T extends { name: string }>(input: T[]): T[] => {
433
+ const dict: Record<string, T> = {};
434
+ for (const elem of input) {
435
+ const oldbie: T | undefined = dict[elem.name];
436
+ if (oldbie === undefined)
437
+ dict[elem.name] = elem;
438
+ else if (
439
+ elem.name.includes(".") ||
440
+ componentScore(oldbie) < componentScore(elem)
441
+ )
442
+ dict[elem.name] = elem;
443
+ }
444
+ return Object.values(dict);
445
+ };
446
+
447
+ const componentScore = (input: unknown): number =>
448
+ JSON.stringify(input, (key, value) =>
449
+ // Resolved-reference back-edges close cycles on recursive schemas;
450
+ // skip them when scoring component "richness".
451
+ key === "type" ? undefined : value,
452
+ ).length;
453
+
454
+ const enrollMetadata = (
455
+ dictionary: IMetadataDictionary,
456
+ metadata: MetadataSchema,
457
+ visited: IVisitedMetadata = createVisitedMetadata(),
458
+ ): void => {
459
+ if (visited.schemas.has(metadata)) return;
460
+ visited.schemas.add(metadata);
461
+
462
+ if (metadata.rest !== null) enrollMetadata(dictionary, metadata.rest, visited);
463
+ if (metadata.escaped !== null) {
464
+ enrollMetadata(dictionary, metadata.escaped.original, visited);
465
+ enrollMetadata(dictionary, metadata.escaped.returns, visited);
466
+ }
467
+ for (const func of metadata.functions) {
468
+ for (const p of func.parameters)
469
+ enrollMetadata(dictionary, p.type, visited);
470
+ enrollMetadata(dictionary, func.output, visited);
471
+ }
472
+ for (const set of metadata.sets)
473
+ enrollMetadata(dictionary, set.value, visited);
474
+ for (const map of metadata.maps) {
475
+ enrollMetadata(dictionary, map.key, visited);
476
+ enrollMetadata(dictionary, map.value, visited);
477
+ }
478
+ for (const array of metadata.arrays)
479
+ if (enroll(dictionary.arrays, (array.type as MetadataArrayType)))
480
+ enrollMetadata(dictionary, ((array.type as MetadataArrayType) as MetadataArrayType).value, visited);
481
+ for (const tuple of metadata.tuples)
482
+ if (enroll(dictionary.tuples, (tuple.type as MetadataTupleType)))
483
+ for (const elem of ((tuple.type as MetadataTupleType) as MetadataTupleType).elements)
484
+ enrollMetadata(dictionary, elem, visited);
485
+ for (const alias of metadata.aliases)
486
+ if (enroll(dictionary.aliases, (alias.type as MetadataAliasType)))
487
+ enrollMetadata(dictionary, ((alias.type as MetadataAliasType) as MetadataAliasType).value, visited);
488
+ for (const obj of metadata.objects)
489
+ if (enroll(dictionary.objects, (obj.type as MetadataObjectType)))
490
+ for (const p of ((obj.type as MetadataObjectType) as MetadataObjectType).properties) {
491
+ enrollMetadata(dictionary, p.key, visited);
492
+ enrollMetadata(dictionary, p.value, visited);
493
+ }
494
+ };
495
+
496
+ const enroll = <
497
+ T extends
498
+ | MetadataObjectType
499
+ | MetadataAliasType
500
+ | MetadataArrayType
501
+ | MetadataTupleType,
502
+ >(
503
+ dict: Map<string, T>,
504
+ elem: T,
505
+ ): boolean => {
506
+ const oldbie: T | undefined = dict.get(elem.name);
507
+ if (oldbie === elem) return false;
508
+ if (oldbie === undefined) {
509
+ dict.set(elem.name, elem);
510
+ return true;
511
+ } else if (
512
+ elem.name.includes(".") ||
513
+ componentScore(oldbie) < componentScore(elem)
514
+ ) {
515
+ dict.set(elem.name, elem);
516
+ return true;
517
+ }
518
+ return false;
519
+ };
520
+
521
+ interface IVisitedMetadata {
522
+ schemas: WeakSet<MetadataSchema>;
523
+ }
524
+
525
+ const createVisitedMetadata = (): IVisitedMetadata => ({
526
+ schemas: new WeakSet<MetadataSchema>(),
527
+ });
528
+
197
529
  const join = ({
198
530
  object,
199
531
  key,
@@ -1,12 +1,26 @@
1
- import { IOperationMetadata } from "../transformers/IOperationMetadata";
1
+ import { IOperationMetadata } from "../structures/IOperationMetadata";
2
2
 
3
+ /**
4
+ * Carries the compile-time operation metadata the SDK / Swagger / e2e
5
+ * generators read through `Reflect.getMetadata("nestia/OperationMetadata")`.
6
+ *
7
+ * The `@nestia/sdk` native transform injects this decorator as a synthesized
8
+ * AST node, so its argument is a single JSON string literal rather than an
9
+ * object literal — keeping the constructed node tree minimal. The string is
10
+ * parsed once here at module-evaluation time. A pre-parsed `IOperationMetadata`
11
+ * object is still accepted for hand-written or test usage.
12
+ */
3
13
  export function OperationMetadata(
4
- metadata: IOperationMetadata,
14
+ metadata: IOperationMetadata | string,
5
15
  ): MethodDecorator {
16
+ const parsed: IOperationMetadata =
17
+ typeof metadata === "string"
18
+ ? (JSON.parse(metadata) as IOperationMetadata)
19
+ : metadata;
6
20
  return function OperationMetadata(target, propertyKey, descriptor) {
7
21
  Reflect.defineMetadata(
8
22
  "nestia/OperationMetadata",
9
- metadata,
23
+ parsed,
10
24
  target,
11
25
  propertyKey,
12
26
  );