@scriptc/compiler 0.4.2 → 0.4.3

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 (636) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +397 -37
  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 +473 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +258 -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/dense-array-access.d.ts +39 -8
  58. package/dist/backend/llvm/dense-array-access.js +222 -52
  59. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  61. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  63. package/dist/backend/llvm/dense-array-loops.js +194 -5
  64. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  66. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  67. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  68. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn.d.ts +26 -0
  70. package/dist/backend/llvm/dyn.js +352 -61
  71. package/dist/backend/llvm/dyn.js.map +1 -1
  72. package/dist/backend/llvm/emit-function.js +11 -20
  73. package/dist/backend/llvm/emit-function.js.map +1 -1
  74. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  75. package/dist/backend/llvm/emit-journal.js +170 -0
  76. package/dist/backend/llvm/emit-journal.js.map +1 -0
  77. package/dist/backend/llvm/emit-module.js +195 -27
  78. package/dist/backend/llvm/emit-module.js.map +1 -1
  79. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  80. package/dist/backend/llvm/emit-statements.js +268 -84
  81. package/dist/backend/llvm/emit-statements.js.map +1 -1
  82. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  83. package/dist/backend/llvm/emitter-state.js +14 -0
  84. package/dist/backend/llvm/emitter-state.js.map +1 -0
  85. package/dist/backend/llvm/emitter.d.ts +176 -37
  86. package/dist/backend/llvm/emitter.js +724 -85
  87. package/dist/backend/llvm/emitter.js.map +1 -1
  88. package/dist/backend/llvm/emitter.test.js +54 -5
  89. package/dist/backend/llvm/emitter.test.js.map +1 -1
  90. package/dist/backend/llvm/expr-bytes.js +34 -12
  91. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  92. package/dist/backend/llvm/expr-callbacks.js +47 -0
  93. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  94. package/dist/backend/llvm/expr-calls.js +28 -14
  95. package/dist/backend/llvm/expr-calls.js.map +1 -1
  96. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  97. package/dist/backend/llvm/expr-containers.js +129 -37
  98. package/dist/backend/llvm/expr-containers.js.map +1 -1
  99. package/dist/backend/llvm/expr-context.d.ts +14 -0
  100. package/dist/backend/llvm/expr-dynamic.js +18 -11
  101. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +100 -28
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  105. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  106. package/dist/backend/llvm/expr-records.d.ts +12 -0
  107. package/dist/backend/llvm/expr-records.js +106 -0
  108. package/dist/backend/llvm/expr-records.js.map +1 -1
  109. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  110. package/dist/backend/llvm/expr-stream-bridges.js +194 -65
  111. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  115. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  118. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  119. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  120. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  121. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  122. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  123. package/dist/backend/llvm/integer-values.d.ts +20 -1
  124. package/dist/backend/llvm/integer-values.js +71 -0
  125. package/dist/backend/llvm/integer-values.js.map +1 -1
  126. package/dist/backend/llvm/js-ic.d.ts +1 -1
  127. package/dist/backend/llvm/js-ic.js +1 -1
  128. package/dist/backend/llvm/js-ic.js.map +1 -1
  129. package/dist/backend/llvm/key-orders.d.ts +7 -0
  130. package/dist/backend/llvm/key-orders.js +33 -0
  131. package/dist/backend/llvm/key-orders.js.map +1 -0
  132. package/dist/backend/llvm/lib-connect.js +4 -0
  133. package/dist/backend/llvm/lib-connect.js.map +1 -1
  134. package/dist/backend/llvm/lib-datagram.js +11 -0
  135. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  136. package/dist/backend/llvm/lib-dispatch.js +80 -2
  137. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  138. package/dist/backend/llvm/lib-filesystem.js +4 -4
  139. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  140. package/dist/backend/llvm/lib-http2.js +4 -0
  141. package/dist/backend/llvm/lib-http2.js.map +1 -1
  142. package/dist/backend/llvm/lib-lookup.js +16 -6
  143. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  144. package/dist/backend/llvm/lib-shared.js +73 -2
  145. package/dist/backend/llvm/lib-shared.js.map +1 -1
  146. package/dist/backend/llvm/lib-stream.js +35 -5
  147. package/dist/backend/llvm/lib-stream.js.map +1 -1
  148. package/dist/backend/llvm/local-array-reads.js +115 -19
  149. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  150. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  151. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  152. package/dist/backend/llvm/loop-state.d.ts +33 -0
  153. package/dist/backend/llvm/loop-state.js +42 -0
  154. package/dist/backend/llvm/loop-state.js.map +1 -0
  155. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  156. package/dist/backend/llvm/map-number-lookup.js +91 -31
  157. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  158. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  159. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  160. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  161. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  162. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  163. package/dist/backend/llvm/nullable-unions.js +15 -3
  164. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  165. package/dist/backend/llvm/publish.d.ts +10 -0
  166. package/dist/backend/llvm/publish.js +12 -0
  167. package/dist/backend/llvm/publish.js.map +1 -1
  168. package/dist/backend/llvm/receivers.js +6 -1
  169. package/dist/backend/llvm/receivers.js.map +1 -1
  170. package/dist/backend/llvm/record-results.d.ts +1 -9
  171. package/dist/backend/llvm/record-results.js +2 -11
  172. package/dist/backend/llvm/record-results.js.map +1 -1
  173. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  174. package/dist/backend/llvm/reference-writes.js +89 -72
  175. package/dist/backend/llvm/reference-writes.js.map +1 -1
  176. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  177. package/dist/backend/llvm/running-extrema.js +115 -0
  178. package/dist/backend/llvm/running-extrema.js.map +1 -0
  179. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  180. package/dist/backend/llvm/running-extrema.test.js +89 -0
  181. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  182. package/dist/backend/llvm/shapes.d.ts +71 -15
  183. package/dist/backend/llvm/shapes.js +222 -33
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +53 -7
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  188. package/dist/backend/llvm/speculative-integers.js +2 -2
  189. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  190. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  191. package/dist/backend/llvm/stack-objects.js +5 -2
  192. package/dist/backend/llvm/stack-objects.js.map +1 -1
  193. package/dist/backend/llvm/string-reads.d.ts +12 -0
  194. package/dist/backend/llvm/string-reads.js +44 -0
  195. package/dist/backend/llvm/string-reads.js.map +1 -1
  196. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  197. package/dist/backend/llvm/walk-borrows.js +46 -41
  198. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  199. package/dist/backend/llvm/walkers.d.ts +3 -0
  200. package/dist/backend/llvm/walkers.js +88 -65
  201. package/dist/backend/llvm/walkers.js.map +1 -1
  202. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  203. package/dist/backend/llvm/wrapping-sums.js +126 -0
  204. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  205. package/dist/backend/may-throw.d.ts +8 -10
  206. package/dist/backend/may-throw.js +14 -10
  207. package/dist/backend/may-throw.js.map +1 -1
  208. package/dist/backend/native/contracts.d.ts +5 -0
  209. package/dist/backend/native/executable.js +7 -0
  210. package/dist/backend/native/executable.js.map +1 -1
  211. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  212. package/dist/backend/native/runtime-inputs.js +1 -0
  213. package/dist/backend/native/runtime-inputs.js.map +1 -1
  214. package/dist/backend/native-link-info-core.d.ts +4 -0
  215. package/dist/backend/native-link-info-core.js.map +1 -1
  216. package/dist/backend/publication.d.ts +12 -1
  217. package/dist/backend/publication.js +37 -14
  218. package/dist/backend/publication.js.map +1 -1
  219. package/dist/backend/publication.test.js +30 -0
  220. package/dist/backend/publication.test.js.map +1 -1
  221. package/dist/backend/result-slots.d.ts +16 -0
  222. package/dist/backend/result-slots.js +23 -0
  223. package/dist/backend/result-slots.js.map +1 -0
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +1 -0
  227. package/dist/backend/runtime-pack-core.js +1 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +2 -1
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.test.js +2 -1
  232. package/dist/backend/runtime-pack.test.js.map +1 -1
  233. package/dist/backend/stack-observations.d.ts +2 -1
  234. package/dist/backend/stack-observations.js +67 -42
  235. package/dist/backend/stack-observations.js.map +1 -1
  236. package/dist/backend/target-diagnostics.js +5 -3
  237. package/dist/backend/target-diagnostics.js.map +1 -1
  238. package/dist/backend/warm-cache.js +1 -0
  239. package/dist/backend/warm-cache.js.map +1 -1
  240. package/dist/cli/usage.d.ts +1 -1
  241. package/dist/cli/usage.js +3 -3
  242. package/dist/compat/fetch-profile.js +1 -1
  243. package/dist/compat/fetch-profile.js.map +1 -1
  244. package/dist/contracts/check.js +4 -3
  245. package/dist/contracts/check.js.map +1 -1
  246. package/dist/contracts/int32-elements.js +10 -2
  247. package/dist/contracts/int32-elements.js.map +1 -1
  248. package/dist/coverage/report.js +12 -3
  249. package/dist/coverage/report.js.map +1 -1
  250. package/dist/diagnostics/diagnostic.d.ts +4 -0
  251. package/dist/diagnostics/diagnostic.js.map +1 -1
  252. package/dist/diagnostics/envelope.d.ts +3 -0
  253. package/dist/diagnostics/envelope.js +1 -0
  254. package/dist/diagnostics/envelope.js.map +1 -1
  255. package/dist/executable/executable-cache.d.ts +2 -0
  256. package/dist/executable/executable-cache.js +1 -0
  257. package/dist/executable/executable-cache.js.map +1 -1
  258. package/dist/executable/executable-cache.test.js +1 -0
  259. package/dist/executable/executable-cache.test.js.map +1 -1
  260. package/dist/frontend/decl-projection.d.ts +41 -0
  261. package/dist/frontend/decl-projection.js +854 -0
  262. package/dist/frontend/decl-projection.js.map +1 -0
  263. package/dist/frontend/decl-projection.test.d.ts +1 -0
  264. package/dist/frontend/decl-projection.test.js +30 -0
  265. package/dist/frontend/decl-projection.test.js.map +1 -0
  266. package/dist/frontend/dts-paths.d.ts +15 -0
  267. package/dist/frontend/dts-paths.js +25 -0
  268. package/dist/frontend/dts-paths.js.map +1 -1
  269. package/dist/frontend/input-tracker.d.ts +6 -0
  270. package/dist/frontend/input-tracker.js +51 -28
  271. package/dist/frontend/input-tracker.js.map +1 -1
  272. package/dist/frontend/input-tracker.test.js +19 -0
  273. package/dist/frontend/input-tracker.test.js.map +1 -1
  274. package/dist/frontend/lowering/array-values.js +100 -2
  275. package/dist/frontend/lowering/array-values.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  277. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  279. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/crypto.js +84 -9
  281. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  283. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  284. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  285. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  286. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
  288. package/dist/frontend/lowering/builtins/promises.js +88 -2
  289. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  290. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  291. package/dist/frontend/lowering/builtins/readline.js +35 -3
  292. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/url.js +24 -1
  294. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  295. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  296. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  297. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  298. package/dist/frontend/lowering/class-callbacks.js +82 -12
  299. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  300. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  301. package/dist/frontend/lowering/class-construction.js +17 -3
  302. package/dist/frontend/lowering/class-construction.js.map +1 -1
  303. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
  304. package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
  305. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  306. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  307. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  308. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  309. package/dist/frontend/lowering/class-iterables.js +9 -1
  310. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  311. package/dist/frontend/lowering/class-method-mutations.js +32 -9
  312. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  313. package/dist/frontend/lowering/class-prototypes.js +31 -2
  314. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  315. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  316. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  317. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  318. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  319. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  320. package/dist/frontend/lowering/coercions/structural.js +91 -1
  321. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  322. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  323. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  324. package/dist/frontend/lowering/containers/array-callbacks.js +338 -18
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  327. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  328. package/dist/frontend/lowering/containers/array-methods.js +15 -0
  329. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  331. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +2 -1
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  337. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  338. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  339. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  340. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  341. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  342. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  343. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  344. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  345. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  346. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  347. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  348. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  349. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  350. package/dist/frontend/lowering/divergences.js +9 -1
  351. package/dist/frontend/lowering/divergences.js.map +1 -1
  352. package/dist/frontend/lowering/error-methods.js +47 -2
  353. package/dist/frontend/lowering/error-methods.js.map +1 -1
  354. package/dist/frontend/lowering/expressions/array-literals.js +47 -0
  355. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  356. package/dist/frontend/lowering/expressions/binary.js +36 -2
  357. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  358. package/dist/frontend/lowering/expressions/element-access.js +90 -13
  359. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  360. package/dist/frontend/lowering/expressions/identifiers.js +33 -4
  361. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  362. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  363. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  364. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  365. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  366. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  367. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  368. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  369. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  370. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  371. package/dist/frontend/lowering/expressions/property-access.js +113 -11
  372. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  373. package/dist/frontend/lowering/expressions/relational.js +212 -33
  374. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  375. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  376. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  377. package/dist/frontend/lowering/expressions/updates.js +22 -3
  378. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  379. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  380. package/dist/frontend/lowering/frozen-records.js +322 -0
  381. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  382. package/dist/frontend/lowering/function-returns.js +49 -0
  383. package/dist/frontend/lowering/function-returns.js.map +1 -1
  384. package/dist/frontend/lowering/generic-functions.js +7 -2
  385. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  386. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  387. package/dist/frontend/lowering/iterable-values.js +297 -0
  388. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  389. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  390. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  391. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  392. package/dist/frontend/lowering/js-class-fields.js +45 -10
  393. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  394. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  395. package/dist/frontend/lowering/key-order-witness.js +770 -22
  396. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  397. package/dist/frontend/lowering/key-order-witness.test.js +428 -8
  398. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  399. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  400. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  401. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  402. package/dist/frontend/lowering/lower-calls.js +443 -41
  403. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  404. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  405. package/dist/frontend/lowering/lower-classes.js +302 -22
  406. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  407. package/dist/frontend/lowering/lower-dgram.js +3 -1
  408. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  409. package/dist/frontend/lowering/lower-exprs.js +10 -2
  410. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  411. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  412. package/dist/frontend/lowering/lower-functions.js +83 -0
  413. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  414. package/dist/frontend/lowering/lower-generators.js +41 -31
  415. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  416. package/dist/frontend/lowering/lower-global-value.js +6 -3
  417. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  418. package/dist/frontend/lowering/lower-inspect.js +18 -6
  419. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  420. package/dist/frontend/lowering/lower-modules.js +32 -0
  421. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  422. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  423. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  424. package/dist/frontend/lowering/lower-server.js +2 -2
  425. package/dist/frontend/lowering/lower-server.js.map +1 -1
  426. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  427. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  428. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  429. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  430. package/dist/frontend/lowering/lower-stmts.js +454 -48
  431. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  432. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  433. package/dist/frontend/lowering/lower-stream.js +1483 -156
  434. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  435. package/dist/frontend/lowering/lowerer.d.ts +77 -6
  436. package/dist/frontend/lowering/lowerer.js +313 -29
  437. package/dist/frontend/lowering/lowerer.js.map +1 -1
  438. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  439. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  440. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  441. package/dist/frontend/lowering/new-target.d.ts +12 -0
  442. package/dist/frontend/lowering/new-target.js +280 -0
  443. package/dist/frontend/lowering/new-target.js.map +1 -0
  444. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  445. package/dist/frontend/lowering/surfaces.js +18 -6
  446. package/dist/frontend/lowering/surfaces.js.map +1 -1
  447. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  448. package/dist/frontend/lowering/undefined-index.js +82 -0
  449. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  450. package/dist/frontend/lowering/var-hoisting.js +29 -13
  451. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  452. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  453. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  454. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  455. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  456. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  457. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  458. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  459. package/dist/frontend/npm-static.js +4 -20
  460. package/dist/frontend/npm-static.js.map +1 -1
  461. package/dist/frontend/package-shims.d.ts +3 -0
  462. package/dist/frontend/package-shims.js +71 -8
  463. package/dist/frontend/package-shims.js.map +1 -1
  464. package/dist/frontend/pipeline.js +18 -10
  465. package/dist/frontend/pipeline.js.map +1 -1
  466. package/dist/frontend/process-fork.d.ts +25 -0
  467. package/dist/frontend/process-fork.js +2 -0
  468. package/dist/frontend/process-fork.js.map +1 -0
  469. package/dist/frontend/program.d.ts +8 -1
  470. package/dist/frontend/program.js +484 -69
  471. package/dist/frontend/program.js.map +1 -1
  472. package/dist/frontend/program.test.js +43 -3
  473. package/dist/frontend/program.test.js.map +1 -1
  474. package/dist/frontend/token-equivalence.d.ts +3 -0
  475. package/dist/frontend/token-equivalence.js +409 -0
  476. package/dist/frontend/token-equivalence.js.map +1 -0
  477. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  478. package/dist/frontend/token-equivalence.test.js +67 -0
  479. package/dist/frontend/token-equivalence.test.js.map +1 -0
  480. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  481. package/dist/frontend/ts7/ast-node.js +1048 -103
  482. package/dist/frontend/ts7/ast-node.js.map +1 -1
  483. package/dist/frontend/ts7/ast-node.test.js +24 -0
  484. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  485. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  486. package/dist/frontend/ts7/ast-wire.js +34 -24
  487. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  488. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  489. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  490. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  491. package/dist/frontend/ts7/checker-backend.js +2 -2
  492. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  493. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  494. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  495. package/dist/frontend/ts7/checker.d.ts +4 -0
  496. package/dist/frontend/ts7/checker.js +7 -0
  497. package/dist/frontend/ts7/checker.js.map +1 -1
  498. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  499. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  500. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  501. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  502. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  503. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  504. package/dist/frontend/ts7/program-host.d.ts +7 -0
  505. package/dist/frontend/ts7/program-host.js +25 -2
  506. package/dist/frontend/ts7/program-host.js.map +1 -1
  507. package/dist/frontend/ts7/session.d.ts +14 -1
  508. package/dist/frontend/ts7/session.js +22 -0
  509. package/dist/frontend/ts7/session.js.map +1 -1
  510. package/dist/frontend/type-mapper.d.ts +13 -1
  511. package/dist/frontend/type-mapper.js +191 -11
  512. package/dist/frontend/type-mapper.js.map +1 -1
  513. package/dist/index.d.ts +0 -5
  514. package/dist/index.js +34 -4
  515. package/dist/index.js.map +1 -1
  516. package/dist/ir/analysis.js +5 -3
  517. package/dist/ir/analysis.js.map +1 -1
  518. package/dist/ir/array-length-stability.d.ts +4 -0
  519. package/dist/ir/array-length-stability.js +19 -6
  520. package/dist/ir/array-length-stability.js.map +1 -1
  521. package/dist/ir/array-length-stability.test.js +24 -0
  522. package/dist/ir/array-length-stability.test.js.map +1 -1
  523. package/dist/ir/builtin-effects.d.ts +7 -0
  524. package/dist/ir/builtin-effects.js +52 -0
  525. package/dist/ir/builtin-effects.js.map +1 -1
  526. package/dist/ir/builtin-signatures.d.ts +6 -4
  527. package/dist/ir/builtin-signatures.js +166 -13
  528. package/dist/ir/builtin-signatures.js.map +1 -1
  529. package/dist/ir/callback-specialization.d.ts +2 -1
  530. package/dist/ir/callback-specialization.js +23 -18
  531. package/dist/ir/callback-specialization.js.map +1 -1
  532. package/dist/ir/char-unit-locals.d.ts +19 -0
  533. package/dist/ir/char-unit-locals.js +185 -0
  534. package/dist/ir/char-unit-locals.js.map +1 -0
  535. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  536. package/dist/ir/char-unit-locals.test.js +94 -0
  537. package/dist/ir/char-unit-locals.test.js.map +1 -0
  538. package/dist/ir/final-fields.d.ts +2 -1
  539. package/dist/ir/final-fields.js +14 -16
  540. package/dist/ir/final-fields.js.map +1 -1
  541. package/dist/ir/function-references.d.ts +2 -0
  542. package/dist/ir/function-references.js +2 -0
  543. package/dist/ir/function-references.js.map +1 -1
  544. package/dist/ir/function-references.test.js +3 -0
  545. package/dist/ir/function-references.test.js.map +1 -1
  546. package/dist/ir/initializer-bindings.d.ts +2 -1
  547. package/dist/ir/initializer-bindings.js +27 -20
  548. package/dist/ir/initializer-bindings.js.map +1 -1
  549. package/dist/ir/int32-arrays.d.ts +108 -0
  550. package/dist/ir/int32-arrays.js +831 -0
  551. package/dist/ir/int32-arrays.js.map +1 -0
  552. package/dist/ir/int32-slots.d.ts +24 -2
  553. package/dist/ir/int32-slots.js +259 -57
  554. package/dist/ir/int32-slots.js.map +1 -1
  555. package/dist/ir/integer-loops.d.ts +3 -3
  556. package/dist/ir/integer-loops.js +14 -6
  557. package/dist/ir/integer-loops.js.map +1 -1
  558. package/dist/ir/integer-loops.test.js +10 -0
  559. package/dist/ir/integer-loops.test.js.map +1 -1
  560. package/dist/ir/integer-ranges.d.ts +5 -0
  561. package/dist/ir/integer-ranges.js +125 -12
  562. package/dist/ir/integer-ranges.js.map +1 -1
  563. package/dist/ir/integer-ranges.test.js +30 -0
  564. package/dist/ir/integer-ranges.test.js.map +1 -1
  565. package/dist/ir/ir.d.ts +70 -7
  566. package/dist/ir/ir.js +58 -1
  567. package/dist/ir/ir.js.map +1 -1
  568. package/dist/ir/ir.test.js +21 -1
  569. package/dist/ir/ir.test.js.map +1 -1
  570. package/dist/ir/js-ic.d.ts +19 -2
  571. package/dist/ir/js-ic.js +95 -11
  572. package/dist/ir/js-ic.js.map +1 -1
  573. package/dist/ir/js-ic.test.js +188 -0
  574. package/dist/ir/js-ic.test.js.map +1 -1
  575. package/dist/ir/node-index.d.ts +57 -0
  576. package/dist/ir/node-index.js +215 -0
  577. package/dist/ir/node-index.js.map +1 -0
  578. package/dist/ir/paired-while-loops.d.ts +25 -0
  579. package/dist/ir/paired-while-loops.js +335 -0
  580. package/dist/ir/paired-while-loops.js.map +1 -0
  581. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  582. package/dist/ir/paired-while-loops.test.js +163 -0
  583. package/dist/ir/paired-while-loops.test.js.map +1 -0
  584. package/dist/ir/parameter-versions.d.ts +25 -0
  585. package/dist/ir/parameter-versions.js +300 -0
  586. package/dist/ir/parameter-versions.js.map +1 -0
  587. package/dist/ir/runtime-features.d.ts +34 -13
  588. package/dist/ir/runtime-features.js +152 -38
  589. package/dist/ir/runtime-features.js.map +1 -1
  590. package/dist/ir/serialize.d.ts +12 -2
  591. package/dist/ir/serialize.js +16 -3
  592. package/dist/ir/serialize.js.map +1 -1
  593. package/dist/ir/serialize.test.js +17 -0
  594. package/dist/ir/serialize.test.js.map +1 -1
  595. package/dist/ir/traverse.js +18 -6
  596. package/dist/ir/traverse.js.map +1 -1
  597. package/dist/ir/validate.js +122 -36
  598. package/dist/ir/validate.js.map +1 -1
  599. package/dist/library/ir-policy.js +2 -0
  600. package/dist/library/ir-policy.js.map +1 -1
  601. package/dist/native/cache.d.ts +6 -1
  602. package/dist/native/cache.js +28 -5
  603. package/dist/native/cache.js.map +1 -1
  604. package/dist/native/cache.test.js +16 -2
  605. package/dist/native/cache.test.js.map +1 -1
  606. package/dist/native/cli.js +21 -1
  607. package/dist/native/cli.js.map +1 -1
  608. package/dist/native/compiler.js +8 -6
  609. package/dist/native/compiler.js.map +1 -1
  610. package/dist/native/executable-cache.d.ts +1 -1
  611. package/dist/native/executable-cache.js +2 -2
  612. package/dist/native/executable-cache.js.map +1 -1
  613. package/dist/native/prepare.d.ts +3 -1
  614. package/dist/native/prepare.js +119 -31
  615. package/dist/native/prepare.js.map +1 -1
  616. package/dist/native/prepare.test.js +78 -18
  617. package/dist/native/prepare.test.js.map +1 -1
  618. package/dist/native/sanitizer.test.js +2 -0
  619. package/dist/native/sanitizer.test.js.map +1 -1
  620. package/dist/native/text-file.d.ts +13 -3
  621. package/dist/native/text-file.js +63 -9
  622. package/dist/native/text-file.js.map +1 -1
  623. package/dist/native/text-file.test.d.ts +1 -0
  624. package/dist/native/text-file.test.js +49 -0
  625. package/dist/native/text-file.test.js.map +1 -0
  626. package/dist/native/toolchain.js +4 -4
  627. package/dist/native/toolchain.js.map +1 -1
  628. package/dist/native/toolchain.test.js +3 -3
  629. package/dist/native/toolchain.test.js.map +1 -1
  630. package/package.json +21 -21
  631. package/shims/chalk/v5.ts +688 -0
  632. package/shims/hono-node-server/v2.ts +645 -0
  633. package/shims/hot-shots/client.ts +1126 -0
  634. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  635. package/shims/hot-shots/v8.ts +8 -0
  636. package/surface-manifest.json +26 -4
