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