@nestia/sdk 14.0.1 → 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 (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 +48 -73
  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 +21 -2
  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 +30 -0
  195. package/lib/structures/IOperationMetadata.d.ts +55 -0
  196. package/lib/structures/IReflectController.d.ts +10 -0
  197. package/lib/structures/IReflectHttpOperation.d.ts +10 -0
  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 +26 -1
  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 +388 -397
  270. package/package.json +7 -5
  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 +49 -87
  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 +47 -0
  286. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +33 -4
  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 +30 -0
  338. package/src/structures/IOperationMetadata.ts +55 -0
  339. package/src/structures/IReflectController.ts +10 -0
  340. package/src/structures/IReflectHttpOperation.ts +10 -0
  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 +33 -13
  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
@@ -18,34 +18,40 @@ import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
18
18
  import { ITypedHttpRouteException } from "../structures/ITypedHttpRouteException";
19
19
  import { ITypedHttpRouteParameter } from "../structures/ITypedHttpRouteParameter";
20
20
  import { ITypedHttpRouteSuccess } from "../structures/ITypedHttpRouteSuccess";
21
+ import { ITypedMcpRoute } from "../structures/ITypedMcpRoute";
21
22
  import { PathUtil } from "../utils/PathUtil";
23
+ import { StringUtil } from "../utils/StringUtil";
22
24
 
25
+ /**
26
+ * Turns reflected HTTP operations into typed routes, one per path, and builds
27
+ * the shared dictionary of the JSON components HTTP and MCP routes use.
28
+ *
29
+ * @evidence contracts/common.md#principled-implementation Each operation's metadata is resolved against its own components and validated by the policy of its position, the routes carry the typed parameters, the success response, and the exceptions, and the dictionary of the routes is built after component names that collide with different definitions are renamed per controller.
30
+ * @evidence contracts/common.md#clear-and-simple-design Two public functions and private collectors for the component rename.
31
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The rename mutates only component definitions owned by analysis; consumers emit resolved structural types rather than modifying foreign cache fields or replacing names in strings.
32
+ * @evidence contracts/common.md#meaningful-documentation The comment states its purpose.
33
+ * efficient algorithms: This namespace groups operations; analyze and routeDictionary own the algorithms.
34
+ * reuse equivalent work: The namespace itself coordinates no completed or in-flight work.
35
+ * bound retention and release resources: The namespace owns no cache, handle or running task.
36
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
37
+ */
23
38
  export namespace TypedHttpRouteAnalyzer {
24
- export const dictionary = (
25
- controllers: IReflectController[],
26
- ): IMetadataDictionary => {
27
- const individual: IMetadataComponents[] = [];
28
- for (const c of controllers)
29
- for (const o of c.operations) {
30
- if (o.protocol !== "http") continue;
31
- if (o.success) individual.push(o.success.components);
32
- for (const p of o.parameters) individual.push(p.components);
33
- for (const e of Object.values(o.exceptions))
34
- individual.push(e.components);
35
- }
36
- const components: MetadataComponents = MetadataComponents.from({
37
- objects: uniqueComponents(individual.flatMap((c) => c.objects)),
38
- arrays: uniqueComponents(individual.flatMap((c) => c.arrays)),
39
- tuples: uniqueComponents(individual.flatMap((c) => c.tuples)),
40
- aliases: uniqueComponents(individual.flatMap((c) => c.aliases)),
41
- });
42
- return components.dictionary;
43
- };
44
-
39
+ /**
40
+ * Returns the typed routes of one operation, one per path, or none when the
41
+ * metadata violates a policy; the violations are pushed to the errors.
42
+ *
43
+ * @evidence contracts/common.md#principled-implementation Each metadata is resolved against its own components and validated with the policy of its position (JSON, query, header, or text), the `@setHeader` and `@assignHeaders` tags become header directives, and the route splits the parameters by category.
44
+ * @evidence contracts/common.md#clear-and-simple-design One function.
45
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts The policies come from the validators of the package.
46
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result and the errors.
47
+ * efficient algorithms: Each supplied parameter and exception is cast once, policy validation belongs to MetadataFactory, and route splitting maps only the supplied paths.
48
+ * reuse equivalent work: Independently supplied operation metadata and position-specific validation have no shared completed or in-flight request.
49
+ * bound retention and release resources: Metadata dictionaries and local diagnostics belong to this synchronous operation and its returned routes; no process, handle or persistent history is retained.
50
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer.analyze analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
51
+ */
45
52
  export const analyze = (props: {
46
53
  controller: IReflectController;
47
54
  errors: IReflectOperationError[];
48
- dictionary: IMetadataDictionary;
49
55
  operation: IReflectHttpOperation;
50
56
  paths: string[];
51
57
  }): ITypedHttpRoute[] => {
@@ -57,7 +63,6 @@ export namespace TypedHttpRouteAnalyzer {
57
63
  validate?: MetadataFactory.Validator;
58
64
  },
59
65
  from: string,
60
- escape: boolean,
61
66
  ): MetadataSchema => {
62
67
  const components: MetadataComponents = MetadataComponents.from(
63
68
  next.components,
@@ -70,12 +75,6 @@ export namespace TypedHttpRouteAnalyzer {
70
75
  next.validate === undefined
71
76
  ? []
72
77
  : MetadataFactory.validate({
73
- options: {
74
- escape,
75
- constant: true,
76
- absorb: true,
77
- validate: next.validate,
78
- },
79
78
  functor: next.validate,
80
79
  metadata,
81
80
  });
@@ -111,28 +110,18 @@ export namespace TypedHttpRouteAnalyzer {
111
110
  example: value.example,
112
111
  examples: value.examples,
113
112
  type: value.type,
114
- metadata: cast(value, `exception (status: ${key})`, true),
113
+ metadata: cast(value, `exception (status: ${key})`),
115
114
  },
116
115
  ]),
117
116
  );
118
117
  const parameters: ITypedHttpRouteParameter[] =
119
118
  props.operation.parameters.map((p) => ({
120
119
  ...p,
121
- metadata: cast(
122
- p,
123
- `parameter (name: ${JSON.stringify(p.name)})`,
124
- p.category === "body" &&
125
- (p.contentType === "application/json" || p.encrypted === true),
126
- ),
120
+ metadata: cast(p, `parameter (name: ${JSON.stringify(p.name)})`),
127
121
  }));
128
122
  const success: ITypedHttpRouteSuccess = {
129
123
  ...props.operation.success,
130
- metadata: cast(
131
- props.operation.success,
132
- "success",
133
- props.operation.success.encrypted ||
134
- props.operation.success.contentType === "application/json",
135
- ),
124
+ metadata: cast(props.operation.success, "success"),
136
125
  setHeaders: props.operation.jsDocTags
137
126
  .filter(
138
127
  (t) =>
@@ -193,8 +182,21 @@ export namespace TypedHttpRouteAnalyzer {
193
182
  );
194
183
  };
195
184
 
185
+ /**
186
+ * Returns the dictionary of the components the routes actually use, after
187
+ * renaming components whose names collide with different definitions.
188
+ *
189
+ * @evidence contracts/common.md#principled-implementation Objects, aliases and recursive arrays/tuples share their emitted accessor-path slots, while finite and object-mediated collections remain kind-specific inline groups. Different semantic classes in one slot receive unique controller-qualified names, and the emitted dictionary follows escaped returns rather than original-only toJSON declarations.
190
+ * @evidence contracts/common.md#clear-and-simple-design One function over private collectors.
191
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Finite partition refinement preserves semantic discriminators and user payloads while component edges reference equivalence classes. Only actual component ordinals are omitted; no foreign name cache or generated text is rewritten.
192
+ * @evidence contracts/common.md#meaningful-documentation The comment states the result and the rename.
193
+ * efficient algorithms: Each refinement round encodes each distinct component body with constant-sized component edges. The partition only splits and stabilizes within the distinct component count, avoiding exponential expansion of shared DAGs.
194
+ * reuse equivalent work: One local partition compares all routes together, reuses graph node colors for shared children and supplies all collision groups; equivalent same-slot definitions reuse one emitted representative.
195
+ * bound retention and release resources: Collected nodes, partitions and visited sets are local to this synchronous call and are released with it; the returned dictionary retains only its reachable emitted representatives.
196
+ * @evidenceExclude contracts/portability.md#os-neutral-implementation TypedHttpRouteAnalyzer.routeDictionary analyzes reflected route metadata; it does not resolve native file identity or launch a process. Source resolution and file emission belong to their filesystem owners.
197
+ */
196
198
  export const routeDictionary = (
197
- routes: Array<ITypedHttpRoute>,
199
+ routes: Array<ITypedHttpRoute | ITypedMcpRoute>,
198
200
  ): IMetadataDictionary => {
199
201
  renameDuplicateComponents(routes);
200
202
  const dictionary: IMetadataDictionary = {
@@ -203,20 +205,9 @@ export namespace TypedHttpRouteAnalyzer {
203
205
  arrays: new Map(),
204
206
  tuples: new Map(),
205
207
  };
206
- for (const route of routes) {
207
- for (const p of [
208
- ...route.pathParameters,
209
- ...route.queryParameters,
210
- ...route.headerParameters,
211
- ...(route.queryObject ? [route.queryObject] : []),
212
- ...(route.body ? [route.body] : []),
213
- ...(route.headerObject ? [route.headerObject] : []),
214
- ])
215
- enrollMetadata(dictionary, p.metadata);
216
- for (const e of Object.values(route.exceptions))
217
- enrollMetadata(dictionary, e.metadata);
218
- enrollMetadata(dictionary, route.success.metadata);
219
- }
208
+ for (const route of routes)
209
+ for (const metadata of routeMetadatas(route))
210
+ enrollMetadata(dictionary, metadata);
220
211
  return dictionary;
221
212
  };
222
213
  }
@@ -230,21 +221,51 @@ type ComponentType =
230
221
 
231
222
  interface IComponentEntry {
232
223
  kind: ComponentKind;
233
- route: ITypedHttpRoute;
224
+ route: ITypedHttpRoute | ITypedMcpRoute;
234
225
  signature: string;
235
226
  type: ComponentType;
236
227
  }
237
228
 
238
- const renameDuplicateComponents = (routes: ITypedHttpRoute[]): void => {
229
+ const renameDuplicateComponents = (
230
+ routes: Array<ITypedHttpRoute | ITypedMcpRoute>,
231
+ ): void => {
239
232
  const entries: IComponentEntry[] = [];
240
233
  for (const route of routes)
241
234
  for (const metadata of routeMetadatas(route))
242
235
  collectComponentEntries(entries, route, metadata);
236
+ // Original toJSON definitions participate in semantic comparison but do not
237
+ // become emitted declarations unless another route uses them directly.
238
+ const comparisonEntries: IComponentEntry[] = [];
239
+ for (const route of routes)
240
+ for (const metadata of routeMetadatas(route))
241
+ collectComponentEntries(
242
+ comparisonEntries,
243
+ route,
244
+ metadata,
245
+ createCollectVisited(),
246
+ true,
247
+ );
248
+ const signatures = componentSignatures(comparisonEntries);
249
+ for (const entry of entries) entry.signature = signatures.get(entry.type)!;
243
250
 
244
- const used: Set<string> = new Set(entries.map((e) => e.type!.name));
251
+ const used: Set<string> = new Set(
252
+ entries.map((e) => StringUtil.accessorsOf(e.type.name).join(".")),
253
+ );
245
254
  const groups: Map<string, IComponentEntry[]> = new Map();
246
255
  for (const entry of entries) {
247
- const key: string = `${entry.kind}:${entry.type!.name}`;
256
+ // Named recursive collections also need a declaration to break cycles.
257
+ // Ordinary arrays and tuples remain inline forms without their own slot.
258
+ const slot =
259
+ entry.kind === "objects" ||
260
+ entry.kind === "aliases" ||
261
+ entry.type.recursive
262
+ ? "declarations"
263
+ : entry.kind;
264
+ const name =
265
+ slot === "declarations"
266
+ ? StringUtil.accessorsOf(entry.type.name).join(".")
267
+ : entry.type.name;
268
+ const key: string = `${slot}:${name}`;
248
269
  const group: IComponentEntry[] | undefined = groups.get(key);
249
270
  if (group === undefined) groups.set(key, [entry]);
250
271
  else group.push(entry);
@@ -267,55 +288,100 @@ const renameDuplicateComponents = (routes: ITypedHttpRoute[]): void => {
267
288
  `${prefix}.${oldName}`,
268
289
  );
269
290
  renamed.set(entry.signature, name);
270
- used.add(name);
291
+ used.add(StringUtil.accessorsOf(name).join("."));
271
292
  return name;
272
293
  })();
273
294
  (entry.type as { name: string }).name = next;
274
295
  }
275
296
  }
276
- for (const route of routes)
277
- for (const metadata of routeMetadatas(route))
278
- clearMetadataNameCache(metadata);
279
297
  };
280
298
 
281
- const routeMetadatas = (route: ITypedHttpRoute): MetadataSchema[] => [
282
- ...[
283
- ...route.pathParameters,
284
- ...route.queryParameters,
285
- ...route.headerParameters,
286
- ...(route.queryObject ? [route.queryObject] : []),
287
- ...(route.body ? [route.body] : []),
288
- ...(route.headerObject ? [route.headerObject] : []),
289
- ].map((p) => p.metadata),
290
- ...Object.values(route.exceptions).map((e) => e.metadata),
291
- route.success.metadata,
292
- ];
299
+ const routeMetadatas = (
300
+ route: ITypedHttpRoute | ITypedMcpRoute,
301
+ ): MetadataSchema[] =>
302
+ route.protocol === "mcp"
303
+ ? [route.inputMetadata, route.outputMetadata].filter(
304
+ (m): m is MetadataSchema => m !== undefined,
305
+ )
306
+ : [
307
+ ...[
308
+ ...route.pathParameters,
309
+ ...route.queryParameters,
310
+ ...route.headerParameters,
311
+ ...(route.queryObject ? [route.queryObject] : []),
312
+ ...(route.body ? [route.body] : []),
313
+ ...(route.headerObject ? [route.headerObject] : []),
314
+ ].map((p) => p.metadata),
315
+ ...Object.values(route.exceptions).map((e) => e.metadata),
316
+ route.success.metadata,
317
+ ];
293
318
 
294
319
  const collectComponentEntries = (
295
320
  entries: IComponentEntry[],
296
- route: ITypedHttpRoute,
321
+ route: ITypedHttpRoute | ITypedMcpRoute,
297
322
  metadata: MetadataSchema,
298
323
  visited: ICollectVisited = createCollectVisited(),
324
+ includeOriginal: boolean = false,
299
325
  ): void => {
300
326
  if (visited.schemas.has(metadata)) return;
301
327
  visited.schemas.add(metadata);
302
328
 
303
329
  if (metadata.rest !== null)
304
- collectComponentEntries(entries, route, metadata.rest, visited);
330
+ collectComponentEntries(
331
+ entries,
332
+ route,
333
+ metadata.rest,
334
+ visited,
335
+ includeOriginal,
336
+ );
305
337
  if (metadata.escaped !== null) {
306
- collectComponentEntries(entries, route, metadata.escaped.original, visited);
307
- collectComponentEntries(entries, route, metadata.escaped.returns, visited);
338
+ if (includeOriginal)
339
+ collectComponentEntries(
340
+ entries,
341
+ route,
342
+ metadata.escaped.original,
343
+ visited,
344
+ includeOriginal,
345
+ );
346
+ collectComponentEntries(
347
+ entries,
348
+ route,
349
+ metadata.escaped.returns,
350
+ visited,
351
+ includeOriginal,
352
+ );
308
353
  }
354
+ for (const template of metadata.templates)
355
+ for (const elem of template.row ?? template)
356
+ collectComponentEntries(entries, route, elem, visited, includeOriginal);
309
357
  for (const func of metadata.functions) {
310
358
  for (const p of func.parameters)
311
- collectComponentEntries(entries, route, p.type, visited);
312
- collectComponentEntries(entries, route, func.output, visited);
359
+ collectComponentEntries(entries, route, p.type, visited, includeOriginal);
360
+ collectComponentEntries(
361
+ entries,
362
+ route,
363
+ func.output,
364
+ visited,
365
+ includeOriginal,
366
+ );
313
367
  }
314
368
  for (const set of metadata.sets)
315
- collectComponentEntries(entries, route, set.value, visited);
369
+ collectComponentEntries(
370
+ entries,
371
+ route,
372
+ set.value,
373
+ visited,
374
+ includeOriginal,
375
+ );
316
376
  for (const map of metadata.maps) {
317
- collectComponentEntries(entries, route, map.key, visited);
318
- collectComponentEntries(entries, route, map.value, visited);
377
+ collectComponentEntries(entries, route, map.key, visited, includeOriginal);
378
+ collectComponentEntries(
379
+ entries,
380
+ route,
381
+ map.value,
382
+ visited,
383
+ includeOriginal,
384
+ );
319
385
  }
320
386
  for (const array of metadata.arrays)
321
387
  if (visited.arrays.has(array.type as MetadataArrayType) === false) {
@@ -328,6 +394,7 @@ const collectComponentEntries = (
328
394
  route,
329
395
  (array.type as MetadataArrayType as MetadataArrayType).value,
330
396
  visited,
397
+ includeOriginal,
331
398
  );
332
399
  }
333
400
  for (const tuple of metadata.tuples)
@@ -338,7 +405,7 @@ const collectComponentEntries = (
338
405
  );
339
406
  for (const elem of (tuple.type as MetadataTupleType as MetadataTupleType)
340
407
  .elements)
341
- collectComponentEntries(entries, route, elem, visited);
408
+ collectComponentEntries(entries, route, elem, visited, includeOriginal);
342
409
  }
343
410
  for (const alias of metadata.aliases)
344
411
  if (visited.aliases.has(alias.type as MetadataAliasType) === false) {
@@ -351,6 +418,7 @@ const collectComponentEntries = (
351
418
  route,
352
419
  (alias.type as MetadataAliasType as MetadataAliasType).value,
353
420
  visited,
421
+ includeOriginal,
354
422
  );
355
423
  }
356
424
  for (const obj of metadata.objects)
@@ -361,31 +429,96 @@ const collectComponentEntries = (
361
429
  );
362
430
  for (const p of (obj.type as MetadataObjectType as MetadataObjectType)
363
431
  .properties) {
364
- collectComponentEntries(entries, route, p.key, visited);
365
- collectComponentEntries(entries, route, p.value, visited);
432
+ collectComponentEntries(
433
+ entries,
434
+ route,
435
+ p.key,
436
+ visited,
437
+ includeOriginal,
438
+ );
439
+ collectComponentEntries(
440
+ entries,
441
+ route,
442
+ p.value,
443
+ visited,
444
+ includeOriginal,
445
+ );
366
446
  }
367
447
  }
