@nestia/sdk 14.0.0 → 14.0.2

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 (391) hide show
  1. package/README.md +1 -1
  2. package/assets/bundle/distribute/build-sdk.cjs +28 -0
  3. package/assets/bundle/distribute/package.json +7 -3
  4. package/assets/bundle/distribute/tsconfig.json +15 -105
  5. package/lib/INestiaConfig.d.ts +74 -34
  6. package/lib/NestiaSdkApplication.d.ts +60 -0
  7. package/lib/NestiaSdkApplication.js +121 -32
  8. package/lib/NestiaSdkApplication.js.map +1 -1
  9. package/lib/NestiaSwaggerComposer.d.ts +21 -0
  10. package/lib/NestiaSwaggerComposer.js +32 -13
  11. package/lib/NestiaSwaggerComposer.js.map +1 -1
  12. package/lib/analyses/AccessorAnalyzer.d.ts +26 -0
  13. package/lib/analyses/AccessorAnalyzer.js +26 -0
  14. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  15. package/lib/analyses/ConfigAnalyzer.d.ts +41 -0
  16. package/lib/analyses/ConfigAnalyzer.js +52 -77
  17. package/lib/analyses/ConfigAnalyzer.js.map +1 -1
  18. package/lib/analyses/ImportAnalyzer.d.ts +25 -0
  19. package/lib/analyses/ImportAnalyzer.js +25 -0
  20. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  21. package/lib/analyses/ParameterNameAnalyzer.d.ts +44 -0
  22. package/lib/analyses/ParameterNameAnalyzer.js +63 -0
  23. package/lib/analyses/ParameterNameAnalyzer.js.map +1 -0
  24. package/lib/analyses/PathAnalyzer.d.ts +93 -1
  25. package/lib/analyses/PathAnalyzer.js +160 -23
  26. package/lib/analyses/PathAnalyzer.js.map +1 -1
  27. package/lib/analyses/ReflectControllerAnalyzer.d.ts +32 -0
  28. package/lib/analyses/ReflectControllerAnalyzer.js +24 -1
  29. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  30. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +29 -0
  31. package/lib/analyses/ReflectHttpOperationAnalyzer.js +35 -24
  32. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  33. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.d.ts +31 -0
  34. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +21 -0
  35. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
  36. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.d.ts +31 -0
  37. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +143 -23
  38. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  39. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +32 -0
  40. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +27 -2
  41. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  42. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +29 -0
  43. package/lib/analyses/ReflectMcpOperationAnalyzer.js +35 -11
  44. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -1
  45. package/lib/analyses/ReflectMetadataAnalyzer.d.ts +47 -0
  46. package/lib/analyses/ReflectMetadataAnalyzer.js +47 -0
  47. package/lib/analyses/ReflectMetadataAnalyzer.js.map +1 -1
  48. package/lib/analyses/ReflectWebSocketOperationAnalyzer.d.ts +29 -0
  49. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +27 -5
  50. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
  51. package/lib/analyses/SecurityAnalyzer.d.ts +25 -0
  52. package/lib/analyses/SecurityAnalyzer.js +39 -19
  53. package/lib/analyses/SecurityAnalyzer.js.map +1 -1
  54. package/lib/analyses/SwaggerExampleAnalyzer.d.ts +31 -0
  55. package/lib/analyses/SwaggerExampleAnalyzer.js +36 -0
  56. package/lib/analyses/SwaggerExampleAnalyzer.js.map +1 -0
  57. package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +41 -3
  58. package/lib/analyses/TypedHttpRouteAnalyzer.js +196 -172
  59. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  60. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +29 -0
  61. package/lib/analyses/TypedMcpRouteAnalyzer.js +152 -20
  62. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -1
  63. package/lib/analyses/TypedWebSocketRouteAnalyzer.d.ts +19 -0
  64. package/lib/analyses/TypedWebSocketRouteAnalyzer.js +20 -1
  65. package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
  66. package/lib/decorators/OperationMetadata.d.ts +6 -0
  67. package/lib/decorators/OperationMetadata.js +6 -0
  68. package/lib/decorators/OperationMetadata.js.map +1 -1
  69. package/lib/executable/internal/CommandParser.d.ts +19 -0
  70. package/lib/executable/internal/CommandParser.js +19 -0
  71. package/lib/executable/internal/CommandParser.js.map +1 -1
  72. package/lib/executable/internal/NestiaConfigLoader.d.ts +56 -0
  73. package/lib/executable/internal/NestiaConfigLoader.js +48 -42
  74. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  75. package/lib/executable/internal/NestiaSdkCommand.d.ts +60 -0
  76. package/lib/executable/internal/NestiaSdkCommand.js +95 -3
  77. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  78. package/lib/executable/internal/NestiaSdkWatcher.d.ts +81 -0
  79. package/lib/executable/internal/NestiaSdkWatcher.js +125 -41
  80. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -1
  81. package/lib/executable/internal/NestiaSwaggerWatch.d.ts +80 -0
  82. package/lib/executable/internal/NestiaSwaggerWatch.js +308 -0
  83. package/lib/executable/internal/NestiaSwaggerWatch.js.map +1 -0
  84. package/lib/executable/sdk.js +16 -1
  85. package/lib/executable/sdk.js.map +1 -1
  86. package/lib/factories/ExpressionFactory.d.ts +18 -0
  87. package/lib/factories/ExpressionFactory.js +21 -2
  88. package/lib/factories/ExpressionFactory.js.map +1 -1
  89. package/lib/factories/IdentifierFactory.d.ts +24 -0
  90. package/lib/factories/IdentifierFactory.js +24 -0
  91. package/lib/factories/IdentifierFactory.js.map +1 -1
  92. package/lib/factories/LiteralFactory.d.ts +22 -4
  93. package/lib/factories/LiteralFactory.js +33 -11
  94. package/lib/factories/LiteralFactory.js.map +1 -1
  95. package/lib/factories/StatementFactory.d.ts +28 -1
  96. package/lib/factories/StatementFactory.js +28 -1
  97. package/lib/factories/StatementFactory.js.map +1 -1
  98. package/lib/factories/TypeFactory.d.ts +24 -0
  99. package/lib/factories/TypeFactory.js +15 -0
  100. package/lib/factories/TypeFactory.js.map +1 -1
  101. package/lib/generates/CloneGenerator.d.ts +22 -0
  102. package/lib/generates/CloneGenerator.js +26 -5
  103. package/lib/generates/CloneGenerator.js.map +1 -1
  104. package/lib/generates/E2eGenerator.d.ts +19 -0
  105. package/lib/generates/E2eGenerator.js +19 -0
  106. package/lib/generates/E2eGenerator.js.map +1 -1
  107. package/lib/generates/SdkGenerator.d.ts +38 -0
  108. package/lib/generates/SdkGenerator.js +43 -5
  109. package/lib/generates/SdkGenerator.js.map +1 -1
  110. package/lib/generates/SwaggerGenerator.d.ts +36 -6
  111. package/lib/generates/SwaggerGenerator.js +190 -40
  112. package/lib/generates/SwaggerGenerator.js.map +1 -1
  113. package/lib/generates/internal/E2eFileProgrammer.d.ts +19 -0
  114. package/lib/generates/internal/E2eFileProgrammer.js +20 -1
  115. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  116. package/lib/generates/internal/FilePrinter.d.ts +57 -0
  117. package/lib/generates/internal/FilePrinter.js +74 -0
  118. package/lib/generates/internal/FilePrinter.js.map +1 -1
  119. package/lib/generates/internal/ImportDictionary.d.ts +93 -1
  120. package/lib/generates/internal/ImportDictionary.js +103 -2
  121. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  122. package/lib/generates/internal/SdkAliasCollection.d.ts +121 -1
  123. package/lib/generates/internal/SdkAliasCollection.js +132 -11
  124. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  125. package/lib/generates/internal/SdkDistributionComposer.d.ts +19 -0
  126. package/lib/generates/internal/SdkDistributionComposer.js +149 -52
  127. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  128. package/lib/generates/internal/SdkFileProgrammer.d.ts +18 -0
  129. package/lib/generates/internal/SdkFileProgrammer.js +101 -12
  130. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  131. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +29 -0
  132. package/lib/generates/internal/SdkHttpCloneProgrammer.js +33 -0
  133. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  134. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +19 -0
  135. package/lib/generates/internal/SdkHttpCloneReferencer.js +78 -25
  136. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  137. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +19 -0
  138. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +40 -23
  139. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  140. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +19 -0
  141. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +46 -34
  142. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  143. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +142 -1
  144. package/lib/generates/internal/SdkHttpParameterProgrammer.js +175 -6
  145. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  146. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +20 -0
  147. package/lib/generates/internal/SdkHttpRouteProgrammer.js +36 -32
  148. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  149. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +38 -0
  150. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +66 -18
  151. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  152. package/lib/generates/internal/SdkImportWizard.d.ts +63 -0
  153. package/lib/generates/internal/SdkImportWizard.js +63 -0
  154. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  155. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +17 -2
  156. package/lib/generates/internal/SdkMcpRouteProgrammer.js +72 -24
  157. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -1
  158. package/lib/generates/internal/SdkPathTemplate.d.ts +36 -0
  159. package/lib/generates/internal/SdkPathTemplate.js +65 -0
  160. package/lib/generates/internal/SdkPathTemplate.js.map +1 -0
  161. package/lib/generates/internal/SdkRouteDirectory.d.ts +10 -0
  162. package/lib/generates/internal/SdkRouteDirectory.js +10 -0
  163. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  164. package/lib/generates/internal/SdkTypeProgrammer.d.ts +54 -1
  165. package/lib/generates/internal/SdkTypeProgrammer.js +111 -27
  166. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  167. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +53 -1
  168. package/lib/generates/internal/SdkTypeTagProgrammer.js +407 -67
  169. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  170. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +40 -0
  171. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +149 -142
  172. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -1
  173. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +19 -0
  174. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +46 -36
  175. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  176. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +114 -1
  177. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +120 -5
  178. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  179. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +18 -0
  180. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +75 -33
  181. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  182. package/lib/generates/internal/SwaggerDescriptionComposer.d.ts +42 -0
  183. package/lib/generates/internal/SwaggerDescriptionComposer.js +44 -1
  184. package/lib/generates/internal/SwaggerDescriptionComposer.js.map +1 -1
  185. package/lib/generates/internal/SwaggerOperationComposer.d.ts +18 -0
  186. package/lib/generates/internal/SwaggerOperationComposer.js +37 -8
  187. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  188. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +40 -1
  189. package/lib/generates/internal/SwaggerOperationParameterComposer.js +230 -25
  190. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  191. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +21 -0
  192. package/lib/generates/internal/SwaggerOperationResponseComposer.js +58 -7
  193. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  194. package/lib/internal/legacy.d.ts +342 -31
  195. package/lib/internal/legacy.js +207 -31
  196. package/lib/internal/legacy.js.map +1 -1
  197. package/lib/structures/INestiaProject.d.ts +10 -0
  198. package/lib/structures/INestiaSdkInput.d.ts +30 -0
  199. package/lib/structures/IOperationMetadata.d.ts +77 -0
  200. package/lib/structures/IReflectController.d.ts +10 -0
  201. package/lib/structures/IReflectHttpOperation.d.ts +10 -0
  202. package/lib/structures/IReflectHttpOperationException.d.ts +13 -2
  203. package/lib/structures/IReflectHttpOperationParameter.d.ts +55 -3
  204. package/lib/structures/IReflectHttpOperationSuccess.d.ts +15 -3
  205. package/lib/structures/IReflectImport.d.ts +10 -0
  206. package/lib/structures/IReflectMcpOperation.d.ts +19 -0
  207. package/lib/structures/IReflectMcpOperationParameter.d.ts +9 -0
  208. package/lib/structures/IReflectOperationError.d.ts +28 -0
  209. package/lib/structures/IReflectOperationError.js +22 -2
  210. package/lib/structures/IReflectOperationError.js.map +1 -1
  211. package/lib/structures/IReflectType.d.ts +9 -0
  212. package/lib/structures/IReflectWebSocketOperation.d.ts +10 -0
  213. package/lib/structures/IReflectWebSocketOperationParameter.d.ts +55 -0
  214. package/lib/structures/ITypedApplication.d.ts +10 -0
  215. package/lib/structures/ITypedHttpRoute.d.ts +18 -0
  216. package/lib/structures/ITypedHttpRouteException.d.ts +13 -1
  217. package/lib/structures/ITypedHttpRouteParameter.d.ts +48 -1
  218. package/lib/structures/ITypedHttpRouteSuccess.d.ts +13 -1
  219. package/lib/structures/ITypedMcpRoute.d.ts +11 -0
  220. package/lib/structures/ITypedWebSocketRoute.d.ts +18 -0
  221. package/lib/transform.d.ts +6 -0
  222. package/lib/transform.js +6 -0
  223. package/lib/transform.js.map +1 -1
  224. package/lib/utils/ArrayUtil.d.ts +31 -1
  225. package/lib/utils/ArrayUtil.js +32 -11
  226. package/lib/utils/ArrayUtil.js.map +1 -1
  227. package/lib/utils/EmittedJavaScriptPatcher.d.ts +20 -0
  228. package/lib/utils/EmittedJavaScriptPatcher.js +65 -46
  229. package/lib/utils/EmittedJavaScriptPatcher.js.map +1 -1
  230. package/lib/utils/FileRetriever.d.ts +29 -0
  231. package/lib/utils/FileRetriever.js +29 -0
  232. package/lib/utils/FileRetriever.js.map +1 -1
  233. package/lib/utils/HttpResponseContentTypeUtil.d.ts +41 -0
  234. package/lib/utils/HttpResponseContentTypeUtil.js +31 -0
  235. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -1
  236. package/lib/utils/MapUtil.d.ts +64 -1
  237. package/lib/utils/MapUtil.js +24 -3
  238. package/lib/utils/MapUtil.js.map +1 -1
  239. package/lib/utils/PathUtil.d.ts +31 -0
  240. package/lib/utils/PathUtil.js +38 -0
  241. package/lib/utils/PathUtil.js.map +1 -1
  242. package/lib/utils/SdkBundlePath.d.ts +2 -0
  243. package/lib/utils/SdkBundlePath.js +10 -0
  244. package/lib/utils/SdkBundlePath.js.map +1 -0
  245. package/lib/utils/SdkInputFilter.d.ts +31 -0
  246. package/lib/utils/SdkInputFilter.js +115 -0
  247. package/lib/utils/SdkInputFilter.js.map +1 -0
  248. package/lib/utils/SourceFinder.d.ts +45 -0
  249. package/lib/utils/SourceFinder.js +74 -16
  250. package/lib/utils/SourceFinder.js.map +1 -1
  251. package/lib/utils/StringUtil.d.ts +77 -2
  252. package/lib/utils/StringUtil.js +166 -4
  253. package/lib/utils/StringUtil.js.map +1 -1
  254. package/lib/utils/TemporaryDirectory.d.ts +60 -0
  255. package/lib/utils/TemporaryDirectory.js +112 -0
  256. package/lib/utils/TemporaryDirectory.js.map +1 -0
  257. package/lib/utils/TsConfigReader.d.ts +42 -0
  258. package/lib/utils/TsConfigReader.js +98 -14
  259. package/lib/utils/TsConfigReader.js.map +1 -1
  260. package/lib/utils/TtscExecutor.d.ts +23 -1
  261. package/lib/utils/TtscExecutor.js +22 -0
  262. package/lib/utils/TtscExecutor.js.map +1 -1
  263. package/lib/utils/VersioningStrategy.d.ts +39 -2
  264. package/lib/utils/VersioningStrategy.js +46 -13
  265. package/lib/utils/VersioningStrategy.js.map +1 -1
  266. package/lib/validators/TextPlainValidator.d.ts +19 -0
  267. package/lib/validators/TextPlainValidator.js +19 -0
  268. package/lib/validators/TextPlainValidator.js.map +1 -1
  269. package/native/go.mod +1 -1
  270. package/native/go.sum +2 -2
  271. package/native/sdk/register.go +12 -2
  272. package/native/sdk/sdk_http_rules.go +210 -0
  273. package/native/sdk/sdk_metadata_json.go +79 -4
  274. package/native/sdk/sdk_transform.go +1157 -414
  275. package/package.json +8 -6
  276. package/src/INestiaConfig.ts +74 -34
  277. package/src/NestiaSdkApplication.ts +129 -41
  278. package/src/NestiaSwaggerComposer.ts +32 -14
  279. package/src/analyses/AccessorAnalyzer.ts +26 -0
  280. package/src/analyses/ConfigAnalyzer.ts +52 -90
  281. package/src/analyses/ImportAnalyzer.ts +25 -0
  282. package/src/analyses/ParameterNameAnalyzer.ts +75 -0
  283. package/src/analyses/PathAnalyzer.ts +167 -23
  284. package/src/analyses/ReflectControllerAnalyzer.ts +34 -1
  285. package/src/analyses/ReflectHttpOperationAnalyzer.ts +36 -14
  286. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +31 -0
  287. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +153 -39
  288. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +38 -7
  289. package/src/analyses/ReflectMcpOperationAnalyzer.ts +38 -3
  290. package/src/analyses/ReflectMetadataAnalyzer.ts +47 -0
  291. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +40 -7
  292. package/src/analyses/SecurityAnalyzer.ts +45 -20
  293. package/src/analyses/SwaggerExampleAnalyzer.ts +39 -0
  294. package/src/analyses/TypedHttpRouteAnalyzer.ts +263 -198
  295. package/src/analyses/TypedMcpRouteAnalyzer.ts +180 -20
  296. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +20 -0
  297. package/src/decorators/OperationMetadata.ts +6 -0
  298. package/src/executable/internal/CommandParser.ts +19 -0
  299. package/src/executable/internal/NestiaConfigLoader.ts +66 -50
  300. package/src/executable/internal/NestiaSdkCommand.ts +96 -3
  301. package/src/executable/internal/NestiaSdkWatcher.ts +172 -44
  302. package/src/executable/internal/NestiaSwaggerWatch.ts +359 -0
  303. package/src/executable/sdk.ts +24 -1
  304. package/src/factories/ExpressionFactory.ts +23 -2
  305. package/src/factories/IdentifierFactory.ts +24 -0
  306. package/src/factories/LiteralFactory.ts +51 -13
  307. package/src/factories/StatementFactory.ts +28 -1
  308. package/src/factories/TypeFactory.ts +24 -0
  309. package/src/generates/CloneGenerator.ts +26 -5
  310. package/src/generates/E2eGenerator.ts +19 -0
  311. package/src/generates/SdkGenerator.ts +43 -12
  312. package/src/generates/SwaggerGenerator.ts +229 -46
  313. package/src/generates/internal/E2eFileProgrammer.ts +20 -0
  314. package/src/generates/internal/FilePrinter.ts +71 -0
  315. package/src/generates/internal/ImportDictionary.ts +120 -2
  316. package/src/generates/internal/SdkAliasCollection.ts +144 -15
  317. package/src/generates/internal/SdkDistributionComposer.ts +181 -56
  318. package/src/generates/internal/SdkFileProgrammer.ts +126 -16
  319. package/src/generates/internal/SdkHttpCloneProgrammer.ts +55 -0
  320. package/src/generates/internal/SdkHttpCloneReferencer.ts +97 -23
  321. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +47 -30
  322. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +53 -64
  323. package/src/generates/internal/SdkHttpParameterProgrammer.ts +295 -13
  324. package/src/generates/internal/SdkHttpRouteProgrammer.ts +37 -31
  325. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +122 -18
  326. package/src/generates/internal/SdkImportWizard.ts +63 -0
  327. package/src/generates/internal/SdkMcpRouteProgrammer.ts +150 -33
  328. package/src/generates/internal/SdkPathTemplate.ts +88 -0
  329. package/src/generates/internal/SdkRouteDirectory.ts +10 -0
  330. package/src/generates/internal/SdkTypeProgrammer.ts +137 -36
  331. package/src/generates/internal/SdkTypeTagProgrammer.ts +536 -78
  332. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +185 -142
  333. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +62 -68
  334. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +205 -5
  335. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +89 -48
  336. package/src/generates/internal/SwaggerDescriptionComposer.ts +47 -1
  337. package/src/generates/internal/SwaggerOperationComposer.ts +38 -6
  338. package/src/generates/internal/SwaggerOperationParameterComposer.ts +318 -36
  339. package/src/generates/internal/SwaggerOperationResponseComposer.ts +74 -11
  340. package/src/internal/legacy-augmentation.d.ts +16 -0
  341. package/src/internal/legacy.ts +407 -49
  342. package/src/structures/INestiaProject.ts +10 -0
  343. package/src/structures/INestiaSdkInput.ts +30 -0
  344. package/src/structures/IOperationMetadata.ts +83 -0
  345. package/src/structures/IReflectController.ts +10 -0
  346. package/src/structures/IReflectHttpOperation.ts +10 -0
  347. package/src/structures/IReflectHttpOperationException.ts +17 -2
  348. package/src/structures/IReflectHttpOperationParameter.ts +56 -2
  349. package/src/structures/IReflectHttpOperationSuccess.ts +19 -3
  350. package/src/structures/IReflectImport.ts +10 -0
  351. package/src/structures/IReflectMcpOperation.ts +19 -0
  352. package/src/structures/IReflectMcpOperationParameter.ts +9 -0
  353. package/src/structures/IReflectOperationError.ts +31 -2
  354. package/src/structures/IReflectType.ts +9 -0
  355. package/src/structures/IReflectWebSocketOperation.ts +10 -0
  356. package/src/structures/IReflectWebSocketOperationParameter.ts +55 -0
  357. package/src/structures/ITypedApplication.ts +10 -0
  358. package/src/structures/ITypedHttpRoute.ts +18 -0
  359. package/src/structures/ITypedHttpRouteException.ts +14 -1
  360. package/src/structures/ITypedHttpRouteParameter.ts +48 -1
  361. package/src/structures/ITypedHttpRouteSuccess.ts +14 -1
  362. package/src/structures/ITypedMcpRoute.ts +12 -0
  363. package/src/structures/ITypedWebSocketRoute.ts +18 -0
  364. package/src/transform.ts +6 -0
  365. package/src/utils/ArrayUtil.ts +32 -13
  366. package/src/utils/EmittedJavaScriptPatcher.ts +70 -47
  367. package/src/utils/FileRetriever.ts +29 -0
  368. package/src/utils/HttpResponseContentTypeUtil.ts +41 -0
  369. package/src/utils/MapUtil.ts +68 -3
  370. package/src/utils/PathUtil.ts +38 -0
  371. package/src/utils/SdkBundlePath.ts +11 -0
  372. package/src/utils/SdkInputFilter.ts +108 -0
  373. package/src/utils/SourceFinder.ts +76 -18
  374. package/src/utils/StringUtil.ts +182 -5
  375. package/src/utils/TemporaryDirectory.ts +108 -0
  376. package/src/utils/TsConfigReader.ts +124 -26
  377. package/src/utils/TtscExecutor.ts +23 -1
  378. package/src/utils/VersioningStrategy.ts +51 -16
  379. package/src/validators/TextPlainValidator.ts +19 -0
  380. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +0 -9
  381. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +0 -178
  382. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +0 -1
  383. package/lib/validators/HttpHeadersValidator.d.ts +0 -11
  384. package/lib/validators/HttpHeadersValidator.js +0 -15
  385. package/lib/validators/HttpHeadersValidator.js.map +0 -1
  386. package/lib/validators/HttpQueryValidator.d.ts +0 -10
  387. package/lib/validators/HttpQueryValidator.js +0 -14
  388. package/lib/validators/HttpQueryValidator.js.map +0 -1
  389. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +0 -264
  390. package/src/validators/HttpHeadersValidator.ts +0 -12
  391. package/src/validators/HttpQueryValidator.ts +0 -11
