@nestia/sdk 14.0.1 → 14.0.3

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 (377) hide show
  1. package/assets/bundle/distribute/build-sdk.cjs +28 -0
  2. package/assets/bundle/distribute/package.json +6 -2
  3. package/lib/INestiaConfig.d.ts +55 -24
  4. package/lib/NestiaSdkApplication.d.ts +60 -0
  5. package/lib/NestiaSdkApplication.js +63 -5
  6. package/lib/NestiaSdkApplication.js.map +1 -1
  7. package/lib/NestiaSwaggerComposer.d.ts +21 -0
  8. package/lib/NestiaSwaggerComposer.js +21 -3
  9. package/lib/NestiaSwaggerComposer.js.map +1 -1
  10. package/lib/analyses/AccessorAnalyzer.d.ts +26 -0
  11. package/lib/analyses/AccessorAnalyzer.js +26 -0
  12. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  13. package/lib/analyses/ConfigAnalyzer.d.ts +41 -0
  14. package/lib/analyses/ConfigAnalyzer.js +57 -80
  15. package/lib/analyses/ConfigAnalyzer.js.map +1 -1
  16. package/lib/analyses/ImportAnalyzer.d.ts +25 -0
  17. package/lib/analyses/ImportAnalyzer.js +25 -0
  18. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  19. package/lib/analyses/ParameterNameAnalyzer.d.ts +24 -0
  20. package/lib/analyses/ParameterNameAnalyzer.js +15 -0
  21. package/lib/analyses/ParameterNameAnalyzer.js.map +1 -1
  22. package/lib/analyses/PathAnalyzer.d.ts +63 -1
  23. package/lib/analyses/PathAnalyzer.js +54 -9
  24. package/lib/analyses/PathAnalyzer.js.map +1 -1
  25. package/lib/analyses/ReflectControllerAnalyzer.d.ts +32 -0
  26. package/lib/analyses/ReflectControllerAnalyzer.js +22 -0
  27. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  28. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +29 -0
  29. package/lib/analyses/ReflectHttpOperationAnalyzer.js +28 -17
  30. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  31. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.d.ts +31 -0
  32. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +21 -0
  33. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
  34. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.d.ts +31 -0
  35. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +21 -0
  36. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  37. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +32 -0
  38. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +22 -0
  39. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  40. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +29 -0
  41. package/lib/analyses/ReflectMcpOperationAnalyzer.js +30 -9
  42. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -1
  43. package/lib/analyses/ReflectMetadataAnalyzer.d.ts +47 -0
  44. package/lib/analyses/ReflectMetadataAnalyzer.js +47 -0
  45. package/lib/analyses/ReflectMetadataAnalyzer.js.map +1 -1
  46. package/lib/analyses/ReflectWebSocketOperationAnalyzer.d.ts +29 -0
  47. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +22 -5
  48. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
  49. package/lib/analyses/SecurityAnalyzer.d.ts +15 -0
  50. package/lib/analyses/SecurityAnalyzer.js +15 -0
  51. package/lib/analyses/SecurityAnalyzer.js.map +1 -1
  52. package/lib/analyses/SwaggerExampleAnalyzer.d.ts +16 -0
  53. package/lib/analyses/SwaggerExampleAnalyzer.js +16 -0
  54. package/lib/analyses/SwaggerExampleAnalyzer.js.map +1 -1
  55. package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +41 -3
  56. package/lib/analyses/TypedHttpRouteAnalyzer.js +172 -157
  57. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  58. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +29 -0
  59. package/lib/analyses/TypedMcpRouteAnalyzer.js +152 -20
  60. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -1
  61. package/lib/analyses/TypedWebSocketRouteAnalyzer.d.ts +19 -0
  62. package/lib/analyses/TypedWebSocketRouteAnalyzer.js +19 -0
  63. package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
  64. package/lib/decorators/OperationMetadata.d.ts +6 -0
  65. package/lib/decorators/OperationMetadata.js +6 -0
  66. package/lib/decorators/OperationMetadata.js.map +1 -1
  67. package/lib/executable/internal/CommandParser.d.ts +19 -0
  68. package/lib/executable/internal/CommandParser.js +19 -0
  69. package/lib/executable/internal/CommandParser.js.map +1 -1
  70. package/lib/executable/internal/NestiaConfigLoader.d.ts +56 -0
  71. package/lib/executable/internal/NestiaConfigLoader.js +48 -42
  72. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  73. package/lib/executable/internal/NestiaSdkCommand.d.ts +60 -0
  74. package/lib/executable/internal/NestiaSdkCommand.js +95 -3
  75. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  76. package/lib/executable/internal/NestiaSdkWatcher.d.ts +81 -0
  77. package/lib/executable/internal/NestiaSdkWatcher.js +122 -38
  78. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -1
  79. package/lib/executable/internal/NestiaSwaggerWatch.d.ts +80 -0
  80. package/lib/executable/internal/NestiaSwaggerWatch.js +308 -0
  81. package/lib/executable/internal/NestiaSwaggerWatch.js.map +1 -0
  82. package/lib/factories/ExpressionFactory.d.ts +17 -2
  83. package/lib/factories/ExpressionFactory.js +17 -2
  84. package/lib/factories/ExpressionFactory.js.map +1 -1
  85. package/lib/factories/IdentifierFactory.d.ts +24 -0
  86. package/lib/factories/IdentifierFactory.js +24 -0
  87. package/lib/factories/IdentifierFactory.js.map +1 -1
  88. package/lib/factories/LiteralFactory.d.ts +22 -4
  89. package/lib/factories/LiteralFactory.js +30 -10
  90. package/lib/factories/LiteralFactory.js.map +1 -1
  91. package/lib/factories/StatementFactory.d.ts +28 -1
  92. package/lib/factories/StatementFactory.js +28 -1
  93. package/lib/factories/StatementFactory.js.map +1 -1
  94. package/lib/factories/TypeFactory.d.ts +24 -0
  95. package/lib/factories/TypeFactory.js +15 -0
  96. package/lib/factories/TypeFactory.js.map +1 -1
  97. package/lib/generates/CloneGenerator.d.ts +22 -0
  98. package/lib/generates/CloneGenerator.js +26 -5
  99. package/lib/generates/CloneGenerator.js.map +1 -1
  100. package/lib/generates/E2eGenerator.d.ts +19 -0
  101. package/lib/generates/E2eGenerator.js +19 -0
  102. package/lib/generates/E2eGenerator.js.map +1 -1
  103. package/lib/generates/SdkGenerator.d.ts +38 -0
  104. package/lib/generates/SdkGenerator.js +40 -2
  105. package/lib/generates/SdkGenerator.js.map +1 -1
  106. package/lib/generates/SwaggerGenerator.d.ts +36 -6
  107. package/lib/generates/SwaggerGenerator.js +55 -13
  108. package/lib/generates/SwaggerGenerator.js.map +1 -1
  109. package/lib/generates/internal/E2eFileProgrammer.d.ts +19 -0
  110. package/lib/generates/internal/E2eFileProgrammer.js +20 -1
  111. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  112. package/lib/generates/internal/FilePrinter.d.ts +43 -0
  113. package/lib/generates/internal/FilePrinter.js +43 -0
  114. package/lib/generates/internal/FilePrinter.js.map +1 -1
  115. package/lib/generates/internal/ImportDictionary.d.ts +92 -2
  116. package/lib/generates/internal/ImportDictionary.js +91 -3
  117. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  118. package/lib/generates/internal/SdkAliasCollection.d.ts +119 -0
  119. package/lib/generates/internal/SdkAliasCollection.js +124 -7
  120. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  121. package/lib/generates/internal/SdkDistributionComposer.d.ts +19 -0
  122. package/lib/generates/internal/SdkDistributionComposer.js +98 -59
  123. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  124. package/lib/generates/internal/SdkFileProgrammer.d.ts +18 -0
  125. package/lib/generates/internal/SdkFileProgrammer.js +18 -0
  126. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  127. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +29 -0
  128. package/lib/generates/internal/SdkHttpCloneProgrammer.js +33 -0
  129. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  130. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +19 -0
  131. package/lib/generates/internal/SdkHttpCloneReferencer.js +78 -25
  132. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  133. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +19 -0
  134. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +19 -0
  135. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  136. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +19 -0
  137. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +19 -0
  138. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  139. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +104 -2
  140. package/lib/generates/internal/SdkHttpParameterProgrammer.js +70 -0
  141. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  142. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +20 -0
  143. package/lib/generates/internal/SdkHttpRouteProgrammer.js +20 -0
  144. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  145. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +38 -0
  146. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +49 -5
  147. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  148. package/lib/generates/internal/SdkImportWizard.d.ts +63 -0
  149. package/lib/generates/internal/SdkImportWizard.js +63 -0
  150. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  151. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +17 -2
  152. package/lib/generates/internal/SdkMcpRouteProgrammer.js +33 -13
  153. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -1
  154. package/lib/generates/internal/SdkPathTemplate.d.ts +15 -0
  155. package/lib/generates/internal/SdkPathTemplate.js +15 -0
  156. package/lib/generates/internal/SdkPathTemplate.js.map +1 -1
  157. package/lib/generates/internal/SdkRouteDirectory.d.ts +10 -0
  158. package/lib/generates/internal/SdkRouteDirectory.js +10 -0
  159. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  160. package/lib/generates/internal/SdkTypeProgrammer.d.ts +54 -1
  161. package/lib/generates/internal/SdkTypeProgrammer.js +96 -12
  162. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  163. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +36 -3
  164. package/lib/generates/internal/SdkTypeTagProgrammer.js +28 -7
  165. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  166. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +40 -0
  167. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +149 -142
  168. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -1
  169. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +19 -0
  170. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +19 -0
  171. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  172. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +81 -2
  173. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +48 -0
  174. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  175. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +18 -0
  176. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +18 -0
  177. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  178. package/lib/generates/internal/SwaggerDescriptionComposer.d.ts +42 -0
  179. package/lib/generates/internal/SwaggerDescriptionComposer.js +44 -1
  180. package/lib/generates/internal/SwaggerDescriptionComposer.js.map +1 -1
  181. package/lib/generates/internal/SwaggerOperationComposer.d.ts +18 -0
  182. package/lib/generates/internal/SwaggerOperationComposer.js +18 -0
  183. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  184. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +39 -0
  185. package/lib/generates/internal/SwaggerOperationParameterComposer.js +31 -8
  186. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  187. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +19 -0
  188. package/lib/generates/internal/SwaggerOperationResponseComposer.js +19 -0
  189. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  190. package/lib/internal/legacy.d.ts +296 -16
  191. package/lib/internal/legacy.js +127 -10
  192. package/lib/internal/legacy.js.map +1 -1
  193. package/lib/structures/INestiaProject.d.ts +10 -0
  194. package/lib/structures/INestiaSdkInput.d.ts +31 -1
  195. package/lib/structures/IOperationMetadata.d.ts +55 -0
  196. package/lib/structures/IReflectController.d.ts +11 -1
  197. package/lib/structures/IReflectHttpOperation.d.ts +11 -1
  198. package/lib/structures/IReflectHttpOperationException.d.ts +10 -0
  199. package/lib/structures/IReflectHttpOperationParameter.d.ts +47 -0
  200. package/lib/structures/IReflectHttpOperationSuccess.d.ts +11 -0
  201. package/lib/structures/IReflectImport.d.ts +10 -0
  202. package/lib/structures/IReflectMcpOperation.d.ts +19 -0
  203. package/lib/structures/IReflectMcpOperationParameter.d.ts +9 -0
  204. package/lib/structures/IReflectOperationError.d.ts +28 -0
  205. package/lib/structures/IReflectOperationError.js +22 -2
  206. package/lib/structures/IReflectOperationError.js.map +1 -1
  207. package/lib/structures/IReflectType.d.ts +9 -0
  208. package/lib/structures/IReflectWebSocketOperation.d.ts +10 -0
  209. package/lib/structures/IReflectWebSocketOperationParameter.d.ts +55 -0
  210. package/lib/structures/ITypedApplication.d.ts +10 -0
  211. package/lib/structures/ITypedHttpRoute.d.ts +10 -0
  212. package/lib/structures/ITypedHttpRouteException.d.ts +10 -0
  213. package/lib/structures/ITypedHttpRouteParameter.d.ts +45 -0
  214. package/lib/structures/ITypedHttpRouteSuccess.d.ts +10 -0
  215. package/lib/structures/ITypedMcpRoute.d.ts +11 -0
  216. package/lib/structures/ITypedWebSocketRoute.d.ts +10 -0
  217. package/lib/transform.d.ts +6 -0
  218. package/lib/transform.js +6 -0
  219. package/lib/transform.js.map +1 -1
  220. package/lib/utils/ArrayUtil.d.ts +31 -1
  221. package/lib/utils/ArrayUtil.js +32 -11
  222. package/lib/utils/ArrayUtil.js.map +1 -1
  223. package/lib/utils/EmittedJavaScriptPatcher.d.ts +20 -0
  224. package/lib/utils/EmittedJavaScriptPatcher.js +65 -46
  225. package/lib/utils/EmittedJavaScriptPatcher.js.map +1 -1
  226. package/lib/utils/FileRetriever.d.ts +29 -0
  227. package/lib/utils/FileRetriever.js +29 -0
  228. package/lib/utils/FileRetriever.js.map +1 -1
  229. package/lib/utils/HttpResponseContentTypeUtil.d.ts +41 -0
  230. package/lib/utils/HttpResponseContentTypeUtil.js +31 -0
  231. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -1
  232. package/lib/utils/MapUtil.d.ts +64 -1
  233. package/lib/utils/MapUtil.js +24 -3
  234. package/lib/utils/MapUtil.js.map +1 -1
  235. package/lib/utils/PathUtil.d.ts +31 -0
  236. package/lib/utils/PathUtil.js +38 -0
  237. package/lib/utils/PathUtil.js.map +1 -1
  238. package/lib/utils/SdkBundlePath.d.ts +2 -0
  239. package/lib/utils/SdkBundlePath.js +10 -0
  240. package/lib/utils/SdkBundlePath.js.map +1 -0
  241. package/lib/utils/SdkInputFilter.d.ts +31 -0
  242. package/lib/utils/SdkInputFilter.js +115 -0
  243. package/lib/utils/SdkInputFilter.js.map +1 -0
  244. package/lib/utils/SourceFinder.d.ts +35 -0
  245. package/lib/utils/SourceFinder.js +47 -12
  246. package/lib/utils/SourceFinder.js.map +1 -1
  247. package/lib/utils/StringUtil.d.ts +77 -2
  248. package/lib/utils/StringUtil.js +166 -4
  249. package/lib/utils/StringUtil.js.map +1 -1
  250. package/lib/utils/TemporaryDirectory.d.ts +60 -0
  251. package/lib/utils/TemporaryDirectory.js +112 -0
  252. package/lib/utils/TemporaryDirectory.js.map +1 -0
  253. package/lib/utils/TsConfigReader.d.ts +42 -0
  254. package/lib/utils/TsConfigReader.js +98 -14
  255. package/lib/utils/TsConfigReader.js.map +1 -1
  256. package/lib/utils/TtscExecutor.d.ts +23 -1
  257. package/lib/utils/TtscExecutor.js +22 -0
  258. package/lib/utils/TtscExecutor.js.map +1 -1
  259. package/lib/utils/VersioningStrategy.d.ts +27 -2
  260. package/lib/utils/VersioningStrategy.js +30 -9
  261. package/lib/utils/VersioningStrategy.js.map +1 -1
  262. package/lib/validators/TextPlainValidator.d.ts +19 -0
  263. package/lib/validators/TextPlainValidator.js +19 -0
  264. package/lib/validators/TextPlainValidator.js.map +1 -1
  265. package/native/go.mod +1 -1
  266. package/native/go.sum +2 -2
  267. package/native/sdk/register.go +12 -2
  268. package/native/sdk/sdk_metadata_json.go +6 -1
  269. package/native/sdk/sdk_transform.go +393 -403
  270. package/package.json +9 -7
  271. package/src/INestiaConfig.ts +55 -24
  272. package/src/NestiaSdkApplication.ts +66 -7
  273. package/src/NestiaSwaggerComposer.ts +21 -6
  274. package/src/analyses/AccessorAnalyzer.ts +26 -0
  275. package/src/analyses/ConfigAnalyzer.ts +59 -96
  276. package/src/analyses/ImportAnalyzer.ts +25 -0
  277. package/src/analyses/ParameterNameAnalyzer.ts +24 -0
  278. package/src/analyses/PathAnalyzer.ts +63 -11
  279. package/src/analyses/ReflectControllerAnalyzer.ts +32 -0
  280. package/src/analyses/ReflectHttpOperationAnalyzer.ts +32 -10
  281. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +31 -0
  282. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +31 -0
  283. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +32 -0
  284. package/src/analyses/ReflectMcpOperationAnalyzer.ts +32 -1
  285. package/src/analyses/ReflectMetadataAnalyzer.ts +48 -1
  286. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +34 -14
  287. package/src/analyses/SecurityAnalyzer.ts +15 -0
  288. package/src/analyses/SwaggerExampleAnalyzer.ts +16 -0
  289. package/src/analyses/TypedHttpRouteAnalyzer.ts +240 -184
  290. package/src/analyses/TypedMcpRouteAnalyzer.ts +180 -20
  291. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +19 -0
  292. package/src/decorators/OperationMetadata.ts +6 -0
  293. package/src/executable/internal/CommandParser.ts +19 -0
  294. package/src/executable/internal/NestiaConfigLoader.ts +66 -50
  295. package/src/executable/internal/NestiaSdkCommand.ts +96 -3
  296. package/src/executable/internal/NestiaSdkWatcher.ts +169 -41
  297. package/src/executable/internal/NestiaSwaggerWatch.ts +359 -0
  298. package/src/factories/ExpressionFactory.ts +17 -2
  299. package/src/factories/IdentifierFactory.ts +24 -0
  300. package/src/factories/LiteralFactory.ts +44 -11
  301. package/src/factories/StatementFactory.ts +28 -1
  302. package/src/factories/TypeFactory.ts +24 -0
  303. package/src/generates/CloneGenerator.ts +26 -5
  304. package/src/generates/E2eGenerator.ts +19 -0
  305. package/src/generates/SdkGenerator.ts +40 -9
  306. package/src/generates/SwaggerGenerator.ts +56 -14
  307. package/src/generates/internal/E2eFileProgrammer.ts +20 -0
  308. package/src/generates/internal/FilePrinter.ts +43 -0
  309. package/src/generates/internal/ImportDictionary.ts +110 -3
  310. package/src/generates/internal/SdkAliasCollection.ts +133 -11
  311. package/src/generates/internal/SdkDistributionComposer.ts +117 -66
  312. package/src/generates/internal/SdkFileProgrammer.ts +18 -0
  313. package/src/generates/internal/SdkHttpCloneProgrammer.ts +55 -0
  314. package/src/generates/internal/SdkHttpCloneReferencer.ts +97 -23
  315. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +19 -0
  316. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +19 -0
  317. package/src/generates/internal/SdkHttpParameterProgrammer.ts +104 -2
  318. package/src/generates/internal/SdkHttpRouteProgrammer.ts +20 -0
  319. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +72 -5
  320. package/src/generates/internal/SdkImportWizard.ts +63 -0
  321. package/src/generates/internal/SdkMcpRouteProgrammer.ts +38 -18
  322. package/src/generates/internal/SdkPathTemplate.ts +15 -0
  323. package/src/generates/internal/SdkRouteDirectory.ts +10 -0
  324. package/src/generates/internal/SdkTypeProgrammer.ts +118 -14
  325. package/src/generates/internal/SdkTypeTagProgrammer.ts +37 -7
  326. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +185 -142
  327. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +19 -0
  328. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +81 -2
  329. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +18 -0
  330. package/src/generates/internal/SwaggerDescriptionComposer.ts +47 -1
  331. package/src/generates/internal/SwaggerOperationComposer.ts +18 -0
  332. package/src/generates/internal/SwaggerOperationParameterComposer.ts +41 -8
  333. package/src/generates/internal/SwaggerOperationResponseComposer.ts +19 -0
  334. package/src/internal/legacy-augmentation.d.ts +16 -0
  335. package/src/internal/legacy.ts +296 -26
  336. package/src/structures/INestiaProject.ts +10 -0
  337. package/src/structures/INestiaSdkInput.ts +31 -1
  338. package/src/structures/IOperationMetadata.ts +55 -0
  339. package/src/structures/IReflectController.ts +11 -1
  340. package/src/structures/IReflectHttpOperation.ts +11 -1
  341. package/src/structures/IReflectHttpOperationException.ts +10 -0
  342. package/src/structures/IReflectHttpOperationParameter.ts +47 -0
  343. package/src/structures/IReflectHttpOperationSuccess.ts +11 -0
  344. package/src/structures/IReflectImport.ts +10 -0
  345. package/src/structures/IReflectMcpOperation.ts +19 -0
  346. package/src/structures/IReflectMcpOperationParameter.ts +9 -0
  347. package/src/structures/IReflectOperationError.ts +31 -2
  348. package/src/structures/IReflectType.ts +9 -0
  349. package/src/structures/IReflectWebSocketOperation.ts +10 -0
  350. package/src/structures/IReflectWebSocketOperationParameter.ts +55 -0
  351. package/src/structures/ITypedApplication.ts +10 -0
  352. package/src/structures/ITypedHttpRoute.ts +10 -0
  353. package/src/structures/ITypedHttpRouteException.ts +10 -0
  354. package/src/structures/ITypedHttpRouteParameter.ts +45 -0
  355. package/src/structures/ITypedHttpRouteSuccess.ts +10 -0
  356. package/src/structures/ITypedMcpRoute.ts +12 -0
  357. package/src/structures/ITypedWebSocketRoute.ts +10 -0
  358. package/src/transform.ts +6 -0
  359. package/src/utils/ArrayUtil.ts +32 -13
  360. package/src/utils/EmittedJavaScriptPatcher.ts +70 -47
  361. package/src/utils/FileRetriever.ts +29 -0
  362. package/src/utils/HttpResponseContentTypeUtil.ts +41 -0
  363. package/src/utils/MapUtil.ts +68 -3
  364. package/src/utils/PathUtil.ts +38 -0
  365. package/src/utils/SdkBundlePath.ts +11 -0
  366. package/src/utils/SdkInputFilter.ts +108 -0
  367. package/src/utils/SourceFinder.ts +51 -14
  368. package/src/utils/StringUtil.ts +182 -5
  369. package/src/utils/TemporaryDirectory.ts +108 -0
  370. package/src/utils/TsConfigReader.ts +124 -26
  371. package/src/utils/TtscExecutor.ts +23 -1
  372. package/src/utils/VersioningStrategy.ts +37 -14
  373. package/src/validators/TextPlainValidator.ts +19 -0
  374. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +0 -9
  375. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +0 -178
  376. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +0 -1
  377. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +0 -264
