@scriptc/compiler 0.4.2 → 0.4.4

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 (726) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +470 -66
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +479 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/debug-info.js +2 -5
  58. package/dist/backend/llvm/debug-info.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  65. package/dist/backend/llvm/dense-array-loops.js +194 -5
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +30 -0
  72. package/dist/backend/llvm/dyn.js +373 -70
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +13 -28
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +211 -33
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  82. package/dist/backend/llvm/emit-statements.js +268 -84
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +186 -37
  88. package/dist/backend/llvm/emitter.js +733 -90
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +65 -7
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +11 -13
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.js +48 -20
  95. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  96. package/dist/backend/llvm/expr-callbacks.js +47 -0
  97. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  98. package/dist/backend/llvm/expr-calls.js +28 -14
  99. package/dist/backend/llvm/expr-calls.js.map +1 -1
  100. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  101. package/dist/backend/llvm/expr-containers.js +143 -37
  102. package/dist/backend/llvm/expr-containers.js.map +1 -1
  103. package/dist/backend/llvm/expr-context.d.ts +14 -0
  104. package/dist/backend/llvm/expr-dynamic.js +18 -11
  105. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +119 -38
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.d.ts +12 -0
  111. package/dist/backend/llvm/expr-records.js +106 -0
  112. package/dist/backend/llvm/expr-records.js.map +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  114. package/dist/backend/llvm/expr-stream-bridges.js +210 -69
  115. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  118. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  119. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  120. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  121. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  122. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  123. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  124. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  125. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  126. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  127. package/dist/backend/llvm/integer-values.d.ts +25 -1
  128. package/dist/backend/llvm/integer-values.js +95 -0
  129. package/dist/backend/llvm/integer-values.js.map +1 -1
  130. package/dist/backend/llvm/js-ic.d.ts +1 -1
  131. package/dist/backend/llvm/js-ic.js +1 -1
  132. package/dist/backend/llvm/js-ic.js.map +1 -1
  133. package/dist/backend/llvm/key-orders.d.ts +7 -0
  134. package/dist/backend/llvm/key-orders.js +33 -0
  135. package/dist/backend/llvm/key-orders.js.map +1 -0
  136. package/dist/backend/llvm/lib-connect.js +4 -0
  137. package/dist/backend/llvm/lib-connect.js.map +1 -1
  138. package/dist/backend/llvm/lib-datagram.js +11 -0
  139. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  140. package/dist/backend/llvm/lib-dispatch.js +213 -5
  141. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  142. package/dist/backend/llvm/lib-filesystem.js +4 -4
  143. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  144. package/dist/backend/llvm/lib-http2.js +4 -0
  145. package/dist/backend/llvm/lib-http2.js.map +1 -1
  146. package/dist/backend/llvm/lib-lookup.js +16 -6
  147. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  148. package/dist/backend/llvm/lib-process.js +37 -1
  149. package/dist/backend/llvm/lib-process.js.map +1 -1
  150. package/dist/backend/llvm/lib-shared.js +94 -2
  151. package/dist/backend/llvm/lib-shared.js.map +1 -1
  152. package/dist/backend/llvm/lib-stream.js +35 -5
  153. package/dist/backend/llvm/lib-stream.js.map +1 -1
  154. package/dist/backend/llvm/local-array-reads.js +115 -19
  155. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  156. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  157. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  158. package/dist/backend/llvm/loop-state.d.ts +33 -0
  159. package/dist/backend/llvm/loop-state.js +42 -0
  160. package/dist/backend/llvm/loop-state.js.map +1 -0
  161. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  162. package/dist/backend/llvm/map-number-lookup.js +91 -31
  163. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  164. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  165. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  166. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  167. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  168. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  169. package/dist/backend/llvm/nullable-unions.js +15 -3
  170. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  171. package/dist/backend/llvm/publish.d.ts +10 -0
  172. package/dist/backend/llvm/publish.js +15 -3
  173. package/dist/backend/llvm/publish.js.map +1 -1
  174. package/dist/backend/llvm/receivers.js +6 -1
  175. package/dist/backend/llvm/receivers.js.map +1 -1
  176. package/dist/backend/llvm/record-results.d.ts +1 -9
  177. package/dist/backend/llvm/record-results.js +2 -11
  178. package/dist/backend/llvm/record-results.js.map +1 -1
  179. package/dist/backend/llvm/reference-effects.js +3 -0
  180. package/dist/backend/llvm/reference-effects.js.map +1 -1
  181. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  182. package/dist/backend/llvm/reference-writes.js +89 -72
  183. package/dist/backend/llvm/reference-writes.js.map +1 -1
  184. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  185. package/dist/backend/llvm/running-extrema.js +115 -0
  186. package/dist/backend/llvm/running-extrema.js.map +1 -0
  187. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  188. package/dist/backend/llvm/running-extrema.test.js +89 -0
  189. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  190. package/dist/backend/llvm/shapes.d.ts +71 -15
  191. package/dist/backend/llvm/shapes.js +224 -40
  192. package/dist/backend/llvm/shapes.js.map +1 -1
  193. package/dist/backend/llvm/shapes.test.js +53 -7
  194. package/dist/backend/llvm/shapes.test.js.map +1 -1
  195. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  196. package/dist/backend/llvm/speculative-integers.js +2 -2
  197. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  198. package/dist/backend/llvm/stack-captures.js +1 -5
  199. package/dist/backend/llvm/stack-captures.js.map +1 -1
  200. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  201. package/dist/backend/llvm/stack-objects.js +5 -2
  202. package/dist/backend/llvm/stack-objects.js.map +1 -1
  203. package/dist/backend/llvm/string-reads.d.ts +12 -0
  204. package/dist/backend/llvm/string-reads.js +44 -0
  205. package/dist/backend/llvm/string-reads.js.map +1 -1
  206. package/dist/backend/llvm/union-repr.d.ts +4 -3
  207. package/dist/backend/llvm/union-repr.js +6 -5
  208. package/dist/backend/llvm/union-repr.js.map +1 -1
  209. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  210. package/dist/backend/llvm/walk-borrows.js +46 -41
  211. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  212. package/dist/backend/llvm/walkers.d.ts +3 -0
  213. package/dist/backend/llvm/walkers.js +101 -65
  214. package/dist/backend/llvm/walkers.js.map +1 -1
  215. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  216. package/dist/backend/llvm/wrapping-sums.js +126 -0
  217. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  218. package/dist/backend/may-throw.d.ts +8 -10
  219. package/dist/backend/may-throw.js +14 -10
  220. package/dist/backend/may-throw.js.map +1 -1
  221. package/dist/backend/native/contracts.d.ts +5 -0
  222. package/dist/backend/native/executable.js +7 -0
  223. package/dist/backend/native/executable.js.map +1 -1
  224. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  225. package/dist/backend/native/runtime-inputs.js +1 -0
  226. package/dist/backend/native/runtime-inputs.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.test.js +6 -4
  231. package/dist/backend/native-codegen.test.js.map +1 -1
  232. package/dist/backend/native-link-info-core.d.ts +4 -0
  233. package/dist/backend/native-link-info-core.js.map +1 -1
  234. package/dist/backend/publication.d.ts +12 -1
  235. package/dist/backend/publication.js +37 -14
  236. package/dist/backend/publication.js.map +1 -1
  237. package/dist/backend/publication.test.js +30 -0
  238. package/dist/backend/publication.test.js.map +1 -1
  239. package/dist/backend/result-slots.d.ts +16 -0
  240. package/dist/backend/result-slots.js +23 -0
  241. package/dist/backend/result-slots.js.map +1 -0
  242. package/dist/backend/runtime-abi.d.ts +2 -2
  243. package/dist/backend/runtime-abi.js +2 -2
  244. package/dist/backend/runtime-pack-core.d.ts +1 -0
  245. package/dist/backend/runtime-pack-core.js +1 -0
  246. package/dist/backend/runtime-pack-core.js.map +1 -1
  247. package/dist/backend/runtime-pack-targets.test.js +2 -1
  248. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  249. package/dist/backend/runtime-pack.test.js +2 -1
  250. package/dist/backend/runtime-pack.test.js.map +1 -1
  251. package/dist/backend/stack-observations.d.ts +2 -1
  252. package/dist/backend/stack-observations.js +67 -42
  253. package/dist/backend/stack-observations.js.map +1 -1
  254. package/dist/backend/target-cpu.d.ts +26 -0
  255. package/dist/backend/target-cpu.js +98 -0
  256. package/dist/backend/target-cpu.js.map +1 -0
  257. package/dist/backend/target-cpu.test.d.ts +1 -0
  258. package/dist/backend/target-cpu.test.js +38 -0
  259. package/dist/backend/target-cpu.test.js.map +1 -0
  260. package/dist/backend/target-diagnostics.js +5 -3
  261. package/dist/backend/target-diagnostics.js.map +1 -1
  262. package/dist/backend/warm-cache.js +1 -0
  263. package/dist/backend/warm-cache.js.map +1 -1
  264. package/dist/cli/command.js +20 -1
  265. package/dist/cli/command.js.map +1 -1
  266. package/dist/cli/usage.d.ts +4 -1
  267. package/dist/cli/usage.js +10 -3
  268. package/dist/cli/usage.js.map +1 -1
  269. package/dist/compat/fetch-profile.js +1 -1
  270. package/dist/compat/fetch-profile.js.map +1 -1
  271. package/dist/compile-types.d.ts +7 -0
  272. package/dist/contracts/check.js +4 -3
  273. package/dist/contracts/check.js.map +1 -1
  274. package/dist/contracts/int32-elements.js +10 -2
  275. package/dist/contracts/int32-elements.js.map +1 -1
  276. package/dist/coverage/report.js +12 -3
  277. package/dist/coverage/report.js.map +1 -1
  278. package/dist/diagnostics/diagnostic.d.ts +4 -0
  279. package/dist/diagnostics/diagnostic.js +1 -1
  280. package/dist/diagnostics/diagnostic.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +3 -0
  282. package/dist/diagnostics/envelope.js +1 -0
  283. package/dist/diagnostics/envelope.js.map +1 -1
  284. package/dist/executable/executable-cache.d.ts +5 -0
  285. package/dist/executable/executable-cache.js +5 -0
  286. package/dist/executable/executable-cache.js.map +1 -1
  287. package/dist/executable/executable-cache.test.js +3 -0
  288. package/dist/executable/executable-cache.test.js.map +1 -1
  289. package/dist/frontend/decl-projection.d.ts +41 -0
  290. package/dist/frontend/decl-projection.js +949 -0
  291. package/dist/frontend/decl-projection.js.map +1 -0
  292. package/dist/frontend/decl-projection.test.d.ts +1 -0
  293. package/dist/frontend/decl-projection.test.js +30 -0
  294. package/dist/frontend/decl-projection.test.js.map +1 -0
  295. package/dist/frontend/dts-paths.d.ts +15 -0
  296. package/dist/frontend/dts-paths.js +25 -0
  297. package/dist/frontend/dts-paths.js.map +1 -1
  298. package/dist/frontend/input-tracker.d.ts +6 -0
  299. package/dist/frontend/input-tracker.js +51 -28
  300. package/dist/frontend/input-tracker.js.map +1 -1
  301. package/dist/frontend/input-tracker.test.js +19 -0
  302. package/dist/frontend/input-tracker.test.js.map +1 -1
  303. package/dist/frontend/lowering/array-values.js +100 -2
  304. package/dist/frontend/lowering/array-values.js.map +1 -1
  305. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  306. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  307. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  308. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  309. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  310. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  311. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  312. package/dist/frontend/lowering/builtins/crypto.js +87 -10
  313. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/dates.js +4 -1
  315. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  317. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  318. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  319. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  321. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  322. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  323. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  324. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  325. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  326. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  327. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  329. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
  331. package/dist/frontend/lowering/builtins/promises.js +236 -139
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  334. package/dist/frontend/lowering/builtins/readline.js +35 -3
  335. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/url.js +24 -1
  337. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/call-signatures.js +0 -1
  341. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  342. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  343. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  344. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  345. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  346. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  347. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  348. package/dist/frontend/lowering/class-callbacks.js +82 -12
  349. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  350. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  351. package/dist/frontend/lowering/class-construction.js +17 -3
  352. package/dist/frontend/lowering/class-construction.js.map +1 -1
  353. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
  355. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  358. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  359. package/dist/frontend/lowering/class-iterables.js +9 -1
  360. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  361. package/dist/frontend/lowering/class-method-mutations.js +83 -24
  362. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  363. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  364. package/dist/frontend/lowering/class-protocols.js +183 -1
  365. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  366. package/dist/frontend/lowering/class-prototypes.js +31 -2
  367. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  368. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  369. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  370. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  371. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  372. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  373. package/dist/frontend/lowering/coercions/structural.js +91 -1
  374. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  375. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  376. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  377. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  378. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  379. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  380. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  381. package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
  382. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  383. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  384. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  385. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  386. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  387. package/dist/frontend/lowering/containers/array-methods.js +26 -3
  388. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  390. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  391. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  392. package/dist/frontend/lowering/containers/bytes.js +455 -46
  393. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  394. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  395. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  396. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  397. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  399. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  400. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  401. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  402. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  407. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  408. package/dist/frontend/lowering/date-values.d.ts +11 -0
  409. package/dist/frontend/lowering/date-values.js +207 -0
  410. package/dist/frontend/lowering/date-values.js.map +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  412. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  413. package/dist/frontend/lowering/divergences.js +9 -1
  414. package/dist/frontend/lowering/divergences.js.map +1 -1
  415. package/dist/frontend/lowering/error-methods.js +47 -2
  416. package/dist/frontend/lowering/error-methods.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/array-literals.js +53 -0
  418. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/binary.js +100 -28
  420. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/element-access.js +169 -13
  422. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  423. package/dist/frontend/lowering/expressions/identifiers.js +64 -5
  424. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  425. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  426. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  427. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  428. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  429. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  430. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  431. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  433. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  434. package/dist/frontend/lowering/expressions/property-access.js +168 -10
  435. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  436. package/dist/frontend/lowering/expressions/relational.js +212 -33
  437. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  438. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  439. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  440. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  441. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  442. package/dist/frontend/lowering/expressions/updates.js +39 -3
  443. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  444. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  445. package/dist/frontend/lowering/frozen-records.js +322 -0
  446. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  447. package/dist/frontend/lowering/function-returns.js +64 -0
  448. package/dist/frontend/lowering/function-returns.js.map +1 -1
  449. package/dist/frontend/lowering/generic-functions.js +7 -2
  450. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  451. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  452. package/dist/frontend/lowering/indexed-unions.js +401 -0
  453. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  454. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  455. package/dist/frontend/lowering/iterable-values.js +297 -0
  456. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  457. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  458. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  459. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  460. package/dist/frontend/lowering/js-class-fields.js +45 -10
  461. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  462. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  463. package/dist/frontend/lowering/key-order-witness.js +974 -48
  464. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  465. package/dist/frontend/lowering/key-order-witness.test.js +530 -10
  466. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  467. package/dist/frontend/lowering/lower-assert.js +15 -3
  468. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  469. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  470. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  471. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  472. package/dist/frontend/lowering/lower-calls.js +462 -44
  473. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  474. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  475. package/dist/frontend/lowering/lower-classes.js +324 -69
  476. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  477. package/dist/frontend/lowering/lower-dgram.js +3 -1
  478. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  479. package/dist/frontend/lowering/lower-exprs.js +215 -3
  480. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  481. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  482. package/dist/frontend/lowering/lower-functions.js +83 -0
  483. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  484. package/dist/frontend/lowering/lower-generators.js +42 -32
  485. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  486. package/dist/frontend/lowering/lower-global-value.js +6 -3
  487. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  488. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  489. package/dist/frontend/lowering/lower-inspect.js +53 -17
  490. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  491. package/dist/frontend/lowering/lower-modules.js +53 -5
  492. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  493. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  494. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.js +2 -2
  496. package/dist/frontend/lowering/lower-server.js.map +1 -1
  497. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  498. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  499. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  500. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  501. package/dist/frontend/lowering/lower-stmts.js +553 -81
  502. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  503. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  504. package/dist/frontend/lowering/lower-stream.js +1483 -156
  505. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  506. package/dist/frontend/lowering/lowerer.d.ts +107 -8
  507. package/dist/frontend/lowering/lowerer.js +381 -36
  508. package/dist/frontend/lowering/lowerer.js.map +1 -1
  509. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  510. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  511. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  512. package/dist/frontend/lowering/new-target.d.ts +12 -0
  513. package/dist/frontend/lowering/new-target.js +280 -0
  514. package/dist/frontend/lowering/new-target.js.map +1 -0
  515. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  516. package/dist/frontend/lowering/object-factory-new.js +20 -6
  517. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  518. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  519. package/dist/frontend/lowering/overload-choice.js +190 -0
  520. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  521. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  522. package/dist/frontend/lowering/surfaces.js +73 -8
  523. package/dist/frontend/lowering/surfaces.js.map +1 -1
  524. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  525. package/dist/frontend/lowering/undefined-index.js +82 -0
  526. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  527. package/dist/frontend/lowering/var-hoisting.js +29 -13
  528. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  529. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  530. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  531. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  532. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  533. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  534. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  535. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  536. package/dist/frontend/npm-static.js +4 -20
  537. package/dist/frontend/npm-static.js.map +1 -1
  538. package/dist/frontend/package-shims.d.ts +3 -0
  539. package/dist/frontend/package-shims.js +71 -8
  540. package/dist/frontend/package-shims.js.map +1 -1
  541. package/dist/frontend/pipeline.js +19 -11
  542. package/dist/frontend/pipeline.js.map +1 -1
  543. package/dist/frontend/process-fork.d.ts +25 -0
  544. package/dist/frontend/process-fork.js +2 -0
  545. package/dist/frontend/process-fork.js.map +1 -0
  546. package/dist/frontend/program-analysis.d.ts +5 -1
  547. package/dist/frontend/program-analysis.js +5 -0
  548. package/dist/frontend/program-analysis.js.map +1 -1
  549. package/dist/frontend/program.d.ts +21 -6
  550. package/dist/frontend/program.js +681 -83
  551. package/dist/frontend/program.js.map +1 -1
  552. package/dist/frontend/program.test.js +43 -3
  553. package/dist/frontend/program.test.js.map +1 -1
  554. package/dist/frontend/token-equivalence.d.ts +3 -0
  555. package/dist/frontend/token-equivalence.js +409 -0
  556. package/dist/frontend/token-equivalence.js.map +1 -0
  557. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  558. package/dist/frontend/token-equivalence.test.js +67 -0
  559. package/dist/frontend/token-equivalence.test.js.map +1 -0
  560. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  561. package/dist/frontend/ts7/ast-node.js +1048 -103
  562. package/dist/frontend/ts7/ast-node.js.map +1 -1
  563. package/dist/frontend/ts7/ast-node.test.js +24 -0
  564. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  565. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  566. package/dist/frontend/ts7/ast-wire.js +34 -24
  567. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  568. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  569. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  570. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  571. package/dist/frontend/ts7/checker-backend.js +2 -2
  572. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  573. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  574. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  575. package/dist/frontend/ts7/checker.d.ts +4 -0
  576. package/dist/frontend/ts7/checker.js +7 -0
  577. package/dist/frontend/ts7/checker.js.map +1 -1
  578. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  579. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  580. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  581. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  582. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  583. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  584. package/dist/frontend/ts7/program-host.d.ts +7 -0
  585. package/dist/frontend/ts7/program-host.js +25 -2
  586. package/dist/frontend/ts7/program-host.js.map +1 -1
  587. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  588. package/dist/frontend/ts7/semantic-model.js +5 -0
  589. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  590. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  591. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  592. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  593. package/dist/frontend/ts7/semantic-types.js +1 -1
  594. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  595. package/dist/frontend/ts7/session.d.ts +14 -1
  596. package/dist/frontend/ts7/session.js +22 -0
  597. package/dist/frontend/ts7/session.js.map +1 -1
  598. package/dist/frontend/type-mapper.d.ts +13 -1
  599. package/dist/frontend/type-mapper.js +229 -20
  600. package/dist/frontend/type-mapper.js.map +1 -1
  601. package/dist/index.d.ts +0 -5
  602. package/dist/index.js +46 -4
  603. package/dist/index.js.map +1 -1
  604. package/dist/ir/analysis.js +5 -3
  605. package/dist/ir/analysis.js.map +1 -1
  606. package/dist/ir/array-length-stability.d.ts +4 -0
  607. package/dist/ir/array-length-stability.js +19 -6
  608. package/dist/ir/array-length-stability.js.map +1 -1
  609. package/dist/ir/array-length-stability.test.js +24 -0
  610. package/dist/ir/array-length-stability.test.js.map +1 -1
  611. package/dist/ir/builtin-effects.d.ts +7 -0
  612. package/dist/ir/builtin-effects.js +60 -0
  613. package/dist/ir/builtin-effects.js.map +1 -1
  614. package/dist/ir/builtin-signatures.d.ts +6 -4
  615. package/dist/ir/builtin-signatures.js +222 -13
  616. package/dist/ir/builtin-signatures.js.map +1 -1
  617. package/dist/ir/callback-specialization.d.ts +2 -1
  618. package/dist/ir/callback-specialization.js +23 -18
  619. package/dist/ir/callback-specialization.js.map +1 -1
  620. package/dist/ir/char-unit-locals.d.ts +19 -0
  621. package/dist/ir/char-unit-locals.js +185 -0
  622. package/dist/ir/char-unit-locals.js.map +1 -0
  623. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  624. package/dist/ir/char-unit-locals.test.js +94 -0
  625. package/dist/ir/char-unit-locals.test.js.map +1 -0
  626. package/dist/ir/final-fields.d.ts +2 -1
  627. package/dist/ir/final-fields.js +14 -16
  628. package/dist/ir/final-fields.js.map +1 -1
  629. package/dist/ir/function-references.d.ts +2 -0
  630. package/dist/ir/function-references.js +2 -0
  631. package/dist/ir/function-references.js.map +1 -1
  632. package/dist/ir/function-references.test.js +3 -0
  633. package/dist/ir/function-references.test.js.map +1 -1
  634. package/dist/ir/initializer-bindings.d.ts +2 -1
  635. package/dist/ir/initializer-bindings.js +27 -20
  636. package/dist/ir/initializer-bindings.js.map +1 -1
  637. package/dist/ir/int32-arrays.d.ts +108 -0
  638. package/dist/ir/int32-arrays.js +831 -0
  639. package/dist/ir/int32-arrays.js.map +1 -0
  640. package/dist/ir/int32-slots.d.ts +24 -2
  641. package/dist/ir/int32-slots.js +266 -57
  642. package/dist/ir/int32-slots.js.map +1 -1
  643. package/dist/ir/int32-slots.test.js +33 -0
  644. package/dist/ir/int32-slots.test.js.map +1 -1
  645. package/dist/ir/integer-loops.d.ts +3 -3
  646. package/dist/ir/integer-loops.js +28 -10
  647. package/dist/ir/integer-loops.js.map +1 -1
  648. package/dist/ir/integer-loops.test.js +10 -0
  649. package/dist/ir/integer-loops.test.js.map +1 -1
  650. package/dist/ir/integer-ranges.d.ts +5 -0
  651. package/dist/ir/integer-ranges.js +125 -12
  652. package/dist/ir/integer-ranges.js.map +1 -1
  653. package/dist/ir/integer-ranges.test.js +30 -0
  654. package/dist/ir/integer-ranges.test.js.map +1 -1
  655. package/dist/ir/ir.d.ts +83 -10
  656. package/dist/ir/ir.js +77 -6
  657. package/dist/ir/ir.js.map +1 -1
  658. package/dist/ir/ir.test.js +23 -2
  659. package/dist/ir/ir.test.js.map +1 -1
  660. package/dist/ir/js-ic.d.ts +4 -0
  661. package/dist/ir/js-ic.js +17 -1
  662. package/dist/ir/js-ic.js.map +1 -1
  663. package/dist/ir/js-ic.test.js +46 -0
  664. package/dist/ir/js-ic.test.js.map +1 -1
  665. package/dist/ir/node-index.d.ts +57 -0
  666. package/dist/ir/node-index.js +215 -0
  667. package/dist/ir/node-index.js.map +1 -0
  668. package/dist/ir/paired-while-loops.d.ts +25 -0
  669. package/dist/ir/paired-while-loops.js +335 -0
  670. package/dist/ir/paired-while-loops.js.map +1 -0
  671. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  672. package/dist/ir/paired-while-loops.test.js +163 -0
  673. package/dist/ir/paired-while-loops.test.js.map +1 -0
  674. package/dist/ir/parameter-versions.d.ts +25 -0
  675. package/dist/ir/parameter-versions.js +300 -0
  676. package/dist/ir/parameter-versions.js.map +1 -0
  677. package/dist/ir/runtime-features.d.ts +34 -13
  678. package/dist/ir/runtime-features.js +177 -39
  679. package/dist/ir/runtime-features.js.map +1 -1
  680. package/dist/ir/serialize.d.ts +12 -2
  681. package/dist/ir/serialize.js +16 -3
  682. package/dist/ir/serialize.js.map +1 -1
  683. package/dist/ir/serialize.test.js +17 -0
  684. package/dist/ir/serialize.test.js.map +1 -1
  685. package/dist/ir/traverse.js +18 -6
  686. package/dist/ir/traverse.js.map +1 -1
  687. package/dist/ir/validate.js +167 -40
  688. package/dist/ir/validate.js.map +1 -1
  689. package/dist/library/ir-policy.js +3 -0
  690. package/dist/library/ir-policy.js.map +1 -1
  691. package/dist/native/cache.d.ts +6 -1
  692. package/dist/native/cache.js +28 -5
  693. package/dist/native/cache.js.map +1 -1
  694. package/dist/native/cache.test.js +16 -2
  695. package/dist/native/cache.test.js.map +1 -1
  696. package/dist/native/cli.js +21 -1
  697. package/dist/native/cli.js.map +1 -1
  698. package/dist/native/compiler.js +8 -6
  699. package/dist/native/compiler.js.map +1 -1
  700. package/dist/native/executable-cache.d.ts +1 -1
  701. package/dist/native/executable-cache.js +2 -2
  702. package/dist/native/executable-cache.js.map +1 -1
  703. package/dist/native/prepare.d.ts +4 -2
  704. package/dist/native/prepare.js +130 -32
  705. package/dist/native/prepare.js.map +1 -1
  706. package/dist/native/prepare.test.js +96 -20
  707. package/dist/native/prepare.test.js.map +1 -1
  708. package/dist/native/sanitizer.test.js +2 -0
  709. package/dist/native/sanitizer.test.js.map +1 -1
  710. package/dist/native/text-file.d.ts +13 -3
  711. package/dist/native/text-file.js +63 -9
  712. package/dist/native/text-file.js.map +1 -1
  713. package/dist/native/text-file.test.d.ts +1 -0
  714. package/dist/native/text-file.test.js +49 -0
  715. package/dist/native/text-file.test.js.map +1 -0
  716. package/dist/native/toolchain.js +4 -4
  717. package/dist/native/toolchain.js.map +1 -1
  718. package/dist/native/toolchain.test.js +3 -3
  719. package/dist/native/toolchain.test.js.map +1 -1
  720. package/package.json +21 -21
  721. package/shims/chalk/v5.ts +688 -0
  722. package/shims/hono-node-server/v2.ts +645 -0
  723. package/shims/hot-shots/client.ts +1126 -0
  724. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  725. package/shims/hot-shots/v8.ts +8 -0
  726. package/surface-manifest.json +27 -7