368
448
  };
369
449
 
370
450
  const componentEntry = <T extends ComponentType>(
371
- route: ITypedHttpRoute,
451
+ route: ITypedHttpRoute | ITypedMcpRoute,
372
452
  kind: ComponentKind,
373
453
  type: T,
374
454
  ): IComponentEntry => ({
375
455
  kind,
376
456
  route,
377
- signature: componentSignature(type),
457
+ signature: "",
378
458
  type,
379
459
  });
380
460
 
381
- const componentSignature = (type: ComponentType): string =>
382
- JSON.stringify(type, (key, value) =>
383
- // `type` is the resolved back-reference attached by
384
- // `MetadataSchema.from`; it closes a cycle on recursive schemas.
385
- // `index` carries the per-route ordinal and is not part of the
386
- // component's identity.
387
- key === "index" || key === "type" ? undefined : value,
388
- );
461
+ /**
462
+ * Refines a finite component graph until no semantic equivalence class splits.
463
+ * Component edges carry class numbers, so shared children are never expanded as
464
+ * trees. Ordinary payloads retain separate object/array representations. Each
465
+ * round preserves the previous partition and can only split its classes; at
466
+ * most the number of distinct components rounds are necessary.
467
+ */
468
+ const componentSignatures = (
469
+ entries: IComponentEntry[],
470
+ ): Map<ComponentType, string> => {
471
+ const kinds = new Map<ComponentType, ComponentKind>();
472
+ for (const entry of entries) kinds.set(entry.type, entry.kind);
473
+ const nodes = [...kinds.keys()];
474
+ let colors = new Map(nodes.map((node) => [node, 0]));
475
+ let classes = nodes.length ? 1 : 0;
476
+ while (nodes.length) {
477
+ const intern = new Map<string, number>();
478
+ const next = new Map<ComponentType, number>();
479
+ for (const node of nodes) {
480
+ const ancestors = new WeakMap<object, number>();
481
+ let depth = 0;
482
+ const encode = (value: unknown, root = false): unknown => {
483
+ if (value === null || typeof value !== "object") return value;
484
+ if (!root && kinds.has(value as ComponentType))
485
+ return ["component", colors.get(value as ComponentType)];
486
+ const position = ancestors.get(value);
487
+ if (position !== undefined) return ["payload-cycle", position];
488
+ ancestors.set(value, depth++);
489
+ const result = Array.isArray(value)
490
+ ? ["array", value.map((child) => encode(child))]
491
+ : [
492
+ "object",
493
+ Object.entries(value)
494
+ .filter(
495
+ ([key, child]) =>
496
+ child !== undefined && !(root && key === "index"),
497
+ )
498
+ .map(([key, child]) => [key, encode(child)]),
499
+ ];
500
+ ancestors.delete(value);
501
+ --depth;
502
+ return result;
503
+ };
504
+ const signature = JSON.stringify([
505
+ colors.get(node),
506
+ kinds.get(node),
507
+ encode(node, true),
508
+ ]);
509
+ let color = intern.get(signature);
510
+ if (color === undefined) {
511
+ color = intern.size;
512
+ intern.set(signature, color);
513
+ }
514
+ next.set(node, color);
515
+ }
516
+ colors = next;
517
+ if (intern.size === classes) break;
518
+ classes = intern.size;
519
+ }
520
+ return new Map(nodes.map((node) => [node, String(colors.get(node))]));
521
+ };
389
522
 
