@tsonic/frontend 0.0.74 → 0.0.75

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 (1782) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/core-intrinsics/provenance.d.ts +7 -0
  3. package/dist/core-intrinsics/provenance.d.ts.map +1 -1
  4. package/dist/core-intrinsics/provenance.js +27 -4
  5. package/dist/core-intrinsics/provenance.js.map +1 -1
  6. package/dist/graph/extraction/imports.d.ts.map +1 -1
  7. package/dist/graph/extraction/imports.js +2 -0
  8. package/dist/graph/extraction/imports.js.map +1 -1
  9. package/dist/ir/binding/binding-call-resolution-calls.d.ts +11 -0
  10. package/dist/ir/binding/binding-call-resolution-calls.d.ts.map +1 -0
  11. package/dist/ir/binding/binding-call-resolution-calls.js +974 -0
  12. package/dist/ir/binding/binding-call-resolution-calls.js.map +1 -0
  13. package/dist/ir/binding/binding-call-resolution-candidates.d.ts +15 -0
  14. package/dist/ir/binding/binding-call-resolution-candidates.d.ts.map +1 -0
  15. package/dist/ir/binding/binding-call-resolution-candidates.js +178 -0
  16. package/dist/ir/binding/binding-call-resolution-candidates.js.map +1 -0
  17. package/dist/ir/binding/binding-call-resolution.d.ts +11 -0
  18. package/dist/ir/binding/binding-call-resolution.d.ts.map +1 -0
  19. package/dist/ir/binding/binding-call-resolution.js +11 -0
  20. package/dist/ir/binding/binding-call-resolution.js.map +1 -0
  21. package/dist/ir/binding/binding-factory.d.ts +7 -4
  22. package/dist/ir/binding/binding-factory.d.ts.map +1 -1
  23. package/dist/ir/binding/binding-factory.js +44 -829
  24. package/dist/ir/binding/binding-factory.js.map +1 -1
  25. package/dist/ir/binding/binding-helpers.d.ts +1 -0
  26. package/dist/ir/binding/binding-helpers.d.ts.map +1 -1
  27. package/dist/ir/binding/binding-helpers.js +37 -14
  28. package/dist/ir/binding/binding-helpers.js.map +1 -1
  29. package/dist/ir/binding/binding-registry.d.ts +52 -0
  30. package/dist/ir/binding/binding-registry.d.ts.map +1 -0
  31. package/dist/ir/binding/binding-registry.js +582 -0
  32. package/dist/ir/binding/binding-registry.js.map +1 -0
  33. package/dist/ir/binding/binding-types.d.ts +2 -0
  34. package/dist/ir/binding/binding-types.d.ts.map +1 -1
  35. package/dist/ir/binding-resolution-cases/extension-method-binding.test.d.ts +7 -0
  36. package/dist/ir/binding-resolution-cases/extension-method-binding.test.d.ts.map +1 -0
  37. package/dist/ir/binding-resolution-cases/extension-method-binding.test.js +463 -0
  38. package/dist/ir/binding-resolution-cases/extension-method-binding.test.js.map +1 -0
  39. package/dist/ir/binding-resolution-cases/extension-method-owner-resolution.test.d.ts +6 -0
  40. package/dist/ir/binding-resolution-cases/extension-method-owner-resolution.test.d.ts.map +1 -0
  41. package/dist/ir/binding-resolution-cases/extension-method-owner-resolution.test.js +252 -0
  42. package/dist/ir/binding-resolution-cases/extension-method-owner-resolution.test.js.map +1 -0
  43. package/dist/ir/binding-resolution-cases/extension-method-tsbindgen-modifiers.test.d.ts +6 -0
  44. package/dist/ir/binding-resolution-cases/extension-method-tsbindgen-modifiers.test.d.ts.map +1 -0
  45. package/dist/ir/binding-resolution-cases/extension-method-tsbindgen-modifiers.test.js +369 -0
  46. package/dist/ir/binding-resolution-cases/extension-method-tsbindgen-modifiers.test.js.map +1 -0
  47. package/dist/ir/binding-resolution-cases/extract-type-name.test.d.ts +5 -0
  48. package/dist/ir/binding-resolution-cases/extract-type-name.test.d.ts.map +1 -0
  49. package/dist/ir/binding-resolution-cases/extract-type-name.test.js +57 -0
  50. package/dist/ir/binding-resolution-cases/extract-type-name.test.js.map +1 -0
  51. package/dist/ir/binding-resolution-cases/global-binding-preferences.test.d.ts +5 -0
  52. package/dist/ir/binding-resolution-cases/global-binding-preferences.test.d.ts.map +1 -0
  53. package/dist/ir/binding-resolution-cases/global-binding-preferences.test.js +323 -0
  54. package/dist/ir/binding-resolution-cases/global-binding-preferences.test.js.map +1 -0
  55. package/dist/ir/binding-resolution-cases/global-identifier-resolution.test.d.ts +5 -0
  56. package/dist/ir/binding-resolution-cases/global-identifier-resolution.test.d.ts.map +1 -0
  57. package/dist/ir/binding-resolution-cases/global-identifier-resolution.test.js +1057 -0
  58. package/dist/ir/binding-resolution-cases/global-identifier-resolution.test.js.map +1 -0
  59. package/dist/ir/binding-resolution-cases/helpers.d.ts +38 -0
  60. package/dist/ir/binding-resolution-cases/helpers.d.ts.map +1 -0
  61. package/dist/ir/binding-resolution-cases/helpers.js +59 -0
  62. package/dist/ir/binding-resolution-cases/helpers.js.map +1 -0
  63. package/dist/ir/binding-resolution-cases/hierarchical-binding-resolution.test.d.ts +5 -0
  64. package/dist/ir/binding-resolution-cases/hierarchical-binding-resolution.test.d.ts.map +1 -0
  65. package/dist/ir/binding-resolution-cases/hierarchical-binding-resolution.test.js +259 -0
  66. package/dist/ir/binding-resolution-cases/hierarchical-binding-resolution.test.js.map +1 -0
  67. package/dist/ir/binding-resolution-cases/imported-globals-shadowing.test.d.ts +2 -0
  68. package/dist/ir/binding-resolution-cases/imported-globals-shadowing.test.d.ts.map +1 -0
  69. package/dist/ir/binding-resolution-cases/imported-globals-shadowing.test.js +566 -0
  70. package/dist/ir/binding-resolution-cases/imported-globals-shadowing.test.js.map +1 -0
  71. package/dist/ir/binding-resolution-cases/js-array-member-binding.test.d.ts +5 -0
  72. package/dist/ir/binding-resolution-cases/js-array-member-binding.test.d.ts.map +1 -0
  73. package/dist/ir/binding-resolution-cases/js-array-member-binding.test.js +186 -0
  74. package/dist/ir/binding-resolution-cases/js-array-member-binding.test.js.map +1 -0
  75. package/dist/ir/binding-resolution-cases/module-import-type-alias-renaming.test.d.ts +6 -0
  76. package/dist/ir/binding-resolution-cases/module-import-type-alias-renaming.test.d.ts.map +1 -0
  77. package/dist/ir/binding-resolution-cases/module-import-type-alias-renaming.test.js +198 -0
  78. package/dist/ir/binding-resolution-cases/module-import-type-alias-renaming.test.js.map +1 -0
  79. package/dist/ir/binding-resolution.test.d.ts +9 -4
  80. package/dist/ir/binding-resolution.test.d.ts.map +1 -1
  81. package/dist/ir/binding-resolution.test.js +9 -1428
  82. package/dist/ir/binding-resolution.test.js.map +1 -1
  83. package/dist/ir/bindings-disambiguation-cases/failure-disambiguation.test.d.ts +8 -0
  84. package/dist/ir/bindings-disambiguation-cases/failure-disambiguation.test.d.ts.map +1 -0
  85. package/dist/ir/bindings-disambiguation-cases/failure-disambiguation.test.js +255 -0
  86. package/dist/ir/bindings-disambiguation-cases/failure-disambiguation.test.js.map +1 -0
  87. package/dist/ir/bindings-disambiguation-cases/success-disambiguation.test.d.ts +11 -0
  88. package/dist/ir/bindings-disambiguation-cases/success-disambiguation.test.d.ts.map +1 -0
  89. package/dist/ir/bindings-disambiguation-cases/success-disambiguation.test.js +326 -0
  90. package/dist/ir/bindings-disambiguation-cases/success-disambiguation.test.js.map +1 -0
  91. package/dist/ir/bindings-disambiguation.test.d.ts +2 -10
  92. package/dist/ir/bindings-disambiguation.test.d.ts.map +1 -1
  93. package/dist/ir/bindings-disambiguation.test.js +2 -561
  94. package/dist/ir/bindings-disambiguation.test.js.map +1 -1
  95. package/dist/ir/builder/exports.d.ts +2 -2
  96. package/dist/ir/builder/exports.d.ts.map +1 -1
  97. package/dist/ir/builder/exports.js +6 -10
  98. package/dist/ir/builder/exports.js.map +1 -1
  99. package/dist/ir/builder/imports.d.ts.map +1 -1
  100. package/dist/ir/builder/imports.js +104 -58
  101. package/dist/ir/builder/imports.js.map +1 -1
  102. package/dist/ir/builder/orchestrator.d.ts.map +1 -1
  103. package/dist/ir/builder/orchestrator.js +7 -9
  104. package/dist/ir/builder/orchestrator.js.map +1 -1
  105. package/dist/ir/builder/statements.d.ts +5 -0
  106. package/dist/ir/builder/statements.d.ts.map +1 -1
  107. package/dist/ir/builder/statements.js +16 -5
  108. package/dist/ir/builder/statements.js.map +1 -1
  109. package/dist/ir/builder-cases/_test-helpers.d.ts +61 -0
  110. package/dist/ir/builder-cases/_test-helpers.d.ts.map +1 -0
  111. package/dist/ir/builder-cases/_test-helpers.js +123 -0
  112. package/dist/ir/builder-cases/_test-helpers.js.map +1 -0
  113. package/dist/ir/builder-cases/call-inference-generics/alias-cache.test.d.ts +2 -0
  114. package/dist/ir/builder-cases/call-inference-generics/alias-cache.test.d.ts.map +1 -0
  115. package/dist/ir/builder-cases/call-inference-generics/alias-cache.test.js +123 -0
  116. package/dist/ir/builder-cases/call-inference-generics/alias-cache.test.js.map +1 -0
  117. package/dist/ir/builder-cases/call-inference-generics/context-threading.test.d.ts +2 -0
  118. package/dist/ir/builder-cases/call-inference-generics/context-threading.test.d.ts.map +1 -0
  119. package/dist/ir/builder-cases/call-inference-generics/context-threading.test.js +839 -0
  120. package/dist/ir/builder-cases/call-inference-generics/context-threading.test.js.map +1 -0
  121. package/dist/ir/builder-cases/clr-identity.test.d.ts +5 -0
  122. package/dist/ir/builder-cases/clr-identity.test.d.ts.map +1 -0
  123. package/dist/ir/builder-cases/clr-identity.test.js +188 -0
  124. package/dist/ir/builder-cases/clr-identity.test.js.map +1 -0
  125. package/dist/ir/builder-cases/clr-iterable-overload-resolution.test.d.ts +2 -0
  126. package/dist/ir/builder-cases/clr-iterable-overload-resolution.test.d.ts.map +1 -0
  127. package/dist/ir/builder-cases/clr-iterable-overload-resolution.test.js +1436 -0
  128. package/dist/ir/builder-cases/clr-iterable-overload-resolution.test.js.map +1 -0
  129. package/dist/ir/builder-cases/conditional-narrowing.test.d.ts +5 -0
  130. package/dist/ir/builder-cases/conditional-narrowing.test.d.ts.map +1 -0
  131. package/dist/ir/builder-cases/conditional-narrowing.test.js +598 -0
  132. package/dist/ir/builder-cases/conditional-narrowing.test.js.map +1 -0
  133. package/dist/ir/builder-cases/contextual-typing-middleware.test.d.ts +5 -0
  134. package/dist/ir/builder-cases/contextual-typing-middleware.test.d.ts.map +1 -0
  135. package/dist/ir/builder-cases/contextual-typing-middleware.test.js +384 -0
  136. package/dist/ir/builder-cases/contextual-typing-middleware.test.js.map +1 -0
  137. package/dist/ir/builder-cases/expression-conversion.test.d.ts +5 -0
  138. package/dist/ir/builder-cases/expression-conversion.test.d.ts.map +1 -0
  139. package/dist/ir/builder-cases/expression-conversion.test.js +712 -0
  140. package/dist/ir/builder-cases/expression-conversion.test.js.map +1 -0
  141. package/dist/ir/builder-cases/fluent-and-nullable-params.test.d.ts +5 -0
  142. package/dist/ir/builder-cases/fluent-and-nullable-params.test.d.ts.map +1 -0
  143. package/dist/ir/builder-cases/fluent-and-nullable-params.test.js +170 -0
  144. package/dist/ir/builder-cases/fluent-and-nullable-params.test.js.map +1 -0
  145. package/dist/ir/builder-cases/for-of-loops.test.d.ts +5 -0
  146. package/dist/ir/builder-cases/for-of-loops.test.d.ts.map +1 -0
  147. package/dist/ir/builder-cases/for-of-loops.test.js +367 -0
  148. package/dist/ir/builder-cases/for-of-loops.test.js.map +1 -0
  149. package/dist/ir/builder-cases/generic-call-parameter-specialization.test.d.ts +2 -0
  150. package/dist/ir/builder-cases/generic-call-parameter-specialization.test.d.ts.map +1 -0
  151. package/dist/ir/builder-cases/generic-call-parameter-specialization.test.js +192 -0
  152. package/dist/ir/builder-cases/generic-call-parameter-specialization.test.js.map +1 -0
  153. package/dist/ir/builder-cases/implements-and-struct.test.d.ts +5 -0
  154. package/dist/ir/builder-cases/implements-and-struct.test.d.ts.map +1 -0
  155. package/dist/ir/builder-cases/implements-and-struct.test.js +145 -0
  156. package/dist/ir/builder-cases/implements-and-struct.test.js.map +1 -0
  157. package/dist/ir/builder-cases/import-extraction.test.d.ts +5 -0
  158. package/dist/ir/builder-cases/import-extraction.test.d.ts.map +1 -0
  159. package/dist/ir/builder-cases/import-extraction.test.js +852 -0
  160. package/dist/ir/builder-cases/import-extraction.test.js.map +1 -0
  161. package/dist/ir/builder-cases/imported-null-guard-assignments.test.d.ts +2 -0
  162. package/dist/ir/builder-cases/imported-null-guard-assignments.test.d.ts.map +1 -0
  163. package/dist/ir/builder-cases/imported-null-guard-assignments.test.js +185 -0
  164. package/dist/ir/builder-cases/imported-null-guard-assignments.test.js.map +1 -0
  165. package/dist/ir/builder-cases/imported-union-aliases.test.d.ts +2 -0
  166. package/dist/ir/builder-cases/imported-union-aliases.test.d.ts.map +1 -0
  167. package/dist/ir/builder-cases/imported-union-aliases.test.js +255 -0
  168. package/dist/ir/builder-cases/imported-union-aliases.test.js.map +1 -0
  169. package/dist/ir/builder-cases/installed-source-package-deterministic-typing.test.d.ts +2 -0
  170. package/dist/ir/builder-cases/installed-source-package-deterministic-typing.test.d.ts.map +1 -0
  171. package/dist/ir/builder-cases/installed-source-package-deterministic-typing.test.js +1267 -0
  172. package/dist/ir/builder-cases/installed-source-package-deterministic-typing.test.js.map +1 -0
  173. package/dist/ir/builder-cases/invocation-flow-assertions.test.d.ts +2 -0
  174. package/dist/ir/builder-cases/invocation-flow-assertions.test.d.ts.map +1 -0
  175. package/dist/ir/builder-cases/invocation-flow-assertions.test.js +198 -0
  176. package/dist/ir/builder-cases/invocation-flow-assertions.test.js.map +1 -0
  177. package/dist/ir/builder-cases/js-surface-helpers.test.d.ts +5 -0
  178. package/dist/ir/builder-cases/js-surface-helpers.test.d.ts.map +1 -0
  179. package/dist/ir/builder-cases/js-surface-helpers.test.js +1990 -0
  180. package/dist/ir/builder-cases/js-surface-helpers.test.js.map +1 -0
  181. package/dist/ir/builder-cases/module-structure-and-exports.test.d.ts +5 -0
  182. package/dist/ir/builder-cases/module-structure-and-exports.test.d.ts.map +1 -0
  183. package/dist/ir/builder-cases/module-structure-and-exports.test.js +97 -0
  184. package/dist/ir/builder-cases/module-structure-and-exports.test.js.map +1 -0
  185. package/dist/ir/builder-cases/namespace-imports-and-function-narrowing.test.d.ts +5 -0
  186. package/dist/ir/builder-cases/namespace-imports-and-function-narrowing.test.d.ts.map +1 -0
  187. package/dist/ir/builder-cases/namespace-imports-and-function-narrowing.test.js +511 -0
  188. package/dist/ir/builder-cases/namespace-imports-and-function-narrowing.test.js.map +1 -0
  189. package/dist/ir/builder-cases/narrowing-isarray-and-typeof.test.d.ts +5 -0
  190. package/dist/ir/builder-cases/narrowing-isarray-and-typeof.test.d.ts.map +1 -0
  191. package/dist/ir/builder-cases/narrowing-isarray-and-typeof.test.js +676 -0
  192. package/dist/ir/builder-cases/narrowing-isarray-and-typeof.test.js.map +1 -0
  193. package/dist/ir/builder-cases/object-exports-and-member-inference.test.d.ts +5 -0
  194. package/dist/ir/builder-cases/object-exports-and-member-inference.test.d.ts.map +1 -0
  195. package/dist/ir/builder-cases/object-exports-and-member-inference.test.js +159 -0
  196. package/dist/ir/builder-cases/object-exports-and-member-inference.test.js.map +1 -0
  197. package/dist/ir/builder-cases/object-synthesis-advanced.test.d.ts +5 -0
  198. package/dist/ir/builder-cases/object-synthesis-advanced.test.d.ts.map +1 -0
  199. package/dist/ir/builder-cases/object-synthesis-advanced.test.js +250 -0
  200. package/dist/ir/builder-cases/object-synthesis-advanced.test.js.map +1 -0
  201. package/dist/ir/builder-cases/object-synthesis.test.d.ts +5 -0
  202. package/dist/ir/builder-cases/object-synthesis.test.d.ts.map +1 -0
  203. package/dist/ir/builder-cases/object-synthesis.test.js +254 -0
  204. package/dist/ir/builder-cases/object-synthesis.test.js.map +1 -0
  205. package/dist/ir/builder-cases/overload-family-markers.test.d.ts +2 -0
  206. package/dist/ir/builder-cases/overload-family-markers.test.d.ts.map +1 -0
  207. package/dist/ir/builder-cases/overload-family-markers.test.js +264 -0
  208. package/dist/ir/builder-cases/overload-family-markers.test.js.map +1 -0
  209. package/dist/ir/builder-cases/overload-null-guard-selection.test.d.ts +2 -0
  210. package/dist/ir/builder-cases/overload-null-guard-selection.test.d.ts.map +1 -0
  211. package/dist/ir/builder-cases/overload-null-guard-selection.test.js +210 -0
  212. package/dist/ir/builder-cases/overload-null-guard-selection.test.js.map +1 -0
  213. package/dist/ir/builder-cases/overload-stub-typing.test.d.ts +2 -0
  214. package/dist/ir/builder-cases/overload-stub-typing.test.d.ts.map +1 -0
  215. package/dist/ir/builder-cases/overload-stub-typing.test.js +111 -0
  216. package/dist/ir/builder-cases/overload-stub-typing.test.js.map +1 -0
  217. package/dist/ir/builder-cases/private-members-and-instanceof.test.d.ts +5 -0
  218. package/dist/ir/builder-cases/private-members-and-instanceof.test.d.ts.map +1 -0
  219. package/dist/ir/builder-cases/private-members-and-instanceof.test.js +239 -0
  220. package/dist/ir/builder-cases/private-members-and-instanceof.test.js.map +1 -0
  221. package/dist/ir/builder-cases/promise-callback-typing.test.d.ts +5 -0
  222. package/dist/ir/builder-cases/promise-callback-typing.test.d.ts.map +1 -0
  223. package/dist/ir/builder-cases/promise-callback-typing.test.js +977 -0
  224. package/dist/ir/builder-cases/promise-callback-typing.test.js.map +1 -0
  225. package/dist/ir/builder-cases/recursive-aliases-and-flow-types.test.d.ts +5 -0
  226. package/dist/ir/builder-cases/recursive-aliases-and-flow-types.test.d.ts.map +1 -0
  227. package/dist/ir/builder-cases/recursive-aliases-and-flow-types.test.js +509 -0
  228. package/dist/ir/builder-cases/recursive-aliases-and-flow-types.test.js.map +1 -0
  229. package/dist/ir/builder-cases/statement-conversion.test.d.ts +5 -0
  230. package/dist/ir/builder-cases/statement-conversion.test.d.ts.map +1 -0
  231. package/dist/ir/builder-cases/statement-conversion.test.js +240 -0
  232. package/dist/ir/builder-cases/statement-conversion.test.js.map +1 -0
  233. package/dist/ir/builder-cases/type-access-and-records.test.d.ts +5 -0
  234. package/dist/ir/builder-cases/type-access-and-records.test.d.ts.map +1 -0
  235. package/dist/ir/builder-cases/type-access-and-records.test.js +420 -0
  236. package/dist/ir/builder-cases/type-access-and-records.test.js.map +1 -0
  237. package/dist/ir/builder-cases/typeof-narrowing-and-intrinsics.test.d.ts +5 -0
  238. package/dist/ir/builder-cases/typeof-narrowing-and-intrinsics.test.d.ts.map +1 -0
  239. package/dist/ir/builder-cases/typeof-narrowing-and-intrinsics.test.js +187 -0
  240. package/dist/ir/builder-cases/typeof-narrowing-and-intrinsics.test.js.map +1 -0
  241. package/dist/ir/builder.test.d.ts +27 -4
  242. package/dist/ir/builder.test.d.ts.map +1 -1
  243. package/dist/ir/builder.test.js +27 -3583
  244. package/dist/ir/builder.test.js.map +1 -1
  245. package/dist/ir/converters/access-paths.d.ts +20 -0
  246. package/dist/ir/converters/access-paths.d.ts.map +1 -0
  247. package/dist/ir/converters/access-paths.js +163 -0
  248. package/dist/ir/converters/access-paths.js.map +1 -0
  249. package/dist/ir/converters/array-type-guards.d.ts +7 -0
  250. package/dist/ir/converters/array-type-guards.d.ts.map +1 -0
  251. package/dist/ir/converters/array-type-guards.js +33 -0
  252. package/dist/ir/converters/array-type-guards.js.map +1 -0
  253. package/dist/ir/converters/assertion-wrapping.d.ts +4 -0
  254. package/dist/ir/converters/assertion-wrapping.d.ts.map +1 -0
  255. package/dist/ir/converters/assertion-wrapping.js +40 -0
  256. package/dist/ir/converters/assertion-wrapping.js.map +1 -0
  257. package/dist/ir/converters/expressions/access/access-converter.d.ts.map +1 -1
  258. package/dist/ir/converters/expressions/access/access-converter.js +104 -40
  259. package/dist/ir/converters/expressions/access/access-converter.js.map +1 -1
  260. package/dist/ir/converters/expressions/access/binding-resolution-hierarchical.d.ts +18 -0
  261. package/dist/ir/converters/expressions/access/binding-resolution-hierarchical.d.ts.map +1 -0
  262. package/dist/ir/converters/expressions/access/binding-resolution-hierarchical.js +347 -0
  263. package/dist/ir/converters/expressions/access/binding-resolution-hierarchical.js.map +1 -0
  264. package/dist/ir/converters/expressions/access/binding-resolution-memberid.d.ts +28 -0
  265. package/dist/ir/converters/expressions/access/binding-resolution-memberid.d.ts.map +1 -0
  266. package/dist/ir/converters/expressions/access/binding-resolution-memberid.js +522 -0
  267. package/dist/ir/converters/expressions/access/binding-resolution-memberid.js.map +1 -0
  268. package/dist/ir/converters/expressions/access/binding-resolution.d.ts +7 -31
  269. package/dist/ir/converters/expressions/access/binding-resolution.d.ts.map +1 -1
  270. package/dist/ir/converters/expressions/access/binding-resolution.js +7 -490
  271. package/dist/ir/converters/expressions/access/binding-resolution.js.map +1 -1
  272. package/dist/ir/converters/expressions/access/member-resolution.d.ts +7 -6
  273. package/dist/ir/converters/expressions/access/member-resolution.d.ts.map +1 -1
  274. package/dist/ir/converters/expressions/access/member-resolution.js +323 -77
  275. package/dist/ir/converters/expressions/access/member-resolution.js.map +1 -1
  276. package/dist/ir/converters/expressions/ambient-global-source-owner.d.ts +5 -0
  277. package/dist/ir/converters/expressions/ambient-global-source-owner.d.ts.map +1 -0
  278. package/dist/ir/converters/expressions/ambient-global-source-owner.js +252 -0
  279. package/dist/ir/converters/expressions/ambient-global-source-owner.js.map +1 -0
  280. package/dist/ir/converters/expressions/array-literals.d.ts +25 -0
  281. package/dist/ir/converters/expressions/array-literals.d.ts.map +1 -0
  282. package/dist/ir/converters/expressions/array-literals.js +356 -0
  283. package/dist/ir/converters/expressions/array-literals.js.map +1 -0
  284. package/dist/ir/converters/expressions/calls/bound-global-call-parameters.d.ts +13 -0
  285. package/dist/ir/converters/expressions/calls/bound-global-call-parameters.d.ts.map +1 -0
  286. package/dist/ir/converters/expressions/calls/bound-global-call-parameters.js +56 -0
  287. package/dist/ir/converters/expressions/calls/bound-global-call-parameters.js.map +1 -0
  288. package/dist/ir/converters/expressions/calls/call-converter.d.ts +7 -17
  289. package/dist/ir/converters/expressions/calls/call-converter.d.ts.map +1 -1
  290. package/dist/ir/converters/expressions/calls/call-converter.js +7 -648
  291. package/dist/ir/converters/expressions/calls/call-converter.js.map +1 -1
  292. package/dist/ir/converters/expressions/calls/call-expression.d.ts +9 -0
  293. package/dist/ir/converters/expressions/calls/call-expression.d.ts.map +1 -0
  294. package/dist/ir/converters/expressions/calls/call-expression.js +9 -0
  295. package/dist/ir/converters/expressions/calls/call-expression.js.map +1 -0
  296. package/dist/ir/converters/expressions/calls/call-general.d.ts +25 -0
  297. package/dist/ir/converters/expressions/calls/call-general.d.ts.map +1 -0
  298. package/dist/ir/converters/expressions/calls/call-general.js +2237 -0
  299. package/dist/ir/converters/expressions/calls/call-general.js.map +1 -0
  300. package/dist/ir/converters/expressions/calls/call-intrinsics.d.ts +16 -0
  301. package/dist/ir/converters/expressions/calls/call-intrinsics.d.ts.map +1 -0
  302. package/dist/ir/converters/expressions/calls/call-intrinsics.js +308 -0
  303. package/dist/ir/converters/expressions/calls/call-intrinsics.js.map +1 -0
  304. package/dist/ir/converters/expressions/calls/call-resolution.d.ts +58 -0
  305. package/dist/ir/converters/expressions/calls/call-resolution.d.ts.map +1 -0
  306. package/dist/ir/converters/expressions/calls/call-resolution.js +293 -0
  307. package/dist/ir/converters/expressions/calls/call-resolution.js.map +1 -0
  308. package/dist/ir/converters/expressions/calls/call-site-analysis-argument-passing.d.ts +51 -0
  309. package/dist/ir/converters/expressions/calls/call-site-analysis-argument-passing.d.ts.map +1 -0
  310. package/dist/ir/converters/expressions/calls/call-site-analysis-argument-passing.js +313 -0
  311. package/dist/ir/converters/expressions/calls/call-site-analysis-argument-passing.js.map +1 -0
  312. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.d.ts +13 -0
  313. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.d.ts.map +1 -0
  314. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.js +251 -0
  315. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.js.map +1 -0
  316. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.test.d.ts +2 -0
  317. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.test.d.ts.map +1 -0
  318. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.test.js +18 -0
  319. package/dist/ir/converters/expressions/calls/call-site-analysis-unification.test.js.map +1 -0
  320. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts +12 -51
  321. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts.map +1 -1
  322. package/dist/ir/converters/expressions/calls/call-site-analysis.js +9 -526
  323. package/dist/ir/converters/expressions/calls/call-site-analysis.js.map +1 -1
  324. package/dist/ir/converters/expressions/calls/invocation-finalization.d.ts +56 -0
  325. package/dist/ir/converters/expressions/calls/invocation-finalization.d.ts.map +1 -0
  326. package/dist/ir/converters/expressions/calls/invocation-finalization.js +723 -0
  327. package/dist/ir/converters/expressions/calls/invocation-finalization.js.map +1 -0
  328. package/dist/ir/converters/expressions/calls/new-converter.d.ts.map +1 -1
  329. package/dist/ir/converters/expressions/calls/new-converter.js +78 -3
  330. package/dist/ir/converters/expressions/calls/new-converter.js.map +1 -1
  331. package/dist/ir/converters/expressions/calls/source-backed-constructor-metadata.d.ts +22 -0
  332. package/dist/ir/converters/expressions/calls/source-backed-constructor-metadata.d.ts.map +1 -0
  333. package/dist/ir/converters/expressions/calls/source-backed-constructor-metadata.js +257 -0
  334. package/dist/ir/converters/expressions/calls/source-backed-constructor-metadata.js.map +1 -0
  335. package/dist/ir/converters/expressions/collections.d.ts +5 -25
  336. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  337. package/dist/ir/converters/expressions/collections.js +5 -886
  338. package/dist/ir/converters/expressions/collections.js.map +1 -1
  339. package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
  340. package/dist/ir/converters/expressions/functions.js +80 -65
  341. package/dist/ir/converters/expressions/functions.js.map +1 -1
  342. package/dist/ir/converters/expressions/helpers.js +1 -1
  343. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  344. package/dist/ir/converters/expressions/import-meta.d.ts +3 -3
  345. package/dist/ir/converters/expressions/import-meta.d.ts.map +1 -1
  346. package/dist/ir/converters/expressions/import-meta.js +22 -8
  347. package/dist/ir/converters/expressions/import-meta.js.map +1 -1
  348. package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
  349. package/dist/ir/converters/expressions/literals.js +31 -6
  350. package/dist/ir/converters/expressions/literals.js.map +1 -1
  351. package/dist/ir/converters/expressions/numeric-recovery-cases/call-return-and-intent.test.d.ts +9 -0
  352. package/dist/ir/converters/expressions/numeric-recovery-cases/call-return-and-intent.test.d.ts.map +1 -0
  353. package/dist/ir/converters/expressions/numeric-recovery-cases/call-return-and-intent.test.js +124 -0
  354. package/dist/ir/converters/expressions/numeric-recovery-cases/call-return-and-intent.test.js.map +1 -0
  355. package/dist/ir/converters/expressions/numeric-recovery-cases/e2e-integration.test.d.ts +8 -0
  356. package/dist/ir/converters/expressions/numeric-recovery-cases/e2e-integration.test.d.ts.map +1 -0
  357. package/dist/ir/converters/expressions/numeric-recovery-cases/e2e-integration.test.js +117 -0
  358. package/dist/ir/converters/expressions/numeric-recovery-cases/e2e-integration.test.js.map +1 -0
  359. package/dist/ir/converters/expressions/numeric-recovery-cases/property-access-recovery.test.d.ts +8 -0
  360. package/dist/ir/converters/expressions/numeric-recovery-cases/property-access-recovery.test.d.ts.map +1 -0
  361. package/dist/ir/converters/expressions/numeric-recovery-cases/property-access-recovery.test.js +170 -0
  362. package/dist/ir/converters/expressions/numeric-recovery-cases/property-access-recovery.test.js.map +1 -0
  363. package/dist/ir/converters/expressions/numeric-recovery-cases/test-helpers.d.ts +31 -0
  364. package/dist/ir/converters/expressions/numeric-recovery-cases/test-helpers.d.ts.map +1 -0
  365. package/dist/ir/converters/expressions/numeric-recovery-cases/test-helpers.js +183 -0
  366. package/dist/ir/converters/expressions/numeric-recovery-cases/test-helpers.js.map +1 -0
  367. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +3 -16
  368. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -1
  369. package/dist/ir/converters/expressions/numeric-recovery.test.js +3 -407
  370. package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -1
  371. package/dist/ir/converters/expressions/object-literal-helpers.d.ts +12 -0
  372. package/dist/ir/converters/expressions/object-literal-helpers.d.ts.map +1 -0
  373. package/dist/ir/converters/expressions/object-literal-helpers.js +12 -0
  374. package/dist/ir/converters/expressions/object-literal-helpers.js.map +1 -0
  375. package/dist/ir/converters/expressions/object-literal-synthesis.d.ts +27 -0
  376. package/dist/ir/converters/expressions/object-literal-synthesis.d.ts.map +1 -0
  377. package/dist/ir/converters/expressions/object-literal-synthesis.js +459 -0
  378. package/dist/ir/converters/expressions/object-literal-synthesis.js.map +1 -0
  379. package/dist/ir/converters/expressions/object-literal-type-helpers.d.ts +27 -0
  380. package/dist/ir/converters/expressions/object-literal-type-helpers.d.ts.map +1 -0
  381. package/dist/ir/converters/expressions/object-literal-type-helpers.js +267 -0
  382. package/dist/ir/converters/expressions/object-literal-type-helpers.js.map +1 -0
  383. package/dist/ir/converters/expressions/object-literals.d.ts +16 -0
  384. package/dist/ir/converters/expressions/object-literals.d.ts.map +1 -0
  385. package/dist/ir/converters/expressions/object-literals.js +317 -0
  386. package/dist/ir/converters/expressions/object-literals.js.map +1 -0
  387. package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
  388. package/dist/ir/converters/expressions/operators.js +33 -19
  389. package/dist/ir/converters/expressions/operators.js.map +1 -1
  390. package/dist/ir/converters/expressions/other.d.ts +4 -2
  391. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  392. package/dist/ir/converters/expressions/other.js +32 -10
  393. package/dist/ir/converters/expressions/other.js.map +1 -1
  394. package/dist/ir/converters/flow-narrowing.d.ts +6 -25
  395. package/dist/ir/converters/flow-narrowing.d.ts.map +1 -1
  396. package/dist/ir/converters/flow-narrowing.js +5 -418
  397. package/dist/ir/converters/flow-narrowing.js.map +1 -1
  398. package/dist/ir/converters/heritage-reference-type.d.ts +5 -0
  399. package/dist/ir/converters/heritage-reference-type.d.ts.map +1 -0
  400. package/dist/ir/converters/heritage-reference-type.js +22 -0
  401. package/dist/ir/converters/heritage-reference-type.js.map +1 -0
  402. package/dist/ir/converters/narrowing-candidates.d.ts +7 -0
  403. package/dist/ir/converters/narrowing-candidates.d.ts.map +1 -0
  404. package/dist/ir/converters/narrowing-candidates.js +5 -0
  405. package/dist/ir/converters/narrowing-candidates.js.map +1 -0
  406. package/dist/ir/converters/narrowing-collection.d.ts +10 -0
  407. package/dist/ir/converters/narrowing-collection.d.ts.map +1 -0
  408. package/dist/ir/converters/narrowing-collection.js +10 -0
  409. package/dist/ir/converters/narrowing-collection.js.map +1 -0
  410. package/dist/ir/converters/narrowing-environment.d.ts +13 -0
  411. package/dist/ir/converters/narrowing-environment.d.ts.map +1 -0
  412. package/dist/ir/converters/narrowing-environment.js +83 -0
  413. package/dist/ir/converters/narrowing-environment.js.map +1 -0
  414. package/dist/ir/converters/narrowing-property-helpers.d.ts +8 -0
  415. package/dist/ir/converters/narrowing-property-helpers.d.ts.map +1 -0
  416. package/dist/ir/converters/narrowing-property-helpers.js +57 -0
  417. package/dist/ir/converters/narrowing-property-helpers.js.map +1 -0
  418. package/dist/ir/converters/narrowing-resolvers-equality.d.ts +22 -0
  419. package/dist/ir/converters/narrowing-resolvers-equality.d.ts.map +1 -0
  420. package/dist/ir/converters/narrowing-resolvers-equality.js +309 -0
  421. package/dist/ir/converters/narrowing-resolvers-equality.js.map +1 -0
  422. package/dist/ir/converters/narrowing-resolvers-equality.test.d.ts +2 -0
  423. package/dist/ir/converters/narrowing-resolvers-equality.test.d.ts.map +1 -0
  424. package/dist/ir/converters/narrowing-resolvers-equality.test.js +159 -0
  425. package/dist/ir/converters/narrowing-resolvers-equality.test.js.map +1 -0
  426. package/dist/ir/converters/narrowing-resolvers-typeof.d.ts +41 -0
  427. package/dist/ir/converters/narrowing-resolvers-typeof.d.ts.map +1 -0
  428. package/dist/ir/converters/narrowing-resolvers-typeof.js +251 -0
  429. package/dist/ir/converters/narrowing-resolvers-typeof.js.map +1 -0
  430. package/dist/ir/converters/narrowing-resolvers.d.ts +12 -0
  431. package/dist/ir/converters/narrowing-resolvers.d.ts.map +1 -0
  432. package/dist/ir/converters/narrowing-resolvers.js +10 -0
  433. package/dist/ir/converters/narrowing-resolvers.js.map +1 -0
  434. package/dist/ir/converters/narrowing-truthy.d.ts +19 -0
  435. package/dist/ir/converters/narrowing-truthy.d.ts.map +1 -0
  436. package/dist/ir/converters/narrowing-truthy.js +355 -0
  437. package/dist/ir/converters/narrowing-truthy.js.map +1 -0
  438. package/dist/ir/converters/reference-type-guards.d.ts +8 -0
  439. package/dist/ir/converters/reference-type-guards.d.ts.map +1 -0
  440. package/dist/ir/converters/reference-type-guards.js +51 -0
  441. package/dist/ir/converters/reference-type-guards.js.map +1 -0
  442. package/dist/ir/converters/reference-type-guards.test.d.ts +2 -0
  443. package/dist/ir/converters/reference-type-guards.test.d.ts.map +1 -0
  444. package/dist/ir/converters/reference-type-guards.test.js +51 -0
  445. package/dist/ir/converters/reference-type-guards.test.js.map +1 -0
  446. package/dist/ir/converters/return-expression-types.d.ts +3 -0
  447. package/dist/ir/converters/return-expression-types.d.ts.map +1 -0
  448. package/dist/ir/converters/return-expression-types.js +10 -0
  449. package/dist/ir/converters/return-expression-types.js.map +1 -0
  450. package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
  451. package/dist/ir/converters/statements/control/blocks.js +72 -2
  452. package/dist/ir/converters/statements/control/blocks.js.map +1 -1
  453. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  454. package/dist/ir/converters/statements/control/conditionals.js +2 -12
  455. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  456. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  457. package/dist/ir/converters/statements/control/loops.js +18 -4
  458. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  459. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts.map +1 -1
  460. package/dist/ir/converters/statements/declarations/classes/constructors.js +36 -19
  461. package/dist/ir/converters/statements/declarations/classes/constructors.js.map +1 -1
  462. package/dist/ir/converters/statements/declarations/classes/member-names.d.ts +5 -0
  463. package/dist/ir/converters/statements/declarations/classes/member-names.d.ts.map +1 -0
  464. package/dist/ir/converters/statements/declarations/classes/member-names.js +6 -0
  465. package/dist/ir/converters/statements/declarations/classes/member-names.js.map +1 -0
  466. package/dist/ir/converters/statements/declarations/classes/method-declaration.d.ts +11 -0
  467. package/dist/ir/converters/statements/declarations/classes/method-declaration.d.ts.map +1 -0
  468. package/dist/ir/converters/statements/declarations/classes/method-declaration.js +54 -0
  469. package/dist/ir/converters/statements/declarations/classes/method-declaration.js.map +1 -0
  470. package/dist/ir/converters/statements/declarations/classes/methods.d.ts +2 -15
  471. package/dist/ir/converters/statements/declarations/classes/methods.d.ts.map +1 -1
  472. package/dist/ir/converters/statements/declarations/classes/methods.js +2 -810
  473. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  474. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts.map +1 -1
  475. package/dist/ir/converters/statements/declarations/classes/orchestrator.js +15 -41
  476. package/dist/ir/converters/statements/declarations/classes/orchestrator.js.map +1 -1
  477. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts +4 -1
  478. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts.map +1 -1
  479. package/dist/ir/converters/statements/declarations/classes/override-detection.js +18 -10
  480. package/dist/ir/converters/statements/declarations/classes/override-detection.js.map +1 -1
  481. package/dist/ir/converters/statements/declarations/classes/properties.d.ts.map +1 -1
  482. package/dist/ir/converters/statements/declarations/classes/properties.js +10 -3
  483. package/dist/ir/converters/statements/declarations/classes/properties.js.map +1 -1
  484. package/dist/ir/converters/statements/declarations/functions.d.ts.map +1 -1
  485. package/dist/ir/converters/statements/declarations/functions.js +8 -2
  486. package/dist/ir/converters/statements/declarations/functions.js.map +1 -1
  487. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  488. package/dist/ir/converters/statements/declarations/interfaces.js +67 -2
  489. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  490. package/dist/ir/converters/statements/declarations/overload-family-builders.d.ts +9 -0
  491. package/dist/ir/converters/statements/declarations/overload-family-builders.d.ts.map +1 -0
  492. package/dist/ir/converters/statements/declarations/overload-family-builders.js +21 -0
  493. package/dist/ir/converters/statements/declarations/overload-family-builders.js.map +1 -0
  494. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  495. package/dist/ir/converters/statements/declarations/type-aliases.js +12 -1
  496. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  497. package/dist/ir/converters/statements/declarations/variable-generic-lowering.d.ts +50 -0
  498. package/dist/ir/converters/statements/declarations/variable-generic-lowering.d.ts.map +1 -0
  499. package/dist/ir/converters/statements/declarations/variable-generic-lowering.js +281 -0
  500. package/dist/ir/converters/statements/declarations/variable-generic-lowering.js.map +1 -0
  501. package/dist/ir/converters/statements/declarations/variable-helpers.d.ts +29 -0
  502. package/dist/ir/converters/statements/declarations/variable-helpers.d.ts.map +1 -0
  503. package/dist/ir/converters/statements/declarations/variable-helpers.js +58 -0
  504. package/dist/ir/converters/statements/declarations/variable-helpers.js.map +1 -0
  505. package/dist/ir/converters/statements/declarations/variables-generic-function-values.d.ts +21 -0
  506. package/dist/ir/converters/statements/declarations/variables-generic-function-values.d.ts.map +1 -0
  507. package/dist/ir/converters/statements/declarations/variables-generic-function-values.js +263 -0
  508. package/dist/ir/converters/statements/declarations/variables-generic-function-values.js.map +1 -0
  509. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  510. package/dist/ir/converters/statements/declarations/variables.js +3 -262
  511. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  512. package/dist/ir/converters/synthetic-types.d.ts.map +1 -1
  513. package/dist/ir/converters/synthetic-types.js +83 -4
  514. package/dist/ir/converters/synthetic-types.js.map +1 -1
  515. package/dist/ir/converters/type-env.d.ts +3 -1
  516. package/dist/ir/converters/type-env.d.ts.map +1 -1
  517. package/dist/ir/converters/type-env.js +52 -19
  518. package/dist/ir/converters/type-env.js.map +1 -1
  519. package/dist/ir/expression-converter-dispatch.d.ts +21 -0
  520. package/dist/ir/expression-converter-dispatch.d.ts.map +1 -0
  521. package/dist/ir/expression-converter-dispatch.js +550 -0
  522. package/dist/ir/expression-converter-dispatch.js.map +1 -0
  523. package/dist/ir/expression-converter-helpers.d.ts +27 -0
  524. package/dist/ir/expression-converter-helpers.d.ts.map +1 -0
  525. package/dist/ir/expression-converter-helpers.js +172 -0
  526. package/dist/ir/expression-converter-helpers.js.map +1 -0
  527. package/dist/ir/expression-converter.d.ts +5 -15
  528. package/dist/ir/expression-converter.d.ts.map +1 -1
  529. package/dist/ir/expression-converter.js +5 -410
  530. package/dist/ir/expression-converter.js.map +1 -1
  531. package/dist/ir/field-marker.test.js +1 -1
  532. package/dist/ir/field-marker.test.js.map +1 -1
  533. package/dist/ir/json-global-typing.test.d.ts +2 -0
  534. package/dist/ir/json-global-typing.test.d.ts.map +1 -0
  535. package/dist/ir/json-global-typing.test.js +80 -0
  536. package/dist/ir/json-global-typing.test.js.map +1 -0
  537. package/dist/ir/program-context-factory.d.ts +25 -0
  538. package/dist/ir/program-context-factory.d.ts.map +1 -0
  539. package/dist/ir/program-context-factory.js +196 -0
  540. package/dist/ir/program-context-factory.js.map +1 -0
  541. package/dist/ir/program-context-types.d.ts +147 -0
  542. package/dist/ir/program-context-types.d.ts.map +1 -0
  543. package/dist/ir/program-context-types.js +123 -0
  544. package/dist/ir/program-context-types.js.map +1 -0
  545. package/dist/ir/program-context.d.ts +6 -122
  546. package/dist/ir/program-context.d.ts.map +1 -1
  547. package/dist/ir/program-context.js +5 -347
  548. package/dist/ir/program-context.js.map +1 -1
  549. package/dist/ir/program-context.test.js +20 -0
  550. package/dist/ir/program-context.test.js.map +1 -1
  551. package/dist/ir/syntax/overload-stubs.d.ts +4 -0
  552. package/dist/ir/syntax/overload-stubs.d.ts.map +1 -0
  553. package/dist/ir/syntax/overload-stubs.js +32 -0
  554. package/dist/ir/syntax/overload-stubs.js.map +1 -0
  555. package/dist/ir/syntax/property-names.d.ts +6 -0
  556. package/dist/ir/syntax/property-names.d.ts.map +1 -0
  557. package/dist/ir/syntax/property-names.js +116 -0
  558. package/dist/ir/syntax/property-names.js.map +1 -0
  559. package/dist/ir/type-system/call-resolution-callable-types.d.ts +10 -0
  560. package/dist/ir/type-system/call-resolution-callable-types.d.ts.map +1 -0
  561. package/dist/ir/type-system/call-resolution-callable-types.js +288 -0
  562. package/dist/ir/type-system/call-resolution-callable-types.js.map +1 -0
  563. package/dist/ir/type-system/call-resolution-candidate-selection.d.ts +9 -0
  564. package/dist/ir/type-system/call-resolution-candidate-selection.d.ts.map +1 -0
  565. package/dist/ir/type-system/call-resolution-candidate-selection.js +413 -0
  566. package/dist/ir/type-system/call-resolution-candidate-selection.js.map +1 -0
  567. package/dist/ir/type-system/call-resolution-inference.d.ts +12 -0
  568. package/dist/ir/type-system/call-resolution-inference.d.ts.map +1 -0
  569. package/dist/ir/type-system/call-resolution-inference.js +12 -0
  570. package/dist/ir/type-system/call-resolution-inference.js.map +1 -0
  571. package/dist/ir/type-system/call-resolution-method-substitution.d.ts +12 -0
  572. package/dist/ir/type-system/call-resolution-method-substitution.d.ts.map +1 -0
  573. package/dist/ir/type-system/call-resolution-method-substitution.js +115 -0
  574. package/dist/ir/type-system/call-resolution-method-substitution.js.map +1 -0
  575. package/dist/ir/type-system/call-resolution-parameters.d.ts +30 -0
  576. package/dist/ir/type-system/call-resolution-parameters.d.ts.map +1 -0
  577. package/dist/ir/type-system/call-resolution-parameters.js +167 -0
  578. package/dist/ir/type-system/call-resolution-parameters.js.map +1 -0
  579. package/dist/ir/type-system/call-resolution-receiver-substitution.d.ts +12 -0
  580. package/dist/ir/type-system/call-resolution-receiver-substitution.d.ts.map +1 -0
  581. package/dist/ir/type-system/call-resolution-receiver-substitution.js +134 -0
  582. package/dist/ir/type-system/call-resolution-receiver-substitution.js.map +1 -0
  583. package/dist/ir/type-system/call-resolution-resolve.d.ts +12 -0
  584. package/dist/ir/type-system/call-resolution-resolve.d.ts.map +1 -0
  585. package/dist/ir/type-system/call-resolution-resolve.js +275 -0
  586. package/dist/ir/type-system/call-resolution-resolve.js.map +1 -0
  587. package/dist/ir/type-system/call-resolution-scoring.d.ts +18 -0
  588. package/dist/ir/type-system/call-resolution-scoring.d.ts.map +1 -0
  589. package/dist/ir/type-system/call-resolution-scoring.js +166 -0
  590. package/dist/ir/type-system/call-resolution-scoring.js.map +1 -0
  591. package/dist/ir/type-system/call-resolution-signatures-catalog.d.ts +19 -0
  592. package/dist/ir/type-system/call-resolution-signatures-catalog.d.ts.map +1 -0
  593. package/dist/ir/type-system/call-resolution-signatures-catalog.js +121 -0
  594. package/dist/ir/type-system/call-resolution-signatures-catalog.js.map +1 -0
  595. package/dist/ir/type-system/call-resolution-signatures-catalog.test.d.ts +2 -0
  596. package/dist/ir/type-system/call-resolution-signatures-catalog.test.d.ts.map +1 -0
  597. package/dist/ir/type-system/call-resolution-signatures-catalog.test.js +88 -0
  598. package/dist/ir/type-system/call-resolution-signatures-catalog.test.js.map +1 -0
  599. package/dist/ir/type-system/call-resolution-signatures-raw.d.ts +21 -0
  600. package/dist/ir/type-system/call-resolution-signatures-raw.d.ts.map +1 -0
  601. package/dist/ir/type-system/call-resolution-signatures-raw.js +242 -0
  602. package/dist/ir/type-system/call-resolution-signatures-raw.js.map +1 -0
  603. package/dist/ir/type-system/call-resolution-signatures.d.ts +10 -0
  604. package/dist/ir/type-system/call-resolution-signatures.d.ts.map +1 -0
  605. package/dist/ir/type-system/call-resolution-signatures.js +10 -0
  606. package/dist/ir/type-system/call-resolution-signatures.js.map +1 -0
  607. package/dist/ir/type-system/call-resolution-type-ids.d.ts +43 -0
  608. package/dist/ir/type-system/call-resolution-type-ids.d.ts.map +1 -0
  609. package/dist/ir/type-system/call-resolution-type-ids.js +465 -0
  610. package/dist/ir/type-system/call-resolution-type-ids.js.map +1 -0
  611. package/dist/ir/type-system/call-resolution-type-ids.test.d.ts +2 -0
  612. package/dist/ir/type-system/call-resolution-type-ids.test.d.ts.map +1 -0
  613. package/dist/ir/type-system/call-resolution-type-ids.test.js +63 -0
  614. package/dist/ir/type-system/call-resolution-type-ids.test.js.map +1 -0
  615. package/dist/ir/type-system/call-resolution-unification.d.ts +18 -0
  616. package/dist/ir/type-system/call-resolution-unification.d.ts.map +1 -0
  617. package/dist/ir/type-system/call-resolution-unification.js +637 -0
  618. package/dist/ir/type-system/call-resolution-unification.js.map +1 -0
  619. package/dist/ir/type-system/call-resolution-utilities.d.ts +11 -0
  620. package/dist/ir/type-system/call-resolution-utilities.d.ts.map +1 -0
  621. package/dist/ir/type-system/call-resolution-utilities.js +11 -0
  622. package/dist/ir/type-system/call-resolution-utilities.js.map +1 -0
  623. package/dist/ir/type-system/inference-declarations-overrides.d.ts +33 -0
  624. package/dist/ir/type-system/inference-declarations-overrides.d.ts.map +1 -0
  625. package/dist/ir/type-system/inference-declarations-overrides.js +241 -0
  626. package/dist/ir/type-system/inference-declarations-overrides.js.map +1 -0
  627. package/dist/ir/type-system/inference-declarations-types.d.ts +20 -0
  628. package/dist/ir/type-system/inference-declarations-types.d.ts.map +1 -0
  629. package/dist/ir/type-system/inference-declarations-types.js +475 -0
  630. package/dist/ir/type-system/inference-declarations-types.js.map +1 -0
  631. package/dist/ir/type-system/inference-declarations.d.ts +10 -0
  632. package/dist/ir/type-system/inference-declarations.d.ts.map +1 -0
  633. package/dist/ir/type-system/inference-declarations.js +10 -0
  634. package/dist/ir/type-system/inference-declarations.js.map +1 -0
  635. package/dist/ir/type-system/inference-expressions-infer.d.ts +25 -0
  636. package/dist/ir/type-system/inference-expressions-infer.d.ts.map +1 -0
  637. package/dist/ir/type-system/inference-expressions-infer.js +427 -0
  638. package/dist/ir/type-system/inference-expressions-infer.js.map +1 -0
  639. package/dist/ir/type-system/inference-expressions-lambda.d.ts +13 -0
  640. package/dist/ir/type-system/inference-expressions-lambda.d.ts.map +1 -0
  641. package/dist/ir/type-system/inference-expressions-lambda.js +101 -0
  642. package/dist/ir/type-system/inference-expressions-lambda.js.map +1 -0
  643. package/dist/ir/type-system/inference-expressions.d.ts +10 -0
  644. package/dist/ir/type-system/inference-expressions.d.ts.map +1 -0
  645. package/dist/ir/type-system/inference-expressions.js +10 -0
  646. package/dist/ir/type-system/inference-expressions.js.map +1 -0
  647. package/dist/ir/type-system/inference-initializers-call.d.ts +37 -0
  648. package/dist/ir/type-system/inference-initializers-call.d.ts.map +1 -0
  649. package/dist/ir/type-system/inference-initializers-call.js +242 -0
  650. package/dist/ir/type-system/inference-initializers-call.js.map +1 -0
  651. package/dist/ir/type-system/inference-initializers-variable.d.ts +14 -0
  652. package/dist/ir/type-system/inference-initializers-variable.d.ts.map +1 -0
  653. package/dist/ir/type-system/inference-initializers-variable.js +178 -0
  654. package/dist/ir/type-system/inference-initializers-variable.js.map +1 -0
  655. package/dist/ir/type-system/inference-initializers.d.ts +10 -0
  656. package/dist/ir/type-system/inference-initializers.d.ts.map +1 -0
  657. package/dist/ir/type-system/inference-initializers.js +10 -0
  658. package/dist/ir/type-system/inference-initializers.js.map +1 -0
  659. package/dist/ir/type-system/inference-member-id.d.ts +21 -0
  660. package/dist/ir/type-system/inference-member-id.d.ts.map +1 -0
  661. package/dist/ir/type-system/inference-member-id.js +402 -0
  662. package/dist/ir/type-system/inference-member-id.js.map +1 -0
  663. package/dist/ir/type-system/inference-member-lookup.d.ts +15 -0
  664. package/dist/ir/type-system/inference-member-lookup.d.ts.map +1 -0
  665. package/dist/ir/type-system/inference-member-lookup.js +567 -0
  666. package/dist/ir/type-system/inference-member-lookup.js.map +1 -0
  667. package/dist/ir/type-system/inference-member-resolution.d.ts +10 -0
  668. package/dist/ir/type-system/inference-member-resolution.d.ts.map +1 -0
  669. package/dist/ir/type-system/inference-member-resolution.js +10 -0
  670. package/dist/ir/type-system/inference-member-resolution.js.map +1 -0
  671. package/dist/ir/type-system/inference-type-preference.d.ts +9 -0
  672. package/dist/ir/type-system/inference-type-preference.d.ts.map +1 -0
  673. package/dist/ir/type-system/inference-type-preference.js +67 -0
  674. package/dist/ir/type-system/inference-type-preference.js.map +1 -0
  675. package/dist/ir/type-system/inference-utilities.d.ts +48 -0
  676. package/dist/ir/type-system/inference-utilities.d.ts.map +1 -0
  677. package/dist/ir/type-system/inference-utilities.js +182 -0
  678. package/dist/ir/type-system/inference-utilities.js.map +1 -0
  679. package/dist/ir/type-system/internal/handle-types.d.ts +12 -0
  680. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -1
  681. package/dist/ir/type-system/internal/nominal-env.d.ts +1 -1
  682. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -1
  683. package/dist/ir/type-system/internal/nominal-env.js +12 -114
  684. package/dist/ir/type-system/internal/nominal-env.js.map +1 -1
  685. package/dist/ir/type-system/internal/registry-builder.d.ts +19 -0
  686. package/dist/ir/type-system/internal/registry-builder.d.ts.map +1 -0
  687. package/dist/ir/type-system/internal/registry-builder.js +292 -0
  688. package/dist/ir/type-system/internal/registry-builder.js.map +1 -0
  689. package/dist/ir/type-system/internal/registry-helpers-extraction.d.ts +69 -0
  690. package/dist/ir/type-system/internal/registry-helpers-extraction.d.ts.map +1 -0
  691. package/dist/ir/type-system/internal/registry-helpers-extraction.js +429 -0
  692. package/dist/ir/type-system/internal/registry-helpers-extraction.js.map +1 -0
  693. package/dist/ir/type-system/internal/registry-helpers-inference.d.ts +19 -0
  694. package/dist/ir/type-system/internal/registry-helpers-inference.d.ts.map +1 -0
  695. package/dist/ir/type-system/internal/registry-helpers-inference.js +237 -0
  696. package/dist/ir/type-system/internal/registry-helpers-inference.js.map +1 -0
  697. package/dist/ir/type-system/internal/registry-helpers.d.ts +12 -0
  698. package/dist/ir/type-system/internal/registry-helpers.d.ts.map +1 -0
  699. package/dist/ir/type-system/internal/registry-helpers.js +12 -0
  700. package/dist/ir/type-system/internal/registry-helpers.js.map +1 -0
  701. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-core.d.ts +53 -0
  702. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-core.d.ts.map +1 -0
  703. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-core.js +281 -0
  704. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-core.js.map +1 -0
  705. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-extract.d.ts +35 -0
  706. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-extract.d.ts.map +1 -0
  707. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-extract.js +308 -0
  708. package/dist/ir/type-system/internal/type-converter/conditional-utility-types-extract.js.map +1 -0
  709. package/dist/ir/type-system/internal/type-converter/conditional-utility-types.d.ts +23 -0
  710. package/dist/ir/type-system/internal/type-converter/conditional-utility-types.d.ts.map +1 -0
  711. package/dist/ir/type-system/internal/type-converter/conditional-utility-types.js +23 -0
  712. package/dist/ir/type-system/internal/type-converter/conditional-utility-types.js.map +1 -0
  713. package/dist/ir/type-system/internal/type-converter/direct-alias-expansion.d.ts +5 -0
  714. package/dist/ir/type-system/internal/type-converter/direct-alias-expansion.d.ts.map +1 -0
  715. package/dist/ir/type-system/internal/type-converter/direct-alias-expansion.js +232 -0
  716. package/dist/ir/type-system/internal/type-converter/direct-alias-expansion.js.map +1 -0
  717. package/dist/ir/type-system/internal/type-converter/functions.d.ts.map +1 -1
  718. package/dist/ir/type-system/internal/type-converter/functions.js +21 -0
  719. package/dist/ir/type-system/internal/type-converter/functions.js.map +1 -1
  720. package/dist/ir/type-system/internal/type-converter/mapped-utility-expansion.d.ts +37 -0
  721. package/dist/ir/type-system/internal/type-converter/mapped-utility-expansion.d.ts.map +1 -0
  722. package/dist/ir/type-system/internal/type-converter/mapped-utility-expansion.js +334 -0
  723. package/dist/ir/type-system/internal/type-converter/mapped-utility-expansion.js.map +1 -0
  724. package/dist/ir/type-system/internal/type-converter/mapped-utility-record.d.ts +27 -0
  725. package/dist/ir/type-system/internal/type-converter/mapped-utility-record.d.ts.map +1 -0
  726. package/dist/ir/type-system/internal/type-converter/mapped-utility-record.js +174 -0
  727. package/dist/ir/type-system/internal/type-converter/mapped-utility-record.js.map +1 -0
  728. package/dist/ir/type-system/internal/type-converter/mapped-utility-types.d.ts +10 -0
  729. package/dist/ir/type-system/internal/type-converter/mapped-utility-types.d.ts.map +1 -0
  730. package/dist/ir/type-system/internal/type-converter/mapped-utility-types.js +10 -0
  731. package/dist/ir/type-system/internal/type-converter/mapped-utility-types.js.map +1 -0
  732. package/dist/ir/type-system/internal/type-converter/objects.d.ts.map +1 -1
  733. package/dist/ir/type-system/internal/type-converter/objects.js +11 -6
  734. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -1
  735. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts +6 -5
  736. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -1
  737. package/dist/ir/type-system/internal/type-converter/orchestrator.js +80 -463
  738. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -1
  739. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js +47 -57
  740. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js.map +1 -1
  741. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -1
  742. package/dist/ir/type-system/internal/type-converter/primitives.js +9 -1
  743. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -1
  744. package/dist/ir/type-system/internal/type-converter/references-alias.d.ts +21 -0
  745. package/dist/ir/type-system/internal/type-converter/references-alias.d.ts.map +1 -0
  746. package/dist/ir/type-system/internal/type-converter/references-alias.js +267 -0
  747. package/dist/ir/type-system/internal/type-converter/references-alias.js.map +1 -0
  748. package/dist/ir/type-system/internal/type-converter/references-converter.d.ts +16 -0
  749. package/dist/ir/type-system/internal/type-converter/references-converter.d.ts.map +1 -0
  750. package/dist/ir/type-system/internal/type-converter/references-converter.js +203 -0
  751. package/dist/ir/type-system/internal/type-converter/references-converter.js.map +1 -0
  752. package/dist/ir/type-system/internal/type-converter/references-normalize.d.ts +49 -0
  753. package/dist/ir/type-system/internal/type-converter/references-normalize.d.ts.map +1 -0
  754. package/dist/ir/type-system/internal/type-converter/references-normalize.js +162 -0
  755. package/dist/ir/type-system/internal/type-converter/references-normalize.js.map +1 -0
  756. package/dist/ir/type-system/internal/type-converter/references-structural-bindings.d.ts +52 -0
  757. package/dist/ir/type-system/internal/type-converter/references-structural-bindings.d.ts.map +1 -0
  758. package/dist/ir/type-system/internal/type-converter/references-structural-bindings.js +295 -0
  759. package/dist/ir/type-system/internal/type-converter/references-structural-bindings.js.map +1 -0
  760. package/dist/ir/type-system/internal/type-converter/references-structural-members.d.ts +55 -0
  761. package/dist/ir/type-system/internal/type-converter/references-structural-members.d.ts.map +1 -0
  762. package/dist/ir/type-system/internal/type-converter/references-structural-members.js +334 -0
  763. package/dist/ir/type-system/internal/type-converter/references-structural-members.js.map +1 -0
  764. package/dist/ir/type-system/internal/type-converter/references-structural.d.ts +12 -0
  765. package/dist/ir/type-system/internal/type-converter/references-structural.d.ts.map +1 -0
  766. package/dist/ir/type-system/internal/type-converter/references-structural.js +12 -0
  767. package/dist/ir/type-system/internal/type-converter/references-structural.js.map +1 -0
  768. package/dist/ir/type-system/internal/type-converter/references.d.ts +8 -9
  769. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -1
  770. package/dist/ir/type-system/internal/type-converter/references.js +7 -981
  771. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -1
  772. package/dist/ir/type-system/internal/type-converter/type-operators.d.ts +16 -0
  773. package/dist/ir/type-system/internal/type-converter/type-operators.d.ts.map +1 -0
  774. package/dist/ir/type-system/internal/type-converter/type-operators.js +197 -0
  775. package/dist/ir/type-system/internal/type-converter/type-operators.js.map +1 -0
  776. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts.map +1 -1
  777. package/dist/ir/type-system/internal/type-converter/unions-intersections.js +2 -4
  778. package/dist/ir/type-system/internal/type-converter/unions-intersections.js.map +1 -1
  779. package/dist/ir/type-system/internal/type-converter/utility-types-cases/comprehensive-expansion.test.d.ts +2 -0
  780. package/dist/ir/type-system/internal/type-converter/utility-types-cases/comprehensive-expansion.test.d.ts.map +1 -0
  781. package/dist/ir/type-system/internal/type-converter/utility-types-cases/comprehensive-expansion.test.js +246 -0
  782. package/dist/ir/type-system/internal/type-converter/utility-types-cases/comprehensive-expansion.test.js.map +1 -0
  783. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-awaited-constructor-instance.test.d.ts +2 -0
  784. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-awaited-constructor-instance.test.d.ts.map +1 -0
  785. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-awaited-constructor-instance.test.js +179 -0
  786. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-awaited-constructor-instance.test.js.map +1 -0
  787. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-nonnullable-exclude-extract.test.d.ts +2 -0
  788. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-nonnullable-exclude-extract.test.d.ts.map +1 -0
  789. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-nonnullable-exclude-extract.test.js +277 -0
  790. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-nonnullable-exclude-extract.test.js.map +1 -0
  791. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-return-params.test.d.ts +2 -0
  792. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-return-params.test.d.ts.map +1 -0
  793. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-return-params.test.js +163 -0
  794. package/dist/ir/type-system/internal/type-converter/utility-types-cases/conditional-return-params.test.js.map +1 -0
  795. package/dist/ir/type-system/internal/type-converter/utility-types-cases/expansion-safety.test.d.ts +2 -0
  796. package/dist/ir/type-system/internal/type-converter/utility-types-cases/expansion-safety.test.d.ts.map +1 -0
  797. package/dist/ir/type-system/internal/type-converter/utility-types-cases/expansion-safety.test.js +305 -0
  798. package/dist/ir/type-system/internal/type-converter/utility-types-cases/expansion-safety.test.js.map +1 -0
  799. package/dist/ir/type-system/internal/type-converter/utility-types-cases/helpers.d.ts +38 -0
  800. package/dist/ir/type-system/internal/type-converter/utility-types-cases/helpers.d.ts.map +1 -0
  801. package/dist/ir/type-system/internal/type-converter/utility-types-cases/helpers.js +127 -0
  802. package/dist/ir/type-system/internal/type-converter/utility-types-cases/helpers.js.map +1 -0
  803. package/dist/ir/type-system/internal/type-converter/utility-types-cases/record-expansion.test.d.ts +2 -0
  804. package/dist/ir/type-system/internal/type-converter/utility-types-cases/record-expansion.test.d.ts.map +1 -0
  805. package/dist/ir/type-system/internal/type-converter/utility-types-cases/record-expansion.test.js +145 -0
  806. package/dist/ir/type-system/internal/type-converter/utility-types-cases/record-expansion.test.js.map +1 -0
  807. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts +6 -76
  808. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -1
  809. package/dist/ir/type-system/internal/type-converter/utility-types.js +6 -1031
  810. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -1
  811. package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts +6 -9
  812. package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts.map +1 -1
  813. package/dist/ir/type-system/internal/type-converter/utility-types.test.js +6 -1416
  814. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -1
  815. package/dist/ir/type-system/internal/type-converter/value-inference.d.ts +13 -0
  816. package/dist/ir/type-system/internal/type-converter/value-inference.d.ts.map +1 -0
  817. package/dist/ir/type-system/internal/type-converter/value-inference.js +311 -0
  818. package/dist/ir/type-system/internal/type-converter/value-inference.js.map +1 -0
  819. package/dist/ir/type-system/internal/type-registry.d.ts +12 -12
  820. package/dist/ir/type-system/internal/type-registry.d.ts.map +1 -1
  821. package/dist/ir/type-system/internal/type-registry.js +4 -529
  822. package/dist/ir/type-system/internal/type-registry.js.map +1 -1
  823. package/dist/ir/type-system/internal/universe/catalog-types.d.ts +260 -0
  824. package/dist/ir/type-system/internal/universe/catalog-types.d.ts.map +1 -0
  825. package/dist/ir/type-system/internal/universe/catalog-types.js +12 -0
  826. package/dist/ir/type-system/internal/universe/catalog-types.js.map +1 -0
  827. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +7 -5
  828. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -1
  829. package/dist/ir/type-system/internal/universe/clr-catalog.js +160 -90
  830. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -1
  831. package/dist/ir/type-system/internal/universe/clr-catalog.test.js +166 -72
  832. package/dist/ir/type-system/internal/universe/clr-catalog.test.js.map +1 -1
  833. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts +7 -47
  834. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts.map +1 -1
  835. package/dist/ir/type-system/internal/universe/clr-entry-converter.js +6 -695
  836. package/dist/ir/type-system/internal/universe/clr-entry-converter.js.map +1 -1
  837. package/dist/ir/type-system/internal/universe/clr-heritage-enrichment.d.ts +10 -0
  838. package/dist/ir/type-system/internal/universe/clr-heritage-enrichment.d.ts.map +1 -0
  839. package/dist/ir/type-system/internal/universe/clr-heritage-enrichment.js +168 -0
  840. package/dist/ir/type-system/internal/universe/clr-heritage-enrichment.js.map +1 -0
  841. package/dist/ir/type-system/internal/universe/clr-heritage-extraction.d.ts +28 -0
  842. package/dist/ir/type-system/internal/universe/clr-heritage-extraction.d.ts.map +1 -0
  843. package/dist/ir/type-system/internal/universe/clr-heritage-extraction.js +307 -0
  844. package/dist/ir/type-system/internal/universe/clr-heritage-extraction.js.map +1 -0
  845. package/dist/ir/type-system/internal/universe/clr-heritage-extractor.d.ts +11 -0
  846. package/dist/ir/type-system/internal/universe/clr-heritage-extractor.d.ts.map +1 -0
  847. package/dist/ir/type-system/internal/universe/clr-heritage-extractor.js +10 -0
  848. package/dist/ir/type-system/internal/universe/clr-heritage-extractor.js.map +1 -0
  849. package/dist/ir/type-system/internal/universe/clr-raw-converter.d.ts +41 -0
  850. package/dist/ir/type-system/internal/universe/clr-raw-converter.d.ts.map +1 -0
  851. package/dist/ir/type-system/internal/universe/clr-raw-converter.js +364 -0
  852. package/dist/ir/type-system/internal/universe/clr-raw-converter.js.map +1 -0
  853. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts +3 -41
  854. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts.map +1 -1
  855. package/dist/ir/type-system/internal/universe/clr-type-parser.js +3 -470
  856. package/dist/ir/type-system/internal/universe/clr-type-parser.js.map +1 -1
  857. package/dist/ir/type-system/internal/universe/clr-type-parser.test.js +13 -2
  858. package/dist/ir/type-system/internal/universe/clr-type-parser.test.js.map +1 -1
  859. package/dist/ir/type-system/internal/universe/clr-type-string-parsing.d.ts +28 -0
  860. package/dist/ir/type-system/internal/universe/clr-type-string-parsing.d.ts.map +1 -0
  861. package/dist/ir/type-system/internal/universe/clr-type-string-parsing.js +208 -0
  862. package/dist/ir/type-system/internal/universe/clr-type-string-parsing.js.map +1 -0
  863. package/dist/ir/type-system/internal/universe/dts-type-node-conversion.d.ts +28 -0
  864. package/dist/ir/type-system/internal/universe/dts-type-node-conversion.d.ts.map +1 -0
  865. package/dist/ir/type-system/internal/universe/dts-type-node-conversion.js +279 -0
  866. package/dist/ir/type-system/internal/universe/dts-type-node-conversion.js.map +1 -0
  867. package/dist/ir/type-system/internal/universe/index.d.ts +1 -1
  868. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -1
  869. package/dist/ir/type-system/internal/universe/index.js.map +1 -1
  870. package/dist/ir/type-system/internal/universe/raw-bindings-types.d.ts +167 -0
  871. package/dist/ir/type-system/internal/universe/raw-bindings-types.d.ts.map +1 -0
  872. package/dist/ir/type-system/internal/universe/raw-bindings-types.js +79 -0
  873. package/dist/ir/type-system/internal/universe/raw-bindings-types.js.map +1 -0
  874. package/dist/ir/type-system/internal/universe/source-catalog.d.ts +1 -1
  875. package/dist/ir/type-system/internal/universe/source-catalog.d.ts.map +1 -1
  876. package/dist/ir/type-system/internal/universe/source-catalog.js.map +1 -1
  877. package/dist/ir/type-system/internal/universe/types.d.ts +4 -388
  878. package/dist/ir/type-system/internal/universe/types.d.ts.map +1 -1
  879. package/dist/ir/type-system/internal/universe/types.js +2 -60
  880. package/dist/ir/type-system/internal/universe/types.js.map +1 -1
  881. package/dist/ir/type-system/internal/universe/unified-universe.d.ts +2 -2
  882. package/dist/ir/type-system/internal/universe/unified-universe.d.ts.map +1 -1
  883. package/dist/ir/type-system/internal/universe/unified-universe.js +467 -19
  884. package/dist/ir/type-system/internal/universe/unified-universe.js.map +1 -1
  885. package/dist/ir/type-system/internal/universe/unified-universe.test.js +7 -2
  886. package/dist/ir/type-system/internal/universe/unified-universe.test.js.map +1 -1
  887. package/dist/ir/type-system/iterable-type-shapes.d.ts +8 -0
  888. package/dist/ir/type-system/iterable-type-shapes.d.ts.map +1 -0
  889. package/dist/ir/type-system/iterable-type-shapes.js +229 -0
  890. package/dist/ir/type-system/iterable-type-shapes.js.map +1 -0
  891. package/dist/ir/type-system/type-alias-expansion.d.ts +4 -0
  892. package/dist/ir/type-system/type-alias-expansion.d.ts.map +1 -0
  893. package/dist/ir/type-system/type-alias-expansion.js +27 -0
  894. package/dist/ir/type-system/type-alias-expansion.js.map +1 -0
  895. package/dist/ir/type-system/type-system-call-resolution.d.ts +16 -68
  896. package/dist/ir/type-system/type-system-call-resolution.d.ts.map +1 -1
  897. package/dist/ir/type-system/type-system-call-resolution.js +17 -1407
  898. package/dist/ir/type-system/type-system-call-resolution.js.map +1 -1
  899. package/dist/ir/type-system/type-system-factory.d.ts +24 -0
  900. package/dist/ir/type-system/type-system-factory.d.ts.map +1 -0
  901. package/dist/ir/type-system/type-system-factory.js +145 -0
  902. package/dist/ir/type-system/type-system-factory.js.map +1 -0
  903. package/dist/ir/type-system/type-system-inference.d.ts +13 -92
  904. package/dist/ir/type-system/type-system-inference.d.ts.map +1 -1
  905. package/dist/ir/type-system/type-system-inference.js +18 -1315
  906. package/dist/ir/type-system/type-system-inference.js.map +1 -1
  907. package/dist/ir/type-system/type-system-relations.d.ts +1 -0
  908. package/dist/ir/type-system/type-system-relations.d.ts.map +1 -1
  909. package/dist/ir/type-system/type-system-relations.js +332 -19
  910. package/dist/ir/type-system/type-system-relations.js.map +1 -1
  911. package/dist/ir/type-system/type-system-state-call-types.d.ts +62 -0
  912. package/dist/ir/type-system/type-system-state-call-types.d.ts.map +1 -0
  913. package/dist/ir/type-system/type-system-state-call-types.js +2 -0
  914. package/dist/ir/type-system/type-system-state-call-types.js.map +1 -0
  915. package/dist/ir/type-system/type-system-state-handle-types.d.ts +134 -0
  916. package/dist/ir/type-system/type-system-state-handle-types.d.ts.map +1 -0
  917. package/dist/ir/type-system/type-system-state-handle-types.js +2 -0
  918. package/dist/ir/type-system/type-system-state-handle-types.js.map +1 -0
  919. package/dist/ir/type-system/type-system-state-helpers.d.ts +56 -0
  920. package/dist/ir/type-system/type-system-state-helpers.d.ts.map +1 -0
  921. package/dist/ir/type-system/type-system-state-helpers.js +291 -0
  922. package/dist/ir/type-system/type-system-state-helpers.js.map +1 -0
  923. package/dist/ir/type-system/type-system-state-model.d.ts +33 -0
  924. package/dist/ir/type-system/type-system-state-model.d.ts.map +1 -0
  925. package/dist/ir/type-system/type-system-state-model.js +3 -0
  926. package/dist/ir/type-system/type-system-state-model.js.map +1 -0
  927. package/dist/ir/type-system/type-system-state-registry-types.d.ts +11 -0
  928. package/dist/ir/type-system/type-system-state-registry-types.d.ts.map +1 -0
  929. package/dist/ir/type-system/type-system-state-registry-types.js +17 -0
  930. package/dist/ir/type-system/type-system-state-registry-types.js.map +1 -0
  931. package/dist/ir/type-system/type-system-state-types.d.ts +4 -0
  932. package/dist/ir/type-system/type-system-state-types.d.ts.map +1 -0
  933. package/dist/ir/type-system/type-system-state-types.js +4 -0
  934. package/dist/ir/type-system/type-system-state-types.js.map +1 -0
  935. package/dist/ir/type-system/type-system-state.d.ts +4 -454
  936. package/dist/ir/type-system/type-system-state.d.ts.map +1 -1
  937. package/dist/ir/type-system/type-system-state.js +4 -228
  938. package/dist/ir/type-system/type-system-state.js.map +1 -1
  939. package/dist/ir/type-system/type-system-types-api.d.ts +341 -0
  940. package/dist/ir/type-system/type-system-types-api.d.ts.map +1 -0
  941. package/dist/ir/type-system/type-system-types-api.js +11 -0
  942. package/dist/ir/type-system/type-system-types-api.js.map +1 -0
  943. package/dist/ir/type-system/type-system-utilities.d.ts +4 -48
  944. package/dist/ir/type-system/type-system-utilities.d.ts.map +1 -1
  945. package/dist/ir/type-system/type-system-utilities.js +4 -349
  946. package/dist/ir/type-system/type-system-utilities.js.map +1 -1
  947. package/dist/ir/type-system/type-system.d.ts +8 -313
  948. package/dist/ir/type-system/type-system.d.ts.map +1 -1
  949. package/dist/ir/type-system/type-system.js +7 -131
  950. package/dist/ir/type-system/type-system.js.map +1 -1
  951. package/dist/ir/type-system/types.d.ts +2 -0
  952. package/dist/ir/type-system/types.d.ts.map +1 -1
  953. package/dist/ir/type-system/types.js +5 -0
  954. package/dist/ir/type-system/types.js.map +1 -1
  955. package/dist/ir/type-system/utility-type-filter-helpers.d.ts +40 -0
  956. package/dist/ir/type-system/utility-type-filter-helpers.d.ts.map +1 -0
  957. package/dist/ir/type-system/utility-type-filter-helpers.js +142 -0
  958. package/dist/ir/type-system/utility-type-filter-helpers.js.map +1 -0
  959. package/dist/ir/type-system/utility-type-mapped-helpers.d.ts +34 -0
  960. package/dist/ir/type-system/utility-type-mapped-helpers.d.ts.map +1 -0
  961. package/dist/ir/type-system/utility-type-mapped-helpers.js +243 -0
  962. package/dist/ir/type-system/utility-type-mapped-helpers.js.map +1 -0
  963. package/dist/ir/types/expressions-core.d.ts +331 -0
  964. package/dist/ir/types/expressions-core.d.ts.map +1 -0
  965. package/dist/ir/types/expressions-core.js +5 -0
  966. package/dist/ir/types/expressions-core.js.map +1 -0
  967. package/dist/ir/types/expressions-extended.d.ts +232 -0
  968. package/dist/ir/types/expressions-extended.d.ts.map +1 -0
  969. package/dist/ir/types/expressions-extended.js +6 -0
  970. package/dist/ir/types/expressions-extended.js.map +1 -0
  971. package/dist/ir/types/expressions.d.ts +6 -480
  972. package/dist/ir/types/expressions.d.ts.map +1 -1
  973. package/dist/ir/types/expressions.js +5 -1
  974. package/dist/ir/types/expressions.js.map +1 -1
  975. package/dist/ir/types/helpers.d.ts +4 -0
  976. package/dist/ir/types/helpers.d.ts.map +1 -1
  977. package/dist/ir/types/index.d.ts +4 -2
  978. package/dist/ir/types/index.d.ts.map +1 -1
  979. package/dist/ir/types/index.js +2 -1
  980. package/dist/ir/types/index.js.map +1 -1
  981. package/dist/ir/types/ir-substitution-builders.d.ts +91 -0
  982. package/dist/ir/types/ir-substitution-builders.d.ts.map +1 -0
  983. package/dist/ir/types/ir-substitution-builders.js +340 -0
  984. package/dist/ir/types/ir-substitution-builders.js.map +1 -0
  985. package/dist/ir/types/ir-substitution-core.d.ts +55 -0
  986. package/dist/ir/types/ir-substitution-core.d.ts.map +1 -0
  987. package/dist/ir/types/ir-substitution-core.js +402 -0
  988. package/dist/ir/types/ir-substitution-core.js.map +1 -0
  989. package/dist/ir/types/ir-substitution.d.ts +13 -142
  990. package/dist/ir/types/ir-substitution.d.ts.map +1 -1
  991. package/dist/ir/types/ir-substitution.js +9 -565
  992. package/dist/ir/types/ir-substitution.js.map +1 -1
  993. package/dist/ir/types/ir-types.d.ts +80 -4
  994. package/dist/ir/types/ir-types.d.ts.map +1 -1
  995. package/dist/ir/types/overload-family.d.ts +36 -0
  996. package/dist/ir/types/overload-family.d.ts.map +1 -0
  997. package/dist/ir/types/overload-family.js +9 -0
  998. package/dist/ir/types/overload-family.js.map +1 -0
  999. package/dist/ir/types/statements.d.ts +8 -1
  1000. package/dist/ir/types/statements.d.ts.map +1 -1
  1001. package/dist/ir/types/type-ops.d.ts +41 -2
  1002. package/dist/ir/types/type-ops.d.ts.map +1 -1
  1003. package/dist/ir/types/type-ops.js +744 -45
  1004. package/dist/ir/types/type-ops.js.map +1 -1
  1005. package/dist/ir/types/type-ops.test.js +443 -1
  1006. package/dist/ir/types/type-ops.test.js.map +1 -1
  1007. package/dist/ir/types.d.ts +2 -2
  1008. package/dist/ir/types.d.ts.map +1 -1
  1009. package/dist/ir/types.js +1 -1
  1010. package/dist/ir/types.js.map +1 -1
  1011. package/dist/ir/validation/anon-type-declaration-synthesis.d.ts +11 -0
  1012. package/dist/ir/validation/anon-type-declaration-synthesis.d.ts.map +1 -0
  1013. package/dist/ir/validation/anon-type-declaration-synthesis.js +11 -0
  1014. package/dist/ir/validation/anon-type-declaration-synthesis.js.map +1 -0
  1015. package/dist/ir/validation/anon-type-ir-rewriting.d.ts +10 -0
  1016. package/dist/ir/validation/anon-type-ir-rewriting.d.ts.map +1 -0
  1017. package/dist/ir/validation/anon-type-ir-rewriting.js +3 -0
  1018. package/dist/ir/validation/anon-type-ir-rewriting.js.map +1 -0
  1019. package/dist/ir/validation/anon-type-lower-expressions.d.ts +10 -0
  1020. package/dist/ir/validation/anon-type-lower-expressions.d.ts.map +1 -0
  1021. package/dist/ir/validation/anon-type-lower-expressions.js +364 -0
  1022. package/dist/ir/validation/anon-type-lower-expressions.js.map +1 -0
  1023. package/dist/ir/validation/anon-type-lower-statements.d.ts +13 -0
  1024. package/dist/ir/validation/anon-type-lower-statements.d.ts.map +1 -0
  1025. package/dist/ir/validation/anon-type-lower-statements.js +270 -0
  1026. package/dist/ir/validation/anon-type-lower-statements.js.map +1 -0
  1027. package/dist/ir/validation/anon-type-lower-types.d.ts +60 -0
  1028. package/dist/ir/validation/anon-type-lower-types.d.ts.map +1 -0
  1029. package/dist/ir/validation/anon-type-lower-types.js +287 -0
  1030. package/dist/ir/validation/anon-type-lower-types.js.map +1 -0
  1031. package/dist/ir/validation/anon-type-naming.d.ts +20 -0
  1032. package/dist/ir/validation/anon-type-naming.d.ts.map +1 -0
  1033. package/dist/ir/validation/anon-type-naming.js +153 -0
  1034. package/dist/ir/validation/anon-type-naming.js.map +1 -0
  1035. package/dist/ir/validation/anon-type-shape-analysis.d.ts +13 -0
  1036. package/dist/ir/validation/anon-type-shape-analysis.d.ts.map +1 -0
  1037. package/dist/ir/validation/anon-type-shape-analysis.js +12 -0
  1038. package/dist/ir/validation/anon-type-shape-analysis.js.map +1 -0
  1039. package/dist/ir/validation/anon-type-shape-collectors.d.ts +39 -0
  1040. package/dist/ir/validation/anon-type-shape-collectors.d.ts.map +1 -0
  1041. package/dist/ir/validation/anon-type-shape-collectors.js +369 -0
  1042. package/dist/ir/validation/anon-type-shape-collectors.js.map +1 -0
  1043. package/dist/ir/validation/anon-type-shape-serialization.d.ts +38 -0
  1044. package/dist/ir/validation/anon-type-shape-serialization.d.ts.map +1 -0
  1045. package/dist/ir/validation/anon-type-shape-serialization.js +241 -0
  1046. package/dist/ir/validation/anon-type-shape-serialization.js.map +1 -0
  1047. package/dist/ir/validation/anon-type-template-inference.d.ts +12 -0
  1048. package/dist/ir/validation/anon-type-template-inference.d.ts.map +1 -0
  1049. package/dist/ir/validation/anon-type-template-inference.js +296 -0
  1050. package/dist/ir/validation/anon-type-template-inference.js.map +1 -0
  1051. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts +7 -1
  1052. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
  1053. package/dist/ir/validation/anonymous-type-lowering-pass.js +315 -1166
  1054. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
  1055. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/basic-lowering.test.d.ts +2 -0
  1056. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/basic-lowering.test.d.ts.map +1 -0
  1057. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/basic-lowering.test.js +332 -0
  1058. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/basic-lowering.test.js.map +1 -0
  1059. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/cross-module-reuse.test.d.ts +2 -0
  1060. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/cross-module-reuse.test.d.ts.map +1 -0
  1061. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/cross-module-reuse.test.js +255 -0
  1062. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/cross-module-reuse.test.js.map +1 -0
  1063. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/structural-references.test.d.ts +2 -0
  1064. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/structural-references.test.d.ts.map +1 -0
  1065. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/structural-references.test.js +715 -0
  1066. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/structural-references.test.js.map +1 -0
  1067. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/test-helpers.d.ts +4 -0
  1068. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/test-helpers.d.ts.map +1 -0
  1069. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/test-helpers.js +85 -0
  1070. package/dist/ir/validation/anonymous-type-lowering-regressions-cases/test-helpers.js.map +1 -0
  1071. package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts +3 -1
  1072. package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts.map +1 -1
  1073. package/dist/ir/validation/anonymous-type-lowering-regressions.test.js +3 -120
  1074. package/dist/ir/validation/anonymous-type-lowering-regressions.test.js.map +1 -1
  1075. package/dist/ir/validation/arrow-return-expression-walk.d.ts +13 -0
  1076. package/dist/ir/validation/arrow-return-expression-walk.d.ts.map +1 -0
  1077. package/dist/ir/validation/arrow-return-expression-walk.js +224 -0
  1078. package/dist/ir/validation/arrow-return-expression-walk.js.map +1 -0
  1079. package/dist/ir/validation/arrow-return-finalization-pass.d.ts +3 -17
  1080. package/dist/ir/validation/arrow-return-finalization-pass.d.ts.map +1 -1
  1081. package/dist/ir/validation/arrow-return-finalization-pass.js +2 -418
  1082. package/dist/ir/validation/arrow-return-finalization-pass.js.map +1 -1
  1083. package/dist/ir/validation/arrow-return-statement-walk.d.ts +27 -0
  1084. package/dist/ir/validation/arrow-return-statement-walk.d.ts.map +1 -0
  1085. package/dist/ir/validation/arrow-return-statement-walk.js +206 -0
  1086. package/dist/ir/validation/arrow-return-statement-walk.js.map +1 -0
  1087. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts +8 -2
  1088. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts.map +1 -1
  1089. package/dist/ir/validation/attribute-collection/arg-extractor.js.map +1 -1
  1090. package/dist/ir/validation/attribute-collection/marker-chain-parser.d.ts +21 -0
  1091. package/dist/ir/validation/attribute-collection/marker-chain-parser.d.ts.map +1 -0
  1092. package/dist/ir/validation/attribute-collection/marker-chain-parser.js +261 -0
  1093. package/dist/ir/validation/attribute-collection/marker-chain-parser.js.map +1 -0
  1094. package/dist/ir/validation/attribute-collection/marker-collection.d.ts +28 -0
  1095. package/dist/ir/validation/attribute-collection/marker-collection.d.ts.map +1 -0
  1096. package/dist/ir/validation/attribute-collection/marker-collection.js +343 -0
  1097. package/dist/ir/validation/attribute-collection/marker-collection.js.map +1 -0
  1098. package/dist/ir/validation/attribute-collection/marker-detection.d.ts +25 -0
  1099. package/dist/ir/validation/attribute-collection/marker-detection.d.ts.map +1 -0
  1100. package/dist/ir/validation/attribute-collection/marker-detection.js +214 -0
  1101. package/dist/ir/validation/attribute-collection/marker-detection.js.map +1 -0
  1102. package/dist/ir/validation/attribute-collection/marker-parser.d.ts +7 -24
  1103. package/dist/ir/validation/attribute-collection/marker-parser.d.ts.map +1 -1
  1104. package/dist/ir/validation/attribute-collection/marker-parser.js +7 -400
  1105. package/dist/ir/validation/attribute-collection/marker-parser.js.map +1 -1
  1106. package/dist/ir/validation/attribute-collection/module-rebuild.d.ts +28 -0
  1107. package/dist/ir/validation/attribute-collection/module-rebuild.d.ts.map +1 -0
  1108. package/dist/ir/validation/attribute-collection/module-rebuild.js +176 -0
  1109. package/dist/ir/validation/attribute-collection/module-rebuild.js.map +1 -0
  1110. package/dist/ir/validation/attribute-collection/orchestrator.d.ts +3 -19
  1111. package/dist/ir/validation/attribute-collection/orchestrator.d.ts.map +1 -1
  1112. package/dist/ir/validation/attribute-collection/orchestrator.js +2 -323
  1113. package/dist/ir/validation/attribute-collection/orchestrator.js.map +1 -1
  1114. package/dist/ir/validation/attribute-collection-cases/ctor-add.test.d.ts +5 -0
  1115. package/dist/ir/validation/attribute-collection-cases/ctor-add.test.d.ts.map +1 -0
  1116. package/dist/ir/validation/attribute-collection-cases/ctor-add.test.js +62 -0
  1117. package/dist/ir/validation/attribute-collection-cases/ctor-add.test.js.map +1 -0
  1118. package/dist/ir/validation/attribute-collection-cases/error-cases.test.d.ts +5 -0
  1119. package/dist/ir/validation/attribute-collection-cases/error-cases.test.d.ts.map +1 -0
  1120. package/dist/ir/validation/attribute-collection-cases/error-cases.test.js +246 -0
  1121. package/dist/ir/validation/attribute-collection-cases/error-cases.test.js.map +1 -0
  1122. package/dist/ir/validation/attribute-collection-cases/function-and-misc.test.d.ts +6 -0
  1123. package/dist/ir/validation/attribute-collection-cases/function-and-misc.test.d.ts.map +1 -0
  1124. package/dist/ir/validation/attribute-collection-cases/function-and-misc.test.js +77 -0
  1125. package/dist/ir/validation/attribute-collection-cases/function-and-misc.test.js.map +1 -0
  1126. package/dist/ir/validation/attribute-collection-cases/helpers.d.ts +186 -0
  1127. package/dist/ir/validation/attribute-collection-cases/helpers.d.ts.map +1 -0
  1128. package/dist/ir/validation/attribute-collection-cases/helpers.js +239 -0
  1129. package/dist/ir/validation/attribute-collection-cases/helpers.js.map +1 -0
  1130. package/dist/ir/validation/attribute-collection-cases/method-selector.test.d.ts +5 -0
  1131. package/dist/ir/validation/attribute-collection-cases/method-selector.test.d.ts.map +1 -0
  1132. package/dist/ir/validation/attribute-collection-cases/method-selector.test.js +371 -0
  1133. package/dist/ir/validation/attribute-collection-cases/method-selector.test.js.map +1 -0
  1134. package/dist/ir/validation/attribute-collection-cases/prop-selector.test.d.ts +5 -0
  1135. package/dist/ir/validation/attribute-collection-cases/prop-selector.test.d.ts.map +1 -0
  1136. package/dist/ir/validation/attribute-collection-cases/prop-selector.test.js +209 -0
  1137. package/dist/ir/validation/attribute-collection-cases/prop-selector.test.js.map +1 -0
  1138. package/dist/ir/validation/attribute-collection-cases/type-add.test.d.ts +5 -0
  1139. package/dist/ir/validation/attribute-collection-cases/type-add.test.d.ts.map +1 -0
  1140. package/dist/ir/validation/attribute-collection-cases/type-add.test.js +330 -0
  1141. package/dist/ir/validation/attribute-collection-cases/type-add.test.js.map +1 -0
  1142. package/dist/ir/validation/attribute-collection-pass.d.ts +5 -4
  1143. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  1144. package/dist/ir/validation/attribute-collection-pass.js +5 -4
  1145. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  1146. package/dist/ir/validation/attribute-collection-pass.test.d.ts +8 -1
  1147. package/dist/ir/validation/attribute-collection-pass.test.d.ts.map +1 -1
  1148. package/dist/ir/validation/attribute-collection-pass.test.js +8 -1331
  1149. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  1150. package/dist/ir/validation/call-resolution-refresh-pass.d.ts +8 -0
  1151. package/dist/ir/validation/call-resolution-refresh-pass.d.ts.map +1 -0
  1152. package/dist/ir/validation/call-resolution-refresh-pass.js +616 -0
  1153. package/dist/ir/validation/call-resolution-refresh-pass.js.map +1 -0
  1154. package/dist/ir/validation/char-validation-expressions.d.ts +13 -0
  1155. package/dist/ir/validation/char-validation-expressions.d.ts.map +1 -0
  1156. package/dist/ir/validation/char-validation-expressions.js +362 -0
  1157. package/dist/ir/validation/char-validation-expressions.js.map +1 -0
  1158. package/dist/ir/validation/char-validation-pass.d.ts +7 -22
  1159. package/dist/ir/validation/char-validation-pass.d.ts.map +1 -1
  1160. package/dist/ir/validation/char-validation-pass.js +6 -504
  1161. package/dist/ir/validation/char-validation-pass.js.map +1 -1
  1162. package/dist/ir/validation/char-validation-types.d.ts +28 -0
  1163. package/dist/ir/validation/char-validation-types.d.ts.map +1 -0
  1164. package/dist/ir/validation/char-validation-types.js +144 -0
  1165. package/dist/ir/validation/char-validation-types.js.map +1 -0
  1166. package/dist/ir/validation/index.d.ts +3 -0
  1167. package/dist/ir/validation/index.d.ts.map +1 -1
  1168. package/dist/ir/validation/index.js +3 -0
  1169. package/dist/ir/validation/index.js.map +1 -1
  1170. package/dist/ir/validation/known-builtin-reference-types.d.ts +12 -0
  1171. package/dist/ir/validation/known-builtin-reference-types.d.ts.map +1 -0
  1172. package/dist/ir/validation/known-builtin-reference-types.js +29 -0
  1173. package/dist/ir/validation/known-builtin-reference-types.js.map +1 -0
  1174. package/dist/ir/validation/numeric-classification.d.ts +105 -0
  1175. package/dist/ir/validation/numeric-classification.d.ts.map +1 -0
  1176. package/dist/ir/validation/numeric-classification.js +368 -0
  1177. package/dist/ir/validation/numeric-classification.js.map +1 -0
  1178. package/dist/ir/validation/numeric-coercion-pass.d.ts +3 -50
  1179. package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -1
  1180. package/dist/ir/validation/numeric-coercion-pass.js +3 -777
  1181. package/dist/ir/validation/numeric-coercion-pass.js.map +1 -1
  1182. package/dist/ir/validation/numeric-expression-validation.d.ts +26 -0
  1183. package/dist/ir/validation/numeric-expression-validation.d.ts.map +1 -0
  1184. package/dist/ir/validation/numeric-expression-validation.js +253 -0
  1185. package/dist/ir/validation/numeric-expression-validation.js.map +1 -0
  1186. package/dist/ir/validation/numeric-invariants-cases/array-index-proofs.test.d.ts +11 -0
  1187. package/dist/ir/validation/numeric-invariants-cases/array-index-proofs.test.d.ts.map +1 -0
  1188. package/dist/ir/validation/numeric-invariants-cases/array-index-proofs.test.js +185 -0
  1189. package/dist/ir/validation/numeric-invariants-cases/array-index-proofs.test.js.map +1 -0
  1190. package/dist/ir/validation/numeric-invariants-cases/arrow-function-proofs.test.d.ts +16 -0
  1191. package/dist/ir/validation/numeric-invariants-cases/arrow-function-proofs.test.d.ts.map +1 -0
  1192. package/dist/ir/validation/numeric-invariants-cases/arrow-function-proofs.test.js +364 -0
  1193. package/dist/ir/validation/numeric-invariants-cases/arrow-function-proofs.test.js.map +1 -0
  1194. package/dist/ir/validation/numeric-invariants-cases/binary-promotion.test.d.ts +9 -0
  1195. package/dist/ir/validation/numeric-invariants-cases/binary-promotion.test.d.ts.map +1 -0
  1196. package/dist/ir/validation/numeric-invariants-cases/binary-promotion.test.js +119 -0
  1197. package/dist/ir/validation/numeric-invariants-cases/binary-promotion.test.js.map +1 -0
  1198. package/dist/ir/validation/numeric-invariants-cases/helpers.d.ts +60 -0
  1199. package/dist/ir/validation/numeric-invariants-cases/helpers.d.ts.map +1 -0
  1200. package/dist/ir/validation/numeric-invariants-cases/helpers.js +163 -0
  1201. package/dist/ir/validation/numeric-invariants-cases/helpers.js.map +1 -0
  1202. package/dist/ir/validation/numeric-invariants-cases/literal-range-validation.test.d.ts +8 -0
  1203. package/dist/ir/validation/numeric-invariants-cases/literal-range-validation.test.d.ts.map +1 -0
  1204. package/dist/ir/validation/numeric-invariants-cases/literal-range-validation.test.js +110 -0
  1205. package/dist/ir/validation/numeric-invariants-cases/literal-range-validation.test.js.map +1 -0
  1206. package/dist/ir/validation/numeric-invariants-cases/narrowing-intent.test.d.ts +12 -0
  1207. package/dist/ir/validation/numeric-invariants-cases/narrowing-intent.test.d.ts.map +1 -0
  1208. package/dist/ir/validation/numeric-invariants-cases/narrowing-intent.test.js +188 -0
  1209. package/dist/ir/validation/numeric-invariants-cases/narrowing-intent.test.js.map +1 -0
  1210. package/dist/ir/validation/numeric-invariants.test.d.ts +5 -14
  1211. package/dist/ir/validation/numeric-invariants.test.d.ts.map +1 -1
  1212. package/dist/ir/validation/numeric-invariants.test.js +5 -932
  1213. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  1214. package/dist/ir/validation/numeric-proof-analysis.d.ts +9 -0
  1215. package/dist/ir/validation/numeric-proof-analysis.d.ts.map +1 -0
  1216. package/dist/ir/validation/numeric-proof-analysis.js +8 -0
  1217. package/dist/ir/validation/numeric-proof-analysis.js.map +1 -0
  1218. package/dist/ir/validation/numeric-proof-expression-walk.d.ts +18 -0
  1219. package/dist/ir/validation/numeric-proof-expression-walk.d.ts.map +1 -0
  1220. package/dist/ir/validation/numeric-proof-expression-walk.js +331 -0
  1221. package/dist/ir/validation/numeric-proof-expression-walk.js.map +1 -0
  1222. package/dist/ir/validation/numeric-proof-guard-facts.d.ts +29 -0
  1223. package/dist/ir/validation/numeric-proof-guard-facts.d.ts.map +1 -0
  1224. package/dist/ir/validation/numeric-proof-guard-facts.js +213 -0
  1225. package/dist/ir/validation/numeric-proof-guard-facts.js.map +1 -0
  1226. package/dist/ir/validation/numeric-proof-inference.d.ts +33 -0
  1227. package/dist/ir/validation/numeric-proof-inference.d.ts.map +1 -0
  1228. package/dist/ir/validation/numeric-proof-inference.js +222 -0
  1229. package/dist/ir/validation/numeric-proof-inference.js.map +1 -0
  1230. package/dist/ir/validation/numeric-proof-pass.d.ts +5 -25
  1231. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  1232. package/dist/ir/validation/numeric-proof-pass.js +5 -1165
  1233. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  1234. package/dist/ir/validation/numeric-proof-proving.d.ts +21 -0
  1235. package/dist/ir/validation/numeric-proof-proving.d.ts.map +1 -0
  1236. package/dist/ir/validation/numeric-proof-proving.js +261 -0
  1237. package/dist/ir/validation/numeric-proof-proving.js.map +1 -0
  1238. package/dist/ir/validation/numeric-proof-statement-walk.d.ts +37 -0
  1239. package/dist/ir/validation/numeric-proof-statement-walk.d.ts.map +1 -0
  1240. package/dist/ir/validation/numeric-proof-statement-walk.js +295 -0
  1241. package/dist/ir/validation/numeric-proof-statement-walk.js.map +1 -0
  1242. package/dist/ir/validation/numeric-proof-walk.d.ts +10 -0
  1243. package/dist/ir/validation/numeric-proof-walk.d.ts.map +1 -0
  1244. package/dist/ir/validation/numeric-proof-walk.js +9 -0
  1245. package/dist/ir/validation/numeric-proof-walk.js.map +1 -0
  1246. package/dist/ir/validation/numeric-statement-processing.d.ts +39 -0
  1247. package/dist/ir/validation/numeric-statement-processing.d.ts.map +1 -0
  1248. package/dist/ir/validation/numeric-statement-processing.js +229 -0
  1249. package/dist/ir/validation/numeric-statement-processing.js.map +1 -0
  1250. package/dist/ir/validation/numeric-validation.d.ts +13 -0
  1251. package/dist/ir/validation/numeric-validation.d.ts.map +1 -0
  1252. package/dist/ir/validation/numeric-validation.js +12 -0
  1253. package/dist/ir/validation/numeric-validation.js.map +1 -0
  1254. package/dist/ir/validation/overload-collection-cases/basic.test.d.ts +2 -0
  1255. package/dist/ir/validation/overload-collection-cases/basic.test.d.ts.map +1 -0
  1256. package/dist/ir/validation/overload-collection-cases/basic.test.js +103 -0
  1257. package/dist/ir/validation/overload-collection-cases/basic.test.js.map +1 -0
  1258. package/dist/ir/validation/overload-collection-cases/consistency.test.d.ts +2 -0
  1259. package/dist/ir/validation/overload-collection-cases/consistency.test.d.ts.map +1 -0
  1260. package/dist/ir/validation/overload-collection-cases/consistency.test.js +79 -0
  1261. package/dist/ir/validation/overload-collection-cases/consistency.test.js.map +1 -0
  1262. package/dist/ir/validation/overload-collection-cases/error-cases.test.d.ts +2 -0
  1263. package/dist/ir/validation/overload-collection-cases/error-cases.test.d.ts.map +1 -0
  1264. package/dist/ir/validation/overload-collection-cases/error-cases.test.js +24 -0
  1265. package/dist/ir/validation/overload-collection-cases/error-cases.test.js.map +1 -0
  1266. package/dist/ir/validation/overload-collection-cases/helpers.d.ts +107 -0
  1267. package/dist/ir/validation/overload-collection-cases/helpers.d.ts.map +1 -0
  1268. package/dist/ir/validation/overload-collection-cases/helpers.js +142 -0
  1269. package/dist/ir/validation/overload-collection-cases/helpers.js.map +1 -0
  1270. package/dist/ir/validation/overload-collection-pass.d.ts +16 -0
  1271. package/dist/ir/validation/overload-collection-pass.d.ts.map +1 -0
  1272. package/dist/ir/validation/overload-collection-pass.js +930 -0
  1273. package/dist/ir/validation/overload-collection-pass.js.map +1 -0
  1274. package/dist/ir/validation/overload-collection-pass.test.d.ts +4 -0
  1275. package/dist/ir/validation/overload-collection-pass.test.d.ts.map +1 -0
  1276. package/dist/ir/validation/overload-collection-pass.test.js +4 -0
  1277. package/dist/ir/validation/overload-collection-pass.test.js.map +1 -0
  1278. package/dist/ir/validation/overload-family-consistency-pass.d.ts +9 -0
  1279. package/dist/ir/validation/overload-family-consistency-pass.d.ts.map +1 -0
  1280. package/dist/ir/validation/overload-family-consistency-pass.js +161 -0
  1281. package/dist/ir/validation/overload-family-consistency-pass.js.map +1 -0
  1282. package/dist/ir/validation/rest-type-synthesis-helpers.d.ts +52 -0
  1283. package/dist/ir/validation/rest-type-synthesis-helpers.d.ts.map +1 -0
  1284. package/dist/ir/validation/rest-type-synthesis-helpers.js +250 -0
  1285. package/dist/ir/validation/rest-type-synthesis-helpers.js.map +1 -0
  1286. package/dist/ir/validation/rest-type-synthesis-pass.d.ts +6 -20
  1287. package/dist/ir/validation/rest-type-synthesis-pass.d.ts.map +1 -1
  1288. package/dist/ir/validation/rest-type-synthesis-pass.js +5 -461
  1289. package/dist/ir/validation/rest-type-synthesis-pass.js.map +1 -1
  1290. package/dist/ir/validation/rest-type-synthesis-processing.d.ts +14 -0
  1291. package/dist/ir/validation/rest-type-synthesis-processing.d.ts.map +1 -0
  1292. package/dist/ir/validation/rest-type-synthesis-processing.js +220 -0
  1293. package/dist/ir/validation/rest-type-synthesis-processing.js.map +1 -0
  1294. package/dist/ir/validation/soundness-gate-cases/any-type-and-primitives.test.d.ts +12 -0
  1295. package/dist/ir/validation/soundness-gate-cases/any-type-and-primitives.test.d.ts.map +1 -0
  1296. package/dist/ir/validation/soundness-gate-cases/any-type-and-primitives.test.js +99 -0
  1297. package/dist/ir/validation/soundness-gate-cases/any-type-and-primitives.test.js.map +1 -0
  1298. package/dist/ir/validation/soundness-gate-cases/computed-member-access.test.d.ts +10 -0
  1299. package/dist/ir/validation/soundness-gate-cases/computed-member-access.test.d.ts.map +1 -0
  1300. package/dist/ir/validation/soundness-gate-cases/computed-member-access.test.js +139 -0
  1301. package/dist/ir/validation/soundness-gate-cases/computed-member-access.test.js.map +1 -0
  1302. package/dist/ir/validation/soundness-gate-cases/inference-diagnostics.test.d.ts +10 -0
  1303. package/dist/ir/validation/soundness-gate-cases/inference-diagnostics.test.d.ts.map +1 -0
  1304. package/dist/ir/validation/soundness-gate-cases/inference-diagnostics.test.js +123 -0
  1305. package/dist/ir/validation/soundness-gate-cases/inference-diagnostics.test.js.map +1 -0
  1306. package/dist/ir/validation/soundness-gate-cases/reference-type-resolution.test.d.ts +15 -0
  1307. package/dist/ir/validation/soundness-gate-cases/reference-type-resolution.test.d.ts.map +1 -0
  1308. package/dist/ir/validation/soundness-gate-cases/reference-type-resolution.test.js +292 -0
  1309. package/dist/ir/validation/soundness-gate-cases/reference-type-resolution.test.js.map +1 -0
  1310. package/dist/ir/validation/soundness-gate-cases/test-helpers.d.ts +12 -0
  1311. package/dist/ir/validation/soundness-gate-cases/test-helpers.d.ts.map +1 -0
  1312. package/dist/ir/validation/soundness-gate-cases/test-helpers.js +36 -0
  1313. package/dist/ir/validation/soundness-gate-cases/test-helpers.js.map +1 -0
  1314. package/dist/ir/validation/soundness-gate-cases/type-params-and-intrinsics.test.d.ts +11 -0
  1315. package/dist/ir/validation/soundness-gate-cases/type-params-and-intrinsics.test.d.ts.map +1 -0
  1316. package/dist/ir/validation/soundness-gate-cases/type-params-and-intrinsics.test.js +249 -0
  1317. package/dist/ir/validation/soundness-gate-cases/type-params-and-intrinsics.test.js.map +1 -0
  1318. package/dist/ir/validation/soundness-gate-expression-validation.d.ts +3 -0
  1319. package/dist/ir/validation/soundness-gate-expression-validation.d.ts.map +1 -0
  1320. package/dist/ir/validation/soundness-gate-expression-validation.js +205 -0
  1321. package/dist/ir/validation/soundness-gate-expression-validation.js.map +1 -0
  1322. package/dist/ir/validation/soundness-gate-shared.d.ts +26 -0
  1323. package/dist/ir/validation/soundness-gate-shared.d.ts.map +1 -0
  1324. package/dist/ir/validation/soundness-gate-shared.js +46 -0
  1325. package/dist/ir/validation/soundness-gate-shared.js.map +1 -0
  1326. package/dist/ir/validation/soundness-gate-statement-validation.d.ts +5 -0
  1327. package/dist/ir/validation/soundness-gate-statement-validation.d.ts.map +1 -0
  1328. package/dist/ir/validation/soundness-gate-statement-validation.js +199 -0
  1329. package/dist/ir/validation/soundness-gate-statement-validation.js.map +1 -0
  1330. package/dist/ir/validation/soundness-gate-type-validation.d.ts +9 -0
  1331. package/dist/ir/validation/soundness-gate-type-validation.d.ts.map +1 -0
  1332. package/dist/ir/validation/soundness-gate-type-validation.js +149 -0
  1333. package/dist/ir/validation/soundness-gate-type-validation.js.map +1 -0
  1334. package/dist/ir/validation/soundness-gate.d.ts +2 -18
  1335. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  1336. package/dist/ir/validation/soundness-gate.js +15 -608
  1337. package/dist/ir/validation/soundness-gate.js.map +1 -1
  1338. package/dist/ir/validation/soundness-gate.test.d.ts +5 -12
  1339. package/dist/ir/validation/soundness-gate.test.d.ts.map +1 -1
  1340. package/dist/ir/validation/soundness-gate.test.js +5 -696
  1341. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  1342. package/dist/ir/validation/virtual-marking-pass.d.ts +10 -2
  1343. package/dist/ir/validation/virtual-marking-pass.d.ts.map +1 -1
  1344. package/dist/ir/validation/virtual-marking-pass.js +347 -59
  1345. package/dist/ir/validation/virtual-marking-pass.js.map +1 -1
  1346. package/dist/ir/validation/virtual-marking-pass.test.d.ts +2 -0
  1347. package/dist/ir/validation/virtual-marking-pass.test.d.ts.map +1 -0
  1348. package/dist/ir/validation/virtual-marking-pass.test.js +314 -0
  1349. package/dist/ir/validation/virtual-marking-pass.test.js.map +1 -0
  1350. package/dist/ir/validation/yield-expression-lowering.d.ts +13 -0
  1351. package/dist/ir/validation/yield-expression-lowering.d.ts.map +1 -0
  1352. package/dist/ir/validation/yield-expression-lowering.js +13 -0
  1353. package/dist/ir/validation/yield-expression-lowering.js.map +1 -0
  1354. package/dist/ir/validation/yield-lowering-cases/assignment-yield.test.d.ts +14 -0
  1355. package/dist/ir/validation/yield-lowering-cases/assignment-yield.test.d.ts.map +1 -0
  1356. package/dist/ir/validation/yield-lowering-cases/assignment-yield.test.js +383 -0
  1357. package/dist/ir/validation/yield-lowering-cases/assignment-yield.test.js.map +1 -0
  1358. package/dist/ir/validation/yield-lowering-cases/basic-yield.test.d.ts +12 -0
  1359. package/dist/ir/validation/yield-lowering-cases/basic-yield.test.d.ts.map +1 -0
  1360. package/dist/ir/validation/yield-lowering-cases/basic-yield.test.js +120 -0
  1361. package/dist/ir/validation/yield-lowering-cases/basic-yield.test.js.map +1 -0
  1362. package/dist/ir/validation/yield-lowering-cases/control-flow.test.d.ts +13 -0
  1363. package/dist/ir/validation/yield-lowering-cases/control-flow.test.d.ts.map +1 -0
  1364. package/dist/ir/validation/yield-lowering-cases/control-flow.test.js +284 -0
  1365. package/dist/ir/validation/yield-lowering-cases/control-flow.test.js.map +1 -0
  1366. package/dist/ir/validation/yield-lowering-cases/destructuring-and-unsupported.test.d.ts +13 -0
  1367. package/dist/ir/validation/yield-lowering-cases/destructuring-and-unsupported.test.d.ts.map +1 -0
  1368. package/dist/ir/validation/yield-lowering-cases/destructuring-and-unsupported.test.js +334 -0
  1369. package/dist/ir/validation/yield-lowering-cases/destructuring-and-unsupported.test.js.map +1 -0
  1370. package/dist/ir/validation/yield-lowering-cases/for-loop-initializer.test.d.ts +16 -0
  1371. package/dist/ir/validation/yield-lowering-cases/for-loop-initializer.test.d.ts.map +1 -0
  1372. package/dist/ir/validation/yield-lowering-cases/for-loop-initializer.test.js +321 -0
  1373. package/dist/ir/validation/yield-lowering-cases/for-loop-initializer.test.js.map +1 -0
  1374. package/dist/ir/validation/yield-lowering-cases/helpers.d.ts +32 -0
  1375. package/dist/ir/validation/yield-lowering-cases/helpers.d.ts.map +1 -0
  1376. package/dist/ir/validation/yield-lowering-cases/helpers.js +76 -0
  1377. package/dist/ir/validation/yield-lowering-cases/helpers.js.map +1 -0
  1378. package/dist/ir/validation/yield-lowering-cases/nested-yield-in-statements.test.d.ts +13 -0
  1379. package/dist/ir/validation/yield-lowering-cases/nested-yield-in-statements.test.d.ts.map +1 -0
  1380. package/dist/ir/validation/yield-lowering-cases/nested-yield-in-statements.test.js +221 -0
  1381. package/dist/ir/validation/yield-lowering-cases/nested-yield-in-statements.test.js.map +1 -0
  1382. package/dist/ir/validation/yield-lowering-cases/non-generator-and-modules.test.d.ts +11 -0
  1383. package/dist/ir/validation/yield-lowering-cases/non-generator-and-modules.test.d.ts.map +1 -0
  1384. package/dist/ir/validation/yield-lowering-cases/non-generator-and-modules.test.js +136 -0
  1385. package/dist/ir/validation/yield-lowering-cases/non-generator-and-modules.test.js.map +1 -0
  1386. package/dist/ir/validation/yield-lowering-cases/pipeline-contract-and-return.test.d.ts +14 -0
  1387. package/dist/ir/validation/yield-lowering-cases/pipeline-contract-and-return.test.d.ts.map +1 -0
  1388. package/dist/ir/validation/yield-lowering-cases/pipeline-contract-and-return.test.js +219 -0
  1389. package/dist/ir/validation/yield-lowering-cases/pipeline-contract-and-return.test.js.map +1 -0
  1390. package/dist/ir/validation/yield-lowering-helpers.d.ts +63 -0
  1391. package/dist/ir/validation/yield-lowering-helpers.d.ts.map +1 -0
  1392. package/dist/ir/validation/yield-lowering-helpers.js +240 -0
  1393. package/dist/ir/validation/yield-lowering-helpers.js.map +1 -0
  1394. package/dist/ir/validation/yield-lowering-pass.d.ts +7 -1
  1395. package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -1
  1396. package/dist/ir/validation/yield-lowering-pass.js +8 -1418
  1397. package/dist/ir/validation/yield-lowering-pass.js.map +1 -1
  1398. package/dist/ir/validation/yield-lowering-pass.test.d.ts +8 -11
  1399. package/dist/ir/validation/yield-lowering-pass.test.d.ts.map +1 -1
  1400. package/dist/ir/validation/yield-lowering-pass.test.js +8 -1975
  1401. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  1402. package/dist/ir/validation/yield-main-expression-lowering.d.ts +20 -0
  1403. package/dist/ir/validation/yield-main-expression-lowering.d.ts.map +1 -0
  1404. package/dist/ir/validation/yield-main-expression-lowering.js +381 -0
  1405. package/dist/ir/validation/yield-main-expression-lowering.js.map +1 -0
  1406. package/dist/ir/validation/yield-member-access-lowering.d.ts +21 -0
  1407. package/dist/ir/validation/yield-member-access-lowering.d.ts.map +1 -0
  1408. package/dist/ir/validation/yield-member-access-lowering.js +58 -0
  1409. package/dist/ir/validation/yield-member-access-lowering.js.map +1 -0
  1410. package/dist/ir/validation/yield-module-processing.d.ts +25 -0
  1411. package/dist/ir/validation/yield-module-processing.d.ts.map +1 -0
  1412. package/dist/ir/validation/yield-module-processing.js +180 -0
  1413. package/dist/ir/validation/yield-module-processing.js.map +1 -0
  1414. package/dist/ir/validation/yield-statement-loops.d.ts +51 -0
  1415. package/dist/ir/validation/yield-statement-loops.d.ts.map +1 -0
  1416. package/dist/ir/validation/yield-statement-loops.js +344 -0
  1417. package/dist/ir/validation/yield-statement-loops.js.map +1 -0
  1418. package/dist/ir/validation/yield-statement-lowering.d.ts +18 -0
  1419. package/dist/ir/validation/yield-statement-lowering.d.ts.map +1 -0
  1420. package/dist/ir/validation/yield-statement-lowering.js +48 -0
  1421. package/dist/ir/validation/yield-statement-lowering.js.map +1 -0
  1422. package/dist/ir/validation/yield-statement-simple.d.ts +33 -0
  1423. package/dist/ir/validation/yield-statement-simple.d.ts.map +1 -0
  1424. package/dist/ir/validation/yield-statement-simple.js +268 -0
  1425. package/dist/ir/validation/yield-statement-simple.js.map +1 -0
  1426. package/dist/program/binding-loader.d.ts.map +1 -1
  1427. package/dist/program/binding-loader.js +1099 -6
  1428. package/dist/program/binding-loader.js.map +1 -1
  1429. package/dist/program/binding-payload-invariants.test.d.ts +2 -0
  1430. package/dist/program/binding-payload-invariants.test.d.ts.map +1 -0
  1431. package/dist/program/binding-payload-invariants.test.js +55 -0
  1432. package/dist/program/binding-payload-invariants.test.js.map +1 -0
  1433. package/dist/program/binding-registry-loading.d.ts +51 -0
  1434. package/dist/program/binding-registry-loading.d.ts.map +1 -0
  1435. package/dist/program/binding-registry-loading.js +816 -0
  1436. package/dist/program/binding-registry-loading.js.map +1 -0
  1437. package/dist/program/binding-registry-resolution-extension.d.ts +26 -0
  1438. package/dist/program/binding-registry-resolution-extension.d.ts.map +1 -0
  1439. package/dist/program/binding-registry-resolution-extension.js +161 -0
  1440. package/dist/program/binding-registry-resolution-extension.js.map +1 -0
  1441. package/dist/program/binding-registry-resolution-member.d.ts +46 -0
  1442. package/dist/program/binding-registry-resolution-member.d.ts.map +1 -0
  1443. package/dist/program/binding-registry-resolution-member.js +252 -0
  1444. package/dist/program/binding-registry-resolution-member.js.map +1 -0
  1445. package/dist/program/binding-registry-resolution.d.ts +13 -0
  1446. package/dist/program/binding-registry-resolution.d.ts.map +1 -0
  1447. package/dist/program/binding-registry-resolution.js +12 -0
  1448. package/dist/program/binding-registry-resolution.js.map +1 -0
  1449. package/dist/program/binding-registry.d.ts +34 -22
  1450. package/dist/program/binding-registry.d.ts.map +1 -1
  1451. package/dist/program/binding-registry.js +111 -562
  1452. package/dist/program/binding-registry.js.map +1 -1
  1453. package/dist/program/binding-types.d.ts +34 -3
  1454. package/dist/program/binding-types.d.ts.map +1 -1
  1455. package/dist/program/binding-types.js +72 -2
  1456. package/dist/program/binding-types.js.map +1 -1
  1457. package/dist/program/bindings-cases/dotnet-payload-boundaries.test.d.ts +2 -0
  1458. package/dist/program/bindings-cases/dotnet-payload-boundaries.test.d.ts.map +1 -0
  1459. package/dist/program/bindings-cases/dotnet-payload-boundaries.test.js +115 -0
  1460. package/dist/program/bindings-cases/dotnet-payload-boundaries.test.js.map +1 -0
  1461. package/dist/program/bindings-cases/hierarchical-and-type-semantics.test.d.ts +6 -0
  1462. package/dist/program/bindings-cases/hierarchical-and-type-semantics.test.d.ts.map +1 -0
  1463. package/dist/program/bindings-cases/hierarchical-and-type-semantics.test.js +573 -0
  1464. package/dist/program/bindings-cases/hierarchical-and-type-semantics.test.js.map +1 -0
  1465. package/dist/program/bindings-cases/load-bindings.test.d.ts +7 -0
  1466. package/dist/program/bindings-cases/load-bindings.test.d.ts.map +1 -0
  1467. package/dist/program/bindings-cases/load-bindings.test.js +545 -0
  1468. package/dist/program/bindings-cases/load-bindings.test.js.map +1 -0
  1469. package/dist/program/bindings-cases/registry-basics.test.d.ts +6 -0
  1470. package/dist/program/bindings-cases/registry-basics.test.d.ts.map +1 -0
  1471. package/dist/program/bindings-cases/registry-basics.test.js +201 -0
  1472. package/dist/program/bindings-cases/registry-basics.test.js.map +1 -0
  1473. package/dist/program/bindings-cases/registry-member-resolution.test.d.ts +8 -0
  1474. package/dist/program/bindings-cases/registry-member-resolution.test.d.ts.map +1 -0
  1475. package/dist/program/bindings-cases/registry-member-resolution.test.js +301 -0
  1476. package/dist/program/bindings-cases/registry-member-resolution.test.js.map +1 -0
  1477. package/dist/program/bindings.d.ts +2 -1
  1478. package/dist/program/bindings.d.ts.map +1 -1
  1479. package/dist/program/bindings.js +1 -0
  1480. package/dist/program/bindings.js.map +1 -1
  1481. package/dist/program/bindings.test.d.ts +12 -2
  1482. package/dist/program/bindings.test.d.ts.map +1 -1
  1483. package/dist/program/bindings.test.js +12 -988
  1484. package/dist/program/bindings.test.js.map +1 -1
  1485. package/dist/program/core-declarations.d.ts +16 -0
  1486. package/dist/program/core-declarations.d.ts.map +1 -0
  1487. package/dist/program/core-declarations.js +126 -0
  1488. package/dist/program/core-declarations.js.map +1 -0
  1489. package/dist/program/creation-cases/authoritative-type-roots.test.d.ts +6 -0
  1490. package/dist/program/creation-cases/authoritative-type-roots.test.d.ts.map +1 -0
  1491. package/dist/program/creation-cases/authoritative-type-roots.test.js +136 -0
  1492. package/dist/program/creation-cases/authoritative-type-roots.test.js.map +1 -0
  1493. package/dist/program/creation-cases/compiler-options.test.d.ts +5 -0
  1494. package/dist/program/creation-cases/compiler-options.test.d.ts.map +1 -0
  1495. package/dist/program/creation-cases/compiler-options.test.js +77 -0
  1496. package/dist/program/creation-cases/compiler-options.test.js.map +1 -0
  1497. package/dist/program/creation-cases/core-type-checking.test.d.ts +6 -0
  1498. package/dist/program/creation-cases/core-type-checking.test.d.ts.map +1 -0
  1499. package/dist/program/creation-cases/core-type-checking.test.js +66 -0
  1500. package/dist/program/creation-cases/core-type-checking.test.js.map +1 -0
  1501. package/dist/program/creation-cases/js-surface-globals.test.d.ts +6 -0
  1502. package/dist/program/creation-cases/js-surface-globals.test.d.ts.map +1 -0
  1503. package/dist/program/creation-cases/js-surface-globals.test.js +236 -0
  1504. package/dist/program/creation-cases/js-surface-globals.test.js.map +1 -0
  1505. package/dist/program/creation-cases/module-bindings.test.d.ts +2 -0
  1506. package/dist/program/creation-cases/module-bindings.test.d.ts.map +1 -0
  1507. package/dist/program/creation-cases/module-bindings.test.js +253 -0
  1508. package/dist/program/creation-cases/module-bindings.test.js.map +1 -0
  1509. package/dist/program/creation-cases/package-resolution.test.d.ts +6 -0
  1510. package/dist/program/creation-cases/package-resolution.test.d.ts.map +1 -0
  1511. package/dist/program/creation-cases/package-resolution.test.js +116 -0
  1512. package/dist/program/creation-cases/package-resolution.test.js.map +1 -0
  1513. package/dist/program/creation-cases/surface-isolation.test.d.ts +6 -0
  1514. package/dist/program/creation-cases/surface-isolation.test.d.ts.map +1 -0
  1515. package/dist/program/creation-cases/surface-isolation.test.js +196 -0
  1516. package/dist/program/creation-cases/surface-isolation.test.js.map +1 -0
  1517. package/dist/program/creation-cases/test-package-helpers.d.ts +6 -0
  1518. package/dist/program/creation-cases/test-package-helpers.d.ts.map +1 -0
  1519. package/dist/program/creation-cases/test-package-helpers.js +26 -0
  1520. package/dist/program/creation-cases/test-package-helpers.js.map +1 -0
  1521. package/dist/program/creation.d.ts +3 -14
  1522. package/dist/program/creation.d.ts.map +1 -1
  1523. package/dist/program/creation.js +3 -780
  1524. package/dist/program/creation.js.map +1 -1
  1525. package/dist/program/creation.test.d.ts +10 -2
  1526. package/dist/program/creation.test.d.ts.map +1 -1
  1527. package/dist/program/creation.test.js +10 -929
  1528. package/dist/program/creation.test.js.map +1 -1
  1529. package/dist/program/declaration-module-aliases.d.ts +13 -0
  1530. package/dist/program/declaration-module-aliases.d.ts.map +1 -0
  1531. package/dist/program/declaration-module-aliases.js +144 -0
  1532. package/dist/program/declaration-module-aliases.js.map +1 -0
  1533. package/dist/program/dependency-graph.d.ts +3 -1
  1534. package/dist/program/dependency-graph.d.ts.map +1 -1
  1535. package/dist/program/dependency-graph.js +211 -23
  1536. package/dist/program/dependency-graph.js.map +1 -1
  1537. package/dist/program/dependency-graph.test.js +307 -85
  1538. package/dist/program/dependency-graph.test.js.map +1 -1
  1539. package/dist/program/diagnostics.d.ts +1 -1
  1540. package/dist/program/diagnostics.d.ts.map +1 -1
  1541. package/dist/program/diagnostics.js +2 -48
  1542. package/dist/program/diagnostics.js.map +1 -1
  1543. package/dist/program/diagnostics.test.js +9 -24
  1544. package/dist/program/diagnostics.test.js.map +1 -1
  1545. package/dist/program/dotnet-binding-payload.d.ts +12 -0
  1546. package/dist/program/dotnet-binding-payload.d.ts.map +1 -0
  1547. package/dist/program/dotnet-binding-payload.js +71 -0
  1548. package/dist/program/dotnet-binding-payload.js.map +1 -0
  1549. package/dist/program/fixture-fast-coverage.test.d.ts +2 -0
  1550. package/dist/program/fixture-fast-coverage.test.d.ts.map +1 -0
  1551. package/dist/program/fixture-fast-coverage.test.js +225 -0
  1552. package/dist/program/fixture-fast-coverage.test.js.map +1 -0
  1553. package/dist/program/index.d.ts +1 -1
  1554. package/dist/program/index.d.ts.map +1 -1
  1555. package/dist/program/index.js +1 -1
  1556. package/dist/program/index.js.map +1 -1
  1557. package/dist/program/json-deserialize-overload-resolution.test.d.ts +2 -0
  1558. package/dist/program/json-deserialize-overload-resolution.test.d.ts.map +1 -0
  1559. package/dist/program/json-deserialize-overload-resolution.test.js +57 -0
  1560. package/dist/program/json-deserialize-overload-resolution.test.js.map +1 -0
  1561. package/dist/program/metadata.d.ts.map +1 -1
  1562. package/dist/program/metadata.js +24 -8
  1563. package/dist/program/metadata.js.map +1 -1
  1564. package/dist/program/metadata.test.js +30 -82
  1565. package/dist/program/metadata.test.js.map +1 -1
  1566. package/dist/program/module-resolution.d.ts +29 -0
  1567. package/dist/program/module-resolution.d.ts.map +1 -0
  1568. package/dist/program/module-resolution.js +257 -0
  1569. package/dist/program/module-resolution.js.map +1 -0
  1570. package/dist/program/package-roots.d.ts +3 -1
  1571. package/dist/program/package-roots.d.ts.map +1 -1
  1572. package/dist/program/package-roots.js +159 -21
  1573. package/dist/program/package-roots.js.map +1 -1
  1574. package/dist/program/package-roots.test.js +81 -25
  1575. package/dist/program/package-roots.test.js.map +1 -1
  1576. package/dist/program/program-assembly.d.ts +12 -0
  1577. package/dist/program/program-assembly.d.ts.map +1 -0
  1578. package/dist/program/program-assembly.js +409 -0
  1579. package/dist/program/program-assembly.js.map +1 -0
  1580. package/dist/program/program-factory.d.ts +9 -0
  1581. package/dist/program/program-factory.d.ts.map +1 -0
  1582. package/dist/program/program-factory.js +9 -0
  1583. package/dist/program/program-factory.js.map +1 -0
  1584. package/dist/program/program-input-discovery.d.ts +19 -0
  1585. package/dist/program/program-input-discovery.d.ts.map +1 -0
  1586. package/dist/program/program-input-discovery.js +379 -0
  1587. package/dist/program/program-input-discovery.js.map +1 -0
  1588. package/dist/program/program-input-discovery.test.d.ts +2 -0
  1589. package/dist/program/program-input-discovery.test.d.ts.map +1 -0
  1590. package/dist/program/program-input-discovery.test.js +342 -0
  1591. package/dist/program/program-input-discovery.test.js.map +1 -0
  1592. package/dist/program/source-binding-imports.d.ts +7 -0
  1593. package/dist/program/source-binding-imports.d.ts.map +1 -0
  1594. package/dist/program/source-binding-imports.js +80 -0
  1595. package/dist/program/source-binding-imports.js.map +1 -0
  1596. package/dist/program/source-binding-imports.test.d.ts +2 -0
  1597. package/dist/program/source-binding-imports.test.d.ts.map +1 -0
  1598. package/dist/program/source-binding-imports.test.js +58 -0
  1599. package/dist/program/source-binding-imports.test.js.map +1 -0
  1600. package/dist/program/source-file-identity.d.ts +13 -0
  1601. package/dist/program/source-file-identity.d.ts.map +1 -0
  1602. package/dist/program/source-file-identity.js +127 -0
  1603. package/dist/program/source-file-identity.js.map +1 -0
  1604. package/dist/program/source-package-metadata.d.ts +14 -0
  1605. package/dist/program/source-package-metadata.d.ts.map +1 -0
  1606. package/dist/program/source-package-metadata.js +227 -0
  1607. package/dist/program/source-package-metadata.js.map +1 -0
  1608. package/dist/program/tsbindgen-instance-receiver-substitution.test.d.ts +2 -0
  1609. package/dist/program/tsbindgen-instance-receiver-substitution.test.d.ts.map +1 -0
  1610. package/dist/program/tsbindgen-instance-receiver-substitution.test.js +194 -0
  1611. package/dist/program/tsbindgen-instance-receiver-substitution.test.js.map +1 -0
  1612. package/dist/program/types.d.ts +3 -2
  1613. package/dist/program/types.d.ts.map +1 -1
  1614. package/dist/program/xunit-equal-overload-resolution.test.d.ts +2 -0
  1615. package/dist/program/xunit-equal-overload-resolution.test.d.ts.map +1 -0
  1616. package/dist/program/xunit-equal-overload-resolution.test.js +205 -0
  1617. package/dist/program/xunit-equal-overload-resolution.test.js.map +1 -0
  1618. package/dist/program.d.ts +1 -1
  1619. package/dist/program.d.ts.map +1 -1
  1620. package/dist/resolver/clr-bindings-package-resolution.d.ts +28 -0
  1621. package/dist/resolver/clr-bindings-package-resolution.d.ts.map +1 -0
  1622. package/dist/resolver/clr-bindings-package-resolution.js +120 -0
  1623. package/dist/resolver/clr-bindings-package-resolution.js.map +1 -0
  1624. package/dist/resolver/clr-bindings-resolve-logic.d.ts +40 -0
  1625. package/dist/resolver/clr-bindings-resolve-logic.d.ts.map +1 -0
  1626. package/dist/resolver/clr-bindings-resolve-logic.js +192 -0
  1627. package/dist/resolver/clr-bindings-resolve-logic.js.map +1 -0
  1628. package/dist/resolver/clr-bindings-resolver.d.ts +9 -69
  1629. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  1630. package/dist/resolver/clr-bindings-resolver.js +4 -436
  1631. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  1632. package/dist/resolver/import-resolution.d.ts +3 -0
  1633. package/dist/resolver/import-resolution.d.ts.map +1 -1
  1634. package/dist/resolver/import-resolution.js +120 -33
  1635. package/dist/resolver/import-resolution.js.map +1 -1
  1636. package/dist/resolver/source-package-resolution.d.ts +18 -0
  1637. package/dist/resolver/source-package-resolution.d.ts.map +1 -1
  1638. package/dist/resolver/source-package-resolution.js +141 -14
  1639. package/dist/resolver/source-package-resolution.js.map +1 -1
  1640. package/dist/resolver/source-package-resolution.test.js +27 -52
  1641. package/dist/resolver/source-package-resolution.test.js.map +1 -1
  1642. package/dist/resolver-cases/namespace-and-classname.test.d.ts +5 -0
  1643. package/dist/resolver-cases/namespace-and-classname.test.d.ts.map +1 -0
  1644. package/dist/resolver-cases/namespace-and-classname.test.js +32 -0
  1645. package/dist/resolver-cases/namespace-and-classname.test.js.map +1 -0
  1646. package/dist/resolver-cases/resolve-import.test.d.ts +5 -0
  1647. package/dist/resolver-cases/resolve-import.test.d.ts.map +1 -0
  1648. package/dist/resolver-cases/resolve-import.test.js +460 -0
  1649. package/dist/resolver-cases/resolve-import.test.js.map +1 -0
  1650. package/dist/resolver.test.d.ts +2 -4
  1651. package/dist/resolver.test.d.ts.map +1 -1
  1652. package/dist/resolver.test.js +2 -289
  1653. package/dist/resolver.test.js.map +1 -1
  1654. package/dist/surface/profiles.d.ts +1 -1
  1655. package/dist/surface/profiles.d.ts.map +1 -1
  1656. package/dist/surface/profiles.js +146 -53
  1657. package/dist/surface/profiles.js.map +1 -1
  1658. package/dist/surface/profiles.test.js +97 -108
  1659. package/dist/surface/profiles.test.js.map +1 -1
  1660. package/dist/testing/filesystem-fixtures.d.ts +7 -0
  1661. package/dist/testing/filesystem-fixtures.d.ts.map +1 -0
  1662. package/dist/testing/filesystem-fixtures.js +80 -0
  1663. package/dist/testing/filesystem-fixtures.js.map +1 -0
  1664. package/dist/types/diagnostic.d.ts +1 -1
  1665. package/dist/types/diagnostic.d.ts.map +1 -1
  1666. package/dist/types/diagnostic.js.map +1 -1
  1667. package/dist/validation/contextual-type-analysis.d.ts +12 -0
  1668. package/dist/validation/contextual-type-analysis.d.ts.map +1 -0
  1669. package/dist/validation/contextual-type-analysis.js +11 -0
  1670. package/dist/validation/contextual-type-analysis.js.map +1 -0
  1671. package/dist/validation/contextual-type-checks.d.ts +35 -0
  1672. package/dist/validation/contextual-type-checks.d.ts.map +1 -0
  1673. package/dist/validation/contextual-type-checks.js +214 -0
  1674. package/dist/validation/contextual-type-checks.js.map +1 -0
  1675. package/dist/validation/exports.d.ts.map +1 -1
  1676. package/dist/validation/exports.js +14 -15
  1677. package/dist/validation/exports.js.map +1 -1
  1678. package/dist/validation/features-cases/promise-chaining.test.d.ts +2 -0
  1679. package/dist/validation/features-cases/promise-chaining.test.d.ts.map +1 -0
  1680. package/dist/validation/features-cases/promise-chaining.test.js +113 -0
  1681. package/dist/validation/features-cases/promise-chaining.test.js.map +1 -0
  1682. package/dist/validation/features-cases/test-helpers.d.ts +11 -0
  1683. package/dist/validation/features-cases/test-helpers.d.ts.map +1 -0
  1684. package/dist/validation/features-cases/test-helpers.js +125 -0
  1685. package/dist/validation/features-cases/test-helpers.js.map +1 -0
  1686. package/dist/validation/features-cases/tsn2001-unsupported-syntax.test.d.ts +2 -0
  1687. package/dist/validation/features-cases/tsn2001-unsupported-syntax.test.d.ts.map +1 -0
  1688. package/dist/validation/features-cases/tsn2001-unsupported-syntax.test.js +158 -0
  1689. package/dist/validation/features-cases/tsn2001-unsupported-syntax.test.js.map +1 -0
  1690. package/dist/validation/features-cases/tsn5001-function-length.test.d.ts +2 -0
  1691. package/dist/validation/features-cases/tsn5001-function-length.test.d.ts.map +1 -0
  1692. package/dist/validation/features-cases/tsn5001-function-length.test.js +104 -0
  1693. package/dist/validation/features-cases/tsn5001-function-length.test.js.map +1 -0
  1694. package/dist/validation/features.d.ts.map +1 -1
  1695. package/dist/validation/features.js +223 -0
  1696. package/dist/validation/features.js.map +1 -1
  1697. package/dist/validation/features.test.d.ts +3 -1
  1698. package/dist/validation/features.test.d.ts.map +1 -1
  1699. package/dist/validation/features.test.js +3 -386
  1700. package/dist/validation/features.test.js.map +1 -1
  1701. package/dist/validation/imports.d.ts.map +1 -1
  1702. package/dist/validation/imports.js +37 -3
  1703. package/dist/validation/imports.js.map +1 -1
  1704. package/dist/validation/imports.test.js +45 -9
  1705. package/dist/validation/imports.test.js.map +1 -1
  1706. package/dist/validation/static-safety-arrow-rules.d.ts +11 -0
  1707. package/dist/validation/static-safety-arrow-rules.d.ts.map +1 -0
  1708. package/dist/validation/static-safety-arrow-rules.js +54 -0
  1709. package/dist/validation/static-safety-arrow-rules.js.map +1 -0
  1710. package/dist/validation/static-safety-dictionary-keys.d.ts +10 -0
  1711. package/dist/validation/static-safety-dictionary-keys.d.ts.map +1 -0
  1712. package/dist/validation/static-safety-dictionary-keys.js +32 -0
  1713. package/dist/validation/static-safety-dictionary-keys.js.map +1 -0
  1714. package/dist/validation/static-safety-rules.d.ts +27 -0
  1715. package/dist/validation/static-safety-rules.d.ts.map +1 -0
  1716. package/dist/validation/static-safety-rules.js +231 -0
  1717. package/dist/validation/static-safety-rules.js.map +1 -0
  1718. package/dist/validation/static-safety.d.ts +4 -7
  1719. package/dist/validation/static-safety.d.ts.map +1 -1
  1720. package/dist/validation/static-safety.js +3 -673
  1721. package/dist/validation/static-safety.js.map +1 -1
  1722. package/dist/validation/synthesis-eligibility.d.ts +31 -0
  1723. package/dist/validation/synthesis-eligibility.d.ts.map +1 -0
  1724. package/dist/validation/synthesis-eligibility.js +161 -0
  1725. package/dist/validation/synthesis-eligibility.js.map +1 -0
  1726. package/dist/validator-cases/any-and-object-literals.test.d.ts +10 -0
  1727. package/dist/validator-cases/any-and-object-literals.test.d.ts.map +1 -0
  1728. package/dist/validator-cases/any-and-object-literals.test.js +271 -0
  1729. package/dist/validator-cases/any-and-object-literals.test.js.map +1 -0
  1730. package/dist/validator-cases/generic-validation.test.d.ts +11 -0
  1731. package/dist/validator-cases/generic-validation.test.d.ts.map +1 -0
  1732. package/dist/validator-cases/generic-validation.test.js +282 -0
  1733. package/dist/validator-cases/generic-validation.test.js.map +1 -0
  1734. package/dist/validator-cases/helpers.d.ts +9 -0
  1735. package/dist/validator-cases/helpers.d.ts.map +1 -0
  1736. package/dist/validator-cases/helpers.js +46 -0
  1737. package/dist/validator-cases/helpers.js.map +1 -0
  1738. package/dist/validator-cases/parameters-and-dict-keys.test.d.ts +10 -0
  1739. package/dist/validator-cases/parameters-and-dict-keys.test.d.ts.map +1 -0
  1740. package/dist/validator-cases/parameters-and-dict-keys.test.js +280 -0
  1741. package/dist/validator-cases/parameters-and-dict-keys.test.js.map +1 -0
  1742. package/dist/validator-cases/utility-types.test.d.ts +12 -0
  1743. package/dist/validator-cases/utility-types.test.d.ts.map +1 -0
  1744. package/dist/validator-cases/utility-types.test.js +323 -0
  1745. package/dist/validator-cases/utility-types.test.js.map +1 -0
  1746. package/dist/validator-maximus-cases/array-and-literal-inference.test.d.ts +2 -0
  1747. package/dist/validator-maximus-cases/array-and-literal-inference.test.d.ts.map +1 -0
  1748. package/dist/validator-maximus-cases/array-and-literal-inference.test.js +221 -0
  1749. package/dist/validator-maximus-cases/array-and-literal-inference.test.js.map +1 -0
  1750. package/dist/validator-maximus-cases/deterministic-typing.test.d.ts +2 -0
  1751. package/dist/validator-maximus-cases/deterministic-typing.test.d.ts.map +1 -0
  1752. package/dist/validator-maximus-cases/deterministic-typing.test.js +432 -0
  1753. package/dist/validator-maximus-cases/deterministic-typing.test.js.map +1 -0
  1754. package/dist/validator-maximus-cases/dictionary-and-object-literal.test.d.ts +2 -0
  1755. package/dist/validator-maximus-cases/dictionary-and-object-literal.test.d.ts.map +1 -0
  1756. package/dist/validator-maximus-cases/dictionary-and-object-literal.test.js +273 -0
  1757. package/dist/validator-maximus-cases/dictionary-and-object-literal.test.js.map +1 -0
  1758. package/dist/validator-maximus-cases/feature-gating.test.d.ts +2 -0
  1759. package/dist/validator-maximus-cases/feature-gating.test.d.ts.map +1 -0
  1760. package/dist/validator-maximus-cases/feature-gating.test.js +181 -0
  1761. package/dist/validator-maximus-cases/feature-gating.test.js.map +1 -0
  1762. package/dist/validator-maximus-cases/generic-function-values.test.d.ts +2 -0
  1763. package/dist/validator-maximus-cases/generic-function-values.test.d.ts.map +1 -0
  1764. package/dist/validator-maximus-cases/generic-function-values.test.js +346 -0
  1765. package/dist/validator-maximus-cases/generic-function-values.test.js.map +1 -0
  1766. package/dist/validator-maximus-cases/helpers.d.ts +9 -0
  1767. package/dist/validator-maximus-cases/helpers.d.ts.map +1 -0
  1768. package/dist/validator-maximus-cases/helpers.js +113 -0
  1769. package/dist/validator-maximus-cases/helpers.js.map +1 -0
  1770. package/dist/validator-maximus-cases/type-syntax.test.d.ts +2 -0
  1771. package/dist/validator-maximus-cases/type-syntax.test.d.ts.map +1 -0
  1772. package/dist/validator-maximus-cases/type-syntax.test.js +157 -0
  1773. package/dist/validator-maximus-cases/type-syntax.test.js.map +1 -0
  1774. package/dist/validator.maximus.test.d.ts +6 -1
  1775. package/dist/validator.maximus.test.d.ts.map +1 -1
  1776. package/dist/validator.maximus.test.js +6 -1417
  1777. package/dist/validator.maximus.test.js.map +1 -1
  1778. package/dist/validator.test.d.ts +4 -10
  1779. package/dist/validator.test.d.ts.map +1 -1
  1780. package/dist/validator.test.js +4 -1086
  1781. package/dist/validator.test.js.map +1 -1
  1782. package/package.json +3 -3