@@ -1,8 +1,9 @@
1
1
  import { lowerTupleAliasDecl, stripTypeWrappers } from "./typed-arguments.js";
2
+ import { allBytesArms, indexedUnionArms, lowerIndexedUnionMember, lowerIndexedUnionNumberRead, lowerIndexedUnionRead, } from "./indexed-unions.js";
2
3
  import { declaredMemberOf, isPromisePrototypeRead } from "./expressions/property-access.js";
3
4
  import { hostsAll } from "./expressions/hosted-narrowing.js";
4
5
  import { requestGeneralStreamSurface } from "./general-streams.js";
5
- import { lowerForAwaitDynStream } from "./dyn-streams.js";
6
+ import { lowerForAwaitDynStream, nodeStreamInterfaceSide } from "./dyn-streams.js";
6
7
  import { lowerForAwaitValueStream } from "./builtins/hash-stream.js";
7
8
  import { lowerChildPropertyWrite } from "./handle-properties.js";
8
9
  import { matchAllRowsReadByElements, storedMatchAllRowsReadByElements, } from "./containers/match-row-uses.js";
@@ -22,23 +23,26 @@ import { InternalCompilerError } from "../../errors.js";
22
23
  * flow (if/while/for/for-of/do, switch, try/catch, abrupt completions),