390
523
  const normalizeComponentNamespace = (name: string): string => {
391
524
  const next: string = name.replace(/[^A-Za-z0-9_$]/g, "_");
@@ -393,63 +526,9 @@ const normalizeComponentNamespace = (name: string): string => {
393
526
  };
394
527
 
395
528
  const escapeComponentName = (used: Set<string>, name: string): string =>
396
- used.has(name) ? escapeComponentName(used, `_${name}`) : name;
397
-
398
- const clearMetadataNameCache = (
399
- metadata: MetadataSchema,
400
- visited: WeakSet<MetadataSchema> = new WeakSet(),
401
- ): void => {
402
- if (visited.has(metadata)) return;
403
- visited.add(metadata);
404
- (metadata as unknown as { name_?: string }).name_ = undefined;
405
-
406
- if (metadata.rest !== null) clearMetadataNameCache(metadata.rest, visited);
407
- if (metadata.escaped !== null) {
408
- clearMetadataNameCache(metadata.escaped.original, visited);
409
- clearMetadataNameCache(metadata.escaped.returns, visited);
410
- }
411
- for (const func of metadata.functions) {
412
- for (const p of func.parameters) clearMetadataNameCache(p.type, visited);
413
- clearMetadataNameCache(func.output, visited);
414
- }
415
- for (const set of metadata.sets) {
416
- (set as unknown as { name_?: string }).name_ = undefined;
417
- clearMetadataNameCache(set.value, visited);
418
- }
419
- for (const map of metadata.maps) {
420
- (map as unknown as { name_?: string }).name_ = undefined;
421
- clearMetadataNameCache(map.key, visited);
422
- clearMetadataNameCache(map.value, visited);
423
- }
424
- for (const array of metadata.arrays) {
425
- (array as unknown as { name_?: string }).name_ = undefined;
426
- clearMetadataNameCache(
427
- (array.type as MetadataArrayType as MetadataArrayType).value,
428
- visited,
429
- );
430
- }
431
- for (const tuple of metadata.tuples) {
432
- (tuple as unknown as { name_?: string }).name_ = undefined;
433
- for (const elem of (tuple.type as MetadataTupleType as MetadataTupleType)
434
- .elements)
435
- clearMetadataNameCache(elem, visited);
436
- }
437
- for (const alias of metadata.aliases) {
438
- (alias as unknown as { name_?: string }).name_ = undefined;
439
- clearMetadataNameCache(
440
- (alias.type as MetadataAliasType as MetadataAliasType).value,
441
- visited,
442
- );
443
- }
444
- for (const obj of metadata.objects) {
445
- (obj as unknown as { name_?: string }).name_ = undefined;
446
- for (const p of (obj.type as MetadataObjectType as MetadataObjectType)
447
- .properties) {
448
- clearMetadataNameCache(p.key, visited);
449
- clearMetadataNameCache(p.value, visited);
450
- }
451
- }
452
- };
529
+ used.has(StringUtil.accessorsOf(name).join("."))
530
+ ? escapeComponentName(used, `_${name}`)
531
+ : name;
453
532
 
454
533
  interface ICollectVisited {
455
534
  aliases: WeakSet<MetadataAliasType>;
@@ -467,27 +546,6 @@ const createCollectVisited = (): ICollectVisited => ({
467
546
  tuples: new WeakSet<MetadataTupleType>(),
468
547
  });
469
548
 
470
- const uniqueComponents = <T extends { name: string }>(input: T[]): T[] => {
471
- const dict: Record<string, T> = {};
472
- for (const elem of input) {
473
- const oldbie: T | undefined = dict[elem.name];
474
- if (oldbie === undefined) dict[elem.name] = elem;
475
- else if (
476
- elem.name.includes(".") ||
477
- componentScore(oldbie) < componentScore(elem)
478
- )
479
- dict[elem.name] = elem;
480
- }
481
- return Object.values(dict);
482
- };
483
-
484
- const componentScore = (input: unknown): number =>
485
- JSON.stringify(input, (key, value) =>
486
- // Resolved-reference back-edges close cycles on recursive schemas;
487
- // skip them when scoring component "richness".
488
- key === "type" ? undefined : value,
489
- ).length;
490
-
491
549
  const enrollMetadata = (
492
550
  dictionary: IMetadataDictionary,
493
551
  metadata: MetadataSchema,
@@ -499,9 +557,11 @@ const enrollMetadata = (
499
557
  if (metadata.rest !== null)
500
558
  enrollMetadata(dictionary, metadata.rest, visited);
501
559
  if (metadata.escaped !== null) {
502
- enrollMetadata(dictionary, metadata.escaped.original, visited);
503
560
  enrollMetadata(dictionary, metadata.escaped.returns, visited);
504
561
  }
562
+ for (const template of metadata.templates)
563
+ for (const elem of template.row ?? template)
564
+ enrollMetadata(dictionary, elem, visited);
505
565
  for (const func of metadata.functions) {
506
566
  for (const p of func.parameters)
507
567
  enrollMetadata(dictionary, p.type, visited);
@@ -551,17 +611,13 @@ const enroll = <
551
611
  dict: Map<string, T>,
552
612
  elem: T,
553
613
  ): boolean => {
614
+ // Collision refinement established equivalence for every remaining same-name
615
+ // entry in this kind; selecting another representative cannot add meaning.
554
616
  const oldbie: T | undefined = dict.get(elem.name);
555
617
  if (oldbie === elem) return false;
556
618
  if (oldbie === undefined) {
557
619
  dict.set(elem.name, elem);
558
620
  return true;
559
- } else if (
560
- elem.name.includes(".") ||
561
- componentScore(oldbie) < componentScore(elem)
562
- ) {
563
- dict.set(elem.name, elem);
564
- return true;
565
621
  }
566
622
  return false;
567
623
  };