@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
@@ -4,6 +4,16 @@ import { ITypedHttpRoute } from "./ITypedHttpRoute";
4
4
  import { ITypedMcpRoute } from "./ITypedMcpRoute";
5
5
  import { ITypedWebSocketRoute } from "./ITypedWebSocketRoute";
6
6
 
7
+ /**
8
+ * The typed application: the project, the metadata dictionary, and the typed
9
+ * routes.
10
+ *
11
+ * @evidence contracts/common.md#principled-implementation The record is the input of every generator.
12
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
13
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
14
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
15
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedApplication describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
16
+ */
7
17
  export interface ITypedApplication {
8
18
  project: INestiaProject;
9
19
  collection: IMetadataDictionary;
@@ -6,10 +6,28 @@ import { ITypedHttpRouteException } from "./ITypedHttpRouteException";
6
6
  import { ITypedHttpRouteParameter } from "./ITypedHttpRouteParameter";
7
7
  import { ITypedHttpRouteSuccess } from "./ITypedHttpRouteSuccess";
8
8
 
9
+ /**
10
+ * A typed HTTP route: one path of an operation with its parameters split by
11
+ * kind, its success, its exceptions, and its documentation.
12
+ *
13
+ * @evidence contracts/common.md#principled-implementation The reflected operation is expanded per path and its parameters are classified for the generators.
14
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
15
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
16
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
17
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRoute describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
18
+ */
9
19
  export interface ITypedHttpRoute {
10
20
  protocol: "http";
11
21
  function: Function;
12
22
  controller: IReflectController;
23
+ /**
24
+ * Property key of the controller method.
25
+ *
26
+ * {@link name} is the SDK function's name, which the accessor analysis
27
+ * renames: a reserved word such as `delete` becomes `_delete`. Metadata the
28
+ * method's decorators define, and what names the method, read this key.
29
+ */
30
+ key: string;
13
31
  name: string;
14
32
  method: string;
15
33
  path: string;
@@ -1,12 +1,25 @@
1
+ import { OpenApi } from "@typia/interface";
2
+
1
3
  import { MetadataSchema } from "../internal/legacy";
2
4
  import { IReflectType } from "./IReflectType";
3
5
 
6
+ /**
7
+ * A typed exception: its status, description, examples, type, and resolved
8
+ * metadata.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation The resolved metadata is what the SDK and the Swagger generators print.
11
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
13
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteException describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
15
+ */
4
16
  export interface ITypedHttpRouteException {
5
17
  // BASIC PROPERTIES
6
18
  status: number | "2XX" | "3XX" | "4XX" | "5XX";
7
19
  description: string | null;
8
20
  example: any;
9
- examples: Record<string, any>;
21
+ /** Named examples, as OpenAPI Example Objects. */
22
+ examples: Record<string, OpenApi.IExample>;
10
23
 
11
24
  // REFLECTED PROPERTIES
12
25
  type: IReflectType;
@@ -1,14 +1,33 @@
1
+ import { OpenApi } from "@typia/interface";
1
2
  import { IJsDocTagInfo } from "typia";
2
3
 
3
4
  import { MetadataSchema } from "../internal/legacy";
4
5
  import { IReflectType } from "./IReflectType";
5
6
 
7
+ /**
8
+ * A typed parameter of a route: a body, headers, a path parameter, or a query.
9
+ *
10
+ * @evidence contracts/common.md#principled-implementation The union is discriminated by `category`, and each member carries the resolved metadata.
11
+ * @evidence contracts/common.md#clear-and-simple-design A union of four records.
12
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
13
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
14
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteParameter describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
15
+ */
6
16
  export type ITypedHttpRouteParameter =
7
17
  | ITypedHttpRouteParameter.IBody
8
18
  | ITypedHttpRouteParameter.IHeaders
9
19
  | ITypedHttpRouteParameter.IPath
10
20
  | ITypedHttpRouteParameter.IQuery;
11
21
  export namespace ITypedHttpRouteParameter {
22
+ /**
23
+ * The typed form of a body parameter.
24
+ *
25
+ * @evidence contracts/common.md#principled-implementation The record extends the shared base with the members its category adds.
26
+ * @evidence contracts/common.md#clear-and-simple-design A record extending the shared base.
27
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
28
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
29
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteParameter.IBody describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
30
+ */
12
31
  export interface IBody extends IBase<"body"> {
13
32
  contentType:
14
33
  | "application/json"
@@ -17,12 +36,39 @@ export namespace ITypedHttpRouteParameter {
17
36
  | "text/plain";
18
37
  encrypted: boolean;
19
38
  }
39
+ /**
40
+ * The typed form of a headers parameter.
41
+ *
42
+ * @evidence contracts/common.md#principled-implementation The record extends the shared base with the members its category adds.
43
+ * @evidence contracts/common.md#clear-and-simple-design A record extending the shared base.
44
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
45
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
46
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteParameter.IHeaders describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
47
+ */
20
48
  export interface IHeaders extends IBase<"headers"> {
21
49
  field: string | null;
22
50
  }
51
+ /**
52
+ * The typed form of a path parameter parameter.
53
+ *
54
+ * @evidence contracts/common.md#principled-implementation The record extends the shared base with the members its category adds.
55
+ * @evidence contracts/common.md#clear-and-simple-design A record extending the shared base.
56
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
57
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
58
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteParameter.IPath describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
59
+ */
23
60
  export interface IPath extends IBase<"param"> {
24
61
  field: string;
25
62
  }
63
+ /**
64
+ * The typed form of a query parameter.
65
+ *
66
+ * @evidence contracts/common.md#principled-implementation The record extends the shared base with the members its category adds.
67
+ * @evidence contracts/common.md#clear-and-simple-design A record extending the shared base.
68
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
69
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
70
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteParameter.IQuery describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
71
+ */
26
72
  export interface IQuery extends IBase<"query"> {
27
73
  field: string | null;
28
74
  }
@@ -34,7 +80,8 @@ export namespace ITypedHttpRouteParameter {
34
80
  type: IReflectType;
35
81
  metadata: MetadataSchema;
36
82
  example?: any;
37
- examples?: Record<string, any>;
83
+ /** Named examples, as OpenAPI Example Objects. */
84
+ examples?: Record<string, OpenApi.IExample>;
38
85
  description: string | null;
39
86
  jsDocTags: IJsDocTagInfo[];
40
87
  }
@@ -1,7 +1,19 @@
1
+ import { OpenApi } from "@typia/interface";
2
+
1
3
  import { MetadataSchema } from "../internal/legacy";
2
4
  import { HttpResponseContentTypeUtil } from "../utils/HttpResponseContentTypeUtil";
3
5
  import { IReflectType } from "./IReflectType";
4
6
 
7
+ /**
8
+ * A typed success response: its type, status, content type, binary and
9
+ * encrypted flags, metadata, examples, and header directives.
10
+ *
11
+ * @evidence contracts/common.md#principled-implementation The header directives are the `@setHeader` and `@assignHeaders` tags, which the SDK function applies to the connection.
12
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
13
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
14
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
15
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedHttpRouteSuccess describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
16
+ */
5
17
  export interface ITypedHttpRouteSuccess {
6
18
  type: IReflectType;
7
19
  status: number | null;
@@ -10,7 +22,8 @@ export interface ITypedHttpRouteSuccess {
10
22
  encrypted: boolean;
11
23
  metadata: MetadataSchema;
12
24
  example?: any;
13
- examples?: Record<string, any>;
25
+ /** Named examples, as OpenAPI Example Objects. */
26
+ examples?: Record<string, OpenApi.IExample>;
14
27
  setHeaders: Array<
15
28
  | { type: "setter"; source: string; target?: string }
16
29
  | { type: "assigner"; source: string }
@@ -1,5 +1,6 @@
1
1
  import { IJsDocTagInfo } from "typia";
2
2
 
3
+ import { MetadataSchema } from "../internal/legacy";
3
4
  import { IReflectController } from "./IReflectController";
4
5
  import { IReflectImport } from "./IReflectImport";
5
6
  import { IReflectMcpOperation } from "./IReflectMcpOperation";
@@ -12,6 +13,12 @@ import { IReflectType } from "./IReflectType";
12
13
  * Carries everything the SDK generator needs to emit a typed client function:
13
14
  * the controller reference, accessor path, typia-derived input schema, and
14
15
  * input/output type info.
16
+ *
17
+ * @evidence contracts/common.md#principled-implementation The record is the tool operation in the form the SDK generator reads.
18
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
19
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
20
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
21
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedMcpRoute describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
15
22
  */
16
23
  export interface ITypedMcpRoute {
17
24
  protocol: "mcp";
@@ -24,6 +31,11 @@ export interface ITypedMcpRoute {
24
31
  function: Function;
25
32
  input: IReflectMcpOperationParameter | null;
26
33
  returnType: IReflectType | null;
34
+ /** Resolved JSON wire graphs used by structural DTO cloning. */
35
+ inputMetadata?: MetadataSchema;
36
+
37
+ /** Absent when source-only analysis was requested without cloning. */
38
+ outputMetadata?: MetadataSchema;
27
39
  inputSchema: object;
28
40
  outputSchema: object | null;
29
41
  annotations: IReflectMcpOperation.IAnnotations | null;
@@ -5,9 +5,27 @@ import { IReflectController } from "./IReflectController";
5
5
  import { IReflectImport } from "./IReflectImport";
6
6
  import { ITypedWebSocketRouteParameter } from "./ITypedWebSocketRouteParameter";
7
7
 
8
+ /**
9
+ * A typed WebSocket route: one path with its acceptor, header, path parameters,
10
+ * query, and driver separated.
11
+ *
12
+ * @evidence contracts/common.md#principled-implementation The reflected operation is expanded per path and its parameters are classified.
13
+ * @evidence contracts/common.md#clear-and-simple-design A flat record with no behavior.
14
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
15
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the type describes; its members are named for their meaning.
16
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ITypedWebSocketRoute describes protocol or type metadata; any embedded import/source record preserves the identity supplied by its owner. This declaration defines no native path conversion or process boundary.
17
+ */
8
18
  export interface ITypedWebSocketRoute {
9
19
  protocol: "websocket";
10
20
  controller: IReflectController;
21
+ /**
22
+ * Property key of the controller method.
23
+ *
24
+ * {@link name} is the SDK function's name, which the accessor analysis
25
+ * renames: a reserved word such as `delete` becomes `_delete`. Metadata the
26
+ * method's decorators define, and what names the method, read this key.
27
+ */
28
+ key: string;
11
29
  name: string;
12
30
  path: string;
13
31
  accessor: string[];
package/src/transform.ts CHANGED
@@ -11,6 +11,12 @@ import type { ITtscPlugin, ITtscPluginFactoryContext } from "ttsc";
11
11
  * contributor — but only for projects that actually depend on `@nestia/sdk`. A
12
12
  * project depending on `@nestia/core` alone never links, compiles, or ships any
13
13
  * of this SDK transform code.
14
+ *
15
+ * @evidence contracts/common.md#principled-implementation The package root is resolved through `@nestia/sdk/package.json` from the consumer's project, so the source path is the installed package's, not a workspace layout, and the descriptor returns only a name and a source directory.
16
+ * @evidence contracts/common.md#clear-and-simple-design One function returning two properties; the transform itself is native.
17
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The resolution goes through the package manifest, as the development rules require, and nothing is patched.
18
+ * @evidence contracts/common.md#meaningful-documentation The comment states what the descriptor returns.
19
+ * @evidence contracts/portability.md#os-neutral-implementation createRequire anchors package resolution to the consumer project's package.json; Node resolution yields the installed manifest's native pathname and path.dirname/path.resolve derive the contributor source without a workspace-specific separator or shell lookup.
14
20
  */
15
21
  export default function createTtscPlugin(
16
22
  context: ITtscPluginFactoryContext,
@@ -1,10 +1,39 @@
1
+ /**
2
+ * Array helpers of the SDK generator.
3
+ *
4
+ * @evidence contracts/common.md#principled-implementation The namespace holds a membership test and a sequential asynchronous map.
5
+ * @evidence contracts/common.md#clear-and-simple-design Two functions.
6
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts They are plain helpers.
7
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
8
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ArrayUtil operates on caller-supplied arrays and promises without resolving file identity or launching a process; callback boundaries remain the caller's responsibility.
9
+ */
1
10
  export namespace ArrayUtil {
11
+ /**
12
+ * Reports whether the array contains every one of the items.
13
+ *
14
+ * Membership uses `includes`, so an `undefined` or `NaN` item is found when
15
+ * the array holds it.
16
+ *
17
+ * @evidence contracts/common.md#principled-implementation `Array.prototype.includes` compares by SameValueZero and the result is the conjunction over the items.
18
+ * @evidence contracts/common.md#clear-and-simple-design One `every` over `includes`.
19
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts No item is special-cased.
20
+ * @evidence contracts/common.md#meaningful-documentation The comment states the conjunction and the comparison.
21
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ArrayUtil.has operates on caller-supplied arrays and promises without resolving file identity or launching a process; callback boundaries remain the caller's responsibility.
22
+ */
2
23
  export function has<T>(array: T[], ...items: T[]): boolean {
3
- return items.every(
4
- (elem) => array.find((org) => org === elem) !== undefined,
5
- );
24
+ return items.every((item) => array.includes(item));
6
25
  }
7
26
 
27
+ /**
28
+ * Maps the elements with an asynchronous function, one after another, and
29
+ * returns the results in order.
30
+ *
31
+ * @evidence contracts/common.md#principled-implementation Each call is awaited before the next starts, so the order of the results is the order of the elements and a rejection stops the mapping.
32
+ * @evidence contracts/common.md#clear-and-simple-design One loop.
33
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts No element is skipped or retried.
34
+ * @evidence contracts/common.md#meaningful-documentation The comment states the sequential order.
35
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation ArrayUtil.asyncMap operates on caller-supplied arrays and promises without resolving file identity or launching a process; callback boundaries remain the caller's responsibility.
36
+ */
8
37
  export async function asyncMap<X, Y>(
9
38
  array: X[],
10
39
  closure: (input: X) => Promise<Y>,
@@ -13,14 +42,4 @@ export namespace ArrayUtil {
13
42
  for (const elem of array) ret.push(await closure(elem));
14
43
  return ret;
15
44
  }
16
-
17
- export async function asyncFilter<T>(
18
- array: T[],
19
- closure: (input: T) => Promise<boolean>,
20
- ): Promise<T[]> {
21
- const ret: T[] = [];
22
- for (const elem of array)
23
- if ((await closure(elem)) === true) ret.push(elem);
24
- return ret;
25
- }
26
45
  }
@@ -1,14 +1,34 @@
1
+ import { parse } from "@babel/parser";
1
2
  import fs from "fs";
2
3
  import path from "path";
3
4
 
5
+ /**
6
+ * Patches JavaScript emitted into a temporary directory so that it loads as
7
+ * CommonJS.
8
+ *
9
+ * @evidence contracts/common.md#principled-implementation A compiler can keep `import.meta.url` in CommonJS output, and Node then detects the file as ESM before `require()` loads it, so the token is replaced by an expression that gives the same URL.
10
+ * @evidence contracts/common.md#clear-and-simple-design One public function collects emitted files and a JavaScript parser identifies import.meta.url expressions by their syntax nodes; source slices retain all unrelated text.
11
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The patch changes only the temporary emit. The parser reads JavaScript grammar, so regular expressions after control-flow statements and property names resembling import.meta.url remain untouched; no previous-token approximation substitutes for parsing.
12
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
13
+ * @evidence contracts/portability.md#os-neutral-implementation Entries are listed with `readdir` and joined with `path.join`; only regular `.js` and `.cjs` files, named case-insensitively, are read and rewritten as UTF-8, and symbolic links and other entry kinds are left alone. The replacement derives the file URL with `url.pathToFileURL(__filename)`, the platform's own conversion, so drive letters, UNC paths and percent-encoding follow the rules of `import.meta.url`. The text outside the token, line endings included, is preserved.
14
+ */
4
15
  export namespace EmittedJavaScriptPatcher {
16
+ /**
17
+ * Replaces every `import.meta.url` in the `.js` and `.cjs` files under a
18
+ * directory with `require("url").pathToFileURL(__filename).href`.
19
+ *
20
+ * @evidence contracts/common.md#principled-implementation The parser selects only a non-computed url property whose object is the import.meta meta-property, including spaced expressions and template substitutions. Literal and comment text is never an expression node, and the replacement derives the executing CommonJS file URL.
21
+ * @evidence contracts/common.md#clear-and-simple-design One function collects files and delegates expression detection to the JavaScript grammar parser.
22
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It patches only files that contain the token.
23
+ * @evidence contracts/common.md#meaningful-documentation The comment states the replacement and the scope.
24
+ * @evidence contracts/portability.md#os-neutral-implementation Files are read and rewritten concurrently without locking, one pending operation per file, so the caller must be the only writer of the directory, as it is for its own temporary emit.
25
+ */
5
26
  export const importMetaUrl = async (root: string): Promise<void> => {
6
27
  const files: string[] = await collect(root);
7
28
  await Promise.all(files.map(patch));
8
29
  };
9
30
  }
10
31
 
11
- const TARGET = "import.meta.url";
12
32
  // TypeScript can preserve this token even in CommonJS output. Node 24 then
13
33
  // syntax-detects the temporary `.js` file as ESM before require() can load it.
14
34
  const REPLACEMENT = 'require("url").pathToFileURL(__filename).href';
@@ -30,59 +50,62 @@ const collect = async (location: string): Promise<string[]> => {
30
50
 
31
51
  const patch = async (file: string): Promise<void> => {
32
52
  const before: string = await fs.promises.readFile(file, "utf8");
33
- if (before.includes(TARGET) === false) return;
53
+ if (before.includes("import") === false) return;
34
54
 
35
55
  const after: string = replaceImportMetaUrl(before);
36
56
  if (after !== before) await fs.promises.writeFile(file, after, "utf8");
37
57
  };
38
58
 
59
+ // Parse module expressions without imposing module strictness: TypeScript may preserve
60
+ // import.meta in otherwise CommonJS output. Top-level return is valid inside
61
+ // Node's CommonJS wrapper. The parser, rather than token context guesses, owns
62
+ // the distinction between regular expressions, divisions and property names.
39
63
  const replaceImportMetaUrl = (input: string): string => {
40
- let output: string = "";
41
- let cursor: number = 0;
42
- for (let i = 0; i < input.length; ) {
43
- if (isTarget(input, i)) {
44
- output += input.slice(cursor, i);
45
- output += REPLACEMENT;
46
- i += TARGET.length;
47
- cursor = i;
48
- continue;
64
+ const root = parse(input, {
65
+ sourceType: "module",
66
+ strictMode: false,
67
+ attachComment: false,
68
+ allowImportExportEverywhere: true,
69
+ allowReturnOutsideFunction: true,
70
+ allowAwaitOutsideFunction: true,
71
+ });
72
+ const spans: Array<{ start: number; end: number }> = [];
73
+ const pending: Array<{
74
+ type: string;
75
+ start?: number | null;
76
+ end?: number | null;
77
+ }> = [root];
78
+ while (pending.length !== 0) {
79
+ const node = pending.pop()! as Record<string, any>;
80
+ if (
81
+ node.type === "MemberExpression" &&
82
+ node.computed === false &&
83
+ node.property?.type === "Identifier" &&
84
+ node.property.name === "url" &&
85
+ node.object?.type === "MetaProperty" &&
86
+ node.object.meta.name === "import" &&
87
+ node.object.property.name === "meta"
88
+ )
89
+ spans.push({ start: node.start, end: node.end });
90
+ for (const value of Object.values(node)) {
91
+ if (Array.isArray(value)) {
92
+ for (const child of value)
93
+ if (child && typeof child.type === "string") pending.push(child);
94
+ } else if (
95
+ value &&
96
+ typeof value === "object" &&
97
+ typeof value.type === "string"
98
+ )
99
+ pending.push(value);
49
100
  }
50
-
51
- const ch: string = input[i]!;
52
- const next: string | undefined = input[i + 1];
53
- if (ch === '"' || ch === "'") i = skipQuoted(input, i, ch);
54
- else if (ch === "/" && next === "/") i = skipLineComment(input, i);
55
- else if (ch === "/" && next === "*") i = skipBlockComment(input, i);
56
- else ++i;
57
101
  }
58
- return output + input.slice(cursor);
59
- };
60
-
61
- const isTarget = (input: string, index: number): boolean =>
62
- input.startsWith(TARGET, index) &&
63
- isBoundary(input[index - 1]) &&
64
- isBoundary(input[index + TARGET.length]);
65
-
66
- const isBoundary = (ch: string | undefined): boolean =>
67
- ch === undefined || /[^A-Za-z0-9_$]/.test(ch);
68
-
69
- const skipQuoted = (input: string, index: number, quote: string): number => {
70
- let escaped: boolean = false;
71
- for (let i = index + 1; i < input.length; ++i) {
72
- const ch: string = input[i]!;
73
- if (escaped) escaped = false;
74
- else if (ch === "\\") escaped = true;
75
- else if (ch === quote) return i + 1;
102
+ spans.sort((a, b) => a.start - b.start);
103
+ const pieces: string[] = [];
104
+ let cursor = 0;
105
+ for (const span of spans) {
106
+ pieces.push(input.slice(cursor, span.start), REPLACEMENT);
107
+ cursor = span.end;
76
108
  }
77
- return input.length;
78
- };
79
-
80
- const skipLineComment = (input: string, index: number): number => {
81
- const found: number = input.indexOf("\n", index + 2);
82
- return found === -1 ? input.length : found + 1;
83
- };
84
-
85
- const skipBlockComment = (input: string, index: number): number => {
86
- const found: number = input.indexOf("*/", index + 2);
87
- return found === -1 ? input.length : found + 2;
109
+ pieces.push(input.slice(cursor));
110
+ return pieces.join("");
88
111
  };
@@ -1,7 +1,26 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
3
 
4
+ /**
5
+ * Finds a file or a directory by name, in a directory and up to three parents.
6
+ *
7
+ * @evidence contracts/common.md#principled-implementation The search checks a directory and then goes to its parent, at most three levels up, which is where a project's own files are expected.
8
+ * @evidence contracts/common.md#clear-and-simple-design Two curried functions with the same recursion.
9
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The limit is a fixed search depth, not a file name.
10
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
11
+ * @evidence contracts/portability.md#os-neutral-implementation Names are joined to directories with `path.join` and tested with `existsSync`, so the volume decides what a name matches and under which case policy. The parent is `path.join(dir, "..")`, which stays at a filesystem root, and the depth counter bounds the climb, so no drive letter or separator test is needed. Directories are returned as joined, not canonicalized, so equal locations reached through links or a different case may compare unequal.
12
+ */
4
13
  export namespace FileRetriever {
14
+ /**
15
+ * Returns the nearest directory, from the given one up to three parents, that
16
+ * contains an entry with the name, or `null`.
17
+ *
18
+ * @evidence contracts/common.md#principled-implementation The recursion is bounded by the depth counter, so it terminates at the filesystem root as well.
19
+ * @evidence contracts/common.md#clear-and-simple-design One function.
20
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The bound is explicit.
21
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result.
22
+ * @evidence contracts/portability.md#os-neutral-implementation The result is the directory as the caller spelled it joined with `..` steps; the existence test of the named entry alone decides, under the filesystem's own case policy.
23
+ */
5
24
  export const directory =
6
25
  (name: string) =>
7
26
  (dir: string, depth: number = 0): string | null => {
@@ -11,6 +30,16 @@ export namespace FileRetriever {
11
30
  return directory(name)(path.join(dir, ".."), depth + 1);
12
31
  };
13
32
 
33
+ /**
34
+ * Returns the path of the nearest existing entry with the name, from the
35
+ * given directory up to three parents, or `null`.
36
+ *
37
+ * @evidence contracts/common.md#principled-implementation The recursion is bounded by the depth counter.
38
+ * @evidence contracts/common.md#clear-and-simple-design One function.
39
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The bound is explicit.
40
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result.
41
+ * @evidence contracts/portability.md#os-neutral-implementation The result is the native path of the entry as joined, found by the filesystem's own existence test and not canonicalized.
42
+ */
14
43
  export const file =
15
44
  (name: string) =>
16
45
  (directory: string, depth: number = 0): string | null => {
@@ -1,4 +1,23 @@
1
+ /**
2
+ * Classifies the content type of a response.
3
+ *
4
+ * @evidence contracts/common.md#principled-implementation The namespace decides which content types the SDK supports and which are binary.
5
+ * @evidence contracts/common.md#clear-and-simple-design One type and two predicates.
6
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The list is media types, not routes.
7
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
8
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation HttpResponseContentTypeUtil classifies HTTP response metadata and MIME types, which have protocol semantics independent of the native filesystem.
9
+ */
1
10
  export namespace HttpResponseContentTypeUtil {
11
+ /**
12
+ * A response content type: JSON, text, urlencoded, another string, or `null`
13
+ * for no body.
14
+ *
15
+ * @evidence contracts/common.md#principled-implementation The union keeps the common types visible while allowing any other string.
16
+ * @evidence contracts/common.md#clear-and-simple-design One union.
17
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts It is a type and adds no runtime behavior.
18
+ * @evidence contracts/common.md#meaningful-documentation The comment names the cases.
19
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation HttpResponseContentTypeUtil.Response classifies HTTP response metadata and MIME types, which have protocol semantics independent of the native filesystem.
20
+ */
2
21
  export type Response =
3
22
  | "application/json"
4
23
  | "text/plain"
@@ -6,6 +25,16 @@ export namespace HttpResponseContentTypeUtil {
6
25
  | (string & {})
7
26
  | null;
8
27
 
28
+ /**
29
+ * Reports whether the SDK supports the content type: none, JSON, plain text,
30
+ * urlencoded, or a binary type.
31
+ *
32
+ * @evidence contracts/common.md#principled-implementation The content type is compared exactly for the three text types and by the binary rule otherwise.
33
+ * @evidence contracts/common.md#clear-and-simple-design One expression.
34
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The list is the supported set.
35
+ * @evidence contracts/common.md#meaningful-documentation The comment lists the supported types.
36
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation HttpResponseContentTypeUtil.isSupported classifies HTTP response metadata and MIME types, which have protocol semantics independent of the native filesystem.
37
+ */
9
38
  export const isSupported = (input: string | null): input is Response =>
10
39
  input === null ||
11
40
  input === "application/json" ||
@@ -13,6 +42,18 @@ export namespace HttpResponseContentTypeUtil {
13
42
  input === "application/x-www-form-urlencoded" ||
14
43
  isBinary(input);
15
44
 
45
+ /**
46
+ * Reports whether the content type is binary: an image, video, or audio type,
47
+ * an octet stream, or a PDF.
48
+ *
49
+ * Parameters and case are ignored.
50
+ *
51
+ * @evidence contracts/common.md#principled-implementation The type is the text before the first `;`, trimmed and lower-cased, as HTTP defines a media type.
52
+ * @evidence contracts/common.md#clear-and-simple-design One predicate.
53
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rule is a list of media types.
54
+ * @evidence contracts/common.md#meaningful-documentation The comment states the binary types and the normalization.
55
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation HttpResponseContentTypeUtil.isBinary classifies HTTP response metadata and MIME types, which have protocol semantics independent of the native filesystem.
56
+ */
16
57
  export const isBinary = (
17
58
  input: string | null | undefined,
18
59
  ): input is string => {