@scriptc/compiler 0.3.5 → 0.4.0

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 (1243) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +960 -82
  2. package/ambient/scriptc.d.ts +134 -0
  3. package/dist/backend/cycle-analysis.d.ts +1 -1
  4. package/dist/backend/cycle-analysis.js +1 -0
  5. package/dist/backend/cycle-analysis.js.map +1 -1
  6. package/dist/backend/cycle-analysis.test.js +13 -1
  7. package/dist/backend/cycle-analysis.test.js.map +1 -1
  8. package/dist/backend/cycle-mutability.js +16 -5
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +13 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.test.js +1 -1
  13. package/dist/backend/library-pack.js +6 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +41 -4
  16. package/dist/backend/llvm/alloc.js +138 -7
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/alloc.test.js +30 -1
  19. package/dist/backend/llvm/alloc.test.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  21. package/dist/backend/llvm/array-search.test.js +1 -1
  22. package/dist/backend/llvm/blocks.d.ts +8 -0
  23. package/dist/backend/llvm/blocks.js +43 -1
  24. package/dist/backend/llvm/blocks.js.map +1 -1
  25. package/dist/backend/llvm/blocks.test.js +22 -1
  26. package/dist/backend/llvm/blocks.test.js.map +1 -1
  27. package/dist/backend/llvm/byte-numbers.js +15 -5
  28. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  29. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  30. package/dist/backend/llvm/bytes-alias.js +20 -0
  31. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  32. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  33. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  34. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  35. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  36. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  37. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  38. package/dist/backend/llvm/call-lifetimes.js +50 -1
  39. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  40. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  41. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  42. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  43. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  44. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  45. package/dist/backend/llvm/classes.d.ts +11 -0
  46. package/dist/backend/llvm/classes.js +71 -14
  47. package/dist/backend/llvm/classes.js.map +1 -1
  48. package/dist/backend/llvm/classes.test.js +58 -8
  49. package/dist/backend/llvm/classes.test.js.map +1 -1
  50. package/dist/backend/llvm/common.js +1 -0
  51. package/dist/backend/llvm/common.js.map +1 -1
  52. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  53. package/dist/backend/llvm/constant-callbacks.js +55 -12
  54. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  56. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  57. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  58. package/dist/backend/llvm/counted-loops.js +37 -0
  59. package/dist/backend/llvm/counted-loops.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.d.ts +12 -3
  61. package/dist/backend/llvm/dense-array-access.js +72 -14
  62. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  63. package/dist/backend/llvm/dense-array-access.test.js +59 -3
  64. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  66. package/dist/backend/llvm/dense-array-loops.js +162 -0
  67. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  68. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  69. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  70. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  71. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  72. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  73. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  74. package/dist/backend/llvm/dyn.d.ts +28 -4
  75. package/dist/backend/llvm/dyn.js +324 -179
  76. package/dist/backend/llvm/dyn.js.map +1 -1
  77. package/dist/backend/llvm/emit-function.d.ts +64 -0
  78. package/dist/backend/llvm/emit-function.js +1190 -0
  79. package/dist/backend/llvm/emit-function.js.map +1 -0
  80. package/dist/backend/llvm/emit-module.d.ts +24 -0
  81. package/dist/backend/llvm/emit-module.js +1535 -0
  82. package/dist/backend/llvm/emit-module.js.map +1 -0
  83. package/dist/backend/llvm/emit-statements.d.ts +58 -0
  84. package/dist/backend/llvm/emit-statements.js +1964 -0
  85. package/dist/backend/llvm/emit-statements.js.map +1 -0
  86. package/dist/backend/llvm/emitter.d.ts +576 -268
  87. package/dist/backend/llvm/emitter.js +801 -4447
  88. package/dist/backend/llvm/emitter.js.map +1 -1
  89. package/dist/backend/llvm/emitter.test.js +57 -3
  90. package/dist/backend/llvm/emitter.test.js.map +1 -1
  91. package/dist/backend/llvm/expr-async.js +73 -46
  92. package/dist/backend/llvm/expr-async.js.map +1 -1
  93. package/dist/backend/llvm/expr-async.test.js +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  95. package/dist/backend/llvm/expr-bytes.js +76 -29
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  98. package/dist/backend/llvm/expr-callbacks.js +48 -11
  99. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  100. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  101. package/dist/backend/llvm/expr-calls.js +71 -53
  102. package/dist/backend/llvm/expr-calls.js.map +1 -1
  103. package/dist/backend/llvm/expr-calls.test.js +1 -1
  104. package/dist/backend/llvm/expr-containers.js +39 -15
  105. package/dist/backend/llvm/expr-containers.js.map +1 -1
  106. package/dist/backend/llvm/expr-control.js +16 -16
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dispatch.js +1 -0
  109. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  110. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  111. package/dist/backend/llvm/expr-dynamic.js +92 -63
  112. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  113. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  114. package/dist/backend/llvm/expr-primitives.js +132 -25
  115. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  116. package/dist/backend/llvm/expr-primitives.test.js +2 -2
  117. package/dist/backend/llvm/expr-records.d.ts +1 -1
  118. package/dist/backend/llvm/expr-records.js +32 -11
  119. package/dist/backend/llvm/expr-records.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.js +54 -12
  121. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-abi.test.js +2 -2
  126. package/dist/backend/llvm/integer-clones.test.js +3 -3
  127. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  128. package/dist/backend/llvm/integer-remainder.js +156 -22
  129. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  130. package/dist/backend/llvm/intern-tables.test.js +1 -1
  131. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  132. package/dist/backend/llvm/jsval-encoding.js +20 -0
  133. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  134. package/dist/backend/llvm/jsval.d.ts +12 -0
  135. package/dist/backend/llvm/jsval.js +488 -0
  136. package/dist/backend/llvm/jsval.js.map +1 -0
  137. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  138. package/dist/backend/llvm/lazy-captures.js +39 -17
  139. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  140. package/dist/backend/llvm/lib-abi.js +1 -1
  141. package/dist/backend/llvm/lib-abi.js.map +1 -1
  142. package/dist/backend/llvm/lib-connect.js +1 -1
  143. package/dist/backend/llvm/lib-connect.js.map +1 -1
  144. package/dist/backend/llvm/lib-datagram.js +14 -8
  145. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  146. package/dist/backend/llvm/lib-dispatch.js +217 -24
  147. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  148. package/dist/backend/llvm/lib-filesystem.js +102 -13
  149. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  150. package/dist/backend/llvm/lib-http2.js +3 -3
  151. package/dist/backend/llvm/lib-http2.js.map +1 -1
  152. package/dist/backend/llvm/lib-lookup.js +2 -2
  153. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  154. package/dist/backend/llvm/lib-network.js +77 -25
  155. package/dist/backend/llvm/lib-network.js.map +1 -1
  156. package/dist/backend/llvm/lib-process.js +100 -50
  157. package/dist/backend/llvm/lib-process.js.map +1 -1
  158. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  159. package/dist/backend/llvm/lib-shared.js +229 -5
  160. package/dist/backend/llvm/lib-shared.js.map +1 -1
  161. package/dist/backend/llvm/lib-stream.js +46 -16
  162. package/dist/backend/llvm/lib-stream.js.map +1 -1
  163. package/dist/backend/llvm/lib-test.js +57 -8
  164. package/dist/backend/llvm/lib-test.js.map +1 -1
  165. package/dist/backend/llvm/lib-tls.js +4 -9
  166. package/dist/backend/llvm/lib-tls.js.map +1 -1
  167. package/dist/backend/llvm/local-array-reads.js +2 -2
  168. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  169. package/dist/backend/llvm/local-extents.d.ts +19 -0
  170. package/dist/backend/llvm/local-extents.js +169 -0
  171. package/dist/backend/llvm/local-extents.js.map +1 -0
  172. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  173. package/dist/backend/llvm/local-extents.test.js +92 -0
  174. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  175. package/dist/backend/llvm/local-union-storage.js +7 -7
  176. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  177. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  178. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  179. package/dist/backend/llvm/map-number-lookup.js +2 -2
  180. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  181. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  182. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  183. package/dist/backend/llvm/narrow-guards.js +151 -0
  184. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  185. package/dist/backend/llvm/nullable-unions.d.ts +70 -9
  186. package/dist/backend/llvm/nullable-unions.js +105 -6
  187. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  188. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  189. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  190. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  191. package/dist/backend/llvm/publish.d.ts +4 -0
  192. package/dist/backend/llvm/publish.js +14 -2
  193. package/dist/backend/llvm/publish.js.map +1 -1
  194. package/dist/backend/llvm/publish.test.js +1 -1
  195. package/dist/backend/llvm/receivers.d.ts +31 -0
  196. package/dist/backend/llvm/receivers.js +395 -0
  197. package/dist/backend/llvm/receivers.js.map +1 -0
  198. package/dist/backend/llvm/record-results.d.ts +13 -2
  199. package/dist/backend/llvm/record-results.js +66 -6
  200. package/dist/backend/llvm/record-results.js.map +1 -1
  201. package/dist/backend/llvm/reference-effects.js +9 -0
  202. package/dist/backend/llvm/reference-effects.js.map +1 -1
  203. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  204. package/dist/backend/llvm/reference-writes.js +143 -6
  205. package/dist/backend/llvm/reference-writes.js.map +1 -1
  206. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  207. package/dist/backend/llvm/reference-writes.test.js +88 -0
  208. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  209. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  210. package/dist/backend/llvm/regex-matchers.js +33 -0
  211. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  212. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  213. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  214. package/dist/backend/llvm/regions.d.ts +1 -1
  215. package/dist/backend/llvm/regions.js +9 -6
  216. package/dist/backend/llvm/regions.js.map +1 -1
  217. package/dist/backend/llvm/regions.test.js +1 -1
  218. package/dist/backend/llvm/shapes.d.ts +69 -43
  219. package/dist/backend/llvm/shapes.js +285 -21
  220. package/dist/backend/llvm/shapes.js.map +1 -1
  221. package/dist/backend/llvm/shapes.test.js +37 -3
  222. package/dist/backend/llvm/shapes.test.js.map +1 -1
  223. package/dist/backend/llvm/speculative-integers.d.ts +74 -0
  224. package/dist/backend/llvm/speculative-integers.js +571 -0
  225. package/dist/backend/llvm/speculative-integers.js.map +1 -0
  226. package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
  227. package/dist/backend/llvm/speculative-integers.test.js +148 -0
  228. package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
  229. package/dist/backend/llvm/split-loops.js +2 -2
  230. package/dist/backend/llvm/split-loops.js.map +1 -1
  231. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  232. package/dist/backend/llvm/stack-objects.js +133 -10
  233. package/dist/backend/llvm/stack-objects.js.map +1 -1
  234. package/dist/backend/llvm/stack-objects.test.js +55 -1
  235. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  236. package/dist/backend/llvm/stack-unions.test.js +1 -1
  237. package/dist/backend/llvm/string-construction.test.js +1 -1
  238. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  239. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  240. package/dist/backend/llvm/string-slices.d.ts +25 -0
  241. package/dist/backend/llvm/string-slices.js +207 -1
  242. package/dist/backend/llvm/string-slices.js.map +1 -1
  243. package/dist/backend/llvm/string-slices.test.js +139 -2
  244. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  245. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  246. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  247. package/dist/backend/llvm/thread-slots.js +142 -0
  248. package/dist/backend/llvm/thread-slots.js.map +1 -0
  249. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  250. package/dist/backend/llvm/thread-slots.test.js +110 -0
  251. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  252. package/dist/backend/llvm/union-repr.d.ts +7 -7
  253. package/dist/backend/llvm/union-repr.js +18 -2
  254. package/dist/backend/llvm/union-repr.js.map +1 -1
  255. package/dist/backend/llvm/union-retype.test.js +17 -3
  256. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  257. package/dist/backend/llvm/walkers.d.ts +2 -2
  258. package/dist/backend/llvm/walkers.js +51 -26
  259. package/dist/backend/llvm/walkers.js.map +1 -1
  260. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  261. package/dist/backend/llvm/wasm-modules.js +66 -0
  262. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  263. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  264. package/dist/backend/llvm/wrapping-sums.js +11 -3
  265. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  266. package/dist/backend/mangle.d.ts +7 -0
  267. package/dist/backend/mangle.js +11 -0
  268. package/dist/backend/mangle.js.map +1 -1
  269. package/dist/backend/may-throw.d.ts +3 -0
  270. package/dist/backend/may-throw.js +6 -2
  271. package/dist/backend/may-throw.js.map +1 -1
  272. package/dist/backend/may-throw.test.js +1 -1
  273. package/dist/backend/native/contracts.d.ts +37 -0
  274. package/dist/backend/native/executable.js +192 -134
  275. package/dist/backend/native/executable.js.map +1 -1
  276. package/dist/backend/native/library.js +1 -0
  277. package/dist/backend/native/library.js.map +1 -1
  278. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  279. package/dist/backend/native/runtime-inputs.js +2 -0
  280. package/dist/backend/native/runtime-inputs.js.map +1 -1
  281. package/dist/backend/native-link-info-core.d.ts +30 -0
  282. package/dist/backend/native-link-info-core.js.map +1 -1
  283. package/dist/backend/publication.test.js +1 -1
  284. package/dist/backend/runtime-pack-core.d.ts +9 -1
  285. package/dist/backend/runtime-pack-core.js +10 -1
  286. package/dist/backend/runtime-pack-core.js.map +1 -1
  287. package/dist/backend/runtime-pack-native.js +1 -1
  288. package/dist/backend/runtime-pack-native.js.map +1 -1
  289. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  290. package/dist/backend/runtime-pack-native.test.js +31 -0
  291. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  292. package/dist/backend/runtime-pack-targets.test.js +5 -0
  293. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  294. package/dist/backend/runtime-pack.d.ts +7 -3
  295. package/dist/backend/runtime-pack.js +12 -6
  296. package/dist/backend/runtime-pack.js.map +1 -1
  297. package/dist/backend/runtime-pack.test.js +20 -6
  298. package/dist/backend/runtime-pack.test.js.map +1 -1
  299. package/dist/backend/stack-observations.d.ts +22 -0
  300. package/dist/backend/stack-observations.js +382 -0
  301. package/dist/backend/stack-observations.js.map +1 -0
  302. package/dist/backend/stack-observations.test.d.ts +1 -0
  303. package/dist/backend/stack-observations.test.js +233 -0
  304. package/dist/backend/stack-observations.test.js.map +1 -0
  305. package/dist/backend/target-diagnostics.js +8 -0
  306. package/dist/backend/target-diagnostics.js.map +1 -1
  307. package/dist/backend/target-diagnostics.test.js +1 -1
  308. package/dist/backend/warm-cache.js +5 -0
  309. package/dist/backend/warm-cache.js.map +1 -1
  310. package/dist/backend/young-nursery.d.ts +7 -0
  311. package/dist/backend/young-nursery.js +10 -0
  312. package/dist/backend/young-nursery.js.map +1 -0
  313. package/dist/cli/command.js +44 -4
  314. package/dist/cli/command.js.map +1 -1
  315. package/dist/cli/usage.d.ts +11 -1
  316. package/dist/cli/usage.js +20 -1
  317. package/dist/cli/usage.js.map +1 -1
  318. package/dist/compat/fetch-profile.js +10 -1
  319. package/dist/compat/fetch-profile.js.map +1 -1
  320. package/dist/compile-types.d.ts +13 -0
  321. package/dist/contracts/check.js +25 -6
  322. package/dist/contracts/check.js.map +1 -1
  323. package/dist/contracts/int32-elements.d.ts +115 -0
  324. package/dist/contracts/int32-elements.js +1179 -0
  325. package/dist/contracts/int32-elements.js.map +1 -0
  326. package/dist/coverage/report.d.ts +16 -0
  327. package/dist/coverage/report.js +182 -1
  328. package/dist/coverage/report.js.map +1 -1
  329. package/dist/coverage/surface-manifest.js +19 -6
  330. package/dist/coverage/surface-manifest.js.map +1 -1
  331. package/dist/coverage/verdict-cache.d.ts +2 -0
  332. package/dist/coverage/verdict-cache.js +12 -0
  333. package/dist/coverage/verdict-cache.js.map +1 -1
  334. package/dist/coverage/verdict-cache.test.js +2 -1
  335. package/dist/coverage/verdict-cache.test.js.map +1 -1
  336. package/dist/diagnostics/diagnostic.d.ts +11 -7
  337. package/dist/diagnostics/diagnostic.js +35 -23
  338. package/dist/diagnostics/diagnostic.js.map +1 -1
  339. package/dist/diagnostics/envelope.d.ts +39 -2
  340. package/dist/diagnostics/envelope.js.map +1 -1
  341. package/dist/diagnostics/render.d.ts +7 -0
  342. package/dist/diagnostics/render.js +50 -13
  343. package/dist/diagnostics/render.js.map +1 -1
  344. package/dist/diagnostics/render.test.d.ts +1 -0
  345. package/dist/diagnostics/render.test.js +49 -0
  346. package/dist/diagnostics/render.test.js.map +1 -0
  347. package/dist/executable/executable-cache.d.ts +17 -0
  348. package/dist/executable/executable-cache.js +13 -1
  349. package/dist/executable/executable-cache.js.map +1 -1
  350. package/dist/executable/executable-cache.test.js +7 -1
  351. package/dist/executable/executable-cache.test.js.map +1 -1
  352. package/dist/executable/prepare.js +2 -1
  353. package/dist/executable/prepare.js.map +1 -1
  354. package/dist/frontend/analysis.js +6 -1
  355. package/dist/frontend/analysis.js.map +1 -1
  356. package/dist/frontend/builtin-modules.d.ts +16 -2
  357. package/dist/frontend/builtin-modules.js +40 -7
  358. package/dist/frontend/builtin-modules.js.map +1 -1
  359. package/dist/frontend/cjs-syntax.js +52 -51
  360. package/dist/frontend/cjs-syntax.js.map +1 -1
  361. package/dist/frontend/contract-types.d.ts +3 -0
  362. package/dist/frontend/contract-types.js +36 -7
  363. package/dist/frontend/contract-types.js.map +1 -1
  364. package/dist/frontend/experimental-import.d.ts +5 -1
  365. package/dist/frontend/experimental-import.js +26 -7
  366. package/dist/frontend/experimental-import.js.map +1 -1
  367. package/dist/frontend/fork-target.js +20 -22
  368. package/dist/frontend/fork-target.js.map +1 -1
  369. package/dist/frontend/fork-target.test.js +2 -1
  370. package/dist/frontend/fork-target.test.js.map +1 -1
  371. package/dist/frontend/function-completion.js +6 -6
  372. package/dist/frontend/function-completion.js.map +1 -1
  373. package/dist/frontend/helper-tokens.js +15 -3
  374. package/dist/frontend/helper-tokens.js.map +1 -1
  375. package/dist/frontend/helper-tokens.test.js +7 -1
  376. package/dist/frontend/helper-tokens.test.js.map +1 -1
  377. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  378. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  379. package/dist/frontend/input-tracker.d.ts +3 -0
  380. package/dist/frontend/input-tracker.js +32 -3
  381. package/dist/frontend/input-tracker.js.map +1 -1
  382. package/dist/frontend/lib-contract.js +36 -32
  383. package/dist/frontend/lib-contract.js.map +1 -1
  384. package/dist/frontend/lib-exports.js +3 -3
  385. package/dist/frontend/lib-exports.js.map +1 -1
  386. package/dist/frontend/lowering/array-values.d.ts +8 -3
  387. package/dist/frontend/lowering/array-values.js +60 -11
  388. package/dist/frontend/lowering/array-values.js.map +1 -1
  389. package/dist/frontend/lowering/assert-instances.js +4 -4
  390. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  391. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  392. package/dist/frontend/lowering/assertion-identity.js +70 -0
  393. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  394. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  395. package/dist/frontend/lowering/assertion-members.js +185 -0
  396. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  397. package/dist/frontend/lowering/binding-analysis.js +27 -20
  398. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  399. package/dist/frontend/lowering/builtin-calls.js +72 -4
  400. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  401. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  402. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  403. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  404. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  405. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  406. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  407. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  408. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  409. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  410. package/dist/frontend/lowering/builtins/blob.js +8 -6
  411. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  412. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
  413. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
  414. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  415. package/dist/frontend/lowering/builtins/callable-aliases.js +45 -6
  416. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  417. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  418. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  420. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  421. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  422. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  423. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  424. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  425. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  426. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  428. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  429. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  430. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  431. package/dist/frontend/lowering/builtins/compression.js +230 -52
  432. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  433. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  434. package/dist/frontend/lowering/builtins/constants.js +28 -7
  435. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  436. package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
  437. package/dist/frontend/lowering/builtins/crypto.js +223 -38
  438. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  439. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  440. package/dist/frontend/lowering/builtins/dates.js +92 -16
  441. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  442. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  443. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  444. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  445. package/dist/frontend/lowering/builtins/environment.js +3 -3
  446. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  447. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  448. package/dist/frontend/lowering/builtins/errors.js +174 -6
  449. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  450. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +4 -0
  451. package/dist/frontend/lowering/builtins/filesystem-calls.js +136 -113
  452. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  453. package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
  454. package/dist/frontend/lowering/builtins/filesystem.js +213 -76
  455. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  456. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  457. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  458. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  459. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
  461. package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
  462. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
  463. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  464. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  465. package/dist/frontend/lowering/builtins/json.js +232 -24
  466. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  467. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  468. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  469. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  470. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  471. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  472. package/dist/frontend/lowering/builtins/module-calls.js +67 -46
  473. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  475. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  476. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  478. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  479. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  480. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  481. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  482. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  483. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  484. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  485. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  486. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  487. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  488. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  489. package/dist/frontend/lowering/builtins/performance.js +259 -8
  490. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  491. package/dist/frontend/lowering/builtins/process.d.ts +32 -1
  492. package/dist/frontend/lowering/builtins/process.js +468 -99
  493. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  494. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  495. package/dist/frontend/lowering/builtins/promises.js +326 -43
  496. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  497. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
  498. package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
  499. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  500. package/dist/frontend/lowering/builtins/properties.js +37 -1
  501. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  502. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  503. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  504. package/dist/frontend/lowering/builtins/readline.d.ts +55 -13
  505. package/dist/frontend/lowering/builtins/readline.js +931 -69
  506. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  507. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  508. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  509. package/dist/frontend/lowering/builtins/reflection.js +16 -14
  510. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  511. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  512. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  513. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  514. package/dist/frontend/lowering/builtins/strings.js +101 -12
  515. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  516. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  517. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  518. package/dist/frontend/lowering/builtins/timers.js +75 -30
  519. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  520. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  521. package/dist/frontend/lowering/builtins/url.js +120 -17
  522. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  523. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  524. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  525. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  526. package/dist/frontend/lowering/builtins/v8.js +105 -0
  527. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  528. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  529. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  530. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  531. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  532. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  533. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  534. package/dist/frontend/lowering/builtins/workers.d.ts +16 -0
  535. package/dist/frontend/lowering/builtins/workers.js +246 -3
  536. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  537. package/dist/frontend/lowering/call-arguments.js +69 -14
  538. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  539. package/dist/frontend/lowering/call-signatures.d.ts +19 -1
  540. package/dist/frontend/lowering/call-signatures.js +254 -47
  541. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  542. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  543. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  544. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  545. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  546. package/dist/frontend/lowering/cjs-exports-object.js +528 -0
  547. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  548. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  549. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  550. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  551. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  552. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  553. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  554. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  555. package/dist/frontend/lowering/class-attributes.js +378 -0
  556. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  557. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  558. package/dist/frontend/lowering/class-callbacks.js +21 -10
  559. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  560. package/dist/frontend/lowering/class-construction.js +49 -4
  561. package/dist/frontend/lowering/class-construction.js.map +1 -1
  562. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  563. package/dist/frontend/lowering/class-descriptors.js +8 -8
  564. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  565. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  566. package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
  567. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  568. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  569. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  570. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  571. package/dist/frontend/lowering/class-iterables.js +31 -0
  572. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  573. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  574. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  575. package/dist/frontend/lowering/class-method-values.js +56 -10
  576. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  577. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  578. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  579. package/dist/frontend/lowering/class-protocols.d.ts +55 -0
  580. package/dist/frontend/lowering/class-protocols.js +738 -22
  581. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  582. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  583. package/dist/frontend/lowering/class-prototypes.js +80 -18
  584. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  585. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  586. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  587. package/dist/frontend/lowering/class-static-data.js +2 -2
  588. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  589. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  590. package/dist/frontend/lowering/class-to-primitive.js +261 -0
  591. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  592. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  593. package/dist/frontend/lowering/class-unions.js +102 -1
  594. package/dist/frontend/lowering/class-unions.js.map +1 -1
  595. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  596. package/dist/frontend/lowering/code-generation.js +127 -0
  597. package/dist/frontend/lowering/code-generation.js.map +1 -0
  598. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  599. package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
  600. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  601. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  602. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  603. package/dist/frontend/lowering/coercions/structural.js +35 -3
  604. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  605. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  606. package/dist/frontend/lowering/coercions/unions.js +57 -1
  607. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  608. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  609. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  610. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  611. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  612. package/dist/frontend/lowering/construction-escapes.js +8 -8
  613. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  614. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  615. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  616. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  617. package/dist/frontend/lowering/constructor-returns.js +477 -0
  618. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  619. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  620. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  621. package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
  622. package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
  623. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  624. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  625. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  626. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  627. package/dist/frontend/lowering/containers/array-construction.js +51 -13
  628. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  629. package/dist/frontend/lowering/containers/array-from-async.d.ts +19 -0
  630. package/dist/frontend/lowering/containers/array-from-async.js +427 -0
  631. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
  632. package/dist/frontend/lowering/containers/array-methods.js +89 -77
  633. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  634. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  635. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  636. package/dist/frontend/lowering/containers/bytes.js +161 -101
  637. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  638. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  639. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  640. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  641. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  642. package/dist/frontend/lowering/containers/collection-grouping.js +219 -27
  643. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  644. package/dist/frontend/lowering/containers/collection-methods.js +81 -48
  645. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  646. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  647. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  648. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  649. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  650. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  651. package/dist/frontend/lowering/containers/for-of.js +19 -19
  652. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  653. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  654. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  655. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  656. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  657. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  658. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  659. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  660. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  661. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  662. package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
  663. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  664. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  665. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  666. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
  667. package/dist/frontend/lowering/cycle-initialization.js +39 -0
  668. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  669. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  670. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  671. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  672. package/dist/frontend/lowering/devirtualize.js +27 -7
  673. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  674. package/dist/frontend/lowering/divergences.d.ts +0 -5
  675. package/dist/frontend/lowering/divergences.js +238 -128
  676. package/dist/frontend/lowering/divergences.js.map +1 -1
  677. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  678. package/dist/frontend/lowering/dyn-streams.js +257 -0
  679. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  680. package/dist/frontend/lowering/error-methods.js +4 -1
  681. package/dist/frontend/lowering/error-methods.js.map +1 -1
  682. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  683. package/dist/frontend/lowering/error-name-order.js +93 -0
  684. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  685. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  686. package/dist/frontend/lowering/expressions/array-literals.js +703 -0
  687. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  688. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  689. package/dist/frontend/lowering/expressions/binary.js +2483 -0
  690. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  691. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  692. package/dist/frontend/lowering/expressions/element-access.js +1797 -0
  693. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  694. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  695. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  696. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  697. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  698. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  699. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  700. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  701. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  702. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
  703. package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
  704. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  705. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  706. package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
  707. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  708. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  709. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  710. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  711. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  712. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  713. package/dist/frontend/lowering/expressions/object-literals.js +253 -85
  714. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  715. package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
  716. package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
  717. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
  719. package/dist/frontend/lowering/expressions/property-access.js +3544 -0
  720. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  721. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  722. package/dist/frontend/lowering/expressions/relational.js +1679 -0
  723. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  724. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  725. package/dist/frontend/lowering/expressions/typeof.js +538 -0
  726. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  727. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  728. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  729. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  730. package/dist/frontend/lowering/expressions/updates.js +780 -0
  731. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  732. package/dist/frontend/lowering/function-context.d.ts +10 -0
  733. package/dist/frontend/lowering/function-context.js +11 -1
  734. package/dist/frontend/lowering/function-context.js.map +1 -1
  735. package/dist/frontend/lowering/function-returns.js +52 -28
  736. package/dist/frontend/lowering/function-returns.js.map +1 -1
  737. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  738. package/dist/frontend/lowering/general-streams.js +108 -0
  739. package/dist/frontend/lowering/general-streams.js.map +1 -0
  740. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  741. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  742. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  743. package/dist/frontend/lowering/generic-functions.d.ts +39 -0
  744. package/dist/frontend/lowering/generic-functions.js +393 -75
  745. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  746. package/dist/frontend/lowering/import-meta.js +2 -2
  747. package/dist/frontend/lowering/import-meta.js.map +1 -1
  748. package/dist/frontend/lowering/intern-tables.js +10 -9
  749. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  750. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  751. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  752. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  753. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  754. package/dist/frontend/lowering/js-class-fields.js +170 -0
  755. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  756. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  757. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  758. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  759. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  760. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  761. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  762. package/dist/frontend/lowering/json-require.d.ts +22 -0
  763. package/dist/frontend/lowering/json-require.js +131 -0
  764. package/dist/frontend/lowering/json-require.js.map +1 -0
  765. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  766. package/dist/frontend/lowering/key-order-witness.js +641 -0
  767. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  768. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  769. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  770. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  771. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  772. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  773. package/dist/frontend/lowering/lower-assert.js +61 -60
  774. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  775. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  776. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  777. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  778. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  779. package/dist/frontend/lowering/lower-builtin-values.js +32 -3
  780. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  781. package/dist/frontend/lowering/lower-calls.js +1298 -452
  782. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  783. package/dist/frontend/lowering/lower-classes.d.ts +50 -3
  784. package/dist/frontend/lowering/lower-classes.js +1499 -456
  785. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  786. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  787. package/dist/frontend/lowering/lower-comptime.js +111 -13
  788. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  789. package/dist/frontend/lowering/lower-console.js +13 -11
  790. package/dist/frontend/lowering/lower-console.js.map +1 -1
  791. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  792. package/dist/frontend/lowering/lower-dgram.js +179 -8
  793. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  794. package/dist/frontend/lowering/lower-enums.js +113 -14
  795. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  796. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  797. package/dist/frontend/lowering/lower-event-emitter.js +268 -71
  798. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  799. package/dist/frontend/lowering/lower-event-target.js +2 -2
  800. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  801. package/dist/frontend/lowering/lower-expando.js +17 -13
  802. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  803. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  804. package/dist/frontend/lowering/lower-exprs.js +1493 -12407
  805. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  806. package/dist/frontend/lowering/lower-functions.js +68 -22
  807. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  808. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  809. package/dist/frontend/lowering/lower-generators.js +29 -16
  810. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  811. package/dist/frontend/lowering/lower-global-value.js +5 -1
  812. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  813. package/dist/frontend/lowering/lower-inspect.js +354 -99
  814. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  815. package/dist/frontend/lowering/lower-mixins.js +23 -20
  816. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  817. package/dist/frontend/lowering/lower-mock.d.ts +19 -2
  818. package/dist/frontend/lowering/lower-mock.js +557 -74
  819. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  820. package/dist/frontend/lowering/lower-modules.js +268 -61
  821. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  822. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  823. package/dist/frontend/lowering/lower-namespaces.js +45 -33
  824. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  825. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  826. package/dist/frontend/lowering/lower-node-module.js +147 -14
  827. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  828. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  829. package/dist/frontend/lowering/lower-server.js +638 -105
  830. package/dist/frontend/lowering/lower-server.js.map +1 -1
  831. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  832. package/dist/frontend/lowering/lower-stdlib.js +151 -109
  833. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  834. package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
  835. package/dist/frontend/lowering/lower-stmts.js +1589 -398
  836. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  837. package/dist/frontend/lowering/lower-stream.d.ts +4 -3
  838. package/dist/frontend/lowering/lower-stream.js +714 -75
  839. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  840. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  841. package/dist/frontend/lowering/lower-test.js +574 -100
  842. package/dist/frontend/lowering/lower-test.js.map +1 -1
  843. package/dist/frontend/lowering/lower-timers.js +80 -32
  844. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  845. package/dist/frontend/lowering/lower-url.js +1 -1
  846. package/dist/frontend/lowering/lower-url.js.map +1 -1
  847. package/dist/frontend/lowering/lowerer.d.ts +409 -26
  848. package/dist/frontend/lowering/lowerer.js +1918 -305
  849. package/dist/frontend/lowering/lowerer.js.map +1 -1
  850. package/dist/frontend/lowering/lowerer.test.js +10 -4
  851. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  852. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  853. package/dist/frontend/lowering/maybe-promise.js +249 -0
  854. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  855. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  856. package/dist/frontend/lowering/module-member-this.js +262 -0
  857. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  858. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  859. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  860. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  861. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  862. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  863. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  864. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  865. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  866. package/dist/frontend/lowering/native-ffi.js +11 -11
  867. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  868. package/dist/frontend/lowering/null-prototype.d.ts +13 -0
  869. package/dist/frontend/lowering/null-prototype.js +33 -0
  870. package/dist/frontend/lowering/null-prototype.js.map +1 -0
  871. package/dist/frontend/lowering/object-factory-new.js +6 -8
  872. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  873. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  874. package/dist/frontend/lowering/private-brands.js +265 -0
  875. package/dist/frontend/lowering/private-brands.js.map +1 -0
  876. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  877. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  878. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  879. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  880. package/dist/frontend/lowering/require-initialization.js +246 -0
  881. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  882. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  883. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  884. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  885. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  886. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  887. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  888. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  889. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  890. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  891. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  892. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  893. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  894. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  895. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  896. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  897. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  898. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  899. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  900. package/dist/frontend/lowering/split-consumers.js +4 -4
  901. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  902. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  903. package/dist/frontend/lowering/static-function-names.js +212 -0
  904. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  905. package/dist/frontend/lowering/static-this.js +6 -6
  906. package/dist/frontend/lowering/static-this.js.map +1 -1
  907. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  908. package/dist/frontend/lowering/strict-mode.js +31 -0
  909. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  910. package/dist/frontend/lowering/string-index-bounds.js +10 -10
  911. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  912. package/dist/frontend/lowering/string-index.d.ts +12 -0
  913. package/dist/frontend/lowering/string-index.js +72 -1
  914. package/dist/frontend/lowering/string-index.js.map +1 -1
  915. package/dist/frontend/lowering/surfaces.d.ts +15 -6
  916. package/dist/frontend/lowering/surfaces.js +278 -45
  917. package/dist/frontend/lowering/surfaces.js.map +1 -1
  918. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  919. package/dist/frontend/lowering/symbol-fields.js +204 -36
  920. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  921. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  922. package/dist/frontend/lowering/symbol-methods.js +24 -6
  923. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  924. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  925. package/dist/frontend/lowering/thread-slots.js +208 -0
  926. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  927. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  928. package/dist/frontend/lowering/typed-arguments.js +472 -0
  929. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  930. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  931. package/dist/frontend/lowering/union-retag.js +27 -0
  932. package/dist/frontend/lowering/union-retag.js.map +1 -1
  933. package/dist/frontend/lowering/union-retag.test.js +24 -1
  934. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  935. package/dist/frontend/lowering/var-hoisting.js +6 -6
  936. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  937. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  938. package/dist/frontend/mock-shapes.d.ts +5 -0
  939. package/dist/frontend/mock-shapes.js +39 -7
  940. package/dist/frontend/mock-shapes.js.map +1 -1
  941. package/dist/frontend/module-source-candidates.js +1 -1
  942. package/dist/frontend/module-source-candidates.js.map +1 -1
  943. package/dist/frontend/module-source-candidates.test.js +2 -1
  944. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  945. package/dist/frontend/module-syntax.js +8 -8
  946. package/dist/frontend/module-syntax.js.map +1 -1
  947. package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
  948. package/dist/frontend/npm-static-bundled-chunks.js +810 -0
  949. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  950. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  951. package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
  952. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  953. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  954. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  955. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  956. package/dist/frontend/npm-static-bundled-esm.js +768 -0
  957. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  958. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  959. package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
  960. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  961. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  962. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  963. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  964. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  965. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  966. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  967. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  968. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  969. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  970. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  971. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  972. package/dist/frontend/npm-static-prune.js +36 -24
  973. package/dist/frontend/npm-static-prune.js.map +1 -1
  974. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  975. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  976. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  977. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  978. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  979. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  980. package/dist/frontend/npm-static-subtyping.js +7 -9
  981. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  982. package/dist/frontend/npm-static.d.ts +17 -1
  983. package/dist/frontend/npm-static.js +167 -16
  984. package/dist/frontend/npm-static.js.map +1 -1
  985. package/dist/frontend/npm-static.test.js +22 -1
  986. package/dist/frontend/npm-static.test.js.map +1 -1
  987. package/dist/frontend/pipeline.js +164 -26
  988. package/dist/frontend/pipeline.js.map +1 -1
  989. package/dist/frontend/pipeline.test.js +22 -1
  990. package/dist/frontend/pipeline.test.js.map +1 -1
  991. package/dist/frontend/program-analysis.d.ts +6 -1
  992. package/dist/frontend/program-analysis.js +7 -0
  993. package/dist/frontend/program-analysis.js.map +1 -1
  994. package/dist/frontend/program.d.ts +92 -2
  995. package/dist/frontend/program.js +1557 -254
  996. package/dist/frontend/program.js.map +1 -1
  997. package/dist/frontend/program.test.js +76 -6
  998. package/dist/frontend/program.test.js.map +1 -1
  999. package/dist/frontend/resolve.js +36 -2
  1000. package/dist/frontend/resolve.js.map +1 -1
  1001. package/dist/frontend/resolve.test.js +49 -0
  1002. package/dist/frontend/resolve.test.js.map +1 -1
  1003. package/dist/frontend/services.d.ts +20 -1
  1004. package/dist/frontend/services.js +40 -3
  1005. package/dist/frontend/services.js.map +1 -1
  1006. package/dist/frontend/services.test.js +2 -1
  1007. package/dist/frontend/services.test.js.map +1 -1
  1008. package/dist/frontend/threads-import.js +1 -1
  1009. package/dist/frontend/threads-import.js.map +1 -1
  1010. package/dist/frontend/tier-analysis.d.ts +71 -0
  1011. package/dist/frontend/tier-analysis.js +522 -0
  1012. package/dist/frontend/tier-analysis.js.map +1 -0
  1013. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  1014. package/dist/frontend/ts7/api-conformance.js +7 -0
  1015. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  1016. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  1017. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  1018. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  1019. package/dist/frontend/ts7/ast-node.js +64 -18
  1020. package/dist/frontend/ts7/ast-node.js.map +1 -1
  1021. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1022. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1023. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1024. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1025. package/dist/frontend/ts7/ast.d.ts +1 -0
  1026. package/dist/frontend/ts7/ast.js +3 -2
  1027. package/dist/frontend/ts7/ast.js.map +1 -1
  1028. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1029. package/dist/frontend/ts7/checker-backend.js +88 -0
  1030. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1031. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1032. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1033. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1034. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1035. package/dist/frontend/ts7/checker-cache.js +0 -6
  1036. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1037. package/dist/frontend/ts7/checker.d.ts +18 -11
  1038. package/dist/frontend/ts7/checker.js +42 -55
  1039. package/dist/frontend/ts7/checker.js.map +1 -1
  1040. package/dist/frontend/ts7/checker.test.js +10 -7
  1041. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1042. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1043. package/dist/frontend/ts7/diagnostic.js +22 -0
  1044. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1045. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1046. package/dist/frontend/ts7/node-functions.js +18 -0
  1047. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1048. package/dist/frontend/ts7/program-host.d.ts +5 -1
  1049. package/dist/frontend/ts7/program-host.js +12 -0
  1050. package/dist/frontend/ts7/program-host.js.map +1 -1
  1051. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1052. package/dist/frontend/ts7/rpc-api.js +8 -1
  1053. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1054. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1055. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1056. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1057. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1058. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1059. package/dist/frontend/ts7/semantic-model.d.ts +54 -24
  1060. package/dist/frontend/ts7/semantic-model.js +88 -16
  1061. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1062. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1063. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1064. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1065. package/dist/frontend/ts7/semantic-types.js +1 -1
  1066. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1067. package/dist/frontend/ts7/session.d.ts +11 -11
  1068. package/dist/frontend/ts7/session.js +8 -5
  1069. package/dist/frontend/ts7/session.js.map +1 -1
  1070. package/dist/frontend/ts7/session.test.js +9 -5
  1071. package/dist/frontend/ts7/session.test.js.map +1 -1
  1072. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1073. package/dist/frontend/ts7/source-parser.js +24 -3
  1074. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1075. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1076. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1077. package/dist/frontend/type-mapper.d.ts +122 -2
  1078. package/dist/frontend/type-mapper.js +2612 -695
  1079. package/dist/frontend/type-mapper.js.map +1 -1
  1080. package/dist/frontend/type-only-imports.d.ts +28 -0
  1081. package/dist/frontend/type-only-imports.js +122 -0
  1082. package/dist/frontend/type-only-imports.js.map +1 -0
  1083. package/dist/frontend/worker-target.js +8 -8
  1084. package/dist/frontend/worker-target.js.map +1 -1
  1085. package/dist/index.d.ts +3 -1
  1086. package/dist/index.js +47 -10
  1087. package/dist/index.js.map +1 -1
  1088. package/dist/ir/analysis.js +4 -2
  1089. package/dist/ir/analysis.js.map +1 -1
  1090. package/dist/ir/api.d.ts +1 -1
  1091. package/dist/ir/api.js +1 -1
  1092. package/dist/ir/api.js.map +1 -1
  1093. package/dist/ir/array-length-stability.d.ts +30 -0
  1094. package/dist/ir/array-length-stability.js +236 -0
  1095. package/dist/ir/array-length-stability.js.map +1 -0
  1096. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1097. package/dist/ir/array-length-stability.test.js +113 -0
  1098. package/dist/ir/array-length-stability.test.js.map +1 -0
  1099. package/dist/ir/build.d.ts +2 -2
  1100. package/dist/ir/build.js +1 -1
  1101. package/dist/ir/build.js.map +1 -1
  1102. package/dist/ir/builtin-effects.js +139 -0
  1103. package/dist/ir/builtin-effects.js.map +1 -1
  1104. package/dist/ir/builtin-signatures.d.ts +1 -1
  1105. package/dist/ir/builtin-signatures.js +655 -25
  1106. package/dist/ir/builtin-signatures.js.map +1 -1
  1107. package/dist/ir/byte-numbers.js +3 -0
  1108. package/dist/ir/byte-numbers.js.map +1 -1
  1109. package/dist/ir/callback-specialization.d.ts +37 -0
  1110. package/dist/ir/callback-specialization.js +459 -0
  1111. package/dist/ir/callback-specialization.js.map +1 -0
  1112. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1113. package/dist/ir/callback-specialization.test.js +208 -0
  1114. package/dist/ir/callback-specialization.test.js.map +1 -0
  1115. package/dist/ir/capture-values.d.ts +0 -1
  1116. package/dist/ir/capture-values.js +51 -40
  1117. package/dist/ir/capture-values.js.map +1 -1
  1118. package/dist/ir/constant-globals.test.js +1 -1
  1119. package/dist/ir/constant-tables.test.js +1 -1
  1120. package/dist/ir/field-values.test.js +1 -1
  1121. package/dist/ir/final-fields.test.js +1 -1
  1122. package/dist/ir/function-references.test.js +10 -1
  1123. package/dist/ir/function-references.test.js.map +1 -1
  1124. package/dist/ir/init-only-globals.test.js +1 -1
  1125. package/dist/ir/initializer-bindings.test.js +1 -1
  1126. package/dist/ir/int32-slots.d.ts +14 -0
  1127. package/dist/ir/int32-slots.js +119 -14
  1128. package/dist/ir/int32-slots.js.map +1 -1
  1129. package/dist/ir/int32-slots.test.js +29 -1
  1130. package/dist/ir/int32-slots.test.js.map +1 -1
  1131. package/dist/ir/integer-loop-facts.d.ts +16 -6
  1132. package/dist/ir/integer-loop-facts.js +143 -38
  1133. package/dist/ir/integer-loop-facts.js.map +1 -1
  1134. package/dist/ir/integer-loops.d.ts +1 -1
  1135. package/dist/ir/integer-loops.js +39 -9
  1136. package/dist/ir/integer-loops.js.map +1 -1
  1137. package/dist/ir/integer-loops.test.js +104 -0
  1138. package/dist/ir/integer-loops.test.js.map +1 -1
  1139. package/dist/ir/integer-ranges.d.ts +3 -0
  1140. package/dist/ir/integer-ranges.js +4 -6
  1141. package/dist/ir/integer-ranges.js.map +1 -1
  1142. package/dist/ir/integer-ranges.test.js +142 -1
  1143. package/dist/ir/integer-ranges.test.js.map +1 -1
  1144. package/dist/ir/intrinsic-signatures.js +6 -0
  1145. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1146. package/dist/ir/ir.d.ts +234 -58
  1147. package/dist/ir/ir.js +123 -12
  1148. package/dist/ir/ir.js.map +1 -1
  1149. package/dist/ir/ir.test.js +10 -0
  1150. package/dist/ir/ir.test.js.map +1 -1
  1151. package/dist/ir/jsval.d.ts +8 -0
  1152. package/dist/ir/jsval.js +365 -0
  1153. package/dist/ir/jsval.js.map +1 -0
  1154. package/dist/ir/jsval.test.d.ts +1 -0
  1155. package/dist/ir/jsval.test.js +239 -0
  1156. package/dist/ir/jsval.test.js.map +1 -0
  1157. package/dist/ir/runtime-features.d.ts +150 -33
  1158. package/dist/ir/runtime-features.js +672 -339
  1159. package/dist/ir/runtime-features.js.map +1 -1
  1160. package/dist/ir/runtime-features.test.js +62 -0
  1161. package/dist/ir/runtime-features.test.js.map +1 -1
  1162. package/dist/ir/scalar-records.test.js +1 -1
  1163. package/dist/ir/self-captures.d.ts +33 -0
  1164. package/dist/ir/self-captures.js +245 -0
  1165. package/dist/ir/self-captures.js.map +1 -0
  1166. package/dist/ir/self-captures.test.d.ts +1 -0
  1167. package/dist/ir/self-captures.test.js +135 -0
  1168. package/dist/ir/self-captures.test.js.map +1 -0
  1169. package/dist/ir/serialize.d.ts +1 -1
  1170. package/dist/ir/serialize.js +7 -4
  1171. package/dist/ir/serialize.js.map +1 -1
  1172. package/dist/ir/tiers.d.ts +26 -0
  1173. package/dist/ir/tiers.js +101 -0
  1174. package/dist/ir/tiers.js.map +1 -0
  1175. package/dist/ir/tiers.test.d.ts +1 -0
  1176. package/dist/ir/tiers.test.js +140 -0
  1177. package/dist/ir/tiers.test.js.map +1 -0
  1178. package/dist/ir/traverse.js +107 -94
  1179. package/dist/ir/traverse.js.map +1 -1
  1180. package/dist/ir/traverse.test.js +33 -30
  1181. package/dist/ir/traverse.test.js.map +1 -1
  1182. package/dist/ir/unshare.js +65 -3
  1183. package/dist/ir/unshare.js.map +1 -1
  1184. package/dist/ir/unshare.test.js +1 -1
  1185. package/dist/ir/validate.js +220 -71
  1186. package/dist/ir/validate.js.map +1 -1
  1187. package/dist/ir/validate.test.js +64 -9
  1188. package/dist/ir/validate.test.js.map +1 -1
  1189. package/dist/library/fence-eval.test.js +1 -1
  1190. package/dist/library/int-infer.test.js +4 -4
  1191. package/dist/library/ir-policy.js +18 -0
  1192. package/dist/library/ir-policy.js.map +1 -1
  1193. package/dist/library/library-cache.d.ts +1 -0
  1194. package/dist/library/library-cache.js.map +1 -1
  1195. package/dist/library/library-cache.test.js +5 -5
  1196. package/dist/library/library-profile.d.ts +4 -4
  1197. package/dist/library/library-profile.js +35 -7
  1198. package/dist/library/library-profile.js.map +1 -1
  1199. package/dist/library/prepare.js +13 -1
  1200. package/dist/library/prepare.js.map +1 -1
  1201. package/dist/native/cli.js +5 -0
  1202. package/dist/native/cli.js.map +1 -1
  1203. package/dist/native/compiler.js +2 -2
  1204. package/dist/native/compiler.js.map +1 -1
  1205. package/dist/native/compiler.test.js +2 -2
  1206. package/dist/native/prepare.js +7 -0
  1207. package/dist/native/prepare.js.map +1 -1
  1208. package/dist/native/sanitizer.test.js +12 -0
  1209. package/dist/native/sanitizer.test.js.map +1 -1
  1210. package/dist/native/toolchain.d.ts +2 -0
  1211. package/dist/native/toolchain.js +10 -1
  1212. package/dist/native/toolchain.js.map +1 -1
  1213. package/dist/native/toolchain.test.js +39 -1
  1214. package/dist/native/toolchain.test.js.map +1 -1
  1215. package/dist/startup-cache.d.ts +1 -0
  1216. package/dist/startup-cache.js +1 -0
  1217. package/dist/startup-cache.js.map +1 -1
  1218. package/dist/wasm/base64.d.ts +5 -0
  1219. package/dist/wasm/base64.js +62 -0
  1220. package/dist/wasm/base64.js.map +1 -0
  1221. package/dist/wasm/binary.d.ts +36 -0
  1222. package/dist/wasm/binary.js +1976 -0
  1223. package/dist/wasm/binary.js.map +1 -0
  1224. package/dist/wasm/binary.test.d.ts +1 -0
  1225. package/dist/wasm/binary.test.js +190 -0
  1226. package/dist/wasm/binary.test.js.map +1 -0
  1227. package/dist/wasm/discover.d.ts +38 -0
  1228. package/dist/wasm/discover.js +377 -0
  1229. package/dist/wasm/discover.js.map +1 -0
  1230. package/dist/wasm/discover.test.d.ts +1 -0
  1231. package/dist/wasm/discover.test.js +24 -0
  1232. package/dist/wasm/discover.test.js.map +1 -0
  1233. package/dist/wasm/module.d.ts +151 -0
  1234. package/dist/wasm/module.js +575 -0
  1235. package/dist/wasm/module.js.map +1 -0
  1236. package/dist/wasm/translate.d.ts +48 -0
  1237. package/dist/wasm/translate.js +2129 -0
  1238. package/dist/wasm/translate.js.map +1 -0
  1239. package/dist/wasm/translate.test.d.ts +1 -0
  1240. package/dist/wasm/translate.test.js +207 -0
  1241. package/dist/wasm/translate.test.js.map +1 -0
  1242. package/package.json +21 -20
  1243. package/surface-manifest.json +332 -36
