@tsonic/frontend 0.0.62 → 0.0.63

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/dist/.tsbuildinfo +1 -1
  2. package/dist/dependency-graph.d.ts +1 -1
  3. package/dist/dependency-graph.d.ts.map +1 -1
  4. package/dist/dependency-graph.js +1 -1
  5. package/dist/dependency-graph.js.map +1 -1
  6. package/dist/dotnet-metadata.d.ts +0 -12
  7. package/dist/dotnet-metadata.d.ts.map +1 -1
  8. package/dist/dotnet-metadata.js +0 -24
  9. package/dist/dotnet-metadata.js.map +1 -1
  10. package/dist/generic-function-values.d.ts +11 -0
  11. package/dist/generic-function-values.d.ts.map +1 -0
  12. package/dist/generic-function-values.js +243 -0
  13. package/dist/generic-function-values.js.map +1 -0
  14. package/dist/generic-function-values.test.d.ts +2 -0
  15. package/dist/generic-function-values.test.d.ts.map +1 -0
  16. package/dist/generic-function-values.test.js +256 -0
  17. package/dist/generic-function-values.test.js.map +1 -0
  18. package/dist/graph/extraction/imports.d.ts +5 -0
  19. package/dist/graph/extraction/imports.d.ts.map +1 -1
  20. package/dist/graph/extraction/imports.js +30 -0
  21. package/dist/graph/extraction/imports.js.map +1 -1
  22. package/dist/graph/extraction/index.d.ts +1 -1
  23. package/dist/graph/extraction/index.d.ts.map +1 -1
  24. package/dist/graph/extraction/index.js +1 -1
  25. package/dist/graph/extraction/index.js.map +1 -1
  26. package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
  27. package/dist/graph/extraction/orchestrator.js +16 -2
  28. package/dist/graph/extraction/orchestrator.js.map +1 -1
  29. package/dist/graph/extraction.d.ts +1 -1
  30. package/dist/graph/extraction.d.ts.map +1 -1
  31. package/dist/graph/extraction.js +1 -1
  32. package/dist/graph/extraction.js.map +1 -1
  33. package/dist/ir/binding/binding-factory.d.ts +17 -0
  34. package/dist/ir/binding/binding-factory.d.ts.map +1 -0
  35. package/dist/ir/binding/binding-factory.js +765 -0
  36. package/dist/ir/binding/binding-factory.js.map +1 -0
  37. package/dist/ir/binding/binding-helpers.d.ts +90 -0
  38. package/dist/ir/binding/binding-helpers.d.ts.map +1 -0
  39. package/dist/ir/binding/binding-helpers.js +387 -0
  40. package/dist/ir/binding/binding-helpers.js.map +1 -0
  41. package/dist/ir/binding/binding-types.d.ts +203 -0
  42. package/dist/ir/binding/binding-types.d.ts.map +1 -0
  43. package/dist/ir/binding/binding-types.js +9 -0
  44. package/dist/ir/binding/binding-types.js.map +1 -0
  45. package/dist/ir/binding/index.d.ts +4 -158
  46. package/dist/ir/binding/index.d.ts.map +1 -1
  47. package/dist/ir/binding/index.js +3 -1134
  48. package/dist/ir/binding/index.js.map +1 -1
  49. package/dist/ir/builder.test.js +223 -0
  50. package/dist/ir/builder.test.js.map +1 -1
  51. package/dist/ir/converters/anonymous-synthesis.d.ts +3 -3
  52. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
  53. package/dist/ir/converters/anonymous-synthesis.js +45 -8
  54. package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
  55. package/dist/ir/converters/expressions/access/access-converter.d.ts +14 -0
  56. package/dist/ir/converters/expressions/access/access-converter.d.ts.map +1 -0
  57. package/dist/ir/converters/expressions/access/access-converter.js +141 -0
  58. package/dist/ir/converters/expressions/access/access-converter.js.map +1 -0
  59. package/dist/ir/converters/expressions/access/binding-resolution.d.ts +35 -0
  60. package/dist/ir/converters/expressions/access/binding-resolution.d.ts.map +1 -0
  61. package/dist/ir/converters/expressions/access/binding-resolution.js +384 -0
  62. package/dist/ir/converters/expressions/access/binding-resolution.js.map +1 -0
  63. package/dist/ir/converters/expressions/access/member-resolution.d.ts +67 -0
  64. package/dist/ir/converters/expressions/access/member-resolution.d.ts.map +1 -0
  65. package/dist/ir/converters/expressions/access/member-resolution.js +262 -0
  66. package/dist/ir/converters/expressions/access/member-resolution.js.map +1 -0
  67. package/dist/ir/converters/expressions/access.d.ts +1 -7
  68. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  69. package/dist/ir/converters/expressions/access.js +1 -720
  70. package/dist/ir/converters/expressions/access.js.map +1 -1
  71. package/dist/ir/converters/expressions/calls/call-converter.d.ts +23 -0
  72. package/dist/ir/converters/expressions/calls/call-converter.d.ts.map +1 -0
  73. package/dist/ir/converters/expressions/calls/call-converter.js +526 -0
  74. package/dist/ir/converters/expressions/calls/call-converter.js.map +1 -0
  75. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts +53 -0
  76. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts.map +1 -0
  77. package/dist/ir/converters/expressions/calls/call-site-analysis.js +554 -0
  78. package/dist/ir/converters/expressions/calls/call-site-analysis.js.map +1 -0
  79. package/dist/ir/converters/expressions/calls/new-converter.d.ts +21 -0
  80. package/dist/ir/converters/expressions/calls/new-converter.d.ts.map +1 -0
  81. package/dist/ir/converters/expressions/calls/new-converter.js +182 -0
  82. package/dist/ir/converters/expressions/calls/new-converter.js.map +1 -0
  83. package/dist/ir/converters/expressions/calls.d.ts +2 -28
  84. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  85. package/dist/ir/converters/expressions/calls.js +2 -1344
  86. package/dist/ir/converters/expressions/calls.js.map +1 -1
  87. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  88. package/dist/ir/converters/expressions/collections.js +37 -6
  89. package/dist/ir/converters/expressions/collections.js.map +1 -1
  90. package/dist/ir/converters/expressions/functions.js +1 -1
  91. package/dist/ir/converters/expressions/functions.js.map +1 -1
  92. package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
  93. package/dist/ir/converters/expressions/helpers.js +1 -0
  94. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  95. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  96. package/dist/ir/converters/expressions/other.js +3 -2
  97. package/dist/ir/converters/expressions/other.js.map +1 -1
  98. package/dist/ir/converters/flow-narrowing.d.ts.map +1 -1
  99. package/dist/ir/converters/flow-narrowing.js +3 -2
  100. package/dist/ir/converters/flow-narrowing.js.map +1 -1
  101. package/dist/ir/converters/statements/declarations/classes/methods.js +1 -1
  102. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  103. package/dist/ir/converters/statements/declarations/type-aliases.js +1 -1
  104. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  105. package/dist/ir/converters/statements/declarations/variables.d.ts +2 -2
  106. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  107. package/dist/ir/converters/statements/declarations/variables.js +289 -2
  108. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  109. package/dist/ir/expression-converter.d.ts +0 -1
  110. package/dist/ir/expression-converter.d.ts.map +1 -1
  111. package/dist/ir/expression-converter.js +0 -2
  112. package/dist/ir/expression-converter.js.map +1 -1
  113. package/dist/ir/generic-function-value-lowering.test.d.ts +2 -0
  114. package/dist/ir/generic-function-value-lowering.test.d.ts.map +1 -0
  115. package/dist/ir/generic-function-value-lowering.test.js +312 -0
  116. package/dist/ir/generic-function-value-lowering.test.js.map +1 -0
  117. package/dist/ir/generic-validator.d.ts +3 -4
  118. package/dist/ir/generic-validator.d.ts.map +1 -1
  119. package/dist/ir/generic-validator.js +3 -35
  120. package/dist/ir/generic-validator.js.map +1 -1
  121. package/dist/ir/program-context.d.ts +7 -0
  122. package/dist/ir/program-context.d.ts.map +1 -1
  123. package/dist/ir/program-context.js +1 -0
  124. package/dist/ir/program-context.js.map +1 -1
  125. package/dist/ir/statement-converter.d.ts +0 -2
  126. package/dist/ir/statement-converter.d.ts.map +1 -1
  127. package/dist/ir/statement-converter.js +0 -3
  128. package/dist/ir/statement-converter.js.map +1 -1
  129. package/dist/ir/type-system/internal/handle-types.d.ts +16 -16
  130. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -1
  131. package/dist/ir/type-system/internal/nominal-env.d.ts +0 -2
  132. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -1
  133. package/dist/ir/type-system/internal/nominal-env.js +2 -6
  134. package/dist/ir/type-system/internal/nominal-env.js.map +1 -1
  135. package/dist/ir/type-system/internal/type-converter/converter.d.ts +3 -1
  136. package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -1
  137. package/dist/ir/type-system/internal/type-converter/converter.js +3 -1
  138. package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -1
  139. package/dist/ir/type-system/internal/type-converter/objects.js +7 -1
  140. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -1
  141. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts +0 -2
  142. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -1
  143. package/dist/ir/type-system/internal/type-converter/orchestrator.js +315 -23
  144. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -1
  145. package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts +2 -0
  146. package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts.map +1 -0
  147. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js +265 -0
  148. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js.map +1 -0
  149. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -1
  150. package/dist/ir/type-system/internal/type-converter/primitives.js +5 -0
  151. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -1
  152. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -1
  153. package/dist/ir/type-system/internal/type-converter/references.js +67 -29
  154. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -1
  155. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -1
  156. package/dist/ir/type-system/internal/type-converter/utility-types.js +145 -0
  157. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -1
  158. package/dist/ir/type-system/internal/type-converter/utility-types.test.js +91 -1
  159. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -1
  160. package/dist/ir/type-system/internal/type-registry.d.ts +1 -1
  161. package/dist/ir/type-system/internal/type-registry.js +7 -7
  162. package/dist/ir/type-system/internal/type-registry.js.map +1 -1
  163. package/dist/ir/type-system/internal/universe/alias-table.d.ts +0 -14
  164. package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -1
  165. package/dist/ir/type-system/internal/universe/alias-table.js +0 -17
  166. package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -1
  167. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +3 -0
  168. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -1
  169. package/dist/ir/type-system/internal/universe/clr-catalog.js +4 -1044
  170. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -1
  171. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts +51 -0
  172. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts.map +1 -0
  173. package/dist/ir/type-system/internal/universe/clr-entry-converter.js +657 -0
  174. package/dist/ir/type-system/internal/universe/clr-entry-converter.js.map +1 -0
  175. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts +52 -0
  176. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts.map +1 -0
  177. package/dist/ir/type-system/internal/universe/clr-type-parser.js +415 -0
  178. package/dist/ir/type-system/internal/universe/clr-type-parser.js.map +1 -0
  179. package/dist/ir/type-system/internal/universe/index.d.ts +1 -1
  180. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -1
  181. package/dist/ir/type-system/internal/universe/index.js +1 -3
  182. package/dist/ir/type-system/internal/universe/index.js.map +1 -1
  183. package/dist/ir/type-system/internal/universe/unified-universe.test.js +2 -0
  184. package/dist/ir/type-system/internal/universe/unified-universe.test.js.map +1 -1
  185. package/dist/ir/type-system/type-system-call-resolution.d.ts +69 -0
  186. package/dist/ir/type-system/type-system-call-resolution.d.ts.map +1 -0
  187. package/dist/ir/type-system/type-system-call-resolution.js +1121 -0
  188. package/dist/ir/type-system/type-system-call-resolution.js.map +1 -0
  189. package/dist/ir/type-system/type-system-inference.d.ts +98 -0
  190. package/dist/ir/type-system/type-system-inference.d.ts.map +1 -0
  191. package/dist/ir/type-system/type-system-inference.js +1083 -0
  192. package/dist/ir/type-system/type-system-inference.js.map +1 -0
  193. package/dist/ir/type-system/type-system-relations.d.ts +15 -0
  194. package/dist/ir/type-system/type-system-relations.d.ts.map +1 -0
  195. package/dist/ir/type-system/type-system-relations.js +152 -0
  196. package/dist/ir/type-system/type-system-relations.js.map +1 -0
  197. package/dist/ir/type-system/type-system-state.d.ts +436 -0
  198. package/dist/ir/type-system/type-system-state.d.ts.map +1 -0
  199. package/dist/ir/type-system/type-system-state.js +212 -0
  200. package/dist/ir/type-system/type-system-state.js.map +1 -0
  201. package/dist/ir/type-system/type-system-utilities.d.ts +56 -0
  202. package/dist/ir/type-system/type-system-utilities.d.ts.map +1 -0
  203. package/dist/ir/type-system/type-system-utilities.js +373 -0
  204. package/dist/ir/type-system/type-system-utilities.js.map +1 -0
  205. package/dist/ir/type-system/type-system.d.ts +17 -358
  206. package/dist/ir/type-system/type-system.d.ts.map +1 -1
  207. package/dist/ir/type-system/type-system.js +67 -2945
  208. package/dist/ir/type-system/type-system.js.map +1 -1
  209. package/dist/ir/types/index.d.ts +1 -0
  210. package/dist/ir/types/index.d.ts.map +1 -1
  211. package/dist/ir/types/index.js +1 -0
  212. package/dist/ir/types/index.js.map +1 -1
  213. package/dist/ir/types/ir-substitution.js +1 -1
  214. package/dist/ir/types/ir-substitution.js.map +1 -1
  215. package/dist/ir/types/statements.d.ts +1 -1
  216. package/dist/ir/types/type-ops.d.ts +9 -0
  217. package/dist/ir/types/type-ops.d.ts.map +1 -0
  218. package/dist/ir/types/type-ops.js +134 -0
  219. package/dist/ir/types/type-ops.js.map +1 -0
  220. package/dist/ir/types/type-ops.test.d.ts +2 -0
  221. package/dist/ir/types/type-ops.test.d.ts.map +1 -0
  222. package/dist/ir/types/type-ops.test.js +73 -0
  223. package/dist/ir/types/type-ops.test.js.map +1 -0
  224. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts +58 -0
  225. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts.map +1 -0
  226. package/dist/ir/validation/attribute-collection/arg-extractor.js +284 -0
  227. package/dist/ir/validation/attribute-collection/arg-extractor.js.map +1 -0
  228. package/dist/ir/validation/attribute-collection/marker-parser.d.ts +28 -0
  229. package/dist/ir/validation/attribute-collection/marker-parser.d.ts.map +1 -0
  230. package/dist/ir/validation/attribute-collection/marker-parser.js +404 -0
  231. package/dist/ir/validation/attribute-collection/marker-parser.js.map +1 -0
  232. package/dist/ir/validation/attribute-collection/orchestrator.d.ts +28 -0
  233. package/dist/ir/validation/attribute-collection/orchestrator.d.ts.map +1 -0
  234. package/dist/ir/validation/attribute-collection/orchestrator.js +332 -0
  235. package/dist/ir/validation/attribute-collection/orchestrator.js.map +1 -0
  236. package/dist/ir/validation/attribute-collection-pass.d.ts +1 -23
  237. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  238. package/dist/ir/validation/attribute-collection-pass.js +1 -961
  239. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  240. package/dist/ir/validation/attribute-collection-pass.test.js +12 -6
  241. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  242. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  243. package/dist/ir/validation/soundness-gate.js +2 -1
  244. package/dist/ir/validation/soundness-gate.js.map +1 -1
  245. package/dist/ir/validation/soundness-gate.test.js +69 -0
  246. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  247. package/dist/ir/validation/yield-lowering-pass.d.ts +11 -5
  248. package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -1
  249. package/dist/ir/validation/yield-lowering-pass.js +942 -48
  250. package/dist/ir/validation/yield-lowering-pass.js.map +1 -1
  251. package/dist/ir/validation/yield-lowering-pass.test.js +1333 -127
  252. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  253. package/dist/program/binding-loader.d.ts +37 -0
  254. package/dist/program/binding-loader.d.ts.map +1 -0
  255. package/dist/program/binding-loader.js +155 -0
  256. package/dist/program/binding-loader.js.map +1 -0
  257. package/dist/program/binding-registry.d.ts +106 -0
  258. package/dist/program/binding-registry.d.ts.map +1 -0
  259. package/dist/program/binding-registry.js +590 -0
  260. package/dist/program/binding-registry.js.map +1 -0
  261. package/dist/program/binding-types.d.ts +166 -0
  262. package/dist/program/binding-types.d.ts.map +1 -0
  263. package/dist/program/binding-types.js +57 -0
  264. package/dist/program/binding-types.js.map +1 -0
  265. package/dist/program/bindings.d.ts +6 -271
  266. package/dist/program/bindings.d.ts.map +1 -1
  267. package/dist/program/bindings.js +7 -781
  268. package/dist/program/bindings.js.map +1 -1
  269. package/dist/resolver/clr-bindings-resolver.d.ts +0 -1
  270. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  271. package/dist/resolver/clr-bindings-resolver.js +22 -32
  272. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  273. package/dist/resolver/clr-bindings-resolver.test.js +0 -27
  274. package/dist/resolver/clr-bindings-resolver.test.js.map +1 -1
  275. package/dist/resolver/import-resolution.d.ts +1 -1
  276. package/dist/resolver/import-resolution.d.ts.map +1 -1
  277. package/dist/resolver/import-resolution.js +2 -7
  278. package/dist/resolver/import-resolution.js.map +1 -1
  279. package/dist/resolver/naming.d.ts.map +1 -1
  280. package/dist/resolver/naming.js +1 -0
  281. package/dist/resolver/naming.js.map +1 -1
  282. package/dist/types/diagnostic.d.ts +1 -1
  283. package/dist/types/diagnostic.d.ts.map +1 -1
  284. package/dist/types/diagnostic.js.map +1 -1
  285. package/dist/validation/features.d.ts.map +1 -1
  286. package/dist/validation/features.js +38 -13
  287. package/dist/validation/features.js.map +1 -1
  288. package/dist/validation/features.test.d.ts +2 -0
  289. package/dist/validation/features.test.d.ts.map +1 -0
  290. package/dist/validation/features.test.js +273 -0
  291. package/dist/validation/features.test.js.map +1 -0
  292. package/dist/validation/generics.d.ts +1 -1
  293. package/dist/validation/generics.d.ts.map +1 -1
  294. package/dist/validation/generics.js +2 -26
  295. package/dist/validation/generics.js.map +1 -1
  296. package/dist/validation/imports.d.ts.map +1 -1
  297. package/dist/validation/imports.js +2 -1
  298. package/dist/validation/imports.js.map +1 -1
  299. package/dist/validation/imports.test.d.ts +2 -0
  300. package/dist/validation/imports.test.d.ts.map +1 -0
  301. package/dist/validation/imports.test.js +112 -0
  302. package/dist/validation/imports.test.js.map +1 -0
  303. package/dist/validation/static-safety.d.ts +6 -6
  304. package/dist/validation/static-safety.d.ts.map +1 -1
  305. package/dist/validation/static-safety.js +163 -109
  306. package/dist/validation/static-safety.js.map +1 -1
  307. package/dist/validation/unsupported-utility-types.d.ts +3 -3
  308. package/dist/validation/unsupported-utility-types.d.ts.map +1 -1
  309. package/dist/validation/unsupported-utility-types.js +4 -7
  310. package/dist/validation/unsupported-utility-types.js.map +1 -1
  311. package/dist/validator.maximus.test.d.ts +2 -0
  312. package/dist/validator.maximus.test.d.ts.map +1 -0
  313. package/dist/validator.maximus.test.js +1214 -0
  314. package/dist/validator.maximus.test.js.map +1 -0
  315. package/dist/validator.test.js +152 -18
  316. package/dist/validator.test.js.map +1 -1
  317. package/package.json +1 -1
  318. package/dist/ir/converters/statements/declarations/registry.d.ts +0 -96
  319. package/dist/ir/converters/statements/declarations/registry.d.ts.map +0 -1
  320. package/dist/ir/converters/statements/declarations/registry.js +0 -130
  321. package/dist/ir/converters/statements/declarations/registry.js.map +0 -1
  322. package/dist/ir/this-parameter-inference.test.d.ts +0 -13
  323. package/dist/ir/this-parameter-inference.test.d.ts.map +0 -1
  324. package/dist/ir/this-parameter-inference.test.js +0 -165
  325. package/dist/ir/this-parameter-inference.test.js.map +0 -1
  326. package/dist/metadata/bindings-loader.d.ts +0 -41
  327. package/dist/metadata/bindings-loader.d.ts.map +0 -1
  328. package/dist/metadata/bindings-loader.js +0 -308
  329. package/dist/metadata/bindings-loader.js.map +0 -1
  330. package/dist/metadata/bindings-loader.test.d.ts +0 -5
  331. package/dist/metadata/bindings-loader.test.d.ts.map +0 -1
  332. package/dist/metadata/bindings-loader.test.js +0 -117
  333. package/dist/metadata/bindings-loader.test.js.map +0 -1
  334. package/dist/metadata/index.d.ts +0 -8
  335. package/dist/metadata/index.d.ts.map +0 -1
  336. package/dist/metadata/index.js +0 -7
  337. package/dist/metadata/index.js.map +0 -1
  338. package/dist/metadata/library-loader.d.ts +0 -42
  339. package/dist/metadata/library-loader.d.ts.map +0 -1
  340. package/dist/metadata/library-loader.js +0 -126
  341. package/dist/metadata/library-loader.js.map +0 -1
  342. package/dist/metadata/loader.d.ts +0 -26
  343. package/dist/metadata/loader.d.ts.map +0 -1
  344. package/dist/metadata/loader.js +0 -333
  345. package/dist/metadata/loader.js.map +0 -1
  346. package/dist/metadata/loader.test.d.ts +0 -5
  347. package/dist/metadata/loader.test.d.ts.map +0 -1
  348. package/dist/metadata/loader.test.js +0 -119
  349. package/dist/metadata/loader.test.js.map +0 -1
  350. package/dist/resolver/naming-policy.d.ts +0 -20
  351. package/dist/resolver/naming-policy.d.ts.map +0 -1
  352. package/dist/resolver/naming-policy.js +0 -40
  353. package/dist/resolver/naming-policy.js.map +0 -1
  354. package/dist/types/bindings.d.ts +0 -153
  355. package/dist/types/bindings.d.ts.map +0 -1
  356. package/dist/types/bindings.js +0 -14
  357. package/dist/types/bindings.js.map +0 -1
  358. package/dist/types/metadata.d.ts +0 -196
  359. package/dist/types/metadata.d.ts.map +0 -1
  360. package/dist/types/metadata.js +0 -10
  361. package/dist/types/metadata.js.map +0 -1
  362. package/dist/types/nested-types.d.ts +0 -111
  363. package/dist/types/nested-types.d.ts.map +0 -1
  364. package/dist/types/nested-types.js +0 -176
  365. package/dist/types/nested-types.js.map +0 -1
  366. package/dist/types/nested-types.test.d.ts +0 -5
  367. package/dist/types/nested-types.test.d.ts.map +0 -1
  368. package/dist/types/nested-types.test.js +0 -135
  369. package/dist/types/nested-types.test.js.map +0 -1
  370. package/dist/types/ref-parameters.d.ts +0 -123
  371. package/dist/types/ref-parameters.d.ts.map +0 -1
  372. package/dist/types/ref-parameters.js +0 -203
  373. package/dist/types/ref-parameters.js.map +0 -1
  374. package/dist/types/ref-parameters.test.d.ts +0 -5
  375. package/dist/types/ref-parameters.test.d.ts.map +0 -1
  376. package/dist/types/ref-parameters.test.js +0 -147
  377. package/dist/types/ref-parameters.test.js.map +0 -1
