@scriptc/compiler 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1243) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +960 -82
  2. package/ambient/scriptc.d.ts +134 -0
  3. package/dist/backend/cycle-analysis.d.ts +1 -1
  4. package/dist/backend/cycle-analysis.js +1 -0
  5. package/dist/backend/cycle-analysis.js.map +1 -1
  6. package/dist/backend/cycle-analysis.test.js +13 -1
  7. package/dist/backend/cycle-analysis.test.js.map +1 -1
  8. package/dist/backend/cycle-mutability.js +16 -5
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +13 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.test.js +1 -1
  13. package/dist/backend/library-pack.js +6 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +41 -4
  16. package/dist/backend/llvm/alloc.js +138 -7
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/alloc.test.js +30 -1
  19. package/dist/backend/llvm/alloc.test.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  21. package/dist/backend/llvm/array-search.test.js +1 -1
  22. package/dist/backend/llvm/blocks.d.ts +8 -0
  23. package/dist/backend/llvm/blocks.js +43 -1
  24. package/dist/backend/llvm/blocks.js.map +1 -1
  25. package/dist/backend/llvm/blocks.test.js +22 -1
  26. package/dist/backend/llvm/blocks.test.js.map +1 -1
  27. package/dist/backend/llvm/byte-numbers.js +15 -5
  28. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  29. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  30. package/dist/backend/llvm/bytes-alias.js +20 -0
  31. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  32. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  33. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  34. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  35. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  36. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  37. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  38. package/dist/backend/llvm/call-lifetimes.js +50 -1
  39. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  40. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  41. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  42. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  43. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  44. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  45. package/dist/backend/llvm/classes.d.ts +11 -0
  46. package/dist/backend/llvm/classes.js +71 -14
  47. package/dist/backend/llvm/classes.js.map +1 -1
  48. package/dist/backend/llvm/classes.test.js +58 -8
  49. package/dist/backend/llvm/classes.test.js.map +1 -1
  50. package/dist/backend/llvm/common.js +1 -0
  51. package/dist/backend/llvm/common.js.map +1 -1
  52. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  53. package/dist/backend/llvm/constant-callbacks.js +55 -12
  54. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  56. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  57. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  58. package/dist/backend/llvm/counted-loops.js +37 -0
  59. package/dist/backend/llvm/counted-loops.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.d.ts +12 -3
  61. package/dist/backend/llvm/dense-array-access.js +72 -14
  62. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  63. package/dist/backend/llvm/dense-array-access.test.js +59 -3
  64. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  66. package/dist/backend/llvm/dense-array-loops.js +162 -0
  67. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  68. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  69. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  70. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  71. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  72. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  73. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  74. package/dist/backend/llvm/dyn.d.ts +28 -4
  75. package/dist/backend/llvm/dyn.js +324 -179
  76. package/dist/backend/llvm/dyn.js.map +1 -1
  77. package/dist/backend/llvm/emit-function.d.ts +64 -0
  78. package/dist/backend/llvm/emit-function.js +1190 -0
  79. package/dist/backend/llvm/emit-function.js.map +1 -0
  80. package/dist/backend/llvm/emit-module.d.ts +24 -0
  81. package/dist/backend/llvm/emit-module.js +1535 -0
  82. package/dist/backend/llvm/emit-module.js.map +1 -0
  83. package/dist/backend/llvm/emit-statements.d.ts +58 -0
  84. package/dist/backend/llvm/emit-statements.js +1964 -0
  85. package/dist/backend/llvm/emit-statements.js.map +1 -0
  86. package/dist/backend/llvm/emitter.d.ts +576 -268
  87. package/dist/backend/llvm/emitter.js +801 -4447
  88. package/dist/backend/llvm/emitter.js.map +1 -1
  89. package/dist/backend/llvm/emitter.test.js +57 -3
  90. package/dist/backend/llvm/emitter.test.js.map +1 -1
  91. package/dist/backend/llvm/expr-async.js +73 -46
  92. package/dist/backend/llvm/expr-async.js.map +1 -1
  93. package/dist/backend/llvm/expr-async.test.js +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  95. package/dist/backend/llvm/expr-bytes.js +76 -29
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  98. package/dist/backend/llvm/expr-callbacks.js +48 -11
  99. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  100. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  101. package/dist/backend/llvm/expr-calls.js +71 -53
  102. package/dist/backend/llvm/expr-calls.js.map +1 -1
  103. package/dist/backend/llvm/expr-calls.test.js +1 -1
  104. package/dist/backend/llvm/expr-containers.js +39 -15
  105. package/dist/backend/llvm/expr-containers.js.map +1 -1
  106. package/dist/backend/llvm/expr-control.js +16 -16
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dispatch.js +1 -0
  109. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  110. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  111. package/dist/backend/llvm/expr-dynamic.js +92 -63
  112. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  113. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  114. package/dist/backend/llvm/expr-primitives.js +132 -25
  115. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  116. package/dist/backend/llvm/expr-primitives.test.js +2 -2
  117. package/dist/backend/llvm/expr-records.d.ts +1 -1
  118. package/dist/backend/llvm/expr-records.js +32 -11
  119. package/dist/backend/llvm/expr-records.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.js +54 -12
  121. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-abi.test.js +2 -2
  126. package/dist/backend/llvm/integer-clones.test.js +3 -3
  127. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  128. package/dist/backend/llvm/integer-remainder.js +156 -22
  129. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  130. package/dist/backend/llvm/intern-tables.test.js +1 -1
  131. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  132. package/dist/backend/llvm/jsval-encoding.js +20 -0
  133. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  134. package/dist/backend/llvm/jsval.d.ts +12 -0
  135. package/dist/backend/llvm/jsval.js +488 -0
  136. package/dist/backend/llvm/jsval.js.map +1 -0
  137. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  138. package/dist/backend/llvm/lazy-captures.js +39 -17
  139. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  140. package/dist/backend/llvm/lib-abi.js +1 -1
  141. package/dist/backend/llvm/lib-abi.js.map +1 -1
  142. package/dist/backend/llvm/lib-connect.js +1 -1
  143. package/dist/backend/llvm/lib-connect.js.map +1 -1
  144. package/dist/backend/llvm/lib-datagram.js +14 -8
  145. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  146. package/dist/backend/llvm/lib-dispatch.js +217 -24
  147. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  148. package/dist/backend/llvm/lib-filesystem.js +102 -13
  149. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  150. package/dist/backend/llvm/lib-http2.js +3 -3
  151. package/dist/backend/llvm/lib-http2.js.map +1 -1
  152. package/dist/backend/llvm/lib-lookup.js +2 -2
  153. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  154. package/dist/backend/llvm/lib-network.js +77 -25
  155. package/dist/backend/llvm/lib-network.js.map +1 -1
  156. package/dist/backend/llvm/lib-process.js +100 -50
  157. package/dist/backend/llvm/lib-process.js.map +1 -1
  158. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  159. package/dist/backend/llvm/lib-shared.js +229 -5
  160. package/dist/backend/llvm/lib-shared.js.map +1 -1
  161. package/dist/backend/llvm/lib-stream.js +46 -16
  162. package/dist/backend/llvm/lib-stream.js.map +1 -1
  163. package/dist/backend/llvm/lib-test.js +57 -8
  164. package/dist/backend/llvm/lib-test.js.map +1 -1
  165. package/dist/backend/llvm/lib-tls.js +4 -9
  166. package/dist/backend/llvm/lib-tls.js.map +1 -1
  167. package/dist/backend/llvm/local-array-reads.js +2 -2
  168. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  169. package/dist/backend/llvm/local-extents.d.ts +19 -0
  170. package/dist/backend/llvm/local-extents.js +169 -0
  171. package/dist/backend/llvm/local-extents.js.map +1 -0
  172. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  173. package/dist/backend/llvm/local-extents.test.js +92 -0
  174. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  175. package/dist/backend/llvm/local-union-storage.js +7 -7
  176. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  177. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  178. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  179. package/dist/backend/llvm/map-number-lookup.js +2 -2
  180. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  181. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  182. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  183. package/dist/backend/llvm/narrow-guards.js +151 -0
  184. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  185. package/dist/backend/llvm/nullable-unions.d.ts +70 -9
  186. package/dist/backend/llvm/nullable-unions.js +105 -6
  187. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  188. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  189. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  190. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  191. package/dist/backend/llvm/publish.d.ts +4 -0
  192. package/dist/backend/llvm/publish.js +14 -2
  193. package/dist/backend/llvm/publish.js.map +1 -1
  194. package/dist/backend/llvm/publish.test.js +1 -1
  195. package/dist/backend/llvm/receivers.d.ts +31 -0
  196. package/dist/backend/llvm/receivers.js +395 -0
  197. package/dist/backend/llvm/receivers.js.map +1 -0
  198. package/dist/backend/llvm/record-results.d.ts +13 -2
  199. package/dist/backend/llvm/record-results.js +66 -6
  200. package/dist/backend/llvm/record-results.js.map +1 -1
  201. package/dist/backend/llvm/reference-effects.js +9 -0
  202. package/dist/backend/llvm/reference-effects.js.map +1 -1
  203. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  204. package/dist/backend/llvm/reference-writes.js +143 -6
  205. package/dist/backend/llvm/reference-writes.js.map +1 -1
  206. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  207. package/dist/backend/llvm/reference-writes.test.js +88 -0
  208. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  209. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  210. package/dist/backend/llvm/regex-matchers.js +33 -0
  211. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  212. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  213. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  214. package/dist/backend/llvm/regions.d.ts +1 -1
  215. package/dist/backend/llvm/regions.js +9 -6
  216. package/dist/backend/llvm/regions.js.map +1 -1
  217. package/dist/backend/llvm/regions.test.js +1 -1
  218. package/dist/backend/llvm/shapes.d.ts +69 -43
  219. package/dist/backend/llvm/shapes.js +285 -21
  220. package/dist/backend/llvm/shapes.js.map +1 -1
  221. package/dist/backend/llvm/shapes.test.js +37 -3
  222. package/dist/backend/llvm/shapes.test.js.map +1 -1
  223. package/dist/backend/llvm/speculative-integers.d.ts +74 -0
  224. package/dist/backend/llvm/speculative-integers.js +571 -0
  225. package/dist/backend/llvm/speculative-integers.js.map +1 -0
  226. package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
  227. package/dist/backend/llvm/speculative-integers.test.js +148 -0
  228. package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
  229. package/dist/backend/llvm/split-loops.js +2 -2
  230. package/dist/backend/llvm/split-loops.js.map +1 -1
  231. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  232. package/dist/backend/llvm/stack-objects.js +133 -10
  233. package/dist/backend/llvm/stack-objects.js.map +1 -1
  234. package/dist/backend/llvm/stack-objects.test.js +55 -1
  235. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  236. package/dist/backend/llvm/stack-unions.test.js +1 -1
  237. package/dist/backend/llvm/string-construction.test.js +1 -1
  238. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  239. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  240. package/dist/backend/llvm/string-slices.d.ts +25 -0
  241. package/dist/backend/llvm/string-slices.js +207 -1
  242. package/dist/backend/llvm/string-slices.js.map +1 -1
  243. package/dist/backend/llvm/string-slices.test.js +139 -2
  244. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  245. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  246. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  247. package/dist/backend/llvm/thread-slots.js +142 -0
  248. package/dist/backend/llvm/thread-slots.js.map +1 -0
  249. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  250. package/dist/backend/llvm/thread-slots.test.js +110 -0
  251. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  252. package/dist/backend/llvm/union-repr.d.ts +7 -7
  253. package/dist/backend/llvm/union-repr.js +18 -2
  254. package/dist/backend/llvm/union-repr.js.map +1 -1
  255. package/dist/backend/llvm/union-retype.test.js +17 -3
  256. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  257. package/dist/backend/llvm/walkers.d.ts +2 -2
  258. package/dist/backend/llvm/walkers.js +51 -26
  259. package/dist/backend/llvm/walkers.js.map +1 -1
  260. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  261. package/dist/backend/llvm/wasm-modules.js +66 -0
  262. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  263. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  264. package/dist/backend/llvm/wrapping-sums.js +11 -3
  265. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  266. package/dist/backend/mangle.d.ts +7 -0
  267. package/dist/backend/mangle.js +11 -0
  268. package/dist/backend/mangle.js.map +1 -1
  269. package/dist/backend/may-throw.d.ts +3 -0
  270. package/dist/backend/may-throw.js +6 -2
  271. package/dist/backend/may-throw.js.map +1 -1
  272. package/dist/backend/may-throw.test.js +1 -1
  273. package/dist/backend/native/contracts.d.ts +37 -0
  274. package/dist/backend/native/executable.js +192 -134
  275. package/dist/backend/native/executable.js.map +1 -1
  276. package/dist/backend/native/library.js +1 -0
  277. package/dist/backend/native/library.js.map +1 -1
  278. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  279. package/dist/backend/native/runtime-inputs.js +2 -0
  280. package/dist/backend/native/runtime-inputs.js.map +1 -1
  281. package/dist/backend/native-link-info-core.d.ts +30 -0
  282. package/dist/backend/native-link-info-core.js.map +1 -1
  283. package/dist/backend/publication.test.js +1 -1
  284. package/dist/backend/runtime-pack-core.d.ts +9 -1
  285. package/dist/backend/runtime-pack-core.js +10 -1
  286. package/dist/backend/runtime-pack-core.js.map +1 -1
  287. package/dist/backend/runtime-pack-native.js +1 -1
  288. package/dist/backend/runtime-pack-native.js.map +1 -1
  289. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  290. package/dist/backend/runtime-pack-native.test.js +31 -0
  291. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  292. package/dist/backend/runtime-pack-targets.test.js +5 -0
  293. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  294. package/dist/backend/runtime-pack.d.ts +7 -3
  295. package/dist/backend/runtime-pack.js +12 -6
  296. package/dist/backend/runtime-pack.js.map +1 -1
  297. package/dist/backend/runtime-pack.test.js +20 -6
  298. package/dist/backend/runtime-pack.test.js.map +1 -1
  299. package/dist/backend/stack-observations.d.ts +22 -0
  300. package/dist/backend/stack-observations.js +382 -0
  301. package/dist/backend/stack-observations.js.map +1 -0
  302. package/dist/backend/stack-observations.test.d.ts +1 -0
  303. package/dist/backend/stack-observations.test.js +233 -0
  304. package/dist/backend/stack-observations.test.js.map +1 -0
  305. package/dist/backend/target-diagnostics.js +8 -0
  306. package/dist/backend/target-diagnostics.js.map +1 -1
  307. package/dist/backend/target-diagnostics.test.js +1 -1
  308. package/dist/backend/warm-cache.js +5 -0
  309. package/dist/backend/warm-cache.js.map +1 -1
  310. package/dist/backend/young-nursery.d.ts +7 -0
  311. package/dist/backend/young-nursery.js +10 -0
  312. package/dist/backend/young-nursery.js.map +1 -0
  313. package/dist/cli/command.js +44 -4
  314. package/dist/cli/command.js.map +1 -1
  315. package/dist/cli/usage.d.ts +11 -1
  316. package/dist/cli/usage.js +20 -1
  317. package/dist/cli/usage.js.map +1 -1
  318. package/dist/compat/fetch-profile.js +10 -1
  319. package/dist/compat/fetch-profile.js.map +1 -1
  320. package/dist/compile-types.d.ts +13 -0
  321. package/dist/contracts/check.js +25 -6
  322. package/dist/contracts/check.js.map +1 -1
  323. package/dist/contracts/int32-elements.d.ts +115 -0
  324. package/dist/contracts/int32-elements.js +1179 -0
  325. package/dist/contracts/int32-elements.js.map +1 -0
  326. package/dist/coverage/report.d.ts +16 -0
  327. package/dist/coverage/report.js +182 -1
  328. package/dist/coverage/report.js.map +1 -1
  329. package/dist/coverage/surface-manifest.js +19 -6
  330. package/dist/coverage/surface-manifest.js.map +1 -1
  331. package/dist/coverage/verdict-cache.d.ts +2 -0
  332. package/dist/coverage/verdict-cache.js +12 -0
  333. package/dist/coverage/verdict-cache.js.map +1 -1
  334. package/dist/coverage/verdict-cache.test.js +2 -1
  335. package/dist/coverage/verdict-cache.test.js.map +1 -1
  336. package/dist/diagnostics/diagnostic.d.ts +11 -7
  337. package/dist/diagnostics/diagnostic.js +35 -23
  338. package/dist/diagnostics/diagnostic.js.map +1 -1
  339. package/dist/diagnostics/envelope.d.ts +39 -2
  340. package/dist/diagnostics/envelope.js.map +1 -1
  341. package/dist/diagnostics/render.d.ts +7 -0
  342. package/dist/diagnostics/render.js +50 -13
  343. package/dist/diagnostics/render.js.map +1 -1
  344. package/dist/diagnostics/render.test.d.ts +1 -0
  345. package/dist/diagnostics/render.test.js +49 -0
  346. package/dist/diagnostics/render.test.js.map +1 -0
  347. package/dist/executable/executable-cache.d.ts +17 -0
  348. package/dist/executable/executable-cache.js +13 -1
  349. package/dist/executable/executable-cache.js.map +1 -1
  350. package/dist/executable/executable-cache.test.js +7 -1
  351. package/dist/executable/executable-cache.test.js.map +1 -1
  352. package/dist/executable/prepare.js +2 -1
  353. package/dist/executable/prepare.js.map +1 -1
  354. package/dist/frontend/analysis.js +6 -1
  355. package/dist/frontend/analysis.js.map +1 -1
  356. package/dist/frontend/builtin-modules.d.ts +16 -2
  357. package/dist/frontend/builtin-modules.js +40 -7
  358. package/dist/frontend/builtin-modules.js.map +1 -1
  359. package/dist/frontend/cjs-syntax.js +52 -51
  360. package/dist/frontend/cjs-syntax.js.map +1 -1
  361. package/dist/frontend/contract-types.d.ts +3 -0
  362. package/dist/frontend/contract-types.js +36 -7
  363. package/dist/frontend/contract-types.js.map +1 -1
  364. package/dist/frontend/experimental-import.d.ts +5 -1
  365. package/dist/frontend/experimental-import.js +26 -7
  366. package/dist/frontend/experimental-import.js.map +1 -1
  367. package/dist/frontend/fork-target.js +20 -22
  368. package/dist/frontend/fork-target.js.map +1 -1
  369. package/dist/frontend/fork-target.test.js +2 -1
  370. package/dist/frontend/fork-target.test.js.map +1 -1
  371. package/dist/frontend/function-completion.js +6 -6
  372. package/dist/frontend/function-completion.js.map +1 -1
  373. package/dist/frontend/helper-tokens.js +15 -3
  374. package/dist/frontend/helper-tokens.js.map +1 -1
  375. package/dist/frontend/helper-tokens.test.js +7 -1
  376. package/dist/frontend/helper-tokens.test.js.map +1 -1
  377. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  378. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  379. package/dist/frontend/input-tracker.d.ts +3 -0
  380. package/dist/frontend/input-tracker.js +32 -3
  381. package/dist/frontend/input-tracker.js.map +1 -1
  382. package/dist/frontend/lib-contract.js +36 -32
  383. package/dist/frontend/lib-contract.js.map +1 -1
  384. package/dist/frontend/lib-exports.js +3 -3
  385. package/dist/frontend/lib-exports.js.map +1 -1
  386. package/dist/frontend/lowering/array-values.d.ts +8 -3
  387. package/dist/frontend/lowering/array-values.js +60 -11
  388. package/dist/frontend/lowering/array-values.js.map +1 -1
  389. package/dist/frontend/lowering/assert-instances.js +4 -4
  390. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  391. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  392. package/dist/frontend/lowering/assertion-identity.js +70 -0
  393. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  394. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  395. package/dist/frontend/lowering/assertion-members.js +185 -0
  396. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  397. package/dist/frontend/lowering/binding-analysis.js +27 -20
  398. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  399. package/dist/frontend/lowering/builtin-calls.js +72 -4
  400. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  401. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  402. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  403. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  404. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  405. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  406. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  407. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  408. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  409. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  410. package/dist/frontend/lowering/builtins/blob.js +8 -6
  411. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  412. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
  413. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
  414. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  415. package/dist/frontend/lowering/builtins/callable-aliases.js +45 -6
  416. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  417. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  418. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  420. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  421. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  422. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  423. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  424. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  425. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  426. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  428. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  429. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  430. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  431. package/dist/frontend/lowering/builtins/compression.js +230 -52
  432. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  433. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  434. package/dist/frontend/lowering/builtins/constants.js +28 -7
  435. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  436. package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
  437. package/dist/frontend/lowering/builtins/crypto.js +223 -38
  438. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  439. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  440. package/dist/frontend/lowering/builtins/dates.js +92 -16
  441. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  442. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  443. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  444. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  445. package/dist/frontend/lowering/builtins/environment.js +3 -3
  446. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  447. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  448. package/dist/frontend/lowering/builtins/errors.js +174 -6
  449. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  450. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +4 -0
  451. package/dist/frontend/lowering/builtins/filesystem-calls.js +136 -113
  452. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  453. package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
  454. package/dist/frontend/lowering/builtins/filesystem.js +213 -76
  455. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  456. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  457. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  458. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  459. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
  461. package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
  462. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
  463. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  464. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  465. package/dist/frontend/lowering/builtins/json.js +232 -24
  466. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  467. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  468. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  469. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  470. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  471. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  472. package/dist/frontend/lowering/builtins/module-calls.js +67 -46
  473. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  475. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  476. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  478. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  479. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  480. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  481. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  482. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  483. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  484. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  485. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  486. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  487. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  488. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  489. package/dist/frontend/lowering/builtins/performance.js +259 -8
  490. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  491. package/dist/frontend/lowering/builtins/process.d.ts +32 -1
  492. package/dist/frontend/lowering/builtins/process.js +468 -99
  493. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  494. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  495. package/dist/frontend/lowering/builtins/promises.js +326 -43
  496. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  497. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
  498. package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
  499. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  500. package/dist/frontend/lowering/builtins/properties.js +37 -1
  501. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  502. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  503. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  504. package/dist/frontend/lowering/builtins/readline.d.ts +55 -13
  505. package/dist/frontend/lowering/builtins/readline.js +931 -69
  506. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  507. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  508. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  509. package/dist/frontend/lowering/builtins/reflection.js +16 -14
  510. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  511. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  512. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  513. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  514. package/dist/frontend/lowering/builtins/strings.js +101 -12
  515. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  516. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  517. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  518. package/dist/frontend/lowering/builtins/timers.js +75 -30
  519. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  520. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  521. package/dist/frontend/lowering/builtins/url.js +120 -17
  522. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  523. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  524. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  525. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  526. package/dist/frontend/lowering/builtins/v8.js +105 -0
  527. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  528. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  529. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  530. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  531. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  532. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  533. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  534. package/dist/frontend/lowering/builtins/workers.d.ts +16 -0
  535. package/dist/frontend/lowering/builtins/workers.js +246 -3
  536. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  537. package/dist/frontend/lowering/call-arguments.js +69 -14
  538. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  539. package/dist/frontend/lowering/call-signatures.d.ts +19 -1
  540. package/dist/frontend/lowering/call-signatures.js +254 -47
  541. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  542. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  543. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  544. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  545. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  546. package/dist/frontend/lowering/cjs-exports-object.js +528 -0
  547. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  548. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  549. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  550. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  551. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  552. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  553. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  554. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  555. package/dist/frontend/lowering/class-attributes.js +378 -0
  556. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  557. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  558. package/dist/frontend/lowering/class-callbacks.js +21 -10
  559. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  560. package/dist/frontend/lowering/class-construction.js +49 -4
  561. package/dist/frontend/lowering/class-construction.js.map +1 -1
  562. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  563. package/dist/frontend/lowering/class-descriptors.js +8 -8
  564. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  565. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  566. package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
  567. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  568. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  569. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  570. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  571. package/dist/frontend/lowering/class-iterables.js +31 -0
  572. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  573. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  574. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  575. package/dist/frontend/lowering/class-method-values.js +56 -10
  576. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  577. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  578. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  579. package/dist/frontend/lowering/class-protocols.d.ts +55 -0
  580. package/dist/frontend/lowering/class-protocols.js +738 -22
  581. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  582. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  583. package/dist/frontend/lowering/class-prototypes.js +80 -18
  584. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  585. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  586. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  587. package/dist/frontend/lowering/class-static-data.js +2 -2
  588. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  589. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  590. package/dist/frontend/lowering/class-to-primitive.js +261 -0
  591. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  592. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  593. package/dist/frontend/lowering/class-unions.js +102 -1
  594. package/dist/frontend/lowering/class-unions.js.map +1 -1
  595. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  596. package/dist/frontend/lowering/code-generation.js +127 -0
  597. package/dist/frontend/lowering/code-generation.js.map +1 -0
  598. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  599. package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
  600. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  601. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  602. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  603. package/dist/frontend/lowering/coercions/structural.js +35 -3
  604. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  605. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  606. package/dist/frontend/lowering/coercions/unions.js +57 -1
  607. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  608. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  609. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  610. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  611. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  612. package/dist/frontend/lowering/construction-escapes.js +8 -8
  613. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  614. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  615. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  616. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  617. package/dist/frontend/lowering/constructor-returns.js +477 -0
  618. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  619. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  620. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  621. package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
  622. package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
  623. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  624. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  625. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  626. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  627. package/dist/frontend/lowering/containers/array-construction.js +51 -13
  628. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  629. package/dist/frontend/lowering/containers/array-from-async.d.ts +19 -0
  630. package/dist/frontend/lowering/containers/array-from-async.js +427 -0
  631. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
  632. package/dist/frontend/lowering/containers/array-methods.js +89 -77
  633. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  634. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  635. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  636. package/dist/frontend/lowering/containers/bytes.js +161 -101
  637. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  638. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  639. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  640. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  641. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  642. package/dist/frontend/lowering/containers/collection-grouping.js +219 -27
  643. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  644. package/dist/frontend/lowering/containers/collection-methods.js +81 -48
  645. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  646. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  647. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  648. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  649. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  650. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  651. package/dist/frontend/lowering/containers/for-of.js +19 -19
  652. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  653. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  654. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  655. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  656. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  657. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  658. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  659. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  660. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  661. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  662. package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
  663. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  664. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  665. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  666. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
  667. package/dist/frontend/lowering/cycle-initialization.js +39 -0
  668. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  669. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  670. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  671. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  672. package/dist/frontend/lowering/devirtualize.js +27 -7
  673. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  674. package/dist/frontend/lowering/divergences.d.ts +0 -5
  675. package/dist/frontend/lowering/divergences.js +238 -128
  676. package/dist/frontend/lowering/divergences.js.map +1 -1
  677. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  678. package/dist/frontend/lowering/dyn-streams.js +257 -0
  679. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  680. package/dist/frontend/lowering/error-methods.js +4 -1
  681. package/dist/frontend/lowering/error-methods.js.map +1 -1
  682. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  683. package/dist/frontend/lowering/error-name-order.js +93 -0
  684. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  685. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  686. package/dist/frontend/lowering/expressions/array-literals.js +703 -0
  687. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  688. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  689. package/dist/frontend/lowering/expressions/binary.js +2483 -0
  690. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  691. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  692. package/dist/frontend/lowering/expressions/element-access.js +1797 -0
  693. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  694. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  695. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  696. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  697. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  698. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  699. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  700. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  701. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  702. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
  703. package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
  704. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  705. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  706. package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
  707. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  708. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  709. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  710. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  711. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  712. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  713. package/dist/frontend/lowering/expressions/object-literals.js +253 -85
  714. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  715. package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
  716. package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
  717. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
  719. package/dist/frontend/lowering/expressions/property-access.js +3544 -0
  720. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  721. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  722. package/dist/frontend/lowering/expressions/relational.js +1679 -0
  723. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  724. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  725. package/dist/frontend/lowering/expressions/typeof.js +538 -0
  726. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  727. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  728. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  729. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  730. package/dist/frontend/lowering/expressions/updates.js +780 -0
  731. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  732. package/dist/frontend/lowering/function-context.d.ts +10 -0
  733. package/dist/frontend/lowering/function-context.js +11 -1
  734. package/dist/frontend/lowering/function-context.js.map +1 -1
  735. package/dist/frontend/lowering/function-returns.js +52 -28
  736. package/dist/frontend/lowering/function-returns.js.map +1 -1
  737. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  738. package/dist/frontend/lowering/general-streams.js +108 -0
  739. package/dist/frontend/lowering/general-streams.js.map +1 -0
  740. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  741. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  742. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  743. package/dist/frontend/lowering/generic-functions.d.ts +39 -0
  744. package/dist/frontend/lowering/generic-functions.js +393 -75
  745. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  746. package/dist/frontend/lowering/import-meta.js +2 -2
  747. package/dist/frontend/lowering/import-meta.js.map +1 -1
  748. package/dist/frontend/lowering/intern-tables.js +10 -9
  749. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  750. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  751. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  752. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  753. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  754. package/dist/frontend/lowering/js-class-fields.js +170 -0
  755. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  756. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  757. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  758. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  759. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  760. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  761. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  762. package/dist/frontend/lowering/json-require.d.ts +22 -0
  763. package/dist/frontend/lowering/json-require.js +131 -0
  764. package/dist/frontend/lowering/json-require.js.map +1 -0
  765. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  766. package/dist/frontend/lowering/key-order-witness.js +641 -0
  767. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  768. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  769. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  770. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  771. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  772. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  773. package/dist/frontend/lowering/lower-assert.js +61 -60
  774. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  775. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  776. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  777. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  778. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  779. package/dist/frontend/lowering/lower-builtin-values.js +32 -3
  780. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  781. package/dist/frontend/lowering/lower-calls.js +1298 -452
  782. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  783. package/dist/frontend/lowering/lower-classes.d.ts +50 -3
  784. package/dist/frontend/lowering/lower-classes.js +1499 -456
  785. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  786. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  787. package/dist/frontend/lowering/lower-comptime.js +111 -13
  788. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  789. package/dist/frontend/lowering/lower-console.js +13 -11
  790. package/dist/frontend/lowering/lower-console.js.map +1 -1
  791. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  792. package/dist/frontend/lowering/lower-dgram.js +179 -8
  793. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  794. package/dist/frontend/lowering/lower-enums.js +113 -14
  795. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  796. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  797. package/dist/frontend/lowering/lower-event-emitter.js +268 -71
  798. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  799. package/dist/frontend/lowering/lower-event-target.js +2 -2
  800. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  801. package/dist/frontend/lowering/lower-expando.js +17 -13
  802. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  803. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  804. package/dist/frontend/lowering/lower-exprs.js +1493 -12407
  805. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  806. package/dist/frontend/lowering/lower-functions.js +68 -22
  807. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  808. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  809. package/dist/frontend/lowering/lower-generators.js +29 -16
  810. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  811. package/dist/frontend/lowering/lower-global-value.js +5 -1
  812. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  813. package/dist/frontend/lowering/lower-inspect.js +354 -99
  814. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  815. package/dist/frontend/lowering/lower-mixins.js +23 -20
  816. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  817. package/dist/frontend/lowering/lower-mock.d.ts +19 -2
  818. package/dist/frontend/lowering/lower-mock.js +557 -74
  819. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  820. package/dist/frontend/lowering/lower-modules.js +268 -61
  821. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  822. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  823. package/dist/frontend/lowering/lower-namespaces.js +45 -33
  824. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  825. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  826. package/dist/frontend/lowering/lower-node-module.js +147 -14
  827. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  828. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  829. package/dist/frontend/lowering/lower-server.js +638 -105
  830. package/dist/frontend/lowering/lower-server.js.map +1 -1
  831. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  832. package/dist/frontend/lowering/lower-stdlib.js +151 -109
  833. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  834. package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
  835. package/dist/frontend/lowering/lower-stmts.js +1589 -398
  836. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  837. package/dist/frontend/lowering/lower-stream.d.ts +4 -3
  838. package/dist/frontend/lowering/lower-stream.js +714 -75
  839. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  840. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  841. package/dist/frontend/lowering/lower-test.js +574 -100
  842. package/dist/frontend/lowering/lower-test.js.map +1 -1
  843. package/dist/frontend/lowering/lower-timers.js +80 -32
  844. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  845. package/dist/frontend/lowering/lower-url.js +1 -1
  846. package/dist/frontend/lowering/lower-url.js.map +1 -1
  847. package/dist/frontend/lowering/lowerer.d.ts +409 -26
  848. package/dist/frontend/lowering/lowerer.js +1918 -305
  849. package/dist/frontend/lowering/lowerer.js.map +1 -1
  850. package/dist/frontend/lowering/lowerer.test.js +10 -4
  851. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  852. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  853. package/dist/frontend/lowering/maybe-promise.js +249 -0
  854. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  855. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  856. package/dist/frontend/lowering/module-member-this.js +262 -0
  857. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  858. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  859. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  860. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  861. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  862. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  863. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  864. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  865. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  866. package/dist/frontend/lowering/native-ffi.js +11 -11
  867. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  868. package/dist/frontend/lowering/null-prototype.d.ts +13 -0
  869. package/dist/frontend/lowering/null-prototype.js +33 -0
  870. package/dist/frontend/lowering/null-prototype.js.map +1 -0
  871. package/dist/frontend/lowering/object-factory-new.js +6 -8
  872. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  873. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  874. package/dist/frontend/lowering/private-brands.js +265 -0
  875. package/dist/frontend/lowering/private-brands.js.map +1 -0
  876. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  877. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  878. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  879. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  880. package/dist/frontend/lowering/require-initialization.js +246 -0
  881. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  882. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  883. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  884. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  885. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  886. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  887. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  888. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  889. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  890. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  891. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  892. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  893. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  894. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  895. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  896. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  897. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  898. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  899. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  900. package/dist/frontend/lowering/split-consumers.js +4 -4
  901. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  902. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  903. package/dist/frontend/lowering/static-function-names.js +212 -0
  904. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  905. package/dist/frontend/lowering/static-this.js +6 -6
  906. package/dist/frontend/lowering/static-this.js.map +1 -1
  907. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  908. package/dist/frontend/lowering/strict-mode.js +31 -0
  909. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  910. package/dist/frontend/lowering/string-index-bounds.js +10 -10
  911. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  912. package/dist/frontend/lowering/string-index.d.ts +12 -0
  913. package/dist/frontend/lowering/string-index.js +72 -1
  914. package/dist/frontend/lowering/string-index.js.map +1 -1
  915. package/dist/frontend/lowering/surfaces.d.ts +15 -6
  916. package/dist/frontend/lowering/surfaces.js +278 -45
  917. package/dist/frontend/lowering/surfaces.js.map +1 -1
  918. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  919. package/dist/frontend/lowering/symbol-fields.js +204 -36
  920. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  921. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  922. package/dist/frontend/lowering/symbol-methods.js +24 -6
  923. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  924. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  925. package/dist/frontend/lowering/thread-slots.js +208 -0
  926. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  927. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  928. package/dist/frontend/lowering/typed-arguments.js +472 -0
  929. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  930. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  931. package/dist/frontend/lowering/union-retag.js +27 -0
  932. package/dist/frontend/lowering/union-retag.js.map +1 -1
  933. package/dist/frontend/lowering/union-retag.test.js +24 -1
  934. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  935. package/dist/frontend/lowering/var-hoisting.js +6 -6
  936. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  937. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  938. package/dist/frontend/mock-shapes.d.ts +5 -0
  939. package/dist/frontend/mock-shapes.js +39 -7
  940. package/dist/frontend/mock-shapes.js.map +1 -1
  941. package/dist/frontend/module-source-candidates.js +1 -1
  942. package/dist/frontend/module-source-candidates.js.map +1 -1
  943. package/dist/frontend/module-source-candidates.test.js +2 -1
  944. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  945. package/dist/frontend/module-syntax.js +8 -8
  946. package/dist/frontend/module-syntax.js.map +1 -1
  947. package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
  948. package/dist/frontend/npm-static-bundled-chunks.js +810 -0
  949. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  950. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  951. package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
  952. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  953. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  954. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  955. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  956. package/dist/frontend/npm-static-bundled-esm.js +768 -0
  957. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  958. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  959. package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
  960. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  961. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  962. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  963. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  964. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  965. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  966. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  967. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  968. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  969. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  970. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  971. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  972. package/dist/frontend/npm-static-prune.js +36 -24
  973. package/dist/frontend/npm-static-prune.js.map +1 -1
  974. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  975. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  976. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  977. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  978. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  979. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  980. package/dist/frontend/npm-static-subtyping.js +7 -9
  981. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  982. package/dist/frontend/npm-static.d.ts +17 -1
  983. package/dist/frontend/npm-static.js +167 -16
  984. package/dist/frontend/npm-static.js.map +1 -1
  985. package/dist/frontend/npm-static.test.js +22 -1
  986. package/dist/frontend/npm-static.test.js.map +1 -1
  987. package/dist/frontend/pipeline.js +164 -26
  988. package/dist/frontend/pipeline.js.map +1 -1
  989. package/dist/frontend/pipeline.test.js +22 -1
  990. package/dist/frontend/pipeline.test.js.map +1 -1
  991. package/dist/frontend/program-analysis.d.ts +6 -1
  992. package/dist/frontend/program-analysis.js +7 -0
  993. package/dist/frontend/program-analysis.js.map +1 -1
  994. package/dist/frontend/program.d.ts +92 -2
  995. package/dist/frontend/program.js +1557 -254
  996. package/dist/frontend/program.js.map +1 -1
  997. package/dist/frontend/program.test.js +76 -6
  998. package/dist/frontend/program.test.js.map +1 -1
  999. package/dist/frontend/resolve.js +36 -2
  1000. package/dist/frontend/resolve.js.map +1 -1
  1001. package/dist/frontend/resolve.test.js +49 -0
  1002. package/dist/frontend/resolve.test.js.map +1 -1
  1003. package/dist/frontend/services.d.ts +20 -1
  1004. package/dist/frontend/services.js +40 -3
  1005. package/dist/frontend/services.js.map +1 -1
  1006. package/dist/frontend/services.test.js +2 -1
  1007. package/dist/frontend/services.test.js.map +1 -1
  1008. package/dist/frontend/threads-import.js +1 -1
  1009. package/dist/frontend/threads-import.js.map +1 -1
  1010. package/dist/frontend/tier-analysis.d.ts +71 -0
  1011. package/dist/frontend/tier-analysis.js +522 -0
  1012. package/dist/frontend/tier-analysis.js.map +1 -0
  1013. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  1014. package/dist/frontend/ts7/api-conformance.js +7 -0
  1015. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  1016. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  1017. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  1018. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  1019. package/dist/frontend/ts7/ast-node.js +64 -18
  1020. package/dist/frontend/ts7/ast-node.js.map +1 -1
  1021. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1022. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1023. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1024. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1025. package/dist/frontend/ts7/ast.d.ts +1 -0
  1026. package/dist/frontend/ts7/ast.js +3 -2
  1027. package/dist/frontend/ts7/ast.js.map +1 -1
  1028. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1029. package/dist/frontend/ts7/checker-backend.js +88 -0
  1030. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1031. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1032. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1033. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1034. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1035. package/dist/frontend/ts7/checker-cache.js +0 -6
  1036. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1037. package/dist/frontend/ts7/checker.d.ts +18 -11
  1038. package/dist/frontend/ts7/checker.js +42 -55
  1039. package/dist/frontend/ts7/checker.js.map +1 -1
  1040. package/dist/frontend/ts7/checker.test.js +10 -7
  1041. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1042. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1043. package/dist/frontend/ts7/diagnostic.js +22 -0
  1044. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1045. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1046. package/dist/frontend/ts7/node-functions.js +18 -0
  1047. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1048. package/dist/frontend/ts7/program-host.d.ts +5 -1
  1049. package/dist/frontend/ts7/program-host.js +12 -0
  1050. package/dist/frontend/ts7/program-host.js.map +1 -1
  1051. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1052. package/dist/frontend/ts7/rpc-api.js +8 -1
  1053. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1054. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1055. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1056. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1057. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1058. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1059. package/dist/frontend/ts7/semantic-model.d.ts +54 -24
  1060. package/dist/frontend/ts7/semantic-model.js +88 -16
  1061. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1062. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1063. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1064. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1065. package/dist/frontend/ts7/semantic-types.js +1 -1
  1066. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1067. package/dist/frontend/ts7/session.d.ts +11 -11
  1068. package/dist/frontend/ts7/session.js +8 -5
  1069. package/dist/frontend/ts7/session.js.map +1 -1
  1070. package/dist/frontend/ts7/session.test.js +9 -5
  1071. package/dist/frontend/ts7/session.test.js.map +1 -1
  1072. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1073. package/dist/frontend/ts7/source-parser.js +24 -3
  1074. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1075. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1076. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1077. package/dist/frontend/type-mapper.d.ts +122 -2
  1078. package/dist/frontend/type-mapper.js +2612 -695
  1079. package/dist/frontend/type-mapper.js.map +1 -1
  1080. package/dist/frontend/type-only-imports.d.ts +28 -0
  1081. package/dist/frontend/type-only-imports.js +122 -0
  1082. package/dist/frontend/type-only-imports.js.map +1 -0
  1083. package/dist/frontend/worker-target.js +8 -8
  1084. package/dist/frontend/worker-target.js.map +1 -1
  1085. package/dist/index.d.ts +3 -1
  1086. package/dist/index.js +47 -10
  1087. package/dist/index.js.map +1 -1
  1088. package/dist/ir/analysis.js +4 -2
  1089. package/dist/ir/analysis.js.map +1 -1
  1090. package/dist/ir/api.d.ts +1 -1
  1091. package/dist/ir/api.js +1 -1
  1092. package/dist/ir/api.js.map +1 -1
  1093. package/dist/ir/array-length-stability.d.ts +30 -0
  1094. package/dist/ir/array-length-stability.js +236 -0
  1095. package/dist/ir/array-length-stability.js.map +1 -0
  1096. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1097. package/dist/ir/array-length-stability.test.js +113 -0
  1098. package/dist/ir/array-length-stability.test.js.map +1 -0
  1099. package/dist/ir/build.d.ts +2 -2
  1100. package/dist/ir/build.js +1 -1
  1101. package/dist/ir/build.js.map +1 -1
  1102. package/dist/ir/builtin-effects.js +139 -0
  1103. package/dist/ir/builtin-effects.js.map +1 -1
  1104. package/dist/ir/builtin-signatures.d.ts +1 -1
  1105. package/dist/ir/builtin-signatures.js +655 -25
  1106. package/dist/ir/builtin-signatures.js.map +1 -1
  1107. package/dist/ir/byte-numbers.js +3 -0
  1108. package/dist/ir/byte-numbers.js.map +1 -1
  1109. package/dist/ir/callback-specialization.d.ts +37 -0
  1110. package/dist/ir/callback-specialization.js +459 -0
  1111. package/dist/ir/callback-specialization.js.map +1 -0
  1112. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1113. package/dist/ir/callback-specialization.test.js +208 -0
  1114. package/dist/ir/callback-specialization.test.js.map +1 -0
  1115. package/dist/ir/capture-values.d.ts +0 -1
  1116. package/dist/ir/capture-values.js +51 -40
  1117. package/dist/ir/capture-values.js.map +1 -1
  1118. package/dist/ir/constant-globals.test.js +1 -1
  1119. package/dist/ir/constant-tables.test.js +1 -1
  1120. package/dist/ir/field-values.test.js +1 -1
  1121. package/dist/ir/final-fields.test.js +1 -1
  1122. package/dist/ir/function-references.test.js +10 -1
  1123. package/dist/ir/function-references.test.js.map +1 -1
  1124. package/dist/ir/init-only-globals.test.js +1 -1
  1125. package/dist/ir/initializer-bindings.test.js +1 -1
  1126. package/dist/ir/int32-slots.d.ts +14 -0
  1127. package/dist/ir/int32-slots.js +119 -14
  1128. package/dist/ir/int32-slots.js.map +1 -1
  1129. package/dist/ir/int32-slots.test.js +29 -1
  1130. package/dist/ir/int32-slots.test.js.map +1 -1
  1131. package/dist/ir/integer-loop-facts.d.ts +16 -6
  1132. package/dist/ir/integer-loop-facts.js +143 -38
  1133. package/dist/ir/integer-loop-facts.js.map +1 -1
  1134. package/dist/ir/integer-loops.d.ts +1 -1
  1135. package/dist/ir/integer-loops.js +39 -9
  1136. package/dist/ir/integer-loops.js.map +1 -1
  1137. package/dist/ir/integer-loops.test.js +104 -0
  1138. package/dist/ir/integer-loops.test.js.map +1 -1
  1139. package/dist/ir/integer-ranges.d.ts +3 -0
  1140. package/dist/ir/integer-ranges.js +4 -6
  1141. package/dist/ir/integer-ranges.js.map +1 -1
  1142. package/dist/ir/integer-ranges.test.js +142 -1
  1143. package/dist/ir/integer-ranges.test.js.map +1 -1
  1144. package/dist/ir/intrinsic-signatures.js +6 -0
  1145. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1146. package/dist/ir/ir.d.ts +234 -58
  1147. package/dist/ir/ir.js +123 -12
  1148. package/dist/ir/ir.js.map +1 -1
  1149. package/dist/ir/ir.test.js +10 -0
  1150. package/dist/ir/ir.test.js.map +1 -1
  1151. package/dist/ir/jsval.d.ts +8 -0
  1152. package/dist/ir/jsval.js +365 -0
  1153. package/dist/ir/jsval.js.map +1 -0
  1154. package/dist/ir/jsval.test.d.ts +1 -0
  1155. package/dist/ir/jsval.test.js +239 -0
  1156. package/dist/ir/jsval.test.js.map +1 -0
  1157. package/dist/ir/runtime-features.d.ts +150 -33
  1158. package/dist/ir/runtime-features.js +672 -339
  1159. package/dist/ir/runtime-features.js.map +1 -1
  1160. package/dist/ir/runtime-features.test.js +62 -0
  1161. package/dist/ir/runtime-features.test.js.map +1 -1
  1162. package/dist/ir/scalar-records.test.js +1 -1
  1163. package/dist/ir/self-captures.d.ts +33 -0
  1164. package/dist/ir/self-captures.js +245 -0
  1165. package/dist/ir/self-captures.js.map +1 -0
  1166. package/dist/ir/self-captures.test.d.ts +1 -0
  1167. package/dist/ir/self-captures.test.js +135 -0
  1168. package/dist/ir/self-captures.test.js.map +1 -0
  1169. package/dist/ir/serialize.d.ts +1 -1
  1170. package/dist/ir/serialize.js +7 -4
  1171. package/dist/ir/serialize.js.map +1 -1
  1172. package/dist/ir/tiers.d.ts +26 -0
  1173. package/dist/ir/tiers.js +101 -0
  1174. package/dist/ir/tiers.js.map +1 -0
  1175. package/dist/ir/tiers.test.d.ts +1 -0
  1176. package/dist/ir/tiers.test.js +140 -0
  1177. package/dist/ir/tiers.test.js.map +1 -0
  1178. package/dist/ir/traverse.js +107 -94
  1179. package/dist/ir/traverse.js.map +1 -1
  1180. package/dist/ir/traverse.test.js +33 -30
  1181. package/dist/ir/traverse.test.js.map +1 -1
  1182. package/dist/ir/unshare.js +65 -3
  1183. package/dist/ir/unshare.js.map +1 -1
  1184. package/dist/ir/unshare.test.js +1 -1
  1185. package/dist/ir/validate.js +220 -71
  1186. package/dist/ir/validate.js.map +1 -1
  1187. package/dist/ir/validate.test.js +64 -9
  1188. package/dist/ir/validate.test.js.map +1 -1
  1189. package/dist/library/fence-eval.test.js +1 -1
  1190. package/dist/library/int-infer.test.js +4 -4
  1191. package/dist/library/ir-policy.js +18 -0
  1192. package/dist/library/ir-policy.js.map +1 -1
  1193. package/dist/library/library-cache.d.ts +1 -0
  1194. package/dist/library/library-cache.js.map +1 -1
  1195. package/dist/library/library-cache.test.js +5 -5
  1196. package/dist/library/library-profile.d.ts +4 -4
  1197. package/dist/library/library-profile.js +35 -7
  1198. package/dist/library/library-profile.js.map +1 -1
  1199. package/dist/library/prepare.js +13 -1
  1200. package/dist/library/prepare.js.map +1 -1
  1201. package/dist/native/cli.js +5 -0
  1202. package/dist/native/cli.js.map +1 -1
  1203. package/dist/native/compiler.js +2 -2
  1204. package/dist/native/compiler.js.map +1 -1
  1205. package/dist/native/compiler.test.js +2 -2
  1206. package/dist/native/prepare.js +7 -0
  1207. package/dist/native/prepare.js.map +1 -1
  1208. package/dist/native/sanitizer.test.js +12 -0
  1209. package/dist/native/sanitizer.test.js.map +1 -1
  1210. package/dist/native/toolchain.d.ts +2 -0
  1211. package/dist/native/toolchain.js +10 -1
  1212. package/dist/native/toolchain.js.map +1 -1
  1213. package/dist/native/toolchain.test.js +39 -1
  1214. package/dist/native/toolchain.test.js.map +1 -1
  1215. package/dist/startup-cache.d.ts +1 -0
  1216. package/dist/startup-cache.js +1 -0
  1217. package/dist/startup-cache.js.map +1 -1
  1218. package/dist/wasm/base64.d.ts +5 -0
  1219. package/dist/wasm/base64.js +62 -0
  1220. package/dist/wasm/base64.js.map +1 -0
  1221. package/dist/wasm/binary.d.ts +36 -0
  1222. package/dist/wasm/binary.js +1976 -0
  1223. package/dist/wasm/binary.js.map +1 -0
  1224. package/dist/wasm/binary.test.d.ts +1 -0
  1225. package/dist/wasm/binary.test.js +190 -0
  1226. package/dist/wasm/binary.test.js.map +1 -0
  1227. package/dist/wasm/discover.d.ts +38 -0
  1228. package/dist/wasm/discover.js +377 -0
  1229. package/dist/wasm/discover.js.map +1 -0
  1230. package/dist/wasm/discover.test.d.ts +1 -0
  1231. package/dist/wasm/discover.test.js +24 -0
  1232. package/dist/wasm/discover.test.js.map +1 -0
  1233. package/dist/wasm/module.d.ts +151 -0
  1234. package/dist/wasm/module.js +575 -0
  1235. package/dist/wasm/module.js.map +1 -0
  1236. package/dist/wasm/translate.d.ts +48 -0
  1237. package/dist/wasm/translate.js +2129 -0
  1238. package/dist/wasm/translate.js.map +1 -0
  1239. package/dist/wasm/translate.test.d.ts +1 -0
  1240. package/dist/wasm/translate.test.js +207 -0
  1241. package/dist/wasm/translate.test.js.map +1 -0
  1242. package/package.json +21 -20
  1243. package/surface-manifest.json +332 -36