@@ -0,0 +1,1322 @@
1
+ /* Type narrowing of lowered values, conditional and as-expressions, and runtime-optional receiver reads. */
2
+ import * as ts from "../../ts7/adapter.js";
3
+ import { dynFallbackType } from "../lowerer.js";
4
+ import { BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, NULL_T, UNDEFINED_T, arrayOf, canAdaptDynFuncTo, canDynCheckTo, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
5
+ import { isJsSourceFile, locOf } from "../../program.js";
6
+ import { hasRuntimeStatics } from "../class-runtime-statics.js";
7
+ import { jsBindingHasOpenWrites } from "../lower-stmts.js";
8
+ import { narrowClassUnion, narrowStoredClassValue, structuralNarrowing } from "../class-unions.js";
9
+ import { checkedClassAssertion, checkedClassUnionAssertion } from "../class-assertions.js";
10
+ import { isOptionalProcessStreamProperty } from "../builtins/process.js";
11
+ import { requestGeneralStreamSurface } from "../general-streams.js";
12
+ import { literalValues } from "../../literal-values.js";
13
+ import { literalUnionArm } from "../../union-discriminants.js";
14
+ import { checkedArmExtraction } from "../coercions/unions.js";
15
+ import { hostedStorageView, hostsAll } from "./hosted-narrowing.js";
16
+ import { nodeThrowExpr, varRef } from "../../../ir/build.js";
17
+ import { InternalCompilerError } from "../../../errors.js";
18
+ import { hasClassPayload, runtimeOptionalAssertionErases, runtimeOptionalLocalOf, runtimeOptionalUseOf, } from "../lower-exprs.js";
19
+ import { isConstAssertionTypeNode, unitOnlyUnion } from "../../type-mapper.js";
20
+ import { assertsGlobalObject, extractionCopiesReference } from "../assertion-identity.js";
21
+ /** `c ? a : b`. An explicit destination constructs each branch at that
22
+ * layout before joining it. Without one, retain the expression's inferred
23
+ * type and the contextual/sibling rules below. */
24
+ export function lowerTernary(lowerer, expr, expected) {
25
+ const loc = locOf(expr);
26
+ // `Array.isArray(x) ? x : [x]` over a `T | readonly T[]` union: tsc
27
+ // narrows the TRUE branch to `any[]` (maybeNarrow's isArray bridge
28
+ // rides that) but leaves the FALSE branch wide — a readonly array
29
+ // is not assignable to `any[]`, so the arm never subtracts. The
30
+ // RUNTIME tag test proves the remaining arm exactly, so the false
31
+ // arm's reads of x narrow to the union's one non-array checker
32
+ // constituent (the certs configuredTlds shape). Nested functions
33
+ // stay out (they run later, when the proof is stale — tsc's own
34
+ // invalidation rule).
35
+ const falseArmNarrows = [];
36
+ let falseArmNarrowType = null;
37
+ {
38
+ let c = expr.condition;
39
+ while (ts.isParenthesizedExpression(c))
40
+ c = c.expression;
41
+ if (ts.isCallExpression(c) &&
42
+ ts.isPropertyAccessExpression(c.expression) &&
43
+ c.arguments.nodes.length === 1 &&
44
+ ts.isIdentifier(c.arguments.nodes[0]) &&
45
+ lowerer.stdlibGlobalMember(c.expression, "Array") === "isArray") {
46
+ const argIdent = c.arguments.nodes[0];
47
+ const sym = lowerer.resolveValueSymbol(argIdent);
48
+ const t = lowerer.checker.getTypeAtLocation(argIdent);
49
+ const constituents = t.isUnionType() ? ts.constituentTypes(t) : [];
50
+ const nonArray = constituents.filter((a) => !lowerer.checker.isArrayType(a) && !lowerer.checker.isTupleType(a));
51
+ const mapped = lowerer.mapTypeOf(t);
52
+ const armCount = mapped?.kind === "union" ? lowerer.arrayValueTags(mapped.unionId).length : 0;
53
+ if (sym && nonArray.length === 1 && armCount === 1) {
54
+ falseArmNarrowType = nonArray[0];
55
+ const collect = (n) => {
56
+ if (ts.isFunctionLike(n))
57
+ return;
58
+ if (ts.isIdentifier(n) &&
59
+ lowerer.resolveValueSymbol(n) === sym &&
60
+ !lowerer.chainNarrowedType.has(n)) {
61
+ falseArmNarrows.push(n);
62
+ }
63
+ ts.forEachChild(n, collect);
64
+ };
65
+ collect(expr.whenFalse);
66
+ }
67
+ }
68
+ }
69
+ for (const n of falseArmNarrows)
70
+ lowerer.chainNarrowedType.set(n, falseArmNarrowType);
71
+ try {
72
+ const cond = lowerer.lowerCondition(expr.condition);
73
+ // A condition the LOWERING proved constant (typeof-dyn against a
74
+ // kind no dyn box can hold — the bigint/symbol/function fold): only
75
+ // the taken arm exists at runtime, so only it lowers — which is
76
+ // exactly what lets a dual-mode arm with no static lowering (bigint
77
+ // literals) sit untaken in compiled JS. A boolLit carries no
78
+ // effects, so dropping the condition read loses nothing.
79
+ if (cond.kind === "boolLit") {
80
+ return lowerer.lowerExprExpecting(cond.value ? expr.whenTrue : expr.whenFalse, expected);
81
+ }
82
+ if (expected) {
83
+ // Construct fresh literals in their actual destination. Joining
84
+ // inferred layouts first can erase the literal discriminator or
85
+ // choose an empty array's uninhabited element representation.
86
+ // Runtime-optional proofs apply only within the selected true arm.
87
+ const then = withRuntimeOptionalNarrowed(lowerer, runtimeOptionalTrueIds(lowerer, expr.condition), () => lowerer.lowerExprExpecting(expr.whenTrue, expected));
88
+ const else_ = lowerer.lowerExprExpecting(expr.whenFalse, expected);
89
+ return { kind: "ternary", cond, then, else_, type: expected, loc };
90
+ }
91
+ const ctxTs = lowerer.checker.getContextualType(expr);
92
+ const ctxMapped = ctxTs ? lowerer.mapTypeOf(ctxTs) : null;
93
+ // Array-literal arms build directly as the slot's array type when
94
+ // the ternary sits under an ARRAY context (tsc accepts each arm
95
+ // covariantly — `[stdin]` types string[] against an
96
+ // (Uint8Array | string)[] slot — but a tagged element representation
97
+ // must be BUILT as the slot's element type, the same rule element
98
+ // expressions follow inside every array literal). And an EMPTY
99
+ // array-literal arm with no usable type of its own (tsc infers
100
+ // `never[]`; no mappable contextual type reaches into the arm — the
101
+ // conditional-spread idiom `[...(c ? [x] : [])]`) adopts the SIBLING
102
+ // arm's array type: the ternary twin of the union-slot rule in
103
+ // lowerArrayLiteral, and just as unambiguous — tsc already typed the
104
+ // whole ternary by the filled arm alone. Both arms empty stays
105
+ // fenced (no element type exists anywhere).
106
+ const ctxArray = ctxMapped?.kind === "array" ? ctxMapped : null;
107
+ const armLiteral = (e) => {
108
+ let x = e;
109
+ while (ts.isParenthesizedExpression(x))
110
+ x = x.expression;
111
+ return ts.isArrayLiteralExpression(x) ? x : null;
112
+ };
113
+ const emptyUntypedArrayArm = (e) => {
114
+ const lit = armLiteral(e);
115
+ if (!lit || lit.elements.nodes.length !== 0)
116
+ return false;
117
+ const t = lowerer.checker.getContextualType(lit) ?? lowerer.typeOf(lit);
118
+ if (!lowerer.mapTypeOf(t))
119
+ return true;
120
+ // never[] MAPS (the f64 representation for the uninhabited) but
121
+ // carries no element information — an empty literal typed that way
122
+ // still adopts the sibling arm's array type, tsc's own reading.
123
+ if (lowerer.checker.isArrayType(t)) {
124
+ const elem = lowerer.checker.getTypeArguments(t)[0];
125
+ if (elem !== undefined && elem.flags & ts.TypeFlags.Never)
126
+ return true;
127
+ }
128
+ return false;
129
+ };
130
+ // Inferred signature tables often join a populated argument array
131
+ // with nested empty-array branches. Carry the whole record layout
132
+ // through those branches before constructing their fresh fields.
133
+ const ownJoin = lowerer.mapTypeOf(lowerer.typeOf(expr));
134
+ const recordJoin = ctxMapped?.kind === "record" ? ctxMapped : ownJoin?.kind === "record" ? ownJoin : undefined;
135
+ const lowerArm = (e, siblingType) => {
136
+ let fresh = e;
137
+ while (ts.isParenthesizedExpression(fresh))
138
+ fresh = fresh.expression;
139
+ if (recordJoin && ts.isConditionalExpression(fresh))
140
+ return lowerTernary(lowerer, fresh, recordJoin);
141
+ if (recordJoin && ts.isObjectLiteralExpression(fresh)) {
142
+ return lowerer.lowerObjectLiteral(fresh, recordJoin);
143
+ }
144
+ const lit = armLiteral(e);
145
+ if (lit && ctxArray)
146
+ return lowerer.lowerArrayLiteral(lit, ctxArray);
147
+ if (lit && siblingType?.kind === "array") {
148
+ if (emptyUntypedArrayArm(e)) {
149
+ return { kind: "arrayLit", elems: [], type: siblingType, loc: locOf(lit) };
150
+ }
151
+ // A FILLED literal arm whose own element type is a UNION
152
+ // carrying the sibling's element as an arm (`Array.isArray(x) ?
153
+ // x : [x]` — the false arm's x checker-types as the whole union
154
+ // even though the runtime tag proved the non-array arm): build
155
+ // as the sibling's array type — each element coerces into the
156
+ // sibling element or fences on its own.
157
+ const ownT = lowerer.mapTypeOf(lowerer.typeOf(lit));
158
+ if (ownT?.kind === "array" &&
159
+ ownT.elem.kind === "union" &&
160
+ siblingType.elem.kind !== "union" &&
161
+ lowerer.armTag(ownT.elem.unionId, siblingType.elem) >= 0) {
162
+ return lowerer.lowerArrayLiteral(lit, siblingType);
163
+ }
164
+ // A FILLED literal arm whose own array type has NO lift into the
165
+ // sibling's (`isWindows ? ['cmd.exe', ['/d']] : ['pwd', []]` —
166
+ // the empty nested literal types never[], whose f64-element
167
+ // representation re-tags into nothing): the generic path could
168
+ // only fence the whole ternary, so build AS the sibling type —
169
+ // each element coerces into the sibling's element slot or fences
170
+ // on its own, and a nested empty literal adopts the slot's array
171
+ // arm (the union-slot rule). tsc already accepted the arm
172
+ // covariantly against the join, so a fitting literal is exactly
173
+ // the value the checker typed.
174
+ if (ownT?.kind === "array" &&
175
+ !typeEquals(ownT, siblingType) &&
176
+ lowerer.widthLiftPlan(ownT, siblingType) === null) {
177
+ return lowerer.lowerArrayLiteral(lit, siblingType);
178
+ }
179
+ }
180
+ return lowerer.lowerExpr(e);
181
+ };
182
+ // Lower the filled arm first so an empty arm can adopt its type.
183
+ // When the checker's OWN join for the ternary maps to an ARRAY,
184
+ // literal arms build against it directly (tsc collapses the arms'
185
+ // covariant array types into one — `c ? ['sh', []] : ['cmd', ['/d']]`
186
+ // joins as (string | string[])[] whichever arm nests the empty
187
+ // literal), so neither arm's uninhabited never[] reading decides.
188
+ const ownArrayJoin = (() => {
189
+ const m = lowerer.mapTypeOf(lowerer.typeOf(expr));
190
+ return m?.kind === "array" ? m : null;
191
+ })();
192
+ let thenRaw;
193
+ let elseRaw;
194
+ const runtimeTrueIds = runtimeOptionalTrueIds(lowerer, expr.condition);
195
+ const lowerTrueArm = () => withRuntimeOptionalNarrowed(lowerer, runtimeTrueIds, () => lowerArm(expr.whenTrue, ownArrayJoin ?? undefined));
196
+ if (!ctxArray && emptyUntypedArrayArm(expr.whenTrue) && !emptyUntypedArrayArm(expr.whenFalse)) {
197
+ elseRaw = lowerer.lowerExpr(expr.whenFalse);
198
+ thenRaw = withRuntimeOptionalNarrowed(lowerer, runtimeTrueIds, () => lowerArm(expr.whenTrue, elseRaw.type.kind === "dyn" && ownArrayJoin ? ownArrayJoin : elseRaw.type));
199
+ }
200
+ else {
201
+ thenRaw = lowerTrueArm();
202
+ // A checked-dynamic producer (Object.entries(...).filter(...))
203
+ // can still have a precise checker array type. Empty literal arms
204
+ // must adopt that element layout before the checked array boundary.
205
+ elseRaw = lowerArm(expr.whenFalse, thenRaw.type.kind === "dyn" && ownArrayJoin ? ownArrayJoin : thenRaw.type);
206
+ }
207
+ // The ternary's IR type is normally the checker's own: it collapses
208
+ // same-kind literal unions ("a" | "b" → string) and forms tagged
209
+ // unions for mixed arms that map (`c ? okRec : errRec`); anything
210
+ // left unmappable gets the type fence (badType) here. A record/union CONTEXTUAL type
211
+ // takes over exactly when the own type can't carry the value —
212
+ // unmappable, or a DIFFERENT union (branch literals omitting
213
+ // DIFFERENT optional subsets make the own type a union of the
214
+ // narrower fresh shapes, and a union-typed slot can sub-union the
215
+ // same way; neither has a runtime re-tag, while tsc guarantees each
216
+ // branch is assignable to the context). A base-CLASS context absorbs
217
+ // the same case: branches producing different subclasses make the
218
+ // own type a class union (`c ? new Dog() : new Bird()` against an
219
+ // Animal slot), while each branch upcasts into the context fine. A
220
+ // collapsed own type must WIN over a wider contextual union
221
+ // (`console.log(c ? "yes" : "no")` stays string against the ambient
222
+ // string | number | boolean parameter), and an 'unknown'/'any'
223
+ // context never absorbs the ternary (`JSON.stringify(c ? 1 : 2)`
224
+ // stays f64-typed). Arms that AGREE on an array type decide it
225
+ // themselves (a context- or sibling-built literal arm can carry a
226
+ // tagged element type the checker's own type doesn't spell).
227
+ const own = lowerer.mapTypeOf(lowerer.typeOf(expr));
228
+ const useCtx = (ctxMapped?.kind === "record" ||
229
+ ctxMapped?.kind === "union" ||
230
+ ctxMapped?.kind === "object") &&
231
+ (own === null ||
232
+ (own.kind === "union" &&
233
+ !typeEquals(own, ctxMapped) &&
234
+ !lowerer.inLogicalLeftPosition(expr)));
235
+ // Mixed dyn/unit arms under an unmappable own type (`typeof pkg.name
236
+ // === "string" ? pkg.name : null` — the lowering world types the
237
+ // unknown-receiver read `any`, which a static build cannot hold):
238
+ // dyn represents null and undefined directly, so the ternary stays
239
+ // dyn — a unit arm converts to the dyn unit value (the dynFrom form
240
+ // the index-signature lowerings already use). A FRESH literal arm
241
+ // (`... ? pkg.scripts : {}` — the default-object idiom) converts the
242
+ // same way when it is JSON-safe: nothing else aliases a literal, so
243
+ // the dyn copy is unobservable.
244
+ const dynish = (e) => e.type.kind === "dyn" ||
245
+ e.kind === "unitLit" ||
246
+ ((e.kind === "recordLit" || e.kind === "arrayLit") && lowerer.dynConvertible(e.type));
247
+ const dynJoin = own === null &&
248
+ !(useCtx && ctxMapped) &&
249
+ dynish(thenRaw) &&
250
+ dynish(elseRaw) &&
251
+ (thenRaw.type.kind === "dyn" || elseRaw.type.kind === "dyn");
252
+ // A checker-`any` ternary whose lowered arms are STATIC (`rawName ?
253
+ // rawName.replace(...) : null` — the dyn-receiver string machinery
254
+ // answers a static string): the checker's `any` carries no shape,
255
+ // but the arms do — equal arms take their shared type, a unit arm
256
+ // joins the other arm as its null/undefined-armed union. Gated on
257
+ // genuine `any` so every other unmappable keeps its own diagnostic.
258
+ let anyJoin = null;
259
+ if (own === null &&
260
+ !dynJoin &&
261
+ !(useCtx && ctxMapped) &&
262
+ (lowerer.typeOf(expr).flags & ts.TypeFlags.Any) !== 0) {
263
+ const a = thenRaw.type;
264
+ const b = elseRaw.type;
265
+ const staticArm = (t) => t.kind !== "dyn" && t.kind !== "caught" && t.kind !== "void";
266
+ if (staticArm(a) && staticArm(b)) {
267
+ if (typeEquals(a, b)) {
268
+ anyJoin = a;
269
+ }
270
+ else if (isUnitType(a) !== isUnitType(b)) {
271
+ const unit = isUnitType(a) ? a : b;
272
+ const val = isUnitType(a) ? b : a;
273
+ const arms = val.kind === "union" ? (lowerer.unions.get(val.unionId)?.arms ?? null) : [val];
274
+ if (arms && !arms.some((x) => typeEquals(x, unit))) {
275
+ anyJoin = { kind: "union", unionId: lowerer.unions.intern([...arms, unit]) };
276
+ }
277
+ else if (arms) {
278
+ anyJoin = val; // the unit is already an arm
279
+ }
280
+ }
281
+ }
282
+ }
283
+ // JavaScript function selection preserves the chosen closure's full
284
+ // call ABI. A checker join can erase a rest/arguments pack even though
285
+ // a later call supplies additional observable arguments.
286
+ const callableJoin = isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
287
+ thenRaw.type.kind === "func" &&
288
+ elseRaw.type.kind === "func" &&
289
+ !typeEquals(thenRaw.type, elseRaw.type) &&
290
+ lowerer.dynConvertible(thenRaw.type) &&
291
+ lowerer.dynConvertible(elseRaw.type);
292
+ // JavaScript inference can discard an initially-undefined field from
293
+ // a conditional's type even after that field acquired other values.
294
+ // A checked arm must retain its actual representation at the join.
295
+ const checkedJsJoin = isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
296
+ (thenRaw.type.kind === "dyn" || elseRaw.type.kind === "dyn") &&
297
+ lowerer.dynConvertible(thenRaw.type) &&
298
+ lowerer.dynConvertible(elseRaw.type);
299
+ const type = callableJoin || checkedJsJoin
300
+ ? DYN
301
+ : thenRaw.type.kind === "array" && typeEquals(thenRaw.type, elseRaw.type)
302
+ ? thenRaw.type
303
+ : dynJoin
304
+ ? DYN
305
+ : (anyJoin ?? (useCtx && ctxMapped ? ctxMapped : lowerer.irTypeOf(expr)));
306
+ // Each arm flows into the ternary's type through the slot-coercion
307
+ // path: union arms wrap, dyn slots reject the non-dyn arm with
308
+ // SC1101, mismatched record shapes get SC2002; coerceInto is
309
+ // inert when the types already agree.
310
+ const intoDyn = (e) => e.type.kind === "dyn" ? e : { kind: "dynFrom", value: e, type: DYN, loc: e.loc };
311
+ const then = dynJoin ? intoDyn(thenRaw) : lowerer.coerceInto(expr.whenTrue, thenRaw, type);
312
+ const else_ = dynJoin ? intoDyn(elseRaw) : lowerer.coerceInto(expr.whenFalse, elseRaw, type);
313
+ if (then.type.kind !== type.kind || else_.type.kind !== type.kind) {
314
+ lowerer.badType(expr, lowerer.typeOf(expr));
315
+ }
316
+ return { kind: "ternary", cond, then, else_, type, loc };
317
+ }
318
+ finally {
319
+ for (const n of falseArmNarrows)
320
+ lowerer.chainNarrowedType.delete(n);
321
+ }
322
+ }
323
+ /** Checker-driven union narrowing. tsc's control-flow analysis narrows a
324
+ * union-typed reference at use sites (`if (r.kind === "ok") { ...r... }`
325
+ * types `r` as the ok-arm inside the branch); the IR value is still the
326
+ * tagged union, so the read is bridged with a `unionNarrow` extracting
327
+ * the arm's payload. The extraction relies on tsc having proven the tag;
328
+ * backends verify it once and trap on a mismatch, so a wrong proof stops
329
+ * the program instead of reading another arm. A checker type that maps to
330
+ * the same union (unnarrowed use), to a SUB-union (partial narrowing —
331
+ * unrepresentable without a re-tag), or to nothing (`never` in an
332
+ * exhaustive default) leaves the expression union-typed. */
333
+ export function maybeNarrow(lowerer, expr, node) {
334
+ if ((expr.type.kind === "union" || expr.type.kind === "dyn") &&
335
+ isJsSourceFile(ts.getSourceFileOfNode(node)) &&
336
+ ts.isPropertyAccessExpression(node)) {
337
+ const symbol = lowerer.checker.getSymbolAtLocation(node.name);
338
+ if (symbol &&
339
+ symbol.declarations.some((decl) => ts.isPropertyDeclaration(decl) &&
340
+ !decl.initializer &&
341
+ !decl.type &&
342
+ isJsSourceFile(ts.getSourceFileOfNode(decl)))) {
343
+ // Inference describes later writes, not the initial undefined.
344
+ // A use that requires the inferred type must validate the value.
345
+ return expr.type.kind === "dyn"
346
+ ? expr
347
+ : { kind: "dynFrom", value: expr, type: DYN, loc: expr.loc };
348
+ }
349
+ }
350
+ // A dyn read tsc narrowed to a SCALAR (a typeof test proved the kind):
351
+ // bridge with a VALIDATED extraction — dynCheck, the checked-cast
352
+ // machinery — rather than a trusted one. After the guard the check
353
+ // never fires; a read smuggled past it throws a catchable TypeError
354
+ // instead of misreading the payload (the dyn boundary's usual stance).
355
+ // Object/array narrowings stay dyn-typed and keep their fences.
356
+ if (expr.type.kind === "dyn") {
357
+ // An inferred JS member's storage may be deliberately wider than its
358
+ // declaration (prototype-selected buffers, null-initialized scratch
359
+ // objects). Extract at the consuming operation, not at the read.
360
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)) && ts.isPropertyAccessExpression(node)) {
361
+ const receiver = lowerer.mapTypeOf(lowerer.typeOf(node.expression));
362
+ if (receiver?.kind === "object") {
363
+ const info = lowerer.classes.get(receiver.className);
364
+ if (info?.fields.get(node.name.text)?.kind === "dyn" ||
365
+ lowerer.findMethodOn(info ?? null, `get:${node.name.text}`)?.sig.ret.kind === "dyn")
366
+ return expr;
367
+ }
368
+ if (receiver?.kind === "classval") {
369
+ const info = lowerer.classes.get(receiver.className);
370
+ if (info && hasRuntimeStatics(info))
371
+ return expr;
372
+ }
373
+ }
374
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
375
+ (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))) {
376
+ let receiver = node.expression;
377
+ while (ts.isPropertyAccessExpression(receiver) ||
378
+ ts.isElementAccessExpression(receiver) ||
379
+ ts.isParenthesizedExpression(receiver)) {
380
+ if (ts.isPropertyAccessExpression(receiver)) {
381
+ const owner = lowerer.mapTypeOf(lowerer.typeOf(receiver.expression));
382
+ if (owner?.kind === "object" &&
383
+ lowerer.classes.get(owner.className)?.fields.get(receiver.name.text)?.kind === "dyn")
384
+ return expr;
385
+ }
386
+ receiver = receiver.expression;
387
+ }
388
+ if (receiver.kind === ts.SyntaxKind.ThisKeyword && lowerer.resolveThis()?.type.kind === "dyn")
389
+ return expr;
390
+ if (ts.isIdentifier(receiver)) {
391
+ const stored = lowerer.peekLocal(receiver)?.type ?? lowerer.globalOf(receiver)?.type;
392
+ if (stored?.kind === "dyn")
393
+ return expr;
394
+ const symbol = lowerer.resolveValueSymbol(receiver);
395
+ const bound = symbol && lowerer.implicitParamTypes?.get(symbol);
396
+ if (bound && lowerer.mapTypeOf(bound)?.kind === "dyn")
397
+ return expr;
398
+ }
399
+ }
400
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)) && ts.isIdentifier(node)) {
401
+ const symbol = lowerer.resolveValueSymbol(node);
402
+ if (symbol &&
403
+ symbol.declarations.some((decl) => ts.isParameter(decl) &&
404
+ ts.isMethodDeclaration(decl.parent) &&
405
+ lowerer.checkedVirtualJsMethods.has(decl.parent)))
406
+ return expr;
407
+ if (symbol &&
408
+ symbol.declarations.some((decl) => ts.isParameter(decl) && ts.isConstructorDeclaration(decl.parent)))
409
+ return expr;
410
+ if (symbol &&
411
+ symbol.declarations.some((decl) => ts.isVariableDeclaration(decl) && jsBindingHasOpenWrites(lowerer, decl)))
412
+ return expr;
413
+ if (symbol &&
414
+ symbol.declarations.some((decl) => ts.isParameter(decl) &&
415
+ decl.initializer &&
416
+ !decl.type &&
417
+ !/@(?:param|type)\b/.test(ts
418
+ .getSourceFileOfNode(decl)
419
+ .text.slice(decl.parent?.pos ?? decl.pos, ts.tokenStartOfNode(decl)))))
420
+ return expr;
421
+ if (symbol &&
422
+ symbol.declarations.some((decl) => {
423
+ if (!ts.isParameter(decl) || decl.type)
424
+ return false;
425
+ const fn = decl.parent;
426
+ if (!ts.isFunctionExpression(fn) && !ts.isArrowFunction(fn))
427
+ return false;
428
+ const assignment = fn.parent;
429
+ return (ts.isBinaryExpression(assignment) &&
430
+ assignment.right === fn &&
431
+ ts.isPropertyAccessExpression(assignment.left) &&
432
+ assignment.left.name.text === "write" &&
433
+ lowerer.isStdlibMember(assignment.left));
434
+ }))
435
+ return expr;
436
+ }
437
+ // Node's TTY declarations promise booleans/numbers even when a pipe
438
+ // has no such property. Preserve the checked read for JS capability
439
+ // probes instead of treating a declaration as a runtime type guard.
440
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
441
+ ts.isPropertyAccessExpression(node) &&
442
+ ["isTTY", "columns", "rows"].includes(node.name.text) &&
443
+ lowerer.isStdlibMember(node))
444
+ return expr;
445
+ // A null-initialized JS field can later receive an object even when
446
+ // checker flow calls its non-null branch never. The live checked
447
+ // value remains authoritative; never is not a numeric guard.
448
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
449
+ (lowerer.typeOf(node).flags & ts.TypeFlags.Never) !== 0)
450
+ return expr;
451
+ const narrowed = lowerer.mapTypeOf(lowerer.typeOf(node));
452
+ if (narrowed &&
453
+ (narrowed.kind === "f64" ||
454
+ narrowed.kind === "bool" ||
455
+ narrowed.kind === "string" ||
456
+ narrowed.kind === "bigint")) {
457
+ return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
458
+ }
459
+ // An instanceof narrow retains the native view after validating its
460
+ // exact element kind. Buffer also matches Uint8Array.
461
+ if (narrowed?.kind === "bytes" || narrowed?.kind === "url") {
462
+ return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
463
+ }
464
+ // An `instanceof Error` narrow: the checked-dynamic tree's error encoding rebuilds a
465
+ // fresh %Error (name/message/code from the marker object — a COPY,
466
+ // the unknown boundary's stance; SEMANTICS.md 67), validated like
467
+ // every dyn extraction.
468
+ if (narrowed?.kind === "object" && narrowed.className === "%Error") {
469
+ return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
470
+ }
471
+ return expr;
472
+ }
473
+ // instanceof narrowing for classes: tsc types this USE as a subclass of
474
+ // the IR value's class (only a dynamic instanceof test narrows a class
475
+ // type), so the read bridges with a static downcast that backends verify
476
+ // at run time, like the union bridge below.
477
+ if (expr.type.kind === "object") {
478
+ const narrowed = lowerer.mapTypeOf(lowerer.typeOf(node));
479
+ if (narrowed?.kind === "union") {
480
+ const union = narrowClassUnion(lowerer, expr, narrowed);
481
+ if (union)
482
+ return union;
483
+ }
484
+ if (narrowed?.kind === "object" &&
485
+ narrowed.className !== expr.type.className &&
486
+ lowerer.isSubclassOf(narrowed.className, expr.type.className)) {
487
+ const reduced = structuralNarrowing(lowerer, node, expr.type.className, narrowed);
488
+ const union = reduced ? narrowClassUnion(lowerer, expr, reduced) : null;
489
+ if (union)
490
+ return union;
491
+ if (lowerer.narrowing.untrusted(node, narrowed)) {
492
+ const checked = checkedClassAssertion(lowerer, expr, narrowed, expr.loc);
493
+ if (checked)
494
+ return checked;
495
+ }
496
+ return { kind: "downcast", value: expr, type: narrowed, loc: expr.loc };
497
+ }
498
+ return expr;
499
+ }
500
+ if (expr.type.kind !== "union")
501
+ return expr;
502
+ if (ts.isPropertyAccessExpression(node) && isOptionalProcessStreamProperty(lowerer, node))
503
+ return expr;
504
+ // Represented fields and index values can include undefined even when
505
+ // checker inference or lib.d.ts declares strings (RegExp captures).
506
+ // Only a declaration that represents the optional arm can provide a
507
+ // trustworthy flow narrowing; otherwise consumers must check it.
508
+ if ((expr.kind === "recordGet" || expr.kind === "recordKeyGet") &&
509
+ (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))) {
510
+ // The read itself rules out a null or undefined receiver, which a
511
+ // JavaScript receiver such as `m.groups` still declares.
512
+ const receiver = lowerer.mapTypeOf(lowerer.checker.getNonNullableType(lowerer.typeOf(node.expression)));
513
+ const shape = receiver?.kind === "record" ? lowerer.shapes.get(receiver.shapeId) : undefined;
514
+ const declared = expr.kind === "recordGet"
515
+ ? shape?.fields.find((field) => field.name === expr.field)?.type
516
+ : shape?.indexValue;
517
+ if (lowerer.armTag(expr.type.unionId, UNDEFINED_T) >= 0 &&
518
+ declared &&
519
+ !(declared.kind === "union" && lowerer.armTag(declared.unionId, UNDEFINED_T) >= 0))
520
+ return expr;
521
+ // The same for a field holding a Date's toJSON() result, whose null
522
+ // the declared string does not represent.
523
+ if (expr.kind === "recordGet" &&
524
+ lowerer.isRuntimeOptionalField(expr.shapeId, expr.field) &&
525
+ lowerer.armTag(expr.type.unionId, NULL_T) >= 0 &&
526
+ declared &&
527
+ !(declared.kind === "union" && lowerer.armTag(declared.unionId, NULL_T) >= 0))
528
+ return expr;
529
+ }
530
+ if (ts.isIdentifier(node)) {
531
+ const symbol = lowerer.resolveValueSymbol(node);
532
+ if (symbol && lowerer.unstableSwitchBindings.has(symbol))
533
+ return expr;
534
+ // A binding initialized by a Date's toJSON() can hold null where the
535
+ // checker says string; consumers check it.
536
+ if (symbol && lowerer.dateJsonBindings.has(symbol))
537
+ return expr;
538
+ }
539
+ if (ts.isPropertyAccessExpression(node) &&
540
+ getterResultHoldsUndeclaredUndefined(lowerer, node, expr))
541
+ return expr;
542
+ const narrowedTs = lowerer.typeOf(node);
543
+ const narrowed = lowerer.mapTypeOf(narrowedTs);
544
+ // `Array.isArray(u)` on a union with one readonly array/tuple arm: the
545
+ // lib predicate narrows to `any[]`, possibly intersected with another
546
+ // type. That mapping may be a checked value or a synthetic record, but
547
+ // the tag test proved the union's one array-valued arm, so bridge to it
548
+ // with the same trusted unionNarrow the mapped case below builds.
549
+ if (lowerer.checkerAnyArrayType(narrowedTs)) {
550
+ const def = lowerer.unions.get(expr.type.unionId);
551
+ const arrayTags = lowerer.arrayValueTags(expr.type.unionId);
552
+ if (arrayTags.length === 1) {
553
+ const arm = def.arms[arrayTags[0]];
554
+ const checked = checkedStaleArm(lowerer, node, expr, arrayTags[0], arm);
555
+ if (checked)
556
+ return checked;
557
+ return {
558
+ kind: "unionNarrow",
559
+ unionId: expr.type.unionId,
560
+ tag: arrayTags[0],
561
+ value: expr,
562
+ type: arm,
563
+ loc: expr.loc,
564
+ };
565
+ }
566
+ }
567
+ // A narrowing that refines record arms with an intersection keeps the
568
+ // stored layout: view the value as the stored arms that can hold it.
569
+ if (narrowed?.kind === "union") {
570
+ const hosted = hostedStorageView(lowerer, expr, narrowed, expr.loc);
571
+ if (hosted)
572
+ return hosted;
573
+ }
574
+ // A checker type narrowed to a UNIT arm (the `=== undefined` branch)
575
+ // also stays union-typed: a unit arm has no payload to extract, and
576
+ // nothing useful reads such a value anyway. (Standalone undefined maps
577
+ // to void and standalone null to nothing, so the isUnitType guard is
578
+ // defensive.)
579
+ if (!narrowed || narrowed.kind === "union" || narrowed.kind === "void" || isUnitType(narrowed)) {
580
+ return expr;
581
+ }
582
+ const tag = lowerer.armTag(expr.type.unionId, narrowed);
583
+ if (tag < 0 &&
584
+ narrowed.kind === "record" &&
585
+ !lowerer.unions.get(expr.type.unionId)?.discriminant) {
586
+ const hosted = hostedStorageView(lowerer, expr, narrowed, expr.loc);
587
+ if (hosted)
588
+ return hosted;
589
+ }
590
+ if (tag < 0) {
591
+ // The checker may refine fields inside a discriminated record too.
592
+ // That creates a different mapped shape, but does not change the
593
+ // stored payload layout. A required literal discriminator proves
594
+ // which original arm to read; retain all of that arm's field types.
595
+ const def = lowerer.unions.get(expr.type.unionId);
596
+ if (narrowed.kind === "record" && def?.discriminant) {
597
+ const property = lowerer.checker.getPropertyOfType(narrowedTs, def.discriminant.field);
598
+ if (property &&
599
+ !(property.flags &
600
+ (ts.SymbolFlags.Optional | ts.SymbolFlags.GetAccessor | ts.SymbolFlags.SetAccessor))) {
601
+ const values = literalValues(lowerer.checker.getTypeOfSymbol(property));
602
+ const arm = values && literalUnionArm(def, values, (id) => lowerer.shapes.get(id));
603
+ if (arm) {
604
+ const checked = checkedStaleArm(lowerer, node, expr, lowerer.armTag(expr.type.unionId, arm), arm);
605
+ if (checked)
606
+ return checked;
607
+ return {
608
+ kind: "unionNarrow",
609
+ unionId: expr.type.unionId,
610
+ tag: lowerer.armTag(expr.type.unionId, arm),
611
+ value: expr,
612
+ type: arm,
613
+ loc: expr.loc,
614
+ };
615
+ }
616
+ }
617
+ }
618
+ // A base-class arm can narrow to a subclass after instanceof. The
619
+ // payload retains its base-class tag even when the union also has
620
+ // records or other classes. Require one unambiguous containing arm.
621
+ const arms = lowerer.unions.get(expr.type.unionId)?.arms ?? [];
622
+ const valueTag = narrowed.kind === "object"
623
+ ? arms.findIndex((arm) => arm.kind === "object" && lowerer.isSubclassOf(narrowed.className, arm.className))
624
+ : -1;
625
+ const valueType = arms[valueTag];
626
+ if (narrowed.kind === "object" &&
627
+ valueType?.kind === "object" &&
628
+ arms.every((arm, i) => i === valueTag ||
629
+ arm.kind !== "object" ||
630
+ !lowerer.isSubclassOf(narrowed.className, arm.className)) &&
631
+ lowerer.isSubclassOf(narrowed.className, valueType.className)) {
632
+ const checked = checkedStaleArm(lowerer, node, expr, valueTag, valueType, narrowed);
633
+ if (checked) {
634
+ return checkedClassAssertion(lowerer, checked, narrowed, expr.loc) ?? checked;
635
+ }
636
+ return {
637
+ kind: "downcast",
638
+ value: {
639
+ kind: "unionNarrow",
640
+ unionId: expr.type.unionId,
641
+ tag: valueTag,
642
+ value: expr,
643
+ type: valueType,
644
+ loc: expr.loc,
645
+ },
646
+ type: narrowed,
647
+ loc: expr.loc,
648
+ };
649
+ }
650
+ return expr;
651
+ }
652
+ const checked = checkedStaleArm(lowerer, node, expr, tag, narrowed);
653
+ if (checked)
654
+ return checked;
655
+ return {
656
+ kind: "unionNarrow",
657
+ unionId: expr.type.unionId,
658
+ tag,
659
+ value: expr,
660
+ type: narrowed,
661
+ loc: expr.loc,
662
+ };
663
+ }
664
+ /** A getter read whose runtime result can be undefined (an unchecked
665
+ * element read in its body, or in another member of its override family)
666
+ * although its declared type cannot. The checker's type for the read is
667
+ * then no narrowing proof, so the read keeps the getter's result. */
668
+ function getterResultHoldsUndeclaredUndefined(lowerer, node, expr) {
669
+ if (expr.type.kind !== "union" || lowerer.armTag(expr.type.unionId, UNDEFINED_T) < 0)
670
+ return false;
671
+ const getter = (expr.kind === "virtualCall" && expr.method.startsWith("get:")) ||
672
+ (expr.kind === "call" && expr.callee.includes(".get:"));
673
+ if (!getter)
674
+ return false;
675
+ const symbol = lowerer.checker.getSymbolAtLocation(node.name);
676
+ if (!symbol || (symbol.flags & ts.SymbolFlags.GetAccessor) === 0)
677
+ return false;
678
+ const declared = lowerer.checker.getTypeOfSymbol(symbol);
679
+ const holdsUndefined = (type) => (type.flags &
680
+ (ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !==
681
+ 0;
682
+ return !(holdsUndefined(declared) ||
683
+ (declared.isUnionType() && ts.constituentTypes(declared).some(holdsUndefined)));
684
+ }
685
+ /** The checked form of maybeNarrow's arm extraction for a narrowing the
686
+ * checker may hold past code that replaced the value (a call clearing the
687
+ * property; see NarrowingStability). Every other arm throws the TypeError
688
+ * Node raises for the operation consuming the read (`Cannot read
689
+ * properties of undefined (reading 'x')`, `o.f is not a function`), or the
690
+ * stranded-value TypeError where Node would carry the value on. Null when
691
+ * the narrowing is provably current. `narrowed` is the checker's type when
692
+ * it refines the arm (a subclass view). */
693
+ function checkedStaleArm(lowerer, node, value, tag, arm, narrowed = arm) {
694
+ if (value.type.kind !== "union" || tag < 0)
695
+ return null;
696
+ if (!lowerer.narrowing.untrusted(node, narrowed))
697
+ return null;
698
+ const inPlace = checkedArmExtraction(lowerer, value, tag, arm, (found) => staleReadMessage(node, found));
699
+ if (inPlace)
700
+ return inPlace;
701
+ const helper = lowerer.narrowedArmHelper(value.type.unionId, arm, value.loc);
702
+ return helper ? lowerer.checkedNarrowCall(helper, value, arm, value.loc) : null;
703
+ }
704
+ /** V8's spelling of a callee in "is not a function": a string-literal
705
+ * element key reads as a property name (`o["a"]` is `o.a`), other keys
706
+ * keep their brackets. */
707
+ export function v8CalleeText(node) {
708
+ if (ts.isElementAccessExpression(node)) {
709
+ const key = node.argumentExpression;
710
+ const object = v8CalleeText(node.expression);
711
+ return ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)
712
+ ? `${object}.${key.text}`
713
+ : `${object}[${ts.getTextOfNode(key)}]`;
714
+ }
715
+ if (ts.isPropertyAccessExpression(node) && !node.questionDotToken)
716
+ return `${v8CalleeText(node.expression)}.${node.name.text}`;
717
+ return ts.getTextOfNode(node);
718
+ }
719
+ /** Node's TypeError for the operation consuming `node` when it holds a
720
+ * value of type `found`, or null where Node would not throw. */
721
+ function staleReadMessage(node, found) {
722
+ let child = node;
723
+ let parent = node.parent;
724
+ while (ts.isParenthesizedExpression(parent)) {
725
+ child = parent;
726
+ parent = parent.parent;
727
+ }
728
+ if (ts.isCallExpression(parent) && parent.expression === child && !parent.questionDotToken) {
729
+ return found.kind === "func" ? null : `${v8CalleeText(node)} is not a function`;
730
+ }
731
+ const unit = found.kind === "undefinedT" ? "undefined" : found.kind === "nullT" ? "null" : null;
732
+ if (unit === null)
733
+ return null;
734
+ if (!(ts.isPropertyAccessExpression(parent) || ts.isElementAccessExpression(parent)) ||
735
+ parent.expression !== child ||
736
+ parent.questionDotToken)
737
+ return null;
738
+ let key = null;
739
+ if (ts.isPropertyAccessExpression(parent))
740
+ key = parent.name.text;
741
+ else if (ts.isStringLiteral(parent.argumentExpression))
742
+ key = parent.argumentExpression.text;
743
+ else if (ts.isNumericLiteral(parent.argumentExpression))
744
+ key = String(Number(parent.argumentExpression.text));
745
+ if (key === null)
746
+ return null;
747
+ const store = parent.parent;
748
+ return ts.isBinaryExpression(store) &&
749
+ store.left === parent &&
750
+ store.operatorToken.kind === ts.SyntaxKind.EqualsToken
751
+ ? `Cannot set properties of ${unit} (setting '${key}')`
752
+ : `Cannot read properties of ${unit} (reading '${key}')`;
753
+ }
754
+ /** A runtime-optional slot can be assigned while a truthy guard is in
755
+ * force. TypeScript then types a direct member receiver as the plain arm,
756
+ * even though an OOB-safe assignment may have restored undefined. Check
757
+ * that hidden arm and throw the member-read TypeError Node would produce. */
758
+ export function runtimeOptionalReceiverRead(lowerer, expr, local, property, loc) {
759
+ if (local.type.kind !== "union") {
760
+ lowerer.runtimeOptionalLocals.delete(local);
761
+ lowerer.runtimeOptionalStorageLocals.delete(local);
762
+ return varRef(local.id, local.type, loc);
763
+ }
764
+ // A non-null/type assertion around the receiver carries the useful
765
+ // checker narrowing on the wrapper rather than on the identifier token
766
+ // itself (`gg!.day`). Follow only erased wrappers; the member/call node
767
+ // still receives the checked extraction built below.
768
+ let narrowedNode = expr;
769
+ while ((ts.isParenthesizedExpression(narrowedNode.parent) ||
770
+ ts.isAssertionExpression(narrowedNode.parent) ||
771
+ ts.isSatisfiesExpression(narrowedNode.parent) ||
772
+ ts.isNonNullExpression(narrowedNode.parent)) &&
773
+ narrowedNode.parent.expression === narrowedNode) {
774
+ narrowedNode = narrowedNode.parent;
775
+ }
776
+ const narrowed = lowerer.mapTypeOf(lowerer.typeOf(narrowedNode));
777
+ if (!narrowed || isUnitType(narrowed)) {
778
+ lowerer.unsupported("SC1090", expr, "a runtime-optional capture whose narrowed value type is not representable");
779
+ }
780
+ if (narrowed.kind === "union") {
781
+ const classView = narrowStoredClassValue(lowerer, varRef(local.id, local.type, loc), narrowed);
782
+ if (classView)
783
+ return classView;
784
+ // The checker may keep the receiver at the storage union unchanged
785
+ // (`string | undefined` on a JS `.match()` call). There is no
786
+ // sub-union to re-tag: preserve the value for the downstream
787
+ // nullable-receiver lowering, which performs the member-specific
788
+ // checked extraction. Refusing here deferred the whole statement to
789
+ // a runtime fence before that lowering could run.
790
+ if (typeEquals(local.type, narrowed)) {
791
+ return varRef(local.id, local.type, loc);
792
+ }
793
+ // A captured array element can itself be a union of records (for
794
+ // example Circle | Square). The optional storage union has one extra
795
+ // undefined arm; re-tag it to the checker-narrowed value union with a
796
+ // checked trap for that arm, then let union property lowering inspect
797
+ // the surviving record arms.
798
+ const helper = lowerer.narrowedRetagHelper(narrowedNode, local.type.unionId, narrowed.unionId, loc);
799
+ if (!helper) {
800
+ // Intersection-refined record arms read through their stored
801
+ // layout (the predicate `r is Route & { path: string }`).
802
+ const hosted = hostedStorageView(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
803
+ if (hosted)
804
+ return hosted;
805
+ lowerer.unsupported("SC1090", expr, "a runtime-optional capture whose narrowed union is not representable");
806
+ }
807
+ return {
808
+ kind: "call",
809
+ callee: helper,
810
+ args: [varRef(local.id, local.type, loc)],
811
+ type: narrowed,
812
+ loc,
813
+ };
814
+ }
815
+ if (narrowed.kind === "object") {
816
+ const view = checkedClassAssertion(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
817
+ // Preserve the member-specific missing-value error on the two-arm
818
+ // path below; mixed storage also needs to validate its concrete class.
819
+ if (view && (lowerer.unions.get(local.type.unionId)?.arms.length ?? 0) > 2)
820
+ return view;
821
+ }
822
+ if (narrowed.kind === "record" && lowerer.armTag(local.type.unionId, narrowed) < 0) {
823
+ const hosted = hostedStorageView(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
824
+ if (hosted)
825
+ return hosted;
826
+ }
827
+ const undefTag = lowerer.armTag(local.type.unionId, UNDEFINED_T);
828
+ const def = lowerer.unions.get(local.type.unionId);
829
+ if (!def || undefTag < 0)
830
+ throw new InternalCompilerError("runtime-optional local is missing its undefined arm");
831
+ if (def.arms.length !== 2) {
832
+ // The checker may narrow a runtime-optional capture to one arm of a
833
+ // value union (`Circle | Square | undefined` -> `Circle`). The
834
+ // two-arm fast path below cannot extract that arm safely: a later
835
+ // array mutation can leave any of the stored tags in the slot. Use
836
+ // the checked helper so every other arm, including undefined, remains
837
+ // a catchable TypeError rather than an unchecked payload read.
838
+ const helper = lowerer.narrowedArmHelper(local.type.unionId, narrowed, loc);
839
+ if (!helper) {
840
+ lowerer.unsupported("SC1090", expr, "a direct read from a runtime-optional capture with multiple value arms");
841
+ }
842
+ return lowerer.checkedNarrowCall(helper, varRef(local.id, local.type, loc), narrowed, loc);
843
+ }
844
+ // A predicate can strengthen a record's fields or narrow a base class
845
+ // to a subclass without changing the slot's stored value arm. Extract
846
+ // that actual arm first: record reads need its original field layout,
847
+ // and class reads apply the ordinary downcast bridge afterward.
848
+ const valueTag = undefTag === 0 ? 1 : 0;
849
+ const valueType = def.arms[valueTag];
850
+ if (!valueType || isUnitType(valueType)) {
851
+ lowerer.unsupported("SC1090", expr, "a runtime-optional receiver without a representable value arm");
852
+ }
853
+ const message = property === null
854
+ ? `${expr.text} is not a function`
855
+ : `Cannot read properties of undefined (reading '${property}')`;
856
+ return lowerer.maybeNarrow({
857
+ kind: "ternary",
858
+ cond: {
859
+ kind: "unionIsTag",
860
+ unionId: local.type.unionId,
861
+ tag: undefTag,
862
+ negated: false,
863
+ value: varRef(local.id, local.type, loc),
864
+ type: BOOL,
865
+ loc,
866
+ },
867
+ then: nodeThrowExpr(1, "", message, valueType, loc),
868
+ else_: {
869
+ kind: "unionNarrow",
870
+ unionId: local.type.unionId,
871
+ tag: valueTag,
872
+ value: varRef(local.id, local.type, loc),
873
+ type: valueType,
874
+ loc,
875
+ },
876
+ type: valueType,
877
+ loc,
878
+ }, narrowedNode);
879
+ }
880
+ export function runtimeOptionalTrueIds(lowerer, node) {
881
+ return runtimeOptionalGuardIds(lowerer, node, true);
882
+ }
883
+ /** Presence proved by one outcome of a boolean guard. Negation flips
884
+ * the outcome; all operands of a true AND or false OR have that outcome.
885
+ * Assignments invalidate a syntactic proof even when checker types hide
886
+ * the undefined produced by an out-of-bounds read. */
887
+ export function runtimeOptionalGuardIds(lowerer, node, truthy) {
888
+ const candidates = [];
889
+ const collect = (expr, outcome) => {
890
+ if (ts.isParenthesizedExpression(expr))
891
+ return collect(expr.expression, outcome);
892
+ if (ts.isPrefixUnaryExpression(expr) && expr.operator === ts.SyntaxKind.ExclamationToken) {
893
+ return collect(expr.operand, outcome === null ? null : !outcome);
894
+ }
895
+ if (ts.isBinaryExpression(expr) &&
896
+ ((outcome === true && expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) ||
897
+ (outcome === false && expr.operatorToken.kind === ts.SyntaxKind.BarBarToken))) {
898
+ collect(expr.left, outcome);
899
+ collect(expr.right, outcome);
900
+ }
901
+ else if (ts.isPropertyAccessExpression(expr) && !expr.questionDotToken) {
902
+ // A completed ordinary member read checked its receiver even if
903
+ // the property's value was falsy. Optional chains make no such
904
+ // promise, and calls/captures retain their separate checked ABI.
905
+ const local = runtimeOptionalLocalOf(lowerer, expr.expression);
906
+ if (local !== null)
907
+ candidates.push(local);
908
+ else if (ts.isPropertyAccessExpression(expr.expression))
909
+ collect(expr.expression, outcome);
910
+ }
911
+ else if (ts.isBinaryExpression(expr) &&
912
+ expr.operatorToken.kind !== ts.SyntaxKind.AmpersandAmpersandToken &&
913
+ expr.operatorToken.kind !== ts.SyntaxKind.BarBarToken &&
914
+ expr.operatorToken.kind !== ts.SyntaxKind.QuestionQuestionToken) {
915
+ // Both operands of a comparison/arithmetic operator are evaluated.
916
+ // Only member reads prove presence; bare identifiers need truth.
917
+ const member = (operand) => {
918
+ while (ts.isParenthesizedExpression(operand))
919
+ operand = operand.expression;
920
+ if (ts.isPropertyAccessExpression(operand))
921
+ collect(operand, outcome);
922
+ };
923
+ member(expr.left);
924
+ member(expr.right);
925
+ const op = expr.operatorToken.kind;
926
+ const equal = op === ts.SyntaxKind.EqualsEqualsEqualsToken || op === ts.SyntaxKind.EqualsEqualsToken;
927
+ const unequal = op === ts.SyntaxKind.ExclamationEqualsEqualsToken ||
928
+ op === ts.SyntaxKind.ExclamationEqualsToken;
929
+ if ((equal && outcome === false) || (unequal && outcome === true)) {
930
+ const present = (value, unit) => {
931
+ while (ts.isParenthesizedExpression(unit))
932
+ unit = unit.expression;
933
+ const excludesUndefined = (ts.isIdentifier(unit) &&
934
+ unit.text === "undefined" &&
935
+ (lowerer.typeOf(unit).flags & ts.TypeFlags.Undefined) !== 0) ||
936
+ (unit.kind === ts.SyntaxKind.NullKeyword &&
937
+ (op === ts.SyntaxKind.EqualsEqualsToken ||
938
+ op === ts.SyntaxKind.ExclamationEqualsToken));
939
+ if (excludesUndefined) {
940
+ const local = runtimeOptionalLocalOf(lowerer, value);
941
+ if (local !== null)
942
+ candidates.push(local);
943
+ }
944
+ };
945
+ present(expr.left, expr.right);
946
+ present(expr.right, expr.left);
947
+ }
948
+ }
949
+ else if (outcome) {
950
+ const local = runtimeOptionalLocalOf(lowerer, expr);
951
+ if (local !== null)
952
+ candidates.push(local);
953
+ }
954
+ };
955
+ collect(node, truthy);
956
+ if (candidates.length === 0)
957
+ return candidates;
958
+ const assigned = new Set();
959
+ const visit = (part) => {
960
+ if (ts.isFunctionLike(part))
961
+ return;
962
+ let target = null;
963
+ if (ts.isBinaryExpression(part) &&
964
+ part.operatorToken.kind >= ts.SyntaxKind.FirstAssignment &&
965
+ part.operatorToken.kind <= ts.SyntaxKind.LastAssignment)
966
+ target = part.left;
967
+ if ((ts.isPrefixUnaryExpression(part) || ts.isPostfixUnaryExpression(part)) &&
968
+ (part.operator === ts.SyntaxKind.PlusPlusToken ||
969
+ part.operator === ts.SyntaxKind.MinusMinusToken))
970
+ target = part.operand;
971
+ if (target !== null) {
972
+ // Destructuring assignments can contain several identifiers.
973
+ const mark = (name) => {
974
+ if (ts.isIdentifier(name)) {
975
+ const local = lowerer.resolveLocal(name);
976
+ if (local)
977
+ assigned.add(lowerer.runtimeOptionalRootOf(local));
978
+ }
979
+ ts.forEachChild(name, mark);
980
+ };
981
+ mark(target);
982
+ }
983
+ ts.forEachChild(part, visit);
984
+ };
985
+ visit(node);
986
+ return candidates.filter((local) => !assigned.has(lowerer.runtimeOptionalRootOf(local)));
987
+ }
988
+ export function withRuntimeOptionalNarrowed(lowerer, locals, fn) {
989
+ if (locals.length === 0)
990
+ return fn();
991
+ for (const local of locals)
992
+ lowerer.runtimeOptionalLocals.delete(lowerer.runtimeOptionalRootOf(local));
993
+ try {
994
+ return fn();
995
+ }
996
+ finally {
997
+ for (const local of locals)
998
+ lowerer.runtimeOptionalLocals.add(lowerer.runtimeOptionalRootOf(local));
999
+ }
1000
+ }
1001
+ /** `x as T`. Non-dyn inner values ordinarily erase; a record assertion
1002
+ * changing monomorphic shape rebuilds through the established width-copy
1003
+ * path so its represented value agrees with its asserted type.
1004
+ * A dyn ('unknown') inner value makes this THE dynamic boundary:
1005
+ * - `as unknown` (dyn → dyn) stays erasure;
1006
+ * - dyn → a JSON-representable target type T compiles to `dynCheck`, a
1007
+ * runtime validation that builds the typed value or THROWS a catchable
1008
+ * TypeError-flavored error (JS `as` never checks — the headline
1009
+ * documented divergence: a lying cast throws instead of corrupting
1010
+ * memory);
1011
+ * - dyn → anything else (closures, class instances, void) is rejected:
1012
+ * those types cannot be found inside a JSON dyn. */
1013
+ /** A class instance, or a union of class instances and unit arms (a
1014
+ * runtime-optional binding such as `const node = stack.pop()!`). */
1015
+ function classInstanceOrAbsent(lowerer, type) {
1016
+ if (type.kind === "object")
1017
+ return true;
1018
+ if (type.kind !== "union")
1019
+ return false;
1020
+ const arms = lowerer.unions.get(type.unionId)?.arms ?? [];
1021
+ return (arms.some((arm) => arm.kind === "object") &&
1022
+ arms.every((arm) => arm.kind === "object" || isUnitType(arm)));
1023
+ }
1024
+ /** `Object.fromEntries(...) as T` with T a declared record (the generic
1025
+ * `transform<T extends Record<string, unknown>>(t: T): T` idiom): the
1026
+ * entries build a pure index-signature record, which has no layout in
1027
+ * common with T's struct. Node keeps the object itself, with exactly the
1028
+ * keys and the order the entries gave it. The result of fromEntries is a
1029
+ * fresh object nothing else references, so the checked-dynamic bridge,
1030
+ * which keeps keys and their order the same way `JSON.parse(text) as T`
1031
+ * does, cannot be told apart from the original object; a value outside
1032
+ * T throws the catchable TypeError of every checked cast. The entries'
1033
+ * values must be scalars or checked-dynamic values, which the bridge
1034
+ * passes by value or by identity; native arrays and records would be
1035
+ * copied. Other sources may be aliased, where a rebuilt object would sever
1036
+ * mutation, so they keep the exact-shape fence. */
1037
+ function freshEntriesRecordAssertion(lowerer, expr, inner, target) {
1038
+ if (inner.type.kind !== "record" || target?.kind !== "record")
1039
+ return null;
1040
+ const source = lowerer.shapes.get(inner.type.shapeId);
1041
+ const dest = lowerer.shapes.get(target.shapeId);
1042
+ if (!source?.indexValue || source.tuple || source.fields.length > 0)
1043
+ return null;
1044
+ if (!dest || dest.tuple || dest.indexValue || shapeHasAccessorSlots(dest))
1045
+ return null;
1046
+ // Native arrays and records in the entries would be copied on the way
1047
+ // through the checked-dynamic bridge, severing their identity: only
1048
+ // slots of scalars or checked-dynamic values pass.
1049
+ if (extractionCopiesReference(lowerer, source.indexValue))
1050
+ return null;
1051
+ let operand = expr.expression;
1052
+ while (ts.isParenthesizedExpression(operand))
1053
+ operand = operand.expression;
1054
+ if (!ts.isCallExpression(operand) ||
1055
+ !ts.isPropertyAccessExpression(operand.expression) ||
1056
+ operand.expression.name.text !== "fromEntries" ||
1057
+ !lowerer.isStdlibGlobal(operand.expression.expression, "Object"))
1058
+ return null;
1059
+ if (!lowerer.dynConvertible(inner.type))
1060
+ return null;
1061
+ if (!canDynCheckTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))
1062
+ return null;
1063
+ const loc = locOf(expr);
1064
+ return { kind: "dynCheck", value: lowerer.coerceToExpected(inner, DYN), type: target, loc };
1065
+ }
1066
+ /** `e as T` and the old-style assertion `<T>e` — one node shape (both
1067
+ * carry `.type` and `.expression`), one lowering. */
1068
+ export function lowerAsExpression(lowerer, expr) {
1069
+ // `[] as const` — tsgo panics computing the expression's `readonly []`
1070
+ // type (the facade's fence answers `any`), but the syntax pins the
1071
+ // value exactly: the empty tuple, ridden as the unit-element array
1072
+ // (mapType's empty-tuple rule). Lower it directly; enclosing slots
1073
+ // coerce like any other empty-array source.
1074
+ if (ts.isAsExpression(expr) &&
1075
+ isConstAssertionTypeNode(expr.type) &&
1076
+ ts.isArrayLiteralExpression(expr.expression) &&
1077
+ expr.expression.elements.nodes.length === 0) {
1078
+ return {
1079
+ kind: "arrayLit",
1080
+ elems: [],
1081
+ type: arrayOf(unitOnlyUnion(lowerer.unions)),
1082
+ loc: locOf(expr),
1083
+ };
1084
+ }
1085
+ // `e as C` on a CATCH BINDING (`(err as Error).message`): the checked
1086
+ // extraction — an instanceof match extracts the payload, anything else
1087
+ // throws the catchable TypeError (dynCheck's trust-but-verify stance,
1088
+ // extended to exception payloads). Intercepts BEFORE lowerExpr — the
1089
+ // raw read would hit caughtRead's narrowness fence.
1090
+ const caughtLocal = lowerer.caughtLocalOf(expr.expression);
1091
+ if (caughtLocal) {
1092
+ const loc = locOf(expr);
1093
+ const targetTs = lowerer.checker.getTypeFromTypeNode(expr.type);
1094
+ const target = lowerer.mapTypeOf(targetTs);
1095
+ if (target?.kind === "object") {
1096
+ const info = lowerer.classes.get(target.className);
1097
+ if (info && lowerer.inHierarchy(info)) {
1098
+ return {
1099
+ kind: "caughtCheck",
1100
+ value: { kind: "varRef", localId: caughtLocal.id, type: CAUGHT, loc },
1101
+ className: target.className,
1102
+ type: target,
1103
+ loc,
1104
+ };
1105
+ }
1106
+ }
1107
+ // Structural assertions use the ordinary checked dynamic bridge. It
1108
+ // retains primitive values and native class identity before validating
1109
+ // the requested shape; an assertion does not bypass runtime checks.
1110
+ const narrowed = lowerer.mapTypeOf(lowerer.typeOf(expr.expression));
1111
+ const bridged = (narrowed &&
1112
+ (narrowed.kind === "f64" ||
1113
+ narrowed.kind === "bool" ||
1114
+ narrowed.kind === "string" ||
1115
+ narrowed.kind === "object" ||
1116
+ narrowed.kind === "dyn")) ||
1117
+ // `catch (e: any)`: the binding reads as its checked-dynamic value.
1118
+ (narrowed === null && (lowerer.typeOf(expr.expression).flags & ts.TypeFlags.Any) !== 0);
1119
+ if (!bridged)
1120
+ lowerer.unsupported("SC1063", expr);
1121
+ }
1122
+ const inner = lowerer.lowerExpr(expr.expression);
1123
+ const use = runtimeOptionalUseOf(expr);
1124
+ if (inner.type.kind === "union" && runtimeOptionalAssertionErases(lowerer, expr, inner, use))
1125
+ return inner;
1126
+ if (inner.type.kind !== "dyn") {
1127
+ const targetTs0 = lowerer.checker.getTypeFromTypeNode(expr.type);
1128
+ const target = lowerer.mapTypeOf(targetTs0);
1129
+ if (target?.kind === "object") {
1130
+ const asserted = checkedClassAssertion(lowerer, inner, target, locOf(expr));
1131
+ if (asserted)
1132
+ return asserted;
1133
+ }
1134
+ // Unknown-only record views use the checked-dynamic representation.
1135
+ // A native record asserted to such a view still denotes the original
1136
+ // object. Box a live reference instead of erasing the assertion and
1137
+ // handing native storage to a checked-dynamic property operation.
1138
+ if (target?.kind === "dyn" && (targetTs0.flags & ts.TypeFlags.Object) !== 0) {
1139
+ // A class instance asserted to a class-backed protocol view (a type
1140
+ // class instances flow into): the same identity-keeping box an
1141
+ // implicit flow into the view uses. A runtime-optional binding of a
1142
+ // class (`const node = stack.pop()!`) boxes the same way, and its
1143
+ // undefined arm stays undefined, as in Node.
1144
+ if (classInstanceOrAbsent(lowerer, inner.type) && lowerer.classImplementedProtocol(targetTs0))
1145
+ return lowerer.coerceInto(expr, inner, DYN);
1146
+ const sourceShape = inner.type.kind === "record" ? lowerer.shapes.get(inner.type.shapeId) : undefined;
1147
+ if (hasClassPayload(lowerer, inner.type) ||
1148
+ (sourceShape && shapeHasAccessorSlots(sourceShape))) {
1149
+ lowerer.unsupported("SC1090", expr, "opaque structural views of classes or accessor records (name the property's concrete type to retain native accessor dispatch)");
1150
+ }
1151
+ const boxed = lowerer.coerceInto(expr, inner, DYN);
1152
+ // Only references box live; a scalar or unit source (`value as
1153
+ // unknown as View`) is an ordinary snapshot.
1154
+ const seen = new Set();
1155
+ const live = (type) => {
1156
+ if (type.kind === "record" ||
1157
+ type.kind === "array" ||
1158
+ type.kind === "bytes" ||
1159
+ isDynTypedRefType(type))
1160
+ return true;
1161
+ if (type.kind !== "union" || seen.has(type.unionId))
1162
+ return false;
1163
+ seen.add(type.unionId);
1164
+ return lowerer.unions.get(type.unionId)?.arms.some(live) ?? false;
1165
+ };
1166
+ return boxed.kind === "dynFrom" && live(boxed.value.type)
1167
+ ? { ...boxed, liveRef: true }
1168
+ : boxed;
1169
+ }
1170
+ // Collection assertions are interface views only: their backing
1171
+ // value must already have the same native key/element/value layout.
1172
+ // Erasing a mock or a different instantiation here would let member
1173
+ // lowering interpret a record (or another ABI) as a native handle.
1174
+ if (target?.kind === "map" || target?.kind === "set") {
1175
+ return lowerer.coerceInto(expr, inner, target);
1176
+ }
1177
+ // A class-derived interface still names the class's native layout.
1178
+ // An assertion must not let a structural mock acquire that layout;
1179
+ // unions retain their checked extraction below, and real instances
1180
+ // keep the ordinary class narrowing path.
1181
+ if (target?.kind === "object" && inner.type.kind !== "object" && inner.type.kind !== "union") {
1182
+ return lowerer.coerceInto(expr, inner, target);
1183
+ }
1184
+ if (target?.kind === "object" &&
1185
+ inner.type.kind === "object" &&
1186
+ !typeEquals(target, inner.type) &&
1187
+ !lowerer.isSubclassOf(inner.type.className, target.className) &&
1188
+ !lowerer.isSubclassOf(target.className, inner.type.className)) {
1189
+ return lowerer.coerceInto(expr, inner, target);
1190
+ }
1191
+ const rebuilt = freshEntriesRecordAssertion(lowerer, expr, inner, target);
1192
+ if (rebuilt)
1193
+ return rebuilt;
1194
+ // `job as Job & { startedAt: number }` on a record: the asserted
1195
+ // record refines the stored one, so the assertion keeps the object
1196
+ // (a width copy would sever writes through the asserted view).
1197
+ if (inner.type.kind === "record" && target && hostsAll(lowerer, inner.type, target)) {
1198
+ return inner;
1199
+ }
1200
+ // Static assertions normally erase, but record layouts are
1201
+ // monomorphic: a consumer selected from the asserted shape must see
1202
+ // that shape physically. Reuse the ordinary slot coercion so plain
1203
+ // widths and index-signature captures share their established copy
1204
+ // semantics (and unsupported pairs report SC2002 at this assertion).
1205
+ if (inner.type.kind === "record" &&
1206
+ target?.kind === "record" &&
1207
+ inner.type.shapeId !== target.shapeId) {
1208
+ return lowerer.coerceInto(expr, inner, target);
1209
+ }
1210
+ // `u as Arm` on a UNION value is `u!`'s spelling with a named arm
1211
+ // (`req.headers[h] as string`): the CHECKED single-arm extraction —
1212
+ // the asserted arm's payload comes out, any other arm throws the
1213
+ // catchable TypeError (divergence 38's lying-assertion stance; an
1214
+ // erasure would just move the failure to the next typed slot as an
1215
+ // opaque union-mismatch fence). Sub-union targets and same-type
1216
+ // casts keep the historic erasure.
1217
+ if (inner.type.kind === "union") {
1218
+ if (target && target.kind !== "union" && !typeEquals(target, inner.type)) {
1219
+ const helper = lowerer.narrowedArmHelper(inner.type.unionId, target, locOf(expr));
1220
+ if (helper) {
1221
+ return lowerer.checkedNarrowCall(helper, inner, target, locOf(expr));
1222
+ }
1223
+ }
1224
+ // An intersection refining the stored record arms keeps the value
1225
+ // (hosted-narrowing.ts): the stored arms that can hold it.
1226
+ if (target && (target.kind === "union" || target.kind === "record")) {
1227
+ const hosted = hostedStorageView(lowerer, inner, target, locOf(expr));
1228
+ if (hosted)
1229
+ return hosted;
1230
+ }
1231
+ }
1232
+ // `node.parent as Sub | undefined`: a union target whose class arm is
1233
+ // narrower than the stored class gets the same checked class view as
1234
+ // `node.parent as Sub`; the other arms keep their identical tags.
1235
+ if (target?.kind === "union" &&
1236
+ (inner.type.kind === "union" || inner.type.kind === "object") &&
1237
+ !typeEquals(target, inner.type)) {
1238
+ const asserted = checkedClassUnionAssertion(lowerer, inner, target, locOf(expr));
1239
+ if (asserted)
1240
+ return asserted;
1241
+ }
1242
+ return inner; // erasure, unchanged
1243
+ }
1244
+ // `value as never` is the escape hatch that makes an unknown value fit
1245
+ // any slot (`tagSuccess(value as never)`). No value has type never, so
1246
+ // checking against its placeholder layout would reject every value.
1247
+ // Erase it instead: the consuming slot applies the same validated
1248
+ // extraction an unknown value gets wherever the checker admits it.
1249
+ if (expr.type.kind === ts.SyntaxKind.NeverKeyword)
1250
+ return inner;
1251
+ const targetTs = lowerer.checker.getTypeFromTypeNode(expr.type);
1252
+ const target = lowerer.mapTypeOf(targetTs) ?? dynFallbackType(lowerer, expr.type, targetTs);
1253
+ if (!target)
1254
+ lowerer.badType(expr.type, targetTs);
1255
+ if (target.kind === "dyn")
1256
+ return inner; // `as unknown`: erasure
1257
+ // An all-`unknown`-fields record target (`err as { code?: unknown }`
1258
+ // — the errno-probing idiom): there is nothing to validate (every
1259
+ // field is unknown, exactly what the dyn value already answers) and
1260
+ // nothing to build — the cast is pure typing, so it ERASES and the
1261
+ // reads ride the dyn keyed read.
1262
+ if (target.kind === "record") {
1263
+ const shape = lowerer.shapes.get(target.shapeId);
1264
+ if (shape &&
1265
+ !shape.tuple &&
1266
+ shape.fields.every((f) => f.type.kind === "dyn") &&
1267
+ (!shape.indexValue || shape.indexValue.kind === "dyn")) {
1268
+ return inner;
1269
+ }
1270
+ }
1271
+ // The global object: the checked extraction would build a separate
1272
+ // value, so the assertion keeps the object and its member operations
1273
+ // reach it (assertion-identity.ts).
1274
+ if (extractionCopiesReference(lowerer, target) && assertsGlobalObject(lowerer, expr))
1275
+ return inner;
1276
+ if (target.kind === "void" ||
1277
+ !canDynCheckTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
1278
+ // Bare undefined-armed targets pass when every OTHER arm is
1279
+ // JSON-safe: the checked-dynamic tree holds a first-class undefined value now
1280
+ // (index-signature overflow reads produce it for missing keys), and
1281
+ // the undefined arm matches exactly it — `p[key] as string |
1282
+ // undefined` is the missing-key idiom. Parsed JSON still never
1283
+ // contains undefined, so casts over parse results keep failing on
1284
+ // non-string values with the usual path-annotated TypeError.
1285
+ if (target.kind === "union" && lowerer.dynConvertible(target)) {
1286
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1287
+ }
1288
+ // Uint8Array targets: the checked-dynamic tree carries a bytes kind now (converted
1289
+ // stdin chunks) — the extraction validates the kind and copies out.
1290
+ if (target.kind === "bytes" && target.elem === "u8") {
1291
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1292
+ }
1293
+ // Class instances round-trip only through compiler-owned typed
1294
+ // references. Plain JSON objects fail the runtime class-brand check;
1295
+ // exact capsules unwrap the original object by identity.
1296
+ if (isDynTypedRefType(target)) {
1297
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1298
+ }
1299
+ // ADAPTABLE function targets (`u as (x: number) => number` — the
1300
+ // checked-dynamic function boundary): kind check, then exact unwrap
1301
+ // or the per-target adapter shim. Non-adaptable signatures keep the
1302
+ // fence below.
1303
+ if (target.kind === "func" &&
1304
+ canAdaptDynFuncTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
1305
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1306
+ }
1307
+ // Runtime HANDLE targets (`u as IncomingMessage` — a boxed handle
1308
+ // coming back out of an untyped wrapper): a tag-checked reference
1309
+ // unwrap, identity preserved (DYN_HANDLE_KINDS).
1310
+ if (DYN_HANDLE_KINDS.has(target.kind)) {
1311
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1312
+ }
1313
+ // `value as NodeJS.ReadableStream`: the general stream classes take
1314
+ // the checked cast (general-streams.ts).
1315
+ requestGeneralStreamSurface(lowerer, expr);
1316
+ lowerer.unsupported("SC1090", expr, `a checked cast of 'unknown' to '${target.kind === "void" ? "void" : lowerer.fmt(target)}' ` +
1317
+ `(a dynamic value can only be validated against JSON-representable types: ` +
1318
+ `number, string, boolean, records, arrays, and unions of those)`);
1319
+ }
1320
+ return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
1321
+ }
1322
+ //# sourceMappingURL=narrowing.js.map