@@ -2,7 +2,7 @@ import { lowerTupleAliasDecl, stripTypeWrappers } from "./typed-arguments.js";
2
2
  import { declaredMemberOf, isPromisePrototypeRead } from "./expressions/property-access.js";
3
3
  import { hostsAll } from "./expressions/hosted-narrowing.js";
4
4
  import { requestGeneralStreamSurface } from "./general-streams.js";
5
- import { lowerForAwaitDynStream } from "./dyn-streams.js";
5
+ import { lowerForAwaitDynStream, nodeStreamInterfaceSide } from "./dyn-streams.js";
6
6
  import { lowerForAwaitValueStream } from "./builtins/hash-stream.js";
7
7
  import { lowerChildPropertyWrite } from "./handle-properties.js";
8
8
  import { matchAllRowsReadByElements, storedMatchAllRowsReadByElements, } from "./containers/match-row-uses.js";
@@ -22,6 +22,7 @@ import { InternalCompilerError } from "../../errors.js";
22
22
  * flow (if/while/for/for-of/do, switch, try/catch, abrupt completions),
23
23
  * explicit resource management, and blocked-binding poisoning. */
24
24
  import * as ts from "../ts7/adapter.js";
25
+ import { lowerOptionalIndex } from "./undefined-index.js";
25
26
  import { processDataMemberValue, programReadsExitCode } from "./builtins/process.js";