@@ -1,787 +1,13 @@
1
1
  /**
2
2
  * Binding manifest loading - maps JS/TS names to CLR types/members
3
3
  * See spec/bindings.md for full manifest format
4
- */
5
- import * as fs from "node:fs";
6
- import * as path from "node:path";
7
- import { tsbindgenClrTypeNameToTsTypeName } from "../tsbindgen/names.js";
8
- /**
9
- * Type guard to check if a manifest is the full format
10
- */
11
- const isFullBindingManifest = (manifest) => {
12
- return "assembly" in manifest && "namespaces" in manifest;
13
- };
14
- /**
15
- * Type guard to check if a manifest is the tsbindgen format
16
- */
17
- const isTsbindgenBindingFile = (manifest) => {
18
- return ("namespace" in manifest &&
19
- "types" in manifest &&
20
- !("namespaces" in manifest));
21
- };
22
- /**
23
- * Validate that a parsed JSON object is a valid binding file format.
24
- * Returns an error message if invalid, undefined if valid.
25
- */
26
- const validateBindingFile = (obj, filePath) => {
27
- if (obj === null || typeof obj !== "object") {
28
- return `${filePath}: Expected object, got ${typeof obj}`;
29
- }
30
- const manifest = obj;
31
- // Check for tsbindgen format
32
- if ("namespace" in manifest && "types" in manifest) {
33
- if (typeof manifest.namespace !== "string") {
34
- return `${filePath}: 'namespace' must be a string`;
35
- }
36
- if (!Array.isArray(manifest.types)) {
37
- return `${filePath}: 'types' must be an array`;
38
- }
39
- return undefined; // Valid tsbindgen format
40
- }
41
- // Check for full manifest format
42
- if ("assembly" in manifest && "namespaces" in manifest) {
43
- if (typeof manifest.assembly !== "string") {
44
- return `${filePath}: 'assembly' must be a string`;
45
- }
46
- if (!Array.isArray(manifest.namespaces)) {
47
- return `${filePath}: 'namespaces' must be an array`;
48
- }
49
- return undefined; // Valid full format
50
- }
51
- // Check for simple format (global/module bindings)
52
- if ("bindings" in manifest) {
53
- if (typeof manifest.bindings !== "object" || manifest.bindings === null) {
54
- return `${filePath}: 'bindings' must be an object`;
55
- }
56
- return undefined; // Valid simple format
57
- }
58
- return `${filePath}: Unrecognized binding file format. Expected tsbindgen (namespace+types), full (assembly+namespaces), or simple (bindings) format.`;
59
- };
60
- /**
61
- * Registry of all loaded bindings
62
- * Supports simple (global/module) and hierarchical (namespace/type/member) formats
63
- */
64
- export class BindingRegistry {
65
- constructor() {
66
- this.loadedBindingFiles = new Set();
67
- // Simple format: global/module bindings for identifiers like console, Math, fs
68
- this.simpleBindings = new Map();
69
- // Hierarchical format: namespace/type/member bindings
70
- this.namespaces = new Map();
71
- this.types = new Map(); // Flat lookup by TS name
72
- this.members = new Map(); // Flat lookup by "type.member"
73
- this.memberOverloads = new Map(); // Overload-aware lookup by "type.member"
74
- this.clrMemberOverloads = new Map(); // Overload-aware lookup by CLR target key
75
- this.tsbindgenExports = new Map();
76
- this.tsSupertypes = new Map();
77
- /**
78
- * Extension method index for instance-style calls.
79
- *
80
- * Keyed by:
81
- * - declaring namespace key (CLR namespace with '.' replaced by '_', e.g. "System_Linq")
82
- * - receiver TS type name (e.g. "IEnumerable_1")
83
- * - method TS name (e.g. "where")
84
- *
85
- * Values are one or more candidates (overloads share the same target).
86
- */
87
- this.extensionMethods = new Map();
88
- }
89
- getExtensionMethodCandidates(namespaceKey, receiverTypeName, methodTsName) {
90
- return this.extensionMethods
91
- .get(namespaceKey)
92
- ?.get(receiverTypeName)
93
- ?.get(methodTsName);
94
- }
95
- addSupertype(typeAlias, superAlias) {
96
- if (!typeAlias || !superAlias)
97
- return;
98
- if (typeAlias === superAlias)
99
- return;
100
- const set = this.tsSupertypes.get(typeAlias) ?? new Set();
101
- set.add(superAlias);
102
- this.tsSupertypes.set(typeAlias, set);
103
- }
104
- getDirectSupertypes(typeAlias) {
105
- const set = this.tsSupertypes.get(typeAlias);
106
- if (!set || set.size === 0)
107
- return [];
108
- return Array.from(set).sort((a, b) => a.localeCompare(b));
109
- }
110
- /**
111
- * Resolve an extension method binding target by extension interface name.
112
- *
113
- * @param extensionInterfaceName - e.g. "__Ext_System_Linq_IEnumerable_1"
114
- * @param methodTsName - e.g. "where"
115
- */
116
- resolveExtensionMethod(extensionInterfaceName, methodTsName, callArgumentCount) {
117
- const parsed = this.parseExtensionInterfaceName(extensionInterfaceName);
118
- if (!parsed)
119
- return undefined;
120
- return this.resolveExtensionMethodByKey(parsed.namespaceKey, parsed.receiverTypeName, methodTsName, callArgumentCount);
121
- }
122
- /**
123
- * Resolve an extension method binding target by explicit (namespaceKey, receiverTypeName).
124
- *
125
- * Used when extension methods are emitted as method-table members with explicit `this:`
126
- * receiver constraints (the declaring interface name no longer encodes the receiver type).
127
- */
128
- resolveExtensionMethodByKey(namespaceKey, receiverTypeName, methodTsName, callArgumentCount) {
129
- const getParameterCount = (binding) => {
130
- if (typeof binding.parameterCount === "number") {
131
- return binding.parameterCount;
132
- }
133
- const sig = binding.signature;
134
- if (!sig)
135
- return undefined;
136
- const paramsMatch = sig.match(/\|\(([^)]*)\):/);
137
- const paramsStr = paramsMatch?.[1]?.trim();
138
- if (!paramsStr)
139
- return undefined;
140
- return splitSignatureTypeList(paramsStr).length;
141
- };
142
- const getModifiersKey = (binding) => {
143
- const mods = (binding.parameterModifiers ??
144
- []);
145
- if (!Array.isArray(mods) || mods.length === 0)
146
- return "";
147
- return [...mods]
148
- .slice()
149
- .sort((a, b) => a.index - b.index)
150
- .map((m) => `${m.index}:${m.modifier}`)
151
- .join(",");
152
- };
153
- const resolveForReceiver = (receiverTypeName) => {
154
- const candidates = this.getExtensionMethodCandidates(namespaceKey, receiverTypeName, methodTsName);
155
- if (!candidates || candidates.length === 0)
156
- return { kind: "none" };
157
- let filteredCandidates = candidates;
158
- if (typeof callArgumentCount === "number") {
159
- const desiredParamCount = callArgumentCount + 1;
160
- const exact = candidates.filter((c) => getParameterCount(c) === desiredParamCount);
161
- if (exact.length > 0) {
162
- filteredCandidates = exact;
163
- }
164
- else {
165
- // Optional-parameter safety: if no exact arity match, choose the smallest
166
- // candidate arity that can still accept the provided arguments.
167
- const larger = candidates
168
- .map((c) => ({ c, count: getParameterCount(c) }))
169
- .filter((x) => typeof x.count === "number" && x.count > desiredParamCount);
170
- if (larger.length === 0)
171
- return { kind: "none" };
172
- const minCount = Math.min(...larger.map((x) => x.count));
173
- filteredCandidates = larger
174
- .filter((x) => x.count === minCount)
175
- .map((x) => x.c);
176
- }
177
- }
178
- // If multiple candidates map to different CLR targets, treat as unresolved (unsafe).
179
- const first = filteredCandidates[0];
180
- if (!first)
181
- return { kind: "none" };
182
- const firstTarget = `${first.binding.type}::${first.binding.member}`;
183
- const firstModsKey = getModifiersKey(first);
184
- for (const c of filteredCandidates) {
185
- const target = `${c.binding.type}::${c.binding.member}`;
186
- if (target !== firstTarget) {
187
- return { kind: "ambiguous" };
188
- }
189
- if (getModifiersKey(c) !== firstModsKey) {
190
- return { kind: "ambiguous" };
191
- }
192
- }
193
- return { kind: "resolved", binding: first };
194
- };
195
- // 1) Exact receiver match.
196
- const direct = resolveForReceiver(receiverTypeName);
197
- if (direct.kind === "resolved")
198
- return direct.binding;
199
- if (direct.kind === "ambiguous")
200
- return undefined;
201
- // 2) Airplane-grade fallback: CLR interface/base-type inheritance.
202
- // This allows instance-style calls to resolve when TS surface selects a method
203
- // declared on a derived type's extension bucket (e.g., IQueryable<T>.ToList)
204
- // but the CLR binding is declared on a base interface (e.g., IEnumerable<T>).
205
- //
206
- // Determinism rules:
207
- // - Prefer the closest base match (BFS).
208
- // - If multiple matches exist at the same depth with different CLR targets,
209
- // treat as unresolved (unsafe).
210
- const visited = new Set([receiverTypeName]);
211
- let frontier = [receiverTypeName];
212
- for (let depth = 0; depth < 20; depth++) {
213
- const next = [];
214
- for (const t of frontier) {
215
- for (const sup of this.getDirectSupertypes(t)) {
216
- if (visited.has(sup))
217
- continue;
218
- visited.add(sup);
219
- next.push(sup);
220
- }
221
- }
222
- if (next.length === 0)
223
- break;
224
- const resolvedAtDepth = [];
225
- let sawAmbiguous = false;
226
- for (const sup of next) {
227
- const res = resolveForReceiver(sup);
228
- if (res.kind === "ambiguous")
229
- sawAmbiguous = true;
230
- if (res.kind === "resolved")
231
- resolvedAtDepth.push(res.binding);
232
- }
233
- if (resolvedAtDepth.length > 0 || sawAmbiguous) {
234
- // If any ambiguity exists at the closest depth, do not guess.
235
- if (sawAmbiguous)
236
- return undefined;
237
- const first = resolvedAtDepth[0];
238
- if (!first)
239
- return undefined;
240
- const target0 = `${first.binding.type}::${first.binding.member}`;
241
- const mods0 = getModifiersKey(first);
242
- for (const b of resolvedAtDepth) {
243
- const target = `${b.binding.type}::${b.binding.member}`;
244
- if (target !== target0)
245
- return undefined;
246
- if (getModifiersKey(b) !== mods0)
247
- return undefined;
248
- }
249
- return first;
250
- }
251
- frontier = next;
252
- }
253
- return undefined;
254
- }
255
- parseExtensionInterfaceName(extensionInterfaceName) {
256
- if (!extensionInterfaceName.startsWith("__Ext_"))
257
- return undefined;
258
- const rest = extensionInterfaceName.slice("__Ext_".length);
259
- // Find the longest namespaceKey prefix we have indexed.
260
- let bestNamespaceKey;
261
- for (const namespaceKey of this.extensionMethods.keys()) {
262
- if (rest.startsWith(`${namespaceKey}_`)) {
263
- if (!bestNamespaceKey ||
264
- namespaceKey.length > bestNamespaceKey.length) {
265
- bestNamespaceKey = namespaceKey;
266
- }
267
- }
268
- }
269
- if (!bestNamespaceKey)
270
- return undefined;
271
- const receiverTypeName = rest.slice(bestNamespaceKey.length + 1);
272
- if (!receiverTypeName)
273
- return undefined;
274
- return { namespaceKey: bestNamespaceKey, receiverTypeName };
275
- }
276
- /**
277
- * Load a binding manifest file and add its bindings to the registry
278
- * Supports simple, full, and tsbindgen formats
279
- */
280
- addBindings(_filePath, manifest) {
281
- // Airplane-grade: a given bindings file must be loaded exactly once per
282
- // ProgramContext. Some converters perform on-demand bindings.json loading
283
- // based on Binding-resolved MemberIds; without this guard, overload sets
284
- // can silently duplicate and become ambiguous.
285
- if (this.loadedBindingFiles.has(_filePath))
286
- return;
287
- this.loadedBindingFiles.add(_filePath);
288
- const addMemberOverload = (key, member) => {
289
- const existing = this.memberOverloads.get(key) ?? [];
290
- existing.push(member);
291
- this.memberOverloads.set(key, existing);
292
- };
293
- const addClrMemberOverload = (member) => {
294
- if (member.kind !== "method")
295
- return;
296
- const clrTargetKey = makeClrMemberKey(member.binding.assembly, member.binding.type, member.binding.member);
297
- const existing = this.clrMemberOverloads.get(clrTargetKey) ?? [];
298
- existing.push(member);
299
- this.clrMemberOverloads.set(clrTargetKey, existing);
300
- };
301
- if (isFullBindingManifest(manifest)) {
302
- // Full format: hierarchical namespace/type/member structure
303
- // Index by alias (TS identifier) for quick lookup
304
- for (const ns of manifest.namespaces) {
305
- this.namespaces.set(ns.alias, ns);
306
- // Index types for quick lookup by TS alias
307
- for (const type of ns.types) {
308
- this.types.set(type.alias, type);
309
- // Index members for quick lookup (keyed by "typeAlias.memberAlias")
310
- for (const member of type.members) {
311
- const key = `${type.alias}.${member.alias}`;
312
- this.members.set(key, member);
313
- addMemberOverload(key, member);
314
- addClrMemberOverload(member);
315
- }
316
- }
317
- }
318
- }
319
- else if (isTsbindgenBindingFile(manifest)) {
320
- // tsbindgen format: convert to internal format
321
- for (const tsbType of manifest.types) {
322
- // Create members from methods, properties, and fields
323
- const members = [];
324
- for (const method of tsbType.methods) {
325
- const memberBinding = {
326
- kind: "method",
327
- name: method.clrName,
328
- // No naming policy: TS member names are the CLR names as authored.
329
- alias: method.clrName,
330
- signature: method.normalizedSignature,
331
- parameterCount: method.parameterCount,
332
- binding: {
333
- assembly: method.declaringAssemblyName,
334
- type: method.declaringClrType,
335
- // member = clrName (what C# emits, e.g., "Add")
336
- member: method.clrName,
337
- },
338
- // Include parameter modifiers for ref/out/in parameters
339
- parameterModifiers: method.parameterModifiers,
340
- isExtensionMethod: method.isExtensionMethod ?? false,
341
- };
342
- members.push(memberBinding);
343
- addClrMemberOverload(memberBinding);
344
- // Index extension methods by (declaring namespace, receiver type, method name).
345
- if (method.isExtensionMethod && method.normalizedSignature) {
346
- const receiverTypeName = extractExtensionReceiverType(method.normalizedSignature);
347
- const namespaceKey = extractNamespaceKey(method.declaringClrType);
348
- if (receiverTypeName && namespaceKey) {
349
- const nsMap = this.extensionMethods.get(namespaceKey) ??
350
- new Map();
351
- if (!this.extensionMethods.has(namespaceKey)) {
352
- this.extensionMethods.set(namespaceKey, nsMap);
353
- }
354
- const receiverMap = nsMap.get(receiverTypeName) ??
355
- new Map();
356
- if (!nsMap.has(receiverTypeName)) {
357
- nsMap.set(receiverTypeName, receiverMap);
358
- }
359
- const list = receiverMap.get(memberBinding.alias) ?? [];
360
- list.push(memberBinding);
361
- receiverMap.set(memberBinding.alias, list);
362
- }
363
- }
364
- }
365
- for (const prop of tsbType.properties) {
366
- members.push({
367
- kind: "property",
368
- name: prop.clrName,
369
- alias: prop.clrName,
370
- binding: {
371
- assembly: prop.declaringAssemblyName,
372
- type: prop.declaringClrType,
373
- member: prop.clrName,
374
- },
375
- });
376
- }
377
- for (const field of tsbType.fields) {
378
- // Fields are treated as properties for binding purposes
379
- members.push({
380
- kind: "property",
381
- name: field.clrName,
382
- alias: field.clrName,
383
- binding: {
384
- assembly: field.declaringAssemblyName,
385
- type: field.declaringClrType,
386
- member: field.clrName,
387
- },
388
- });
389
- }
390
- const tsAlias = tsbindgenClrTypeNameToTsTypeName(tsbType.clrName);
391
- // Record CLR inheritance relationships (base type + interfaces) so extension-method
392
- // binding lookup can follow the CLR graph deterministically.
393
- const baseAlias = tsbType.baseType?.clrName
394
- ? tsbindgenClrTypeNameToTsTypeName(tsbType.baseType.clrName)
395
- : undefined;
396
- if (baseAlias)
397
- this.addSupertype(tsAlias, baseAlias);
398
- for (const iface of tsbType.interfaces ?? []) {
399
- if (!iface?.clrName)
400
- continue;
401
- const ifaceAlias = tsbindgenClrTypeNameToTsTypeName(iface.clrName);
402
- this.addSupertype(tsAlias, ifaceAlias);
403
- }
404
- const kindFromBindings = (() => {
405
- switch (tsbType.kind) {
406
- case "Interface":
407
- return "interface";
408
- case "Struct":
409
- return "struct";
410
- case "Enum":
411
- return "enum";
412
- case "Class":
413
- default:
414
- return "class";
415
- }
416
- })();
417
- // Create TypeBinding - TS alias is derived deterministically from CLR name.
418
- const typeBinding = {
419
- name: tsbType.clrName,
420
- alias: tsAlias,
421
- kind: kindFromBindings,
422
- members,
423
- };
424
- // Index the type by its TS name.
425
- this.types.set(typeBinding.alias, typeBinding);
426
- // Also index by simple name if ts alias has arity suffix (e.g., "List_1" -> also index as "List")
427
- // This is needed because TS exports both List_1 and List as aliases, and TS code uses List<T>
428
- // IMPORTANT: Only set if not already present - non-generic versions should take precedence
429
- // (e.g., Action should resolve to System.Action, not System.Action`9)
430
- const arityMatch = typeBinding.alias.match(/^(.+)_(\d+)$/);
431
- const simpleAlias = arityMatch ? arityMatch[1] : null;
432
- if (simpleAlias &&
433
- simpleAlias !== typeBinding.alias &&
434
- !this.types.has(simpleAlias)) {
435
- this.types.set(simpleAlias, typeBinding);
436
- }
437
- // Index members for direct lookup.
438
- for (const member of members) {
439
- // Key by TS name (e.g., "List_1.Add")
440
- const tsKey = `${typeBinding.alias}.${member.alias}`;
441
- this.members.set(tsKey, member);
442
- addMemberOverload(tsKey, member);
443
- // Also key by simple alias if applicable (e.g., "List.Add")
444
- if (simpleAlias) {
445
- const simpleKey = `${simpleAlias}.${member.alias}`;
446
- this.members.set(simpleKey, member);
447
- addMemberOverload(simpleKey, member);
448
- }
449
- }
450
- }
451
- // Optional flattened named exports.
452
- // These are stable value exports for CLR namespace facade modules and are
453
- // resolved by Tsonic during import binding (so `import { x }` maps to
454
- // `global::<DeclaringType>.<member>` in C#).
455
- if (manifest.exports) {
456
- const nsExports = this.tsbindgenExports.get(manifest.namespace) ??
457
- new Map();
458
- for (const [exportName, exp] of Object.entries(manifest.exports)) {
459
- nsExports.set(exportName, exp);
460
- }
461
- this.tsbindgenExports.set(manifest.namespace, nsExports);
462
- }
463
- }
464
- else {
465
- // Simple format: global/module bindings
466
- for (const [name, descriptor] of Object.entries(manifest.bindings)) {
467
- this.simpleBindings.set(name, descriptor);
468
- }
469
- }
470
- }
471
- /**
472
- * Look up a simple global/module binding
473
- */
474
- getBinding(name) {
475
- return this.simpleBindings.get(name);
476
- }
477
- /**
478
- * Look up a namespace binding by TS alias
479
- */
480
- getNamespace(tsAlias) {
481
- return this.namespaces.get(tsAlias);
482
- }
483
- /**
484
- * Look up a type binding by TS alias
485
- */
486
- getType(tsAlias) {
487
- return this.types.get(tsAlias);
488
- }
489
- /**
490
- * Look up a member binding by TS type alias and member alias
491
- */
492
- getMember(typeAlias, memberAlias) {
493
- const key = `${typeAlias}.${memberAlias}`;
494
- const direct = this.members.get(key);
495
- if (direct)
496
- return direct;
497
- // tsbindgen encodes protected CLR members on a synthetic `${TypeName}$protected` class.
498
- // Those members are still declared on the real CLR type, so bindings must resolve
499
- // through the owning type alias.
500
- if (typeAlias.endsWith("$protected")) {
501
- const ownerAlias = typeAlias.slice(0, -"$protected".length);
502
- return this.members.get(`${ownerAlias}.${memberAlias}`);
503
- }
504
- return undefined;
505
- }
506
- /**
507
- * Look up all member bindings for a TS type alias + member alias.
508
- *
509
- * IMPORTANT: Methods can be overloaded, and overloads can differ in ref/out/in
510
- * modifiers (tsbindgen provides these via `parameterModifiers`). This accessor
511
- * preserves overload sets so the call converter can select the correct one.
512
- */
513
- getMemberOverloads(typeAlias, memberAlias) {
514
- const key = `${typeAlias}.${memberAlias}`;
515
- const direct = this.memberOverloads.get(key);
516
- if (direct && direct.length > 0)
517
- return direct;
518
- // See getMember(): map `${TypeName}$protected` to `${TypeName}` for CLR binding lookup.
519
- if (typeAlias.endsWith("$protected")) {
520
- const ownerAlias = typeAlias.slice(0, -"$protected".length);
521
- const ownerKey = `${ownerAlias}.${memberAlias}`;
522
- const owner = this.memberOverloads.get(ownerKey);
523
- if (owner && owner.length > 0)
524
- return owner;
525
- }
526
- return undefined;
527
- }
528
- /**
529
- * Look up all member bindings for a CLR member target.
530
- *
531
- * Keyed by declaring assembly, CLR type, and CLR member name.
532
- */
533
- getClrMemberOverloads(assembly, clrType, clrMember) {
534
- return this.clrMemberOverloads.get(makeClrMemberKey(assembly, clrType, clrMember));
535
- }
536
- /**
537
- * Look up a tsbindgen flattened named export by CLR namespace + export name.
538
- */
539
- getTsbindgenExport(namespace, exportName) {
540
- return this.tsbindgenExports.get(namespace)?.get(exportName);
541
- }
542
- /**
543
- * Get all loaded simple bindings
544
- */
545
- getAllBindings() {
546
- return Array.from(this.simpleBindings.entries());
547
- }
548
- /**
549
- * Get all loaded namespaces
550
- */
551
- getAllNamespaces() {
552
- return Array.from(this.namespaces.values());
553
- }
554
- /**
555
- * Get a copy of the types map for passing to the emitter.
556
- * Returns a new Map to ensure immutability - callers cannot modify the registry.
557
- */
558
- getTypesMap() {
559
- return new Map(this.types);
560
- }
561
- /**
562
- * Clear all loaded bindings
563
- */
564
- clear() {
565
- this.loadedBindingFiles.clear();
566
- this.simpleBindings.clear();
567
- this.namespaces.clear();
568
- this.types.clear();
569
- this.members.clear();
570
- this.memberOverloads.clear();
571
- this.clrMemberOverloads.clear();
572
- this.extensionMethods.clear();
573
- this.tsbindgenExports.clear();
574
- }
575
- }
576
- const makeClrMemberKey = (assembly, clrType, clrMember) => `${assembly}:${clrType}::${clrMember}`;
577
- /**
578
- * Extract CLR namespace key ('.' → '_') from a full CLR type name.
579
- * Example: "System.Linq.Enumerable" → "System_Linq"
580
- */
581
- const extractNamespaceKey = (clrType) => {
582
- const lastDot = clrType.lastIndexOf(".");
583
- if (lastDot <= 0)
584
- return undefined;
585
- return clrType.slice(0, lastDot).replace(/\./g, "_");
586
- };
587
- /**
588
- * Extract the extension receiver TS type name from a tsbindgen normalized signature.
589
- *
590
- * Format: "Name|(ParamTypes):ReturnType|static=true"
591
- * Example: "Where|(IEnumerable_1,Func_2):IEnumerable_1|static=true"
592
- *
593
- * Returns the first parameter type name (stripped of byref suffix and namespace prefix).
594
- */
595
- const extractExtensionReceiverType = (normalizedSignature) => {
596
- const paramsMatch = normalizedSignature.match(/\|\(([^)]*)\):/);
597
- const paramsStr = paramsMatch?.[1]?.trim();
598
- if (!paramsStr)
599
- return undefined;
600
- const [first] = splitSignatureTypeList(paramsStr);
601
- if (!first)
602
- return undefined;
603
- let receiver = first.trim();
604
- if (receiver.endsWith("&"))
605
- receiver = receiver.slice(0, -1);
606
- if (receiver.endsWith("[]"))
607
- receiver = receiver.slice(0, -2);
608
- const lastDot = receiver.lastIndexOf(".");
609
- if (lastDot >= 0)
610
- receiver = receiver.slice(lastDot + 1);
611
- return receiver || undefined;
612
- };
613
- /**
614
- * Split a comma-delimited type list, respecting nested bracket depth.
615
- * tsbindgen signatures use CLR-style nested generic brackets in some contexts.
616
- */
617
- const splitSignatureTypeList = (str) => {
618
- const result = [];
619
- let depth = 0;
620
- let current = "";
621
- for (const char of str) {
622
- if (char === "[") {
623
- depth++;
624
- current += char;
625
- }
626
- else if (char === "]") {
627
- depth--;
628
- current += char;
629
- }
630
- else if (char === "," && depth === 0) {
631
- result.push(current.trim());
632
- current = "";
633
- }
634
- else {
635
- current += char;
636
- }
637
- }
638
- if (current.trim()) {
639
- result.push(current.trim());
640
- }
641
- return result;
642
- };
643
- /**
644
- * Recursively scan a directory for .d.ts files
645
- * Reuses the same helper as metadata loading
646
- */
647
- const scanForDeclarationFiles = (dir) => {
648
- if (!fs.existsSync(dir)) {
649
- return [];
650
- }
651
- const results = [];
652
- const entries = fs.readdirSync(dir, { withFileTypes: true });
653
- for (const entry of entries) {
654
- const fullPath = path.join(dir, entry.name);
655
- if (entry.isDirectory()) {
656
- results.push(...scanForDeclarationFiles(fullPath));
657
- }
658
- else if (entry.name.endsWith(".d.ts")) {
659
- results.push(fullPath);
660
- }
661
- }
662
- return results;
663
- };
664
- /**
665
- * Load bindings from a package directory and recursively from its @tsonic/* dependencies.
666
- *
667
- * This supports the common "namespace facade" layout:
668
- * - `System.d.ts` (or `index.d.ts`) at the package root
669
- * - `System/bindings.json` (or `index/bindings.json`) next to the namespace's `internal/index.d.ts`
670
- *
671
- * Some packages may also provide a root-level `bindings.json` (simple/global bindings).
672
- */
673
- const loadBindingsFromPackage = (registry, packageRoot, visited) => {
674
- // Avoid cycles
675
- const absoluteRoot = path.resolve(packageRoot);
676
- if (visited.has(absoluteRoot)) {
677
- return;
678
- }
679
- visited.add(absoluteRoot);
680
- // Skip if directory doesn't exist
681
- if (!fs.existsSync(absoluteRoot)) {
682
- return;
683
- }
684
- const rootEntries = fs.readdirSync(absoluteRoot, { withFileTypes: true });
685
- // Strategy 1: root-level bindings.json (simple/global bindings)
686
- const rootBindingsPath = path.join(absoluteRoot, "bindings.json");
687
- loadBindingsFromPath(registry, rootBindingsPath);
688
- // Strategy 2: Namespace/bindings.json for each Namespace.d.ts facade
689
- const facadeFiles = rootEntries
690
- .filter((e) => e.isFile() && e.name.endsWith(".d.ts"))
691
- .map((e) => e.name);
692
- for (const facadeFile of facadeFiles) {
693
- // e.g., "System.d.ts" → "System"
694
- const namespaceName = facadeFile.slice(0, -".d.ts".length);
695
- const namespaceDir = path.join(absoluteRoot, namespaceName);
696
- const bindingsPath = path.join(namespaceDir, "bindings.json");
697
- if (fs.existsSync(bindingsPath)) {
698
- loadBindingsFromPath(registry, bindingsPath);
699
- }
700
- }
701
- // Strategy 3: Recursively load bindings from @tsonic/* dependencies
702
- // This is crucial for packages like @tsonic/globals that depend on @tsonic/dotnet
703
- const packageJsonPath = path.join(absoluteRoot, "package.json");
704
- if (fs.existsSync(packageJsonPath)) {
705
- try {
706
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
707
- const deps = packageJson.dependencies || {};
708
- for (const depName of Object.keys(deps)) {
709
- // Only follow @tsonic/* dependencies to load their bindings
710
- if (depName.startsWith("@tsonic/")) {
711
- // Find the dependency in node_modules
712
- // Try sibling node_modules first (hoisted), then nested
713
- const nodeModulesDir = path.dirname(path.dirname(absoluteRoot));
714
- const hoistedPath = path.join(nodeModulesDir, depName);
715
- const nestedPath = path.join(absoluteRoot, "node_modules", depName);
716
- if (fs.existsSync(hoistedPath)) {
717
- loadBindingsFromPackage(registry, hoistedPath, visited);
718
- }
719
- else if (fs.existsSync(nestedPath)) {
720
- loadBindingsFromPackage(registry, nestedPath, visited);
721
- }
722
- }
723
- }
724
- }
725
- catch {
726
- // Ignore JSON parse errors in package.json
727
- }
728
- }
729
- };
730
- /**
731
- * Load binding manifests from configured type roots.
732
- *
733
- * Conventions:
734
- * - Root-level `bindings.json` (simple/global bindings)
735
- * - `Namespace.d.ts` + `Namespace/bindings.json` (namespace facade)
736
- *
737
- * Also recursively loads bindings from @tsonic/* dependencies of typeRoot packages.
738
- */
739
- export const loadBindings = (typeRoots) => {
740
- const registry = new BindingRegistry();
741
- const visited = new Set();
742
- for (const typeRoot of typeRoots) {
743
- loadBindingsFromPackage(registry, typeRoot, visited);
744
- }
745
- return registry;
746
- };
747
- /**
748
- * Load bindings from a specific file path into an existing registry.
749
- * Validates the file format and logs a warning if invalid.
750
- */
751
- export const loadBindingsFromPath = (registry, bindingsPath) => {
752
- try {
753
- if (fs.existsSync(bindingsPath)) {
754
- const content = fs.readFileSync(bindingsPath, "utf-8");
755
- const parsed = JSON.parse(content);
756
- // Validate the parsed structure
757
- const validationError = validateBindingFile(parsed, bindingsPath);
758
- if (validationError) {
759
- console.warn(`Invalid bindings file: ${validationError}`);
760
- return;
761
- }
762
- registry.addBindings(bindingsPath, parsed);
763
- }
764
- }
765
- catch (err) {
766
- if (err instanceof SyntaxError) {
767
- console.warn(`Failed to parse bindings from ${bindingsPath}: Invalid JSON - ${err.message}`);
768
- }
769
- else {
770
- console.warn(`Failed to load bindings from ${bindingsPath}:`, err);
771
- }
772
- }
773
- };
774
- /**
775
- * Load all CLR bindings discovered by the resolver.
776
- * This should be called AFTER createProgram but BEFORE IR building
777
- * to ensure all bindings are available during IR construction.
778
4
  *
779
- * Note: The ClrBindingsResolver tracks discovered binding paths via caching,
780
- * so this loads bindings for any imports that were already resolved.
5
+ * This barrel module re-exports all binding types, the registry, and loaders
6
+ * so that existing imports from "program/bindings.js" continue to work.
781
7
  */
782
- export const loadAllDiscoveredBindings = (registry, discoveredPaths) => {
783
- for (const bindingsPath of discoveredPaths) {
784
- loadBindingsFromPath(registry, bindingsPath);
785
- }
786
- };
8
+ export { isFullBindingManifest, isTsbindgenBindingFile, validateBindingFile, } from "./binding-types.js";
9
+ // ── Registry ───────────────────────────────────────────────────────────────
10
+ export { BindingRegistry } from "./binding-registry.js";
11
+ // ── Loaders ────────────────────────────────────────────────────────────────
12
+ export { scanForDeclarationFiles, loadBindings, loadBindingsFromPath, loadAllDiscoveredBindings, } from "./binding-loader.js";
787
13
  //# sourceMappingURL=bindings.js.map