23
24
  * explicit resource management, and blocked-binding poisoning. */
24
25
  import * as ts from "../ts7/adapter.js";
26
+ import { lowerOptionalIndex } from "./undefined-index.js";
25
27
  import { processDataMemberValue, programReadsExitCode } from "./builtins/process.js";
26
28
  import { requireInitFlagStmt } from "./require-initialization.js";
27
29
  import { isJsonRequireDecl } from "./json-require.js";
30
+ import { isTimeValueDateDeclaration } from "./date-values.js";
28
31
  import { bindingSource } from "../binding-source.js";
29
32
  import { lowerConstructorReturn } from "./constructor-returns.js";
30
- import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, } from "./cjs-inline-require.js";
33
+ import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, splitRequireAssignmentOf, splitRequireBindingOf, splitRequireBindingOfIdent, splitRequireEarlyReadOf, wholeExportSymbolOfModule, } from "./cjs-inline-require.js";
31
34
  import { cjsExportMemberWriteGlobalOf, isCjsExportsIdentifier, isCjsModuleExports, isFreshExportsReset, } from "./cjs-exports-object.js";
32
35
  import { isDeadTscHelperDecl, tscInteropBindingOfDecl } from "./cjs-tsc-interop.js";
33
36
  import { arrayValueRead, arrayValueStore, arrayValueType, unionArrayValueRead, lowerSafeIndexRead, } from "./array-values.js";
34
37
  import { lowerForAwaitGenerator, lowerForOfGenerator, lowerYieldStarStatement, } from "./lower-generators.js";
35
38
  import { classAsyncGeneratorIterator, lowerForAwaitBuiltin } from "./lower-async-iteration.js";
