@scriptc/compiler 0.3.6 → 0.4.1

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