@@ -8,15 +8,16 @@ import (
8
8
  "os"
9
9
  "path/filepath"
10
10
  "reflect"
11
- "regexp"
12
11
  "sort"
13
12
  "strconv"
14
13
  "strings"
15
14
 
16
15
  shimast "github.com/microsoft/typescript-go/shim/ast"
17
16
  shimchecker "github.com/microsoft/typescript-go/shim/checker"
17
+ shimprinter "github.com/microsoft/typescript-go/shim/printer"
18
18
  shimscanner "github.com/microsoft/typescript-go/shim/scanner"
19
19
  "github.com/samchon/nestia/packages/core/native/transform"
20
+ "github.com/samchon/nestia/packages/core/native/transform/schemaprojection"
20
21
  "github.com/samchon/ttsc/packages/ttsc/driver"
21
22
  nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
22
23
  nativefactories "github.com/samchon/typia/packages/typia/native/core/factories"
@@ -188,22 +189,22 @@ func nestiaSDKMetadataText(context *nestiaSDKContext, file *shimast.SourceFile,
188
189
  return nestiaSDKMetadataLiteralText(metadata)
189
190
  }
190
191
 
191
- const nestiaSDKLiteralNull = "__NESTIA_LITERAL_NULL__"
192
+ // An explicit JSON null must have a distinct Go representation from authored
193
+ // strings, including strings that happen to resemble an internal marker.
194
+ var nestiaSDKLiteralNull = nativefactories.LiteralFactory_Null{}
192
195
 
193
196
  func nestiaSDKMetadataLiteralText(metadata map[string]any) (string, error) {
194
197
  data, err := json.Marshal(nestiaSDKFiniteLiteral(metadata))
195
198
  if err != nil {
196
199
  return "", err
197
200
  }
198
- text := string(data)
199
- text = strings.ReplaceAll(text, `"`+nestiaSDKLiteralNull+`"`, "null")
200
- return text, nil
201
+ return string(data), nil
201
202
  }
202
203
 
203
204
  // nestiaSDKFiniteLiteral copies a metadata value for encoding/json, writing
204
205
  // every non-finite number as null, the way JavaScript's `JSON.stringify` does.
205
206
  //
206
- // typia hands over NaN and ±Infinity wherever a type or a comment spells one: a
207
+ // typia hands over NaN and positive or negative Infinity wherever a type or a comment spells one: a
207
208
  // numeric literal type such as `1e999`, a type tag argument such as
208
209
  // `tags.Minimum<1e999>`, and a JSDoc `@x-` extension whose text parses as
209
210
  // a float, which `NaN`, `Infinity`, and `inf` all do. encoding/json
@@ -717,43 +718,67 @@ func nestiaSDKNormalizeImportPath(fileName string, module string) string {
717
718
  return filepath.ToSlash(filepath.Join("node_modules", module))
718
719
  }
719
720
 
720
- func nestiaSDKReflectImports(name string, imports []nestiaSDKImportInfo) []any {
721
- prefixes := nestiaSDKTypePrefixes(name)
721
+ // nestiaSDKReflectImports collects imports from actual type references and
722
+ // typeof queries. Literal values, property names and template text do not bind
723
+ // imports, and named library types are classified by declaration provenance.
724
+ func nestiaSDKReflectImports(prog *driver.Program, node *shimast.Node, imports []nestiaSDKImportInfo) []any {
722
725
  output := []any{}
723
- seen := map[string]bool{}
724
- for _, imp := range imports {
725
- if nestiaSDKImportMatches(prefixes, imp) == false {
726
- continue
726
+ add := func(entity *shimast.Node) {
727
+ if entity == nil {
728
+ return
727
729
  }
728
- item := nestiaSDKImportLiteral(imp, prefixes)
729
- key := fmt.Sprintf("%v", item)
730
- if seen[key] {
731
- continue
730
+ root := entity
731
+ for root != nil && root.Kind == shimast.KindQualifiedName {
732
+ root = root.AsQualifiedName().Left
733
+ }
734
+ if root == nil || root.Kind != shimast.KindIdentifier {
735
+ return
736
+ }
737
+ prefix := root.Text()
738
+ if nestiaSDKIsTypeKeyword(prefix) {
739
+ return
732
740
  }
733
- seen[key] = true
734
- output = append(output, item)
741
+ if prog != nil && prog.Checker != nil {
742
+ symbol := prog.Checker.GetSymbolAtLocation(root)
743
+ if symbol != nil && symbol.Flags&shimast.SymbolFlagsAlias != 0 {
744
+ prefixes := map[string]bool{prefix: true}
745
+ for _, imp := range imports {
746
+ if nestiaSDKImportMatches(prefixes, imp) {
747
+ output = append(output, nestiaSDKImportLiteral(imp, prefixes))
748
+ }
749
+ }
750
+ return
751
+ }
752
+ }
753
+ output = append(output, nestiaSDKReflectTypeReferenceSymbolImport(prog, entity, nestiaSDKEntityNameText(entity))...)
735
754
  }
736
- return output
737
- }
738
-
739
- func nestiaSDKTypePrefixes(name string) map[string]bool {
740
- output := map[string]bool{}
741
- re := regexp.MustCompile(`[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*`)
742
- for _, match := range re.FindAllString(name, -1) {
743
- prefix := strings.Split(match, ".")[0]
744
- if nestiaSDKIsGlobalTypePrefix(prefix) == false {
745
- output[prefix] = true
755
+ var walk func(*shimast.Node)
756
+ walk = func(current *shimast.Node) {
757
+ if current == nil {
758
+ return
759
+ }
760
+ switch current.Kind {
761
+ case shimast.KindTypeReference:
762
+ add(current.AsTypeReferenceNode().TypeName)
763
+ case shimast.KindTypeQuery:
764
+ add(current.AsTypeQueryNode().ExprName)
746
765
  }
766
+ current.ForEachChild(func(child *shimast.Node) bool { walk(child); return false })
747
767
  }
748
- return output
768
+ if node != nil && (node.Kind == shimast.KindIdentifier || node.Kind == shimast.KindQualifiedName) {
769
+ add(node)
770
+ } else {
771
+ walk(node)
772
+ }
773
+ return nestiaSDKMergeImportLiterals(output)
749
774
  }
750
775
 
751
- func nestiaSDKIsGlobalTypePrefix(prefix string) bool {
776
+ // nestiaSDKIsTypeKeyword reports type spellings that cannot name an imported
777
+ // declaration. Library names such as Date and Array can be shadowed in a module.
778
+ func nestiaSDKIsTypeKeyword(prefix string) bool {
752
779
  switch prefix {
753
780
  case "any", "unknown", "never", "void", "null", "undefined",
754
- "string", "number", "boolean", "bigint", "symbol", "object",
755
- "Array", "ReadonlyArray", "Promise", "Record", "Partial", "Pick", "Omit",
756
- "Date", "File", "Blob", "Uint8Array", "ArrayBuffer", "Error":
781
+ "string", "number", "boolean", "bigint", "symbol", "object":
757
782
  return true
758
783
  default:
759
784
  return false
@@ -888,10 +913,10 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
888
913
  // JSON-schema representation (e.g. a `void` route return or a parameter
889
914
  // whose only members are functions). The legacy reader on the JS side
890
915
  // already treats a missing `jsonSchema` as "skip", so swallow the panic
891
- // and omit the field — the sdk generator falls back to its own derived
916
+ // and omit the field; the SDK generator falls back to its own derived
892
917
  // schema path. This must never mask a real bug, so re-raise anything we
893
918
  // don't recognize as a transformer error from the typia runtime.
894
- if baked := nestiaSDKTryBakeJsonSchema(prog, typeNode, result.Data, properties); baked != nil {
919
+ if baked := nestiaSDKTryBakeJsonSchema(prog, typ, context.collection, result.Data, properties, escape); baked != nil {
895
920
  metadataLiteral["jsonSchema"] = baked
896
921
  }
897
922
  data := map[string]any{
@@ -913,7 +938,7 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
913
938
  // nestiaSDKTryBakeJsonSchema runs `JsonSchemasProgrammer.WriteSchemas` for a
914
939
  // single metadata and returns the OpenAPI 3.1 schema literal. Returns nil
915
940
  // when typia signals the metadata has no JSON-schema representation (e.g.
916
- // `void` returns, function-only types) — the JS-side reader handles missing
941
+ // `void` returns, function-only types); the JS-side reader handles missing
917
942
  // `jsonSchema` fields. Any other panic is re-raised so real bugs surface.
918
943
  //
919
944
  // With `properties`, the literal also carries the schema of each property of
@@ -921,9 +946,11 @@ func nestiaSDKSchemaPipe(context *nestiaSDKContext, typ *shimchecker.Type, typeN
921
946
  // individual parameters (see `nestiaSDKPropertySchemas`).
922
947
  func nestiaSDKTryBakeJsonSchema(
923
948
  prog *driver.Program,
924
- typeNode *shimast.Node,
949
+ typ *shimchecker.Type,
950
+ registry *schemametadata.MetadataCollection,
925
951
  metadata *schemametadata.MetadataSchema,
926
952
  properties bool,
953
+ escape bool,
927
954
  ) (baked map[string]any) {
928
955
  defer func() {
929
956
  if r := recover(); r != nil {
@@ -934,6 +961,7 @@ func nestiaSDKTryBakeJsonSchema(
934
961
  panic(r)
935
962
  }
936
963
  }()
964
+ metadata = schemaprojection.Project(metadata)
937
965
  collection := nativejson.JsonSchemasProgrammer.WriteSchemas(struct {
938
966
  Version string
939
967
  Metadatas []*schemametadata.MetadataSchema
@@ -969,7 +997,7 @@ func nestiaSDKTryBakeJsonSchema(
969
997
  if propertySchemas != nil {
970
998
  baked["properties"] = propertySchemas
971
999
  }
972
- nestiaSDKMarkReadonlyArrayJsonSchema(prog, typeNode, baked)
1000
+ nestiaSDKMarkReadonlyArrayJsonSchema(prog, typ, baked, registry, escape)
973
1001
  return baked
974
1002
  }
975
1003
 
@@ -1187,253 +1215,182 @@ func nestiaSDKIsNilLike(value any) bool {
1187
1215
  }
1188
1216
  }
1189
1217
 
1190
- func nestiaSDKMarkReadonlyArrayJsonSchema(prog *driver.Program, typeNode *shimast.Node, baked map[string]any) {
1191
- components, _ := baked["components"].(map[string]any)
1192
- schemas, _ := components["schemas"].(map[string]any)
1193
- schema := nestiaSDKSchemaMap(baked["schema"])
1194
- nestiaSDKMarkReadonlyArraySchemaNode(
1195
- prog,
1196
- typeNode,
1197
- schema,
1198
- schemas,
1199
- map[*shimast.Node]bool{},
1200
- )
1201
- }
1202
-
1203
- func nestiaSDKMarkReadonlyArraySchemaNode(
1204
- prog *driver.Program,
1205
- typeNode *shimast.Node,
1206
- schema map[string]any,
1207
- components map[string]any,
1208
- visiting map[*shimast.Node]bool,
1209
- ) {
1210
- if typeNode == nil || schema == nil {
1211
- return
1212
- }
1213
- if visiting[typeNode] {
1214
- return
1215
- }
1216
- visiting[typeNode] = true
1217
- defer delete(visiting, typeNode)
1218
-
1219
- switch typeNode.Kind {
1220
- case shimast.KindArrayType:
1221
- child := nestiaSDKSchemaMap(schema["items"])
1222
- nestiaSDKMarkReadonlyArraySchemaNode(
1223
- prog,
1224
- typeNode.AsArrayTypeNode().ElementType,
1225
- child,
1226
- components,
1227
- visiting,
1228
- )
1229
- case shimast.KindTupleType:
1230
- tuple := typeNode.AsTupleTypeNode()
1231
- items := nestiaSDKSchemaList(schema["prefixItems"])
1232
- if tuple.Elements != nil {
1233
- for i, elem := range tuple.Elements.Nodes {
1234
- if i >= len(items) {
1235
- break
1236
- }
1237
- child := nestiaSDKSchemaMap(items[i])
1238
- nestiaSDKMarkReadonlyArraySchemaNode(prog, elem, child, components, visiting)
1239
- }
1240
- }
1241
- case shimast.KindParenthesizedType:
1242
- nestiaSDKMarkReadonlyArraySchemaNode(
1243
- prog,
1244
- typeNode.AsParenthesizedTypeNode().Type,
1245
- schema,
1246
- components,
1247
- visiting,
1248
- )
1249
- case shimast.KindTypeOperator:
1250
- operator := typeNode.AsTypeOperatorNode()
1251
- if nestiaSDKTypeOperatorPrefix(typeNode, operator.Type) == "readonly" &&
1252
- nestiaSDKReadonlyArrayOperand(operator.Type) {
1253
- schema["x-readonly-array"] = true
1254
- }
1255
- nestiaSDKMarkReadonlyArraySchemaNode(
1256
- prog,
1257
- operator.Type,
1258
- schema,
1259
- components,
1260
- visiting,
1261
- )
1262
- case shimast.KindTypeReference:
1263
- nestiaSDKMarkReadonlyArrayTypeReference(
1264
- prog,
1265
- typeNode,
1266
- schema,
1267
- components,
1268
- visiting,
1269
- )
1270
- case shimast.KindTypeLiteral:
1271
- nestiaSDKMarkReadonlyArrayTypeElements(
1272
- prog,
1273
- typeNode.AsTypeLiteralNode().Members,
1274
- schema,
1275
- components,
1276
- visiting,
1277
- )
1278
- }
1279
- }
1280
-
1281
- func nestiaSDKMarkReadonlyArrayTypeReference(
1282
- prog *driver.Program,
1283
- typeNode *shimast.Node,
1284
- schema map[string]any,
1285
- components map[string]any,
1286
- visiting map[*shimast.Node]bool,
1287
- ) {
1288
- ref := typeNode.AsTypeReferenceNode()
1289
- name := nestiaSDKEntityNameText(ref.TypeName)
1290
- if name == "ReadonlyArray" {
1291
- schema["x-readonly-array"] = true
1292
- }
1293
- if (name == "Array" || name == "ReadonlyArray") && ref.TypeArguments != nil &&
1294
- len(ref.TypeArguments.Nodes) != 0 {
1295
- child := nestiaSDKSchemaMap(schema["items"])
1296
- nestiaSDKMarkReadonlyArraySchemaNode(
1297
- prog,
1298
- ref.TypeArguments.Nodes[0],
1299
- child,
1300
- components,
1301
- visiting,
1302
- )
1303
- }
1304
- for _, decl := range nestiaSDKTypeReferenceDeclarations(prog, ref.TypeName) {
1305
- switch decl.Kind {
1306
- case shimast.KindInterfaceDeclaration:
1307
- target := nestiaSDKReferencedSchema(schema, components, name)
1308
- nestiaSDKMarkReadonlyArrayTypeElements(
1309
- prog,
1310
- decl.AsInterfaceDeclaration().Members,
1311
- target,
1312
- components,
1313
- visiting,
1314
- )
1315
- case shimast.KindTypeAliasDeclaration:
1316
- target := nestiaSDKReferencedSchema(schema, components, name)
1317
- nestiaSDKMarkReadonlyArraySchemaNode(
1318
- prog,
1319
- decl.AsTypeAliasDeclaration().Type,
1320
- target,
1321
- components,
1322
- visiting,
1323
- )
1324
- }
1325
- }
1326
- }
1327
-
1328
- func nestiaSDKMarkReadonlyArrayTypeElements(
1329
- prog *driver.Program,
1330
- members *shimast.TypeElementList,
1331
- schema map[string]any,
1332
- components map[string]any,
1333
- visiting map[*shimast.Node]bool,
1334
- ) {
1335
- if members == nil || schema == nil {
1336
- return
1337
- }
1338
- properties := nestiaSDKSchemaMap(schema["properties"])
1339
- if properties == nil {
1340
- return
1341
- }
1342
- for _, member := range members.Nodes {
1343
- if member == nil || member.Kind != shimast.KindPropertySignature {
1344
- continue
1345
- }
1346
- property := member.AsPropertySignatureDeclaration()
1347
- name := nestiaSDKSchemaPropertyName(property.Name())
1348
- child := nestiaSDKSchemaMap(properties[name])
1349
- nestiaSDKMarkReadonlyArraySchemaNode(
1350
- prog,
1351
- property.Type,
1352
- child,
1353
- components,
1354
- visiting,
1355
- )
1356
- }
1357
- }
1358
-
1359
- func nestiaSDKTypeReferenceDeclarations(prog *driver.Program, node *shimast.Node) []*shimast.Node {
1360
- if prog == nil || prog.Checker == nil || node == nil {
1361
- return nil
1362
- }
1363
- symbol := prog.Checker.GetSymbolAtLocation(node)
1364
- if symbol == nil {
1365
- typ := prog.Checker.GetTypeFromTypeNode(node)
1366
- if typ != nil {
1367
- symbol = typ.Symbol()
1368
- }
1369
- }
1370
- if symbol == nil {
1371
- return nil
1372
- }
1373
- return symbol.Declarations
1374
- }
1375
-
1376
- func nestiaSDKReferencedSchema(schema map[string]any, components map[string]any, name string) map[string]any {
1377
- ref, _ := schema["$ref"].(string)
1378
- if ref == "" {
1379
- return schema
1380
- }
1381
- const prefix = "#/components/schemas/"
1382
- if strings.HasPrefix(ref, prefix) {
1383
- name = strings.TrimPrefix(ref, prefix)
1384
- }
1385
- target := nestiaSDKSchemaMap(components[name])
1386
- if target != nil {
1387
- return target
1388
- }
1389
- return schema
1390
- }
1391
-
1218
+ // nestiaSDKMarkReadonlyArrayJsonSchema carries the producing checker's readonly
1219
+ // facts into the baked schema. Alias spelling is never an immutability test.
1220
+ func nestiaSDKMarkReadonlyArrayJsonSchema(prog *driver.Program, typ *shimchecker.Type, baked map[string]any, registry *schemametadata.MetadataCollection, escape bool) {
1221
+ registry = registry.Clone()
1222
+ components, _ := baked["components"].(map[string]any)
1223
+ schemas, _ := components["schemas"].(map[string]any)
1224
+ nestiaSDKMarkReadonlySchemaType(prog, typ, nestiaSDKSchemaMap(baked["schema"]), schemas, registry, escape, map[nestiaSDKReadonlyVisit]bool{}, false)
1225
+ for key, schema := range nestiaSDKSchemaMap(baked["properties"]) {
1226
+ nestiaSDKMarkReadonlySchemaType(prog, prog.Checker.GetTypeOfPropertyOfType(typ, key), nestiaSDKSchemaMap(schema), schemas, registry, escape, map[nestiaSDKReadonlyVisit]bool{}, false)
1227
+ }
1228
+ }
1229
+
1230
+ // nestiaSDKMarkReadonlySchemaType pairs actual substituted checker types with
1231
+ // the schema positions the writer emitted, including inferred types and cycles.
1232
+ func nestiaSDKMarkReadonlySchemaType(prog *driver.Program, typ *shimchecker.Type, schema map[string]any, components map[string]any, registry *schemametadata.MetadataCollection, escape bool, visiting map[nestiaSDKReadonlyVisit]bool, skipEscape bool) {
1233
+ if prog == nil || prog.Checker == nil || typ == nil || schema == nil { return }
1234
+ // The cloned registry preserves the producer's type-to-component identity.
1235
+ // Public emplace lookups cannot mutate the analysis registry or its counters.
1236
+ if escape && !skipEscape {
1237
+ if method := prog.Checker.GetTypeOfPropertyOfType(typ, "toJSON"); method != nil {
1238
+ for _, signature := range prog.Checker.GetSignaturesOfType(method, shimchecker.SignatureKindCall) {
1239
+ if returned := prog.Checker.GetReturnTypeOfSignature(signature); returned != nil && returned != typ {
1240
+ nestiaSDKMarkReadonlySchemaType(prog, returned, schema, components, registry, escape, visiting, true)
1241
+ return
1242
+ }
1243
+ }
1244
+ }
1245
+ }
1246
+ target := schema
1247
+ if ref, ok := schema["$ref"].(string); ok && strings.HasPrefix(ref, "#/components/schemas/") {
1248
+ name := strings.TrimPrefix(ref, "#/components/schemas/")
1249
+ if component := nestiaSDKSchemaMap(components[name]); component != nil {
1250
+ if component["type"] == "object" && typ.Flags() & shimchecker.TypeFlagsObject != 0 {
1251
+ owner, fresh := registry.Emplace(prog.Checker, typ)
1252
+ if fresh || owner.Name != name { return }
1253
+ }
1254
+ target = component
1255
+ }
1256
+ }
1257
+ key := nestiaSDKReadonlyVisit{Type: typ, Schema: reflect.ValueOf(schema).Pointer()}
1258
+ if visiting[key] { return }
1259
+ visiting[key] = true
1260
+ if typ.Flags() & (shimchecker.TypeFlagsUnion | shimchecker.TypeFlagsIntersection) != 0 {
1261
+ for _, child := range typ.AsUnionOrIntersectionType().Types() {
1262
+ matched := false
1263
+ if typ.Flags() & shimchecker.TypeFlagsUnion != 0 {
1264
+ for _, keyword := range []string{"oneOf", "anyOf"} {
1265
+ if branches := nestiaSDKSchemaList(target[keyword]); len(branches) != 0 {
1266
+ matched = true
1267
+ analyzed := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
1268
+ Checker: prog.Checker,
1269
+ Options: nativefactories.MetadataFactory_IOptions{Escape: escape && !skipEscape, Constant: true, Absorb: true},
1270
+ Components: registry.Clone(), Type: child,
1271
+ })
1272
+ if analyzed.Success {
1273
+ // A union constituent can have no JSON value (undefined, void, never,
1274
+ // or function-only). Unlike the top-level writer, this branch probe
1275
+ // must return nil for those omissions without rejecting the parent.
1276
+ produced := nativeiterate.Json_schema_station(nativeiterate.Json_schema_station_props{
1277
+ BlockNever: false,
1278
+ Components: &nativeiterate.OpenApi_IComponents{Schemas: map[string]nativeiterate.JsonSchema{}},
1279
+ Attribute: nativeiterate.JsonSchema{}, Metadata: schemaprojection.Project(analyzed.Data),
1280
+ })
1281
+ if produced != nil {
1282
+ expected := nestiaSDKJsonSchemaLiteral(produced)
1283
+ for _, branch := range branches {
1284
+ if nestiaSDKReadonlySchemaEquivalent(expected, branch) {
1285
+ nestiaSDKMarkReadonlySchemaType(prog, child, nestiaSDKSchemaMap(branch), components, registry, escape, visiting, skipEscape)
1286
+ }
1287
+ }
1288
+ }
1289
+ }
1290
+ }
1291
+ }
1292
+ }
1293
+ if !matched { nestiaSDKMarkReadonlySchemaType(prog, child, schema, components, registry, escape, visiting, skipEscape) }
1294
+ }
1295
+ return
1296
+ }
1297
+ for _, keyword := range []string{"oneOf", "anyOf", "allOf"} {
1298
+ if branches := nestiaSDKSchemaList(target[keyword]); len(branches) != 0 {
1299
+ for _, branch := range branches {
1300
+ nestiaSDKMarkReadonlySchemaType(prog, typ, nestiaSDKSchemaMap(branch), components, registry, escape, visiting, skipEscape)
1301
+ }
1302
+ return
1303
+ }
1304
+ }
1305
+ if target["type"] == "array" {
1306
+ readonly := false
1307
+ var element *shimchecker.Type
1308
+ if shimchecker.IsTupleType(typ) {
1309
+ readonly = typ.TargetTupleType().IsReadonly()
1310
+ } else {
1311
+ for _, index := range prog.Checker.GetIndexInfosOfType(typ) {
1312
+ if index.KeyType().Flags() & shimchecker.TypeFlagsNumber != 0 { element = index.ValueType(); readonly = index.IsReadonly() }
1313
+ }
1314
+ }
1315
+ if !shimchecker.IsTupleType(typ) && element == nil { return }
1316
+ mutableKey := nestiaSDKReadonlyVisit{Schema: reflect.ValueOf(target).Pointer()}
1317
+ if !readonly {
1318
+ visiting[mutableKey] = true
1319
+ delete(schema, "x-readonly-array")
1320
+ delete(target, "x-readonly-array")
1321
+ } else if !visiting[mutableKey] { schema["x-readonly-array"] = true; target["x-readonly-array"] = true }
1322
+ if shimchecker.IsTupleType(typ) {
1323
+ arguments := prog.Checker.GetTypeArguments(typ)
1324
+ for index, flag := range typ.TargetTupleType().ElementFlags() {
1325
+ if flag == shimchecker.ElementFlagsRest && index < len(arguments) { nestiaSDKMarkReadonlySchemaType(prog, arguments[index], nestiaSDKSchemaMap(target["additionalItems"]), components, registry, escape, visiting, false) }
1326
+ }
1327
+ for index, child := range nestiaSDKSchemaList(target["prefixItems"]) {
1328
+ if index < len(arguments) { nestiaSDKMarkReadonlySchemaType(prog, arguments[index], nestiaSDKSchemaMap(child), components, registry, escape, visiting, false) }
1329
+ }
1330
+ } else if element != nil {
1331
+ nestiaSDKMarkReadonlySchemaType(prog, element, nestiaSDKSchemaMap(target["items"]), components, registry, escape, visiting, false)
1332
+ }
1333
+ return
1334
+ }
1335
+ for key, child := range nestiaSDKSchemaMap(target["properties"]) {
1336
+ nestiaSDKMarkReadonlySchemaType(prog, prog.Checker.GetTypeOfPropertyOfType(typ, key), nestiaSDKSchemaMap(child), components, registry, escape, visiting, false)
1337
+ }
1338
+ for _, index := range prog.Checker.GetIndexInfosOfType(typ) {
1339
+ nestiaSDKMarkReadonlySchemaType(prog, index.ValueType(), nestiaSDKSchemaMap(target["additionalProperties"]), components, registry, escape, visiting, false)
1340
+ }
1341
+ }
1342
+
1343
+ // nestiaSDKReadonlySchemaEquivalent compares the native writer's branch shape,
1344
+ // ignoring only the readonly facts this traversal has already attached.
1345
+ func nestiaSDKReadonlySchemaEquivalent(expected any, actual any) bool {
1346
+ left, right := nestiaSDKSchemaMap(expected), nestiaSDKSchemaMap(actual)
1347
+ if left != nil && right != nil {
1348
+ count := 0
1349
+ for key, value := range left {
1350
+ if key == "x-readonly-array" { continue }
1351
+ other, exists := right[key]
1352
+ if !exists || !nestiaSDKReadonlySchemaEquivalent(value, other) { return false }
1353
+ count++
1354
+ }
1355
+ for key := range right { if key != "x-readonly-array" { count-- } }
1356
+ return count == 0
1357
+ }
1358
+ leftList, rightList := nestiaSDKSchemaList(expected), nestiaSDKSchemaList(actual)
1359
+ if leftList != nil && rightList != nil {
1360
+ if len(leftList) != len(rightList) { return false }
1361
+ for i := range leftList { if !nestiaSDKReadonlySchemaEquivalent(leftList[i], rightList[i]) { return false } }
1362
+ return true
1363
+ }
1364
+ return reflect.DeepEqual(expected, actual)
1365
+ }
1366
+ // nestiaSDKReadonlyVisit identifies one checker-type/schema-map pair per bake.
1367
+ type nestiaSDKReadonlyVisit struct {
1368
+ Type *shimchecker.Type
1369
+ Schema uintptr
1370
+ }
1371
+
1372
+ // nestiaSDKSchemaMap exposes schema maps and the values of an ordered property
1373
+ // dictionary without copying or changing its key order.
1392
1374
  func nestiaSDKSchemaMap(input any) map[string]any {
1393
- switch value := input.(type) {
1394
- case map[string]any:
1395
- return value
1396
- case nativeiterate.JsonSchema:
1397
- return map[string]any(value)
1398
- default:
1399
- return nil
1400
- }
1375
+ switch value := input.(type) {
1376
+ case map[string]any: return value
1377
+ case nativeiterate.JsonSchema: return map[string]any(value)
1378
+ case nativefactories.LiteralFactory_OrderedObject: return value.Values
1379
+ case *nativefactories.LiteralFactory_OrderedObject:
1380
+ if value != nil { return value.Values }
1381
+ }
1382
+ return nil
1401
1383
  }
1402
1384
 
1403
1385
  func nestiaSDKSchemaList(input any) []any {
1404
- switch value := input.(type) {
1405
- case []any:
1406
- return value
1407
- case []nativeiterate.JsonSchema:
1408
- output := make([]any, len(value))
1409
- for i, elem := range value {
1410
- output[i] = elem
1411
- }
1412
- return output
1413
- default:
1414
- return nil
1415
- }
1416
- }
1417
-
1418
- func nestiaSDKReadonlyArrayOperand(node *shimast.Node) bool {
1419
- if node == nil {
1420
- return false
1421
- }
1422
- switch node.Kind {
1423
- case shimast.KindArrayType, shimast.KindTupleType:
1424
- return true
1425
- case shimast.KindTypeReference:
1426
- return nestiaSDKEntityNameText(node.AsTypeReferenceNode().TypeName) == "Array"
1427
- case shimast.KindParenthesizedType:
1428
- return nestiaSDKReadonlyArrayOperand(node.AsParenthesizedTypeNode().Type)
1429
- default:
1430
- return false
1431
- }
1432
- }
1433
-
1434
- func nestiaSDKSchemaPropertyName(node *shimast.Node) string {
1435
- text := nestiaSDKTypeNodeText(node)
1436
- return strings.Trim(text, "\"'")
1386
+ switch value := input.(type) {
1387
+ case []any: return value
1388
+ case []nativeiterate.JsonSchema:
1389
+ output := make([]any, len(value))
1390
+ for i, elem := range value { output[i] = elem }
1391
+ return output
1392
+ default: return nil
1393
+ }
1437
1394
  }
1438
1395
 
1439
1396
  func nestiaSDKRestoreUnionOrder(typeNode *shimast.Node, metadata *schemametadata.MetadataSchema) {
@@ -1622,27 +1579,11 @@ func nestiaSDKIsTypeGuardError(prog *driver.Program, typ *shimchecker.Type, type
1622
1579
  }
1623
1580
 
1624
1581
  func nestiaSDKIsTypiaSourceFile(prog *driver.Program, source *shimast.SourceFile) bool {
1625
- if prog == nil || prog.FS == nil || source == nil {
1626
- return false
1627
- }
1628
- for directory := filepath.Dir(source.FileName()); ; {
1629
- contents, ok := prog.FS.ReadFile(filepath.Join(directory, "package.json"))
1630
- if ok {
1631
- var pack struct {
1632
- Name string `json:"name"`
1633
- }
1634
- return json.Unmarshal([]byte(contents), &pack) == nil && pack.Name == "typia"
1635
- }
1636
- parent := filepath.Dir(directory)
1637
- if parent == directory {
1638
- return false
1639
- }
1640
- directory = parent
1641
- }
1582
+ return transform.SourceFilePackageName(prog, source) == "typia"
1642
1583
  }
1643
1584
 
1644
1585
  func nestiaSDKTypeGuardErrorSchemaPipe() any {
1645
- // Synthetic metadata for `TypeGuardError` exception responses — does not
1586
+ // Synthetic metadata for `TypeGuardError` exception responses; it does not
1646
1587
  // flow through `nestiaSDKSchemaPipe`, so the pre-baked fields legacy.ts
1647
1588
  // reads (size/name/empty/jsonSchema) have to be filled by hand.
1648
1589
  metadata := nestiaSDKObjectReferenceSchema("TypeGuardErrorany")
@@ -1792,6 +1733,9 @@ func nestiaSDKReflectType(
1792
1733
  if typeNode == nil {
1793
1734
  return map[string]any{"name": "__type"}, []any{}
1794
1735
  }
1736
+ if ref, refs, ok := nestiaSDKReflectAsyncAlias(prog, imports, typ, typeNode); ok {
1737
+ return ref, refs
1738
+ }
1795
1739
  if typeNode != nil {
1796
1740
  if ref, refs, ok := nestiaSDKReflectTypeNode(prog, imports, typeNode); ok {
1797
1741
  return ref, refs
@@ -1807,7 +1751,120 @@ func nestiaSDKReflectType(
1807
1751
  if name == "any" && prog != nil && prog.Checker != nil && typ != nil {
1808
1752
  name = prog.Checker.TypeToString(typ)
1809
1753
  }
1810
- return map[string]any{"name": name}, nestiaSDKReflectImports(name, imports)
1754
+ return map[string]any{"name": name}, nestiaSDKReflectImports(prog, typeNode, imports)
1755
+ }
1756
+
1757
+ // nestiaSDKReflectAsyncAlias reflects the actual response payload when its
1758
+ // annotation aliases an asynchronous wrapper. The checker builds a concrete AST
1759
+ // in the annotation's scope, substituting generic arguments and defaults; its
1760
+ // identifier-symbol map preserves declaration identity without reparsing text.
1761
+ // Ordinary user wrappers keep their original annotation and imports.
1762
+ func nestiaSDKReflectAsyncAlias(
1763
+ prog *driver.Program,
1764
+ imports []nestiaSDKImportInfo,
1765
+ typ *shimchecker.Type,
1766
+ node *shimast.Node,
1767
+ ) (map[string]any, []any, bool) {
1768
+ if prog == nil || prog.Checker == nil || typ == nil || node == nil {
1769
+ return nil, nil, false
1770
+ }
1771
+ reference := node
1772
+ for reference.Kind == shimast.KindParenthesizedType {
1773
+ reference = reference.AsParenthesizedTypeNode().Type
1774
+ }
1775
+ if reference.Kind != shimast.KindTypeReference || transform.NestiaCoreIsAsyncReturnWrapperReference(prog, reference.AsTypeReferenceNode().TypeName) {
1776
+ return nil, nil, false
1777
+ }
1778
+ declared := prog.Checker.GetTypeFromTypeNode(node)
1779
+ if declared == nil || declared == typ || declared.Symbol() == nil {
1780
+ return nil, nil, false
1781
+ }
1782
+ isAsync := func(current *shimchecker.Type) bool {
1783
+ if current == nil || current.Symbol() == nil {
1784
+ return false
1785
+ }
1786
+ for _, declaration := range current.Symbol().Declarations {
1787
+ if declaration != nil && declaration.Name() != nil && transform.NestiaCoreIsAsyncReturnWrapperReference(prog, declaration.Name()) {
1788
+ return true
1789
+ }
1790
+ }
1791
+ return false
1792
+ }
1793
+ if !isAsync(declared) {
1794
+ return nil, nil, false
1795
+ }
1796
+ seen := map[*shimchecker.Type]bool{}
1797
+ for isAsync(typ) && !seen[typ] {
1798
+ seen[typ] = true
1799
+ arguments := prog.Checker.GetTypeArguments(typ)
1800
+ if len(arguments) != 1 {
1801
+ break
1802
+ }
1803
+ typ = arguments[0]
1804
+ }
1805
+ symbols := map[*shimast.IdentifierNode]*shimast.Symbol{}
1806
+ // TypeScript's nodebuilder.FlagsNoTruncation is the public flag bit 1 << 0.
1807
+ // The shim exposes TypeToTypeNode but no alias for that internal enum; a
1808
+ // response type is executable client syntax and cannot use display elision.
1809
+ const noTruncation = 1 << 0
1810
+ projected := prog.Checker.TypeToTypeNode(typ, node, noTruncation, symbols)
1811
+ if projected == nil {
1812
+ return nil, nil, false
1813
+ }
1814
+ ref, _, ok := nestiaSDKReflectTypeNode(nil, nil, projected)
1815
+ if !ok {
1816
+ return nil, nil, false
1817
+ }
1818
+ refs := []any{}
1819
+ add := func(entity *shimast.Node) {
1820
+ root := entity
1821
+ for root != nil && root.Kind == shimast.KindQualifiedName {
1822
+ root = root.AsQualifiedName().Left
1823
+ }
1824
+ if root == nil || root.Kind != shimast.KindIdentifier {
1825
+ return
1826
+ }
1827
+ symbol := symbols[root]
1828
+ if symbol == nil || symbol.Flags&shimast.SymbolFlagsTypeParameter != 0 {
1829
+ return
1830
+ }
1831
+ prefixes := map[string]bool{root.Text(): true}
1832
+ matched := false
1833
+ for _, imp := range imports {
1834
+ if nestiaSDKImportMatches(prefixes, imp) {
1835
+ refs = append(refs, nestiaSDKImportLiteral(imp, prefixes))
1836
+ matched = true
1837
+ }
1838
+ }
1839
+ if matched {
1840
+ return
1841
+ }
1842
+ for _, declaration := range symbol.Declarations {
1843
+ source := shimast.GetSourceFileOfNode(declaration)
1844
+ if source != nil && (prog.TSProgram == nil || !prog.TSProgram.IsLibFile(source)) {
1845
+ refs = append(refs, map[string]any{
1846
+ "file": filepath.ToSlash(source.FileName()), "asterisk": nestiaSDKLiteralNull,
1847
+ "default": nestiaSDKLiteralNull, "elements": []string{root.Text()},
1848
+ })
1849
+ return
1850
+ }
1851
+ }
1852
+ }
1853
+ var walk func(*shimast.Node)
1854
+ walk = func(current *shimast.Node) {
1855
+ if current == nil {
1856
+ return
1857
+ }
1858
+ switch current.Kind {
1859
+ case shimast.KindTypeReference:
1860
+ add(current.AsTypeReferenceNode().TypeName)
1861
+ case shimast.KindTypeQuery:
1862
+ add(current.AsTypeQueryNode().ExprName)
1863
+ }
1864
+ current.ForEachChild(func(child *shimast.Node) bool { walk(child); return false })
1865
+ }
1866
+ walk(projected)
1867
+ return ref, nestiaSDKMergeImportLiterals(refs), true
1811
1868
  }
1812
1869
 
1813
1870
  func nestiaSDKReflectTypeNode(
@@ -1829,7 +1886,7 @@ func nestiaSDKReflectTypeNode(
1829
1886
  element, refs, ok := nestiaSDKReflectTypeNode(prog, imports, node.AsArrayTypeNode().ElementType)
1830
1887
  if ok == false {
1831
1888
  element = map[string]any{"name": nestiaSDKTypeNodeText(node.AsArrayTypeNode().ElementType)}
1832
- refs = nestiaSDKReflectImports(element["name"].(string), imports)
1889
+ refs = nestiaSDKReflectImports(prog, node.AsArrayTypeNode().ElementType, imports)
1833
1890
  }
1834
1891
  return map[string]any{
1835
1892
  "name": "Array",
@@ -1839,34 +1896,29 @@ func nestiaSDKReflectTypeNode(
1839
1896
  child, refs, ok := nestiaSDKReflectTypeNode(prog, imports, node.AsParenthesizedTypeNode().Type)
1840
1897
  if ok == false {
1841
1898
  child = map[string]any{"name": nestiaSDKTypeNodeText(node.AsParenthesizedTypeNode().Type)}
1842
- refs = nestiaSDKReflectImports(child["name"].(string), imports)
1899
+ refs = nestiaSDKReflectImports(prog, node.AsParenthesizedTypeNode().Type, imports)
1843
1900
  }
1844
- name, _ := child["name"].(string)
1845
- return map[string]any{"name": "(" + name + ")"}, refs, true
1901
+ return map[string]any{"name": "(" + nestiaSDKReflectTypeText(child) + ")"}, refs, true
1846
1902
  case shimast.KindTypeOperator:
1847
1903
  operator := node.AsTypeOperatorNode()
1848
1904
  prefix := nestiaSDKTypeOperatorPrefix(node, operator.Type)
1849
1905
  if prefix == "" {
1850
1906
  return nil, nil, false
1851
1907
  }
1852
- child, refs, ok := nestiaSDKReflectTypeNode(prog, imports, operator.Type)
1853
- if ok == false {
1854
- child = map[string]any{"name": nestiaSDKTypeNodeText(operator.Type)}
1855
- refs = nestiaSDKReflectImports(child["name"].(string), imports)
1856
- }
1857
- name, _ := child["name"].(string)
1858
- return map[string]any{"name": prefix + " " + name}, refs, true
1908
+ // Operators retain their actual syntax: readonly requires an array or
1909
+ // tuple operand, and rendering the reflected Array<T> form here would
1910
+ // produce invalid TypeScript. Checker-projected nodes already contain
1911
+ // concrete alias arguments and are printed by the same text operation.
1912
+ return map[string]any{"name": nestiaSDKTypeNodeText(node)},
1913
+ nestiaSDKReflectImports(prog, operator.Type, imports), true
1859
1914
  case shimast.KindTypeQuery:
1860
1915
  return nil, nil, false
1861
1916
  case shimast.KindTypeReference:
1862
1917
  ref := node.AsTypeReferenceNode()
1863
1918
  name := nestiaSDKEntityNameText(ref.TypeName)
1864
- rootRefs := nestiaSDKReflectImports(name, imports)
1865
- if len(rootRefs) == 0 && nestiaSDKIsAsyncReturnWrapper(prog, ref.TypeName, name) == false {
1866
- rootRefs = nestiaSDKReflectTypeReferenceSymbolImport(prog, ref.TypeName, name)
1867
- }
1919
+ rootRefs := nestiaSDKReflectImports(prog, ref.TypeName, imports)
1868
1920
  if ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) != 0 {
1869
- if nestiaSDKIsAsyncReturnWrapper(prog, ref.TypeName, name) && len(ref.TypeArguments.Nodes) == 1 {
1921
+ if transform.NestiaCoreIsAsyncReturnWrapperReference(prog, ref.TypeName) && len(ref.TypeArguments.Nodes) == 1 {
1870
1922
  return nestiaSDKReflectTypeNode(prog, imports, ref.TypeArguments.Nodes[0])
1871
1923
  }
1872
1924
  args := make([]any, 0, len(ref.TypeArguments.Nodes))
@@ -1876,7 +1928,7 @@ func nestiaSDKReflectTypeNode(
1876
1928
  if ok == false {
1877
1929
  text := nestiaSDKTypeNodeText(child)
1878
1930
  arg = map[string]any{"name": text}
1879
- refs = nestiaSDKReflectImports(text, imports)
1931
+ refs = nestiaSDKReflectImports(prog, child, imports)
1880
1932
  }
1881
1933
  args = append(args, arg)
1882
1934
  groups = append(groups, refs)
@@ -1892,16 +1944,20 @@ func nestiaSDKReflectTypeNode(
1892
1944
  if name == "" {
1893
1945
  return nil, nil, false
1894
1946
  }
1895
- return map[string]any{"name": name}, nestiaSDKReflectImports(name, imports), true
1947
+ return map[string]any{"name": name}, nestiaSDKReflectImports(prog, node, imports), true
1896
1948
  }
1897
1949
  }
1898
1950
 
1951
+ // nestiaSDKReflectTypeReferenceSymbolImport supplies a declaration import when
1952
+ // no authored import binding describes the referenced type. The actual program's
1953
+ // library-file identity keeps global library declarations out of client imports.
1954
+ // Locally bound type parameters have no importable module declaration.
1899
1955
  func nestiaSDKReflectTypeReferenceSymbolImport(prog *driver.Program, node *shimast.Node, name string) []any {
1900
1956
  if prog == nil || prog.Checker == nil || node == nil {
1901
1957
  return nil
1902
1958
  }
1903
1959
  prefix := strings.Split(name, ".")[0]
1904
- if nestiaSDKIsGlobalTypePrefix(prefix) {
1960
+ if nestiaSDKIsTypeKeyword(prefix) {
1905
1961
  return nil
1906
1962
  }
1907
1963
  symbol := prog.Checker.GetSymbolAtLocation(node)
@@ -1911,17 +1967,18 @@ func nestiaSDKReflectTypeReferenceSymbolImport(prog *driver.Program, node *shima
1911
1967
  symbol = typ.Symbol()
1912
1968
  }
1913
1969
  }
1914
- if symbol == nil || len(symbol.Declarations) == 0 {
1970
+ if symbol == nil || symbol.Flags&shimast.SymbolFlagsTypeParameter != 0 || len(symbol.Declarations) == 0 {
1915
1971
  return nil
1916
1972
  }
1917
1973
  sourceFile := shimast.GetSourceFileOfNode(symbol.Declarations[0])
1918
1974
  if sourceFile == nil {
1919
1975
  return nil
1920
1976
  }
1921
- file := filepath.ToSlash(sourceFile.FileName())
1922
- if strings.Contains(file, "/typescript/lib/") {
1977
+ // a default library type, whichever folder or replacement package supplies it
1978
+ if prog.TSProgram != nil && prog.TSProgram.IsLibFile(sourceFile) {
1923
1979
  return nil
1924
1980
  }
1981
+ file := filepath.ToSlash(sourceFile.FileName())
1925
1982
  return []any{
1926
1983
  map[string]any{
1927
1984
  "file": file,
@@ -1948,7 +2005,7 @@ func nestiaSDKReflectJoinedTypeNode(
1948
2005
  if ok == false {
1949
2006
  text := nestiaSDKTypeNodeText(child)
1950
2007
  names = append(names, text)
1951
- groups = append(groups, nestiaSDKReflectImports(text, imports))
2008
+ groups = append(groups, nestiaSDKReflectImports(prog, child, imports))
1952
2009
  } else {
1953
2010
  names = append(names, nestiaSDKReflectTypeText(ref))
1954
2011
  groups = append(groups, refs)
@@ -2105,13 +2162,14 @@ func nestiaSDKIsConnectionHeader(typ *shimchecker.Type) bool {
2105
2162
  }
2106
2163
 
2107
2164
  // nestiaSDKWebSocketParameterType reflects an @WebSocketRoute.Acceptor() or
2108
- // .Driver() parameter annotated through a type alias or an import type as the
2165
+ // .Driver() parameter as the
2109
2166
  // tgrid reference it spells, such as `WebSocketAcceptor<Header, Provider,
2110
2167
  // Listener>`, because the generated client needs those type arguments. Each
2111
2168
  // argument is reflected in the file that writes it, and one naming a type
2112
2169
  // parameter of a generic alias is replaced by what the annotation passes for
2113
- // it. It returns nil for an annotation writing the tgrid reference itself as a
2114
- // type reference, and an error for an alias using its type parameter inside an
2170
+ // it. Only argument imports belong to the client; the outer server wrapper
2171
+ // binding is not written there. It returns nil for an unrecognized wrapper,
2172
+ // and an error for an alias using its type parameter inside an
2115
2173
  // argument, such as `IRoom<P>`, which no written node spells.
2116
2174
  func nestiaSDKWebSocketParameterType(
2117
2175
  context *nestiaSDKContext,
@@ -2124,9 +2182,7 @@ func nestiaSDKWebSocketParameterType(
2124
2182
  return nil, nil, nil
2125
2183
  }
2126
2184
  chain, name := transform.NestiaCoreWebSocketTypeReference(context.prog, nestiaSDKParameterTypeNode(param))
2127
- // the annotation's own reflection serves a tgrid reference written as a
2128
- // plain type reference, but reflects an import type without its arguments
2129
- if len(chain) == 0 || (len(chain) == 1 && chain[0].Kind == shimast.KindTypeReference) {
2185
+ if len(chain) == 0 {
2130
2186
  return nil, nil, nil
2131
2187
  }
2132
2188
  args := []any{}
@@ -2149,7 +2205,7 @@ func nestiaSDKWebSocketParameterType(
2149
2205
  if ok == false {
2150
2206
  text := nestiaSDKTypeNodeText(argument)
2151
2207
  arg = map[string]any{"name": text}
2152
- refs = nestiaSDKReflectImports(text, imports)
2208
+ refs = nestiaSDKReflectImports(context.prog, argument, imports)
2153
2209
  }
2154
2210
  args = append(args, arg)
2155
2211
  groups = append(groups, refs)
@@ -2286,7 +2342,7 @@ func nestiaSDKMethodReturnTypeNode(prog *driver.Program, method *shimast.Node) *
2286
2342
  func nestiaSDKReturnTypeNode(prog *driver.Program, node *shimast.Node) *shimast.Node {
2287
2343
  if node != nil && node.Kind == shimast.KindTypeReference {
2288
2344
  ref := node.AsTypeReferenceNode()
2289
- if ref != nil && ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) == 1 && nestiaSDKIsAsyncReturnWrapper(prog, ref.TypeName, nestiaSDKEntityNameText(ref.TypeName)) {
2345
+ if ref != nil && ref.TypeArguments != nil && len(ref.TypeArguments.Nodes) == 1 && transform.NestiaCoreIsAsyncReturnWrapperReference(prog, ref.TypeName) {
2290
2346
  return ref.TypeArguments.Nodes[0]
2291
2347
  }
2292
2348
  }
@@ -2296,84 +2352,18 @@ func nestiaSDKReturnTypeNode(prog *driver.Program, node *shimast.Node) *shimast.
2296
2352
  func nestiaSDKEntityNameText(node *shimast.Node) string {
2297
2353
  return nestiaSDKTypeNodeText(node)
2298
2354
  }
2299
- func nestiaSDKIsAsyncReturnWrapper(
2300
- prog *driver.Program,
2301
- node *shimast.Node,
2302
- name string,
2303
- ) bool {
2304
- if name == "Promise" {
2305
- return true
2306
- }
2307
- if name != "Observable" || prog == nil || prog.Checker == nil {
2308
- return false
2309
- }
2310
- symbol := prog.Checker.GetSymbolAtLocation(node)
2311
- return nestiaSDKIsRxjsObservableImport(node) ||
2312
- (symbol != nil && nestiaSDKIsRxjsDeclarations(symbol.Declarations))
2313
- }
2314
-
2315
- func nestiaSDKIsRxjsDeclarations(declarations []*shimast.Node) bool {
2316
- for _, decl := range declarations {
2317
- sourceFile := shimast.GetSourceFileOfNode(decl)
2318
- if sourceFile == nil {
2319
- continue
2320
- }
2321
- file := filepath.ToSlash(sourceFile.FileName())
2322
- if strings.Contains(file, "/node_modules/rxjs/") {
2323
- return true
2324
- }
2325
- }
2326
- return false
2327
- }
2328
-
2329
- func nestiaSDKIsRxjsObservableImport(node *shimast.Node) bool {
2330
- source, ok := transform.SourceFileText(shimast.GetSourceFileOfNode(node))
2331
- return ok && nestiaSDKHasNamedImport(source, "rxjs", "Observable", "Observable")
2332
- }
2333
-
2334
- func nestiaSDKHasNamedImport(
2335
- source string,
2336
- module string,
2337
- imported string,
2338
- local string,
2339
- ) bool {
2340
- for _, match := range nestiaSDKImportFromPattern.FindAllStringSubmatch(source, -1) {
2341
- if len(match) < 3 || match[2] != module {
2342
- continue
2343
- }
2344
- open := strings.Index(match[1], "{")
2345
- close := strings.LastIndex(match[1], "}")
2346
- if open < 0 || close <= open {
2347
- continue
2348
- }
2349
- for _, part := range strings.Split(match[1][open+1:close], ",") {
2350
- fields := strings.Fields(strings.TrimPrefix(strings.TrimSpace(part), "type "))
2351
- if len(fields) == 1 && fields[0] == local && imported == local {
2352
- return true
2353
- }
2354
- if len(fields) == 3 &&
2355
- fields[0] == imported &&
2356
- fields[1] == "as" &&
2357
- fields[2] == local {
2358
- return true
2359
- }
2360
- }
2361
- }
2362
- return false
2363
- }
2364
-
2365
- var nestiaSDKImportFromPattern = regexp.MustCompile(
2366
- `(?s)import\s+(?:type\s+)?(.+?)\s+from\s+["']([^"']+)["']`,
2367
- )
2368
-
2369
2355
  func nestiaSDKTypeNodeText(node *shimast.Node) string {
2370
2356
  if node == nil {
2371
2357
  return ""
2372
2358
  }
2373
2359
  file := shimast.GetSourceFileOfNode(node)
2374
- source, ok := transform.SourceFileText(file)
2360
+ source, ok := "", false
2361
+ if file != nil {
2362
+ source, ok = transform.SourceFileText(file)
2363
+ }
2375
2364
  if ok == false {
2376
- return ""
2365
+ printer := shimprinter.NewPrinter(shimprinter.PrinterOptions{}, shimprinter.PrintHandlers{}, shimprinter.NewEmitContext())
2366
+ return strings.TrimSpace(printer.Emit(node, file))
2377
2367
  }
2378
2368
  start, end := node.Pos(), node.End()
2379
2369
  if start < 0 || end > len(source) || start >= end {