36
- import { BOOL, BYTES_U8, CAUGHT, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
39
+ import { BOOL, BYTES_U8, CAUGHT, DATE_T, DYN, F64, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
37
40
  import { PoisonError, boundIdentifiersOf, dynFallbackType, neverTaintedJsType, staticImportNamespaceType, } from "./lowerer.js";
38
41
  import { enforceLibBoundary, lowerSurplusCalls } from "./lib-boundary.js";
39
42
  import { cjsExportAssignmentOf, cjsExportChainOf, cjsVoidInitPreambleReals, cjsExportDiscardReason, cjsExportTargetLiteral, isCjsJsFile, isEsModuleStamp, isJsSourceFile, locOf, requireEarlyReference, requireSpecOf, } from "../program.js";
40
43
  import { isStrictCode } from "./strict-mode.js";
41
- import { COMPOUND_ASSIGN_OPS, STR_METHODS, UNSUPPORTED_STMT, isStdlibMember, sideEffectFreeOptionValue, stdlibGlobalAliasDecl, stdlibGlobalAliasNameOf, bufferNamespaceMember, stdlibGlobalNameOf, } from "./surfaces.js";
44
+ import { markSloppyRecordWrites } from "./frozen-records.js";
45
+ import { COMPOUND_ASSIGN_OPS, STR_METHODS, NARROW_FIRST, UNSUPPORTED_STMT, isStdlibMember, sideEffectFreeOptionValue, stdlibGlobalAliasDecl, stdlibGlobalAliasNameOf, bufferNamespaceMember, stdlibGlobalNameOf, } from "./surfaces.js";
42
46
  import { isNativeBuiltinValueInitializer } from "./lower-builtin-values.js";
43
47
  import { isProvenanceSourceFile } from "../provenance-registry.js";
44
48
  import { ambientUndefVarRootOf, lowerImportEquals, nsUndefRead, nsWritableTarget, trapDeclRootOf, } from "./lower-namespaces.js";
@@ -59,7 +63,7 @@ import { objectFactorySignature } from "./object-factory-new.js";
59
63
  import { isClassCallback, lowerClassCallbackAssign } from "./class-callbacks.js";
60
64
  import { classForInHasKey, classPropertiesHelper } from "./class-dynamic-dispatch.js";
61
65
  import { genericIfaceBindingKeepsClass, superConditionLead } from "./lower-classes.js";
62
- import { lowerStreamUnderscoreAssign, streamClassAliasDecl } from "./lower-stream.js";
66
+ import { lowerStreamUnderscoreAssign, streamClassAliasDecl, streamSidesOf, } from "./lower-stream.js";
63
67
  import { staticAssertInstanceDecl } from "./assert-instances.js";
64
68
  import { lowerHttpResPropertyAssignment, lowerHttpServerTimeoutAssignment, lowerNetServerMaxConnectionsAssignment, lowerServerCloseOverrideAssignment, } from "./lower-server.js";
65
69
  import { lowerUrlAssignment } from "./builtins/url.js";
@@ -70,7 +74,7 @@ import { lowerNodeModuleCall } from "./builtins/module-resolution.js";
70
74
  import { registerBuiltinCallableAlias } from "./builtins/callable-aliases.js";
71
75
  import { builtinClassAliasOwnsNoSlot, registerBuiltinClassAlias } from "./builtins/class-values.js";
72
76
  import { lowerEnumDeclaration } from "./lower-enums.js";
73
- import { abstractPropertyDeclOf, aliasTypeofNarrows, isMatchSliceType, lowerAbsenceProbe, lowerCompoundValueToTarget, lowerElementCompoundStatement, lowerIncDec, lowerIncDecTarget, lowerOptionalNumber, lowerGroupsProjection, matchResultNamedGroupsOf, runtimeOptionalGuardIds, runtimeOptionalTrueIds, symbolFieldInfo, withRuntimeOptionalNarrowed, } from "./lower-exprs.js";
77
+ import { abstractPropertyDeclOf, aliasTypeofNarrows, isMatchSliceType, lowerAbsenceProbe, lowerCompoundValueToTarget, lowerElementCompoundStatement, lowerIncDec, lowerIncDecTarget, lowerGroupsProjection, matchResultNamedGroupsOf, runtimeOptionalGuardIds, runtimeOptionalTrueIds, symbolFieldInfo, withRuntimeOptionalNarrowed, } from "./lower-exprs.js";
74
78
  import { globalSymbolKey } from "./expressions/global-symbols.js";
75
79
  import { identifiersNamed } from "./identifier-uses.js";
76
80
  import { lowerShortCircuitAssignment } from "./expressions/nullish-assignment.js";
@@ -89,6 +93,7 @@ import { npmStaticPackageOfPath } from "../npm-static.js";
89
93
  import { fenceNodeModuleMutation } from "./lower-node-module.js";
90
94
  import { fencePerfEntryKeyWalk } from "./builtins/performance.js";
91
95
  import { classGeneratorIterable } from "./class-iterables.js";
96
+ import { iterableUnionOf, lowerForOfIterable } from "./iterable-values.js";
92
97
  /** An opted package's directly-returned empty array may take the function's
93
98
  * explicit static return element type. This is the common JS accumulator
94
99
  * shape (`const result = []; result.push(value); return result`) and is
@@ -808,6 +813,46 @@ export function predeclareForwardCapture(lowerer, symbol) {
808
813
  }
809
814
  return false;
810
815
  }
816
+ /** The CLASS-DECLARATION twin of predeclareForwardCapture: a function
817
+ * hoisted above a local `class D` (`function make() { return new D(); }`
818
+ * reached through an earlier function) captures the class binding, which
819
+ * is in its temporal dead zone until the class statement runs. The class
820
+ * cannot be collected yet (its heritage may name bindings declared between
821
+ * here and the statement), so the binding is pre-declared as a TDZ box
822
+ * holding the class as a checked-dynamic constructor; the class statement
823
+ * later initializes it, and every reference reads it from there. */
824
+ export function predeclareForwardClass(lowerer, symbol) {
825
+ const decl = symbol.valueDeclaration;
826
+ if (!decl || !ts.isClassDeclaration(decl) || decl.name === undefined)
827
+ return false;
828
+ if (!isJsSourceFile(ts.getSourceFileOfNode(decl)))
829
+ return false;
830
+ for (let i = lowerer.activeStmtLists.length - 1; i >= 0; i--) {
831
+ const entry = lowerer.activeStmtLists[i];
832
+ const idx = entry.stmts.indexOf(decl);
833
+ if (idx < 0)
834
+ continue;
835
+ if (idx < entry.index || entry.ctx === lowerer.ctx || entry.ctx.tdzPredeclared.has(symbol))
836
+ return false;
837
+ const name = decl.name.text;
838
+ const count = entry.ctx.localCounters.get(name) ?? 0;
839
+ entry.ctx.localCounters.set(name, count + 1);
840
+ const local = {
841
+ id: `${name}.${count}`,
842
+ name,
843
+ type: DYN,
844
+ mutable: false,
845
+ boxed: true,
846
+ tdz: true,
847
+ };
848
+ entry.ctx.locals.push(local);
849
+ entry.frame.set(symbol, local);
850
+ entry.out.push({ kind: "varDecl", localId: local.id, init: null, loc: locOf(decl) });
851
+ entry.ctx.tdzPredeclared.set(symbol, local);
852
+ return true;
853
+ }
854
+ return false;
855
+ }
811
856
  /** The FUNCTION-DECLARATION twin of predeclareForwardCapture: JS hoists a
812
857
  * nested `function f() {}` to scope entry — the binding is LIVE from the
813
858
  * first statement, so a reference lexically above the declaration in the
@@ -999,6 +1044,32 @@ function lowerJsVarFromExisting(lowerer, decl, symbol) {
999
1044
  loc: locOf(decl),
1000
1045
  };
1001
1046
  }
1047
+ /** Whether a JavaScript declaration's object value changes shape after its
1048
+ * initializer (jsOpenObjectType, jsObjectBindingExpands) or carries
1049
+ * methods, so only the checked-dynamic representation holds it.
1050
+ * `inferred` is the declaration's mapped checker type. */
1051
+ function jsDeclarationExpandsObject(lowerer, decl, inferred) {
1052
+ const arms = inferred?.kind === "union"
1053
+ ? (lowerer.unions.get(inferred.unionId)?.arms ?? [])
1054
+ : inferred
1055
+ ? [inferred]
1056
+ : [];
1057
+ return ((!decl.type &&
1058
+ !hasJsTypeAnnotation(decl) &&
1059
+ inferred !== null &&
1060
+ jsOpenObjectType(decl, inferred, lowerer.shapes, lowerer.unions).kind === "dyn") ||
1061
+ arms.some((arm) => arm.kind === "record" && jsObjectBindingExpands(lowerer, decl, arm)) ||
1062
+ (isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
1063
+ !decl.type &&
1064
+ !hasJsTypeAnnotation(decl) &&
1065
+ decl.initializer !== undefined &&
1066
+ ts.isObjectLiteralExpression(decl.initializer) &&
1067
+ decl.initializer.properties.nodes.some((property) => ts.isMethodDeclaration(property) ||
1068
+ ts.isAccessor(property) ||
1069
+ (ts.isPropertyAssignment(property) &&
1070
+ (ts.isFunctionExpression(property.initializer) ||
1071
+ ts.isArrowFunction(property.initializer))))));
1072
+ }
1002
1073
  /** The `var` symbol's function-scoped binding TYPE — the declared type at
1003
1074
  * the binding name, with the JS-source fallbacks every mutable binding
1004
1075
  * takes (an empty-object-literal type is checked-dynamic because tsc
@@ -1030,6 +1101,17 @@ function varBindingType(lowerer, nameNode) {
1030
1101
  }
1031
1102
  if (!type || type.kind === "void")
1032
1103
  return null;
1104
+ // A JavaScript `var` holds whatever its writes store, as a `let` does:
1105
+ // the checker types it by its initializer and checks no later write
1106
+ // (`var fraction = 0;`, later `fraction = match[7].slice(0, 3)`), and an
1107
+ // object it holds may gain members (`mark.snippet = snippet(mark)`).
1108
+ if (type.kind !== "dyn" &&
1109
+ ts.isVariableDeclaration(nameNode.parent) &&
1110
+ nameNode.parent.name === nameNode &&
1111
+ isJsSourceFile(ts.getSourceFileOfNode(nameNode)) &&
1112
+ (jsBindingHasOpenWrites(lowerer, nameNode.parent) ||
1113
+ jsDeclarationExpandsObject(lowerer, nameNode.parent, type)))
1114
+ return DYN;
1033
1115
  // A binding readable before its first store holds undefined until then.
1034
1116
  return lowerer.runtimeOptionalBindingType(nameNode, type);
1035
1117
  }
@@ -1299,8 +1381,24 @@ export function lowerStmt(lowerer, stmt) {
1299
1381
  if (!stmt.name)
1300
1382
  lowerer.unsupported("SC1090", stmt, "anonymous local class declarations");
1301
1383
  const info = lowerer.lowerClassExpressionInfo(stmt);
1384
+ // An earlier hoisted function captured the class: its TDZ box exists.
1385
+ const symbol = lowerer.checker.getSymbolAtLocation(stmt.name);
1386
+ const pre = symbol ? lowerer.ctx.tdzPredeclared.get(symbol) : undefined;
1387
+ if (pre) {
1388
+ lowerer.ctx.tdzPredeclared.delete(symbol);
1389
+ const value = lowerer.coerceToExpected(lowerer.lowerClassExpression(stmt), DYN);
1390
+ return { kind: "assign", localId: pre.id, value, initializes: true, loc: locOf(stmt) };
1391
+ }
1302
1392
  const type = { kind: "classval", className: info.def.name };
1303
1393
  const local = lowerer.declareLocal(stmt.name, stmt.name.text, type, true);
1394
+ // Static members of a function-local class run while the class value is
1395
+ // built and may read the class by name: the class value assigns the
1396
+ // binding before them.
1397
+ if (info.localClass && (info.runtimeStatics || info.runtimePrototypeMembers))
1398
+ return [
1399
+ { kind: "varDecl", localId: local.id, init: null, loc: locOf(stmt) },
1400
+ { kind: "exprStmt", expr: lowerer.lowerClassExpression(stmt, local), loc: locOf(stmt) },
1401
+ ];
1304
1402
  const init = lowerer.lowerClassExpression(stmt);
1305
1403
  return { kind: "varDecl", localId: local.id, init, loc: locOf(stmt) };
1306
1404
  }
@@ -1566,6 +1664,19 @@ export function lowerVarStatement(lowerer, stmt) {
1566
1664
  });
1567
1665
  }
1568
1666
  function lowerVarDeclarator(lowerer, stmt, decl, isConst, isLet) {
1667
+ // `var m; m = require("./x")`: the declaration is alias plumbing; the
1668
+ // assignment owns the module's run-once %init (cjs-inline-require.ts).
1669
+ // A read that code before the assignment can reach keeps Node's hoisted
1670
+ // `undefined` divergence visible at build time, like a var require
1671
+ // declaration below runnable code.
1672
+ const split = splitRequireBindingOf(lowerer, decl);
1673
+ if (split !== null) {
1674
+ const early = splitRequireEarlyReadOf(lowerer, split);
1675
+ if (early !== null) {
1676
+ lowerer.unsupported("SC1013", early, `var require() binding '${decl.name.text}' below code that can reach it (Node reads undefined before the require runs, which is not modeled — assign the require above the code that can run first)`);
1677
+ }
1678
+ return [];
1679
+ }
1569
1680
  // The canonical ESM bridge to a compiled program module. Like a
1570
1681
  // top-level CommonJS require declaration, the binding is alias
1571
1682
  // plumbing while the dependency evaluates at this statement's
@@ -2718,6 +2829,18 @@ export function lowerBindingPattern(lowerer, pattern, srcRef, srcType, isLet, ou
2718
2829
  lowerModuleNamespacePattern(lowerer, pattern, nsSource, isLet, out);
2719
2830
  return;
2720
2831
  }
2832
+ if (srcType.kind === "url") {
2833
+ lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out);
2834
+ return;
2835
+ }
2836
+ if (srcType.kind === "union" &&
2837
+ !isJsSourceFile(ts.getSourceFileOfNode(pattern)) &&
2838
+ lowerer.unions
2839
+ .get(srcType.unionId)
2840
+ ?.arms.every((arm) => arm.kind === "record" || arm.kind === "object")) {
2841
+ lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out);
2842
+ return;
2843
+ }
2721
2844
  if (srcType.kind !== "record") {
2722
2845
  lowerer.unsupported("SC1031", pattern, srcType.kind === "object"
2723
2846
  ? "object destructuring of class instances (read the fields directly — accessors make the desugar observable)"
@@ -2900,7 +3023,10 @@ function patternSourceValue(lowerer, value, arrayPattern, out, loc, spelling) {
2900
3023
  if (!arms ||
2901
3024
  !present?.length ||
2902
3025
  present.length === arms.length ||
2903
- (present.length > 1 && !(arrayPattern && present.every((arm) => arm.kind === "array"))))
3026
+ (present.length > 1 &&
3027
+ !(arrayPattern
3028
+ ? present.every((arm) => arm.kind === "array")
3029
+ : present.every((arm) => arm.kind === "record" || arm.kind === "object"))))
2904
3030
  return value;
2905
3031
  for (const [tag, arm] of arms.entries()) {
2906
3032
  if (!isUnitType(arm))
@@ -2994,6 +3120,122 @@ function lowerModuleNamespacePattern(lowerer, pattern, source, isLet, out) {
2994
3120
  lowerer.bindPatternTarget(el.name, value, isLet, out);
2995
3121
  }
2996
3122
  }
3123
+ /** The URL getters an object pattern reads (`const { protocol, hostname }
3124
+ * = new URL(text)`), each a read of the URL's current serialization. */
3125
+ const URL_PATTERN_GETTERS = {
3126
+ href: "url.href",
3127
+ origin: "url.origin",
3128
+ protocol: "url.protocol",
3129
+ username: "url.username",
3130
+ password: "url.password",
3131
+ host: "url.host",
3132
+ hostname: "url.hostname",
3133
+ port: "url.port",
3134
+ pathname: "url.pathname",
3135
+ search: "url.search",
3136
+ hash: "url.hash",
3137
+ };
3138
+ /** An object pattern over a URL: each element reads its getter in pattern
3139
+ * order, as `url.name` does; `searchParams` binds the URL's live view.
3140
+ * Methods and rest elements stay fenced. */
3141
+ function lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out) {
3142
+ for (const el of pattern.elements.nodes) {
3143
+ if (el.name === undefined)
3144
+ continue;
3145
+ if (el.dotDotDotToken) {
3146
+ lowerer.unsupported("SC1031", el, "rest bindings over URL sources (a URL's properties are prototype getters, which rest elements do not copy)");
3147
+ }
3148
+ const prop = el.propertyName ?? el.name;
3149
+ const propName = ts.isIdentifier(prop) ||
3150
+ ts.isComputedPropertyName(prop) ||
3151
+ ts.isStringLiteralLike(prop) ||
3152
+ ts.isNumericLiteral(prop)
3153
+ ? patternKeyNameOf(lowerer, prop)
3154
+ : null;
3155
+ const loc = locOf(el);
3156
+ let value;
3157
+ if (propName !== null && Object.hasOwn(URL_PATTERN_GETTERS, propName)) {
3158
+ value = {
3159
+ kind: "libCall",
3160
+ fn: URL_PATTERN_GETTERS[propName],
3161
+ args: [srcRef()],
3162
+ type: STRING,
3163
+ loc,
3164
+ };
3165
+ }
3166
+ else if (propName === "searchParams") {
3167
+ value = {
3168
+ kind: "libCall",
3169
+ fn: "url.searchParams",
3170
+ args: [srcRef()],
3171
+ type: SEARCH_PARAMS_T,
3172
+ loc,
3173
+ };
3174
+ }
3175
+ else {
3176
+ lowerer.unsupported("SC1031", el, propName === null
3177
+ ? "destructuring with computed keys that do not fold to one property name"
3178
+ : `destructuring '${propName}' from a URL (${Object.keys(URL_PATTERN_GETTERS).join(", ")} and searchParams are the supported URL properties)`);
3179
+ }
3180
+ if (el.initializer)
3181
+ value = applyBindingDefault(lowerer, el, value);
3182
+ lowerer.bindPatternTarget(el.name, value, isLet, out);
3183
+ }
3184
+ }
3185
+ /** An object pattern over a union of records and class instances
3186
+ * (`function f({ kind, path }: Add | Remove)`): each element reads a data
3187
+ * field every arm declares with one type, through the runtime tag, as
3188
+ * `value.field` does. Rest elements and fields the arms type differently
3189
+ * stay fenced. */
3190
+ function lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out) {
3191
+ const arms = lowerer.unions.get(srcType.unionId)?.arms ?? [];
3192
+ for (const el of pattern.elements.nodes) {
3193
+ if (el.name === undefined)
3194
+ continue;
3195
+ if (el.dotDotDotToken) {
3196
+ lowerer.unsupported("SC1031", el, `rest bindings over union sources (${NARROW_FIRST})`);
3197
+ }
3198
+ const prop = el.propertyName ?? el.name;
3199
+ const propName = ts.isIdentifier(prop) ||
3200
+ ts.isComputedPropertyName(prop) ||
3201
+ ts.isStringLiteralLike(prop) ||
3202
+ ts.isNumericLiteral(prop)
3203
+ ? patternKeyNameOf(lowerer, prop)
3204
+ : null;
3205
+ if (propName === null) {
3206
+ lowerer.unsupported("SC1031", el, "destructuring with computed keys that do not fold to one property name");
3207
+ }
3208
+ let common = null;
3209
+ for (const arm of arms) {
3210
+ let ft;
3211
+ if (arm.kind === "record") {
3212
+ ft = lowerer.shapes.get(arm.shapeId)?.fields.find((f) => f.name === propName)?.type;
3213
+ }
3214
+ else if (arm.kind === "object") {
3215
+ ft = lowerer.classes.get(arm.className)?.fields.get(propName);
3216
+ }
3217
+ if (!ft || ft.kind === "void" || isUnitType(ft) || (common && !typeEquals(common, ft))) {
3218
+ common = null;
3219
+ break;
3220
+ }
3221
+ common = ft;
3222
+ }
3223
+ if (common === null) {
3224
+ lowerer.unsupported("SC1031", el, `destructuring '${propName}' from a union whose arms type it differently (every arm must be a record or class with a same-typed field '${propName}' — ${NARROW_FIRST})`);
3225
+ }
3226
+ let value = {
3227
+ kind: "unionDisc",
3228
+ unionId: srcType.unionId,
3229
+ field: propName,
3230
+ value: srcRef(),
3231
+ type: common,
3232
+ loc: locOf(el),
3233
+ };
3234
+ if (el.initializer)
3235
+ value = applyBindingDefault(lowerer, el, value);
3236
+ lowerer.bindPatternTarget(el.name, value, isLet, out);
3237
+ }
3238
+ }
2997
3239
  /** Whether a pattern's first element has a computed key that does not
2998
3240
  * fold to one property name, so the key evaluates at run time. */