@@ -1,3584 +1,28 @@
1
- /**
2
- * Tests for IR Builder
3
- */
4
- import { describe, it } from "mocha";
5
- import { expect } from "chai";
6
- import * as ts from "typescript";
7
- import * as fs from "node:fs";
8
- import * as os from "node:os";
9
- import * as path from "node:path";
10
- import { buildIrModule } from "./builder.js";
11
- import { createProgramContext } from "./program-context.js";
12
- import { createProgram } from "../program/creation.js";
13
- import { DotnetMetadataRegistry } from "../dotnet-metadata.js";
14
- import { BindingRegistry } from "../program/bindings.js";
15
- import { createClrBindingsResolver } from "../resolver/clr-bindings-resolver.js";
16
- import { createBinding } from "./binding/index.js";
17
- describe("IR Builder", () => {
18
- const createTestProgram = (source, fileName = "/test/test.ts") => {
19
- const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
20
- const program = ts.createProgram([fileName], {
21
- target: ts.ScriptTarget.ES2022,
22
- module: ts.ModuleKind.ES2022,
23
- }, {
24
- getSourceFile: (name) => (name === fileName ? sourceFile : undefined),
25
- writeFile: () => { },
26
- getCurrentDirectory: () => "/test",
27
- getDirectories: () => [],
28
- fileExists: () => true,
29
- readFile: () => source,
30
- getCanonicalFileName: (f) => f,
31
- useCaseSensitiveFileNames: () => true,
32
- getNewLine: () => "\n",
33
- getDefaultLibFileName: (_options) => "lib.d.ts",
34
- });
35
- const checker = program.getTypeChecker();
36
- const testProgram = {
37
- program,
38
- checker,
39
- options: {
40
- projectRoot: "/test",
41
- sourceRoot: "/test",
42
- rootNamespace: "TestApp",
43
- strict: true,
44
- },
45
- sourceFiles: [sourceFile],
46
- declarationSourceFiles: [],
47
- metadata: new DotnetMetadataRegistry(),
48
- bindings: new BindingRegistry(),
49
- clrResolver: createClrBindingsResolver("/test"),
50
- binding: createBinding(checker),
51
- };
52
- // Create ProgramContext for the test
53
- const options = { sourceRoot: "/test", rootNamespace: "TestApp" };
54
- const ctx = createProgramContext(testProgram, options);
55
- return { testProgram, ctx, options };
56
- };
57
- const createFilesystemTestProgram = (files, entryRelativePath) => {
58
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-filesystem-"));
59
- for (const [relativePath, contents] of Object.entries(files)) {
60
- const absolutePath = path.join(tempDir, relativePath);
61
- fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
62
- fs.writeFileSync(absolutePath, contents);
63
- }
64
- const rootNames = Object.keys(files)
65
- .filter((relativePath) => /\.(?:ts|mts|cts|d\.ts)$/.test(relativePath))
66
- .map((relativePath) => path.join(tempDir, relativePath));
67
- const tsProgram = ts.createProgram(rootNames, {
68
- target: ts.ScriptTarget.ES2022,
69
- module: ts.ModuleKind.NodeNext,
70
- moduleResolution: ts.ModuleResolutionKind.NodeNext,
71
- strict: true,
72
- noEmit: true,
73
- skipLibCheck: true,
74
- });
75
- const checker = tsProgram.getTypeChecker();
76
- const entryPath = path.join(tempDir, entryRelativePath);
77
- const sourceFile = tsProgram.getSourceFile(entryPath);
78
- if (!sourceFile) {
79
- throw new Error(`Failed to create source file for ${entryRelativePath}`);
80
- }
81
- const testProgram = {
82
- program: tsProgram,
83
- checker,
84
- options: {
85
- projectRoot: tempDir,
86
- sourceRoot: path.join(tempDir, "src"),
87
- rootNamespace: "TestApp",
88
- strict: true,
89
- },
90
- sourceFiles: rootNames
91
- .filter((filePath) => !filePath.endsWith(".d.ts"))
92
- .map((filePath) => tsProgram.getSourceFile(filePath))
93
- .filter((candidate) => candidate !== undefined),
94
- declarationSourceFiles: rootNames
95
- .filter((filePath) => filePath.endsWith(".d.ts"))
96
- .map((filePath) => tsProgram.getSourceFile(filePath))
97
- .filter((candidate) => candidate !== undefined),
98
- metadata: new DotnetMetadataRegistry(),
99
- bindings: new BindingRegistry(),
100
- clrResolver: createClrBindingsResolver(tempDir),
101
- binding: createBinding(checker),
102
- };
103
- const options = {
104
- sourceRoot: path.join(tempDir, "src"),
105
- rootNamespace: "TestApp",
106
- };
107
- const ctx = createProgramContext(testProgram, options);
108
- return {
109
- tempDir,
110
- sourceFile,
111
- testProgram,
112
- ctx,
113
- options,
114
- cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
115
- };
116
- };
117
- describe("Module Structure", () => {
118
- it("should create IR module with correct namespace and class name", () => {
119
- const source = `
120
- export function greet(name: string): string {
121
- return \`Hello \${name}\`;
122
- }
123
- `;
124
- const { testProgram, ctx, options } = createTestProgram(source);
125
- const sourceFile = testProgram.sourceFiles[0];
126
- if (!sourceFile)
127
- throw new Error("Failed to create source file");
128
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
129
- expect(result.ok).to.equal(true);
130
- if (result.ok) {
131
- const module = result.value;
132
- expect(module.kind).to.equal("module");
133
- expect(module.namespace).to.equal("TestApp");
134
- expect(module.className).to.equal("test");
135
- expect(module.isStaticContainer).to.equal(true);
136
- }
137
- });
138
- it("should detect top-level code", () => {
139
- const source = `
140
- console.log("Hello");
141
- export const x = 42;
142
- `;
143
- const { testProgram, ctx, options } = createTestProgram(source);
144
- const sourceFile = testProgram.sourceFiles[0];
145
- if (!sourceFile)
146
- throw new Error("Failed to create source file");
147
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
148
- expect(result.ok).to.equal(true);
149
- if (result.ok) {
150
- expect(result.value.isStaticContainer).to.equal(false);
151
- }
152
- });
153
- });
154
- describe("Promise callback typing", () => {
155
- it("should not poison Promise.then callbacks to void before generic resolution settles", () => {
156
- const source = `
157
- declare class Promise<T> {
158
- then<TResult1 = T, TResult2 = never>(
159
- onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
160
- onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
161
- ): Promise<TResult1 | TResult2>;
162
- }
163
-
164
- interface PromiseLike<T> {
165
- then<TResult1 = T, TResult2 = never>(
166
- onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
167
- onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
168
- ): PromiseLike<TResult1 | TResult2>;
169
- }
170
-
171
- export function chainScore(seed: Promise<number>): Promise<number> {
172
- return seed.then((value) => value + 1);
173
- }
174
- `;
175
- const { testProgram, ctx, options } = createTestProgram(source);
176
- const sourceFile = testProgram.sourceFiles[0];
177
- if (!sourceFile)
178
- throw new Error("Failed to create source file");
179
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
180
- expect(result.ok).to.equal(true);
181
- if (!result.ok)
182
- return;
183
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "chainScore");
184
- expect(fn).to.not.equal(undefined);
185
- if (!fn)
186
- return;
187
- const returnStmt = fn.body.statements[0];
188
- expect(returnStmt?.kind).to.equal("returnStatement");
189
- if (!returnStmt || returnStmt.kind !== "returnStatement")
190
- return;
191
- const call = returnStmt.expression;
192
- expect(call?.kind).to.equal("call");
193
- if (!call || call.kind !== "call")
194
- return;
195
- const callback = call.arguments[0];
196
- expect(callback?.kind).to.equal("arrowFunction");
197
- if (!callback || callback.kind !== "arrowFunction")
198
- return;
199
- expect(callback.parameters[0]?.type).to.deep.equal({
200
- kind: "primitiveType",
201
- name: "number",
202
- });
203
- expect(callback.inferredType).to.deep.equal({
204
- kind: "functionType",
205
- parameters: callback.parameters,
206
- returnType: {
207
- kind: "primitiveType",
208
- name: "number",
209
- },
210
- });
211
- });
212
- it("infers Promise constructor generic from contextual return type", () => {
213
- const source = `
214
- declare function setTimeout(fn: () => void, ms: number): void;
215
-
216
- declare class PromiseLike<T> {
217
- then<TResult1 = T, TResult2 = never>(
218
- onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
219
- onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null
220
- ): PromiseLike<TResult1 | TResult2>;
221
- }
222
-
223
- declare class Promise<T> {
224
- constructor(
225
- executor: (
226
- resolve: (value: T | PromiseLike<T>) => void,
227
- reject: (reason: unknown) => void
228
- ) => void
229
- );
230
- }
231
-
232
- export function delay(ms: number): Promise<void> {
233
- return new Promise((resolve) => {
234
- setTimeout(() => resolve(), ms);
235
- });
236
- }
237
- `;
238
- const { testProgram, ctx, options } = createTestProgram(source);
239
- const sourceFile = testProgram.sourceFiles[0];
240
- if (!sourceFile)
241
- throw new Error("Failed to create source file");
242
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
243
- expect(result.ok).to.equal(true);
244
- if (!result.ok)
245
- return;
246
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "delay");
247
- expect(fn).to.not.equal(undefined);
248
- if (!fn)
249
- return;
250
- const returnStmt = fn.body.statements[0];
251
- expect(returnStmt?.kind).to.equal("returnStatement");
252
- if (!returnStmt || returnStmt.kind !== "returnStatement")
253
- return;
254
- const ctor = returnStmt.expression;
255
- expect(ctor?.kind).to.equal("new");
256
- if (!ctor || ctor.kind !== "new")
257
- return;
258
- expect(ctor.inferredType).to.deep.equal({
259
- kind: "referenceType",
260
- name: "Promise",
261
- typeArguments: [{ kind: "voidType" }],
262
- });
263
- const executor = ctor.arguments[0];
264
- expect(executor?.kind).to.equal("arrowFunction");
265
- if (!executor || executor.kind !== "arrowFunction")
266
- return;
267
- expect(executor.parameters[0]?.type).to.not.equal(undefined);
268
- expect(executor.parameters[0]?.type?.kind).to.equal("functionType");
269
- });
270
- it("infers Promise.all element type from async wrapper array arguments", () => {
271
- const source = `
272
- interface PromiseLike<T> {
273
- then<TResult1 = T, TResult2 = never>(
274
- onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
275
- onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null
276
- ): PromiseLike<TResult1 | TResult2>;
277
- }
278
-
279
- declare class Promise<T> {
280
- static all<T>(values: readonly (T | PromiseLike<T>)[]): Promise<T[]>;
281
- }
282
-
283
- async function runWorker(name: string): Promise<number> {
284
- return 1;
285
- }
286
-
287
- export async function main(): Promise<void> {
288
- const results = await Promise.all([
289
- runWorker("a"),
290
- runWorker("b"),
291
- runWorker("c"),
292
- ]);
293
- void results;
294
- }
295
- `;
296
- const { testProgram, ctx, options } = createTestProgram(source);
297
- const sourceFile = testProgram.sourceFiles[0];
298
- if (!sourceFile)
299
- throw new Error("Failed to create source file");
300
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
301
- expect(result.ok).to.equal(true);
302
- if (!result.ok)
303
- return;
304
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "main");
305
- expect(fn).to.not.equal(undefined);
306
- if (!fn)
307
- return;
308
- const decl = fn.body.statements[0];
309
- expect(decl?.kind).to.equal("variableDeclaration");
310
- if (!decl || decl.kind !== "variableDeclaration")
311
- return;
312
- const initializer = decl.declarations[0]?.initializer;
313
- expect(initializer?.kind).to.equal("await");
314
- if (!initializer || initializer.kind !== "await")
315
- return;
316
- const call = initializer.expression;
317
- expect(call?.kind).to.equal("call");
318
- if (!call || call.kind !== "call")
319
- return;
320
- expect(call.inferredType).to.deep.include({
321
- kind: "referenceType",
322
- name: "Promise",
323
- typeArguments: [
324
- {
325
- kind: "arrayType",
326
- elementType: {
327
- kind: "primitiveType",
328
- name: "number",
329
- },
330
- origin: "explicit",
331
- },
332
- ],
333
- });
334
- expect(initializer.inferredType).to.deep.equal({
335
- kind: "arrayType",
336
- elementType: {
337
- kind: "primitiveType",
338
- name: "number",
339
- },
340
- origin: "explicit",
341
- });
342
- });
343
- it("preserves generic receiver substitutions for js-surface method calls", () => {
344
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-map-keys-"));
345
- try {
346
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
347
- const srcDir = path.join(tempDir, "src");
348
- fs.mkdirSync(srcDir, { recursive: true });
349
- const entryPath = path.join(srcDir, "index.ts");
350
- fs.writeFileSync(entryPath, [
351
- "const counts = new Map<string, number>();",
352
- 'counts.set("alpha", 1);',
353
- "export const keys = Array.from(counts.keys());",
354
- ].join("\n"));
355
- const programResult = createProgram([entryPath], {
356
- projectRoot: tempDir,
357
- sourceRoot: srcDir,
358
- rootNamespace: "TestApp",
359
- surface: "@tsonic/js",
360
- });
361
- expect(programResult.ok).to.equal(true);
362
- if (!programResult.ok)
363
- return;
364
- const program = programResult.value;
365
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
366
- expect(sourceFile).to.not.equal(undefined);
367
- if (!sourceFile)
368
- return;
369
- const ctx = createProgramContext(program, {
370
- sourceRoot: srcDir,
371
- rootNamespace: "TestApp",
372
- });
373
- const moduleResult = buildIrModule(sourceFile, program, {
374
- sourceRoot: srcDir,
375
- rootNamespace: "TestApp",
376
- }, ctx);
377
- expect(moduleResult.ok).to.equal(true);
378
- if (!moduleResult.ok)
379
- return;
380
- const keysDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
381
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
382
- stmt.declarations[0]?.name.name === "keys");
383
- expect(keysDecl).to.not.equal(undefined);
384
- if (!keysDecl)
385
- return;
386
- const initializer = keysDecl.declarations[0]?.initializer;
387
- expect(initializer?.kind).to.equal("call");
388
- if (!initializer || initializer.kind !== "call")
389
- return;
390
- expect(initializer.inferredType).to.deep.equal({
391
- kind: "arrayType",
392
- elementType: { kind: "primitiveType", name: "string" },
393
- origin: "explicit",
394
- });
395
- const keysCall = initializer.arguments[0];
396
- expect(keysCall?.kind).to.equal("call");
397
- if (!keysCall || keysCall.kind !== "call")
398
- return;
399
- expect(keysCall.inferredType?.kind).to.equal("referenceType");
400
- if (keysCall.inferredType?.kind !== "referenceType")
401
- return;
402
- expect(["Iterable", "IEnumerable_1"]).to.include(keysCall.inferredType.name);
403
- expect(keysCall.inferredType.typeArguments).to.deep.equal([
404
- { kind: "primitiveType", name: "string" },
405
- ]);
406
- const callee = keysCall.callee;
407
- expect(callee.kind).to.equal("memberAccess");
408
- if (callee.kind !== "memberAccess")
409
- return;
410
- expect(callee.inferredType?.kind).to.equal("functionType");
411
- if (callee.inferredType?.kind !== "functionType")
412
- return;
413
- expect(callee.inferredType.parameters).to.deep.equal([]);
414
- expect(callee.inferredType.returnType.kind).to.equal("referenceType");
415
- if (callee.inferredType.returnType.kind !== "referenceType")
416
- return;
417
- expect(["Iterable", "IEnumerable_1"]).to.include(callee.inferredType.returnType.name);
418
- if (callee.inferredType.returnType.typeArguments) {
419
- expect(callee.inferredType.returnType.typeArguments).to.deep.equal([
420
- { kind: "primitiveType", name: "string" },
421
- ]);
422
- }
423
- }
424
- finally {
425
- fs.rmSync(tempDir, { recursive: true, force: true });
426
- }
427
- });
428
- it("preserves imported root-namespace member types across package internals", function () {
429
- this.timeout(30000);
430
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-node-date-"));
431
- try {
432
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
433
- const srcDir = path.join(tempDir, "src");
434
- fs.mkdirSync(srcDir, { recursive: true });
435
- const jsRoot = path.join(tempDir, "node_modules/@tsonic/js-temp");
436
- fs.mkdirSync(path.join(jsRoot, "index", "internal"), {
437
- recursive: true,
438
- });
439
- fs.writeFileSync(path.join(jsRoot, "package.json"), JSON.stringify({ name: "@tsonic/js-temp", version: "0.0.0", type: "module" }, null, 2));
440
- fs.writeFileSync(path.join(jsRoot, "index", "bindings.json"), JSON.stringify({ namespace: "Acme.JsRuntime", types: [] }, null, 2));
441
- fs.writeFileSync(path.join(jsRoot, "index.js"), "export {};\n");
442
- fs.writeFileSync(path.join(jsRoot, "index", "internal", "index.d.ts"), [
443
- "export interface Date$instance {",
444
- " toISOString(): string;",
445
- "}",
446
- "export type Date = Date$instance;",
447
- ].join("\n"));
448
- const nodeRoot = path.join(tempDir, "node_modules/@tsonic/node-temp");
449
- fs.mkdirSync(path.join(nodeRoot, "index", "internal"), {
450
- recursive: true,
451
- });
452
- fs.writeFileSync(path.join(nodeRoot, "package.json"), JSON.stringify({ name: "@tsonic/node-temp", version: "0.0.0", type: "module" }, null, 2));
453
- fs.writeFileSync(path.join(nodeRoot, "index", "bindings.json"), JSON.stringify({ namespace: "acme.node", types: [] }, null, 2));
454
- fs.writeFileSync(path.join(nodeRoot, "index.js"), "export {};\n");
455
- fs.writeFileSync(path.join(nodeRoot, "index", "internal", "index.d.ts"), [
456
- 'import type { Date } from "@tsonic/js-temp/Acme.JsRuntime/internal/index.js";',
457
- "export interface Stats$instance {",
458
- " mtime: Date;",
459
- "}",
460
- "export type Stats = Stats$instance;",
461
- ].join("\n"));
462
- fs.writeFileSync(path.join(nodeRoot, "index.d.ts"), [
463
- 'import type { Stats } from "./index/internal/index.js";',
464
- 'declare module "node:fs" {',
465
- " export const statSync: (path: string) => Stats;",
466
- "}",
467
- "export {};",
468
- ].join("\n"));
469
- const entryPath = path.join(srcDir, "index.ts");
470
- fs.writeFileSync(entryPath, [
471
- 'import { statSync } from "node:fs";',
472
- "const maybeDate: Date | undefined = undefined;",
473
- 'export const resolved = maybeDate ?? statSync("package.json").mtime;',
474
- "export const iso = resolved.toISOString();",
475
- ].join("\n"));
476
- const programResult = createProgram([entryPath], {
477
- projectRoot: tempDir,
478
- sourceRoot: srcDir,
479
- rootNamespace: "TestApp",
480
- useStandardLib: true,
481
- typeRoots: [
482
- "node_modules/@tsonic/node-temp",
483
- "node_modules/@tsonic/js-temp",
484
- ],
485
- });
486
- expect(programResult.ok).to.equal(true);
487
- if (!programResult.ok)
488
- return;
489
- const program = programResult.value;
490
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
491
- expect(sourceFile).to.not.equal(undefined);
492
- if (!sourceFile)
493
- return;
494
- const ctx = createProgramContext(program, {
495
- sourceRoot: srcDir,
496
- rootNamespace: "TestApp",
497
- });
498
- const moduleResult = buildIrModule(sourceFile, program, {
499
- sourceRoot: srcDir,
500
- rootNamespace: "TestApp",
501
- }, ctx);
502
- expect(moduleResult.ok).to.equal(true);
503
- if (!moduleResult.ok)
504
- return;
505
- const resolvedDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
506
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
507
- stmt.declarations[0]?.name.name === "resolved");
508
- expect(resolvedDecl).to.not.equal(undefined);
509
- if (!resolvedDecl)
510
- return;
511
- const resolvedType = resolvedDecl.declarations[0]?.type;
512
- expect(resolvedType).to.not.equal(undefined);
513
- expect(resolvedType?.kind).to.not.equal("unknownType");
514
- if (resolvedType?.kind === "referenceType") {
515
- expect(["Date", "Date$instance"]).to.include(resolvedType.name);
516
- }
517
- if (resolvedType?.kind === "unionType") {
518
- const memberNames = resolvedType.types
519
- .filter((type) => !!type && type.kind === "referenceType")
520
- .map((type) => type.name);
521
- expect(memberNames).to.include("Date");
522
- expect(memberNames).to.include("Date$instance");
523
- }
524
- const isoDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
525
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
526
- stmt.declarations[0]?.name.name === "iso");
527
- expect(isoDecl).to.not.equal(undefined);
528
- if (!isoDecl)
529
- return;
530
- expect(isoDecl.declarations[0]?.type).to.deep.equal({
531
- kind: "primitiveType",
532
- name: "string",
533
- });
534
- }
535
- finally {
536
- fs.rmSync(tempDir, { recursive: true, force: true });
537
- }
538
- });
539
- it("preserves canonical CLR identity for array elements from source-binding declarations", function () {
540
- this.timeout(30000);
541
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-source-array-identity-"));
542
- try {
543
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
544
- const srcDir = path.join(tempDir, "src");
545
- fs.mkdirSync(srcDir, { recursive: true });
546
- const bindingsRoot = path.join(tempDir, "tsonic", "bindings");
547
- fs.mkdirSync(path.join(bindingsRoot, "Acme.Core", "internal"), {
548
- recursive: true,
549
- });
550
- fs.writeFileSync(path.join(bindingsRoot, "Acme.Core", "internal", "index.d.ts"), [
551
- "export interface Attachment$instance {",
552
- ' readonly "__tsonic_binding_alias_Acme.Core.Attachment"?: never;',
553
- " readonly __tsonic_type_Acme_Core_Attachment?: never;",
554
- " Id: string;",
555
- "}",
556
- "export type Attachment = Attachment$instance;",
557
- ].join("\n"));
558
- fs.writeFileSync(path.join(bindingsRoot, "Acme.Core.d.ts"), [
559
- 'import type { Attachment } from "./Acme.Core/internal/index.js";',
560
- "export declare function getAttachments(): Attachment[];",
561
- ].join("\n"));
562
- const entryPath = path.join(srcDir, "index.ts");
563
- fs.writeFileSync(entryPath, [
564
- 'import { getAttachments } from "../tsonic/bindings/Acme.Core.js";',
565
- "const attachments = getAttachments();",
566
- "export const attachmentCount = attachments.length;",
567
- ].join("\n"));
568
- const programResult = createProgram([entryPath], {
569
- projectRoot: tempDir,
570
- sourceRoot: srcDir,
571
- rootNamespace: "TestApp",
572
- useStandardLib: true,
573
- });
574
- expect(programResult.ok).to.equal(true);
575
- if (!programResult.ok)
576
- return;
577
- const program = programResult.value;
578
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
579
- expect(sourceFile).to.not.equal(undefined);
580
- if (!sourceFile)
581
- return;
582
- const ctx = createProgramContext(program, {
583
- sourceRoot: srcDir,
584
- rootNamespace: "TestApp",
585
- });
586
- const moduleResult = buildIrModule(sourceFile, program, {
587
- sourceRoot: srcDir,
588
- rootNamespace: "TestApp",
589
- }, ctx);
590
- expect(moduleResult.ok).to.equal(true);
591
- if (!moduleResult.ok)
592
- return;
593
- const attachmentsDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
594
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
595
- stmt.declarations[0]?.name.name === "attachments");
596
- expect(attachmentsDecl).to.not.equal(undefined);
597
- if (!attachmentsDecl)
598
- return;
599
- const attachmentsType = attachmentsDecl.declarations[0]?.type;
600
- expect(attachmentsType?.kind).to.equal("arrayType");
601
- if (!attachmentsType || attachmentsType.kind !== "arrayType")
602
- return;
603
- expect(attachmentsType.elementType.kind).to.equal("referenceType");
604
- if (attachmentsType.elementType.kind !== "referenceType")
605
- return;
606
- expect(attachmentsType.elementType.name).to.equal("Acme.Core.Attachment");
607
- expect(attachmentsType.elementType.resolvedClrType).to.equal("Acme.Core.Attachment");
608
- }
609
- finally {
610
- fs.rmSync(tempDir, { recursive: true, force: true });
611
- }
612
- });
613
- it("preserves CLR identity for generic structural aliases from source-binding declarations", function () {
614
- this.timeout(30000);
615
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-source-generic-alias-"));
616
- try {
617
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
618
- const srcDir = path.join(tempDir, "src");
619
- fs.mkdirSync(srcDir, { recursive: true });
620
- const bindingsRoot = path.join(tempDir, "tsonic", "bindings");
621
- fs.mkdirSync(path.join(bindingsRoot, "Acme.Core", "internal"), {
622
- recursive: true,
623
- });
624
- fs.writeFileSync(path.join(bindingsRoot, "Acme.Core", "bindings.json"), JSON.stringify({
625
- namespace: "Acme.Core",
626
- types: [
627
- {
628
- clrName: "Acme.Core.Ok__Alias`1",
629
- assemblyName: "Acme.Core",
630
- methods: [],
631
- properties: [],
632
- fields: [],
633
- },
634
- ],
635
- }, null, 2));
636
- fs.writeFileSync(path.join(bindingsRoot, "Acme.Core", "internal", "index.d.ts"), [
637
- "export interface Ok__Alias_1$instance<T> {",
638
- ' readonly "__tsonic_binding_alias_Acme.Core.Ok__Alias_1"?: never;',
639
- " readonly value: T;",
640
- "}",
641
- "export type Ok__Alias_1<T> = Ok__Alias_1$instance<T>;",
642
- ].join("\n"));
643
- fs.writeFileSync(path.join(bindingsRoot, "Acme.Core.d.ts"), [
644
- 'import type { Ok__Alias_1 } from "./Acme.Core/internal/index.js";',
645
- "export type Ok<T> = Ok__Alias_1<T>;",
646
- ].join("\n"));
647
- const entryPath = path.join(srcDir, "index.ts");
648
- fs.writeFileSync(entryPath, [
649
- 'import type { Ok } from "../tsonic/bindings/Acme.Core.js";',
650
- "export const value: Ok<string> | undefined = undefined;",
651
- ].join("\n"));
652
- const programResult = createProgram([entryPath], {
653
- projectRoot: tempDir,
654
- sourceRoot: srcDir,
655
- rootNamespace: "TestApp",
656
- useStandardLib: true,
657
- });
658
- expect(programResult.ok).to.equal(true);
659
- if (!programResult.ok)
660
- return;
661
- const program = programResult.value;
662
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
663
- expect(sourceFile).to.not.equal(undefined);
664
- if (!sourceFile)
665
- return;
666
- const ctx = createProgramContext(program, {
667
- sourceRoot: srcDir,
668
- rootNamespace: "TestApp",
669
- });
670
- const moduleResult = buildIrModule(sourceFile, program, {
671
- sourceRoot: srcDir,
672
- rootNamespace: "TestApp",
673
- }, ctx);
674
- expect(moduleResult.ok).to.equal(true);
675
- if (!moduleResult.ok)
676
- return;
677
- const valueDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
678
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
679
- stmt.declarations[0]?.name.name === "value");
680
- expect(valueDecl).to.not.equal(undefined);
681
- if (!valueDecl)
682
- return;
683
- const declaredType = valueDecl.declarations[0]?.type;
684
- expect(declaredType?.kind).to.equal("unionType");
685
- if (!declaredType || declaredType.kind !== "unionType")
686
- return;
687
- const okType = declaredType.types.find((type) => type.kind === "referenceType");
688
- expect(okType).to.not.equal(undefined);
689
- if (!okType || okType.kind !== "referenceType")
690
- return;
691
- expect(okType.name).to.equal("Acme.Core.Ok__Alias_1");
692
- expect(okType.resolvedClrType).to.equal("Acme.Core.Ok__Alias`1");
693
- }
694
- finally {
695
- fs.rmSync(tempDir, { recursive: true, force: true });
696
- }
697
- });
698
- it("narrows typeof checks in js-surface branches to the matching primitive type", () => {
699
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-typeof-narrowing-"));
700
- try {
701
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
702
- const srcDir = path.join(tempDir, "src");
703
- fs.mkdirSync(srcDir, { recursive: true });
704
- const entryPath = path.join(srcDir, "index.ts");
705
- fs.writeFileSync(entryPath, [
706
- "export function main(value: unknown): void {",
707
- ' if (typeof value === "number") {',
708
- " console.log(value.toString());",
709
- ' } else if (typeof value === "string") {',
710
- " console.log(value.toUpperCase());",
711
- " }",
712
- "}",
713
- ].join("\n"));
714
- const programResult = createProgram([entryPath], {
715
- projectRoot: tempDir,
716
- sourceRoot: srcDir,
717
- rootNamespace: "TestApp",
718
- surface: "@tsonic/js",
719
- });
720
- expect(programResult.ok).to.equal(true);
721
- if (!programResult.ok)
722
- return;
723
- const program = programResult.value;
724
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
725
- expect(sourceFile).to.not.equal(undefined);
726
- if (!sourceFile)
727
- return;
728
- const ctx = createProgramContext(program, {
729
- sourceRoot: srcDir,
730
- rootNamespace: "TestApp",
731
- });
732
- const moduleResult = buildIrModule(sourceFile, program, {
733
- sourceRoot: srcDir,
734
- rootNamespace: "TestApp",
735
- }, ctx);
736
- expect(moduleResult.ok).to.equal(true);
737
- if (!moduleResult.ok)
738
- return;
739
- const mainFn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "main");
740
- expect(mainFn).to.not.equal(undefined);
741
- if (!mainFn)
742
- return;
743
- const numberIf = mainFn.body.statements.find((stmt) => stmt.kind === "ifStatement");
744
- expect(numberIf).to.not.equal(undefined);
745
- if (!numberIf)
746
- return;
747
- const numberExprStmt = numberIf.thenStatement.kind === "blockStatement"
748
- ? numberIf.thenStatement.statements[0]
749
- : undefined;
750
- expect(numberExprStmt?.kind).to.equal("expressionStatement");
751
- if (!numberExprStmt ||
752
- numberExprStmt.kind !== "expressionStatement" ||
753
- numberExprStmt.expression.kind !== "call") {
754
- return;
755
- }
756
- const numberToStringCall = numberExprStmt.expression.arguments[0];
757
- expect(numberToStringCall?.kind).to.equal("call");
758
- if (!numberToStringCall || numberToStringCall.kind !== "call")
759
- return;
760
- expect(numberToStringCall.callee.kind).to.equal("memberAccess");
761
- if (numberToStringCall.callee.kind !== "memberAccess")
762
- return;
763
- expect(numberToStringCall.callee.object.inferredType).to.deep.equal({
764
- kind: "primitiveType",
765
- name: "number",
766
- });
767
- const stringIf = numberIf.elseStatement?.kind === "ifStatement"
768
- ? numberIf.elseStatement
769
- : undefined;
770
- expect(stringIf).to.not.equal(undefined);
771
- if (!stringIf)
772
- return;
773
- const stringExprStmt = stringIf.thenStatement.kind === "blockStatement"
774
- ? stringIf.thenStatement.statements[0]
775
- : undefined;
776
- expect(stringExprStmt?.kind).to.equal("expressionStatement");
777
- if (!stringExprStmt ||
778
- stringExprStmt.kind !== "expressionStatement" ||
779
- stringExprStmt.expression.kind !== "call") {
780
- return;
781
- }
782
- const stringCall = stringExprStmt.expression.arguments[0];
783
- expect(stringCall?.kind).to.equal("call");
784
- if (!stringCall || stringCall.kind !== "call")
785
- return;
786
- expect(stringCall.callee.kind).to.equal("memberAccess");
787
- if (stringCall.callee.kind !== "memberAccess")
788
- return;
789
- expect(stringCall.callee.object.inferredType).to.deep.equal({
790
- kind: "primitiveType",
791
- name: "string",
792
- });
793
- }
794
- finally {
795
- fs.rmSync(tempDir, { recursive: true, force: true });
796
- }
797
- });
798
- });
799
- describe("Core intrinsic provenance", () => {
800
- const expectVariableInitializerKind = (source, variableName, expectedKind) => {
801
- const { testProgram, ctx, options } = createTestProgram(source);
802
- const sourceFile = testProgram.sourceFiles[0];
803
- if (!sourceFile)
804
- throw new Error("Failed to create source file");
805
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
806
- expect(result.ok).to.equal(true);
807
- if (!result.ok)
808
- return;
809
- const variableStmt = result.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
810
- stmt.declarations.some((decl) => decl.name.kind === "identifierPattern" &&
811
- decl.name.name === variableName));
812
- expect(variableStmt).to.not.equal(undefined);
813
- if (!variableStmt)
814
- return;
815
- const declaration = variableStmt.declarations.find((decl) => decl.name.kind === "identifierPattern" &&
816
- decl.name.name === variableName);
817
- expect(declaration?.initializer?.kind).to.equal(expectedKind);
818
- };
819
- it("does not lower locally declared nameof as the compiler intrinsic", () => {
820
- expectVariableInitializerKind(`
821
- function nameof(value: string): string {
822
- return value + "!";
823
- }
824
-
825
- export const label = nameof("x");
826
- `, "label", "call");
827
- });
828
- it("does not lower locally declared sizeof as the compiler intrinsic", () => {
829
- expectVariableInitializerKind(`
830
- function sizeof<T>(): number {
831
- return 4;
832
- }
833
-
834
- export const bytes = sizeof<number>();
835
- `, "bytes", "call");
836
- });
837
- it("does not lower locally declared defaultof/trycast/stackalloc/asinterface intrinsics", () => {
838
- const source = `
839
- function defaultof<T>(): T | undefined {
840
- return undefined;
841
- }
842
- function trycast<T>(value: unknown): T | undefined {
843
- return value as T | undefined;
844
- }
845
- function stackalloc<T>(size: number): T {
846
- throw new Error(String(size));
847
- }
848
- function asinterface<T>(value: unknown): T {
849
- return value as T;
850
- }
851
-
852
- interface Box { value: number; }
853
-
854
- export const fallback = defaultof<number>();
855
- export const maybe = trycast<Box>({ value: 1 });
856
- export const mem = stackalloc<number>(16);
857
- export const view = asinterface<Box>({ value: 1 });
858
- `;
859
- for (const variableName of ["fallback", "maybe", "mem", "view"]) {
860
- expectVariableInitializerKind(source, variableName, "call");
861
- }
862
- });
863
- });
864
- describe("Import Extraction", () => {
865
- it("should extract local imports", () => {
866
- const source = `
867
- import { User } from "./models/User.ts";
868
- import * as utils from "./utils.ts";
869
- `;
870
- const { testProgram, ctx, options } = createTestProgram(source);
871
- const sourceFile = testProgram.sourceFiles[0];
872
- if (!sourceFile)
873
- throw new Error("Failed to create source file");
874
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
875
- expect(result.ok).to.equal(true);
876
- if (result.ok) {
877
- const imports = result.value.imports;
878
- expect(imports).to.have.length(2);
879
- const firstImport = imports[0];
880
- const secondImport = imports[1];
881
- if (!firstImport || !secondImport)
882
- throw new Error("Missing imports");
883
- expect(firstImport.source).to.equal("./models/User.ts");
884
- expect(firstImport.isLocal).to.equal(true);
885
- expect(firstImport.isClr).to.equal(false);
886
- expect(secondImport.source).to.equal("./utils.ts");
887
- const firstSpec = secondImport.specifiers[0];
888
- if (!firstSpec)
889
- throw new Error("Missing specifier");
890
- expect(firstSpec.kind).to.equal("namespace");
891
- }
892
- });
893
- it("should attach resolvedClrValue for tsbindgen flattened named exports", () => {
894
- const source = `
895
- import { buildSite } from "@demo/pkg/Demo.js";
896
- `;
897
- const { testProgram, ctx, options } = createTestProgram(source);
898
- // Stub CLR resolution for this unit test (no filesystem / node resolution).
899
- ctx.clrResolver = {
900
- resolve: (s) => s === "@demo/pkg/Demo.js"
901
- ? {
902
- isClr: true,
903
- packageName: "@demo/pkg",
904
- resolvedNamespace: "Demo",
905
- bindingsPath: "/x/bindings.json",
906
- assembly: "Demo",
907
- }
908
- : { isClr: false },
909
- };
910
- // Provide a minimal tsbindgen bindings.json excerpt with exports.
911
- ctx.bindings.addBindings("/x/bindings.json", {
912
- namespace: "Demo",
913
- types: [],
914
- exports: {
915
- buildSite: {
916
- kind: "method",
917
- clrName: "buildSite",
918
- declaringClrType: "Demo.BuildSite",
919
- declaringAssemblyName: "Demo",
920
- },
921
- },
922
- });
923
- const sourceFile = testProgram.sourceFiles[0];
924
- if (!sourceFile)
925
- throw new Error("Failed to create source file");
926
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
927
- expect(result.ok).to.equal(true);
928
- if (!result.ok)
929
- return;
930
- const imp = result.value.imports[0];
931
- if (!imp)
932
- throw new Error("Missing imports");
933
- expect(imp.isClr).to.equal(true);
934
- expect(imp.resolvedNamespace).to.equal("Demo");
935
- const spec = imp.specifiers[0];
936
- if (!spec || spec.kind !== "named")
937
- throw new Error("Missing named specifier");
938
- expect(spec.name).to.equal("buildSite");
939
- expect(spec.isType).to.not.equal(true);
940
- expect(spec.resolvedClrValue).to.deep.equal({
941
- declaringClrType: "Demo.BuildSite",
942
- declaringAssemblyName: "Demo",
943
- memberName: "buildSite",
944
- });
945
- });
946
- it("should attach resolvedClrType for CLR type imports used as values", () => {
947
- const source = `
948
- import { Task as TaskValue } from "@tsonic/dotnet/System.Threading.Tasks.js";
949
- `;
950
- const { testProgram, ctx, options } = createTestProgram(source);
951
- ctx.clrResolver = {
952
- resolve: (s) => s === "@tsonic/dotnet/System.Threading.Tasks.js"
953
- ? {
954
- isClr: true,
955
- packageName: "@tsonic/dotnet",
956
- resolvedNamespace: "System.Threading.Tasks",
957
- bindingsPath: "/x/tasks.bindings.json",
958
- assembly: "System.Runtime",
959
- }
960
- : { isClr: false },
961
- };
962
- ctx.bindings.addBindings("/x/tasks.bindings.json", {
963
- namespace: "System.Threading.Tasks",
964
- types: [
965
- {
966
- alias: "Task",
967
- clrName: "System.Threading.Tasks.Task",
968
- assemblyName: "System.Runtime",
969
- kind: "Class",
970
- methods: [],
971
- properties: [],
972
- fields: [],
973
- },
974
- ],
975
- exports: {},
976
- });
977
- const sourceFile = testProgram.sourceFiles[0];
978
- if (!sourceFile)
979
- throw new Error("Failed to create source file");
980
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
981
- expect(result.ok).to.equal(true);
982
- if (!result.ok)
983
- return;
984
- const imp = result.value.imports[0];
985
- if (!imp)
986
- throw new Error("Missing imports");
987
- const spec = imp.specifiers[0];
988
- if (!spec || spec.kind !== "named") {
989
- throw new Error("Missing named specifier");
990
- }
991
- expect(spec.name).to.equal("Task");
992
- expect(spec.localName).to.equal("TaskValue");
993
- expect(spec.isType).to.not.equal(true);
994
- expect(spec.resolvedClrType).to.equal("System.Threading.Tasks.Task");
995
- expect(spec.resolvedClrValue).to.equal(undefined);
996
- });
997
- it("should error if a CLR namespace value import lacks tsbindgen exports mapping", () => {
998
- const source = `
999
- import { buildSite } from "@demo/pkg/Demo.js";
1000
- `;
1001
- const { testProgram, ctx, options } = createTestProgram(source);
1002
- // Stub CLR resolution for this unit test (no filesystem / node resolution).
1003
- ctx.clrResolver = {
1004
- resolve: (s) => s === "@demo/pkg/Demo.js"
1005
- ? {
1006
- isClr: true,
1007
- packageName: "@demo/pkg",
1008
- resolvedNamespace: "Demo",
1009
- bindingsPath: "/x/bindings.json",
1010
- assembly: "Demo",
1011
- }
1012
- : { isClr: false },
1013
- };
1014
- // Provide a minimal tsbindgen bindings.json excerpt WITHOUT exports.
1015
- ctx.bindings.addBindings("/x/bindings.json", {
1016
- namespace: "Demo",
1017
- types: [],
1018
- });
1019
- const sourceFile = testProgram.sourceFiles[0];
1020
- if (!sourceFile)
1021
- throw new Error("Failed to create source file");
1022
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1023
- expect(result.ok).to.equal(true);
1024
- expect(ctx.diagnostics.some((d) => d.code === "TSN4004")).to.equal(true);
1025
- });
1026
- it("treats node alias named imports as module-bound values without TSN4004", () => {
1027
- const source = `
1028
- import { join } from "node:path";
1029
- void join;
1030
- `;
1031
- const { testProgram, ctx, options: baseOptions, } = createTestProgram(source);
1032
- const options = { ...baseOptions, surface: "@tsonic/js" };
1033
- ctx.surface = "@tsonic/js";
1034
- ctx.clrResolver = {
1035
- resolve: () => ({ isClr: false }),
1036
- };
1037
- ctx.bindings.addBindings("/x/node-modules.json", {
1038
- bindings: {
1039
- "node:path": {
1040
- kind: "module",
1041
- assembly: "nodejs",
1042
- type: "nodejs.path",
1043
- },
1044
- path: {
1045
- kind: "module",
1046
- assembly: "nodejs",
1047
- type: "nodejs.path",
1048
- },
1049
- },
1050
- });
1051
- ctx.bindings.addBindings("/x/node-types.json", {
1052
- namespace: "nodejs",
1053
- types: [
1054
- {
1055
- clrName: "nodejs.path",
1056
- assemblyName: "nodejs",
1057
- methods: [],
1058
- properties: [],
1059
- fields: [],
1060
- },
1061
- ],
1062
- });
1063
- const sourceFile = testProgram.sourceFiles[0];
1064
- if (!sourceFile)
1065
- throw new Error("Failed to create source file");
1066
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1067
- expect(result.ok).to.equal(true);
1068
- if (!result.ok)
1069
- return;
1070
- expect(ctx.diagnostics.some((d) => d.code === "TSN4004")).to.equal(false);
1071
- const imp = result.value.imports[0];
1072
- if (!imp)
1073
- throw new Error("Missing import");
1074
- expect(imp.source).to.equal("node:path");
1075
- expect(imp.resolvedClrType).to.equal("nodejs.path");
1076
- const spec = imp.specifiers[0];
1077
- if (!spec || spec.kind !== "named")
1078
- throw new Error("Missing named spec");
1079
- expect(spec.name).to.equal("join");
1080
- expect(spec.resolvedClrValue).to.equal(undefined);
1081
- });
1082
- it("resolves module-bound import type clauses to owning CLR types", () => {
1083
- const source = `
1084
- import type { IncomingMessage, ServerResponse } from "node:http";
1085
- let req: IncomingMessage | undefined;
1086
- let res: ServerResponse | undefined;
1087
- void req;
1088
- void res;
1089
- `;
1090
- const { testProgram, ctx, options: baseOptions, } = createTestProgram(source);
1091
- const options = {
1092
- ...baseOptions,
1093
- surface: "@tsonic/js",
1094
- };
1095
- ctx.bindings.addBindings("/x/node-modules.json", {
1096
- bindings: {
1097
- "node:http": {
1098
- kind: "module",
1099
- assembly: "nodejs",
1100
- type: "nodejs.Http.http",
1101
- },
1102
- },
1103
- });
1104
- const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-node-http-"));
1105
- const declPath = path.join(tempRoot, "nodejs.Http", "internal", "index.d.ts");
1106
- const bindingsPath = path.join(tempRoot, "nodejs.Http", "bindings.json");
1107
- fs.mkdirSync(path.dirname(declPath), { recursive: true });
1108
- fs.writeFileSync(declPath, "export type IncomingMessage = unknown;\n");
1109
- fs.writeFileSync(bindingsPath, JSON.stringify({ namespace: "nodejs.Http" }), "utf-8");
1110
- const bindingApi = ctx.binding;
1111
- bindingApi.resolveImport = () => 1;
1112
- bindingApi.getSourceFilePathOfDecl = () => declPath;
1113
- const sourceFile = testProgram.sourceFiles[0];
1114
- if (!sourceFile)
1115
- throw new Error("Failed to create source file");
1116
- try {
1117
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1118
- expect(result.ok).to.equal(true);
1119
- if (!result.ok)
1120
- return;
1121
- const imp = result.value.imports[0];
1122
- if (!imp)
1123
- throw new Error("Missing import");
1124
- const incoming = imp.specifiers[0];
1125
- const response = imp.specifiers[1];
1126
- if (!incoming ||
1127
- incoming.kind !== "named" ||
1128
- !response ||
1129
- response.kind !== "named") {
1130
- throw new Error("Missing named import specifiers");
1131
- }
1132
- expect(incoming.isType).to.equal(true);
1133
- expect(incoming.resolvedClrType).to.equal("nodejs.Http.IncomingMessage");
1134
- expect(response.isType).to.equal(true);
1135
- expect(response.resolvedClrType).to.equal("nodejs.Http.ServerResponse");
1136
- }
1137
- finally {
1138
- fs.rmSync(tempRoot, { recursive: true, force: true });
1139
- }
1140
- });
1141
- it("should not detect bare imports as .NET without package bindings", () => {
1142
- // Import-driven resolution: bare imports like "System.IO" are only detected as .NET
1143
- // if they come from a package with bindings.json. Without an actual package,
1144
- // the import is not recognized as .NET.
1145
- const source = `
1146
- import { File } from "System.IO";
1147
- `;
1148
- const { testProgram, ctx, options } = createTestProgram(source);
1149
- const sourceFile = testProgram.sourceFiles[0];
1150
- if (!sourceFile)
1151
- throw new Error("Failed to create source file");
1152
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1153
- expect(result.ok).to.equal(true);
1154
- if (result.ok) {
1155
- const imports = result.value.imports;
1156
- const firstImport = imports[0];
1157
- if (!firstImport)
1158
- throw new Error("Missing import");
1159
- // Without an actual package with bindings.json, this is NOT detected as .NET
1160
- expect(firstImport.isClr).to.equal(false);
1161
- expect(firstImport.resolvedNamespace).to.equal(undefined);
1162
- }
1163
- });
1164
- });
1165
- describe("Call Inference Regressions", () => {
1166
- it("infers generic call return type for undefined identifier arguments", () => {
1167
- const source = `
1168
- function ok<T>(data: T): T {
1169
- return data;
1170
- }
1171
-
1172
- export function run(): undefined {
1173
- return ok(undefined);
1174
- }
1175
- `;
1176
- const { testProgram, ctx, options } = createTestProgram(source);
1177
- const sourceFile = testProgram.sourceFiles[0];
1178
- if (!sourceFile)
1179
- throw new Error("Failed to create source file");
1180
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1181
- expect(result.ok).to.equal(true);
1182
- if (!result.ok)
1183
- return;
1184
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1185
- expect(run).to.not.equal(undefined);
1186
- if (!run)
1187
- return;
1188
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1189
- expect(retStmt?.expression?.kind).to.equal("call");
1190
- if (!retStmt?.expression || retStmt.expression.kind !== "call")
1191
- return;
1192
- expect(retStmt.expression.inferredType).to.deep.equal({
1193
- kind: "primitiveType",
1194
- name: "undefined",
1195
- });
1196
- });
1197
- it("keeps numeric assertions from unknown sources as runtime type assertions", () => {
1198
- const source = `
1199
- import type { int } from "@tsonic/core/types.js";
1200
-
1201
- export function run(data: Record<string, unknown>, key: string): int {
1202
- const value = data[key];
1203
- return value as int;
1204
- }
1205
- `;
1206
- const { testProgram, ctx, options } = createTestProgram(source);
1207
- const sourceFile = testProgram.sourceFiles[0];
1208
- if (!sourceFile)
1209
- throw new Error("Failed to create source file");
1210
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1211
- expect(result.ok).to.equal(true);
1212
- if (!result.ok)
1213
- return;
1214
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1215
- expect(run).to.not.equal(undefined);
1216
- if (!run)
1217
- return;
1218
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1219
- expect(retStmt?.expression?.kind).to.equal("typeAssertion");
1220
- });
1221
- it("accepts empty array literals when contextual type is available", () => {
1222
- const source = `
1223
- export function run(flag: boolean): string[] {
1224
- const a = ["x"];
1225
- const out = flag ? a : [];
1226
- return out;
1227
- }
1228
- `;
1229
- const { testProgram, ctx, options } = createTestProgram(source);
1230
- const sourceFile = testProgram.sourceFiles[0];
1231
- if (!sourceFile)
1232
- throw new Error("Failed to create source file");
1233
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1234
- expect(result.ok).to.equal(true);
1235
- });
1236
- it("accepts empty array literals in conditional branches when overall branch type is array", () => {
1237
- const source = `
1238
- import { List } from "@tsonic/dotnet/System.Collections.Generic.js";
1239
-
1240
- export function run(flag: boolean): string[] {
1241
- const values = new List<string>();
1242
- values.Add("x");
1243
- const out = flag ? values.ToArray() : [];
1244
- return out;
1245
- }
1246
- `;
1247
- const { testProgram, ctx, options } = createTestProgram(source);
1248
- const sourceFile = testProgram.sourceFiles[0];
1249
- if (!sourceFile)
1250
- throw new Error("Failed to create source file");
1251
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1252
- expect(result.ok).to.equal(true);
1253
- });
1254
- it("infers boolean declaration types for shorthand object synthesis in generic calls", () => {
1255
- const source = `
1256
- function ok<T>(data: T): T {
1257
- return data;
1258
- }
1259
-
1260
- export function run(anchor: string, numAfter: number, numBefore: number): {
1261
- foundAnchor: boolean;
1262
- foundNewest: boolean;
1263
- foundOldest: boolean;
1264
- } {
1265
- const foundAnchor = anchor !== "newest" && anchor !== "oldest";
1266
- const foundNewest = numAfter < 1 || anchor === "newest";
1267
- const foundOldest = numBefore < 1 || anchor === "oldest";
1268
- return ok({ foundAnchor, foundNewest, foundOldest });
1269
- }
1270
- `;
1271
- const { testProgram, ctx, options } = createTestProgram(source);
1272
- const sourceFile = testProgram.sourceFiles[0];
1273
- if (!sourceFile)
1274
- throw new Error("Failed to create source file");
1275
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1276
- expect(result.ok).to.equal(true);
1277
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1278
- });
1279
- it("lowers method shorthand to function-valued properties during object synthesis", () => {
1280
- const source = `
1281
- interface Ops {
1282
- add: (x: number, y: number) => number;
1283
- }
1284
- function box<T>(x: T): T { return x; }
1285
- export function run(): number {
1286
- const ops = box<Ops>({
1287
- add(x: number, y: number): number {
1288
- return x + y;
1289
- },
1290
- });
1291
- return ops.add(1, 2);
1292
- }
1293
- `;
1294
- const { testProgram, ctx, options } = createTestProgram(source);
1295
- const sourceFile = testProgram.sourceFiles[0];
1296
- if (!sourceFile)
1297
- throw new Error("Failed to create source file");
1298
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1299
- expect(result.ok).to.equal(true);
1300
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1301
- if (!result.ok)
1302
- return;
1303
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1304
- expect(run).to.not.equal(undefined);
1305
- if (!run)
1306
- return;
1307
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration");
1308
- expect(decl).to.not.equal(undefined);
1309
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1310
- declaration.name.name === "ops")?.initializer;
1311
- expect(initializer?.kind).to.equal("call");
1312
- if (!initializer || initializer.kind !== "call")
1313
- return;
1314
- const arg0 = initializer.arguments[0];
1315
- expect(arg0?.kind).to.equal("object");
1316
- if (!arg0 || arg0.kind !== "object")
1317
- return;
1318
- const addProp = arg0.properties.find((prop) => prop.kind === "property" && prop.key === "add");
1319
- expect(addProp).to.not.equal(undefined);
1320
- if (!addProp || addProp.kind !== "property")
1321
- return;
1322
- expect(addProp.value.kind).to.equal("functionExpression");
1323
- });
1324
- it("supports computed string-literal method shorthand during synthesis", () => {
1325
- const source = `
1326
- interface Ops {
1327
- add: (x: number, y: number) => number;
1328
- }
1329
- function box<T>(x: T): T { return x; }
1330
- export function run(): number {
1331
- const ops = box<Ops>({
1332
- ["add"](x: number, y: number): number {
1333
- return x + y;
1334
- },
1335
- });
1336
- return ops.add(1, 2);
1337
- }
1338
- `;
1339
- const { testProgram, ctx, options } = createTestProgram(source);
1340
- const sourceFile = testProgram.sourceFiles[0];
1341
- if (!sourceFile)
1342
- throw new Error("Failed to create source file");
1343
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1344
- expect(result.ok).to.equal(true);
1345
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1346
- if (!result.ok)
1347
- return;
1348
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1349
- expect(run).to.not.equal(undefined);
1350
- if (!run)
1351
- return;
1352
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration");
1353
- const initializer = decl?.declarations[0]?.initializer;
1354
- expect(initializer?.kind).to.equal("call");
1355
- if (!initializer || initializer.kind !== "call")
1356
- return;
1357
- const arg0 = initializer.arguments[0];
1358
- expect(arg0?.kind).to.equal("object");
1359
- if (!arg0 || arg0.kind !== "object")
1360
- return;
1361
- const computedAddProp = arg0.properties.find((prop) => {
1362
- if (prop.kind !== "property")
1363
- return false;
1364
- return prop.key === "add" && prop.value.kind === "functionExpression";
1365
- });
1366
- expect(computedAddProp).to.not.equal(undefined);
1367
- });
1368
- it("rewrites object-literal method arguments.length to a fixed arity literal", () => {
1369
- const source = `
1370
- interface Ops {
1371
- add: (x: number, y: number) => number;
1372
- }
1373
- function box<T>(x: T): T { return x; }
1374
- export function run(): number {
1375
- const ops = box<Ops>({
1376
- add(x: number, y: number): number {
1377
- return arguments.length + x + y;
1378
- },
1379
- });
1380
- return ops.add(1, 2);
1381
- }
1382
- `;
1383
- const { testProgram, ctx, options } = createTestProgram(source);
1384
- const sourceFile = testProgram.sourceFiles[0];
1385
- if (!sourceFile)
1386
- throw new Error("Failed to create source file");
1387
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1388
- expect(result.ok).to.equal(true);
1389
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1390
- if (!result.ok)
1391
- return;
1392
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1393
- expect(run).to.not.equal(undefined);
1394
- if (!run)
1395
- return;
1396
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration");
1397
- const initializer = decl?.declarations[0]?.initializer;
1398
- expect(initializer?.kind).to.equal("call");
1399
- if (!initializer || initializer.kind !== "call")
1400
- return;
1401
- const arg0 = initializer.arguments[0];
1402
- expect(arg0?.kind).to.equal("object");
1403
- if (!arg0 || arg0.kind !== "object")
1404
- return;
1405
- const addProp = arg0.properties.find((prop) => prop.kind === "property" && prop.key === "add");
1406
- expect(addProp).to.not.equal(undefined);
1407
- if (!addProp || addProp.kind !== "property")
1408
- return;
1409
- expect(addProp.value.kind).to.equal("functionExpression");
1410
- if (addProp.value.kind !== "functionExpression")
1411
- return;
1412
- const stmt = addProp.value.body?.statements[0];
1413
- expect(stmt?.kind).to.equal("returnStatement");
1414
- if (!stmt || stmt.kind !== "returnStatement" || !stmt.expression)
1415
- return;
1416
- expect(stmt.expression.kind).to.equal("binary");
1417
- if (stmt.expression.kind !== "binary")
1418
- return;
1419
- expect(stmt.expression.left.kind).to.equal("binary");
1420
- if (stmt.expression.left.kind !== "binary")
1421
- return;
1422
- expect(stmt.expression.left.left.kind).to.equal("literal");
1423
- if (stmt.expression.left.left.kind !== "literal")
1424
- return;
1425
- expect(stmt.expression.left.left.value).to.equal(2);
1426
- });
1427
- it("rewrites object-literal method arguments[n] to captured parameter temps", () => {
1428
- const source = `
1429
- interface Ops {
1430
- add: (x: number, y: number) => number;
1431
- }
1432
- function box<T>(x: T): T { return x; }
1433
- export function run(): number {
1434
- const ops = box<Ops>({
1435
- add(x: number, y: number): number {
1436
- return (arguments[0] as number) + y;
1437
- },
1438
- });
1439
- return ops.add(1, 2);
1440
- }
1441
- `;
1442
- const { testProgram, ctx, options } = createTestProgram(source);
1443
- const sourceFile = testProgram.sourceFiles[0];
1444
- if (!sourceFile)
1445
- throw new Error("Failed to create source file");
1446
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1447
- expect(result.ok).to.equal(true);
1448
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1449
- if (!result.ok)
1450
- return;
1451
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1452
- expect(run).to.not.equal(undefined);
1453
- if (!run)
1454
- return;
1455
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration");
1456
- const initializer = decl?.declarations[0]?.initializer;
1457
- expect(initializer?.kind).to.equal("call");
1458
- if (!initializer || initializer.kind !== "call")
1459
- return;
1460
- const arg0 = initializer.arguments[0];
1461
- expect(arg0?.kind).to.equal("object");
1462
- if (!arg0 || arg0.kind !== "object")
1463
- return;
1464
- const addProp = arg0.properties.find((prop) => prop.kind === "property" && prop.key === "add");
1465
- expect(addProp).to.not.equal(undefined);
1466
- if (!addProp || addProp.kind !== "property")
1467
- return;
1468
- expect(addProp.value.kind).to.equal("functionExpression");
1469
- if (addProp.value.kind !== "functionExpression" || !addProp.value.body)
1470
- return;
1471
- const [captureDecl, returnStmt] = addProp.value.body.statements;
1472
- expect(captureDecl?.kind).to.equal("variableDeclaration");
1473
- if (!captureDecl || captureDecl.kind !== "variableDeclaration")
1474
- return;
1475
- const captureInit = captureDecl.declarations[0]?.initializer;
1476
- expect(captureInit?.kind).to.equal("identifier");
1477
- if (!captureInit || captureInit.kind !== "identifier")
1478
- return;
1479
- expect(captureInit.name).to.equal("x");
1480
- expect(returnStmt?.kind).to.equal("returnStatement");
1481
- if (!returnStmt ||
1482
- returnStmt.kind !== "returnStatement" ||
1483
- !returnStmt.expression ||
1484
- returnStmt.expression.kind !== "binary") {
1485
- return;
1486
- }
1487
- expect(returnStmt.expression.left.kind).to.equal("typeAssertion");
1488
- if (returnStmt.expression.left.kind !== "typeAssertion")
1489
- return;
1490
- expect(returnStmt.expression.left.expression.kind).to.equal("identifier");
1491
- if (returnStmt.expression.left.expression.kind !== "identifier")
1492
- return;
1493
- expect(returnStmt.expression.left.expression.name).to.include("__tsonic_object_method_argument_0");
1494
- });
1495
- it("normalizes computed const-literal property and accessor keys during synthesis", () => {
1496
- const source = `
1497
- export function run(): number {
1498
- const valueKey = "value";
1499
- const doubledKey = "doubled";
1500
- const obj = {
1501
- [valueKey]: 21,
1502
- get [doubledKey](): number {
1503
- return this.value * 2;
1504
- },
1505
- };
1506
- return obj.doubled;
1507
- }
1508
- `;
1509
- const { testProgram, ctx, options } = createTestProgram(source);
1510
- const sourceFile = testProgram.sourceFiles[0];
1511
- if (!sourceFile)
1512
- throw new Error("Failed to create source file");
1513
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1514
- expect(result.ok).to.equal(true);
1515
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1516
- if (!result.ok)
1517
- return;
1518
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1519
- expect(run).to.not.equal(undefined);
1520
- if (!run)
1521
- return;
1522
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
1523
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
1524
- declaration.name.name === "obj" &&
1525
- declaration.initializer !== undefined));
1526
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1527
- declaration.name.name === "obj")?.initializer;
1528
- expect(initializer?.kind).to.equal("object");
1529
- if (!initializer || initializer.kind !== "object")
1530
- return;
1531
- const valueProp = initializer.properties.find((prop) => prop.kind === "property" && prop.key === "value");
1532
- expect(valueProp).to.not.equal(undefined);
1533
- const doubledAccessor = initializer.behaviorMembers?.find((member) => member.kind === "propertyDeclaration" && member.name === "doubled");
1534
- expect(doubledAccessor).to.not.equal(undefined);
1535
- });
1536
- it("infers unannotated object literal getter types from deterministic bodies", () => {
1537
- const source = `
1538
- export function run(): number {
1539
- const obj = {
1540
- value: 21,
1541
- get doubled() {
1542
- return this.value * 2;
1543
- },
1544
- };
1545
- return obj.doubled;
1546
- }
1547
- `;
1548
- const { testProgram, ctx, options } = createTestProgram(source);
1549
- const sourceFile = testProgram.sourceFiles[0];
1550
- if (!sourceFile)
1551
- throw new Error("Failed to create source file");
1552
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1553
- expect(result.ok).to.equal(true);
1554
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1555
- if (!result.ok)
1556
- return;
1557
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1558
- expect(run).to.not.equal(undefined);
1559
- if (!run)
1560
- return;
1561
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
1562
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
1563
- declaration.name.name === "obj" &&
1564
- declaration.initializer?.kind === "object"));
1565
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1566
- declaration.name.name === "obj")?.initializer;
1567
- expect(initializer?.kind).to.equal("object");
1568
- if (!initializer || initializer.kind !== "object")
1569
- return;
1570
- const objectType = initializer.inferredType;
1571
- expect(objectType?.kind).to.equal("objectType");
1572
- if (!objectType || objectType.kind !== "objectType")
1573
- return;
1574
- const doubledMember = objectType.members.find((member) => member.kind === "propertySignature" && member.name === "doubled");
1575
- expect(doubledMember?.kind).to.equal("propertySignature");
1576
- if (!doubledMember || doubledMember.kind !== "propertySignature")
1577
- return;
1578
- expect(doubledMember.type.kind).to.equal("primitiveType");
1579
- if (doubledMember.type.kind !== "primitiveType")
1580
- return;
1581
- expect(doubledMember.type.name).to.equal("number");
1582
- });
1583
- it("infers unannotated object literal method return types from deterministic bodies", () => {
1584
- const source = `
1585
- export function run(): number {
1586
- const obj = {
1587
- value: 21,
1588
- inc() {
1589
- this.value += 1;
1590
- return this.value;
1591
- },
1592
- };
1593
- return obj.inc();
1594
- }
1595
- `;
1596
- const { testProgram, ctx, options } = createTestProgram(source);
1597
- const sourceFile = testProgram.sourceFiles[0];
1598
- if (!sourceFile)
1599
- throw new Error("Failed to create source file");
1600
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1601
- expect(result.ok).to.equal(true);
1602
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1603
- if (!result.ok)
1604
- return;
1605
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1606
- expect(run).to.not.equal(undefined);
1607
- if (!run)
1608
- return;
1609
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
1610
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
1611
- declaration.name.name === "obj" &&
1612
- declaration.initializer?.kind === "object"));
1613
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1614
- declaration.name.name === "obj")?.initializer;
1615
- expect(initializer?.kind).to.equal("object");
1616
- if (!initializer || initializer.kind !== "object")
1617
- return;
1618
- const objectType = initializer.inferredType;
1619
- expect(objectType?.kind).to.equal("objectType");
1620
- if (!objectType || objectType.kind !== "objectType")
1621
- return;
1622
- const incMember = objectType.members.find((member) => member.kind === "propertySignature" && member.name === "inc");
1623
- expect(incMember?.kind).to.equal("propertySignature");
1624
- if (!incMember || incMember.kind !== "propertySignature")
1625
- return;
1626
- expect(incMember.type.kind).to.equal("functionType");
1627
- if (incMember.type.kind !== "functionType")
1628
- return;
1629
- expect(incMember.type.returnType.kind).to.not.equal("voidType");
1630
- expect(incMember.type.returnType.kind).to.not.equal("unknownType");
1631
- expect(incMember.type.returnType.kind).to.not.equal("anyType");
1632
- const returnStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1633
- expect(returnStmt).to.not.equal(undefined);
1634
- if (!returnStmt ||
1635
- returnStmt.kind !== "returnStatement" ||
1636
- !returnStmt.expression)
1637
- return;
1638
- expect(returnStmt.expression.kind).to.equal("call");
1639
- if (returnStmt.expression.kind !== "call")
1640
- return;
1641
- expect(returnStmt.expression.inferredType?.kind).to.not.equal("voidType");
1642
- expect(returnStmt.expression.inferredType?.kind).to.not.equal("unknownType");
1643
- expect(returnStmt.expression.inferredType?.kind).to.not.equal("anyType");
1644
- });
1645
- it("synthesizes exact numeric properties after nullish fallback narrowing", () => {
1646
- const source = `
1647
- import type { int } from "@tsonic/core/types.js";
1648
-
1649
- declare function parseRole(raw: string): int | undefined;
1650
-
1651
- export function run(raw: string): int {
1652
- const parsedInviteAsRole = parseRole(raw);
1653
- const inviteAsRole = parsedInviteAsRole ?? (400 as int);
1654
- const input = {
1655
- inviteAsRole,
1656
- };
1657
- return input.inviteAsRole;
1658
- }
1659
- `;
1660
- const { testProgram, ctx, options } = createTestProgram(source);
1661
- const sourceFile = testProgram.sourceFiles[0];
1662
- if (!sourceFile)
1663
- throw new Error("Failed to create source file");
1664
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1665
- expect(result.ok).to.equal(true);
1666
- expect(ctx.diagnostics.some((diagnostic) => diagnostic.code === "TSN5203" &&
1667
- diagnostic.message.includes("inviteAsRole"))).to.equal(false);
1668
- if (!result.ok)
1669
- return;
1670
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1671
- expect(run).to.not.equal(undefined);
1672
- if (!run)
1673
- return;
1674
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
1675
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
1676
- declaration.name.name === "input" &&
1677
- declaration.initializer?.kind === "object"));
1678
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1679
- declaration.name.name === "input")?.initializer;
1680
- expect(initializer?.kind).to.equal("object");
1681
- if (!initializer || initializer.kind !== "object")
1682
- return;
1683
- const objectType = initializer.inferredType;
1684
- expect(objectType?.kind).to.equal("objectType");
1685
- if (!objectType || objectType.kind !== "objectType")
1686
- return;
1687
- const inviteAsRoleMember = objectType.members.find((member) => member.kind === "propertySignature" && member.name === "inviteAsRole");
1688
- expect(inviteAsRoleMember?.kind).to.equal("propertySignature");
1689
- if (!inviteAsRoleMember ||
1690
- inviteAsRoleMember.kind !== "propertySignature")
1691
- return;
1692
- expect(inviteAsRoleMember.type.kind).to.equal("primitiveType");
1693
- if (inviteAsRoleMember.type.kind !== "primitiveType")
1694
- return;
1695
- expect(inviteAsRoleMember.type.name).to.equal("int");
1696
- });
1697
- it("normalizes computed const-literal numeric keys during synthesis", () => {
1698
- const source = `
1699
- export function run(): number {
1700
- const slot = 1;
1701
- const obj = {
1702
- [slot]: 7,
1703
- };
1704
- return obj["1"];
1705
- }
1706
- `;
1707
- const { testProgram, ctx, options } = createTestProgram(source);
1708
- const sourceFile = testProgram.sourceFiles[0];
1709
- if (!sourceFile)
1710
- throw new Error("Failed to create source file");
1711
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1712
- expect(result.ok).to.equal(true);
1713
- expect(ctx.diagnostics.some((d) => d.code === "TSN7403")).to.equal(false);
1714
- if (!result.ok)
1715
- return;
1716
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1717
- expect(run).to.not.equal(undefined);
1718
- if (!run)
1719
- return;
1720
- const decl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
1721
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
1722
- declaration.name.name === "obj" &&
1723
- declaration.initializer !== undefined));
1724
- const initializer = decl?.declarations.find((declaration) => declaration.name.kind === "identifierPattern" &&
1725
- declaration.name.name === "obj")?.initializer;
1726
- expect(initializer?.kind).to.equal("object");
1727
- if (!initializer || initializer.kind !== "object")
1728
- return;
1729
- const slotProp = initializer.properties.find((prop) => prop.kind === "property" && prop.key === "1");
1730
- expect(slotProp).to.not.equal(undefined);
1731
- });
1732
- it("threads expected return generic context into call argument typing", () => {
1733
- const source = `
1734
- type Ok<T> = { success: true; data: T };
1735
- type Err<E> = { success: false; error: E };
1736
- type Result<T, E> = Ok<T> | Err<E>;
1737
-
1738
- function ok<T>(data: T): Ok<T> {
1739
- return { success: true, data };
1740
- }
1741
-
1742
- interface Payload {
1743
- foundAnchor: boolean;
1744
- foundNewest: boolean;
1745
- foundOldest: boolean;
1746
- }
1747
-
1748
- export function run(anchor: string): Result<Payload, string> {
1749
- const foundAnchor = anchor !== "newest" && anchor !== "oldest";
1750
- const foundNewest = anchor === "newest";
1751
- const foundOldest = anchor === "oldest";
1752
- return ok({ foundAnchor, foundNewest, foundOldest });
1753
- }
1754
- `;
1755
- const { testProgram, ctx, options } = createTestProgram(source);
1756
- const sourceFile = testProgram.sourceFiles[0];
1757
- if (!sourceFile)
1758
- throw new Error("Failed to create source file");
1759
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1760
- expect(result.ok).to.equal(true);
1761
- if (!result.ok)
1762
- return;
1763
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1764
- expect(run).to.not.equal(undefined);
1765
- if (!run)
1766
- return;
1767
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1768
- expect(retStmt?.expression?.kind).to.equal("call");
1769
- if (!retStmt?.expression || retStmt.expression.kind !== "call")
1770
- return;
1771
- const arg0 = retStmt.expression.arguments[0];
1772
- expect(arg0?.kind).to.equal("object");
1773
- if (!arg0 || arg0.kind !== "object")
1774
- return;
1775
- expect(arg0.inferredType?.kind).to.equal("referenceType");
1776
- if (arg0.inferredType?.kind === "referenceType") {
1777
- expect(arg0.inferredType.name).to.equal("Payload");
1778
- }
1779
- });
1780
- it("threads expected return generic context through async Promise wrappers", () => {
1781
- const source = `
1782
- type Ok<T> = { success: true; data: T };
1783
- type Err<E> = { success: false; error: E };
1784
- type Result<T, E> = Ok<T> | Err<E>;
1785
-
1786
- function ok<T>(data: T): Ok<T> {
1787
- return { success: true, data };
1788
- }
1789
-
1790
- interface Payload {
1791
- foundAnchor: boolean;
1792
- foundNewest: boolean;
1793
- foundOldest: boolean;
1794
- }
1795
-
1796
- export async function run(anchor: string): Promise<Result<Payload, string>> {
1797
- const foundAnchor = anchor !== "newest" && anchor !== "oldest";
1798
- const foundNewest = anchor === "newest";
1799
- const foundOldest = anchor === "oldest";
1800
- return ok({ foundAnchor, foundNewest, foundOldest });
1801
- }
1802
- `;
1803
- const { testProgram, ctx, options } = createTestProgram(source);
1804
- const sourceFile = testProgram.sourceFiles[0];
1805
- if (!sourceFile)
1806
- throw new Error("Failed to create source file");
1807
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1808
- expect(result.ok).to.equal(true);
1809
- if (!result.ok)
1810
- return;
1811
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1812
- expect(run).to.not.equal(undefined);
1813
- if (!run)
1814
- return;
1815
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1816
- expect(retStmt?.expression?.kind).to.equal("call");
1817
- if (!retStmt?.expression || retStmt.expression.kind !== "call")
1818
- return;
1819
- const arg0 = retStmt.expression.arguments[0];
1820
- expect(arg0?.kind).to.equal("object");
1821
- if (!arg0 || arg0.kind !== "object")
1822
- return;
1823
- expect(arg0.inferredType?.kind).to.equal("referenceType");
1824
- if (arg0.inferredType?.kind === "referenceType") {
1825
- expect(arg0.inferredType.name).to.equal("Payload");
1826
- }
1827
- });
1828
- it("threads expected return generic context through imported declaration aliases", () => {
1829
- const testFiles = {
1830
- "package.json": JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2),
1831
- "src/index.ts": `
1832
- import type { Result } from "./core.js";
1833
- import { ok } from "./core.js";
1834
-
1835
- interface Payload {
1836
- foundAnchor: boolean;
1837
- foundNewest: boolean;
1838
- foundOldest: boolean;
1839
- }
1840
-
1841
- export function run(anchor: string): Result<Payload, string> {
1842
- const foundAnchor = anchor !== "newest" && anchor !== "oldest";
1843
- const foundNewest = anchor === "newest";
1844
- const foundOldest = anchor === "oldest";
1845
- return ok({ foundAnchor, foundNewest, foundOldest });
1846
- }
1847
- `,
1848
- "src/core.d.ts": `
1849
- export interface Ok<T> {
1850
- readonly success: true;
1851
- readonly data: T;
1852
- }
1853
-
1854
- export interface Err<E> {
1855
- readonly success: false;
1856
- readonly error: E;
1857
- }
1858
-
1859
- export type Result<T, E> = Ok<T> | Err<E>;
1860
-
1861
- export declare function ok<T>(data: T): Ok<T>;
1862
- `,
1863
- };
1864
- const { sourceFile, testProgram, ctx, options, cleanup } = createFilesystemTestProgram(testFiles, "src/index.ts");
1865
- try {
1866
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1867
- expect(result.ok).to.equal(true);
1868
- if (!result.ok)
1869
- return;
1870
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1871
- expect(run).to.not.equal(undefined);
1872
- if (!run)
1873
- return;
1874
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1875
- expect(retStmt?.expression?.kind).to.equal("call");
1876
- if (!retStmt?.expression || retStmt.expression.kind !== "call")
1877
- return;
1878
- const arg0 = retStmt.expression.arguments[0];
1879
- expect(arg0?.kind).to.equal("object");
1880
- if (!arg0 || arg0.kind !== "object")
1881
- return;
1882
- expect(arg0.inferredType?.kind).to.equal("referenceType");
1883
- if (arg0.inferredType?.kind === "referenceType") {
1884
- expect(arg0.inferredType.name).to.equal("Payload");
1885
- }
1886
- }
1887
- finally {
1888
- cleanup();
1889
- }
1890
- });
1891
- it("threads expected return generic context through imported declaration aliases inside Promise wrappers", () => {
1892
- const testFiles = {
1893
- "package.json": JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2),
1894
- "src/index.ts": `
1895
- import type { Result } from "./core.js";
1896
- import { ok } from "./core.js";
1897
-
1898
- interface Payload {
1899
- foundAnchor: boolean;
1900
- foundNewest: boolean;
1901
- foundOldest: boolean;
1902
- }
1903
-
1904
- export async function run(anchor: string): Promise<Result<Payload, string>> {
1905
- const foundAnchor = anchor !== "newest" && anchor !== "oldest";
1906
- const foundNewest = anchor === "newest";
1907
- const foundOldest = anchor === "oldest";
1908
- return ok({ foundAnchor, foundNewest, foundOldest });
1909
- }
1910
- `,
1911
- "src/core.d.ts": `
1912
- export interface Ok<T> {
1913
- readonly success: true;
1914
- readonly data: T;
1915
- }
1916
-
1917
- export interface Err<E> {
1918
- readonly success: false;
1919
- readonly error: E;
1920
- }
1921
-
1922
- export type Result<T, E> = Ok<T> | Err<E>;
1923
-
1924
- export declare function ok<T>(data: T): Ok<T>;
1925
- `,
1926
- };
1927
- const { sourceFile, testProgram, ctx, options, cleanup } = createFilesystemTestProgram(testFiles, "src/index.ts");
1928
- try {
1929
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
1930
- expect(result.ok).to.equal(true);
1931
- if (!result.ok)
1932
- return;
1933
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
1934
- expect(run).to.not.equal(undefined);
1935
- if (!run)
1936
- return;
1937
- const retStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
1938
- expect(retStmt?.expression?.kind).to.equal("call");
1939
- if (!retStmt?.expression || retStmt.expression.kind !== "call")
1940
- return;
1941
- const arg0 = retStmt.expression.arguments[0];
1942
- expect(arg0?.kind).to.equal("object");
1943
- if (!arg0 || arg0.kind !== "object")
1944
- return;
1945
- expect(arg0.inferredType?.kind).to.equal("referenceType");
1946
- if (arg0.inferredType?.kind === "referenceType") {
1947
- expect(arg0.inferredType.name).to.equal("Payload");
1948
- }
1949
- }
1950
- finally {
1951
- cleanup();
1952
- }
1953
- });
1954
- it("does not leak type-alias cache entries across program contexts", () => {
1955
- const sourceA = `
1956
- export type UserId = string;
1957
- export function use(id: UserId): UserId {
1958
- return id;
1959
- }
1960
- `;
1961
- const sourceB = `
1962
- export type UserId = number;
1963
- export function use(id: UserId): UserId {
1964
- return id;
1965
- }
1966
- `;
1967
- const first = createTestProgram(sourceA);
1968
- const firstFile = first.testProgram.sourceFiles[0];
1969
- if (!firstFile)
1970
- throw new Error("Failed to create source file A");
1971
- const firstResult = buildIrModule(firstFile, first.testProgram, first.options, first.ctx);
1972
- expect(firstResult.ok).to.equal(true);
1973
- if (!firstResult.ok)
1974
- return;
1975
- const second = createTestProgram(sourceB);
1976
- const secondFile = second.testProgram.sourceFiles[0];
1977
- if (!secondFile)
1978
- throw new Error("Failed to create source file B");
1979
- const secondResult = buildIrModule(secondFile, second.testProgram, second.options, second.ctx);
1980
- expect(secondResult.ok).to.equal(true);
1981
- if (!secondResult.ok)
1982
- return;
1983
- const useFn = secondResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "use");
1984
- expect(useFn).to.not.equal(undefined);
1985
- if (!useFn)
1986
- return;
1987
- const param = useFn.parameters[0];
1988
- expect(param?.type).to.deep.equal({
1989
- kind: "primitiveType",
1990
- name: "number",
1991
- });
1992
- expect(useFn.returnType).to.deep.equal({
1993
- kind: "primitiveType",
1994
- name: "number",
1995
- });
1996
- });
1997
- it("keeps alias conversion deterministic across alternating compilations", () => {
1998
- const sourceString = `
1999
- export type UserId = string;
2000
- export function use(id: UserId): UserId {
2001
- return id;
2002
- }
2003
- `;
2004
- const sourceNumber = `
2005
- export type UserId = number;
2006
- export function use(id: UserId): UserId {
2007
- return id;
2008
- }
2009
- `;
2010
- const sourceBoolean = `
2011
- export type UserId = boolean;
2012
- export function use(id: UserId): UserId {
2013
- return id;
2014
- }
2015
- `;
2016
- const buildUseFn = (source) => {
2017
- const test = createTestProgram(source);
2018
- const file = test.testProgram.sourceFiles[0];
2019
- if (!file)
2020
- throw new Error("Failed to create source file");
2021
- const result = buildIrModule(file, test.testProgram, test.options, test.ctx);
2022
- expect(result.ok).to.equal(true);
2023
- if (!result.ok)
2024
- throw new Error(result.error.message);
2025
- const useFn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "use");
2026
- if (!useFn)
2027
- throw new Error("Missing use function");
2028
- return useFn;
2029
- };
2030
- const first = buildUseFn(sourceString);
2031
- expect(first.parameters[0]?.type).to.deep.equal({
2032
- kind: "primitiveType",
2033
- name: "string",
2034
- });
2035
- expect(first.returnType).to.deep.equal({
2036
- kind: "primitiveType",
2037
- name: "string",
2038
- });
2039
- const second = buildUseFn(sourceNumber);
2040
- expect(second.parameters[0]?.type).to.deep.equal({
2041
- kind: "primitiveType",
2042
- name: "number",
2043
- });
2044
- expect(second.returnType).to.deep.equal({
2045
- kind: "primitiveType",
2046
- name: "number",
2047
- });
2048
- const third = buildUseFn(sourceBoolean);
2049
- expect(third.parameters[0]?.type).to.deep.equal({
2050
- kind: "primitiveType",
2051
- name: "boolean",
2052
- });
2053
- expect(third.returnType).to.deep.equal({
2054
- kind: "primitiveType",
2055
- name: "boolean",
2056
- });
2057
- const fourth = buildUseFn(sourceString);
2058
- expect(fourth.parameters[0]?.type).to.deep.equal({
2059
- kind: "primitiveType",
2060
- name: "string",
2061
- });
2062
- expect(fourth.returnType).to.deep.equal({
2063
- kind: "primitiveType",
2064
- name: "string",
2065
- });
2066
- });
2067
- });
2068
- describe("Statement Conversion", () => {
2069
- it("should convert function declarations", () => {
2070
- const source = `
2071
- export function add(a: number, b: number): number {
2072
- return a + b;
2073
- }
2074
- `;
2075
- const { testProgram, ctx, options } = createTestProgram(source);
2076
- const sourceFile = testProgram.sourceFiles[0];
2077
- if (!sourceFile)
2078
- throw new Error("Failed to create source file");
2079
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2080
- expect(result.ok).to.equal(true);
2081
- if (result.ok) {
2082
- const body = result.value.body;
2083
- expect(body).to.have.length(1);
2084
- const firstItem = body[0];
2085
- if (!firstItem)
2086
- throw new Error("Missing body item");
2087
- expect(firstItem.kind).to.equal("functionDeclaration");
2088
- const func = firstItem;
2089
- expect(func.name).to.equal("add");
2090
- expect(func.parameters).to.have.length(2);
2091
- expect(func.isExported).to.equal(true);
2092
- }
2093
- });
2094
- it("should convert variable declarations", () => {
2095
- // Use explicit type annotation for object literal to avoid synthetic type generation
2096
- const source = `
2097
- interface Named { name: string }
2098
- const x = 10;
2099
- let y: string = "hello";
2100
- export const z: Named = { name: "test" };
2101
- `;
2102
- const { testProgram, ctx, options } = createTestProgram(source);
2103
- const sourceFile = testProgram.sourceFiles[0];
2104
- if (!sourceFile)
2105
- throw new Error("Failed to create source file");
2106
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2107
- expect(result.ok).to.equal(true);
2108
- if (result.ok) {
2109
- const body = result.value.body;
2110
- // 4 statements: interface + 3 variable declarations
2111
- expect(body).to.have.length(4);
2112
- const firstDecl = body[0];
2113
- expect(firstDecl.kind).to.equal("interfaceDeclaration");
2114
- const firstVar = body[1];
2115
- expect(firstVar.kind).to.equal("variableDeclaration");
2116
- expect(firstVar.declarationKind).to.equal("const");
2117
- const secondVar = body[2];
2118
- expect(secondVar.declarationKind).to.equal("let");
2119
- const thirdVar = body[3];
2120
- expect(thirdVar.isExported).to.equal(true);
2121
- }
2122
- });
2123
- it("should convert class declarations", () => {
2124
- const source = `
2125
- export class User {
2126
- private name: string;
2127
- constructor(name: string) {
2128
- this.name = name;
2129
- }
2130
- getName(): string {
2131
- return this.name;
2132
- }
2133
- }
2134
- `;
2135
- const { testProgram, ctx, options } = createTestProgram(source);
2136
- const sourceFile = testProgram.sourceFiles[0];
2137
- if (!sourceFile)
2138
- throw new Error("Failed to create source file");
2139
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2140
- expect(result.ok).to.equal(true);
2141
- if (result.ok) {
2142
- const body = result.value.body;
2143
- expect(body).to.have.length(1);
2144
- const cls = body[0];
2145
- expect(cls.kind).to.equal("classDeclaration");
2146
- expect(cls.name).to.equal("User");
2147
- expect(cls.isExported).to.equal(true);
2148
- expect(cls.members).to.have.length.greaterThan(0);
2149
- }
2150
- });
2151
- });
2152
- describe("Expression Conversion", () => {
2153
- it("should convert template literals", () => {
2154
- const source = `
2155
- const greeting = \`Hello \${name}\`;
2156
- `;
2157
- const { testProgram, ctx, options } = createTestProgram(source);
2158
- const sourceFile = testProgram.sourceFiles[0];
2159
- if (!sourceFile)
2160
- throw new Error("Failed to create source file");
2161
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2162
- expect(result.ok).to.equal(true);
2163
- if (result.ok) {
2164
- const varDecl = result.value.body[0];
2165
- const init = varDecl.declarations[0]?.initializer;
2166
- if (init && init.kind === "templateLiteral") {
2167
- expect(init.kind).to.equal("templateLiteral");
2168
- expect(init.quasis).to.have.length(2);
2169
- expect(init.expressions).to.have.length(1);
2170
- }
2171
- }
2172
- });
2173
- it("should convert arrow functions", () => {
2174
- const source = `
2175
- const double = (x: number) => x * 2;
2176
- `;
2177
- const { testProgram, ctx, options } = createTestProgram(source);
2178
- const sourceFile = testProgram.sourceFiles[0];
2179
- if (!sourceFile)
2180
- throw new Error("Failed to create source file");
2181
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2182
- expect(result.ok).to.equal(true);
2183
- if (result.ok) {
2184
- const varDecl = result.value.body[0];
2185
- const init = varDecl.declarations[0]?.initializer;
2186
- if (init && init.kind === "arrowFunction") {
2187
- expect(init.kind).to.equal("arrowFunction");
2188
- expect(init.parameters).to.have.length(1);
2189
- }
2190
- }
2191
- });
2192
- it("should lower import.meta.url to a string literal", () => {
2193
- const source = `
2194
- const url = import.meta.url;
2195
- `;
2196
- const { testProgram, ctx, options } = createTestProgram(source);
2197
- const sourceFile = testProgram.sourceFiles[0];
2198
- if (!sourceFile)
2199
- throw new Error("Failed to create source file");
2200
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2201
- expect(result.ok).to.equal(true);
2202
- if (result.ok) {
2203
- const varDecl = result.value.body[0];
2204
- const init = varDecl.declarations[0]?.initializer;
2205
- expect(init?.kind).to.equal("literal");
2206
- if (init?.kind === "literal") {
2207
- expect(typeof init.value).to.equal("string");
2208
- expect(init.value.startsWith("file://")).to.equal(true);
2209
- }
2210
- }
2211
- });
2212
- it("should lower bare import.meta to an object literal with deterministic fields", () => {
2213
- const source = `
2214
- declare global {
2215
- interface ImportMeta {
2216
- readonly url: string;
2217
- readonly filename: string;
2218
- readonly dirname: string;
2219
- }
2220
- }
2221
- const meta = import.meta;
2222
- `;
2223
- const { testProgram, ctx, options } = createTestProgram(source);
2224
- const sourceFile = testProgram.sourceFiles[0];
2225
- if (!sourceFile)
2226
- throw new Error("Failed to create source file");
2227
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2228
- expect(result.ok).to.equal(true);
2229
- if (result.ok) {
2230
- const varDecl = result.value.body.at(-1);
2231
- const init = varDecl.declarations[0]?.initializer;
2232
- expect(init?.kind).to.equal("object");
2233
- if (init?.kind === "object") {
2234
- expect(init.properties.filter((prop) => prop.kind === "property")).to.have.length(3);
2235
- }
2236
- }
2237
- });
2238
- it("should attach deterministic namespace objects to closed-world dynamic import values", () => {
2239
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-dynamic-import-"));
2240
- try {
2241
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
2242
- const srcDir = path.join(tempDir, "src");
2243
- fs.mkdirSync(srcDir, { recursive: true });
2244
- const entryPath = path.join(srcDir, "index.ts");
2245
- fs.writeFileSync(entryPath, [
2246
- "export async function load() {",
2247
- ' const module = await import("./module.js");',
2248
- " return module.value;",
2249
- "}",
2250
- ].join("\n"));
2251
- fs.writeFileSync(path.join(srcDir, "module.ts"), "export const value = 42;\n");
2252
- const tsProgram = ts.createProgram([entryPath, path.join(srcDir, "module.ts")], {
2253
- target: ts.ScriptTarget.ES2022,
2254
- module: ts.ModuleKind.NodeNext,
2255
- moduleResolution: ts.ModuleResolutionKind.NodeNext,
2256
- strict: true,
2257
- noEmit: true,
2258
- skipLibCheck: true,
2259
- });
2260
- const checker = tsProgram.getTypeChecker();
2261
- const sourceFile = tsProgram.getSourceFile(entryPath);
2262
- expect(sourceFile).to.not.equal(undefined);
2263
- if (!sourceFile)
2264
- return;
2265
- const moduleSourceFile = tsProgram.getSourceFile(path.join(srcDir, "module.ts"));
2266
- expect(moduleSourceFile).to.not.equal(undefined);
2267
- if (!moduleSourceFile)
2268
- return;
2269
- const program = {
2270
- program: tsProgram,
2271
- checker,
2272
- options: {
2273
- projectRoot: tempDir,
2274
- sourceRoot: srcDir,
2275
- rootNamespace: "TestApp",
2276
- strict: true,
2277
- },
2278
- sourceFiles: [sourceFile, moduleSourceFile],
2279
- declarationSourceFiles: [],
2280
- metadata: new DotnetMetadataRegistry(),
2281
- bindings: new BindingRegistry(),
2282
- clrResolver: createClrBindingsResolver(tempDir),
2283
- binding: createBinding(checker),
2284
- };
2285
- const options = { sourceRoot: srcDir, rootNamespace: "TestApp" };
2286
- const ctx = createProgramContext(program, options);
2287
- const moduleResult = buildIrModule(sourceFile, program, options, ctx);
2288
- expect(moduleResult.ok).to.equal(true);
2289
- if (!moduleResult.ok)
2290
- return;
2291
- const loadFn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "load");
2292
- expect(loadFn).to.not.equal(undefined);
2293
- if (!loadFn)
2294
- return;
2295
- const declStmt = loadFn.body.statements[0];
2296
- expect(declStmt?.kind).to.equal("variableDeclaration");
2297
- if (!declStmt || declStmt.kind !== "variableDeclaration")
2298
- return;
2299
- const initializer = declStmt.declarations[0]?.initializer;
2300
- expect(initializer?.kind).to.equal("await");
2301
- if (!initializer || initializer.kind !== "await")
2302
- return;
2303
- const call = initializer.expression;
2304
- expect(call.kind).to.equal("call");
2305
- if (call.kind !== "call")
2306
- return;
2307
- expect(call.dynamicImportNamespace?.kind).to.equal("object");
2308
- if (!call.dynamicImportNamespace)
2309
- return;
2310
- expect(call.dynamicImportNamespace.properties).to.have.length(1);
2311
- const property = call.dynamicImportNamespace.properties[0];
2312
- expect(property?.kind).to.equal("property");
2313
- if (!property || property.kind !== "property")
2314
- return;
2315
- expect(property.key).to.equal("value");
2316
- expect(property.value.kind).to.equal("memberAccess");
2317
- expect(property.value.inferredType?.kind).to.not.equal("voidType");
2318
- expect(property.value.inferredType?.kind).to.not.equal("unknownType");
2319
- expect(property.value.inferredType?.kind).to.not.equal("anyType");
2320
- expect(call.inferredType?.kind).to.equal("referenceType");
2321
- }
2322
- finally {
2323
- fs.rmSync(tempDir, { recursive: true, force: true });
2324
- }
2325
- });
2326
- it("should preserve callable exports as function-valued namespace members", () => {
2327
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-dynamic-import-fn-"));
2328
- try {
2329
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
2330
- const srcDir = path.join(tempDir, "src");
2331
- fs.mkdirSync(srcDir, { recursive: true });
2332
- const entryPath = path.join(srcDir, "index.ts");
2333
- fs.writeFileSync(entryPath, [
2334
- "export async function load() {",
2335
- ' const module = await import("./module.js");',
2336
- " return module.value;",
2337
- "}",
2338
- ].join("\n"));
2339
- fs.writeFileSync(path.join(srcDir, "module.ts"), "export function value(): number { return 42; }\n");
2340
- const tsProgram = ts.createProgram([entryPath, path.join(srcDir, "module.ts")], {
2341
- target: ts.ScriptTarget.ES2022,
2342
- module: ts.ModuleKind.NodeNext,
2343
- moduleResolution: ts.ModuleResolutionKind.NodeNext,
2344
- strict: true,
2345
- noEmit: true,
2346
- skipLibCheck: true,
2347
- });
2348
- const checker = tsProgram.getTypeChecker();
2349
- const sourceFile = tsProgram.getSourceFile(entryPath);
2350
- expect(sourceFile).to.not.equal(undefined);
2351
- if (!sourceFile)
2352
- return;
2353
- const moduleSourceFile = tsProgram.getSourceFile(path.join(srcDir, "module.ts"));
2354
- expect(moduleSourceFile).to.not.equal(undefined);
2355
- if (!moduleSourceFile)
2356
- return;
2357
- const program = {
2358
- program: tsProgram,
2359
- checker,
2360
- options: {
2361
- projectRoot: tempDir,
2362
- sourceRoot: srcDir,
2363
- rootNamespace: "TestApp",
2364
- strict: true,
2365
- },
2366
- sourceFiles: [sourceFile, moduleSourceFile],
2367
- declarationSourceFiles: [],
2368
- metadata: new DotnetMetadataRegistry(),
2369
- bindings: new BindingRegistry(),
2370
- clrResolver: createClrBindingsResolver(tempDir),
2371
- binding: createBinding(checker),
2372
- };
2373
- const options = { sourceRoot: srcDir, rootNamespace: "TestApp" };
2374
- const ctx = createProgramContext(program, options);
2375
- const moduleResult = buildIrModule(sourceFile, program, options, ctx);
2376
- expect(moduleResult.ok).to.equal(true);
2377
- if (!moduleResult.ok)
2378
- return;
2379
- const loadFn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "load");
2380
- expect(loadFn).to.not.equal(undefined);
2381
- if (!loadFn)
2382
- return;
2383
- const declStmt = loadFn.body.statements[0];
2384
- expect(declStmt?.kind).to.equal("variableDeclaration");
2385
- if (!declStmt || declStmt.kind !== "variableDeclaration")
2386
- return;
2387
- const initializer = declStmt.declarations[0]?.initializer;
2388
- expect(initializer?.kind).to.equal("await");
2389
- if (!initializer || initializer.kind !== "await")
2390
- return;
2391
- const call = initializer.expression;
2392
- expect(call.kind).to.equal("call");
2393
- if (call.kind !== "call" || !call.dynamicImportNamespace)
2394
- return;
2395
- const property = call.dynamicImportNamespace.properties[0];
2396
- expect(property?.kind).to.equal("property");
2397
- if (!property || property.kind !== "property")
2398
- return;
2399
- expect(property.value.inferredType?.kind).to.equal("functionType");
2400
- const namespaceType = call.dynamicImportNamespace.inferredType;
2401
- expect(namespaceType?.kind).to.equal("objectType");
2402
- if (!namespaceType || namespaceType.kind !== "objectType")
2403
- return;
2404
- const valueMember = namespaceType.members.find((member) => member.kind === "propertySignature" && member.name === "value");
2405
- expect(valueMember?.kind).to.equal("propertySignature");
2406
- if (!valueMember || valueMember.kind !== "propertySignature")
2407
- return;
2408
- expect(valueMember.type.kind).to.equal("functionType");
2409
- }
2410
- finally {
2411
- fs.rmSync(tempDir, { recursive: true, force: true });
2412
- }
2413
- });
2414
- it("should represent empty closed-world dynamic import namespaces as Promise<object>", () => {
2415
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-dynamic-import-empty-"));
2416
- try {
2417
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
2418
- const srcDir = path.join(tempDir, "src");
2419
- fs.mkdirSync(srcDir, { recursive: true });
2420
- const entryPath = path.join(srcDir, "index.ts");
2421
- fs.writeFileSync(entryPath, [
2422
- "export async function load(): Promise<object> {",
2423
- ' return import("./module.js");',
2424
- "}",
2425
- ].join("\n"));
2426
- fs.writeFileSync(path.join(srcDir, "module.ts"), "export type Value = { readonly ok: true };\n");
2427
- const tsProgram = ts.createProgram([entryPath, path.join(srcDir, "module.ts")], {
2428
- target: ts.ScriptTarget.ES2022,
2429
- module: ts.ModuleKind.NodeNext,
2430
- moduleResolution: ts.ModuleResolutionKind.NodeNext,
2431
- strict: true,
2432
- noEmit: true,
2433
- skipLibCheck: true,
2434
- });
2435
- const checker = tsProgram.getTypeChecker();
2436
- const sourceFile = tsProgram.getSourceFile(entryPath);
2437
- expect(sourceFile).to.not.equal(undefined);
2438
- if (!sourceFile)
2439
- return;
2440
- const moduleSourceFile = tsProgram.getSourceFile(path.join(srcDir, "module.ts"));
2441
- expect(moduleSourceFile).to.not.equal(undefined);
2442
- if (!moduleSourceFile)
2443
- return;
2444
- const program = {
2445
- program: tsProgram,
2446
- checker,
2447
- options: {
2448
- projectRoot: tempDir,
2449
- sourceRoot: srcDir,
2450
- rootNamespace: "TestApp",
2451
- strict: true,
2452
- },
2453
- sourceFiles: [sourceFile, moduleSourceFile],
2454
- declarationSourceFiles: [],
2455
- metadata: new DotnetMetadataRegistry(),
2456
- bindings: new BindingRegistry(),
2457
- clrResolver: createClrBindingsResolver(tempDir),
2458
- binding: createBinding(checker),
2459
- };
2460
- const options = { sourceRoot: srcDir, rootNamespace: "TestApp" };
2461
- const ctx = createProgramContext(program, options);
2462
- const moduleResult = buildIrModule(sourceFile, program, options, ctx);
2463
- expect(moduleResult.ok).to.equal(true);
2464
- if (!moduleResult.ok)
2465
- return;
2466
- const loadFn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "load");
2467
- expect(loadFn).to.not.equal(undefined);
2468
- if (!loadFn)
2469
- return;
2470
- const returnStmt = loadFn.body.statements[0];
2471
- expect(returnStmt?.kind).to.equal("returnStatement");
2472
- if (!returnStmt || returnStmt.kind !== "returnStatement")
2473
- return;
2474
- const call = returnStmt.expression;
2475
- expect(call?.kind).to.equal("call");
2476
- if (!call || call.kind !== "call")
2477
- return;
2478
- expect(call.dynamicImportNamespace?.kind).to.equal("object");
2479
- if (!call.dynamicImportNamespace)
2480
- return;
2481
- expect(call.dynamicImportNamespace.properties).to.have.length(0);
2482
- expect(call.dynamicImportNamespace.inferredType).to.deep.equal({
2483
- kind: "referenceType",
2484
- name: "object",
2485
- });
2486
- expect(call.inferredType).to.deep.equal({
2487
- kind: "referenceType",
2488
- name: "Promise",
2489
- typeArguments: [{ kind: "referenceType", name: "object" }],
2490
- });
2491
- }
2492
- finally {
2493
- fs.rmSync(tempDir, { recursive: true, force: true });
2494
- }
2495
- });
2496
- });
2497
- describe("Export Handling", () => {
2498
- it("should handle named exports", () => {
2499
- const source = `
2500
- const a = 1;
2501
- const b = 2;
2502
- export { a, b as c };
2503
- `;
2504
- const { testProgram, ctx, options } = createTestProgram(source);
2505
- const sourceFile = testProgram.sourceFiles[0];
2506
- if (!sourceFile)
2507
- throw new Error("Failed to create source file");
2508
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2509
- expect(result.ok).to.equal(true);
2510
- if (result.ok) {
2511
- const exports = result.value.exports;
2512
- expect(exports).to.have.length(2);
2513
- const firstExport = exports[0];
2514
- if (!firstExport)
2515
- throw new Error("Missing export");
2516
- expect(firstExport.kind).to.equal("named");
2517
- if (firstExport.kind === "named") {
2518
- expect(firstExport.name).to.equal("a");
2519
- expect(firstExport.localName).to.equal("a");
2520
- }
2521
- const second = exports[1];
2522
- if (second && second.kind === "named") {
2523
- expect(second.name).to.equal("c");
2524
- expect(second.localName).to.equal("b");
2525
- }
2526
- }
2527
- });
2528
- it("should handle default export", () => {
2529
- const source = `
2530
- export default function main() {
2531
- console.log("Hello");
2532
- }
2533
- `;
2534
- const { testProgram, ctx, options } = createTestProgram(source);
2535
- const sourceFile = testProgram.sourceFiles[0];
2536
- if (!sourceFile)
2537
- throw new Error("Failed to create source file");
2538
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2539
- expect(result.ok).to.equal(true);
2540
- if (result.ok) {
2541
- const exports = result.value.exports;
2542
- expect(exports.some((e) => e.kind === "default")).to.equal(true);
2543
- }
2544
- });
2545
- });
2546
- describe("Struct Detection", () => {
2547
- it("should detect struct marker in interface", () => {
2548
- const source = `
2549
- interface struct {
2550
- readonly __brand: "struct";
2551
- }
2552
-
2553
- export interface Point extends struct {
2554
- x: number;
2555
- y: number;
2556
- }
2557
- `;
2558
- const { testProgram, ctx, options } = createTestProgram(source);
2559
- const sourceFile = testProgram.sourceFiles[0];
2560
- if (!sourceFile)
2561
- throw new Error("Failed to create source file");
2562
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2563
- expect(result.ok).to.equal(true);
2564
- if (result.ok) {
2565
- const body = result.value.body;
2566
- const pointInterface = body.find((stmt) => stmt.kind === "interfaceDeclaration" && stmt.name === "Point");
2567
- expect(pointInterface).not.to.equal(undefined);
2568
- if (pointInterface && pointInterface.kind === "interfaceDeclaration") {
2569
- expect(pointInterface.isStruct).to.equal(true);
2570
- // Verify __brand property is filtered out
2571
- expect(pointInterface.members.some((m) => m.kind === "propertySignature" && m.name === "__brand")).to.equal(false);
2572
- }
2573
- }
2574
- });
2575
- it("should detect struct marker in class", () => {
2576
- const source = `
2577
- interface struct {
2578
- readonly __brand: "struct";
2579
- }
2580
-
2581
- export class Vector3D implements struct {
2582
- x: number;
2583
- y: number;
2584
- z: number;
2585
- }
2586
- `;
2587
- const { testProgram, ctx, options } = createTestProgram(source);
2588
- const sourceFile = testProgram.sourceFiles[0];
2589
- if (!sourceFile)
2590
- throw new Error("Failed to create source file");
2591
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2592
- expect(result.ok).to.equal(true);
2593
- if (result.ok) {
2594
- const body = result.value.body;
2595
- const vectorClass = body.find((stmt) => stmt.kind === "classDeclaration" && stmt.name === "Vector3D");
2596
- expect(vectorClass).not.to.equal(undefined);
2597
- if (vectorClass && vectorClass.kind === "classDeclaration") {
2598
- expect(vectorClass.isStruct).to.equal(true);
2599
- // Verify __brand property is filtered out
2600
- expect(vectorClass.members.some((m) => m.kind === "propertyDeclaration" && m.name === "__brand")).to.equal(false);
2601
- }
2602
- }
2603
- });
2604
- it("should not mark regular class as struct", () => {
2605
- const source = `
2606
- export class RegularClass {
2607
- value: number;
2608
- }
2609
- `;
2610
- const { testProgram, ctx, options } = createTestProgram(source);
2611
- const sourceFile = testProgram.sourceFiles[0];
2612
- if (!sourceFile)
2613
- throw new Error("Failed to create source file");
2614
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2615
- expect(result.ok).to.equal(true);
2616
- if (result.ok) {
2617
- const body = result.value.body;
2618
- const regularClass = body[0];
2619
- expect(regularClass).not.to.equal(undefined);
2620
- if (regularClass && regularClass.kind === "classDeclaration") {
2621
- expect(regularClass.isStruct).to.equal(false);
2622
- }
2623
- }
2624
- });
2625
- });
2626
- describe("Implements Clause Handling", () => {
2627
- it("should allow class implements interface (emitter decides CLR shape)", () => {
2628
- const source = `
2629
- interface Printable {
2630
- print(): void;
2631
- }
2632
-
2633
- export class Document implements Printable {
2634
- print(): void {}
2635
- }
2636
- `;
2637
- const { testProgram, ctx, options } = createTestProgram(source);
2638
- const sourceFile = testProgram.sourceFiles[0];
2639
- if (!sourceFile)
2640
- throw new Error("Failed to create source file");
2641
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2642
- expect(result.ok).to.equal(true);
2643
- });
2644
- it("should allow struct marker in implements clause", () => {
2645
- const source = `
2646
- interface struct {
2647
- readonly __brand: "struct";
2648
- }
2649
-
2650
- export class Point implements struct {
2651
- x: number;
2652
- y: number;
2653
- }
2654
- `;
2655
- const { testProgram, ctx, options } = createTestProgram(source);
2656
- const sourceFile = testProgram.sourceFiles[0];
2657
- if (!sourceFile)
2658
- throw new Error("Failed to create source file");
2659
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2660
- expect(result.ok).to.equal(true);
2661
- });
2662
- it("should allow class implements type alias (emitter decides CLR shape)", () => {
2663
- const source = `
2664
- type Serializable = {
2665
- serialize(): string;
2666
- };
2667
-
2668
- export class Config implements Serializable {
2669
- serialize(): string { return "{}"; }
2670
- }
2671
- `;
2672
- const { testProgram, ctx, options } = createTestProgram(source);
2673
- const sourceFile = testProgram.sourceFiles[0];
2674
- if (!sourceFile)
2675
- throw new Error("Failed to create source file");
2676
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2677
- expect(result.ok).to.equal(true);
2678
- });
2679
- it("types Record<string, unknown>.Keys as string[] without unknown poison", () => {
2680
- const source = `
2681
- export function firstKey(settings: Record<string, unknown>): string | undefined {
2682
- const settingsKeys = settings.Keys;
2683
- if (settingsKeys.Length === 0) {
2684
- return undefined;
2685
- }
2686
- return settingsKeys[0];
2687
- }
2688
- `;
2689
- const { testProgram, ctx, options } = createTestProgram(source);
2690
- const sourceFile = testProgram.sourceFiles[0];
2691
- if (!sourceFile)
2692
- throw new Error("Failed to create source file");
2693
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2694
- expect(result.ok).to.equal(true);
2695
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2696
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2697
- if (!result.ok)
2698
- return;
2699
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "firstKey");
2700
- expect(fn).to.not.equal(undefined);
2701
- if (!fn)
2702
- return;
2703
- const keyDecl = fn.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
2704
- stmt.declarations.some((d) => d.name.kind === "identifierPattern" &&
2705
- d.name.name === "settingsKeys"));
2706
- expect(keyDecl).to.not.equal(undefined);
2707
- const keyInit = keyDecl?.declarations[0]?.initializer;
2708
- expect(keyInit?.kind).to.equal("memberAccess");
2709
- if (!keyInit || keyInit.kind !== "memberAccess")
2710
- return;
2711
- expect(keyInit.inferredType).to.deep.equal({
2712
- kind: "arrayType",
2713
- elementType: { kind: "primitiveType", name: "string" },
2714
- });
2715
- });
2716
- it("types Record<string, unknown>.Values as unknown[] deterministically", () => {
2717
- const source = `
2718
- export function firstValue(settings: Record<string, unknown>): unknown | undefined {
2719
- const values = settings.Values;
2720
- return values.Length > 0 ? values[0] : undefined;
2721
- }
2722
- `;
2723
- const { testProgram, ctx, options } = createTestProgram(source);
2724
- const sourceFile = testProgram.sourceFiles[0];
2725
- if (!sourceFile)
2726
- throw new Error("Failed to create source file");
2727
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2728
- expect(result.ok).to.equal(true);
2729
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2730
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2731
- if (!result.ok)
2732
- return;
2733
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "firstValue");
2734
- expect(fn).to.not.equal(undefined);
2735
- if (!fn)
2736
- return;
2737
- const valuesDecl = fn.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
2738
- stmt.declarations.some((d) => d.name.kind === "identifierPattern" && d.name.name === "values"));
2739
- expect(valuesDecl).to.not.equal(undefined);
2740
- const valuesInit = valuesDecl?.declarations[0]?.initializer;
2741
- expect(valuesInit?.kind).to.equal("memberAccess");
2742
- if (!valuesInit || valuesInit.kind !== "memberAccess")
2743
- return;
2744
- expect(valuesInit.inferredType).to.deep.equal({
2745
- kind: "arrayType",
2746
- elementType: { kind: "unknownType" },
2747
- });
2748
- });
2749
- it("allows arbitrary property access on Record<string, unknown> without unknown poison", () => {
2750
- const source = `
2751
- export function fill(): Record<string, unknown> {
2752
- const state: Record<string, unknown> = {};
2753
- state.zulip_version = "1.0";
2754
- state.realm_users = [];
2755
- return state;
2756
- }
2757
- `;
2758
- const { testProgram, ctx, options } = createTestProgram(source);
2759
- const sourceFile = testProgram.sourceFiles[0];
2760
- if (!sourceFile)
2761
- throw new Error("Failed to create source file");
2762
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2763
- expect(result.ok).to.equal(true);
2764
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2765
- });
2766
- it("allows declared unknown members on structural callback parameters", () => {
2767
- const source = `
2768
- export function project(
2769
- rawUpdates: { stream_id: string; property: string; value: unknown }[]
2770
- ): string[] {
2771
- return rawUpdates.map((update) => String(update.value ?? ""));
2772
- }
2773
- `;
2774
- const { testProgram, ctx, options } = createTestProgram(source);
2775
- const sourceFile = testProgram.sourceFiles[0];
2776
- if (!sourceFile)
2777
- throw new Error("Failed to create source file");
2778
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2779
- expect(result.ok).to.equal(true);
2780
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2781
- });
2782
- it("supports indexed access on generic discriminated-union payloads after narrowing", () => {
2783
- const source = `
2784
- type Ok<T> = { success: true; data: T };
2785
- type Err<E> = { success: false; error: E };
2786
- type Result<T, E> = Ok<T> | Err<E>;
2787
-
2788
- declare function listTenants(): Result<{ Id: string }[], string>;
2789
-
2790
- export function run(): string {
2791
- const result = listTenants();
2792
- if (!result.success) {
2793
- return result.error;
2794
- }
2795
-
2796
- const data = result.data;
2797
- return data[0]!.Id;
2798
- }
2799
- `;
2800
- const { testProgram, ctx, options } = createTestProgram(source);
2801
- const sourceFile = testProgram.sourceFiles[0];
2802
- if (!sourceFile)
2803
- throw new Error("Failed to create source file");
2804
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2805
- expect(result.ok).to.equal(true);
2806
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2807
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2808
- if (!result.ok)
2809
- return;
2810
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
2811
- expect(run).to.not.equal(undefined);
2812
- if (!run)
2813
- return;
2814
- const dataDecl = run.body.statements.find((stmt) => stmt.kind === "variableDeclaration" &&
2815
- stmt.declarations.some((declaration) => declaration.name.kind === "identifierPattern" &&
2816
- declaration.name.name === "data"));
2817
- expect(dataDecl).to.not.equal(undefined);
2818
- const dataInit = dataDecl?.declarations[0]?.initializer;
2819
- expect(dataInit?.kind).to.equal("memberAccess");
2820
- if (!dataInit || dataInit.kind !== "memberAccess")
2821
- return;
2822
- expect(dataInit.inferredType?.kind).to.equal("arrayType");
2823
- if (!dataInit.inferredType ||
2824
- dataInit.inferredType.kind !== "arrayType") {
2825
- return;
2826
- }
2827
- expect(dataInit.inferredType.elementType.kind).to.equal("objectType");
2828
- if (dataInit.inferredType.elementType.kind !== "objectType")
2829
- return;
2830
- expect(dataInit.inferredType.elementType.members).to.have.length(1);
2831
- const idMember = dataInit.inferredType.elementType.members[0];
2832
- expect(idMember?.kind).to.equal("propertySignature");
2833
- if (!idMember || idMember.kind !== "propertySignature")
2834
- return;
2835
- expect(idMember.name).to.equal("Id");
2836
- expect(idMember.type).to.deep.equal({
2837
- kind: "primitiveType",
2838
- name: "string",
2839
- });
2840
- expect(idMember.isOptional).to.equal(false);
2841
- expect(idMember.isReadonly).to.equal(false);
2842
- });
2843
- it("treats string-literal element access on narrowed unions like property access", () => {
2844
- const source = `
2845
- type Err = { error: string; code?: string };
2846
- type Ok = { events: string[] };
2847
-
2848
- declare function getEvents(): Err | Ok;
2849
-
2850
- export function run(): string {
2851
- const result = getEvents();
2852
- if ("error" in result) {
2853
- return result["code"] ?? result["error"];
2854
- }
2855
- return result["events"][0] ?? "";
2856
- }
2857
- `;
2858
- const { testProgram, ctx, options } = createTestProgram(source);
2859
- const sourceFile = testProgram.sourceFiles[0];
2860
- if (!sourceFile)
2861
- throw new Error("Failed to create source file");
2862
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2863
- expect(result.ok).to.equal(true);
2864
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2865
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2866
- if (!result.ok)
2867
- return;
2868
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
2869
- expect(run).to.not.equal(undefined);
2870
- if (!run)
2871
- return;
2872
- const ifStmt = run.body.statements.find((stmt) => stmt.kind === "ifStatement");
2873
- expect(ifStmt).to.not.equal(undefined);
2874
- if (!ifStmt || ifStmt.kind !== "ifStatement")
2875
- return;
2876
- const thenReturn = ifStmt.thenStatement.kind === "blockStatement"
2877
- ? ifStmt.thenStatement.statements.find((stmt) => stmt.kind === "returnStatement")
2878
- : undefined;
2879
- expect(thenReturn).to.not.equal(undefined);
2880
- if (!thenReturn ||
2881
- thenReturn.kind !== "returnStatement" ||
2882
- !thenReturn.expression ||
2883
- thenReturn.expression.kind !== "logical") {
2884
- return;
2885
- }
2886
- const codeAccess = thenReturn.expression.left;
2887
- expect(codeAccess.kind).to.equal("memberAccess");
2888
- if (codeAccess.kind !== "memberAccess")
2889
- return;
2890
- expect(codeAccess.accessKind).to.not.equal("unknown");
2891
- expect(codeAccess.inferredType).to.deep.equal({
2892
- kind: "unionType",
2893
- types: [
2894
- { kind: "primitiveType", name: "string" },
2895
- { kind: "primitiveType", name: "undefined" },
2896
- ],
2897
- });
2898
- const finalReturn = [...run.body.statements]
2899
- .reverse()
2900
- .find((stmt) => stmt.kind === "returnStatement");
2901
- expect(finalReturn).to.not.equal(undefined);
2902
- if (!finalReturn ||
2903
- !finalReturn.expression ||
2904
- finalReturn.expression.kind !== "logical" ||
2905
- finalReturn.expression.left.kind !== "memberAccess") {
2906
- return;
2907
- }
2908
- const eventsIndex = finalReturn.expression.left;
2909
- expect(eventsIndex.accessKind).to.equal("clrIndexer");
2910
- expect(eventsIndex.inferredType).to.deep.equal({
2911
- kind: "primitiveType",
2912
- name: "string",
2913
- });
2914
- });
2915
- it("keeps string-literal element access computed for alias-wrapped string dictionaries", () => {
2916
- const source = `
2917
- interface SettingsMap {
2918
- [key: string]: string;
2919
- }
2920
-
2921
- declare function load(): SettingsMap;
2922
-
2923
- export function run(): string | undefined {
2924
- const settings = load();
2925
- return settings["waiting_period_threshold"];
2926
- }
2927
- `;
2928
- const { testProgram, ctx, options } = createTestProgram(source);
2929
- const sourceFile = testProgram.sourceFiles[0];
2930
- if (!sourceFile)
2931
- throw new Error("Failed to create source file");
2932
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2933
- expect(result.ok).to.equal(true);
2934
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2935
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2936
- if (!result.ok)
2937
- return;
2938
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
2939
- expect(run).to.not.equal(undefined);
2940
- if (!run)
2941
- return;
2942
- const returnStmt = run.body.statements.find((stmt) => stmt.kind === "returnStatement");
2943
- expect(returnStmt).to.not.equal(undefined);
2944
- if (!returnStmt?.expression)
2945
- return;
2946
- expect(returnStmt.expression.kind).to.equal("memberAccess");
2947
- if (returnStmt.expression.kind !== "memberAccess")
2948
- return;
2949
- expect(returnStmt.expression.isComputed).to.equal(true);
2950
- expect(returnStmt.expression.accessKind).to.equal("dictionary");
2951
- });
2952
- it("keeps string-literal element access computed after generic return narrowing", () => {
2953
- const source = `
2954
- type SettingsMap = { [key: string]: string };
2955
-
2956
- declare const JsonSerializer: {
2957
- Deserialize<T>(json: string): T | undefined;
2958
- };
2959
-
2960
- export function run(json: string): string | undefined {
2961
- const settingsOrNull = JsonSerializer.Deserialize<SettingsMap>(json);
2962
- if (settingsOrNull === undefined) {
2963
- return undefined;
2964
- }
2965
- const settings = settingsOrNull;
2966
- return settings["waiting_period_threshold"];
2967
- }
2968
- `;
2969
- const { testProgram, ctx, options } = createTestProgram(source);
2970
- const sourceFile = testProgram.sourceFiles[0];
2971
- if (!sourceFile)
2972
- throw new Error("Failed to create source file");
2973
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
2974
- expect(result.ok).to.equal(true);
2975
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
2976
- expect(ctx.diagnostics.some((d) => d.code === "TSN5107")).to.equal(false);
2977
- if (!result.ok)
2978
- return;
2979
- const run = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "run");
2980
- expect(run).to.not.equal(undefined);
2981
- if (!run)
2982
- return;
2983
- const returnStmt = [...run.body.statements]
2984
- .reverse()
2985
- .find((stmt) => stmt.kind === "returnStatement");
2986
- expect(returnStmt).to.not.equal(undefined);
2987
- if (!returnStmt?.expression)
2988
- return;
2989
- expect(returnStmt.expression.kind).to.equal("memberAccess");
2990
- if (returnStmt.expression.kind !== "memberAccess")
2991
- return;
2992
- expect(returnStmt.expression.isComputed).to.equal(true);
2993
- expect(returnStmt.expression.accessKind).to.equal("dictionary");
2994
- });
2995
- it("types inferred array Length access as int without unknown poison", () => {
2996
- const source = `
2997
- export function count(items: string[]): int {
2998
- const copy = items;
2999
- return copy.Length;
3000
- }
3001
- `;
3002
- const { testProgram, ctx, options } = createTestProgram(source);
3003
- const sourceFile = testProgram.sourceFiles[0];
3004
- if (!sourceFile)
3005
- throw new Error("Failed to create source file");
3006
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
3007
- expect(result.ok).to.equal(true);
3008
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
3009
- if (!result.ok)
3010
- return;
3011
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "count");
3012
- expect(fn).to.not.equal(undefined);
3013
- if (!fn)
3014
- return;
3015
- const returnStmt = fn.body.statements.find((s) => s.kind === "returnStatement");
3016
- expect(returnStmt).to.not.equal(undefined);
3017
- if (!returnStmt ||
3018
- returnStmt.kind !== "returnStatement" ||
3019
- !returnStmt.expression)
3020
- return;
3021
- expect(returnStmt.expression.kind).to.equal("memberAccess");
3022
- if (returnStmt.expression.kind !== "memberAccess")
3023
- return;
3024
- expect(returnStmt.expression.inferredType).to.deep.equal({
3025
- kind: "primitiveType",
3026
- name: "int",
3027
- });
3028
- });
3029
- it("types tuple Length access as int without unknown poison", () => {
3030
- const source = `
3031
- export function tupleCount(pair: [string, int]): int {
3032
- return pair.Length;
3033
- }
3034
- `;
3035
- const { testProgram, ctx, options } = createTestProgram(source);
3036
- const sourceFile = testProgram.sourceFiles[0];
3037
- if (!sourceFile)
3038
- throw new Error("Failed to create source file");
3039
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
3040
- expect(result.ok).to.equal(true);
3041
- expect(ctx.diagnostics.some((d) => d.code === "TSN5203")).to.equal(false);
3042
- if (!result.ok)
3043
- return;
3044
- const fn = result.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "tupleCount");
3045
- expect(fn).to.not.equal(undefined);
3046
- if (!fn)
3047
- return;
3048
- const returnStmt = fn.body.statements.find((s) => s.kind === "returnStatement");
3049
- expect(returnStmt).to.not.equal(undefined);
3050
- if (!returnStmt ||
3051
- returnStmt.kind !== "returnStatement" ||
3052
- !returnStmt.expression)
3053
- return;
3054
- expect(returnStmt.expression.kind).to.equal("memberAccess");
3055
- if (returnStmt.expression.kind !== "memberAccess")
3056
- return;
3057
- expect(returnStmt.expression.inferredType).to.deep.equal({
3058
- kind: "primitiveType",
3059
- name: "int",
3060
- });
3061
- });
3062
- });
3063
- describe("For-Await Loop Conversion", () => {
3064
- it("should set isAwait=true for 'for await' loop", () => {
3065
- const source = `
3066
- async function process(items: AsyncIterable<string>): Promise<void> {
3067
- for await (const item of items) {
3068
- console.log(item);
3069
- }
3070
- }
3071
- `;
3072
- const { testProgram, ctx, options } = createTestProgram(source);
3073
- const sourceFile = testProgram.sourceFiles[0];
3074
- if (!sourceFile)
3075
- throw new Error("Failed to create source file");
3076
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
3077
- expect(result.ok).to.equal(true);
3078
- if (result.ok) {
3079
- const func = result.value.body[0];
3080
- if (func?.kind !== "functionDeclaration") {
3081
- throw new Error("Expected function declaration");
3082
- }
3083
- const forAwaitStmt = func.body.statements[0];
3084
- if (forAwaitStmt?.kind !== "forOfStatement") {
3085
- throw new Error("Expected forOfStatement");
3086
- }
3087
- expect(forAwaitStmt.isAwait).to.equal(true);
3088
- }
3089
- });
3090
- it("should set isAwait=false for regular 'for of' loop", () => {
3091
- const source = `
3092
- function process(items: string[]): void {
3093
- for (const item of items) {
3094
- console.log(item);
3095
- }
3096
- }
3097
- `;
3098
- const { testProgram, ctx, options } = createTestProgram(source);
3099
- const sourceFile = testProgram.sourceFiles[0];
3100
- if (!sourceFile)
3101
- throw new Error("Failed to create source file");
3102
- const result = buildIrModule(sourceFile, testProgram, options, ctx);
3103
- expect(result.ok).to.equal(true);
3104
- if (result.ok) {
3105
- const func = result.value.body[0];
3106
- if (func?.kind !== "functionDeclaration") {
3107
- throw new Error("Expected function declaration");
3108
- }
3109
- const forOfStmt = func.body.statements[0];
3110
- if (forOfStmt?.kind !== "forOfStatement") {
3111
- throw new Error("Expected forOfStatement");
3112
- }
3113
- expect(forOfStmt.isAwait).to.equal(false);
3114
- }
3115
- });
3116
- it("threads Map entry tuple element types into for-of bodies", () => {
3117
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-for-of-map-entries-"));
3118
- try {
3119
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
3120
- const srcDir = path.join(tempDir, "src");
3121
- fs.mkdirSync(srcDir, { recursive: true });
3122
- const entryPath = path.join(srcDir, "index.ts");
3123
- fs.writeFileSync(entryPath, [
3124
- "export function process(menuBuilders: Map<string, string[]>): void {",
3125
- " for (const [menuName, builders] of menuBuilders) {",
3126
- " const first = builders[0];",
3127
- " console.log(menuName, first);",
3128
- " }",
3129
- "}",
3130
- ].join("\n"));
3131
- const programResult = createProgram([entryPath], {
3132
- projectRoot: tempDir,
3133
- sourceRoot: srcDir,
3134
- rootNamespace: "TestApp",
3135
- surface: "@tsonic/js",
3136
- });
3137
- expect(programResult.ok).to.equal(true);
3138
- if (!programResult.ok)
3139
- return;
3140
- const program = programResult.value;
3141
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
3142
- expect(sourceFile).to.not.equal(undefined);
3143
- if (!sourceFile)
3144
- return;
3145
- const ctx = createProgramContext(program, {
3146
- sourceRoot: srcDir,
3147
- rootNamespace: "TestApp",
3148
- });
3149
- const moduleResult = buildIrModule(sourceFile, program, {
3150
- sourceRoot: srcDir,
3151
- rootNamespace: "TestApp",
3152
- }, ctx);
3153
- expect(moduleResult.ok).to.equal(true);
3154
- if (!moduleResult.ok)
3155
- return;
3156
- const fn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "process");
3157
- expect(fn).to.not.equal(undefined);
3158
- if (!fn)
3159
- return;
3160
- const loop = fn.body.statements[0];
3161
- expect(loop?.kind).to.equal("forOfStatement");
3162
- if (!loop || loop.kind !== "forOfStatement")
3163
- return;
3164
- expect(loop.variable.kind).to.equal("arrayPattern");
3165
- if (loop.variable.kind !== "arrayPattern")
3166
- return;
3167
- const tupleElements = loop.variable.elements;
3168
- expect(tupleElements[0]?.pattern).to.deep.equal({
3169
- kind: "identifierPattern",
3170
- name: "menuName",
3171
- });
3172
- expect(tupleElements[1]?.pattern).to.deep.equal({
3173
- kind: "identifierPattern",
3174
- name: "builders",
3175
- });
3176
- const loopBody = loop.body;
3177
- expect(loopBody.kind).to.equal("blockStatement");
3178
- if (loopBody.kind !== "blockStatement")
3179
- return;
3180
- const firstDecl = loopBody.statements[0];
3181
- expect(firstDecl?.kind).to.equal("variableDeclaration");
3182
- if (!firstDecl || firstDecl.kind !== "variableDeclaration")
3183
- return;
3184
- const initializer = firstDecl.declarations[0]?.initializer;
3185
- expect(initializer?.kind).to.equal("memberAccess");
3186
- if (!initializer || initializer.kind !== "memberAccess")
3187
- return;
3188
- expect(initializer.object.kind).to.equal("identifier");
3189
- if (initializer.object.kind !== "identifier")
3190
- return;
3191
- expect(initializer.object.inferredType).to.deep.equal({
3192
- kind: "arrayType",
3193
- elementType: { kind: "primitiveType", name: "string" },
3194
- origin: "explicit",
3195
- });
3196
- expect(initializer.accessKind).to.equal("clrIndexer");
3197
- expect(initializer.inferredType).to.deep.equal({
3198
- kind: "primitiveType",
3199
- name: "string",
3200
- });
3201
- }
3202
- finally {
3203
- fs.rmSync(tempDir, { recursive: true, force: true });
3204
- }
3205
- });
3206
- it("threads Iterable<T> element types from values() into for-of bodies", () => {
3207
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-for-of-iterable-values-"));
3208
- try {
3209
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
3210
- const srcDir = path.join(tempDir, "src");
3211
- fs.mkdirSync(srcDir, { recursive: true });
3212
- const entryPath = path.join(srcDir, "index.ts");
3213
- fs.writeFileSync(entryPath, [
3214
- "export function process(menus: Map<string, string[]>): void {",
3215
- " for (const entries of menus.values()) {",
3216
- " const first = entries[0];",
3217
- " console.log(first);",
3218
- " }",
3219
- "}",
3220
- ].join("\n"));
3221
- const programResult = createProgram([entryPath], {
3222
- projectRoot: tempDir,
3223
- sourceRoot: srcDir,
3224
- rootNamespace: "TestApp",
3225
- surface: "@tsonic/js",
3226
- });
3227
- expect(programResult.ok).to.equal(true);
3228
- if (!programResult.ok)
3229
- return;
3230
- const program = programResult.value;
3231
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
3232
- expect(sourceFile).to.not.equal(undefined);
3233
- if (!sourceFile)
3234
- return;
3235
- const ctx = createProgramContext(program, {
3236
- sourceRoot: srcDir,
3237
- rootNamespace: "TestApp",
3238
- });
3239
- const moduleResult = buildIrModule(sourceFile, program, {
3240
- sourceRoot: srcDir,
3241
- rootNamespace: "TestApp",
3242
- }, ctx);
3243
- expect(moduleResult.ok).to.equal(true);
3244
- if (!moduleResult.ok)
3245
- return;
3246
- const fn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "process");
3247
- expect(fn).to.not.equal(undefined);
3248
- if (!fn)
3249
- return;
3250
- const loop = fn.body.statements[0];
3251
- expect(loop?.kind).to.equal("forOfStatement");
3252
- if (!loop || loop.kind !== "forOfStatement")
3253
- return;
3254
- expect(loop.variable).to.deep.equal({
3255
- kind: "identifierPattern",
3256
- name: "entries",
3257
- });
3258
- const loopBody = loop.body;
3259
- expect(loopBody.kind).to.equal("blockStatement");
3260
- if (loopBody.kind !== "blockStatement")
3261
- return;
3262
- const firstDecl = loopBody.statements[0];
3263
- expect(firstDecl?.kind).to.equal("variableDeclaration");
3264
- if (!firstDecl || firstDecl.kind !== "variableDeclaration")
3265
- return;
3266
- const initializer = firstDecl.declarations[0]?.initializer;
3267
- expect(initializer?.kind).to.equal("memberAccess");
3268
- if (!initializer || initializer.kind !== "memberAccess")
3269
- return;
3270
- expect(initializer.object.kind).to.equal("identifier");
3271
- if (initializer.object.kind !== "identifier")
3272
- return;
3273
- expect(initializer.object.inferredType).to.deep.equal({
3274
- kind: "arrayType",
3275
- elementType: { kind: "primitiveType", name: "string" },
3276
- origin: "explicit",
3277
- });
3278
- expect(initializer.accessKind).to.equal("clrIndexer");
3279
- expect(initializer.inferredType).to.deep.equal({
3280
- kind: "primitiveType",
3281
- name: "string",
3282
- });
3283
- }
3284
- finally {
3285
- fs.rmSync(tempDir, { recursive: true, force: true });
3286
- }
3287
- });
3288
- it("threads generic surface root global bindings into identifier callees", () => {
3289
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-generic-surface-globals-"));
3290
- try {
3291
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
3292
- const srcDir = path.join(tempDir, "src");
3293
- fs.mkdirSync(srcDir, { recursive: true });
3294
- const surfaceRoot = path.join(tempDir, "node_modules/@fixture/js");
3295
- fs.mkdirSync(surfaceRoot, { recursive: true });
3296
- fs.writeFileSync(path.join(surfaceRoot, "package.json"), JSON.stringify({ name: "@fixture/js", version: "1.0.0", type: "module" }, null, 2));
3297
- fs.writeFileSync(path.join(surfaceRoot, "index.js"), "export {};\n");
3298
- fs.writeFileSync(path.join(surfaceRoot, "index.d.ts"), [
3299
- 'import type { int } from "@tsonic/core/types.js";',
3300
- "",
3301
- "declare global {",
3302
- " const console: {",
3303
- " log(...data: unknown[]): void;",
3304
- " };",
3305
- " function setInterval(handler: (...args: unknown[]) => void, timeout?: int, ...args: unknown[]): int;",
3306
- " function clearInterval(id: int): void;",
3307
- "}",
3308
- "",
3309
- "export {};",
3310
- "",
3311
- ].join("\n"));
3312
- fs.writeFileSync(path.join(surfaceRoot, "bindings.json"), JSON.stringify({
3313
- bindings: {
3314
- console: {
3315
- kind: "global",
3316
- assembly: "Tsonic.JSRuntime",
3317
- type: "Tsonic.JSRuntime.console",
3318
- },
3319
- setInterval: {
3320
- kind: "global",
3321
- assembly: "Tsonic.JSRuntime",
3322
- type: "Tsonic.JSRuntime.Timers",
3323
- csharpName: "Timers.setInterval",
3324
- },
3325
- clearInterval: {
3326
- kind: "global",
3327
- assembly: "Tsonic.JSRuntime",
3328
- type: "Tsonic.JSRuntime.Timers",
3329
- csharpName: "Timers.clearInterval",
3330
- },
3331
- },
3332
- }, null, 2));
3333
- fs.writeFileSync(path.join(surfaceRoot, "tsonic.surface.json"), JSON.stringify({
3334
- schemaVersion: 1,
3335
- id: "@fixture/js",
3336
- extends: [],
3337
- requiredTypeRoots: ["."],
3338
- useStandardLib: false,
3339
- }, null, 2));
3340
- const entryPath = path.join(srcDir, "index.ts");
3341
- fs.writeFileSync(entryPath, [
3342
- "export function main(): void {",
3343
- " const id = setInterval(() => {}, 1000);",
3344
- " clearInterval(id);",
3345
- ' console.log("tick");',
3346
- "}",
3347
- ].join("\n"));
3348
- const programResult = createProgram([entryPath], {
3349
- projectRoot: tempDir,
3350
- sourceRoot: srcDir,
3351
- rootNamespace: "TestApp",
3352
- surface: "@fixture/js",
3353
- useStandardLib: false,
3354
- });
3355
- expect(programResult.ok).to.equal(true);
3356
- if (!programResult.ok)
3357
- return;
3358
- const program = programResult.value;
3359
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
3360
- expect(sourceFile).to.not.equal(undefined);
3361
- if (!sourceFile)
3362
- return;
3363
- const ctx = createProgramContext(program, {
3364
- sourceRoot: srcDir,
3365
- rootNamespace: "TestApp",
3366
- });
3367
- const moduleResult = buildIrModule(sourceFile, program, {
3368
- sourceRoot: srcDir,
3369
- rootNamespace: "TestApp",
3370
- }, ctx);
3371
- expect(moduleResult.ok).to.equal(true);
3372
- if (!moduleResult.ok)
3373
- return;
3374
- const fn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "main");
3375
- expect(fn).to.not.equal(undefined);
3376
- if (!fn)
3377
- return;
3378
- const firstStmt = fn.body.statements[0];
3379
- expect(firstStmt?.kind).to.equal("variableDeclaration");
3380
- if (!firstStmt || firstStmt.kind !== "variableDeclaration")
3381
- return;
3382
- const setIntervalCall = firstStmt.declarations[0]?.initializer;
3383
- expect(setIntervalCall?.kind).to.equal("call");
3384
- if (!setIntervalCall || setIntervalCall.kind !== "call")
3385
- return;
3386
- expect(setIntervalCall.callee.kind).to.equal("identifier");
3387
- if (setIntervalCall.callee.kind !== "identifier")
3388
- return;
3389
- expect(setIntervalCall.callee.name).to.equal("setInterval");
3390
- expect(setIntervalCall.callee.resolvedClrType).to.equal("Tsonic.JSRuntime.Timers");
3391
- expect(setIntervalCall.callee.resolvedAssembly).to.equal("Tsonic.JSRuntime");
3392
- expect(setIntervalCall.callee.csharpName).to.equal("Timers.setInterval");
3393
- const clearIntervalStmt = fn.body.statements[1];
3394
- expect(clearIntervalStmt?.kind).to.equal("expressionStatement");
3395
- if (!clearIntervalStmt ||
3396
- clearIntervalStmt.kind !== "expressionStatement")
3397
- return;
3398
- const clearIntervalCall = clearIntervalStmt.expression;
3399
- expect(clearIntervalCall.kind).to.equal("call");
3400
- if (clearIntervalCall.kind !== "call")
3401
- return;
3402
- expect(clearIntervalCall.callee.kind).to.equal("identifier");
3403
- if (clearIntervalCall.callee.kind !== "identifier")
3404
- return;
3405
- expect(clearIntervalCall.callee.csharpName).to.equal("Timers.clearInterval");
3406
- }
3407
- finally {
3408
- fs.rmSync(tempDir, { recursive: true, force: true });
3409
- }
3410
- });
3411
- it("converts regex literals into RegExp constructor expressions on js surface", () => {
3412
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-js-regex-literal-"));
3413
- try {
3414
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
3415
- const srcDir = path.join(tempDir, "src");
3416
- fs.mkdirSync(srcDir, { recursive: true });
3417
- const entryPath = path.join(srcDir, "index.ts");
3418
- fs.writeFileSync(entryPath, [
3419
- "export function isUpper(text: string): boolean {",
3420
- " return /^[A-Z]+$/i.test(text);",
3421
- "}",
3422
- ].join("\n"));
3423
- const programResult = createProgram([entryPath], {
3424
- projectRoot: tempDir,
3425
- sourceRoot: srcDir,
3426
- rootNamespace: "TestApp",
3427
- surface: "@tsonic/js",
3428
- useStandardLib: false,
3429
- });
3430
- expect(programResult.ok).to.equal(true);
3431
- if (!programResult.ok)
3432
- return;
3433
- const program = programResult.value;
3434
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
3435
- expect(sourceFile).to.not.equal(undefined);
3436
- if (!sourceFile)
3437
- return;
3438
- const ctx = createProgramContext(program, {
3439
- sourceRoot: srcDir,
3440
- rootNamespace: "TestApp",
3441
- });
3442
- const moduleResult = buildIrModule(sourceFile, program, {
3443
- sourceRoot: srcDir,
3444
- rootNamespace: "TestApp",
3445
- }, ctx);
3446
- expect(moduleResult.ok).to.equal(true);
3447
- if (!moduleResult.ok)
3448
- return;
3449
- const fn = moduleResult.value.body.find((stmt) => stmt.kind === "functionDeclaration" && stmt.name === "isUpper");
3450
- expect(fn).to.not.equal(undefined);
3451
- if (!fn)
3452
- return;
3453
- const returnStmt = fn.body.statements[0];
3454
- expect(returnStmt?.kind).to.equal("returnStatement");
3455
- if (!returnStmt || returnStmt.kind !== "returnStatement")
3456
- return;
3457
- const testCall = returnStmt.expression;
3458
- expect(testCall?.kind).to.equal("call");
3459
- if (!testCall || testCall.kind !== "call")
3460
- return;
3461
- expect(testCall.callee.kind).to.equal("memberAccess");
3462
- if (testCall.callee.kind !== "memberAccess")
3463
- return;
3464
- const regexCtor = testCall.callee.object;
3465
- expect(regexCtor.kind).to.equal("new");
3466
- if (regexCtor.kind !== "new")
3467
- return;
3468
- expect(regexCtor.callee.kind).to.equal("identifier");
3469
- if (regexCtor.callee.kind !== "identifier")
3470
- return;
3471
- expect(regexCtor.callee.name).to.equal("RegExp");
3472
- expect(regexCtor.callee.resolvedClrType).to.equal("Tsonic.JSRuntime.RegExp");
3473
- expect(regexCtor.arguments).to.deep.equal([
3474
- {
3475
- kind: "literal",
3476
- value: "^[A-Z]+$",
3477
- raw: JSON.stringify("^[A-Z]+$"),
3478
- inferredType: { kind: "primitiveType", name: "string" },
3479
- sourceSpan: regexCtor.arguments[0]?.sourceSpan,
3480
- },
3481
- {
3482
- kind: "literal",
3483
- value: "i",
3484
- raw: JSON.stringify("i"),
3485
- inferredType: { kind: "primitiveType", name: "string" },
3486
- sourceSpan: regexCtor.arguments[1]?.sourceSpan,
3487
- },
3488
- ]);
3489
- }
3490
- finally {
3491
- fs.rmSync(tempDir, { recursive: true, force: true });
3492
- }
3493
- });
3494
- it("preserves spread-only array element types on js surface", () => {
3495
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-builder-js-spread-array-"));
3496
- try {
3497
- fs.writeFileSync(path.join(tempDir, "package.json"), JSON.stringify({ name: "app", version: "1.0.0", type: "module" }, null, 2));
3498
- const srcDir = path.join(tempDir, "src");
3499
- fs.mkdirSync(srcDir, { recursive: true });
3500
- const entryPath = path.join(srcDir, "index.ts");
3501
- fs.writeFileSync(entryPath, [
3502
- "type MenuEntry = { weight: number };",
3503
- "export const sortMenuEntries = (entries: MenuEntry[]): MenuEntry[] => {",
3504
- " return [...entries].sort((a: MenuEntry, b: MenuEntry) => a.weight - b.weight);",
3505
- "};",
3506
- ].join("\n"));
3507
- const programResult = createProgram([entryPath], {
3508
- projectRoot: tempDir,
3509
- sourceRoot: srcDir,
3510
- rootNamespace: "TestApp",
3511
- surface: "@tsonic/js",
3512
- useStandardLib: false,
3513
- });
3514
- expect(programResult.ok).to.equal(true);
3515
- if (!programResult.ok)
3516
- return;
3517
- const program = programResult.value;
3518
- const sourceFile = program.sourceFiles.find((file) => path.resolve(file.fileName) === path.resolve(entryPath));
3519
- expect(sourceFile).to.not.equal(undefined);
3520
- if (!sourceFile)
3521
- return;
3522
- const ctx = createProgramContext(program, {
3523
- sourceRoot: srcDir,
3524
- rootNamespace: "TestApp",
3525
- });
3526
- const moduleResult = buildIrModule(sourceFile, program, {
3527
- sourceRoot: srcDir,
3528
- rootNamespace: "TestApp",
3529
- }, ctx);
3530
- expect(moduleResult.ok).to.equal(true);
3531
- if (!moduleResult.ok)
3532
- return;
3533
- const sortDecl = moduleResult.value.body.find((stmt) => stmt.kind === "variableDeclaration" &&
3534
- stmt.declarations[0]?.name.kind === "identifierPattern" &&
3535
- stmt.declarations[0]?.name.name === "sortMenuEntries");
3536
- expect(sortDecl).to.not.equal(undefined);
3537
- if (!sortDecl)
3538
- return;
3539
- const initializer = sortDecl.declarations[0]?.initializer;
3540
- expect(initializer?.kind).to.equal("arrowFunction");
3541
- if (!initializer || initializer.kind !== "arrowFunction")
3542
- return;
3543
- expect(initializer.body.kind).to.equal("blockStatement");
3544
- if (initializer.body.kind !== "blockStatement")
3545
- return;
3546
- const returnStmt = initializer.body.statements[0];
3547
- expect(returnStmt?.kind).to.equal("returnStatement");
3548
- if (!returnStmt || returnStmt.kind !== "returnStatement")
3549
- return;
3550
- const sortCall = returnStmt.expression;
3551
- expect(sortCall?.kind).to.equal("call");
3552
- if (!sortCall || sortCall.kind !== "call")
3553
- return;
3554
- expect(sortCall.callee.kind).to.equal("memberAccess");
3555
- if (sortCall.callee.kind !== "memberAccess")
3556
- return;
3557
- expect(sortCall.callee.object.kind).to.equal("array");
3558
- if (sortCall.callee.object.kind !== "array")
3559
- return;
3560
- const inferredType = sortCall.callee.object.inferredType;
3561
- expect(inferredType?.kind).to.equal("arrayType");
3562
- if (!inferredType || inferredType.kind !== "arrayType")
3563
- return;
3564
- expect(inferredType.elementType.kind).to.equal("referenceType");
3565
- if (inferredType.elementType.kind !== "referenceType")
3566
- return;
3567
- expect(inferredType.elementType.name).to.equal("MenuEntry");
3568
- const weightMember = inferredType.elementType.structuralMembers?.find((member) => member.kind === "propertySignature" && member.name === "weight");
3569
- expect(weightMember).to.not.equal(undefined);
3570
- expect(weightMember?.kind).to.equal("propertySignature");
3571
- if (!weightMember || weightMember.kind !== "propertySignature")
3572
- return;
3573
- expect(weightMember.type).to.deep.equal({
3574
- kind: "primitiveType",
3575
- name: "number",
3576
- });
3577
- }
3578
- finally {
3579
- fs.rmSync(tempDir, { recursive: true, force: true });
3580
- }
3581
- });
3582
- });
3583
- });
1
+ import "./builder-cases/call-inference-generics/alias-cache.test.js";
2
+ import "./builder-cases/call-inference-generics/context-threading.test.js";
3
+ import "./builder-cases/clr-identity.test.js";
4
+ import "./builder-cases/clr-iterable-overload-resolution.test.js";
5
+ import "./builder-cases/conditional-narrowing.test.js";
6
+ import "./builder-cases/contextual-typing-middleware.test.js";
7
+ import "./builder-cases/expression-conversion.test.js";
8
+ import "./builder-cases/fluent-and-nullable-params.test.js";
9
+ import "./builder-cases/for-of-loops.test.js";
10
+ import "./builder-cases/implements-and-struct.test.js";
11
+ import "./builder-cases/import-extraction.test.js";
12
+ import "./builder-cases/installed-source-package-deterministic-typing.test.js";
13
+ import "./builder-cases/invocation-flow-assertions.test.js";
14
+ import "./builder-cases/js-surface-helpers.test.js";
15
+ import "./builder-cases/module-structure-and-exports.test.js";
16
+ import "./builder-cases/namespace-imports-and-function-narrowing.test.js";
17
+ import "./builder-cases/narrowing-isarray-and-typeof.test.js";
18
+ import "./builder-cases/object-exports-and-member-inference.test.js";
19
+ import "./builder-cases/object-synthesis-advanced.test.js";
20
+ import "./builder-cases/object-synthesis.test.js";
21
+ import "./builder-cases/overload-family-markers.test.js";
22
+ import "./builder-cases/private-members-and-instanceof.test.js";
23
+ import "./builder-cases/promise-callback-typing.test.js";
24
+ import "./builder-cases/recursive-aliases-and-flow-types.test.js";
25
+ import "./builder-cases/statement-conversion.test.js";
26
+ import "./builder-cases/type-access-and-records.test.js";
27
+ import "./builder-cases/typeof-narrowing-and-intrinsics.test.js";
3584
28
  //# sourceMappingURL=builder.test.js.map