26
27
  import { requireInitFlagStmt } from "./require-initialization.js";
27
28
  import { isJsonRequireDecl } from "./json-require.js";
@@ -33,12 +34,13 @@ import { isDeadTscHelperDecl, tscInteropBindingOfDecl } from "./cjs-tsc-interop.
33
34
  import { arrayValueRead, arrayValueStore, arrayValueType, unionArrayValueRead, lowerSafeIndexRead, } from "./array-values.js";
34
35
  import { lowerForAwaitGenerator, lowerForOfGenerator, lowerYieldStarStatement, } from "./lower-generators.js";
35
36
  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";
37
+ import { BOOL, BYTES_U8, CAUGHT, DYN, F64, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
37
38
  import { PoisonError, boundIdentifiersOf, dynFallbackType, neverTaintedJsType, staticImportNamespaceType, } from "./lowerer.js";
38
39
  import { enforceLibBoundary, lowerSurplusCalls } from "./lib-boundary.js";
39
40
  import { cjsExportAssignmentOf, cjsExportChainOf, cjsVoidInitPreambleReals, cjsExportDiscardReason, cjsExportTargetLiteral, isCjsJsFile, isEsModuleStamp, isJsSourceFile, locOf, requireEarlyReference, requireSpecOf, } from "../program.js";
40
41
  import { isStrictCode } from "./strict-mode.js";
41
- import { COMPOUND_ASSIGN_OPS, STR_METHODS, UNSUPPORTED_STMT, isStdlibMember, sideEffectFreeOptionValue, stdlibGlobalAliasDecl, stdlibGlobalAliasNameOf, bufferNamespaceMember, stdlibGlobalNameOf, } from "./surfaces.js";
42
+ import { markSloppyRecordWrites } from "./frozen-records.js";
43
+ import { COMPOUND_ASSIGN_OPS, STR_METHODS, NARROW_FIRST, UNSUPPORTED_STMT, isStdlibMember, sideEffectFreeOptionValue, stdlibGlobalAliasDecl, stdlibGlobalAliasNameOf, bufferNamespaceMember, stdlibGlobalNameOf, } from "./surfaces.js";
42
44
  import { isNativeBuiltinValueInitializer } from "./lower-builtin-values.js";
43
45
  import { isProvenanceSourceFile } from "../provenance-registry.js";
44
46
  import { ambientUndefVarRootOf, lowerImportEquals, nsUndefRead, nsWritableTarget, trapDeclRootOf, } from "./lower-namespaces.js";
@@ -59,7 +61,7 @@ import { objectFactorySignature } from "./object-factory-new.js";
59
61
  import { isClassCallback, lowerClassCallbackAssign } from "./class-callbacks.js";
60
62
  import { classForInHasKey, classPropertiesHelper } from "./class-dynamic-dispatch.js";
61
63
  import { genericIfaceBindingKeepsClass, superConditionLead } from "./lower-classes.js";
62
- import { lowerStreamUnderscoreAssign, streamClassAliasDecl } from "./lower-stream.js";
64
+ import { lowerStreamUnderscoreAssign, streamClassAliasDecl, streamSidesOf, } from "./lower-stream.js";
63
65
  import { staticAssertInstanceDecl } from "./assert-instances.js";
64
66
  import { lowerHttpResPropertyAssignment, lowerHttpServerTimeoutAssignment, lowerNetServerMaxConnectionsAssignment, lowerServerCloseOverrideAssignment, } from "./lower-server.js";
65
67
  import { lowerUrlAssignment } from "./builtins/url.js";
@@ -70,7 +72,7 @@ import { lowerNodeModuleCall } from "./builtins/module-resolution.js";
70
72
  import { registerBuiltinCallableAlias } from "./builtins/callable-aliases.js";
71
73
  import { builtinClassAliasOwnsNoSlot, registerBuiltinClassAlias } from "./builtins/class-values.js";
72
74
  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";
75
+ import { abstractPropertyDeclOf, aliasTypeofNarrows, isMatchSliceType, lowerAbsenceProbe, lowerCompoundValueToTarget, lowerElementCompoundStatement, lowerIncDec, lowerIncDecTarget, lowerGroupsProjection, matchResultNamedGroupsOf, runtimeOptionalGuardIds, runtimeOptionalTrueIds, symbolFieldInfo, withRuntimeOptionalNarrowed, } from "./lower-exprs.js";
74
76
  import { globalSymbolKey } from "./expressions/global-symbols.js";
75
77
  import { identifiersNamed } from "./identifier-uses.js";
76
78
  import { lowerShortCircuitAssignment } from "./expressions/nullish-assignment.js";
@@ -89,6 +91,7 @@ import { npmStaticPackageOfPath } from "../npm-static.js";
89
91
  import { fenceNodeModuleMutation } from "./lower-node-module.js";
90
92
  import { fencePerfEntryKeyWalk } from "./builtins/performance.js";
91
93
  import { classGeneratorIterable } from "./class-iterables.js";
94
+ import { iterableUnionOf, lowerForOfIterable } from "./iterable-values.js";
92
95
  /** An opted package's directly-returned empty array may take the function's
93
96
  * explicit static return element type. This is the common JS accumulator
94
97
  * shape (`const result = []; result.push(value); return result`) and is
@@ -808,6 +811,46 @@ export function predeclareForwardCapture(lowerer, symbol) {
808
811
  }
809
812
  return false;
810
813
  }
814
+ /** The CLASS-DECLARATION twin of predeclareForwardCapture: a function
815
+ * hoisted above a local `class D` (`function make() { return new D(); }`
816
+ * reached through an earlier function) captures the class binding, which
817
+ * is in its temporal dead zone until the class statement runs. The class
818
+ * cannot be collected yet (its heritage may name bindings declared between
819
+ * here and the statement), so the binding is pre-declared as a TDZ box
820
+ * holding the class as a checked-dynamic constructor; the class statement
821
+ * later initializes it, and every reference reads it from there. */
822
+ export function predeclareForwardClass(lowerer, symbol) {
823
+ const decl = symbol.valueDeclaration;
824
+ if (!decl || !ts.isClassDeclaration(decl) || decl.name === undefined)
825
+ return false;
826
+ if (!isJsSourceFile(ts.getSourceFileOfNode(decl)))
827
+ return false;
828
+ for (let i = lowerer.activeStmtLists.length - 1; i >= 0; i--) {
829
+ const entry = lowerer.activeStmtLists[i];
830
+ const idx = entry.stmts.indexOf(decl);
831
+ if (idx < 0)
832
+ continue;
833
+ if (idx < entry.index || entry.ctx === lowerer.ctx || entry.ctx.tdzPredeclared.has(symbol))
834
+ return false;
835
+ const name = decl.name.text;
836
+ const count = entry.ctx.localCounters.get(name) ?? 0;
837
+ entry.ctx.localCounters.set(name, count + 1);
838
+ const local = {
839
+ id: `${name}.${count}`,
840
+ name,
841
+ type: DYN,
842
+ mutable: false,
843
+ boxed: true,
844
+ tdz: true,
845
+ };
846
+ entry.ctx.locals.push(local);
847
+ entry.frame.set(symbol, local);
848
+ entry.out.push({ kind: "varDecl", localId: local.id, init: null, loc: locOf(decl) });
849
+ entry.ctx.tdzPredeclared.set(symbol, local);
850
+ return true;
851
+ }
852
+ return false;
853
+ }
811
854
  /** The FUNCTION-DECLARATION twin of predeclareForwardCapture: JS hoists a
812
855
  * nested `function f() {}` to scope entry — the binding is LIVE from the
813
856
  * first statement, so a reference lexically above the declaration in the
@@ -999,6 +1042,32 @@ function lowerJsVarFromExisting(lowerer, decl, symbol) {
999
1042
  loc: locOf(decl),
1000
1043
  };
1001
1044
  }
1045
+ /** Whether a JavaScript declaration's object value changes shape after its
1046
+ * initializer (jsOpenObjectType, jsObjectBindingExpands) or carries
1047
+ * methods, so only the checked-dynamic representation holds it.
1048
+ * `inferred` is the declaration's mapped checker type. */
1049
+ function jsDeclarationExpandsObject(lowerer, decl, inferred) {
1050
+ const arms = inferred?.kind === "union"
1051
+ ? (lowerer.unions.get(inferred.unionId)?.arms ?? [])
1052
+ : inferred
1053
+ ? [inferred]
1054
+ : [];
1055
+ return ((!decl.type &&
1056
+ !hasJsTypeAnnotation(decl) &&
1057
+ inferred !== null &&
1058
+ jsOpenObjectType(decl, inferred, lowerer.shapes, lowerer.unions).kind === "dyn") ||
1059
+ arms.some((arm) => arm.kind === "record" && jsObjectBindingExpands(lowerer, decl, arm)) ||
1060
+ (isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
1061
+ !decl.type &&
1062
+ !hasJsTypeAnnotation(decl) &&
1063
+ decl.initializer !== undefined &&
1064
+ ts.isObjectLiteralExpression(decl.initializer) &&
1065
+ decl.initializer.properties.nodes.some((property) => ts.isMethodDeclaration(property) ||
1066
+ ts.isAccessor(property) ||
1067
+ (ts.isPropertyAssignment(property) &&
1068
+ (ts.isFunctionExpression(property.initializer) ||
1069
+ ts.isArrowFunction(property.initializer))))));
1070
+ }
1002
1071
  /** The `var` symbol's function-scoped binding TYPE — the declared type at
1003
1072
  * the binding name, with the JS-source fallbacks every mutable binding
1004
1073
  * takes (an empty-object-literal type is checked-dynamic because tsc
@@ -1030,6 +1099,17 @@ function varBindingType(lowerer, nameNode) {
1030
1099
  }
1031
1100
  if (!type || type.kind === "void")
1032
1101
  return null;
1102
+ // A JavaScript `var` holds whatever its writes store, as a `let` does:
1103
+ // the checker types it by its initializer and checks no later write
1104
+ // (`var fraction = 0;`, later `fraction = match[7].slice(0, 3)`), and an
1105
+ // object it holds may gain members (`mark.snippet = snippet(mark)`).
1106
+ if (type.kind !== "dyn" &&
1107
+ ts.isVariableDeclaration(nameNode.parent) &&
1108
+ nameNode.parent.name === nameNode &&
1109
+ isJsSourceFile(ts.getSourceFileOfNode(nameNode)) &&
1110
+ (jsBindingHasOpenWrites(lowerer, nameNode.parent) ||
1111
+ jsDeclarationExpandsObject(lowerer, nameNode.parent, type)))
1112
+ return DYN;
1033
1113
  // A binding readable before its first store holds undefined until then.
1034
1114
  return lowerer.runtimeOptionalBindingType(nameNode, type);
1035
1115
  }
@@ -1299,8 +1379,24 @@ export function lowerStmt(lowerer, stmt) {
1299
1379
  if (!stmt.name)
1300
1380
  lowerer.unsupported("SC1090", stmt, "anonymous local class declarations");
1301
1381
  const info = lowerer.lowerClassExpressionInfo(stmt);
1382
+ // An earlier hoisted function captured the class: its TDZ box exists.
1383
+ const symbol = lowerer.checker.getSymbolAtLocation(stmt.name);
1384
+ const pre = symbol ? lowerer.ctx.tdzPredeclared.get(symbol) : undefined;
1385
+ if (pre) {
1386
+ lowerer.ctx.tdzPredeclared.delete(symbol);
1387
+ const value = lowerer.coerceToExpected(lowerer.lowerClassExpression(stmt), DYN);
1388
+ return { kind: "assign", localId: pre.id, value, initializes: true, loc: locOf(stmt) };
1389
+ }
1302
1390
  const type = { kind: "classval", className: info.def.name };
1303
1391
  const local = lowerer.declareLocal(stmt.name, stmt.name.text, type, true);
1392
+ // Static members of a function-local class run while the class value is
1393
+ // built and may read the class by name: the class value assigns the
1394
+ // binding before them.
1395
+ if (info.localClass && (info.runtimeStatics || info.runtimePrototypeMembers))
1396
+ return [
1397
+ { kind: "varDecl", localId: local.id, init: null, loc: locOf(stmt) },
1398
+ { kind: "exprStmt", expr: lowerer.lowerClassExpression(stmt, local), loc: locOf(stmt) },
1399
+ ];
1304
1400
  const init = lowerer.lowerClassExpression(stmt);
1305
1401
  return { kind: "varDecl", localId: local.id, init, loc: locOf(stmt) };
1306
1402
  }
@@ -2718,6 +2814,18 @@ export function lowerBindingPattern(lowerer, pattern, srcRef, srcType, isLet, ou
2718
2814
  lowerModuleNamespacePattern(lowerer, pattern, nsSource, isLet, out);
2719
2815
  return;
2720
2816
  }
2817
+ if (srcType.kind === "url") {
2818
+ lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out);
2819
+ return;
2820
+ }
2821
+ if (srcType.kind === "union" &&
2822
+ !isJsSourceFile(ts.getSourceFileOfNode(pattern)) &&
2823
+ lowerer.unions
2824
+ .get(srcType.unionId)
2825
+ ?.arms.every((arm) => arm.kind === "record" || arm.kind === "object")) {
2826
+ lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out);
2827
+ return;
2828
+ }
2721
2829
  if (srcType.kind !== "record") {
2722
2830
  lowerer.unsupported("SC1031", pattern, srcType.kind === "object"
2723
2831
  ? "object destructuring of class instances (read the fields directly — accessors make the desugar observable)"
@@ -2900,7 +3008,10 @@ function patternSourceValue(lowerer, value, arrayPattern, out, loc, spelling) {
2900
3008
  if (!arms ||
2901
3009
  !present?.length ||
2902
3010
  present.length === arms.length ||
2903
- (present.length > 1 && !(arrayPattern && present.every((arm) => arm.kind === "array"))))
3011
+ (present.length > 1 &&
3012
+ !(arrayPattern
3013
+ ? present.every((arm) => arm.kind === "array")
3014
+ : present.every((arm) => arm.kind === "record" || arm.kind === "object"))))
2904
3015
  return value;
2905
3016
  for (const [tag, arm] of arms.entries()) {
2906
3017
  if (!isUnitType(arm))
@@ -2994,6 +3105,122 @@ function lowerModuleNamespacePattern(lowerer, pattern, source, isLet, out) {
2994
3105
  lowerer.bindPatternTarget(el.name, value, isLet, out);
2995
3106
  }
2996
3107
  }
3108
+ /** The URL getters an object pattern reads (`const { protocol, hostname }
3109
+ * = new URL(text)`), each a read of the URL's current serialization. */
3110
+ const URL_PATTERN_GETTERS = {
3111
+ href: "url.href",
3112
+ origin: "url.origin",
3113
+ protocol: "url.protocol",
3114
+ username: "url.username",
3115
+ password: "url.password",
3116
+ host: "url.host",
3117
+ hostname: "url.hostname",
3118
+ port: "url.port",
3119
+ pathname: "url.pathname",
3120
+ search: "url.search",
3121
+ hash: "url.hash",
3122
+ };
3123
+ /** An object pattern over a URL: each element reads its getter in pattern
3124
+ * order, as `url.name` does; `searchParams` binds the URL's live view.
3125
+ * Methods and rest elements stay fenced. */
3126
+ function lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out) {
3127
+ for (const el of pattern.elements.nodes) {
3128
+ if (el.name === undefined)
3129
+ continue;
3130
+ if (el.dotDotDotToken) {
3131
+ lowerer.unsupported("SC1031", el, "rest bindings over URL sources (a URL's properties are prototype getters, which rest elements do not copy)");
3132
+ }
3133
+ const prop = el.propertyName ?? el.name;
3134
+ const propName = ts.isIdentifier(prop) ||
3135
+ ts.isComputedPropertyName(prop) ||
3136
+ ts.isStringLiteralLike(prop) ||
3137
+ ts.isNumericLiteral(prop)
3138
+ ? patternKeyNameOf(lowerer, prop)
3139
+ : null;
3140
+ const loc = locOf(el);
3141
+ let value;
3142
+ if (propName !== null && Object.hasOwn(URL_PATTERN_GETTERS, propName)) {
3143
+ value = {
3144
+ kind: "libCall",
3145
+ fn: URL_PATTERN_GETTERS[propName],
3146
+ args: [srcRef()],
3147
+ type: STRING,
3148
+ loc,
3149
+ };
3150
+ }
3151
+ else if (propName === "searchParams") {
3152
+ value = {
3153
+ kind: "libCall",
3154
+ fn: "url.searchParams",
3155
+ args: [srcRef()],
3156
+ type: SEARCH_PARAMS_T,
3157
+ loc,
3158
+ };
3159
+ }
3160
+ else {
3161
+ lowerer.unsupported("SC1031", el, propName === null
3162
+ ? "destructuring with computed keys that do not fold to one property name"
3163
+ : `destructuring '${propName}' from a URL (${Object.keys(URL_PATTERN_GETTERS).join(", ")} and searchParams are the supported URL properties)`);
3164
+ }
3165
+ if (el.initializer)
3166
+ value = applyBindingDefault(lowerer, el, value);
3167
+ lowerer.bindPatternTarget(el.name, value, isLet, out);
3168
+ }
3169
+ }
3170
+ /** An object pattern over a union of records and class instances
3171
+ * (`function f({ kind, path }: Add | Remove)`): each element reads a data
3172
+ * field every arm declares with one type, through the runtime tag, as
3173
+ * `value.field` does. Rest elements and fields the arms type differently
3174
+ * stay fenced. */
3175
+ function lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out) {
3176
+ const arms = lowerer.unions.get(srcType.unionId)?.arms ?? [];
3177
+ for (const el of pattern.elements.nodes) {
3178
+ if (el.name === undefined)
3179
+ continue;
3180
+ if (el.dotDotDotToken) {
3181
+ lowerer.unsupported("SC1031", el, `rest bindings over union sources (${NARROW_FIRST})`);
3182
+ }
3183
+ const prop = el.propertyName ?? el.name;
3184
+ const propName = ts.isIdentifier(prop) ||
3185
+ ts.isComputedPropertyName(prop) ||
3186
+ ts.isStringLiteralLike(prop) ||
3187
+ ts.isNumericLiteral(prop)
3188
+ ? patternKeyNameOf(lowerer, prop)
3189
+ : null;
3190
+ if (propName === null) {
3191
+ lowerer.unsupported("SC1031", el, "destructuring with computed keys that do not fold to one property name");
3192
+ }
3193
+ let common = null;
3194
+ for (const arm of arms) {
3195
+ let ft;
3196
+ if (arm.kind === "record") {
3197
+ ft = lowerer.shapes.get(arm.shapeId)?.fields.find((f) => f.name === propName)?.type;
3198
+ }
3199
+ else if (arm.kind === "object") {
3200
+ ft = lowerer.classes.get(arm.className)?.fields.get(propName);
3201
+ }
3202
+ if (!ft || ft.kind === "void" || isUnitType(ft) || (common && !typeEquals(common, ft))) {
3203
+ common = null;
3204
+ break;
3205
+ }
3206
+ common = ft;
3207
+ }
3208
+ if (common === null) {
3209
+ 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})`);
3210
+ }
3211
+ let value = {
3212
+ kind: "unionDisc",
3213
+ unionId: srcType.unionId,
3214
+ field: propName,
3215
+ value: srcRef(),
3216
+ type: common,
3217
+ loc: locOf(el),
3218
+ };
3219
+ if (el.initializer)
3220
+ value = applyBindingDefault(lowerer, el, value);
3221
+ lowerer.bindPatternTarget(el.name, value, isLet, out);
3222
+ }
3223
+ }
2997
3224
  /** Whether a pattern's first element has a computed key that does not
2998
3225
  * fold to one property name, so the key evaluates at run time. */
2999
3226
  function startsWithRuntimeKey(lowerer, pattern) {
@@ -3881,11 +4108,15 @@ export function bindPatternTarget(lowerer, name, value, isLet, out, allowDynObje
3881
4108
  }
3882
4109
  // Preserve checked-value pattern bindings when the inferred type
3883
4110
  // cannot represent them without a refusal or an alias-breaking copy.
4111
+ // A name destructured from a container of an evolving array
4112
+ // (evolvingArrayHold) may hold the array, which the checker types by
4113
+ // the elements written before it.
3884
4114
  const dynStays = value.type.kind === "dyn" &&
3885
- (() => {
4115
+ ((() => {
3886
4116
  const mapped = lowerer.mapTypeOf(lowerer.typeOf(name));
3887
4117
  return mapped === null || jsBindingKeepsCheckedObject(lowerer, name, mapped);
3888
- })();
4118
+ })() ||
4119
+ readsHeldEvolvingArray(lowerer, name));
3889
4120
  let type = dynStays
3890
4121
  ? DYN
3891
4122
  : (lowerer.runtimeOptionalBindingType(name, lowerer.irTypeOf(name)) ??
@@ -3969,9 +4200,10 @@ export function lowerVarDeclList(lowerer, list) {
3969
4200
  * `never[]` or `any[]` and each later read by the elements written before
3970
4201
  * it, and reads inside closures as the unsettled array. When every read
3971
4202
  * 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. */
4203
+ * that type. When reads disagree, a write (`xs.push(v)`, `xs.unshift(v)`,
4204
+ * `xs.push(...values)`, `xs[i] = v`) stores a value that type's element does
4205
+ * not hold, or the binding is reassigned, it is checked-dynamic, as the same
4206
+ * binding is at module scope. Null for other bindings. */
3975
4207
  function evolvingArrayType(lowerer, decl) {
3976
4208
  if (!ts.isIdentifier(decl.name) || decl.initializer === undefined)
3977
4209
  return null;
@@ -3999,13 +4231,19 @@ function evolvingArrayType(lowerer, decl) {
3999
4231
  };
4000
4232
  const scope = owner(decl);
4001
4233
  let result = null;
4234
+ // The values the binding's writes store, checked against the element
4235
+ // type once the reads settle it.
4236
+ const written = [];
4002
4237
  // The file's identifiers are indexed by name once (identifiersNamed), so
4003
- // each binding resolves only the uses spelled like it.
4238
+ // each binding resolves only the uses spelled like it. A shorthand
4239
+ // property (`{ xs }`) is a use too.
4004
4240
  for (const node of identifiersNamed(lowerer, ts.getSourceFileOfNode(decl), decl.name.text)) {
4005
4241
  if (node === decl.name ||
4006
4242
  node.pos < scope.pos ||
4007
4243
  node.end > scope.end ||
4008
- lowerer.checker.getSymbolAtLocation(node) !== symbol)
4244
+ (ts.isShorthandPropertyAssignment(node.parent) && node.parent.name === node
4245
+ ? lowerer.checker.getShorthandAssignmentValueSymbol(node.parent)
4246
+ : lowerer.checker.getSymbolAtLocation(node)) !== symbol)
4009
4247
  continue;
4010
4248
  let target = node;
4011
4249
  while (ts.isParenthesizedExpression(target.parent))
@@ -4017,6 +4255,18 @@ function evolvingArrayType(lowerer, decl) {
4017
4255
  parent.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
4018
4256
  if (reassigned)
4019
4257
  return DYN;
4258
+ if (ts.isPropertyAccessExpression(parent) &&
4259
+ parent.expression === target &&
4260
+ (parent.name.text === "push" || parent.name.text === "unshift") &&
4261
+ ts.isCallExpression(parent.parent) &&
4262
+ parent.parent.expression === parent)
4263
+ written.push(...parent.parent.arguments.nodes);
4264
+ else if (ts.isElementAccessExpression(parent) &&
4265
+ parent.expression === target &&
4266
+ ts.isBinaryExpression(parent.parent) &&
4267
+ parent.parent.left === parent &&
4268
+ parent.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken)
4269
+ written.push(parent.parent.right);
4020
4270
  const t = lowerer.typeOf(node);
4021
4271
  if (unsettled(t))
4022
4272
  continue;
@@ -4025,7 +4275,132 @@ function evolvingArrayType(lowerer, decl) {
4025
4275
  return DYN;
4026
4276
  result = mapped;
4027
4277
  }
4028
- return result ?? DYN;
4278
+ if (result === null || result.kind !== "array")
4279
+ return DYN;
4280
+ // The element types a write stores: its value's, or for a spread
4281
+ // (`xs.push(...values)`) the source array's element or tuple's elements.
4282
+ // Another spread source stores elements this check cannot see.
4283
+ const storedTypes = (value) => {
4284
+ if (!ts.isSpreadElement(value))
4285
+ return [lowerer.typeOf(value)];
4286
+ const source = lowerer.typeOf(value.expression);
4287
+ if (lowerer.checker.isArrayType(source) || lowerer.checker.isTupleType(source))
4288
+ return [...lowerer.checker.getTypeArguments(source)];
4289
+ return null;
4290
+ };
4291
+ for (const value of written) {
4292
+ const stored = storedTypes(value);
4293
+ if (stored === null)
4294
+ return DYN;
4295
+ for (const type of stored) {
4296
+ const t = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(type));
4297
+ if (!t || (!typeEquals(t, result.elem) && lowerer.widthLiftPlan(t, result.elem) === null))
4298
+ return DYN;
4299
+ }
4300
+ }
4301
+ return result;
4302
+ }
4303
+ /** How a TypeScript expression holds an evolving array binding whose reads
4304
+ * disagree (evolvingArrayType answers checked-dynamic): "evolving" for the
4305
+ * binding itself, "alias" for an unannotated binding initialized with it or
4306
+ * with an alias of it (`const alias = xs`), and "container" for an object or
4307
+ * array literal with it as a property, element or spread source at any
4308
+ * depth (`{ items: xs }`, `[xs]`), an unannotated binding initialized with
4309
+ * or destructured from such a literal, and a property or element read of a
4310
+ * container (`box.items`). The checker types an alias or container by the
4311
+ * elements written before it was taken, but it holds the same array. Null
4312
+ * for other expressions. */
4313
+ function evolvingArrayHold(lowerer, expr, depth = 0) {
4314
+ while (ts.isParenthesizedExpression(expr))
4315
+ expr = expr.expression;
4316
+ if (depth >= 8)
4317
+ return null;
4318
+ const binding = (symbol) => {
4319
+ const source = symbol?.valueDeclaration;
4320
+ // A name destructured from a container (`const { items } = box`) may
4321
+ // be the array or another container.
4322
+ if (source !== undefined && ts.isBindingElement(source) && ts.isIdentifier(source.name)) {
4323
+ const host = hostVariableDeclarationOf(source.name);
4324
+ return host !== null &&
4325
+ !host.type &&
4326
+ host.initializer !== undefined &&
4327
+ evolvingArrayHold(lowerer, host.initializer, depth + 1) === "container"
4328
+ ? "container"
4329
+ : null;
4330
+ }
4331
+ if (source === undefined || !ts.isVariableDeclaration(source) || source.type)
4332
+ return null;
4333
+ const evolved = evolvingArrayType(lowerer, source);
4334
+ if (evolved !== null)
4335
+ return evolved.kind === "dyn" ? "evolving" : null;
4336
+ if (source.initializer === undefined)
4337
+ return null;
4338
+ const held = evolvingArrayHold(lowerer, source.initializer, depth + 1);
4339
+ return held === "evolving" ? "alias" : held;
4340
+ };
4341
+ if (ts.isIdentifier(expr))
4342
+ return binding(lowerer.checker.getSymbolAtLocation(expr));
4343
+ if (ts.isPropertyAccessExpression(expr) || ts.isElementAccessExpression(expr))
4344
+ return evolvingArrayHold(lowerer, expr.expression, depth + 1) === "container"
4345
+ ? "container"
4346
+ : null;
4347
+ // A spread of the array itself (`{ ...xs }`, `[...xs]`) copies its
4348
+ // elements, as in Node; a spread of a container copies its references.
4349
+ if (ts.isObjectLiteralExpression(expr)) {
4350
+ for (const property of expr.properties.nodes) {
4351
+ const held = ts.isPropertyAssignment(property)
4352
+ ? evolvingArrayHold(lowerer, property.initializer, depth + 1)
4353
+ : ts.isShorthandPropertyAssignment(property)
4354
+ ? binding(lowerer.checker.getShorthandAssignmentValueSymbol(property))
4355
+ : ts.isSpreadAssignment(property) &&
4356
+ evolvingArrayHold(lowerer, property.expression, depth + 1) === "container"
4357
+ ? "container"
4358
+ : null;
4359
+ if (held !== null)
4360
+ return "container";
4361
+ }
4362
+ return null;
4363
+ }
4364
+ if (ts.isArrayLiteralExpression(expr)) {
4365
+ for (const element of expr.elements.nodes) {
4366
+ const held = ts.isSpreadElement(element)
4367
+ ? evolvingArrayHold(lowerer, element.expression, depth + 1) === "container"
4368
+ ? "container"
4369
+ : null
4370
+ : evolvingArrayHold(lowerer, element, depth + 1);
4371
+ if (held !== null)
4372
+ return "container";
4373
+ }
4374
+ }
4375
+ return null;
4376
+ }
4377
+ /** Whether a TypeScript expression is an alias or container of an evolving
4378
+ * array binding whose reads disagree (evolvingArrayHold). Its value is
4379
+ * checked-dynamic, and the checker's type for it lists only the elements
4380
+ * written before it was taken, so element reads through it stay
4381
+ * checked-dynamic instead of checking against that type. */
4382
+ export function readsHeldEvolvingArray(lowerer, expr) {
4383
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
4384
+ return false;
4385
+ const held = evolvingArrayHold(lowerer, expr);
4386
+ return held === "alias" || held === "container";
4387
+ }
4388
+ /** Whether a TypeScript object or array literal holds an evolving array
4389
+ * binding whose reads disagree (evolvingArrayHold), so it builds as a
4390
+ * checked-dynamic literal that keeps the array. */
4391
+ export function holdsEvolvingArray(lowerer, expr) {
4392
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
4393
+ return false;
4394
+ return evolvingArrayHold(lowerer, expr) === "container";
4395
+ }
4396
+ /** An unannotated binding initialized with an evolving array binding whose
4397
+ * reads disagree, or with an alias or container of one (evolvingArrayHold):
4398
+ * it takes the array's checked-dynamic type, so it sees the later writes.
4399
+ * Null for other bindings. */
4400
+ function evolvingArrayHolderType(lowerer, decl) {
4401
+ if (decl.initializer === undefined)
4402
+ return null;
4403
+ return evolvingArrayHold(lowerer, decl.initializer) === null ? null : DYN;
4029
4404
  }
4030
4405
  /** A single static type for an initializer-less JavaScript `let` whose
4031
4406
  * later plain writes all agree. An evolving JS local reads as `undefined`
@@ -4488,20 +4863,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4488
4863
  : inferredObjectType
4489
4864
  ? [inferredObjectType]
4490
4865
  : [];
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)))));
4866
+ const expandsObject = jsDeclarationExpandsObject(lowerer, decl, inferredObjectType);
4505
4867
  let init;
4506
4868
  try {
4507
4869
  init =
@@ -4666,7 +5028,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4666
5028
  if (returnedEmptyArrayType === null &&
4667
5029
  !decl.type &&
4668
5030
  !isJsSourceFile(ts.getSourceFileOfNode(decl))) {
4669
- const evolved = evolvingArrayType(lowerer, decl);
5031
+ const evolved = evolvingArrayType(lowerer, decl) ?? evolvingArrayHolderType(lowerer, decl);
4670
5032
  if (evolved !== null) {
4671
5033
  type = evolved;
4672
5034
  init = lowerer.lowerExprExpecting(decl.initializer, evolved);
@@ -5143,17 +5505,12 @@ export function hasJsTypeAnnotation(decl) {
5143
5505
  return (!!statement &&
5144
5506
  /@type\b/.test(ts.getSourceFileOfNode(decl).text.slice(statement.pos, ts.tokenStartOfNode(decl))));
5145
5507
  }
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);
5508
+ /** The assignments to a declaration's binding in its function (or file),
5509
+ * `=` and compound alike. Null when the name has no symbol. */
5510
+ function jsBindingWrites(lowerer, decl, name) {
5511
+ const symbol = lowerer.resolveValueSymbol(name);
5155
5512
  if (!symbol)
5156
- return false;
5513
+ return null;
5157
5514
  let owner = decl;
5158
5515
  while (owner.parent && !ts.isFunctionLike(owner) && !ts.isSourceFile(owner))
5159
5516
  owner = owner.parent;
@@ -5175,9 +5532,41 @@ export function jsBindingHasOpenWrites(lowerer, decl) {
5175
5532
  writes = indexed;
5176
5533
  lowerer.jsBindingWritesByOwner.set(owner, writes);
5177
5534
  }
5178
- const candidates = (writes.get(decl.name.text) ?? []).filter((node) => lowerer.resolveValueSymbol(node.left) === symbol);
5535
+ return (writes.get(name.text) ?? []).filter((node) => lowerer.resolveValueSymbol(node.left) === symbol);
5536
+ }
5537
+ /** Whether a JavaScript binding always holds a string: the checker types it
5538
+ * as one, and every write appends to it (`result += part`), which yields a
5539
+ * string whatever the part is. */
5540
+ export function jsBindingAppendsOnly(lowerer, decl) {
5541
+ if (!ts.isIdentifier(decl.name))
5542
+ return false;
5543
+ if (lowerer.mapTypeOf(lowerer.typeOf(decl.name))?.kind !== "string")
5544
+ return false;
5545
+ const writes = jsBindingWrites(lowerer, decl, decl.name);
5546
+ return (writes !== null &&
5547
+ writes.every((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken));
5548
+ }
5549
+ /** Inferred JS scalar initializers do not constrain later writes through
5550
+ * an any-valued callback. Keep those bindings open, including captured writes. */
5551
+ export function jsBindingHasOpenWrites(lowerer, decl) {
5552
+ if (!isJsSourceFile(ts.getSourceFileOfNode(decl)) ||
5553
+ decl.type ||
5554
+ hasJsTypeAnnotation(decl) ||
5555
+ !ts.isIdentifier(decl.name))
5556
+ return false;
5557
+ const candidates = jsBindingWrites(lowerer, decl, decl.name);
5558
+ if (candidates === null)
5559
+ return false;
5179
5560
  if (candidates.some((node) => (lowerer.typeOf(node.right).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0))
5180
5561
  return true;
5562
+ // A `+=` of a string turns a number or boolean binding into a string
5563
+ // (`n += "px"`); the checker keeps the declared type.
5564
+ if (candidates.some((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken &&
5565
+ (lowerer.typeOf(node.right).flags & ts.TypeFlags.StringLike) !== 0)) {
5566
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(decl.name));
5567
+ if (declared?.kind === "f64" || declared?.kind === "bool")
5568
+ return true;
5569
+ }
5181
5570
  // A write that can store null or undefined into a binding the checker
5182
5571
  // types as a primitive (`offset = match[3] || null`): JavaScript files
5183
5572
  // are checked without strict null checks, so the declared type does not
@@ -5700,7 +6089,7 @@ function lowerDeleteStatement(lowerer, expr) {
5700
6089
  if (obj.type.kind === "record") {
5701
6090
  const shape = lowerer.shapes.get(obj.type.shapeId);
5702
6091
  if (shape?.indexValue && shape.fields.length === 0 && !shape.tuple) {
5703
- return { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc };
6092
+ return markSloppyRecordWrites(lowerer, { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc }, expr);
5704
6093
  }
5705
6094
  // `delete r.f` of a declared OPTIONAL field (undefined-armed slot)
5706
6095
  // writes the field's ABSENT state: a monomorphic shape cannot remove
@@ -5720,14 +6109,14 @@ function lowerDeleteStatement(lowerer, expr) {
5720
6109
  if (field) {
5721
6110
  const absent = lowerer.absentFieldValue(field.type, loc);
5722
6111
  if (absent) {
5723
- return {
6112
+ return markSloppyRecordWrites(lowerer, {
5724
6113
  kind: "recordSet",
5725
6114
  obj,
5726
6115
  shapeId: obj.type.shapeId,
5727
6116
  field: field.name,
5728
6117
  value: absent,
5729
6118
  loc,
5730
- };
6119
+ }, expr, true);
5731
6120
  }
5732
6121
  }
5733
6122
  if (shape?.indexValue) {
@@ -7671,7 +8060,7 @@ function lowerAssignTargetInto(lowerer, out, targetNode, blame, dflt, valueOf) {
7671
8060
  if (arr.type.kind === "array") {
7672
8061
  const recv = lowerer.declareHiddenLocal("%dtRecv", arr.type);
7673
8062
  out.push({ kind: "varDecl", localId: recv.id, init: arr, loc });
7674
- const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(t.argumentExpression), locOf(t.argumentExpression), t.argumentExpression);
8063
+ const index = lowerOptionalIndex(lowerer, lowerer.lowerExpr(t.argumentExpression), locOf(t.argumentExpression), t.argumentExpression);
7675
8064
  if (index.type.kind !== "f64") {
7676
8065
  lowerer.unsupported("SC1090", t.argumentExpression, "indexing with non-number keys");
7677
8066
  }
@@ -8060,6 +8449,16 @@ export function lowerForOf(lowerer, stmt) {
8060
8449
  lowerer.stdlibGlobalMember(stmt.expression, "process") === "stdin") {
8061
8450
  return lowerForAwaitStdin(lowerer, stmt);
8062
8451
  }
8452
+ // NodeJS.WritableStream is what @types/node answers for pipeline()
8453
+ // with a function destination, whose value is a PassThrough.
8454
+ if (nodeStreamInterfaceSide(lowerer, lowerer.typeOf(stmt.expression)) === "w") {
8455
+ const mapped = lowerer.mapTypeOf(lowerer.typeOf(stmt.expression));
8456
+ const sides = mapped?.kind === "object"
8457
+ ? streamSidesOf(lowerer, lowerer.classes.get(mapped.className))
8458
+ : null;
8459
+ if (sides !== "r" && sides !== "rw")
8460
+ 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)");
8461
+ }
8063
8462
  // A checked-dynamic NodeJS.ReadableStream iterates its native stream,
8064
8463
  // and a Hash, Hmac, Cipheriv or Decipheriv iterates its Transform.
8065
8464
  const dynStream = lowerForAwaitDynStream(lowerer, stmt, () => lowerForAwaitBuiltin(lowerer, stmt)) ??
@@ -8232,6 +8631,11 @@ export function lowerForOf(lowerer, stmt) {
8232
8631
  }
8233
8632
  iterSrc ??= stmt.expression;
8234
8633
  let iterable = lowerer.lowerExpr(iterSrc);
8634
+ {
8635
+ const iterableUnion = iterableUnionOf(lowerer, iterable.type);
8636
+ if (iterableUnion)
8637
+ return lowerForOfIterable(lowerer, stmt, iterable, iterableUnion, labels);
8638
+ }
8235
8639
  let tupleSource = null;
8236
8640
  // A nested loop receiver can be an OOB-safe array read from the outer
8237
8641
  // loop (`for (const row of grid) for (const cell of row)`). The checker
@@ -9890,11 +10294,13 @@ function lowerForIn(lowerer, stmt) {
9890
10294
  loc,
9891
10295
  });
9892
10296
  const keys = objectIterOverIndexShape(lowerer, stmt.expression, "keys", receiver.type, rShape, recvRef(), keysT, loc);
10297
+ // The overflow map's hashed key set answers presence directly; a
10298
+ // fresh key list per visit would make the walk quadratic.
9893
10299
  const guard = (kRef) => ({
9894
- kind: "arrIntrinsic",
9895
- method: "includes",
9896
- receiver: { kind: "recordOvfKeys", obj: recvRef(), shapeId, type: keysT, loc },
9897
- args: [kRef],
10300
+ kind: "recordOvfHas",
10301
+ obj: recvRef(),
10302
+ shapeId,
10303
+ key: kRef,
9898
10304
  type: BOOL,
9899
10305
  loc,
9900
10306
  });