@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
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import cp from "child_process";
3
3
  import fs from "fs";
4
+ import path from "path";
4
5
  import process from "process";
5
6
 
6
7
  import { CommandParser } from "./internal/CommandParser";
@@ -31,13 +32,35 @@ function dependencies(argv: string[]): void {
31
32
  const module = options.manager ?? options.module ?? "npm";
32
33
  const prefix: string = module === "yarn" ? "yarn add" : `${module} install`;
33
34
 
34
- for (const lib of ["@nestia/e2e", "@nestia/fetcher", "typia"]) {
35
+ // typia is the release the Nestia transform links, saved exactly: its latest
36
+ // may be another, which @nestia/core refuses
37
+ for (const lib of [
38
+ "@nestia/e2e",
39
+ "@nestia/fetcher",
40
+ `typia@${linkedTypiaVersion()} -E`,
41
+ ]) {
35
42
  const command: string = `${prefix} ${lib}`;
36
43
  console.log(`\n$ ${command}`);
37
44
  cp.execSync(command, { stdio: "inherit" });
38
45
  }
39
46
  }
40
47
 
48
+ /**
49
+ * The typia release the Nestia transform links: the one `@nestia/core`
50
+ * resolves, which its exact dependency holds at that release.
51
+ */
52
+ function linkedTypiaVersion(): string {
53
+ const core: string = path.dirname(
54
+ require.resolve("@nestia/core/package.json"),
55
+ );
56
+ return JSON.parse(
57
+ fs.readFileSync(
58
+ require.resolve("typia/package.json", { paths: [core] }),
59
+ "utf8",
60
+ ),
61
+ ).version;
62
+ }
63
+
41
64
  async function initialize(): Promise<void> {
42
65
  if (fs.existsSync("nestia.config.ts") === true)
43
66
  halt(
@@ -9,15 +9,36 @@ import {
9
9
  * Numeric-literal helper that handles negative values via a leading
10
10
  * `MinusToken` prefix unary, matching how the TypeScript factory itself emits
11
11
  * negative numeric literals.
12
+ *
13
+ * Infinity is written `1e999`, a numeric literal that evaluates to it and can
14
+ * also appear in a literal type; `Infinity` names a value, not a type.
15
+ *
16
+ * @evidence contracts/common.md#principled-implementation The namespace holds the number literal builder.
17
+ * @evidence contracts/common.md#clear-and-simple-design One function.
18
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It only builds nodes.
19
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
20
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ExpressionFactory constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
12
21
  */
13
22
  export namespace ExpressionFactory {
23
+ /**
24
+ * Builds a numeric literal, with a prefix minus for a negative value.
25
+ *
26
+ * @evidence contracts/common.md#principled-implementation A negative literal is a prefix unary minus on a positive literal in the syntax tree, so the builder produces that shape.
27
+ * @evidence contracts/common.md#clear-and-simple-design One conditional.
28
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It follows the grammar.
29
+ * @evidence contracts/common.md#meaningful-documentation The comment states the negative case.
30
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ExpressionFactory.number constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
31
+ */
14
32
  export const number = (
15
33
  value: number,
16
34
  ): NumericLiteral | PrefixUnaryExpression =>
17
35
  value < 0
18
36
  ? factory.createPrefixUnaryExpression(
19
37
  SyntaxKind.MinusToken,
20
- factory.createNumericLiteral(Math.abs(value)),
38
+ literal(-value),
21
39
  )
22
- : factory.createNumericLiteral(value);
40
+ : literal(value);
41
+
42
+ const literal = (value: number): NumericLiteral =>
43
+ factory.createNumericLiteral(value === Infinity ? "1e999" : value);
23
44
  }
@@ -19,11 +19,23 @@ const isVariableName = (str: string): boolean => VARIABLE_REGEX.test(str);
19
19
  /**
20
20
  * Identifier and member-access helpers. The surface kept here is the subset
21
21
  * nestia generators actually call (`identifier`, `access`, `parameter`).
22
+ *
23
+ * @evidence contracts/common.md#principled-implementation The functions choose an identifier or a string literal by the syntax of the name, so any string can be a key.
24
+ * @evidence contracts/common.md#clear-and-simple-design Three functions.
25
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The identifier test is inlined and conservative.
26
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
27
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation IdentifierFactory constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
22
28
  */
23
29
  export namespace IdentifierFactory {
24
30
  /**
25
31
  * Build an identifier or string literal depending on whether `name` is a
26
32
  * valid JavaScript identifier.
33
+ *
34
+ * @evidence contracts/common.md#principled-implementation The name is tested against the identifier grammar, and a valid name outside the conservative pattern becomes an equivalent quoted key.
35
+ * @evidence contracts/common.md#clear-and-simple-design One conditional.
36
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The test applies to every name.
37
+ * @evidence contracts/common.md#meaningful-documentation The comment states the two results.
38
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation IdentifierFactory.identifier constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
27
39
  */
28
40
  export const identifier = (name: string): Identifier | StringLiteral =>
29
41
  isVariableName(name)
@@ -33,6 +45,12 @@ export namespace IdentifierFactory {
33
45
  /**
34
46
  * Member access on `input` by `key`. Falls back to element access when the
35
47
  * key is not a valid identifier.
48
+ *
49
+ * @evidence contracts/common.md#principled-implementation The key becomes a property when it is an identifier and an element access otherwise.
50
+ * @evidence contracts/common.md#clear-and-simple-design One function delegating the naming rule.
51
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It never concatenates source text.
52
+ * @evidence contracts/common.md#meaningful-documentation The comment states the forms.
53
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation IdentifierFactory.access constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
36
54
  */
37
55
  export const access = (
38
56
  input: Expression,
@@ -60,6 +78,12 @@ export namespace IdentifierFactory {
60
78
  /**
61
79
  * Parameter declaration with default `any` type when the caller omits one.
62
80
  * Passing a `QuestionToken` as `init` marks the parameter optional.
81
+ *
82
+ * @evidence contracts/common.md#principled-implementation The question token becomes the optional marker and any other initializer is passed through.
83
+ * @evidence contracts/common.md#clear-and-simple-design One function.
84
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It follows the declaration grammar.
85
+ * @evidence contracts/common.md#meaningful-documentation The comment states the optional marker.
86
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation IdentifierFactory.parameter constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
63
87
  */
64
88
  export const parameter = (
65
89
  name: string | Identifier,
@@ -1,4 +1,4 @@
1
- import { type Expression, factory } from "@ttsc/factory";
1
+ import { type Expression, SyntaxKind, factory } from "@ttsc/factory";
2
2
 
3
3
  import { ExpressionFactory } from "./ExpressionFactory";
4
4
  import { IdentifierFactory } from "./IdentifierFactory";
@@ -15,40 +15,78 @@ const isNode = (value: unknown): value is Expression =>
15
15
  typeof (value as { kind?: unknown }).kind === "string";
16
16
 
17
17
  /**
18
- * Recursive value-to-AST-literal builder. Hands back already-AST inputs
19
- * unchanged (so callers can mix factory output with raw JS values inside the
20
- * same object/array), and emits the appropriate literal node otherwise.
18
+ * Recursive value-to-AST-literal builder. Arrow-function, call-expression and
19
+ * identifier nodes pass through only when the caller explicitly requests
20
+ * expression preservation. Ordinary values may contain the same `kind` names.
21
+ *
22
+ * @evidence contracts/common.md#principled-implementation The namespace maps values to literal nodes by type.
23
+ * @evidence contracts/common.md#clear-and-simple-design One function and two helpers.
24
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The mapping is by type.
25
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
26
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation LiteralFactory constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
21
27
  */
22
28
  export namespace LiteralFactory {
23
- export const write = (input: any): Expression => {
29
+ /**
30
+ * Builds the expression of a value; arrow function, call, and identifier
31
+ * nodes pass through when `preserveExpressions` is true. Functions become
32
+ * `undefined`; other unsupported types throw, and object properties whose
33
+ * values are undefined are omitted.
34
+ *
35
+ * @evidence contracts/common.md#principled-implementation The value is dispatched by type in a fixed order and containers are written element by element.
36
+ * @evidence contracts/common.md#clear-and-simple-design One function.
37
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The dispatch is general.
38
+ * @evidence contracts/common.md#meaningful-documentation The comment states the mapping.
39
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation LiteralFactory.write constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
40
+ */
41
+ export const write = (
42
+ input: any,
43
+ preserveExpressions = false,
44
+ ): Expression => {
24
45
  if (input === null) return factory.createNull();
25
- if (isNode(input) && PASSTHROUGH_KINDS.has(input.kind)) return input;
26
- if (Array.isArray(input)) return writeArray(input);
27
- if (typeof input === "object") return writeObject(input as object);
46
+ if (
47
+ preserveExpressions &&
48
+ isNode(input) &&
49
+ PASSTHROUGH_KINDS.has(input.kind)
50
+ )
51
+ return input;
52
+ if (Array.isArray(input)) return writeArray(input, preserveExpressions);
53
+ if (typeof input === "object")
54
+ return writeObject(input as object, preserveExpressions);
28
55
  if (typeof input === "boolean")
29
56
  return input ? factory.createTrue() : factory.createFalse();
30
57
  if (typeof input === "number") return ExpressionFactory.number(input);
31
58
  if (typeof input === "string") return factory.createStringLiteral(input);
32
59
  if (typeof input === "bigint")
33
- return factory.createStringLiteral(input.toString());
60
+ return input < BigInt(0)
61
+ ? factory.createPrefixUnaryExpression(
62
+ SyntaxKind.MinusToken,
63
+ factory.createBigIntLiteral((-input).toString()),
64
+ )
65
+ : factory.createBigIntLiteral(input.toString());
34
66
  if (typeof input === "function")
35
67
  return factory.createIdentifier("undefined");
36
68
  throw new TypeError("LiteralFactory.write: unsupported input type.");
37
69
  };
38
70
 
39
- const writeObject = (obj: object): Expression =>
71
+ const writeObject = (obj: object, preserveExpressions: boolean): Expression =>
40
72
  factory.createObjectLiteralExpression(
41
73
  Object.entries(obj)
42
74
  .filter(([, value]) => value !== undefined)
43
75
  .map(([key, value]) =>
44
76
  factory.createPropertyAssignment(
45
77
  IdentifierFactory.identifier(key),
46
- write(value),
78
+ write(value, preserveExpressions),
47
79
  ),
48
80
  ),
49
81
  true,
50
82
  );
51
83
 
52
- const writeArray = (array: readonly any[]): Expression =>
53
- factory.createArrayLiteralExpression(array.map(write), true);
84
+ const writeArray = (
85
+ array: readonly any[],
86
+ preserveExpressions: boolean,
87
+ ): Expression =>
88
+ factory.createArrayLiteralExpression(
89
+ array.map((value) => write(value, preserveExpressions)),
90
+ true,
91
+ );
54
92
  }
@@ -8,8 +8,26 @@ import {
8
8
 
9
9
  import { TypeFactory } from "./TypeFactory";
10
10
 
11
- /** Variable-statement helpers. `constant` emits `const`, `mut` emits `let`. */
11
+ /**
12
+ * Variable-statement helpers. `constant` emits `const`, `mut` emits `let`.
13
+ *
14
+ * @evidence contracts/common.md#principled-implementation The namespace builds `let` and `const` statements.
15
+ * @evidence contracts/common.md#clear-and-simple-design Two functions, one for let and one for const.
16
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It only builds nodes.
17
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
18
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation StatementFactory constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
19
+ */
12
20
  export namespace StatementFactory {
21
+ /**
22
+ * Builds a `let` statement; without a type and an initializer it is typed
23
+ * `any`.
24
+ *
25
+ * @evidence contracts/common.md#principled-implementation A declaration without either would be implicitly any, so the type is stated.
26
+ * @evidence contracts/common.md#clear-and-simple-design One expression.
27
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It follows the grammar.
28
+ * @evidence contracts/common.md#meaningful-documentation The comment states the default type.
29
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation StatementFactory.mut constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
30
+ */
13
31
  export const mut = (props: {
14
32
  name: string;
15
33
  type?: TypeNode | undefined;
@@ -34,6 +52,15 @@ export namespace StatementFactory {
34
52
  ),
35
53
  );
36
54
 
55
+ /**
56
+ * Builds a `const` statement from a name, a type, and a value.
57
+ *
58
+ * @evidence contracts/common.md#principled-implementation The declaration list carries the const flag and the given parts.
59
+ * @evidence contracts/common.md#clear-and-simple-design One expression.
60
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It follows the grammar.
61
+ * @evidence contracts/common.md#meaningful-documentation The comment states its inputs.
62
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation StatementFactory.constant constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
63
+ */
37
64
  export const constant = (props: {
38
65
  name: string;
39
66
  type?: TypeNode | undefined;
@@ -6,6 +6,12 @@ import { type KeywordTypeNode, SyntaxKind, factory } from "@ttsc/factory";
6
6
  * Wraps {@link factory.createKeywordTypeNode} with a name-based interface so
7
7
  * generator code reads as `TypeFactory.keyword("any")` instead of selecting the
8
8
  * `SyntaxKind.AnyKeyword` token by hand.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation The namespace maps names to the keyword syntax kinds.
11
+ * @evidence contracts/common.md#clear-and-simple-design One table, one type, and one function.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It only builds nodes.
13
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypeFactory constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
9
15
  */
10
16
  export namespace TypeFactory {
11
17
  const KEYWORDS = {
@@ -20,8 +26,26 @@ export namespace TypeFactory {
20
26
  undefined: SyntaxKind.UndefinedKeyword,
21
27
  } as const;
22
28
 
29
+ /**
30
+ * The names of the supported keyword types.
31
+ *
32
+ * @evidence contracts/common.md#principled-implementation The type is the key set of the table, so a keyword is one table entry.
33
+ * @evidence contracts/common.md#clear-and-simple-design One derived type.
34
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
35
+ * @evidence contracts/common.md#meaningful-documentation The comment names the set.
36
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypeFactory.Keyword is the key union of the syntax-kind table and defines no native path conversion or process boundary.
37
+ */
23
38
  export type Keyword = keyof typeof KEYWORDS;
24
39
 
40
+ /**
41
+ * Builds the keyword type node of a name.
42
+ *
43
+ * @evidence contracts/common.md#principled-implementation The name is looked up in the table.
44
+ * @evidence contracts/common.md#clear-and-simple-design One lookup.
45
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It follows the grammar.
46
+ * @evidence contracts/common.md#meaningful-documentation The comment states its input.
47
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypeFactory.keyword constructs TypeScript syntax nodes; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
48
+ */
25
49
  export const keyword = (type: Keyword): KeywordTypeNode =>
26
50
  factory.createKeywordTypeNode(KEYWORDS[type]);
27
51
  }
@@ -15,17 +15,38 @@ import { SdkHttpCloneProgrammer } from "./internal/SdkHttpCloneProgrammer";
15
15
  import { SdkHttpCloneReferencer } from "./internal/SdkHttpCloneReferencer";
16
16
  import { SdkWebSocketCloneProgrammer } from "./internal/SdkWebSocketCloneProgrammer";
17
17
 
18
+ /**
19
+ * Writes the DTO declarations of the SDK: the `structures` files that the
20
+ * functions import when `clone` is on.
21
+ *
22
+ * @evidence contracts/common.md#principled-implementation The namespace composes the declarations from the analyzed types, rewrites the routes to reference them, and prints one file per top-level module.
23
+ * @evidence contracts/common.md#clear-and-simple-design One public function with two private helpers.
24
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Every declaration goes through the shared printer, and no type is special-cased.
25
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
26
+ * @evidence contracts/portability.md#os-neutral-implementation The writer passes native output locations to Node fs and FilePrinter; module specifiers are produced separately by ImportDictionary. The structures suffix uses forward slashes, which Node accepts on Windows and POSIX, without treating spelling as canonical file identity.
27
+ */
18
28
  export namespace CloneGenerator {
29
+ /**
30
+ * Writes the `structures` directory of the SDK output.
31
+ *
32
+ * Structural route references are updated even when every JSON DTO is inline
33
+ * and no structure file is needed. WebSocket source cloning stays separate.
34
+ *
35
+ * @evidence contracts/common.md#principled-implementation HTTP and MCP JSON declarations share the analyzed collection; WebSocket sources are copied separately. Route references are updated even for inline-only graphs, then named modules are written sequentially so a failure stops at the first file.
36
+ * @evidence contracts/common.md#clear-and-simple-design One function over the two programmers, the referencer, and the file writer.
37
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The directory is created recursively and its failure is not swallowed.
38
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
39
+ * @evidence contracts/portability.md#os-neutral-implementation Node mkdir creates the output structures directory and FilePrinter writes generated declarations; WebSocket source lookup and copying remain delegated to its source-cloning owner. Filesystem errors propagate rather than being translated into platform-specific shell commands.
40
+ */
19
41
  export const write = async (app: ITypedApplication): Promise<void> => {
20
42
  const dict: Map<string, SdkHttpCloneProgrammer.IModule> =
21
43
  SdkHttpCloneProgrammer.write(app);
22
44
  const websocket: Set<string> = await SdkWebSocketCloneProgrammer.write(app);
23
- if (dict.size === 0 && websocket.size === 0) return;
24
-
25
45
  SdkHttpCloneReferencer.replace(app, websocket);
26
- try {
27
- await fs.promises.mkdir(`${app.project.config.output}/structures`);
28
- } catch {}
46
+ if (dict.size === 0 && websocket.size === 0) return;
47
+ await fs.promises.mkdir(`${app.project.config.output}/structures`, {
48
+ recursive: true,
49
+ });
29
50
  for (const [key, value] of dict)
30
51
  await writeDtoFile(app.project)(key, value);
31
52
  };
@@ -4,7 +4,26 @@ import path from "path";
4
4
  import { ITypedApplication } from "../structures/ITypedApplication";
5
5
  import { E2eFileProgrammer } from "./internal/E2eFileProgrammer";
6
6
 
7
+ /**
8
+ * Writes the e2e test functions of the SDK.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation The namespace creates the output directories and writes one test file per HTTP route.
11
+ * @evidence contracts/common.md#clear-and-simple-design One public function and one directory helper.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Only HTTP routes have a test, and no route is skipped by name.
13
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
14
+ * @evidence contracts/portability.md#os-neutral-implementation The output root is resolved with Node path.resolve, descendants use path.join and recursive fs.mkdir creates them. SDK import paths are passed to E2eFileProgrammer independently from native directory paths.
15
+ */
7
16
  export namespace E2eGenerator {
17
+ /**
18
+ * Writes one test function per HTTP route under `features/api/automated` of
19
+ * the e2e output directory, creating the directories as needed.
20
+ *
21
+ * @evidence contracts/common.md#principled-implementation The directories are created recursively, so an existing tree is reused, and each route's file is written in sequence.
22
+ * @evidence contracts/common.md#clear-and-simple-design One loop over the routes.
23
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts WebSocket and MCP routes are not tests of the HTTP SDK and are left out by protocol.
24
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
25
+ * @evidence contracts/portability.md#os-neutral-implementation Native output and SDK roots use path.resolve and path.join before mkdir or file generation. No shell or filesystem case assumption participates; the generated HTTP route names have already passed accessor analysis.
26
+ */
8
27
  export const generate = async (app: ITypedApplication): Promise<void> => {
9
28
  console.log("Generating E2E Test Functions");
10
29
 
@@ -1,5 +1,4 @@
1
1
  import fs from "fs";
2
- import NodePath from "path";
3
2
 
4
3
  import { INestiaConfig } from "../INestiaConfig";
5
4
  import { IReflectOperationError } from "../structures/IReflectOperationError";
@@ -7,13 +6,34 @@ import { IReflectType } from "../structures/IReflectType";
7
6
  import { ITypedApplication } from "../structures/ITypedApplication";
8
7
  import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
9
8
  import { ITypedMcpRoute } from "../structures/ITypedMcpRoute";
9
+ import { SDK_BUNDLE_PATH } from "../utils/SdkBundlePath";
10
10
  import { StringUtil } from "../utils/StringUtil";
11
11
  import { CloneGenerator } from "./CloneGenerator";
12
12
  import { SdkDistributionComposer } from "./internal/SdkDistributionComposer";
13
13
  import { SdkFileProgrammer } from "./internal/SdkFileProgrammer";
14
14
  import { SdkHttpParameterProgrammer } from "./internal/SdkHttpParameterProgrammer";
15
15
 
16
+ /**
17
+ * Generates the SDK library and validates the analyzed routes it needs.
18
+ *
19
+ * @evidence contracts/common.md#principled-implementation The namespace bundles the static files, writes the DTOs and the functions, composes the distribution package, and reports the errors the generation would meet.
20
+ * @evidence contracts/common.md#clear-and-simple-design Two public functions, one public constant, and the private validators.
21
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Validation and generation share the same route model.
22
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
23
+ * @evidence contracts/portability.md#os-neutral-implementation Static bundle enumeration and output creation use Node fs; declaration/module path conversion and distribution process launching are delegated to ImportDictionary and SdkDistributionComposer. Existing file spelling is checked by the filesystem rather than an OS-name case rule.
24
+ */
16
25
  export namespace SdkGenerator {
26
+ /**
27
+ * Writes the SDK into the configured output directory: the bundled files, the
28
+ * DTOs when `clone` is on, the functions, and the distribution package when
29
+ * `distribute` is set.
30
+ *
31
+ * @evidence contracts/common.md#principled-implementation The steps run in dependency order, the bundle first and the distribution last. An absent output option throws before writing; a configured directory that does not exist is created recursively.
32
+ * @evidence contracts/common.md#clear-and-simple-design One function that delegates each step.
33
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The steps are sequential and each awaits the previous one.
34
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
35
+ * @evidence contracts/portability.md#os-neutral-implementation Node mkdir and the bundle writer accept the configured native output path; subsequent file and process boundaries belong to their delegated writers. Configuration omission is distinct from a missing on-disk directory.
36
+ */
17
37
  export const generate = async (app: ITypedApplication): Promise<void> => {
18
38
  if (app.project.config.output === undefined)
19
39
  throw new Error("Output directory is not defined.");
@@ -40,6 +60,18 @@ export namespace SdkGenerator {
40
60
  });
41
61
  };
42
62
 
63
+ /**
64
+ * Returns the errors of routes that cannot become an SDK: MCP tools with
65
+ * duplicate names or accessors, and, without `clone`, HTTP routes whose
66
+ * parameter or return types are implicit, plus implicit exception types when
67
+ * propagation is enabled.
68
+ *
69
+ * @evidence contracts/common.md#principled-implementation The MCP checks always apply, and the implicit return check applies only where the SDK would have to name the type, because `clone` writes it as a declaration instead.
70
+ * @evidence contracts/common.md#clear-and-simple-design One function over three checks.
71
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The list is collected, not thrown, so one run reports every error.
72
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
73
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation Validation judges analyzed route types and names and performs no native filesystem or process operation.
74
+ */
43
75
  export const validate = (
44
76
  app: ITypedApplication,
45
77
  ): IReflectOperationError[] => {
@@ -118,7 +150,7 @@ export namespace SdkGenerator {
118
150
  props.errors.push({
119
151
  file: props.route.controller.file,
120
152
  class: props.route.controller.class.name,
121
- function: props.route.name,
153
+ function: props.route.key,
122
154
  from: `parameter ${JSON.stringify(p.name)}`,
123
155
  contents: [`implicit (unnamed) parameter type.`],
124
156
  });
@@ -129,7 +161,7 @@ export namespace SdkGenerator {
129
161
  props.errors.push({
130
162
  file: props.route.controller.file,
131
163
  class: props.route.controller.class.name,
132
- function: props.route.name,
164
+ function: props.route.key,
133
165
  from: `exception ${JSON.stringify(key)}`,
134
166
  contents: [`implicit (unnamed) exception type.`],
135
167
  });
@@ -140,7 +172,7 @@ export namespace SdkGenerator {
140
172
  props.errors.push({
141
173
  file: props.route.controller.file,
142
174
  class: props.route.controller.class.name,
143
- function: props.route.name,
175
+ function: props.route.key,
144
176
  from: "success",
145
177
  contents: [`implicit (unnamed) return type.`],
146
178
  });
@@ -162,6 +194,12 @@ export namespace SdkGenerator {
162
194
  * Files the user already has are never touched, so that hand-written
163
195
  * customizations (e.g. extra re-exports in `module.ts`) survive regeneration.
164
196
  * Only missing files are filled in from the bundle.
197
+ *
198
+ * @evidence contracts/common.md#principled-implementation A file that the user has customized is never overwritten, and only files that are missing are filled in from the bundle.
199
+ * @evidence contracts/common.md#clear-and-simple-design One loop with two guards.
200
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The existing target is checked before the write.
201
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the declaration produces and its result.
202
+ * @evidence contracts/portability.md#os-neutral-implementation fs.readdir/stat enumerate the installed bundle and fs.existsSync checks each target under the filesystem's own policy before writing UTF-8. Forward slash suffixes are accepted by Node on supported native platforms; concurrent generation into the same output is not an exclusive ownership guarantee.
165
203
  */
166
204
  export const bundle = async (output: string): Promise<void> => {
167
205
  const files: string[] = await fs.promises.readdir(BUNDLE_PATH);
@@ -177,12 +215,5 @@ export namespace SdkGenerator {
177
215
  }
178
216
  };
179
217
 
180
- export const BUNDLE_PATH = NodePath.join(
181
- __dirname,
182
- "..",
183
- "..",
184
- "assets",
185
- "bundle",
186
- "api",
187
- );
218
+ export const BUNDLE_PATH = SDK_BUNDLE_PATH;
188
219
  }