2999
3241
  function startsWithRuntimeKey(lowerer, pattern) {
@@ -3881,11 +4123,15 @@ export function bindPatternTarget(lowerer, name, value, isLet, out, allowDynObje
3881
4123
  }
3882
4124
  // Preserve checked-value pattern bindings when the inferred type
3883
4125
  // cannot represent them without a refusal or an alias-breaking copy.
4126
+ // A name destructured from a container of an evolving array
4127
+ // (evolvingArrayHold) may hold the array, which the checker types by
4128
+ // the elements written before it.
3884
4129
  const dynStays = value.type.kind === "dyn" &&
3885
- (() => {
4130
+ ((() => {
3886
4131
  const mapped = lowerer.mapTypeOf(lowerer.typeOf(name));
3887
4132
  return mapped === null || jsBindingKeepsCheckedObject(lowerer, name, mapped);
3888
- })();
4133
+ })() ||
4134
+ readsHeldEvolvingArray(lowerer, name));
3889
4135
  let type = dynStays
3890
4136
  ? DYN
3891
4137
  : (lowerer.runtimeOptionalBindingType(name, lowerer.irTypeOf(name)) ??
@@ -3969,9 +4215,10 @@ export function lowerVarDeclList(lowerer, list) {
3969
4215
  * `never[]` or `any[]` and each later read by the elements written before
3970
4216
  * it, and reads inside closures as the unsettled array. When every read
3971
4217
  * with a settled element type maps to the same array type, the binding has
3972
- * that type. When reads disagree or the binding is reassigned, it is
3973
- * checked-dynamic, as the same binding is at module scope. Null for other
3974
- * bindings. */
4218
+ * that type. When reads disagree, a write (`xs.push(v)`, `xs.unshift(v)`,
4219
+ * `xs.push(...values)`, `xs[i] = v`) stores a value that type's element does
4220
+ * not hold, or the binding is reassigned, it is checked-dynamic, as the same
4221
+ * binding is at module scope. Null for other bindings. */
3975
4222
  function evolvingArrayType(lowerer, decl) {
3976
4223
  if (!ts.isIdentifier(decl.name) || decl.initializer === undefined)
3977
4224
  return null;
@@ -3999,13 +4246,19 @@ function evolvingArrayType(lowerer, decl) {
3999
4246
  };
4000
4247
  const scope = owner(decl);
4001
4248
  let result = null;
4249
+ // The values the binding's writes store, checked against the element
4250
+ // type once the reads settle it.
4251
+ const written = [];
4002
4252
  // The file's identifiers are indexed by name once (identifiersNamed), so
4003
- // each binding resolves only the uses spelled like it.
4253
+ // each binding resolves only the uses spelled like it. A shorthand
4254
+ // property (`{ xs }`) is a use too.
4004
4255
  for (const node of identifiersNamed(lowerer, ts.getSourceFileOfNode(decl), decl.name.text)) {
4005
4256
  if (node === decl.name ||
4006
4257
  node.pos < scope.pos ||
4007
4258
  node.end > scope.end ||
4008
- lowerer.checker.getSymbolAtLocation(node) !== symbol)
4259
+ (ts.isShorthandPropertyAssignment(node.parent) && node.parent.name === node
4260
+ ? lowerer.checker.getShorthandAssignmentValueSymbol(node.parent)
4261
+ : lowerer.checker.getSymbolAtLocation(node)) !== symbol)
4009
4262
  continue;
4010
4263
  let target = node;
4011
4264
  while (ts.isParenthesizedExpression(target.parent))
@@ -4017,6 +4270,18 @@ function evolvingArrayType(lowerer, decl) {
4017
4270
  parent.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
4018
4271
  if (reassigned)
4019
4272
  return DYN;
4273
+ if (ts.isPropertyAccessExpression(parent) &&
4274
+ parent.expression === target &&
4275
+ (parent.name.text === "push" || parent.name.text === "unshift") &&
4276
+ ts.isCallExpression(parent.parent) &&
4277
+ parent.parent.expression === parent)
4278
+ written.push(...parent.parent.arguments.nodes);
4279
+ else if (ts.isElementAccessExpression(parent) &&
4280
+ parent.expression === target &&
4281
+ ts.isBinaryExpression(parent.parent) &&
4282
+ parent.parent.left === parent &&
4283
+ parent.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken)
4284
+ written.push(parent.parent.right);
4020
4285
  const t = lowerer.typeOf(node);
4021
4286
  if (unsettled(t))
4022
4287
  continue;
@@ -4025,7 +4290,132 @@ function evolvingArrayType(lowerer, decl) {
4025
4290
  return DYN;
4026
4291
  result = mapped;
4027
4292
  }
4028
- return result ?? DYN;
4293
+ if (result === null || result.kind !== "array")
4294
+ return DYN;
4295
+ // The element types a write stores: its value's, or for a spread
4296
+ // (`xs.push(...values)`) the source array's element or tuple's elements.
4297
+ // Another spread source stores elements this check cannot see.
4298
+ const storedTypes = (value) => {
4299
+ if (!ts.isSpreadElement(value))
4300
+ return [lowerer.typeOf(value)];
4301
+ const source = lowerer.typeOf(value.expression);
4302
+ if (lowerer.checker.isArrayType(source) || lowerer.checker.isTupleType(source))
4303
+ return [...lowerer.checker.getTypeArguments(source)];
4304
+ return null;
4305
+ };
4306
+ for (const value of written) {
4307
+ const stored = storedTypes(value);
4308
+ if (stored === null)
4309
+ return DYN;
4310
+ for (const type of stored) {
4311
+ const t = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(type));
4312
+ if (!t || (!typeEquals(t, result.elem) && lowerer.widthLiftPlan(t, result.elem) === null))
4313
+ return DYN;
4314
+ }
4315
+ }
4316
+ return result;
4317
+ }
4318
+ /** How a TypeScript expression holds an evolving array binding whose reads
4319
+ * disagree (evolvingArrayType answers checked-dynamic): "evolving" for the
4320
+ * binding itself, "alias" for an unannotated binding initialized with it or
4321
+ * with an alias of it (`const alias = xs`), and "container" for an object or
4322
+ * array literal with it as a property, element or spread source at any
4323
+ * depth (`{ items: xs }`, `[xs]`), an unannotated binding initialized with
4324
+ * or destructured from such a literal, and a property or element read of a
4325
+ * container (`box.items`). The checker types an alias or container by the
4326
+ * elements written before it was taken, but it holds the same array. Null
4327
+ * for other expressions. */
4328
+ function evolvingArrayHold(lowerer, expr, depth = 0) {
4329
+ while (ts.isParenthesizedExpression(expr))
4330
+ expr = expr.expression;
4331
+ if (depth >= 8)
4332
+ return null;
4333
+ const binding = (symbol) => {
4334
+ const source = symbol?.valueDeclaration;
4335
+ // A name destructured from a container (`const { items } = box`) may
4336
+ // be the array or another container.
4337
+ if (source !== undefined && ts.isBindingElement(source) && ts.isIdentifier(source.name)) {
4338
+ const host = hostVariableDeclarationOf(source.name);
4339
+ return host !== null &&
4340
+ !host.type &&
4341
+ host.initializer !== undefined &&
4342
+ evolvingArrayHold(lowerer, host.initializer, depth + 1) === "container"
4343
+ ? "container"
4344
+ : null;
4345
+ }
4346
+ if (source === undefined || !ts.isVariableDeclaration(source) || source.type)
4347
+ return null;
4348
+ const evolved = evolvingArrayType(lowerer, source);
4349
+ if (evolved !== null)
4350
+ return evolved.kind === "dyn" ? "evolving" : null;
4351
+ if (source.initializer === undefined)
4352
+ return null;
4353
+ const held = evolvingArrayHold(lowerer, source.initializer, depth + 1);
4354
+ return held === "evolving" ? "alias" : held;
4355
+ };
4356
+ if (ts.isIdentifier(expr))
4357
+ return binding(lowerer.checker.getSymbolAtLocation(expr));
4358
+ if (ts.isPropertyAccessExpression(expr) || ts.isElementAccessExpression(expr))
4359
+ return evolvingArrayHold(lowerer, expr.expression, depth + 1) === "container"
4360
+ ? "container"
4361
+ : null;
4362
+ // A spread of the array itself (`{ ...xs }`, `[...xs]`) copies its
4363
+ // elements, as in Node; a spread of a container copies its references.
4364
+ if (ts.isObjectLiteralExpression(expr)) {
4365
+ for (const property of expr.properties.nodes) {
4366
+ const held = ts.isPropertyAssignment(property)
4367
+ ? evolvingArrayHold(lowerer, property.initializer, depth + 1)
4368
+ : ts.isShorthandPropertyAssignment(property)
4369
+ ? binding(lowerer.checker.getShorthandAssignmentValueSymbol(property))
4370
+ : ts.isSpreadAssignment(property) &&
4371
+ evolvingArrayHold(lowerer, property.expression, depth + 1) === "container"
4372
+ ? "container"
4373
+ : null;
4374
+ if (held !== null)
4375
+ return "container";
4376
+ }
4377
+ return null;
4378
+ }
4379
+ if (ts.isArrayLiteralExpression(expr)) {
4380
+ for (const element of expr.elements.nodes) {
4381
+ const held = ts.isSpreadElement(element)
4382
+ ? evolvingArrayHold(lowerer, element.expression, depth + 1) === "container"
4383
+ ? "container"
4384
+ : null
4385
+ : evolvingArrayHold(lowerer, element, depth + 1);
4386
+ if (held !== null)
4387
+ return "container";
4388
+ }
4389
+ }
4390
+ return null;
4391
+ }
4392
+ /** Whether a TypeScript expression is an alias or container of an evolving
4393
+ * array binding whose reads disagree (evolvingArrayHold). Its value is
4394
+ * checked-dynamic, and the checker's type for it lists only the elements
4395
+ * written before it was taken, so element reads through it stay
4396
+ * checked-dynamic instead of checking against that type. */
4397
+ export function readsHeldEvolvingArray(lowerer, expr) {
4398
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
4399
+ return false;
4400
+ const held = evolvingArrayHold(lowerer, expr);
4401
+ return held === "alias" || held === "container";
4402
+ }
4403
+ /** Whether a TypeScript object or array literal holds an evolving array
4404
+ * binding whose reads disagree (evolvingArrayHold), so it builds as a
4405
+ * checked-dynamic literal that keeps the array. */
4406
+ export function holdsEvolvingArray(lowerer, expr) {
4407
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
4408
+ return false;
4409
+ return evolvingArrayHold(lowerer, expr) === "container";
4410
+ }
4411
+ /** An unannotated binding initialized with an evolving array binding whose
4412
+ * reads disagree, or with an alias or container of one (evolvingArrayHold):
4413
+ * it takes the array's checked-dynamic type, so it sees the later writes.
4414
+ * Null for other bindings. */
4415
+ function evolvingArrayHolderType(lowerer, decl) {
4416
+ if (decl.initializer === undefined)
4417
+ return null;
4418
+ return evolvingArrayHold(lowerer, decl.initializer) === null ? null : DYN;
4029
4419
  }
4030
4420
  /** A single static type for an initializer-less JavaScript `let` whose
4031
4421
  * later plain writes all agree. An evolving JS local reads as `undefined`
@@ -4160,6 +4550,15 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4160
4550
  if (alias)
4161
4551
  return alias;
4162
4552
  }
4553
+ // A Date local whose identity no use observes stores its time value.
4554
+ if (isTimeValueDateDeclaration(lowerer, decl)) {
4555
+ const loc = locOf(decl);
4556
+ const date = lowerer.lowerExprExpecting(decl.initializer, DATE_T);
4557
+ const local = lowerer.declareLocal(decl.name, decl.name.text, F64, isLet);
4558
+ lowerer.timeValueDateLocals.add(local);
4559
+ const init = { kind: "libCall", fn: "date.getTime", args: [date], type: F64, loc };
4560
+ return { kind: "varDecl", localId: local.id, init, loc };
4561
+ }
4163
4562
  // A NULLISH generic binding (`const i: I<A & B> = null as any` — the
4164
4563
  // declared type has no mapping, the value is provably null/undefined
4165
4564
  // forever): no storage exists; reads know the value (member reads and
@@ -4488,20 +4887,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4488
4887
  : inferredObjectType
4489
4888
  ? [inferredObjectType]
4490
4889
  : [];
4491
- const expandsObject = (!decl.type &&
4492
- !hasJsTypeAnnotation(decl) &&
4493
- inferredObjectType !== null &&
4494
- jsOpenObjectType(decl, inferredObjectType, lowerer.shapes, lowerer.unions).kind === "dyn") ||
4495
- inferredObjectArms.some((arm) => arm.kind === "record" && jsObjectBindingExpands(lowerer, decl, arm)) ||
4496
- (isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
4497
- !decl.type &&
4498
- !hasJsTypeAnnotation(decl) &&
4499
- ts.isObjectLiteralExpression(decl.initializer) &&
4500
- decl.initializer.properties.nodes.some((property) => ts.isMethodDeclaration(property) ||
4501
- ts.isAccessor(property) ||
4502
- (ts.isPropertyAssignment(property) &&
4503
- (ts.isFunctionExpression(property.initializer) ||
4504
- ts.isArrowFunction(property.initializer)))));
4890
+ const expandsObject = jsDeclarationExpandsObject(lowerer, decl, inferredObjectType);
4505
4891
  let init;
4506
4892
  try {
4507
4893
  init =
@@ -4666,7 +5052,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4666
5052
  if (returnedEmptyArrayType === null &&
4667
5053
  !decl.type &&
4668
5054
  !isJsSourceFile(ts.getSourceFileOfNode(decl))) {
4669
- const evolved = evolvingArrayType(lowerer, decl);
5055
+ const evolved = evolvingArrayType(lowerer, decl) ?? evolvingArrayHolderType(lowerer, decl);
4670
5056
  if (evolved !== null) {
4671
5057
  type = evolved;
4672
5058
  init = lowerer.lowerExprExpecting(decl.initializer, evolved);
@@ -5143,17 +5529,12 @@ export function hasJsTypeAnnotation(decl) {
5143
5529
  return (!!statement &&
5144
5530
  /@type\b/.test(ts.getSourceFileOfNode(decl).text.slice(statement.pos, ts.tokenStartOfNode(decl))));
5145
5531
  }
5146
- /** Inferred JS scalar initializers do not constrain later writes through
5147
- * an any-valued callback. Keep those bindings open, including captured writes. */
5148
- export function jsBindingHasOpenWrites(lowerer, decl) {
5149
- if (!isJsSourceFile(ts.getSourceFileOfNode(decl)) ||
5150
- decl.type ||
5151
- hasJsTypeAnnotation(decl) ||
5152
- !ts.isIdentifier(decl.name))
5153
- return false;
5154
- const symbol = lowerer.resolveValueSymbol(decl.name);
5532
+ /** The assignments to a declaration's binding in its function (or file),
5533
+ * `=` and compound alike. Null when the name has no symbol. */
5534
+ function jsBindingWrites(lowerer, decl, name) {
5535
+ const symbol = lowerer.resolveValueSymbol(name);
5155
5536
  if (!symbol)
5156
- return false;
5537
+ return null;
5157
5538
  let owner = decl;
5158
5539
  while (owner.parent && !ts.isFunctionLike(owner) && !ts.isSourceFile(owner))
5159
5540
  owner = owner.parent;
@@ -5175,9 +5556,41 @@ export function jsBindingHasOpenWrites(lowerer, decl) {
5175
5556
  writes = indexed;
5176
5557
  lowerer.jsBindingWritesByOwner.set(owner, writes);
5177
5558
  }
5178
- const candidates = (writes.get(decl.name.text) ?? []).filter((node) => lowerer.resolveValueSymbol(node.left) === symbol);
5559
+ return (writes.get(name.text) ?? []).filter((node) => lowerer.resolveValueSymbol(node.left) === symbol);
5560
+ }
5561
+ /** Whether a JavaScript binding always holds a string: the checker types it
5562
+ * as one, and every write appends to it (`result += part`), which yields a
5563
+ * string whatever the part is. */
5564
+ export function jsBindingAppendsOnly(lowerer, decl) {
5565
+ if (!ts.isIdentifier(decl.name))
5566
+ return false;
5567
+ if (lowerer.mapTypeOf(lowerer.typeOf(decl.name))?.kind !== "string")
5568
+ return false;
5569
+ const writes = jsBindingWrites(lowerer, decl, decl.name);
5570
+ return (writes !== null &&
5571
+ writes.every((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken));
5572
+ }
5573
+ /** Inferred JS scalar initializers do not constrain later writes through
5574
+ * an any-valued callback. Keep those bindings open, including captured writes. */
5575
+ export function jsBindingHasOpenWrites(lowerer, decl) {
5576
+ if (!isJsSourceFile(ts.getSourceFileOfNode(decl)) ||
5577
+ decl.type ||
5578
+ hasJsTypeAnnotation(decl) ||
5579
+ !ts.isIdentifier(decl.name))
5580
+ return false;
5581
+ const candidates = jsBindingWrites(lowerer, decl, decl.name);
5582
+ if (candidates === null)
5583
+ return false;
5179
5584
  if (candidates.some((node) => (lowerer.typeOf(node.right).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0))
5180
5585
  return true;
5586
+ // A `+=` of a string turns a number or boolean binding into a string
5587
+ // (`n += "px"`); the checker keeps the declared type.
5588
+ if (candidates.some((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken &&
5589
+ (lowerer.typeOf(node.right).flags & ts.TypeFlags.StringLike) !== 0)) {
5590
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(decl.name));
5591
+ if (declared?.kind === "f64" || declared?.kind === "bool")
5592
+ return true;
5593
+ }
5181
5594
  // A write that can store null or undefined into a binding the checker
5182
5595
  // types as a primitive (`offset = match[3] || null`): JavaScript files
5183
5596
  // are checked without strict null checks, so the declared type does not
@@ -5444,7 +5857,7 @@ function lowerDynSwitch(lowerer, stmt, disc, labels) {
5444
5857
  loc: locOf(expression),
5445
5858
  };
5446
5859
  }
5447
- if (test.type.kind === "date" || !lowerer.dynConvertible(test.type)) {
5860
+ if (!lowerer.dynConvertible(test.type)) {
5448
5861
  lowerer.unsupported("SC1100", expression, "switch case values that cannot compare strictly with 'unknown'");
5449
5862
  }
5450
5863
  return {
@@ -5700,7 +6113,7 @@ function lowerDeleteStatement(lowerer, expr) {
5700
6113
  if (obj.type.kind === "record") {
5701
6114
  const shape = lowerer.shapes.get(obj.type.shapeId);
5702
6115
  if (shape?.indexValue && shape.fields.length === 0 && !shape.tuple) {
5703
- return { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc };
6116
+ return markSloppyRecordWrites(lowerer, { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc }, expr);
5704
6117
  }
5705
6118
  // `delete r.f` of a declared OPTIONAL field (undefined-armed slot)
5706
6119
  // writes the field's ABSENT state: a monomorphic shape cannot remove
@@ -5720,14 +6133,14 @@ function lowerDeleteStatement(lowerer, expr) {
5720
6133
  if (field) {
5721
6134
  const absent = lowerer.absentFieldValue(field.type, loc);
5722
6135
  if (absent) {
5723
- return {
6136
+ return markSloppyRecordWrites(lowerer, {
5724
6137
  kind: "recordSet",
5725
6138
  obj,
5726
6139
  shapeId: obj.type.shapeId,
5727
6140
  field: field.name,
5728
6141
  value: absent,
5729
6142
  loc,
5730
- };
6143
+ }, expr, true);
5731
6144
  }
5732
6145
  }
5733
6146
  if (shape?.indexValue) {
@@ -6022,6 +6435,22 @@ function lowerCjsSingleValueExport(lowerer, expr, loc) {
6022
6435
  return lowerer.requireInitStmt(req.spec, req.call) ?? { kind: "block", body: [], loc };
6023
6436
  }
6024
6437
  if (ts.isIdentifier(rhs)) {
6438
+ const split = splitRequireBindingOfIdent(lowerer, rhs);
6439
+ if (split !== null) {
6440
+ if (wholeExportSymbolOfModule(lowerer, split.dep) === null) {
6441
+ lowerer.unsupported("SC1090", rhs, `the exports object of '${split.spec}' as a value (its exports compile to a static table: read require(${JSON.stringify(split.spec)}).member directly)`);
6442
+ }
6443
+ const root = lowerer.globalsByDeclNode.get(expr);
6444
+ if (root !== undefined) {
6445
+ return {
6446
+ kind: "assign",
6447
+ localId: root.id,
6448
+ value: lowerer.lowerExprExpecting(rhs, root.type),
6449
+ loc: locOf(rhs),
6450
+ };
6451
+ }
6452
+ return { kind: "block", body: [], loc };
6453
+ }
6025
6454
  const sym = lowerer.resolveValueSymbol(rhs);
6026
6455
  if (!sym)
6027
6456
  return null;
@@ -6824,6 +7253,14 @@ export function lowerExprStatement(lowerer, expr) {
6824
7253
  if (!ts.isIdentifier(expr.left)) {
6825
7254
  lowerer.unsupported("SC1090", expr.left, "assignment to non-variables");
6826
7255
  }
7256
+ const splitAssign = splitRequireAssignmentOf(lowerer, expr);
7257
+ if (splitAssign !== null) {
7258
+ return (lowerer.requireInitStmt(splitAssign.spec, splitAssign.call) ?? {
7259
+ kind: "block",
7260
+ body: [],
7261
+ loc: locOf(expr),
7262
+ });
7263
+ }
6827
7264
  const target = lowerer.resolveWritable(expr.left);
6828
7265
  if (!target)
6829
7266
  lowerer.rejectUnresolved(expr.left, `assignment to '${expr.left.text}' (not a writable local or module global)`);
@@ -7109,7 +7546,9 @@ function destrSpellingOf(rhs) {
7109
7546
  return base === null ? null : `${base}.${e.name.text}`;
7110
7547
  }
7111
7548
  // `table[key]` and `list[0]`; V8 prints a numeric key in its canonical
7112
- // number form (`o[1.50]` reads "o[1.5]").
7549
+ // number form (`o[1.50]` reads "o[1.5]"), and a string key as a property
7550
+ // name with its text decoded (`o["a.b"]` and `o[\`a.b\`]` read "o.a.b").
7551
+ // The message is a C string, so a key holding NUL keeps the refusal.
7113
7552
  if (ts.isElementAccessExpression(e) && !e.questionDotToken) {
7114
7553
  const base = destrSpellingOf(e.expression);
7115
7554
  const key = e.argumentExpression;
@@ -7119,6 +7558,9 @@ function destrSpellingOf(rhs) {
7119
7558
  return `${base}[${key.text}]`;
7120
7559
  if (ts.isNumericLiteral(key))
7121
7560
  return `${base}[${String(Number(key.text))}]`;
7561
+ if ((ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)) &&
7562
+ !key.text.includes("\0"))
7563
+ return `${base}.${key.text}`;
7122
7564
  return null;
7123
7565
  }
7124
7566
  if (ts.isCallExpression(e) && !e.questionDotToken) {
@@ -7671,7 +8113,7 @@ function lowerAssignTargetInto(lowerer, out, targetNode, blame, dflt, valueOf) {
7671
8113
  if (arr.type.kind === "array") {
7672
8114
  const recv = lowerer.declareHiddenLocal("%dtRecv", arr.type);
7673
8115
  out.push({ kind: "varDecl", localId: recv.id, init: arr, loc });
7674
- const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(t.argumentExpression), locOf(t.argumentExpression), t.argumentExpression);
8116
+ const index = lowerOptionalIndex(lowerer, lowerer.lowerExpr(t.argumentExpression), locOf(t.argumentExpression), t.argumentExpression);
7675
8117
  if (index.type.kind !== "f64") {
7676
8118
  lowerer.unsupported("SC1090", t.argumentExpression, "indexing with non-number keys");
7677
8119
  }
@@ -8060,6 +8502,16 @@ export function lowerForOf(lowerer, stmt) {
8060
8502
  lowerer.stdlibGlobalMember(stmt.expression, "process") === "stdin") {
8061
8503
  return lowerForAwaitStdin(lowerer, stmt);
8062
8504
  }
8505
+ // NodeJS.WritableStream is what @types/node answers for pipeline()
8506
+ // with a function destination, whose value is a PassThrough.
8507
+ if (nodeStreamInterfaceSide(lowerer, lowerer.typeOf(stmt.expression)) === "w") {
8508
+ const mapped = lowerer.mapTypeOf(lowerer.typeOf(stmt.expression));
8509
+ const sides = mapped?.kind === "object"
8510
+ ? streamSidesOf(lowerer, lowerer.classes.get(mapped.className))
8511
+ : null;
8512
+ if (sides !== "r" && sides !== "rw")
8513
+ lowerer.noLowering("for await over a NodeJS.WritableStream", stmt.expression, "type the stream as the readable class it is: pipeline() answers a PassThrough for a function destination (pipeline(...) as PassThrough, or a JSDoc @type)");
8514
+ }
8063
8515
  // A checked-dynamic NodeJS.ReadableStream iterates its native stream,
8064
8516
  // and a Hash, Hmac, Cipheriv or Decipheriv iterates its Transform.
8065
8517
  const dynStream = lowerForAwaitDynStream(lowerer, stmt, () => lowerForAwaitBuiltin(lowerer, stmt)) ??
@@ -8232,6 +8684,11 @@ export function lowerForOf(lowerer, stmt) {
8232
8684
  }
8233
8685
  iterSrc ??= stmt.expression;
8234
8686
  let iterable = lowerer.lowerExpr(iterSrc);
8687
+ {
8688
+ const iterableUnion = iterableUnionOf(lowerer, iterable.type);
8689
+ if (iterableUnion)
8690
+ return lowerForOfIterable(lowerer, stmt, iterable, iterableUnion, labels);
8691
+ }
8235
8692
  let tupleSource = null;
8236
8693
  // A nested loop receiver can be an OOB-safe array read from the outer
8237
8694
  // loop (`for (const row of grid) for (const cell of row)`). The checker
@@ -8263,7 +8720,7 @@ export function lowerForOf(lowerer, stmt) {
8263
8720
  loc: locOf(iterSrc),
8264
8721
  };
8265
8722
  }
8266
- if (iterable.type.kind === "bytes") {
8723
+ if (iterable.type.kind === "bytes" || indexedUnionArms(lowerer, iterable.type)) {
8267
8724
  return lowerForOfBytes(lowerer, stmt, iterable, labels);
8268
8725
  }
8269
8726
  if (iterable.type.kind !== "array") {
@@ -8838,40 +9295,53 @@ function lowerForOfStoredNumericIterator(lowerer, stmt, state, labels) {
8838
9295
  lowerer.unsupported("SC1031", decl.name);
8839
9296
  const loc = locOf(stmt);
8840
9297
  const sourceT = state.sourceType;
8841
- if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") || sourceT.kind === "bytes")) {
9298
+ // A union of typed arrays and number arrays (indexed-unions.ts) reads
9299
+ // through its arms' own length and element reads.
9300
+ const unionArms = indexedUnionArms(lowerer, sourceT);
9301
+ if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") ||
9302
+ sourceT.kind === "bytes" ||
9303
+ unionArms)) {
8842
9304
  throw new InternalCompilerError("internal: retained numeric iterator has a non-numeric source");
8843
9305
  }
8844
9306
  const indexRef = () => varRef(state.indexLocalId, F64, loc);
8845
9307
  const doneRef = () => varRef(state.doneLocalId, BOOL, loc);
8846
9308
  const sourceRef = () => varRef(state.sourceLocalId, sourceT, loc);
8847
- const sourceLength = () => sourceT.kind === "array"
8848
- ? {
8849
- kind: "arrIntrinsic",
8850
- method: "length",
8851
- receiver: sourceRef(),
8852
- args: [],
8853
- type: F64,
8854
- loc,
8855
- }
8856
- : {
8857
- kind: "bytesIntrinsic",
8858
- method: "length",
8859
- receiver: sourceRef(),
8860
- args: [],
8861
- type: F64,
8862
- loc,
8863
- };
8864
- const valueT = sourceT.kind === "array" ? arrayValueType(lowerer, F64) : F64;
8865
- const sourceValue = () => sourceT.kind === "array"
8866
- ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
8867
- : {
8868
- kind: "bytesIntrinsic",
8869
- method: "get",
8870
- receiver: sourceRef(),
8871
- args: [indexRef()],
8872
- type: F64,
8873
- loc,
8874
- };
9309
+ const sourceLength = () => unionArms
9310
+ ? lowerIndexedUnionMember(lowerer, sourceRef(), unionArms, "length", loc)
9311
+ : sourceT.kind === "array"
9312
+ ? {
9313
+ kind: "arrIntrinsic",
9314
+ method: "length",
9315
+ receiver: sourceRef(),
9316
+ args: [],
9317
+ type: F64,
9318
+ loc,
9319
+ }
9320
+ : {
9321
+ kind: "bytesIntrinsic",
9322
+ method: "length",
9323
+ receiver: sourceRef(),
9324
+ args: [],
9325
+ type: F64,
9326
+ loc,
9327
+ };
9328
+ const valueT = sourceT.kind === "array" || (unionArms && !allBytesArms(unionArms))
9329
+ ? arrayValueType(lowerer, F64)
9330
+ : F64;
9331
+ const sourceValue = () => unionArms
9332
+ ? allBytesArms(unionArms)
9333
+ ? lowerIndexedUnionNumberRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9334
+ : lowerIndexedUnionRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9335
+ : sourceT.kind === "array"
9336
+ ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
9337
+ : {
9338
+ kind: "bytesIntrinsic",
9339
+ method: "get",
9340
+ receiver: sourceRef(),
9341
+ args: [indexRef()],
9342
+ type: F64,
9343
+ loc,
9344
+ };
8875
9345
  const one = { kind: "numLit", value: 1, type: F64, loc };
8876
9346
  lowerer.scopes.push(new Map());
8877
9347
  try {
@@ -9890,11 +10360,13 @@ function lowerForIn(lowerer, stmt) {
9890
10360
  loc,
9891
10361
  });
9892
10362
  const keys = objectIterOverIndexShape(lowerer, stmt.expression, "keys", receiver.type, rShape, recvRef(), keysT, loc);
10363
+ // The overflow map's hashed key set answers presence directly; a
10364
+ // fresh key list per visit would make the walk quadratic.
9893
10365
  const guard = (kRef) => ({
9894
- kind: "arrIntrinsic",
9895
- method: "includes",
9896
- receiver: { kind: "recordOvfKeys", obj: recvRef(), shapeId, type: keysT, loc },
9897
- args: [kRef],
10366
+ kind: "recordOvfHas",
10367
+ obj: recvRef(),
10368
+ shapeId,
10369
+ key: kRef,
9898
10370
  type: BOOL,
9899
10371
  loc,
9900
10372
  });