@@ -0,0 +1,1797 @@
1
+ /* Element reads and writes (`a[i]`, `a[i] = v`), compound element updates, and keyed record reads. */
2
+ import * as ts from "../../ts7/adapter.js";
3
+ import { jsFuncNameOf, neverTaintedJsType } from "../lowerer.js";
4
+ import { BOOL, DYN, F64, NULL_T, STRING, UNDEFINED_T, VOID, canBoxFuncIntoDyn, canDynCheckTo, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
5
+ import { importMetaField, isImportMeta } from "../import-meta.js";
6
+ import { hasOptionalChainGuard, isOptionalChainTail } from "./optional-chains.js";
7
+ import { lowerEnumAccess } from "../lower-enums.js";
8
+ import { fenceNodeModuleMutation, lowerRequireCacheElement } from "../lower-node-module.js";
9
+ import { lowerModuleNamespaceElement } from "../module-namespace-elements.js";
10
+ import { stdlibGlobalNameOf } from "../surfaces.js";
11
+ import { globalSymbolKey } from "./global-symbols.js";
12
+ import { isJsSourceFile, locOf } from "../../program.js";
13
+ import { lowerGlobalValue } from "../lower-global-value.js";
14
+ import { expandoMemberRead } from "../lower-expando.js";
15
+ import { assertedElementKeepsUndefined, compoundUnsupported, concatOperand, dynCompoundValue, hasClassPayload, lowerDynMemberAssignment, lowerOptionalArrayIndexRead, lowerOptionalNumber, recordKeyResultOk, representedClassFieldTarget, runtimeOptionalElementKey, symbolFieldTarget, } from "../lower-exprs.js";
16
+ import { hasRuntimeStatics } from "../class-runtime-statics.js";
17
+ import { tryLowerExpression } from "./try-lower-expression.js";
18
+ import { classFieldTarget, lowerUnionKeyedRead } from "./property-access.js";
19
+ import { arrayNumberRead, arrayValueRead, arrayValueStore, arrayValueType, lowerSafeBytesRead, lowerSafeIndexRead, } from "../array-values.js";
20
+ import { lowerOptionalStringIndex, lowerUnionStringIndex } from "../string-index.js";
21
+ import { InternalCompilerError } from "../../../errors.js";
22
+ import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../../ir/build.js";
23
+ import { npmStaticPackageOfPath } from "../../npm-static.js";
24
+ import { isSafeToRepeat } from "./evaluation-safety.js";
25
+ import { lowerClassPrototypeComputedAssignment } from "../class-prototypes.js";
26
+ import { isClassCallback } from "../class-callbacks.js";
27
+ import { isKeyedFieldAccess } from "./keyed-field-targets.js";
28
+ import { lowerFieldCompoundValue } from "./updates.js";
29
+ /** `a[i]` reads. Only f64 indices into array receivers are modeled; JS
30
+ * string-key element access (`a["length"]`) and string indexing (`s[0]`
31
+ * typechecks against the lib's index signature; use .charAt) stay out. */
32
+ export function lowerElementAccess(lowerer, expr) {
33
+ if (isImportMeta(expr.expression)) {
34
+ const name = lowerer.foldedStringKeyOf(expr.argumentExpression);
35
+ if (name === null)
36
+ lowerer.unsupported("SC1090", expr, "import.meta with a runtime-computed key (use a statically-known metadata field)");
37
+ return importMetaField(lowerer, expr, name);
38
+ }
39
+ // `a?.[i]`: the guard lowers as an optional-chain step around the
40
+ // plain element read below.
41
+ if (expr.questionDotToken && !lowerer.chainHandled.has(expr)) {
42
+ return lowerer.lowerOptionalChain(expr);
43
+ }
44
+ // `a?.b[i]` — the tail of a chain whose token sits deeper: the whole
45
+ // tail short-circuits with the guard.
46
+ if (!expr.questionDotToken && isOptionalChainTail(lowerer, expr)) {
47
+ return lowerer.lowerOptionalChain(expr);
48
+ }
49
+ // Enum accesses in element clothing — `E["A"]` forward reads and
50
+ // `E[0]` reverse-mapping reads — fold to constants (lower-enums.ts),
51
+ // claimed before any receiver-kind dispatch can see the enum object.
52
+ {
53
+ const en = lowerEnumAccess(lowerer, expr);
54
+ if (en)
55
+ return en;
56
+ }
57
+ const cachedModule = lowerRequireCacheElement(lowerer, expr);
58
+ if (cachedModule)
59
+ return cachedModule;
60
+ const namespaceElement = lowerModuleNamespaceElement(lowerer, expr);
61
+ if (namespaceElement)
62
+ return namespaceElement;
63
+ // Native Web handles use the same supported surface for bracket and dot
64
+ // spellings. Fence a statically-known unsupported key before the generic
65
+ // checked-dynamic element-read path can turn it into a runtime missing
66
+ // member.
67
+ lowerer.fenceStaticAbortControllerMemberRead(expr);
68
+ lowerer.fenceStaticResponseMember(expr, "read");
69
+ lowerer.fenceStaticHeadersMember(expr, "read");
70
+ lowerer.fenceStaticReadableStreamMember(expr, "read");
71
+ // Computed global reads share the stored global object's custom
72
+ // properties. Symbol keys retain their identity-indexed store.
73
+ if (!expr.questionDotToken && stdlibGlobalNameOf(lowerer, expr.expression) === "globalThis") {
74
+ const symbol = globalSymbolKey(lowerer, expr.expression, expr.argumentExpression);
75
+ if (symbol)
76
+ return {
77
+ kind: "libCall",
78
+ fn: "dyn.globalSymbolGet",
79
+ args: [symbol],
80
+ type: DYN,
81
+ loc: locOf(expr),
82
+ };
83
+ const key = lowerer.lowerExpr(expr.argumentExpression);
84
+ const name = key.type.kind === "string"
85
+ ? key
86
+ : {
87
+ kind: "libCall",
88
+ fn: "dyn.toStringCoerce",
89
+ args: [lowerer.coerceInto(expr.argumentExpression, key, DYN)],
90
+ type: STRING,
91
+ loc: locOf(expr),
92
+ };
93
+ return {
94
+ kind: "dynKeyGet",
95
+ value: lowerGlobalValue(lowerer, expr.expression),
96
+ key: name,
97
+ type: DYN,
98
+ loc: locOf(expr),
99
+ };
100
+ }
101
+ // `req.headers["x-name"]` — the computed twin of `req.headers.host`
102
+ // (the server spoke owns both; the envGet precedent).
103
+ {
104
+ const header = lowerer.lowerHttpHeadersElement(expr);
105
+ if (header)
106
+ return lowerer.maybeNarrow(header, expr);
107
+ }
108
+ // `process.env[expr]` — the computed twin of `process.env.NAME`; both
109
+ // lower to the ONE process.envGet intrinsic. The read narrows like any
110
+ // union-typed expression when the checker narrowed this occurrence.
111
+ if (lowerer.isProcessEnv(expr.expression)) {
112
+ const key = lowerEnvironmentKey(lowerer, expr.argumentExpression);
113
+ if (key.type.kind !== "string") {
114
+ lowerer.unsupported("SC1090", expr.argumentExpression, "indexing process.env with non-string keys");
115
+ }
116
+ const get = {
117
+ kind: "libCall",
118
+ fn: "process.envGet",
119
+ args: [key],
120
+ type: lowerer.envValueType(),
121
+ loc: locOf(expr),
122
+ };
123
+ return lowerer.maybeNarrow(get, expr);
124
+ }
125
+ // Expando function members in element clothing (`foo[strMem]`,
126
+ // `foo[_private]` where foo is a module-level function/callable const
127
+ // and the key folds or is a unique-symbol const): the member's module
128
+ // global — the dotted read's twin (lower-expando.ts).
129
+ {
130
+ const ex = expandoMemberRead(lowerer, expr);
131
+ if (ex)
132
+ return lowerer.maybeNarrow(ex, expr);
133
+ }
134
+ // Symbol-keyed property READS (`this[kLimit]`): when the key is a
135
+ // statically-resolvable symbol declared as a field of the receiver's
136
+ // class (classSymbolKeyOf — the countdown.js/OpenTUI idioms), the
137
+ // read IS an ordinary field read of the hidden slot. Every other
138
+ // symbol key stays fenced: record shapes, runtime-identity keys
139
+ // (symbol parameters, reassigned bindings), and keys no class declares
140
+ // — the layouts are compile-time field lists.
141
+ if (lowerer.mapTypeOf(lowerer.typeOf(expr.argumentExpression))?.kind === "symbol") {
142
+ const target = symbolFieldTarget(lowerer, expr);
143
+ if (target)
144
+ return lowerer.maybeNarrow(lowerer.fieldGetExpr(target, locOf(expr), expr), expr);
145
+ let receiver = lowerer.lowerExpr(expr.expression);
146
+ const classInfo = receiver.type.kind === "classval" ? lowerer.classes.get(receiver.type.className) : undefined;
147
+ if (receiver.type.kind === "func" ||
148
+ receiver.type.kind === "generator" ||
149
+ ((receiver.type.kind === "array" ||
150
+ receiver.type.kind === "string" ||
151
+ receiver.type.kind === "bytes") &&
152
+ lowerer.dynConvertible(receiver.type)) ||
153
+ (receiver.type.kind === "object" && lowerer.dynConvertible(receiver.type)) ||
154
+ isDynTypedRefType(receiver.type) ||
155
+ (classInfo && (classInfo.callableBase || hasRuntimeStatics(classInfo))) ||
156
+ ((receiver.type.kind === "map" || receiver.type.kind === "set") &&
157
+ lowerer.dynConvertible(receiver.type))) {
158
+ const fnName = jsFuncNameOf(expr.expression);
159
+ receiver = {
160
+ kind: "dynFrom",
161
+ value: receiver,
162
+ type: DYN,
163
+ loc: locOf(expr),
164
+ ...(fnName !== null ? { fnName } : {}),
165
+ };
166
+ }
167
+ if (receiver.type.kind === "dyn") {
168
+ const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
169
+ return lowerer.maybeNarrow({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc: locOf(expr) }, expr);
170
+ }
171
+ lowerer.unsupported("SC1090", expr, "symbol-keyed property access outside class fields keyed by a stable module-level literal Symbol()/Symbol.for() (other static shapes have no symbol-keyed storage)");
172
+ }
173
+ // A never-tainted JS receiver type (neverTaintedJsType — `cmd[1]` on
174
+ // `const cmd = ['pwd', []]`, whose binding lowered checked-dynamic)
175
+ // dispatches as unmapped so the dyn-receiver branch below reads
176
+ // through the checked-dynamic tree instead of dynChecking into never's f64 residue.
177
+ let receiverIr = neverTaintedJsType(lowerer, expr.expression, lowerer.typeOf(expr.expression))
178
+ ? null
179
+ : lowerer.mapTypeOf(lowerer.typeOf(expr.expression));
180
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr))) {
181
+ const receiver = tryLowerExpression(lowerer, expr.expression);
182
+ if (receiver?.type.kind === "dyn") {
183
+ const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
184
+ const optional = hasOptionalChainGuard(expr.expression);
185
+ return lowerer.maybeNarrow({
186
+ kind: "dynKeyGet",
187
+ value: receiver,
188
+ key,
189
+ ...(optional ? { optional: true } : {}),
190
+ type: DYN,
191
+ loc: locOf(expr),
192
+ }, expr);
193
+ }
194
+ if (receiver?.type.kind === "func" && lowerer.dynConvertible(receiver.type)) {
195
+ const loc = locOf(expr);
196
+ const fnName = jsFuncNameOf(expr.expression);
197
+ const boxed = {
198
+ kind: "dynFrom",
199
+ value: receiver,
200
+ type: DYN,
201
+ loc,
202
+ ...(fnName !== null ? { fnName } : {}),
203
+ };
204
+ const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
205
+ return lowerer.maybeNarrow({ kind: "dynKeyGet", key, value: boxed, type: DYN, loc }, expr);
206
+ }
207
+ if (receiver?.type.kind === "array" || receiver?.type.kind === "bytes")
208
+ receiverIr = receiver.type;
209
+ if (receiver?.type.kind === "union") {
210
+ const present = lowerer.stripUndefinedArm(receiver.type);
211
+ if (present.kind === "array" || present.kind === "bytes")
212
+ receiverIr = present;
213
+ }
214
+ }
215
+ // A readonly tuple union under Array.isArray is checker-typed as an
216
+ // intersection with any[], whose structural mapping is not the tuple
217
+ // shape. maybeNarrow on the receiver uses the runtime tag proof to
218
+ // extract the one array-valued arm; dispatch element access from that
219
+ // lowered representation, like the existing any[] array-method path.
220
+ const checkerArray = lowerer.checkerArrayValue(expr.expression);
221
+ if (checkerArray)
222
+ receiverIr = checkerArray.type;
223
+ if (receiverIr?.kind === "object") {
224
+ const key = recordKeyLiteralText(expr.argumentExpression) ??
225
+ recordKeyTypeLiteralText(lowerer, expr.argumentExpression);
226
+ if (key !== null) {
227
+ const target = classFieldTarget(lowerer, expr.expression, receiverIr, key);
228
+ if (target)
229
+ return lowerer.maybeNarrow(lowerer.fieldGetExpr(target, locOf(expr), expr), expr);
230
+ }
231
+ if (receiverIr.className === "%Error" || isDynTypedRefType(receiverIr)) {
232
+ const receiver = lowerer.coerceToExpected(lowerer.lowerExpr(expr.expression), DYN);
233
+ const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
234
+ return lowerer.maybeNarrow({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc: locOf(expr) }, expr);
235
+ }
236
+ }
237
+ // Typed-array element read `b[i]` — like arrayGet with a scalar
238
+ // result; any invalid index traps (the array discipline; JS would
239
+ // read undefined — divergence 4's policy).
240
+ if (receiverIr?.kind === "bytes") {
241
+ let recv = lowerer.lowerExpr(expr.expression);
242
+ if (recv.type.kind === "dyn")
243
+ recv = lowerer.coerceInto(expr.expression, recv, receiverIr);
244
+ if (recv.type.kind === "union" && lowerer.armTag(recv.type.unionId, UNDEFINED_T) >= 0) {
245
+ const present = lowerer.stripUndefinedArm(recv.type);
246
+ const helper = present.kind === "bytes"
247
+ ? lowerer.narrowedArmHelper(recv.type.unionId, present, locOf(expr.expression))
248
+ : null;
249
+ recv = helper
250
+ ? lowerer.checkedNarrowCall(helper, recv, present, locOf(expr.expression))
251
+ : lowerer.maybeNarrow(recv, expr.expression);
252
+ }
253
+ const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
254
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)) && recv.type.kind === "bytes") {
255
+ return {
256
+ kind: "dynKeyGet",
257
+ value: lowerer.coerceInto(expr.expression, recv, DYN),
258
+ key: index.type.kind === "f64"
259
+ ? { kind: "toString", operand: index, type: STRING, loc: locOf(expr) }
260
+ : index,
261
+ type: DYN,
262
+ loc: locOf(expr),
263
+ };
264
+ }
265
+ if (index.type.kind === "dyn" && recv.type.kind === "bytes") {
266
+ return {
267
+ kind: "dynKeyGet",
268
+ value: lowerer.coerceInto(expr.expression, recv, DYN),
269
+ key: index,
270
+ type: DYN,
271
+ loc: locOf(expr),
272
+ };
273
+ }
274
+ if (index.type.kind !== "f64") {
275
+ lowerer.unsupported("SC1090", expr.argumentExpression, "indexing with non-number keys");
276
+ }
277
+ // `t[i]!` asserts presence: the numeric element read (NaN when
278
+ // invalid). Every other read answers undefined for an invalid index,
279
+ // like Node.
280
+ // A read whose every consumer treats undefined like NaN (see
281
+ // nan-coded-reads.ts) is the same plain numeric read.
282
+ if ((ts.isNonNullExpression(expr.parent) && expr.parent.expression === expr) ||
283
+ lowerer.nanCodedReads?.isNumericRead(expr) === true) {
284
+ return {
285
+ kind: "bytesIntrinsic",
286
+ method: "get",
287
+ receiver: recv,
288
+ args: [index],
289
+ type: F64,
290
+ loc: locOf(expr),
291
+ invalidNaN: true,
292
+ };
293
+ }
294
+ return lowerSafeBytesRead(lowerer, recv, index, locOf(expr));
295
+ }
296
+ // Tuple element read `t[0]`: a positional-field read of the tuple's
297
+ // record shape — LITERAL indices only (the checker's per-index types
298
+ // are what make the read honest; a dynamic index over a heterogeneous
299
+ // shape has no single element type). Narrows like any field read.
300
+ if (receiverIr?.kind === "record") {
301
+ const shape = lowerer.shapes.get(receiverIr.shapeId);
302
+ if (shape?.tuple) {
303
+ let obj = lowerer.lowerExpr(expr.expression);
304
+ if (obj.type.kind === "dyn") {
305
+ // Object.entries over a checked value stores each pair in the
306
+ // dynamic tree even when the checker names a tuple type.
307
+ const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
308
+ const optional = hasOptionalChainGuard(expr.expression);
309
+ return lowerer.maybeNarrow({
310
+ kind: "dynKeyGet",
311
+ value: obj,
312
+ key,
313
+ ...(optional ? { optional: true } : {}),
314
+ type: DYN,
315
+ loc: locOf(expr),
316
+ }, expr);
317
+ }
318
+ if (obj.type.kind === "union" && lowerer.armTag(obj.type.unionId, UNDEFINED_T) >= 0) {
319
+ // The checker sees the outer `arrays[i]` as a tuple when
320
+ // noUncheckedIndexedAccess is disabled, but the lowered read is
321
+ // still tuple | undefined. A nested tuple field must validate the
322
+ // outer tag before recordGet; an unchecked unionNarrow would let a
323
+ // missing outer element reach the record backend as a bad pointer.
324
+ const present = lowerer.stripUndefinedArm(obj.type);
325
+ const helper = present.kind === "record"
326
+ ? lowerer.narrowedArmHelper(obj.type.unionId, present, locOf(expr.expression))
327
+ : null;
328
+ obj = helper
329
+ ? lowerer.checkedNarrowCall(helper, obj, present, locOf(expr.expression))
330
+ : lowerer.maybeNarrow(obj, expr.expression);
331
+ }
332
+ const idx = tupleLiteralIndex(expr.argumentExpression);
333
+ if (idx === null) {
334
+ lowerer.unsupported("SC1090", expr.argumentExpression, "tuple indexing with a non-literal index (tuples are fixed-shape — use t[0], t[1], ...)");
335
+ }
336
+ const shapeId = obj.type.kind === "record" ? obj.type.shapeId : receiverIr.shapeId;
337
+ const actualShape = lowerer.shapes.get(shapeId) ?? shape;
338
+ const fieldType = actualShape.fields.find((f) => f.name === String(idx))?.type;
339
+ if (fieldType === undefined)
340
+ lowerer.badType(expr, lowerer.typeOf(expr)); // OOB smuggled past tsc
341
+ const get = {
342
+ kind: "recordGet",
343
+ obj,
344
+ shapeId,
345
+ field: String(idx),
346
+ type: fieldType,
347
+ loc: locOf(expr),
348
+ };
349
+ return lowerer.isRuntimeOptionalField(shapeId, String(idx))
350
+ ? get
351
+ : lowerer.maybeNarrow(get, expr);
352
+ }
353
+ if (shape && !shape.tuple) {
354
+ return lowerer.lowerRecordKeyRead(expr, receiverIr.shapeId, shape);
355
+ }
356
+ }
357
+ // `pkg["k"]` / `scripts[name]` / `scopeMatch[1]` on a dyn receiver (a
358
+ // JSON.parse result): the dyn keyed read, exactly the dot form.
359
+ // NUMBER-typed indices convert through ToString first — JS property
360
+ // keys are strings, and the canonical number text answers array
361
+ // indices in the helper (fractions, negatives, and NaN read as
362
+ // absent keys, exactly JS). An UNMAPPABLE checker type takes the
363
+ // same path when the receiver LOWERS dyn
364
+ // (`pkg.workspaces.packages["0"]` — the lowering world types the
365
+ // unknown-rooted chain `any`); a non-dyn lowering falls through to
366
+ // the fences below (re-lowering is pure IR construction).
367
+ if (receiverIr?.kind === "dyn" || receiverIr?.kind === "union" || receiverIr === null) {
368
+ const obj = lowerer.lowerExpr(expr.expression);
369
+ // A generic mapped type can stay unresolved at this body use even
370
+ // though its instantiated parameter has a concrete record ABI.
371
+ // Dispatch from that stored shape, as the array fallback below does.
372
+ if (receiverIr === null && obj.type.kind === "record") {
373
+ const shape = lowerer.shapes.get(obj.type.shapeId);
374
+ const index = tupleLiteralIndex(expr.argumentExpression);
375
+ const field = shape?.tuple && index !== null
376
+ ? shape.fields.find((field) => field.name === String(index))
377
+ : null;
378
+ if (field)
379
+ return lowerer.maybeNarrow({
380
+ kind: "recordGet",
381
+ obj,
382
+ shapeId: obj.type.shapeId,
383
+ field: field.name,
384
+ type: field.type,
385
+ loc: locOf(expr),
386
+ }, expr);
387
+ if (shape && !shape.tuple) {
388
+ return lowerer.lowerRecordKeyRead(expr, obj.type.shapeId, shape);
389
+ }
390
+ }
391
+ if (obj.type.kind === "dyn" ||
392
+ (obj.type.kind === "object" && obj.type.className === "%Error") ||
393
+ isDynTypedRefType(obj.type)) {
394
+ const rawKey = lowerer.lowerExpr(expr.argumentExpression);
395
+ // Number, bool, and DYN keys stringify (ToPropertyKey) — the
396
+ // dyn-keyed read `catchWarning[warning.name]` where the property
397
+ // chain itself lowered dyn.
398
+ const key = rawKey.type.kind === "dyn" ||
399
+ rawKey.type.kind === "symbol" ||
400
+ (rawKey.type.kind === "union" && lowerer.dynConvertible(rawKey.type))
401
+ ? lowerer.coerceToExpected(rawKey, DYN)
402
+ : lowerRecordPropertyKey(lowerer, rawKey, expr.argumentExpression);
403
+ if (key.type.kind === "string" || key.type.kind === "dyn") {
404
+ const opt = hasOptionalChainGuard(expr.expression);
405
+ return lowerer.maybeNarrow({
406
+ kind: "dynKeyGet",
407
+ key,
408
+ ...(opt ? { optional: true } : {}),
409
+ value: lowerer.coerceToExpected(obj, DYN),
410
+ type: DYN,
411
+ loc: locOf(expr),
412
+ }, expr);
413
+ }
414
+ }
415
+ // A checker-`any` receiver that LOWERS to a static ARRAY
416
+ // (`pm.split("@")[0]` — the dyn-receiver string machinery answers
417
+ // string[]): the element read rides the ordinary array path on the
418
+ // lowered value (invalid indices trap, divergence 4's policy).
419
+ if (obj.type.kind === "array") {
420
+ const index = lowerer.lowerExpr(expr.argumentExpression);
421
+ if (index.type.kind === "f64") {
422
+ const safe = lowerSafeIndexRead(lowerer, obj, index, locOf(expr));
423
+ if (safe)
424
+ return safe;
425
+ return lowerer.maybeNarrow({ kind: "arrayGet", arr: obj, index, type: obj.type.elem, loc: locOf(expr) }, expr);
426
+ }
427
+ }
428
+ }
429
+ // `env[key]` on a UNION of record shapes (`ProcessEnv | Record<string,
430
+ // string>` — the env-bag parameter pattern): the per-arm keyed read,
431
+ // joined exactly like the dot form (lowerUnionProperty's keyed path).
432
+ if (receiverIr?.kind === "union") {
433
+ const value = lowerer.lowerExpr(expr.expression);
434
+ if (value.type.kind === "union") {
435
+ const key = lowerer.lowerExpr(expr.argumentExpression);
436
+ if (key.type.kind === "f64") {
437
+ const def = lowerer.unions.get(value.type.unionId);
438
+ const presentArms = def?.arms.filter((arm) => !isUnitType(arm)) ?? [];
439
+ if (presentArms.length === 1 && presentArms[0]?.kind === "string") {
440
+ const property = runtimeOptionalElementKey(expr.argumentExpression);
441
+ const receiver = property === null
442
+ ? null
443
+ : lowerer.runtimeOptionalPropertyReceiver(expr.expression, value, STRING, property);
444
+ if (receiver !== null) {
445
+ return {
446
+ kind: "strIntrinsic",
447
+ method: "charAt",
448
+ receiver,
449
+ args: [key],
450
+ type: STRING,
451
+ loc: locOf(expr),
452
+ };
453
+ }
454
+ }
455
+ }
456
+ if (key.type.kind === "f64") {
457
+ const safe = lowerOptionalArrayIndexRead(lowerer, expr, value, key);
458
+ if (safe)
459
+ return safe;
460
+ }
461
+ if (key.type.kind === "string" || key.type.kind === "f64") {
462
+ const lit = ts.isStringLiteral(expr.argumentExpression)
463
+ ? expr.argumentExpression.text
464
+ : null;
465
+ const keyed = lowerUnionKeyedRead(lowerer, expr, value.type.unionId, value, key, lit);
466
+ if (keyed)
467
+ return lowerer.maybeNarrow(keyed, expr);
468
+ }
469
+ }
470
+ }
471
+ if (receiverIr?.kind !== "array") {
472
+ {
473
+ const receiver = tryLowerExpression(lowerer, expr.expression);
474
+ if (receiver?.type.kind === "dyn" ||
475
+ (receiver &&
476
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
477
+ (receiver.type.kind === "union" || receiver.type.kind === "bytes") &&
478
+ lowerer.dynConvertible(receiver.type))) {
479
+ const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
480
+ return lowerer.maybeNarrow({
481
+ kind: "dynKeyGet",
482
+ value: lowerer.coerceInto(expr.expression, receiver, DYN),
483
+ key,
484
+ type: DYN,
485
+ loc: locOf(expr),
486
+ }, expr);
487
+ }
488
+ if (receiver?.type.kind === "func" &&
489
+ canBoxFuncIntoDyn(receiver.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
490
+ const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
491
+ if (key.type.kind === "string") {
492
+ const boxed = {
493
+ kind: "dynFrom",
494
+ value: receiver,
495
+ type: DYN,
496
+ loc: locOf(expr.expression),
497
+ };
498
+ return lowerer.maybeNarrow({ kind: "dynKeyGet", key, value: boxed, type: DYN, loc: locOf(expr) }, expr);
499
+ }
500
+ }
501
+ }
502
+ if (receiverIr?.kind === "string") {
503
+ // An indexed string property is absent for non-integer and missing
504
+ // indexes. charAt has different coercion and out-of-range semantics.
505
+ const recv = lowerer.lowerExpr(expr.expression);
506
+ const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
507
+ if (index.type.kind === "f64" && recv.type.kind === "string") {
508
+ // A proven in-bounds integer index always names a code unit, where
509
+ // charAt and the property read agree.
510
+ if (lowerer.stringIndexBounds.inBounds(expr))
511
+ return {
512
+ kind: "strIntrinsic",
513
+ method: "charAt",
514
+ receiver: recv,
515
+ args: [index],
516
+ type: STRING,
517
+ loc: locOf(expr),
518
+ };
519
+ return lowerOptionalStringIndex(lowerer, recv, index, lowerer.withUndefinedArm(STRING), locOf(expr));
520
+ }
521
+ // The checker narrowed the receiver to string, but its stored value
522
+ // is still the union (an array-derived binding, a typeof guard).
523
+ if (index.type.kind === "f64") {
524
+ const read = lowerUnionStringIndex(lowerer, recv, index, expr.argumentExpression, lowerer.withUndefinedArm(STRING), locOf(expr));
525
+ if (read)
526
+ return read;
527
+ }
528
+ lowerer.unsupported("SC1090", expr, "string indexing with this index/result shape (expected a number index and a string or string | undefined result)");
529
+ }
530
+ lowerer.unsupported("SC1090", expr, "element access on non-array values");
531
+ }
532
+ let arr = lowerer.lowerExpr(expr.expression);
533
+ const runtimeOptionalSource = lowerer.runtimeOptionalSourceValue(expr.expression, arr);
534
+ if (runtimeOptionalSource?.kind === "varRef" &&
535
+ runtimeOptionalSource.type.kind === "union" &&
536
+ arr.type.kind === "array") {
537
+ // lowerer.lowerElementAccess has already recognized a captured
538
+ // array | undefined receiver and supplied its checked extraction as
539
+ // the expression override. Rebuild that check here so a missing
540
+ // receiver throws the member-access error Node exposes, rather than
541
+ // the generic target-union narrowing error. The stored receiver is a
542
+ // varRef, so both the tag test and extraction read the same value
543
+ // without repeating an effect.
544
+ const stored = runtimeOptionalSource;
545
+ if (stored.type.kind !== "union")
546
+ throw new InternalCompilerError("runtime-optional array source lost its union storage");
547
+ const unionId = stored.type.unionId;
548
+ const undefTag = lowerer.armTag(unionId, UNDEFINED_T);
549
+ const valueTag = lowerer.armTag(unionId, arr.type);
550
+ const property = runtimeOptionalElementKey(expr.argumentExpression);
551
+ if (undefTag >= 0 && valueTag >= 0 && property !== null) {
552
+ arr = {
553
+ kind: "ternary",
554
+ cond: {
555
+ kind: "unionIsTag",
556
+ unionId,
557
+ tag: undefTag,
558
+ negated: false,
559
+ value: stored,
560
+ type: BOOL,
561
+ loc: locOf(expr.expression),
562
+ },
563
+ then: nodeThrowExpr(1, "", `Cannot read properties of undefined (reading '${property}')`, arr.type, locOf(expr.expression)),
564
+ else_: {
565
+ kind: "unionNarrow",
566
+ unionId,
567
+ tag: valueTag,
568
+ value: stored,
569
+ type: arr.type,
570
+ loc: locOf(expr.expression),
571
+ },
572
+ type: arr.type,
573
+ loc: locOf(expr.expression),
574
+ };
575
+ }
576
+ }
577
+ if (arr.type.kind === "union" &&
578
+ lowerer.armTag(arr.type.unionId, UNDEFINED_T) >= 0 &&
579
+ receiverIr.kind === "array") {
580
+ // As with tuple receivers above, an unchecked outer read can be
581
+ // undefined even when the checker reports an array. Extract the
582
+ // present array arm with a runtime tag check before arrayGet or the
583
+ // safe indexed-read helper runs.
584
+ const present = lowerer.stripUndefinedArm(arr.type);
585
+ const helper = present.kind === "array"
586
+ ? lowerer.narrowedArmHelper(arr.type.unionId, present, locOf(expr.expression))
587
+ : null;
588
+ arr = helper
589
+ ? lowerer.checkedNarrowCall(helper, arr, present, locOf(expr.expression))
590
+ : lowerer.maybeNarrow(arr, expr.expression);
591
+ }
592
+ // The checker sees an array but the VALUE lowered checked-dynamic (a
593
+ // jsdoc-typed default export from a .js module — signature 14): the
594
+ // read rides the dynCheck boundary when the array shape is one the checked-dynamic tree
595
+ // can validate, and fences by name when it is not — an arrayGet over a
596
+ // dyn receiver is never emitted (the validator ICE).
597
+ if (arr.type.kind === "dyn") {
598
+ if (canDynCheckTo(receiverIr, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
599
+ arr = { kind: "dynCheck", value: arr, type: receiverIr, loc: locOf(expr) };
600
+ }
601
+ else {
602
+ lowerer.unsupported("SC1090", expr, `element access on checked-dynamic values with '${lowerer.fmt(receiverIr)}' elements`);
603
+ }
604
+ }
605
+ // Array reads can themselves supply an index. A missing numeric value
606
+ // is undefined, whose property lookup misses just like NaN; keep that
607
+ // value instead of rejecting a checker-number index with optional IR.
608
+ const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
609
+ if (arr.type.kind === "array" &&
610
+ (index.type.kind === "dyn" ||
611
+ (isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
612
+ index.type.kind !== "f64" &&
613
+ lowerer.dynConvertible(index.type)))) {
614
+ return {
615
+ kind: "dynKeyGet",
616
+ value: lowerer.coerceToExpected(arr, DYN),
617
+ key: index,
618
+ type: DYN,
619
+ loc: locOf(expr),
620
+ };
621
+ }
622
+ if (index.type.kind !== "f64") {
623
+ lowerer.unsupported("SC1090", expr.argumentExpression, "indexing with non-number keys");
624
+ }
625
+ // The LOWERED receiver's element type wins over the checker's when
626
+ // both are arrays: a spoke result can be more precise than the
627
+ // declared surface (emitter.listeners() answers the event's tuple
628
+ // signature where the .d.ts says Function[], which would flatten the
629
+ // element to a zero-parameter closure).
630
+ const elemT = arr.type.kind === "array" ? arr.type.elem : receiverIr.elem;
631
+ // Every ordinary array read is a JavaScript property read: an invalid
632
+ // index answers undefined, even when the checker was built without
633
+ // noUncheckedIndexedAccess. Keep the explicit optional union in the IR
634
+ // so it can flow through templates, locals, calls, returns, operators,
635
+ // and narrowing. The helper performs one length/proof check and then
636
+ // uses the dense getter for the proven-present path, so this does not
637
+ // change the storage representation or the low-level getter itself.
638
+ if (arr.type.kind === "array") {
639
+ // A non-null assertion is the explicit proven-present form. Preserve
640
+ // the dense getter's established bounds trap where the asserted value
641
+ // must be the element type (library ABI checks and the catchable
642
+ // RangeError contract for an out-of-bounds assert). Where undefined is
643
+ // representable, the assertion keeps JavaScript's unchecked read.
644
+ const provenPresent = ts.isNonNullExpression(expr.parent) &&
645
+ expr.parent.expression === expr &&
646
+ !assertedElementKeepsUndefined(lowerer, expr.parent);
647
+ if (provenPresent) {
648
+ return lowerer.maybeNarrow({ kind: "arrayGet", arr, index, type: elemT, loc: locOf(expr) }, expr);
649
+ }
650
+ const safe = lowerSafeIndexRead(lowerer, arr, index, locOf(expr));
651
+ if (safe)
652
+ return safe;
653
+ }
654
+ // --npm-static package files retain the original slice-specific route
655
+ // for compatibility with package-source inference.
656
+ if (arr.type.kind === "array" &&
657
+ arr.kind === "arrIntrinsic" &&
658
+ arr.method === "slice" &&
659
+ npmStaticPackageOfPath(ts.getSourceFileOfNode(expr).fileName) !== null) {
660
+ const safe = lowerSafeIndexRead(lowerer, arr, index, locOf(expr));
661
+ if (safe)
662
+ return safe;
663
+ }
664
+ // A union-element read narrows like an identifier when the checker has
665
+ // narrowed THIS occurrence (`if (a[0] !== undefined) use(a[0])` — tsc
666
+ // narrows literal-index element accesses).
667
+ return lowerer.maybeNarrow({ kind: "arrayGet", arr, index, type: elemT, loc: locOf(expr) }, expr);
668
+ }
669
+ function optionalRecordReceiver(lowerer, value, loc, allowNull = false) {
670
+ if (value.type.kind !== "union")
671
+ return null;
672
+ const unionId = value.type.unionId;
673
+ const arms = lowerer.unions.get(unionId)?.arms;
674
+ if (arms?.length !== 2)
675
+ return null;
676
+ let undefTag = lowerer.armTag(unionId, UNDEFINED_T);
677
+ let nullish = "undefined";
678
+ // A null-initialized slot assigned a record later (iconv-lite's
679
+ // `encodings = null` table, filled on first use): the checker narrows
680
+ // the read to the record, the storage keeps the null arm.
681
+ if (undefTag < 0 && allowNull) {
682
+ undefTag = lowerer.armTag(unionId, NULL_T);
683
+ nullish = "null";
684
+ }
685
+ if (undefTag < 0)
686
+ return null;
687
+ const record = arms[1 - undefTag];
688
+ if (record.kind !== "record")
689
+ return null;
690
+ const stmts = [];
691
+ const stable = stabilized(lowerer, value, "%recordReceiver", stmts);
692
+ const present = {
693
+ kind: "unionNarrow",
694
+ unionId,
695
+ tag: lowerer.armTag(unionId, record),
696
+ value: stable,
697
+ type: record,
698
+ loc,
699
+ };
700
+ return { stmts, stable, present, unionId, undefTag, nullish };
701
+ }
702
+ /** `value`, evaluated once at this point of `out`. */
703
+ function stabilized(lowerer, value, name, out) {
704
+ if (isSafeToRepeat(value))
705
+ return value;
706
+ const tmp = lowerer.declareHiddenLocal(name, value.type);
707
+ out.push({ kind: "varDecl", localId: tmp.id, init: value, loc: value.loc });
708
+ return varRef(tmp.id, value.type, value.loc);
709
+ }
710
+ function undefinedReceiver(receiver, loc) {
711
+ return {
712
+ kind: "unionIsTag",
713
+ unionId: receiver.unionId,
714
+ tag: receiver.undefTag,
715
+ negated: false,
716
+ value: receiver.stable,
717
+ type: BOOL,
718
+ loc,
719
+ };
720
+ }
721
+ /** Node's TypeError for a keyed read or write on an undefined (or null)
722
+ * receiver. */
723
+ function undefinedReceiverThrow(key, action, type, loc, nullish = "undefined") {
724
+ const head = `Cannot ${action} properties of ${nullish} (${action === "read" ? "reading" : "setting"} '`;
725
+ const message = {
726
+ kind: "strConcat",
727
+ left: {
728
+ kind: "strConcat",
729
+ left: { kind: "strLit", value: head, type: STRING, loc },
730
+ right: key,
731
+ type: STRING,
732
+ loc,
733
+ },
734
+ right: { kind: "strLit", value: "')", type: STRING, loc },
735
+ type: STRING,
736
+ loc,
737
+ };
738
+ return {
739
+ kind: "libCall",
740
+ fn: "error.nodeThrow",
741
+ args: [numLit(1, loc), { kind: "strLit", value: "", type: STRING, loc }, message],
742
+ type,
743
+ loc,
744
+ };
745
+ }
746
+ /** The receiver and key of a keyed access whose receiver can be undefined,
747
+ * evaluated in order into `stmts`, with the receiver's record arm and the
748
+ * key's property-name string. Null when the receiver is not optional. */
749
+ function guardedRecordAccess(lowerer, access, rawObj, allowNull = false) {
750
+ const receiver = optionalRecordReceiver(lowerer, rawObj, locOf(access.expression), allowNull);
751
+ if (!receiver)
752
+ return null;
753
+ const keyNode = access.argumentExpression;
754
+ const litKey = recordKeyLiteralText(keyNode) ?? recordKeyTypeLiteralText(lowerer, keyNode);
755
+ const key = litKey !== null
756
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
757
+ : stabilized(lowerer, lowerer.lowerExpr(keyNode), "%recordKey", receiver.stmts);
758
+ // A symbol key names no string property; its message spelling is not
759
+ // modeled.
760
+ const name = key.type.kind === "symbol"
761
+ ? { kind: "strLit", value: "Symbol()", type: STRING, loc: locOf(keyNode) }
762
+ : lowerRecordPropertyKey(lowerer, key, keyNode);
763
+ return { receiver, key, name };
764
+ }
765
+ /** `nested[a][b] = v` where `nested[a]` can miss: the receiver, the key and
766
+ * the value evaluate in order, then an undefined receiver throws Node's
767
+ * TypeError and a present one takes the write. Only member and identifier
768
+ * receivers are probed, since a probe that finds no optional receiver
769
+ * lowers the receiver again. */
770
+ function lowerGuardedRecordWrite(lowerer, expr, target) {
771
+ let receiverNode = target.expression;
772
+ while (ts.isParenthesizedExpression(receiverNode))
773
+ receiverNode = receiverNode.expression;
774
+ if (lowerer.chainRecvByNode.has(target.expression) ||
775
+ !(ts.isElementAccessExpression(receiverNode) ||
776
+ ts.isPropertyAccessExpression(receiverNode) ||
777
+ ts.isIdentifier(receiverNode)))
778
+ return null;
779
+ const guarded = guardedRecordAccess(lowerer, target, lowerer.lowerExpr(target.expression));
780
+ if (!guarded)
781
+ return null;
782
+ const { receiver, key, name } = guarded;
783
+ const loc = locOf(expr);
784
+ const value = stabilized(lowerer, lowerer.lowerExpr(expr.right), "%recordValue", receiver.stmts);
785
+ const write = lowerer.withExpressionOverride(target.expression, receiver.present, () => lowerer.withExpressionOverride(target.argumentExpression, key, () => lowerer.withExpressionOverride(expr.right, value, () => lowerElementWrite(lowerer, expr))));
786
+ return {
787
+ kind: "block",
788
+ body: [
789
+ ...receiver.stmts,
790
+ {
791
+ kind: "if",
792
+ cond: undefinedReceiver(receiver, loc),
793
+ then: [{ kind: "exprStmt", expr: undefinedReceiverThrow(name, "set", VOID, loc), loc }],
794
+ else_: [write],
795
+ loc,
796
+ },
797
+ ],
798
+ loc,
799
+ };
800
+ }
801
+ /** `b[i] = v` where the checker's flow type of `b` is a typed array but
802
+ * its storage is wider. A hoisted JavaScript `var` (or a field written
803
+ * after construction) holds `bytes | undefined`: the receiver, index and
804
+ * value evaluate in order, then an undefined receiver throws Node's
805
+ * TypeError and a present one takes the typed store. Any other storage (a
806
+ * `var` later reassigned a string, a checked-dynamic value) takes the
807
+ * checked-dynamic store, which applies whatever value the receiver holds. */
808
+ function lowerWiderBytesWrite(lowerer, expr, target, recv) {
809
+ const loc = locOf(expr);
810
+ if (recv.type.kind === "union") {
811
+ const unionId = recv.type.unionId;
812
+ const arms = lowerer.unions.get(unionId)?.arms;
813
+ const undefTag = lowerer.armTag(unionId, UNDEFINED_T);
814
+ const bytes = arms?.length === 2 && undefTag >= 0 ? arms[1 - undefTag] : null;
815
+ const keyType = lowerer.mapTypeOf(lowerer.typeOf(target.argumentExpression));
816
+ const index = bytes?.kind === "bytes" && keyType?.kind === "f64"
817
+ ? lowerer.lowerExpr(target.argumentExpression)
818
+ : null;
819
+ // An index stored wider than a number (a hoisted `var` counter) keeps
820
+ // the checked-dynamic store below, which converts the key exactly.
821
+ if (bytes?.kind === "bytes" && index?.type.kind === "f64") {
822
+ const stmts = [];
823
+ const stable = stabilized(lowerer, recv, "%bytesReceiver", stmts);
824
+ const key = stabilized(lowerer, index, "%bytesIndex", stmts);
825
+ const value = stabilized(lowerer, lowerer.lowerExprExpecting(expr.right, F64), "%bytesValue", stmts);
826
+ const name = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
827
+ const present = {
828
+ kind: "unionNarrow",
829
+ unionId,
830
+ tag: 1 - undefTag,
831
+ value: stable,
832
+ type: bytes,
833
+ loc,
834
+ };
835
+ return {
836
+ kind: "block",
837
+ body: [
838
+ ...stmts,
839
+ {
840
+ kind: "if",
841
+ cond: {
842
+ kind: "unionIsTag",
843
+ unionId,
844
+ tag: undefTag,
845
+ negated: false,
846
+ value: stable,
847
+ type: BOOL,
848
+ loc,
849
+ },
850
+ then: [{ kind: "exprStmt", expr: undefinedReceiverThrow(name, "set", VOID, loc), loc }],
851
+ else_: [{ kind: "bytesSet", arr: present, index: key, value, loc }],
852
+ loc,
853
+ },
854
+ ],
855
+ loc,
856
+ };
857
+ }
858
+ }
859
+ if (!lowerer.dynConvertible(recv.type)) {
860
+ lowerer.unsupported("SC1090", target.expression, `typed-array element writes through '${lowerer.fmt(recv.type)}' storage`);
861
+ }
862
+ return {
863
+ kind: "exprStmt",
864
+ expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, recv, DYN)),
865
+ loc,
866
+ };
867
+ }
868
+ /** `r[k]` over a (non-tuple) record shape. A LITERAL key naming a declared
869
+ * field is the bracket spelling of field access (the ONLY spelling tsc
870
+ * permits for signature-declared fields under
871
+ * noPropertyAccessFromIndexSignature) — an ordinary recordGet. Everything
872
+ * else is a runtime-keyed read (recordKeyGet): declared fields answer
873
+ * first via an emitted string-switch, index-signature shapes fall through
874
+ * to the overflow map. The result type is the index signature's value type
875
+ * armed with undefined (dyn for `unknown`): a missing key reads undefined,
876
+ * as in JavaScript, whatever noUncheckedIndexedAccess says. Every declared
877
+ * field must be able to SURFACE as that type (equal, an arm of it, or —
878
+ * for dyn results — JSON-safe for the dyn conversion); shapes mixing in
879
+ * fields outside that stay fenced. Declared-only shapes support reads
880
+ * whose key type proves membership (tsc's keyof check): all fields must
881
+ * share the result type, and a smuggled miss traps. */
882
+ export function lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined = false) {
883
+ const loc = locOf(expr);
884
+ const keyNode = expr.argumentExpression;
885
+ // Literal declared keys are plain field reads (narrowing included).
886
+ // NUMERIC literals are their canonical string spelling — JS object keys
887
+ // ARE strings (`r[1]` reads `r["1"]`), so `b[1]` hits a declared field
888
+ // named "1" (a mapped type over a numeric enum) exactly like `b["1"]`.
889
+ // A key IDENTIFIER whose type proves one literal (a literal-typed
890
+ // const, a keyof-constrained type parameter bound to a literal inside
891
+ // a generic instance) is the same static read — identifier evaluation
892
+ // is pure, so skipping it matches JS exactly.
893
+ const litKey = recordKeyLiteralText(keyNode) ?? recordKeyTypeLiteralText(lowerer, keyNode);
894
+ // An outer keyed read can leave the receiver undefined: evaluate the
895
+ // receiver and the key, then throw Node's TypeError or read the present
896
+ // record.
897
+ // The receiver lowers FIRST (both branches below read it, and JS
898
+ // evaluates the receiver before the key).
899
+ const obj = lowerer.lowerExpr(expr.expression);
900
+ {
901
+ // A null arm is guarded only for string and number keys: other keys
902
+ // already take the checked-dynamic read, which handles null itself.
903
+ // Only a receiver with a null arm asks about the key.
904
+ let allowNull = false;
905
+ if (obj.type.kind === "union" && lowerer.armTag(obj.type.unionId, NULL_T) >= 0) {
906
+ const keyType = litKey !== null ? STRING : lowerer.mapTypeOf(lowerer.typeOf(keyNode));
907
+ allowNull = keyType?.kind === "string" || keyType?.kind === "f64";
908
+ }
909
+ const guarded = guardedRecordAccess(lowerer, expr, obj, allowNull);
910
+ if (guarded) {
911
+ const { receiver, key, name } = guarded;
912
+ const read = lowerer.withExpressionOverride(expr.expression, receiver.present, () => litKey !== null
913
+ ? lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined)
914
+ : lowerer.withExpressionOverride(keyNode, key, () => lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined)));
915
+ return {
916
+ kind: "seqExpr",
917
+ stmts: receiver.stmts,
918
+ result: {
919
+ kind: "ternary",
920
+ cond: undefinedReceiver(receiver, loc),
921
+ then: undefinedReceiverThrow(name, "read", read.type, loc, receiver.nullish),
922
+ else_: read,
923
+ type: read.type,
924
+ loc,
925
+ },
926
+ type: read.type,
927
+ loc,
928
+ };
929
+ }
930
+ }
931
+ // A record-mapped CHECKER type over a VALUE living in the checked-dynamic tree (a JS
932
+ // file-scope object-literal global): the checked-dynamic keyed read —
933
+ // dynKeyGet against the runtime keys (a missing key answers the checked-dynamic tree
934
+ // undefined, exactly JS); consumers validate (dynCheck) where a
935
+ // static type is required, the member-read discipline.
936
+ if (obj.type.kind === "dyn") {
937
+ let dk = litKey !== null
938
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
939
+ : lowerer.lowerExpr(keyNode);
940
+ // Number AND checked-dynamic keys ride the JS-exact formatter —
941
+ // property keys ARE strings (o[k] is o[String(k)] in JS), and a dyn
942
+ // key (agent.sockets[agent.getName(...)]) stringifies the same way.
943
+ if (dk.type.kind === "union" && lowerer.dynConvertible(dk.type))
944
+ dk = lowerer.coerceToExpected(dk, DYN);
945
+ if (dk.type.kind !== "symbol" && dk.type.kind !== "dyn")
946
+ dk = lowerRecordPropertyKey(lowerer, dk, keyNode);
947
+ if (dk.type.kind !== "string" && dk.type.kind !== "symbol" && dk.type.kind !== "dyn") {
948
+ lowerer.unsupported("SC1090", keyNode, "indexing records with non-string or non-number keys");
949
+ }
950
+ const read = { kind: "dynKeyGet", key: dk, value: obj, type: DYN, loc };
951
+ // Absence probes must keep the checked-dynamic undefined produced by
952
+ // a missing key. The ordinary read narrows to the checker's declared
953
+ // index value (and therefore validates it); ===/!==, ||, and ?? need
954
+ // to observe the missing value instead of throwing during that check.
955
+ return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
956
+ }
957
+ if (litKey !== null) {
958
+ const nominal = representedClassFieldTarget(lowerer, expr.expression, litKey, obj);
959
+ if (nominal) {
960
+ const read = lowerer.fieldGetExpr(nominal, loc, expr);
961
+ return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
962
+ }
963
+ }
964
+ if (hasClassPayload(lowerer, obj.type)) {
965
+ lowerer.unsupported("SC1090", expr, "computed property reads through structural views of class instances (use a declared literal key)");
966
+ }
967
+ // Predicates can strengthen optional fields without changing the
968
+ // receiver's stored layout. Use that layout for bracket reads just as
969
+ // fieldTarget does for the corresponding dot reads.
970
+ if (obj.type.kind === "record") {
971
+ const actualShape = lowerer.shapes.get(obj.type.shapeId);
972
+ if (!actualShape)
973
+ throw new InternalCompilerError("record receiver is missing its stored shape");
974
+ shapeId = obj.type.shapeId;
975
+ shape = actualShape;
976
+ }
977
+ if (litKey !== null) {
978
+ const field = shape.fields.find((f) => f.name === litKey);
979
+ if (field) {
980
+ const get = {
981
+ kind: "recordGet",
982
+ obj,
983
+ shapeId,
984
+ field: field.name,
985
+ type: field.type,
986
+ loc,
987
+ };
988
+ return lowerer.maybeNarrow(get, expr);
989
+ }
990
+ }
991
+ let key = litKey !== null
992
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
993
+ : lowerer.lowerExpr(keyNode);
994
+ // Optional string/number keys need ToPropertyKey, not a boxed copy of
995
+ // the receiver. Keep record reads on their native storage so nested
996
+ // references retain identity across index-signature reads.
997
+ if (key.type.kind === "union" &&
998
+ !lowerer.unions
999
+ .get(key.type.unionId)
1000
+ ?.arms.some((arm) => arm.kind === "symbol" || arm.kind === "dyn")) {
1001
+ key = lowerRecordPropertyKey(lowerer, key, keyNode);
1002
+ }
1003
+ if ((key.type.kind === "symbol" || key.type.kind === "dyn" || key.type.kind === "union") &&
1004
+ lowerer.dynConvertible(key.type) &&
1005
+ lowerer.dynConvertible(obj.type)) {
1006
+ const read = {
1007
+ kind: "dynKeyGet",
1008
+ value: lowerer.coerceToExpected(obj, DYN),
1009
+ key: lowerer.coerceToExpected(key, DYN),
1010
+ type: DYN,
1011
+ loc,
1012
+ };
1013
+ return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
1014
+ }
1015
+ // Runtime NUMBER keys ride the JS-exact formatter (o[n] is o[String(n)]
1016
+ // in JS — the number-keyed-signature access path).
1017
+ key = lowerRecordPropertyKey(lowerer, key, keyNode);
1018
+ if (key.type.kind !== "string") {
1019
+ lowerer.unsupported("SC1090", keyNode, "indexing records with non-string or non-number keys");
1020
+ }
1021
+ if (shape.fields.length === 0 && shape.indexValue === undefined) {
1022
+ const result = dynUndefinedExpr(loc);
1023
+ return {
1024
+ kind: "seqExpr",
1025
+ stmts: [
1026
+ { kind: "exprStmt", expr: obj, loc },
1027
+ { kind: "exprStmt", expr: key, loc },
1028
+ ],
1029
+ result,
1030
+ type: DYN,
1031
+ loc,
1032
+ };
1033
+ }
1034
+ // The result type of the access — the index signature's value type
1035
+ // armed with undefined, or the declared fields' one common type on
1036
+ // signature-free shapes (tsc's keyof check proved membership; a
1037
+ // smuggled miss traps). On signature-free shapes the checker may have
1038
+ // NARROWED this occurrence (assignment CFA on literal keys) — maybeNarrow
1039
+ // bridges to the narrowed arm exactly like a field read.
1040
+ let declared = null;
1041
+ // An index-signature read is a JavaScript property read: a missing key
1042
+ // answers undefined even without noUncheckedIndexedAccess. The read keeps
1043
+ // that explicit optional union, as an ordinary array read does.
1044
+ let optionalRead = false;
1045
+ // A read whose every consumer treats undefined like NaN (see
1046
+ // nan-coded-reads.ts) is a plain number that is NaN for a missing key.
1047
+ const nanCoded = !includeUndefined &&
1048
+ shape.indexValue?.kind === "f64" &&
1049
+ lowerer.nanCodedReads?.isNumericRead(expr) === true;
1050
+ if (shape.indexValue) {
1051
+ declared = shape.indexValue;
1052
+ if (declared.kind !== "dyn" && !nanCoded) {
1053
+ declared = lowerer.withUndefinedArmOf(declared);
1054
+ if (!declared)
1055
+ lowerer.badType(expr, lowerer.typeOf(expr));
1056
+ optionalRead = true;
1057
+ }
1058
+ }
1059
+ else if (shape.fields.length > 0 &&
1060
+ shape.fields.every((f) => typeEquals(f.type, shape.fields[0].type))) {
1061
+ declared = shape.fields[0].type;
1062
+ }
1063
+ if (!declared &&
1064
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
1065
+ recordKeyResultOk(lowerer, shape, DYN))
1066
+ declared = DYN;
1067
+ if (!declared) {
1068
+ lowerer.unsupported("SC1090", expr, `dynamic keyed reads of '${lowerer.fmt({ kind: "record", shapeId })}' (the declared fields have no one common type)`);
1069
+ }
1070
+ // A LITERAL key naming no declared field can only hit the overflow:
1071
+ // the declared-field surfacing constraint doesn't apply.
1072
+ const overflowOnly = litKey !== null && !!shape.indexValue;
1073
+ if (!recordKeyResultOk(lowerer, overflowOnly ? { ...shape, fields: [] } : shape, declared)) {
1074
+ lowerer.unsupported("SC1090", expr, `dynamic keyed reads of '${lowerer.fmt({ kind: "record", shapeId })}' as '${lowerer.fmt(declared)}' (every declared field must be readable at that type)`);
1075
+ }
1076
+ const read = {
1077
+ kind: "recordKeyGet",
1078
+ obj,
1079
+ shapeId,
1080
+ key,
1081
+ ...(overflowOnly ? { overflowOnly: true } : {}),
1082
+ ...(nanCoded ? { missNaN: true } : {}),
1083
+ type: declared,
1084
+ loc,
1085
+ };
1086
+ if (nanCoded)
1087
+ return read;
1088
+ return includeUndefined || optionalRead ? read : lowerer.maybeNarrow(read, expr);
1089
+ }
1090
+ /** ToPropertyKey for represented record keys. Missing array-derived string
1091
+ * values remain real undefined values, whose JavaScript property spelling
1092
+ * is the string "undefined". */
1093
+ function lowerRecordPropertyKey(lowerer, key, node) {
1094
+ if (key.type.kind === "union" && lowerer.dynConvertible(key.type)) {
1095
+ return {
1096
+ kind: "libCall",
1097
+ fn: "dyn.toStringCoerce",
1098
+ args: [lowerer.coerceInto(node, key, DYN)],
1099
+ type: STRING,
1100
+ loc: key.loc,
1101
+ };
1102
+ }
1103
+ if (key.type.kind === "f64" ||
1104
+ key.type.kind === "bool" ||
1105
+ key.type.kind === "dyn" ||
1106
+ lowerer.runtimeOptionalWidening(key.type, STRING) !== null) {
1107
+ return lowerer.ensureString(key, node);
1108
+ }
1109
+ return key;
1110
+ }
1111
+ /** The compile-time string spelling of a record key literal: a string
1112
+ * literal's text, or a NON-NEGATIVE numeric literal's canonical JS
1113
+ * spelling (`1` → "1", `1e21` → "1e+21" — String(Number(text)), which is
1114
+ * exactly the key JS derives; negative/computed keys stay runtime
1115
+ * expressions and canonicalize through ensureString instead). Null for
1116
+ * everything else. */
1117
+ function recordKeyLiteralText(node) {
1118
+ if (ts.isStringLiteral(node))
1119
+ return node.text;
1120
+ if (ts.isNumericLiteral(node))
1121
+ return String(Number(node.text));
1122
+ return null;
1123
+ }
1124
+ /** The compile-time key an IDENTIFIER's TYPE proves: a key variable whose
1125
+ * (narrowed) type is one string/number literal — `const k: "a" = …; o[k]`,
1126
+ * and the generic-body form where k's type is a keyof-constrained
1127
+ * parameter bound to a literal (`pick(o, "a")`'s instance reads `o[k]`
1128
+ * with K = "a", resolved through typeParamTsBindings). Identifier reads
1129
+ * are pure, so the static field read may skip evaluating the key exactly
1130
+ * like a syntactic literal. Null anywhere the type keeps more than one
1131
+ * key. */
1132
+ function recordKeyTypeLiteralText(lowerer, node) {
1133
+ if (!ts.isIdentifier(node))
1134
+ return null;
1135
+ let t = lowerer.typeOf(node);
1136
+ if (t.flags & ts.TypeFlags.TypeParameter) {
1137
+ const bound = lowerer.typeParamTsResolver(t);
1138
+ if (!bound)
1139
+ return null;
1140
+ t = bound;
1141
+ }
1142
+ if (t.isStringLiteralType())
1143
+ return t.value;
1144
+ if (t.isNumberLiteralType()) {
1145
+ const n = t.value;
1146
+ return Number.isFinite(n) && n >= 0 ? String(n) : null;
1147
+ }
1148
+ return null;
1149
+ }
1150
+ /** The literal index of a tuple access, or null when the expression isn't
1151
+ * a non-negative integer literal (parentheses tolerated — tsc's own
1152
+ * literal-index typing accepts them). */
1153
+ function tupleLiteralIndex(node) {
1154
+ let e = node;
1155
+ while (ts.isParenthesizedExpression(e))
1156
+ e = e.expression;
1157
+ if (!ts.isNumericLiteral(e))
1158
+ return null;
1159
+ const n = Number(e.text);
1160
+ return Number.isInteger(n) && n >= 0 ? n : null;
1161
+ }
1162
+ export function lowerElementCompoundParts(lowerer, expr, op, statement) {
1163
+ const target = expr.left;
1164
+ fenceNodeModuleMutation(lowerer, target, "assignment");
1165
+ const loc = locOf(expr);
1166
+ // A record through a computed key (`totals[side] += n` with a literal
1167
+ // union key, `counts[name] += 1` on an index-signature record): the
1168
+ // member compound's receiver, key, old value, rhs, write sequence.
1169
+ if (isKeyedFieldAccess(lowerer, target))
1170
+ return { expr: lowerFieldCompoundValue(lowerer, target, op, expr.right, loc), stmts: null };
1171
+ const checked = lowerer.lowerExpr(target.expression);
1172
+ if (checked?.type.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
1173
+ const stmts = [];
1174
+ const save = (value, name) => {
1175
+ const local = lowerer.declareHiddenLocal(name, value.type);
1176
+ stmts.push({ kind: "varDecl", localId: local.id, init: value, loc });
1177
+ return varRef(local.id, value.type, loc);
1178
+ };
1179
+ const receiver = save(checked, "%compoundReceiver");
1180
+ const key = save(lowerer.lowerExprExpecting(target.argumentExpression, DYN), "%compoundKey");
1181
+ const old = save({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc }, "%compoundOld");
1182
+ const rhs = lowerer.lowerExprExpecting(expr.right, DYN);
1183
+ const numeric = ["-", "*", "/", "%", "**"].includes(op);
1184
+ const value = save({
1185
+ kind: "libCall",
1186
+ fn: op === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
1187
+ args: op === "+" ? [old, rhs] : [old, rhs, strLit(op, loc)],
1188
+ type: DYN,
1189
+ loc,
1190
+ }, "%compoundResult");
1191
+ stmts.push({
1192
+ kind: "exprStmt",
1193
+ expr: {
1194
+ kind: "libCall",
1195
+ fn: "dyn.keySetComputed",
1196
+ args: [receiver, key, value],
1197
+ type: VOID,
1198
+ loc,
1199
+ },
1200
+ loc,
1201
+ });
1202
+ return { expr: { kind: "seqExpr", stmts, result: value, type: DYN, loc }, stmts: null };
1203
+ }
1204
+ const receiverType = checked.type.kind === "array" || checked.type.kind === "bytes"
1205
+ ? checked.type
1206
+ : lowerer.mapTypeOf(lowerer.typeOf(target.expression));
1207
+ if (receiverType?.kind !== "array" && receiverType?.kind !== "bytes") {
1208
+ lowerer.unsupported("SC1090", target, "compound assignment to non-array elements");
1209
+ }
1210
+ let receiver = checked;
1211
+ if (receiver.type.kind === "union" && lowerer.armTag(receiver.type.unionId, UNDEFINED_T) >= 0) {
1212
+ const present = lowerer.stripUndefinedArm(receiver.type);
1213
+ const helper = present.kind === receiverType.kind
1214
+ ? lowerer.narrowedArmHelper(receiver.type.unionId, present, locOf(target.expression))
1215
+ : null;
1216
+ if (helper)
1217
+ receiver = lowerer.checkedNarrowCall(helper, receiver, present, locOf(target.expression));
1218
+ }
1219
+ if (receiver.type.kind !== receiverType.kind) {
1220
+ lowerer.unsupported("SC1090", target.expression, "compound assignment through a non-native array or byte view");
1221
+ }
1222
+ const index = lowerer.lowerExpr(target.argumentExpression);
1223
+ if (index.type.kind !== "f64")
1224
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
1225
+ const receiverLocal = lowerer.declareHiddenLocal("%compoundArray", receiver.type);
1226
+ const indexLocal = lowerer.declareHiddenLocal("%compoundIndex", F64);
1227
+ const receiverRef = () => varRef(receiverLocal.id, receiver.type, loc);
1228
+ const indexRef = () => varRef(indexLocal.id, F64, loc);
1229
+ const oldValue = receiver.type.kind === "array"
1230
+ ? receiver.type.elem.kind === "f64"
1231
+ ? // Every numeric operator applies ToNumber to the old value, so a
1232
+ // missing element is NaN without materializing `number | undefined`.
1233
+ arrayNumberRead(receiverRef(), indexRef(), locOf(target))
1234
+ : receiver.type.elem.kind === "string" && op === "+"
1235
+ ? arrayStringOperand(receiverRef(), indexRef(), locOf(target))
1236
+ : arrayValueRead(lowerer, receiverRef(), indexRef(), receiver.type.elem, locOf(target))
1237
+ : {
1238
+ // An invalid index reads undefined in Node, which every numeric
1239
+ // compound operator turns into NaN; the write is then ignored.
1240
+ kind: "bytesIntrinsic",
1241
+ method: "get",
1242
+ receiver: receiverRef(),
1243
+ args: [indexRef()],
1244
+ type: F64,
1245
+ loc: locOf(target),
1246
+ invalidNaN: true,
1247
+ };
1248
+ const oldLocal = lowerer.declareHiddenLocal("%compoundOld", oldValue.type);
1249
+ const oldRef = () => varRef(oldLocal.id, oldValue.type, loc);
1250
+ const rhs = lowerer.lowerExpr(expr.right);
1251
+ const numericRhs = rhs.type.kind === "dyn" &&
1252
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
1253
+ receiver.type.kind === "bytes"
1254
+ ? { kind: "libCall", fn: "dyn.toNumberCoerce", args: [rhs], type: F64, loc }
1255
+ : lowerOptionalNumber(lowerer, rhs, loc);
1256
+ const elementType = receiver.type.kind === "array" ? receiver.type.elem : F64;
1257
+ const valueType = elementType.kind === "union" && lowerer.armTag(elementType.unionId, UNDEFINED_T) >= 0
1258
+ ? lowerer.stripUndefinedArm(elementType)
1259
+ : elementType;
1260
+ if (statement &&
1261
+ op === "+" &&
1262
+ receiver.type.kind === "array" &&
1263
+ receiver.type.elem.kind === "string") {
1264
+ // Receiver, index, old element (read inside the concat), rhs, write.
1265
+ const appended = {
1266
+ kind: "strConcat",
1267
+ left: oldValue,
1268
+ right: concatOperand(lowerer, rhs, expr.right),
1269
+ type: STRING,
1270
+ loc,
1271
+ };
1272
+ return {
1273
+ expr: null,
1274
+ stmts: [
1275
+ { kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
1276
+ { kind: "varDecl", localId: indexLocal.id, init: index, loc },
1277
+ { kind: "arraySet", arr: receiverRef(), index: indexRef(), value: appended, loc },
1278
+ ],
1279
+ };
1280
+ }
1281
+ let computed;
1282
+ if (op === "+" && valueType.kind === "string") {
1283
+ computed = {
1284
+ kind: "strConcat",
1285
+ left: lowerer.ensureString(oldRef(), target),
1286
+ right: concatOperand(lowerer, rhs, expr.right),
1287
+ type: STRING,
1288
+ loc,
1289
+ };
1290
+ }
1291
+ else if (valueType.kind === "f64" && numericRhs.type.kind === "f64") {
1292
+ computed = {
1293
+ kind: "bin",
1294
+ op,
1295
+ left: lowerOptionalNumber(lowerer, oldRef(), loc),
1296
+ right: numericRhs,
1297
+ type: F64,
1298
+ loc,
1299
+ };
1300
+ }
1301
+ else if (valueType.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
1302
+ const left = lowerer.coerceToExpected(oldRef(), DYN), right = lowerer.coerceToExpected(rhs, DYN);
1303
+ computed = dynCompoundValue(op, left, right, loc);
1304
+ }
1305
+ else if (rhs.type.kind === "dyn" &&
1306
+ receiver.type.kind === "array" &&
1307
+ lowerer.dynConvertible(oldValue.type) &&
1308
+ lowerer.dynConvertible(valueType)) {
1309
+ // An untyped right operand: the expanded `a[i] = a[i] op rhs`, checked
1310
+ // back into the element type.
1311
+ computed = lowerer.coerceInto(expr, dynCompoundValue(op, lowerer.coerceToExpected(oldRef(), DYN), lowerer.coerceToExpected(rhs, DYN), loc), valueType);
1312
+ }
1313
+ else {
1314
+ compoundUnsupported(lowerer, expr, op, oldValue.type, rhs.type);
1315
+ }
1316
+ const resultLocal = lowerer.declareHiddenLocal("%compoundResult", computed.type);
1317
+ const resultRef = () => varRef(resultLocal.id, computed.type, loc);
1318
+ const write = receiver.type.kind === "array"
1319
+ ? arrayValueStore(lowerer, receiverRef(), indexRef(), resultRef(), receiver.type.elem, loc)
1320
+ : { kind: "bytesSet", arr: receiverRef(), index: indexRef(), value: resultRef(), loc };
1321
+ return {
1322
+ expr: {
1323
+ kind: "seqExpr",
1324
+ stmts: [
1325
+ { kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
1326
+ { kind: "varDecl", localId: indexLocal.id, init: index, loc },
1327
+ { kind: "varDecl", localId: oldLocal.id, init: oldValue, loc },
1328
+ { kind: "varDecl", localId: resultLocal.id, init: computed, loc },
1329
+ write,
1330
+ ],
1331
+ result: resultRef(),
1332
+ type: computed.type,
1333
+ loc,
1334
+ },
1335
+ stmts: null,
1336
+ };
1337
+ }
1338
+ /** ToString of one stabilized `string[]` element read for `+=`: a missing
1339
+ * element concatenates as "undefined". */
1340
+ function arrayStringOperand(arr, index, loc) {
1341
+ return {
1342
+ kind: "ternary",
1343
+ cond: {
1344
+ kind: "bin",
1345
+ op: "===",
1346
+ left: { kind: "arrayState", arr, index, type: F64, loc },
1347
+ right: { kind: "numLit", value: 1, type: F64, loc },
1348
+ type: BOOL,
1349
+ loc,
1350
+ },
1351
+ then: { kind: "arrayGet", arr, index, type: STRING, loc },
1352
+ else_: strLit("undefined", loc),
1353
+ type: STRING,
1354
+ loc,
1355
+ };
1356
+ }
1357
+ export function lowerElementWrite(lowerer, expr) {
1358
+ const prototype = lowerClassPrototypeComputedAssignment(lowerer, expr);
1359
+ if (prototype)
1360
+ return { kind: "exprStmt", expr: prototype, loc: locOf(expr) };
1361
+ const target = expr.left;
1362
+ fenceNodeModuleMutation(lowerer, target, "assignment");
1363
+ const globalKey = globalSymbolKey(lowerer, target.expression, target.argumentExpression);
1364
+ if (globalKey) {
1365
+ const value = lowerer.lowerExprExpecting(expr.right, DYN);
1366
+ const loc = locOf(expr);
1367
+ return {
1368
+ kind: "exprStmt",
1369
+ expr: {
1370
+ kind: "libCall",
1371
+ fn: "dyn.globalSymbolSet",
1372
+ args: [globalKey, value],
1373
+ type: VOID,
1374
+ loc,
1375
+ },
1376
+ loc,
1377
+ };
1378
+ }
1379
+ // `process.env[key] = v` — the computed twin of the dotted env write:
1380
+ // setenv(3), string keys and string values only.
1381
+ if (lowerer.isProcessEnv(target.expression) && !target.questionDotToken) {
1382
+ const loc = locOf(expr);
1383
+ const key = lowerEnvironmentKey(lowerer, target.argumentExpression);
1384
+ if (key.type.kind !== "string") {
1385
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing process.env with non-string keys");
1386
+ }
1387
+ const value = lowerer.lowerExpr(expr.right);
1388
+ if (value.type.kind !== "string") {
1389
+ lowerer.unsupported("SC1090", expr.right, `assigning '${lowerer.fmt(value.type)}' values to process.env (env values are strings — convert first: \`\${v}\`)`);
1390
+ }
1391
+ return {
1392
+ kind: "exprStmt",
1393
+ expr: { kind: "libCall", fn: "process.envSet", args: [key, value], type: VOID, loc },
1394
+ loc,
1395
+ };
1396
+ }
1397
+ // Symbol-keyed property WRITES (`this[kLimit] = v`): the read path's
1398
+ // twin — a statically-resolvable unique-symbol key declared on the
1399
+ // receiver's class writes the hidden field slot; everything else keeps
1400
+ // the fence (static shapes have no symbol-keyed storage).
1401
+ if (lowerer.mapTypeOf(lowerer.typeOf(target.argumentExpression))?.kind === "symbol") {
1402
+ const fieldT = symbolFieldTarget(lowerer, target);
1403
+ if (fieldT) {
1404
+ const value = lowerer.lowerExprExpecting(expr.right, fieldT.fieldType);
1405
+ return lowerer.fieldSetStmt(fieldT, value, locOf(expr), target);
1406
+ }
1407
+ const receiver = lowerer.lowerExpr(target.expression);
1408
+ if (receiver.type.kind === "dyn")
1409
+ return {
1410
+ kind: "exprStmt",
1411
+ expr: lowerDynMemberAssignment(lowerer, expr, receiver),
1412
+ loc: locOf(expr),
1413
+ };
1414
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
1415
+ receiver.type.kind === "object" &&
1416
+ lowerer.dynConvertible(receiver.type)) {
1417
+ return {
1418
+ kind: "exprStmt",
1419
+ expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceToExpected(receiver, DYN)),
1420
+ loc: locOf(expr),
1421
+ };
1422
+ }
1423
+ lowerer.unsupported("SC1090", target, "symbol-keyed property writes outside class fields keyed by a stable module-level literal Symbol()/Symbol.for() (other static shapes have no symbol-keyed storage)");
1424
+ }
1425
+ const checkedReceiver = tryLowerExpression(lowerer, target.expression);
1426
+ if (checkedReceiver?.type.kind === "dyn") {
1427
+ return {
1428
+ kind: "exprStmt",
1429
+ expr: lowerDynMemberAssignment(lowerer, expr, checkedReceiver),
1430
+ loc: locOf(expr),
1431
+ };
1432
+ }
1433
+ if (checkedReceiver?.type.kind === "object" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
1434
+ const info = lowerer.classes.get(checkedReceiver.type.className);
1435
+ const key = recordKeyLiteralText(target.argumentExpression) ??
1436
+ recordKeyTypeLiteralText(lowerer, target.argumentExpression);
1437
+ if (info && key !== null && isClassCallback(lowerer, info, key)) {
1438
+ const receiver = lowerer.coerceInto(target.expression, checkedReceiver, DYN);
1439
+ return {
1440
+ kind: "exprStmt",
1441
+ expr: lowerDynMemberAssignment(lowerer, expr, receiver),
1442
+ loc: locOf(expr),
1443
+ };
1444
+ }
1445
+ }
1446
+ let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(target.expression));
1447
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)) && checkedReceiver) {
1448
+ const represented = checkedReceiver.type.kind === "union"
1449
+ ? lowerer.stripUndefinedArm(checkedReceiver.type)
1450
+ : checkedReceiver.type;
1451
+ if (represented.kind === "array" || represented.kind === "bytes")
1452
+ receiverIr = represented;
1453
+ }
1454
+ if (receiverIr === null || receiverIr.kind === "dyn") {
1455
+ const receiver = tryLowerExpression(lowerer, target.expression);
1456
+ if (receiver?.type.kind === "array")
1457
+ receiverIr = receiver.type;
1458
+ }
1459
+ // A checked-dynamic receiver TYPE (`unknown[]` and the collapsed
1460
+ // `(string | object)[]` map to DYN wholesale now): the dyn keyed
1461
+ // write — dyn.keySet. Number keys canonicalize through the JS-exact
1462
+ // formatter; ARR receivers take canonical index keys as element
1463
+ // set/extend (undefined-hole padding, JS's length growth exactly),
1464
+ // OBJ receivers set the member, and the runtime throws Node's
1465
+ // TypeErrors on every other kind. Values convert into the checked-dynamic tree;
1466
+ // unconvertible ones fence per site (the dynFrom stance).
1467
+ if (receiverIr?.kind === "dyn") {
1468
+ const obj = lowerer.lowerExpr(target.expression);
1469
+ if (obj.type.kind === "dyn") {
1470
+ const loc = locOf(expr);
1471
+ const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(target.argumentExpression), target.argumentExpression);
1472
+ if (key.type.kind !== "string") {
1473
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-string or non-number keys");
1474
+ }
1475
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
1476
+ if (value.type.kind !== "dyn") {
1477
+ lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic array (the value cannot convert into the checked-dynamic tree)`);
1478
+ }
1479
+ return {
1480
+ kind: "exprStmt",
1481
+ expr: { kind: "libCall", fn: "dyn.keySet", args: [obj, key, value], type: VOID, loc },
1482
+ loc,
1483
+ };
1484
+ }
1485
+ }
1486
+ if (receiverIr?.kind === "object" || receiverIr?.kind === "record") {
1487
+ const key = recordKeyLiteralText(target.argumentExpression) ??
1488
+ recordKeyTypeLiteralText(lowerer, target.argumentExpression);
1489
+ if (key !== null) {
1490
+ const receiver = lowerer.lowerExpr(target.expression);
1491
+ const field = representedClassFieldTarget(lowerer, target.expression, key, receiver);
1492
+ if (field) {
1493
+ const value = lowerer.lowerExprExpecting(expr.right, field.fieldType);
1494
+ return lowerer.fieldSetStmt(field, value, locOf(expr), target);
1495
+ }
1496
+ if (hasClassPayload(lowerer, receiver.type)) {
1497
+ if (receiver.type.kind === "object" && receiver.type.className === "%Error") {
1498
+ return {
1499
+ kind: "exprStmt",
1500
+ expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, receiver, DYN)),
1501
+ loc: locOf(expr),
1502
+ };
1503
+ }
1504
+ lowerer.unsupported("SC1090", target, "writing undeclared properties through structural views of class instances");
1505
+ }
1506
+ }
1507
+ }
1508
+ // Typed-array element write `b[i] = v` — bytesSet: the value is an f64
1509
+ // the runtime coerces JS-exactly; invalid indices are ignored.
1510
+ if (receiverIr?.kind === "bytes") {
1511
+ const recv = lowerer.lowerExpr(target.expression);
1512
+ // The checker's flow type is a typed array, but the storage is wider.
1513
+ if (recv.type.kind !== "bytes")
1514
+ return lowerWiderBytesWrite(lowerer, expr, target, recv);
1515
+ const index = lowerer.lowerExpr(target.argumentExpression);
1516
+ if (index.type.kind === "dyn" && recv.type.kind === "bytes") {
1517
+ return {
1518
+ kind: "exprStmt",
1519
+ expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, recv, DYN)),
1520
+ loc: locOf(expr),
1521
+ };
1522
+ }
1523
+ if (index.type.kind !== "f64") {
1524
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
1525
+ }
1526
+ const value = lowerer.lowerExprExpecting(expr.right, F64);
1527
+ return { kind: "bytesSet", arr: recv, index, value, loc: locOf(expr) };
1528
+ }
1529
+ // Tuple element write `t[0] = v`: a positional-field write (recordSet)
1530
+ // — literal indices only, like the read.
1531
+ if (receiverIr?.kind === "record") {
1532
+ const shape = lowerer.shapes.get(receiverIr.shapeId);
1533
+ if (shape) {
1534
+ const obj = lowerer.lowerExpr(target.expression);
1535
+ if (hasClassPayload(lowerer, obj.type)) {
1536
+ lowerer.unsupported("SC1090", target, "computed property writes through structural views of class instances (use a declared literal key)");
1537
+ }
1538
+ // A record-mapped CHECKER type over a VALUE living in the checked-dynamic tree (a
1539
+ // JS file-scope object-literal global): the checked-dynamic keyed
1540
+ // write — dyn.keySet (later writes win, insertion order; Node's
1541
+ // TypeErrors on non-object receivers), the value converting into
1542
+ // the checked-dynamic tree. Literal and runtime keys alike: the checked-dynamic tree's key set is
1543
+ // open, so no declared-field collision analysis applies.
1544
+ if (obj.type.kind === "dyn") {
1545
+ const loc = locOf(expr);
1546
+ const litKey = recordKeyLiteralText(target.argumentExpression);
1547
+ let key = litKey !== null
1548
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
1549
+ : lowerer.lowerExpr(target.argumentExpression);
1550
+ key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
1551
+ if (key.type.kind !== "string") {
1552
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
1553
+ }
1554
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
1555
+ if (value.type.kind !== "dyn") {
1556
+ lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic object (the value cannot convert into the checked-dynamic tree)`);
1557
+ }
1558
+ return {
1559
+ kind: "exprStmt",
1560
+ expr: { kind: "libCall", fn: "dyn.keySet", args: [obj, key, value], type: VOID, loc },
1561
+ loc,
1562
+ };
1563
+ }
1564
+ }
1565
+ if (shape?.tuple) {
1566
+ const idx = tupleLiteralIndex(target.argumentExpression);
1567
+ if (idx === null) {
1568
+ lowerer.unsupported("SC1090", target.argumentExpression, "tuple indexing with a non-literal index (tuples are fixed-shape — use t[0], t[1], ...)");
1569
+ }
1570
+ const fieldType = shape.fields.find((f) => f.name === String(idx))?.type;
1571
+ if (fieldType === undefined)
1572
+ lowerer.badType(target, lowerer.typeOf(target));
1573
+ const obj = lowerer.lowerExpr(target.expression);
1574
+ const value = lowerer.lowerExprExpecting(expr.right, fieldType);
1575
+ return {
1576
+ kind: "recordSet",
1577
+ obj,
1578
+ shapeId: receiverIr.shapeId,
1579
+ field: String(idx),
1580
+ value,
1581
+ loc: locOf(expr),
1582
+ };
1583
+ }
1584
+ // Dynamic keyed write `r[k] = v` — index-signature shapes only (a
1585
+ // declared-only shape's writable key set is closed; spell the field).
1586
+ // A LITERAL declared key is the bracket spelling of a field write.
1587
+ // Values flow into the index-value slot (dyn slots convert, typed
1588
+ // slots coerce); declared-key collisions at runtime validate against
1589
+ // the field's type through the emitted helper (a mismatch throws the
1590
+ // catchable TypeError — SEMANTICS.md).
1591
+ if (shape && !shape.tuple) {
1592
+ const guarded = lowerGuardedRecordWrite(lowerer, expr, target);
1593
+ if (guarded)
1594
+ return guarded;
1595
+ // Literal keys — string literals AND numeric literals in their
1596
+ // canonical string spelling (`b[1] = v` writes field/key "1", JS's
1597
+ // own key derivation) — name declared fields directly. A key
1598
+ // IDENTIFIER whose TYPE proves one literal (a literal-typed const,
1599
+ // a keyof-constrained type parameter bound to a literal inside a
1600
+ // generic instance — `set(o, "a", v)`'s body writing `o[k] = v`)
1601
+ // is the same static field write.
1602
+ const litKey = recordKeyLiteralText(target.argumentExpression) ??
1603
+ recordKeyTypeLiteralText(lowerer, target.argumentExpression);
1604
+ if (litKey !== null) {
1605
+ const field = shape.fields.find((f) => f.name === litKey);
1606
+ if (field) {
1607
+ const obj = lowerer.lowerExpr(target.expression);
1608
+ const value = lowerer.lowerExprExpecting(expr.right, field.type);
1609
+ return {
1610
+ kind: "recordSet",
1611
+ obj,
1612
+ shapeId: receiverIr.shapeId,
1613
+ field: litKey,
1614
+ value,
1615
+ loc: locOf(expr),
1616
+ };
1617
+ }
1618
+ }
1619
+ if (!shape.indexValue) {
1620
+ // A SIGNATURE-FREE shape whose declared fields share ONE type
1621
+ // writes through the same per-shape dispatch (the mockable-clock
1622
+ // module shape: `mocked[functionality] = implementation` over a
1623
+ // table of same-signature closures). A key naming no declared
1624
+ // field throws the catchable TypeError — JS would ADD the
1625
+ // property, which a monomorphic struct cannot (the SEMANTICS.md
1626
+ // keyed-write-miss divergence). Mixed-type and accessor-carrying
1627
+ // shapes keep the fence.
1628
+ const common = shape.fields.length > 0 &&
1629
+ !shapeHasAccessorSlots(shape) &&
1630
+ shape.fields.every((f) => typeEquals(f.type, shape.fields[0].type))
1631
+ ? shape.fields[0].type
1632
+ : null;
1633
+ if (!common) {
1634
+ lowerer.unsupported("SC1090", target, "dynamic keyed writes to records without an index signature (declared fields of ONE shared type dispatch by key — spell the field name otherwise)");
1635
+ }
1636
+ const obj = lowerer.lowerExpr(target.expression);
1637
+ let key = litKey !== null
1638
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
1639
+ : lowerer.lowerExpr(target.argumentExpression);
1640
+ // Runtime number/boolean/dyn keys stringify — ToPropertyKey,
1641
+ // exactly the index-signature path's rule.
1642
+ key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
1643
+ if (key.type.kind !== "string") {
1644
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
1645
+ }
1646
+ const value = lowerer.coerceInto(expr.right, lowerer.lowerExpr(expr.right), common);
1647
+ if (!typeEquals(value.type, common))
1648
+ lowerer.badType(expr.right, lowerer.typeOf(expr.right));
1649
+ return {
1650
+ kind: "recordKeySet",
1651
+ obj,
1652
+ shapeId: receiverIr.shapeId,
1653
+ key,
1654
+ value,
1655
+ loc: locOf(expr),
1656
+ };
1657
+ }
1658
+ // A LITERAL key naming no declared field is a pure overflow insert
1659
+ // — no collision to validate. Runtime keys must be able to collide
1660
+ // with every declared field: dyn slots validate through the
1661
+ // dynCheck walker (fields must be dyn-convertible — the same
1662
+ // convertibility the read needs); typed slots write through
1663
+ // directly, so every field must BE the index-value type.
1664
+ const overflowOnly = litKey !== null;
1665
+ const writable = overflowOnly ||
1666
+ (shape.indexValue.kind === "dyn"
1667
+ ? shape.fields.every((f) => lowerer.dynConvertible(f.type))
1668
+ : shape.fields.every((f) => typeEquals(f.type, shape.indexValue)));
1669
+ if (!writable) {
1670
+ lowerer.unsupported("SC1090", target, `dynamic keyed writes to '${lowerer.fmt(receiverIr)}' (a declared field's type cannot take the index signature's value at runtime)`);
1671
+ }
1672
+ const obj = lowerer.lowerExpr(target.expression);
1673
+ let key = litKey !== null
1674
+ ? {
1675
+ kind: "strLit",
1676
+ value: litKey,
1677
+ type: STRING,
1678
+ loc: locOf(target.argumentExpression),
1679
+ }
1680
+ : lowerer.lowerExpr(target.argumentExpression);
1681
+ // Runtime NUMBER keys canonicalize through the JS-exact formatter
1682
+ // (o[n] = v writes o[String(n)] — the number-keyed-signature path).
1683
+ key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
1684
+ if (key.type.kind !== "string") {
1685
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
1686
+ }
1687
+ const value = lowerer.intoIndexValueSlot(lowerer.lowerExpr(expr.right), shape.indexValue, expr.right);
1688
+ return {
1689
+ kind: "recordKeySet",
1690
+ obj,
1691
+ shapeId: receiverIr.shapeId,
1692
+ key,
1693
+ value,
1694
+ ...(overflowOnly ? { overflowOnly: true } : {}),
1695
+ loc: locOf(expr),
1696
+ };
1697
+ }
1698
+ }
1699
+ // Keyed write `d[k] = v` on a CHECKED-DYNAMIC receiver (a JS `any`
1700
+ // dictionary — the Object.create(null) memo-table idiom writes
1701
+ // `result[key] = value`): dyn.keySet, exactly the record-mapped dyn
1702
+ // arm above — later writes win in insertion order, number keys
1703
+ // canonicalize through the JS-exact formatter (ToPropertyKey's string
1704
+ // side), index keys on dyn arrays set/extend elements, and non-object
1705
+ // receivers throw Node's TypeErrors at runtime. An unmapped checker type
1706
+ // probes the receiver's lowered representation: a dyn value takes the same
1707
+ // write, anything else falls through to the fences.
1708
+ if (receiverIr?.kind === "dyn" || receiverIr?.kind === "object" || receiverIr === null) {
1709
+ const obj = receiverIr !== null
1710
+ ? lowerer.lowerExpr(target.expression)
1711
+ : tryLowerExpression(lowerer, target.expression);
1712
+ if (obj !== null &&
1713
+ (obj.type.kind === "dyn" ||
1714
+ (obj.type.kind === "object" && obj.type.className === "%Error") ||
1715
+ isDynTypedRefType(obj.type))) {
1716
+ const loc = locOf(expr);
1717
+ const litKey = recordKeyLiteralText(target.argumentExpression);
1718
+ let key = litKey !== null
1719
+ ? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
1720
+ : lowerer.lowerExpr(target.argumentExpression);
1721
+ key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
1722
+ if (key.type.kind !== "string") {
1723
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing checked-dynamic values with non-string or non-number keys");
1724
+ }
1725
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
1726
+ if (value.type.kind !== "dyn") {
1727
+ lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic object (the value cannot convert into the checked-dynamic tree)`);
1728
+ }
1729
+ return {
1730
+ kind: "exprStmt",
1731
+ expr: {
1732
+ kind: "libCall",
1733
+ fn: "dyn.keySet",
1734
+ args: [lowerer.coerceToExpected(obj, DYN), key, value],
1735
+ type: VOID,
1736
+ loc,
1737
+ },
1738
+ loc,
1739
+ };
1740
+ }
1741
+ }
1742
+ if (receiverIr?.kind !== "array") {
1743
+ lowerer.unsupported("SC1090", target, "assignment to non-array elements");
1744
+ }
1745
+ let arr = lowerer.lowerExpr(target.expression);
1746
+ if (arr.type.kind === "union" &&
1747
+ lowerer.armTag(arr.type.unionId, UNDEFINED_T) >= 0 &&
1748
+ receiverIr.kind === "array") {
1749
+ const present = lowerer.stripUndefinedArm(arr.type);
1750
+ const helper = present.kind === "array"
1751
+ ? lowerer.narrowedArmHelper(arr.type.unionId, present, locOf(target.expression))
1752
+ : null;
1753
+ if (helper) {
1754
+ arr = lowerer.checkedNarrowCall(helper, arr, present, locOf(target.expression));
1755
+ }
1756
+ }
1757
+ if (arr.type.kind !== "array") {
1758
+ lowerer.unsupported("SC1090", target.expression, "assignment through a possibly missing nested array receiver");
1759
+ }
1760
+ const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(target.argumentExpression), locOf(target.argumentExpression), target.argumentExpression);
1761
+ if (index.type.kind === "dyn" && lowerer.dynConvertible(arr.type)) {
1762
+ return {
1763
+ kind: "exprStmt",
1764
+ expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, arr, DYN)),
1765
+ loc: locOf(expr),
1766
+ };
1767
+ }
1768
+ if (index.type.kind !== "f64") {
1769
+ lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
1770
+ }
1771
+ // Optional array reads carry the source array's payload type plus an
1772
+ // undefined arm. arrayValueStore turns that arm into the runtime's
1773
+ // UNDEFINED state while keeping number[]/string[] payload storage scalar.
1774
+ let literal = expr.right;
1775
+ while (ts.isParenthesizedExpression(literal) || ts.isSatisfiesExpression(literal))
1776
+ literal = literal.expression;
1777
+ const value = ts.isObjectLiteralExpression(literal) || ts.isArrayLiteralExpression(literal)
1778
+ ? lowerer.lowerExprExpecting(literal, arr.type.elem)
1779
+ : lowerer.lowerExpr(expr.right);
1780
+ // Validate the payload before emitting a native store. A dormant JS
1781
+ // method can contradict its JSDoc element type; retain its call-time
1782
+ // refusal instead of leaving invalid IR in a newly reachable method.
1783
+ const expected = value.type.kind === "undefinedT" ||
1784
+ (value.type.kind === "union" && lowerer.armTag(value.type.unionId, UNDEFINED_T) >= 0)
1785
+ ? arrayValueType(lowerer, arr.type.elem)
1786
+ : arr.type.elem;
1787
+ return arrayValueStore(lowerer, arr, index, lowerer.coerceInto(expr.right, value, expected), arr.type.elem, locOf(expr));
1788
+ }
1789
+ /** Environment property names use ToPrimitive with the string hint, so
1790
+ * checked objects must execute their own conversion hooks. */
1791
+ export function lowerEnvironmentKey(lowerer, node) {
1792
+ const key = lowerer.lowerExpr(node);
1793
+ if (key.type.kind === "dyn")
1794
+ return { kind: "libCall", fn: "dyn.toStringCoerce", args: [key], type: STRING, loc: key.loc };
1795
+ return lowerRecordPropertyKey(lowerer, key, node);
1796
+ }
1797
+ //# sourceMappingURL=element-access.js.map