@@ -7,8 +7,28 @@ import { IReflectImport } from "../structures/IReflectImport";
7
7
  import { IReflectMcpOperation } from "../structures/IReflectMcpOperation";
8
8
  import { IReflectMcpOperationParameter } from "../structures/IReflectMcpOperationParameter";
9
9
  import { ImportAnalyzer } from "./ImportAnalyzer";
10
+ import { ParameterNameAnalyzer } from "./ParameterNameAnalyzer";
10
11
 
12
+ /**
13
+ * Reflects an `@McpRoute` method into a tool operation.
14
+ *
15
+ * @evidence contracts/common.md#principled-implementation The tool definition comes from the route metadata, the single params parameter is matched with its compile-time type, and combinations with HTTP or WebSocket decorators and extra parameters are errors.
16
+ * @evidence contracts/common.md#clear-and-simple-design One public function.
17
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rules follow the decorator contract.
18
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
19
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMcpOperationAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
20
+ */
11
21
  export namespace ReflectMcpOperationAnalyzer {
22
+ /**
23
+ * The input of the MCP operation analysis: the project, the controller, the
24
+ * method, and its metadata.
25
+ *
26
+ * @evidence contracts/common.md#principled-implementation The record holds what the analysis needs.
27
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
28
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
29
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes and the meaning of its members.
30
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMcpOperationAnalyzer.IProps analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
31
+ */
12
32
  export interface IProps {
13
33
  project: Omit<INestiaProject, "config">;
14
34
  controller: IReflectController;
@@ -17,6 +37,16 @@ export namespace ReflectMcpOperationAnalyzer {
17
37
  metadata: IOperationMetadata;
18
38
  }
19
39
 
40
+ /**
41
+ * Returns the tool operation of a method, or `null` when the method is not an
42
+ * MCP route or has errors.
43
+ *
44
+ * @evidence contracts/common.md#principled-implementation The method is an MCP route when it carries the route metadata; at most one params parameter is allowed and the function may have at most one argument; the return type and imports come from the metadata.
45
+ * @evidence contracts/common.md#clear-and-simple-design One function that collects errors once and reports them together.
46
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rules follow the decorator contract.
47
+ * @evidence contracts/common.md#meaningful-documentation The comment states the null result.
48
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMcpOperationAnalyzer.analyze analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
49
+ */
20
50
  export const analyze = (ctx: IProps): IReflectMcpOperation | null => {
21
51
  const route:
22
52
  | {
@@ -60,8 +90,8 @@ export namespace ReflectMcpOperationAnalyzer {
60
90
  );
61
91
 
62
92
  const imports: IReflectImport[] = [];
63
- const parameters: IReflectMcpOperationParameter[] = preconfigured
64
- .map((p) => {
93
+ const declared: IReflectMcpOperationParameter[] = preconfigured
94
+ .map((p): IReflectMcpOperationParameter | null => {
65
95
  const matched: IOperationMetadata.IParameter | undefined =
66
96
  ctx.metadata.parameters.find(
67
97
  (m: IOperationMetadata.IParameter) => p.index === m.index,
@@ -74,7 +104,7 @@ export namespace ReflectMcpOperationAnalyzer {
74
104
  }
75
105
  if (matched.type === null) {
76
106
  errors.push(
77
- `Failed to analyze the parameter type of ${JSON.stringify(matched.name)}.`,
107
+ `Failed to analyze the parameter type of ${matched.name ? JSON.stringify(matched.name) : `the ${p.index} (th) argument`}.`,
78
108
  );
79
109
  return null;
80
110
  }
@@ -84,12 +114,16 @@ export namespace ReflectMcpOperationAnalyzer {
84
114
  name: matched.name,
85
115
  index: p.index,
86
116
  type: matched.type,
117
+ metadata: matched.primitive,
87
118
  imports: matched.imports,
88
119
  description: matched.description,
89
120
  jsDocTags: matched.jsDocTags,
90
121
  };
91
122
  })
92
123
  .filter((p): p is IReflectMcpOperationParameter => !!p);
124
+ // a destructured parameter declares no name, so it is given one
125
+ const parameters: IReflectMcpOperationParameter[] =
126
+ ParameterNameAnalyzer.name(declared);
93
127
 
94
128
  if (ctx.metadata.success?.imports?.length)
95
129
  imports.push(...ctx.metadata.success.imports);
@@ -116,6 +150,7 @@ export namespace ReflectMcpOperationAnalyzer {
116
150
  function: ctx.function,
117
151
  parameters,
118
152
  returnType: ctx.metadata.success?.type ?? null,
153
+ returnMetadata: ctx.metadata.success?.primitive,
119
154
  imports: ImportAnalyzer.merge(imports),
120
155
  description: ctx.metadata.description ?? null,
121
156
  jsDocTags: ctx.metadata.jsDocTags,
@@ -4,7 +4,26 @@ import { VersionValue } from "@nestjs/common/interfaces";
4
4
 
5
5
  import { SecurityAnalyzer } from "./SecurityAnalyzer";
6
6
 
7
+ /**
8
+ * Reads the NestJS and Swagger metadata of a class or method.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation The functions read the reflect metadata keys that Nest and `@nestjs/swagger` define and normalize them into arrays.
11
+ * @evidence contracts/common.md#clear-and-simple-design Four small readers.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts They read only public metadata keys.
13
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMetadataAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
15
+ */
7
16
  export namespace ReflectMetadataAnalyzer {
17
+ /**
18
+ * Returns the path list of a controller or route: a string is a one-element
19
+ * list and an empty list is one empty path.
20
+ *
21
+ * @evidence contracts/common.md#principled-implementation Nest stores a path as a string or an array, and an empty array means the root path, so the result is never empty.
22
+ * @evidence contracts/common.md#clear-and-simple-design One conditional.
23
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It normalizes without changing paths.
24
+ * @evidence contracts/common.md#meaningful-documentation The comment states the normalization.
25
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMetadataAnalyzer.paths analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
26
+ */
8
27
  export const paths = (target: Function): string[] => {
9
28
  const value: string | string[] = Reflect.getMetadata(PATH_METADATA, target);
10
29
  if (typeof value === "string") return [value];
@@ -12,6 +31,15 @@ export namespace ReflectMetadataAnalyzer {
12
31
  else return value;
13
32
  };
14
33
 
34
+ /**
35
+ * Returns the `@ApiExtension` values of a target.
36
+ *
37
+ * @evidence contracts/common.md#principled-implementation The metadata is returned as recorded, and an absent value is an empty object.
38
+ * @evidence contracts/common.md#clear-and-simple-design One read.
39
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It reads the Swagger metadata key.
40
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result.
41
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMetadataAnalyzer.extensions analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
42
+ */
15
43
  export const extensions = (value: any): Record<string, any> => {
16
44
  const entire: Record<string, any>[] | undefined = Reflect.getMetadata(
17
45
  "swagger/apiExtension",
@@ -20,6 +48,15 @@ export namespace ReflectMetadataAnalyzer {
20
48
  return entire ?? {};
21
49
  };
22
50
 
51
+ /**
52
+ * Returns the deduplicated security requirements of a target.
53
+ *
54
+ * @evidence contracts/common.md#principled-implementation The `@ApiSecurity` metadata is merged by `SecurityAnalyzer.merge`, and an absent value is an empty list.
55
+ * @evidence contracts/common.md#clear-and-simple-design One read and one merge.
56
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It reads the Swagger metadata key.
57
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result.
58
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMetadataAnalyzer.securities analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
59
+ */
23
60
  export const securities = (value: any): Record<string, string[]>[] => {
24
61
  const entire: Record<string, string[]>[] | undefined = Reflect.getMetadata(
25
62
  "swagger/apiSecurity",
@@ -28,6 +65,16 @@ export namespace ReflectMetadataAnalyzer {
28
65
  return entire ? SecurityAnalyzer.merge(...entire) : [];
29
66
  };
30
67
 
68
+ /**
69
+ * Returns the version list of a target, or `undefined` when it is
70
+ * unversioned.
71
+ *
72
+ * @evidence contracts/common.md#principled-implementation A single version becomes a one-element list, and an absent value stays absent so callers can tell unversioned from versioned.
73
+ * @evidence contracts/common.md#clear-and-simple-design One conditional.
74
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It reads Nest's version metadata.
75
+ * @evidence contracts/common.md#meaningful-documentation The comment states the three cases.
76
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectMetadataAnalyzer.versions analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
77
+ */
31
78
  export const versions = (
32
79
  target: any,
33
80
  ): Array<string | typeof VERSION_NEUTRAL> | undefined => {
@@ -8,10 +8,30 @@ import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOpera
8
8
  import { IReflectWebSocketOperationParameter } from "../structures/IReflectWebSocketOperationParameter";
9
9
  import { StringUtil } from "../utils/StringUtil";
10
10
  import { ImportAnalyzer } from "./ImportAnalyzer";
11
+ import { ParameterNameAnalyzer } from "./ParameterNameAnalyzer";
11
12
  import { PathAnalyzer } from "./PathAnalyzer";
12
13
  import { ReflectMetadataAnalyzer } from "./ReflectMetadataAnalyzer";
13
14
 
15
+ /**
16
+ * Reflects a `@WebSocketRoute` method into an operation.
17
+ *
18
+ * @evidence contracts/common.md#principled-implementation The parameter decorators give each parameter's category, the acceptor and driver type arguments are checked, the path parameters of the route are matched against the param decorators, and the tgrid declarations are not imported into the SDK.
19
+ * @evidence contracts/common.md#clear-and-simple-design One public function.
20
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rules follow the decorator contract.
21
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
22
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectWebSocketOperationAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
23
+ */
14
24
  export namespace ReflectWebSocketOperationAnalyzer {
25
+ /**
26
+ * The input of the WebSocket operation analysis: the project, the controller,
27
+ * the method, and its metadata.
28
+ *
29
+ * @evidence contracts/common.md#principled-implementation The record holds what the analysis needs.
30
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
31
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
32
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes and the meaning of its members.
33
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectWebSocketOperationAnalyzer.IProps analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
34
+ */
15
35
  export interface IProps {
16
36
  project: Omit<INestiaProject, "config">;
17
37
  controller: IReflectController;
@@ -19,6 +39,16 @@ export namespace ReflectWebSocketOperationAnalyzer {
19
39
  name: string;
20
40
  metadata: IOperationMetadata;
21
41
  }
42
+ /**
43
+ * Returns the WebSocket operation of a method, or `null` when the method is
44
+ * not a WebSocket route or has errors.
45
+ *
46
+ * @evidence contracts/common.md#principled-implementation An acceptor is required, every parameter must carry one of the five decorators, the acceptor has three type arguments and the driver one, and the path parameters must equal the param fields.
47
+ * @evidence contracts/common.md#clear-and-simple-design One function.
48
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rules follow the decorator contract.
49
+ * @evidence contracts/common.md#meaningful-documentation The comment states the null result.
50
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ReflectWebSocketOperationAnalyzer.analyze analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
51
+ */
22
52
  export const analyze = (ctx: IProps): IReflectWebSocketOperation | null => {
23
53
  const route: { paths: string[] } | undefined = Reflect.getMetadata(
24
54
  "nestia/WebSocketRoute",
@@ -51,7 +81,7 @@ export namespace ReflectWebSocketOperationAnalyzer {
51
81
  );
52
82
 
53
83
  const imports: IReflectImport[] = [];
54
- const parameters: IReflectWebSocketOperationParameter[] = preconfigured
84
+ const declared: IReflectWebSocketOperationParameter[] = preconfigured
55
85
  .map((p) => {
56
86
  const reject = (message: string): null => {
57
87
  errors.push(message);
@@ -69,7 +99,7 @@ export namespace ReflectWebSocketOperationAnalyzer {
69
99
  );
70
100
  else if (matched.type === null)
71
101
  return reject(
72
- `Failed to analyze the parameter type of the ${JSON.stringify(matched.name)}.`,
102
+ `Failed to analyze the parameter type of the ${matched.name ? JSON.stringify(matched.name) : `${p.index} th parameter`}.`,
73
103
  );
74
104
  else if (
75
105
  p.category === "param" &&
@@ -105,6 +135,7 @@ export namespace ReflectWebSocketOperationAnalyzer {
105
135
  if (
106
136
  p.category === "acceptor" ||
107
137
  p.category === "driver" ||
138
+ p.category === "header" ||
108
139
  p.category === "query"
109
140
  )
110
141
  return {
@@ -125,14 +156,16 @@ export namespace ReflectWebSocketOperationAnalyzer {
125
156
  } satisfies IReflectWebSocketOperationParameter.IParam;
126
157
  // UNKNOWN TYPE, MAYBE NEW FEATURE
127
158
  else {
128
- if (p.category !== "header")
129
- reject(
130
- `@WebSocketRoute.${StringUtil.capitalize(p.category)}() has not been supported yet. How about upgrading the nestia packages?`,
131
- );
159
+ reject(
160
+ `@WebSocketRoute.${StringUtil.capitalize(p.category)}() has not been supported yet. How about upgrading the nestia packages?`,
161
+ );
132
162
  return null;
133
163
  }
134
164
  })
135
165
  .filter((p): p is IReflectWebSocketOperationParameter => !!p);
166
+ // a destructured parameter declares no name, so it is given one
167
+ const parameters: IReflectWebSocketOperationParameter[] =
168
+ ParameterNameAnalyzer.name(declared);
136
169
 
137
170
  const fields: string[] = preconfigured
138
171
  .filter((p) => p.category === "param")
@@ -142,7 +175,7 @@ export namespace ReflectWebSocketOperationAnalyzer {
142
175
  for (const cLoc of ctx.controller.paths)
143
176
  for (const mLoc of route.paths) {
144
177
  const location: string = PathAnalyzer.join(cLoc, mLoc);
145
- if (location.includes("*")) continue;
178
+ if (PathAnalyzer.wildcard(location)) continue;
146
179
 
147
180
  const binded: string[] | null = PathAnalyzer.parameters(location);
148
181
  if (binded === null)
@@ -1,25 +1,50 @@
1
- import { MapUtil } from "../utils/MapUtil";
2
-
1
+ /**
2
+ * Helpers for security requirements.
3
+ *
4
+ * @evidence contracts/common.md#principled-implementation The namespace merges requirement lists into a canonical, duplicate-free list.
5
+ * @evidence contracts/common.md#clear-and-simple-design One function.
6
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a plain helper.
7
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
8
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation SecurityAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
9
+ */
3
10
  export namespace SecurityAnalyzer {
4
- export const merge = (...entire: Record<string, string[]>[]) => {
5
- const dict: Map<string | typeof none, Set<string>> = new Map();
6
- for (const obj of entire) {
7
- const entries = Object.entries(obj);
8
- for (const [key, value] of entries) {
9
- const set = MapUtil.take(dict, key, () => new Set());
10
- for (const val of value) set.add(val);
11
- }
12
- if (entries.length === 0) MapUtil.take(dict, none, () => new Set());
13
- }
11
+ /**
12
+ * Joins lists of security requirements into one, as OpenAPI reads them.
13
+ *
14
+ * Each requirement is an alternative, any one of which suffices, and every
15
+ * scheme of one requirement must hold, so each is kept as declared. Merging
16
+ * them by scheme name turned `{ a, b }` (both) into `a` or `b`, and the
17
+ * `read` or `write` scope alternatives of one scheme into both scopes. Only a
18
+ * requirement repeating an earlier one, such as a controller's restated on
19
+ * its method, is dropped; an empty one, anonymous access, is kept.
20
+ *
21
+ * @evidence contracts/common.md#principled-implementation Each requirement is normalized to unique scopes and keyed by its sorted schemes and sorted scopes, so equality does not depend on order, and the first occurrence keeps its position.
22
+ * @evidence contracts/common.md#clear-and-simple-design One function with one key computation.
23
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Equality is defined by content.
24
+ * @evidence contracts/common.md#meaningful-documentation The comment states the equality and the order.
25
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation SecurityAnalyzer.merge analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
26
+ */
27
+ export const merge = (
28
+ ...entire: Record<string, string[]>[]
29
+ ): Record<string, string[]>[] => {
14
30
  const output: Record<string, string[]>[] = [];
15
- for (const [key, set] of dict)
16
- key === none
17
- ? output.push({})
18
- : output.push({
19
- [key]: [...set],
20
- });
31
+ const visited: Set<string> = new Set();
32
+ for (const requirement of entire) {
33
+ const normalized: Record<string, string[]> = Object.fromEntries(
34
+ Object.entries(requirement).map(([name, scopes]) => [
35
+ name,
36
+ [...new Set(scopes)],
37
+ ]),
38
+ );
39
+ const key: string = JSON.stringify(
40
+ Object.entries(normalized)
41
+ .map(([name, scopes]) => [name, [...scopes].sort()] as const)
42
+ .sort(([x], [y]) => (x < y ? -1 : x > y ? 1 : 0)),
43
+ );
44
+ if (visited.has(key)) continue;
45
+ visited.add(key);
46
+ output.push(normalized);
47
+ }
21
48
  return output;
22
49
  };
23
-
24
- const none = Symbol("none");
25
50
  }
@@ -0,0 +1,39 @@
1
+ import { SwaggerExample } from "@nestia/core";
2
+ import { OpenApi } from "@typia/interface";
3
+
4
+ /**
5
+ * Converts the named examples of `@SwaggerExample` into OpenAPI example
6
+ * objects.
7
+ *
8
+ * @evidence contracts/common.md#principled-implementation The namespace maps each named value to an example object.
9
+ * @evidence contracts/common.md#clear-and-simple-design One function.
10
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a plain mapping.
11
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
12
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation SwaggerExampleAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
13
+ */
14
+ export namespace SwaggerExampleAnalyzer {
15
+ /**
16
+ * The named examples `@SwaggerExample` attached, as the Example Objects an
17
+ * OpenAPI `examples` map holds.
18
+ *
19
+ * The decorator stores each named example as its value, and documents used to
20
+ * carry the value itself. OpenAPI 3.x names examples with Example Objects,
21
+ * whose `value` holds the value, so a tool read the raw value as an Example
22
+ * Object and found no example in it (#1649). `@TypedException()` examples are
23
+ * declared as Example Objects already.
24
+ *
25
+ * @evidence contracts/common.md#principled-implementation Each value is wrapped as `{ value }`, which is the OpenAPI example object.
26
+ * @evidence contracts/common.md#clear-and-simple-design One conditional and one mapping.
27
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The values are kept as given.
28
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result.
29
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation SwaggerExampleAnalyzer.examples analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
30
+ */
31
+ export const examples = (
32
+ data: SwaggerExample.IData<any> | undefined,
33
+ ): Record<string, OpenApi.IExample> | undefined =>
34
+ data?.examples === undefined
35
+ ? undefined
36
+ : Object.fromEntries(
37
+ Object.entries(data.examples).map(([key, value]) => [key, { value }]),
38
+ );
39
+ }