@scriptc/compiler 0.4.3 → 0.4.5

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 (852) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +270 -72
  2. package/ambient/scriptc-overrides.d.ts +21 -0
  3. package/dist/backend/executable-features.js +3 -0
  4. package/dist/backend/executable-features.js.map +1 -1
  5. package/dist/backend/library-pack.js +2 -1
  6. package/dist/backend/library-pack.js.map +1 -1
  7. package/dist/backend/linker.js +11 -1
  8. package/dist/backend/linker.js.map +1 -1
  9. package/dist/backend/lld.d.ts +9 -0
  10. package/dist/backend/lld.js +48 -0
  11. package/dist/backend/lld.js.map +1 -0
  12. package/dist/backend/lld.test.d.ts +1 -0
  13. package/dist/backend/lld.test.js +53 -0
  14. package/dist/backend/lld.test.js.map +1 -0
  15. package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
  16. package/dist/backend/llvm/appended-array-literals.js +29 -0
  17. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  18. package/dist/backend/llvm/blocks.js +10 -1
  19. package/dist/backend/llvm/blocks.js.map +1 -1
  20. package/dist/backend/llvm/bytes-alias.d.ts +13 -4
  21. package/dist/backend/llvm/bytes-alias.js +16 -5
  22. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  23. package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
  24. package/dist/backend/llvm/bytes-bounds.js +199 -2
  25. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
  27. package/dist/backend/llvm/bytes-loop-versions.js +244 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
  32. package/dist/backend/llvm/call-lifetimes.js +87 -18
  33. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  34. package/dist/backend/llvm/call-lifetimes.test.js +132 -0
  35. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  36. package/dist/backend/llvm/classes.d.ts +3 -2
  37. package/dist/backend/llvm/classes.js +4 -4
  38. package/dist/backend/llvm/classes.js.map +1 -1
  39. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  40. package/dist/backend/llvm/counted-loops.js +54 -5
  41. package/dist/backend/llvm/counted-loops.js.map +1 -1
  42. package/dist/backend/llvm/debug-info.d.ts +42 -1
  43. package/dist/backend/llvm/debug-info.js +72 -6
  44. package/dist/backend/llvm/debug-info.js.map +1 -1
  45. package/dist/backend/llvm/dense-array-loops.js +2 -2
  46. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  47. package/dist/backend/llvm/dense-array-loops.test.js +1 -0
  48. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  49. package/dist/backend/llvm/dyn.d.ts +69 -8
  50. package/dist/backend/llvm/dyn.js +396 -49
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +30 -16
  53. package/dist/backend/llvm/emit-function.js.map +1 -1
  54. package/dist/backend/llvm/emit-journal.d.ts +8 -4
  55. package/dist/backend/llvm/emit-journal.js +75 -5
  56. package/dist/backend/llvm/emit-journal.js.map +1 -1
  57. package/dist/backend/llvm/emit-module.d.ts +4 -0
  58. package/dist/backend/llvm/emit-module.js +74 -29
  59. package/dist/backend/llvm/emit-module.js.map +1 -1
  60. package/dist/backend/llvm/emit-statements.js +297 -28
  61. package/dist/backend/llvm/emit-statements.js.map +1 -1
  62. package/dist/backend/llvm/emitter.d.ts +144 -13
  63. package/dist/backend/llvm/emitter.js +523 -92
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/emitter.test.js +11 -2
  66. package/dist/backend/llvm/emitter.test.js.map +1 -1
  67. package/dist/backend/llvm/expr-async.js +11 -13
  68. package/dist/backend/llvm/expr-async.js.map +1 -1
  69. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  70. package/dist/backend/llvm/expr-bytes.js +45 -16
  71. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  72. package/dist/backend/llvm/expr-calls.js +13 -11
  73. package/dist/backend/llvm/expr-calls.js.map +1 -1
  74. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  75. package/dist/backend/llvm/expr-containers.js +101 -9
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-context.d.ts +3 -0
  78. package/dist/backend/llvm/expr-control.js +83 -0
  79. package/dist/backend/llvm/expr-control.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +22 -4
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +121 -14
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-stream-bridges.js +111 -26
  86. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  87. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  88. package/dist/backend/llvm/forked-analysis.js +43 -0
  89. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  90. package/dist/backend/llvm/integer-values.d.ts +12 -0
  91. package/dist/backend/llvm/integer-values.js +69 -5
  92. package/dist/backend/llvm/integer-values.js.map +1 -1
  93. package/dist/backend/llvm/integer-views.d.ts +2 -1
  94. package/dist/backend/llvm/integer-views.js +12 -1
  95. package/dist/backend/llvm/integer-views.js.map +1 -1
  96. package/dist/backend/llvm/js-ic.d.ts +4 -0
  97. package/dist/backend/llvm/js-ic.js +133 -15
  98. package/dist/backend/llvm/js-ic.js.map +1 -1
  99. package/dist/backend/llvm/layouts.d.ts +1 -0
  100. package/dist/backend/llvm/layouts.js.map +1 -1
  101. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  102. package/dist/backend/llvm/lazy-captures.js +10 -5
  103. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  104. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  105. package/dist/backend/llvm/lib-abi.js +19 -0
  106. package/dist/backend/llvm/lib-abi.js.map +1 -1
  107. package/dist/backend/llvm/lib-dispatch.js +249 -33
  108. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  109. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  110. package/dist/backend/llvm/lib-filesystem.js +32 -0
  111. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  112. package/dist/backend/llvm/lib-http2.js +2 -2
  113. package/dist/backend/llvm/lib-http2.js.map +1 -1
  114. package/dist/backend/llvm/lib-network.js +2 -0
  115. package/dist/backend/llvm/lib-network.js.map +1 -1
  116. package/dist/backend/llvm/lib-process.js +48 -1
  117. package/dist/backend/llvm/lib-process.js.map +1 -1
  118. package/dist/backend/llvm/lib-shared.js +64 -0
  119. package/dist/backend/llvm/lib-shared.js.map +1 -1
  120. package/dist/backend/llvm/lib-tls.js +28 -3
  121. package/dist/backend/llvm/lib-tls.js.map +1 -1
  122. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  123. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  124. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  125. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  126. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  127. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  128. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  129. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  130. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  131. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  132. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  133. package/dist/backend/llvm/map-number-lookup.js +41 -9
  134. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  135. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  136. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  137. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  138. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  139. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  140. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  141. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  142. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  143. package/dist/backend/llvm/nullable-unions.js +29 -2
  144. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  145. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  146. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  147. package/dist/backend/llvm/publish.js +3 -3
  148. package/dist/backend/llvm/publish.js.map +1 -1
  149. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  150. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  151. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  152. package/dist/backend/llvm/reference-effects.js +3 -0
  153. package/dist/backend/llvm/reference-effects.js.map +1 -1
  154. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  155. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  156. package/dist/backend/llvm/shapes.d.ts +4 -5
  157. package/dist/backend/llvm/shapes.js +106 -58
  158. package/dist/backend/llvm/shapes.js.map +1 -1
  159. package/dist/backend/llvm/shapes.test.js +14 -2
  160. package/dist/backend/llvm/shapes.test.js.map +1 -1
  161. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  162. package/dist/backend/llvm/speculative-integers.js +411 -24
  163. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  164. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  165. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  166. package/dist/backend/llvm/split.d.ts +10 -1
  167. package/dist/backend/llvm/split.js +243 -59
  168. package/dist/backend/llvm/split.js.map +1 -1
  169. package/dist/backend/llvm/split.test.js +92 -13
  170. package/dist/backend/llvm/split.test.js.map +1 -1
  171. package/dist/backend/llvm/stack-captures.js +1 -5
  172. package/dist/backend/llvm/stack-captures.js.map +1 -1
  173. package/dist/backend/llvm/stack-objects.test.js +3 -2
  174. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  175. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  176. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  177. package/dist/backend/llvm/string-reads.d.ts +13 -0
  178. package/dist/backend/llvm/string-reads.js +22 -0
  179. package/dist/backend/llvm/string-reads.js.map +1 -1
  180. package/dist/backend/llvm/string-slices.d.ts +36 -2
  181. package/dist/backend/llvm/string-slices.js +308 -12
  182. package/dist/backend/llvm/string-slices.js.map +1 -1
  183. package/dist/backend/llvm/string-slices.test.js +182 -3
  184. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  185. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  186. package/dist/backend/llvm/string-unit-versions.js +191 -0
  187. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  188. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  189. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  190. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  191. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  192. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  193. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  194. package/dist/backend/llvm/union-repr.d.ts +4 -3
  195. package/dist/backend/llvm/union-repr.js +6 -5
  196. package/dist/backend/llvm/union-repr.js.map +1 -1
  197. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  198. package/dist/backend/llvm/unwind-abi.js +498 -0
  199. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  200. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  201. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  202. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  203. package/dist/backend/llvm/walkers.js +13 -0
  204. package/dist/backend/llvm/walkers.js.map +1 -1
  205. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  206. package/dist/backend/llvm/wrapping-sums.js +31 -14
  207. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  208. package/dist/backend/loop-polls.d.ts +6 -0
  209. package/dist/backend/loop-polls.js +24 -0
  210. package/dist/backend/loop-polls.js.map +1 -1
  211. package/dist/backend/may-throw.js +8 -8
  212. package/dist/backend/may-throw.js.map +1 -1
  213. package/dist/backend/native/contracts.d.ts +12 -2
  214. package/dist/backend/native/executable.js +48 -6
  215. package/dist/backend/native/executable.js.map +1 -1
  216. package/dist/backend/native/library.js +4 -3
  217. package/dist/backend/native/library.js.map +1 -1
  218. package/dist/backend/native/program-shards.d.ts +2 -2
  219. package/dist/backend/native/program-shards.js +2 -2
  220. package/dist/backend/native/program-shards.js.map +1 -1
  221. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  222. package/dist/backend/native/runtime-inputs.js +4 -1
  223. package/dist/backend/native/runtime-inputs.js.map +1 -1
  224. package/dist/backend/native/vendor.d.ts +1 -1
  225. package/dist/backend/native/vendor.js +1 -1
  226. package/dist/backend/native/vendor.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.d.ts +3 -1
  231. package/dist/backend/native-codegen.js +4 -3
  232. package/dist/backend/native-codegen.js.map +1 -1
  233. package/dist/backend/native-codegen.test.js +6 -4
  234. package/dist/backend/native-codegen.test.js.map +1 -1
  235. package/dist/backend/native-link-info-core.d.ts +8 -0
  236. package/dist/backend/native-link-info-core.js.map +1 -1
  237. package/dist/backend/native-profile.d.ts +14 -0
  238. package/dist/backend/native-profile.js +28 -0
  239. package/dist/backend/native-profile.js.map +1 -1
  240. package/dist/backend/native-profile.test.js +8 -1
  241. package/dist/backend/native-profile.test.js.map +1 -1
  242. package/dist/backend/native-toolchain.test.js +11 -11
  243. package/dist/backend/native-toolchain.test.js.map +1 -1
  244. package/dist/backend/runtime-abi.d.ts +2 -2
  245. package/dist/backend/runtime-abi.js +2 -2
  246. package/dist/backend/runtime-pack-core.d.ts +3 -1
  247. package/dist/backend/runtime-pack-core.js +2 -0
  248. package/dist/backend/runtime-pack-core.js.map +1 -1
  249. package/dist/backend/runtime-pack-native.d.ts +17 -5
  250. package/dist/backend/runtime-pack-native.js +186 -14
  251. package/dist/backend/runtime-pack-native.js.map +1 -1
  252. package/dist/backend/runtime-pack-native.test.js +160 -3
  253. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  254. package/dist/backend/runtime-pack-targets.test.js +2 -1
  255. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  256. package/dist/backend/runtime-pack.test.js +2 -1
  257. package/dist/backend/runtime-pack.test.js.map +1 -1
  258. package/dist/backend/target-cpu.d.ts +26 -0
  259. package/dist/backend/target-cpu.js +98 -0
  260. package/dist/backend/target-cpu.js.map +1 -0
  261. package/dist/backend/target-cpu.test.d.ts +1 -0
  262. package/dist/backend/target-cpu.test.js +38 -0
  263. package/dist/backend/target-cpu.test.js.map +1 -0
  264. package/dist/backend/vendor-archives.d.ts +4 -1
  265. package/dist/backend/vendor-archives.js +78 -4
  266. package/dist/backend/vendor-archives.js.map +1 -1
  267. package/dist/backend/vendor-inputs.d.ts +3 -1
  268. package/dist/backend/vendor-inputs.js +3 -1
  269. package/dist/backend/vendor-inputs.js.map +1 -1
  270. package/dist/backend/warm-cache.js +1 -0
  271. package/dist/backend/warm-cache.js.map +1 -1
  272. package/dist/cli/command.js +98 -12
  273. package/dist/cli/command.js.map +1 -1
  274. package/dist/cli/usage.d.ts +25 -1
  275. package/dist/cli/usage.js +40 -3
  276. package/dist/cli/usage.js.map +1 -1
  277. package/dist/compat/fetch-profile.d.ts +15 -6
  278. package/dist/compat/fetch-profile.js +519 -498
  279. package/dist/compat/fetch-profile.js.map +1 -1
  280. package/dist/compile-types.d.ts +14 -0
  281. package/dist/contracts/int32-elements.js +2 -1
  282. package/dist/contracts/int32-elements.js.map +1 -1
  283. package/dist/coverage/report.d.ts +14 -3
  284. package/dist/coverage/report.js +216 -0
  285. package/dist/coverage/report.js.map +1 -1
  286. package/dist/coverage/surface-manifest.js +25 -25
  287. package/dist/coverage/surface-manifest.js.map +1 -1
  288. package/dist/coverage/verdict-cache.d.ts +2 -0
  289. package/dist/coverage/verdict-cache.js +10 -1
  290. package/dist/coverage/verdict-cache.js.map +1 -1
  291. package/dist/diagnostics/diagnostic.d.ts +19 -0
  292. package/dist/diagnostics/diagnostic.js +53 -2
  293. package/dist/diagnostics/diagnostic.js.map +1 -1
  294. package/dist/diagnostics/envelope.d.ts +54 -0
  295. package/dist/diagnostics/envelope.js +7 -1
  296. package/dist/diagnostics/envelope.js.map +1 -1
  297. package/dist/diagnostics/render.d.ts +7 -0
  298. package/dist/diagnostics/render.js +15 -4
  299. package/dist/diagnostics/render.js.map +1 -1
  300. package/dist/executable/executable-cache.d.ts +6 -0
  301. package/dist/executable/executable-cache.js +5 -0
  302. package/dist/executable/executable-cache.js.map +1 -1
  303. package/dist/executable/executable-cache.test.js +3 -0
  304. package/dist/executable/executable-cache.test.js.map +1 -1
  305. package/dist/executable/prepare.js +5 -1
  306. package/dist/executable/prepare.js.map +1 -1
  307. package/dist/frontend/analysis.js +26 -2
  308. package/dist/frontend/analysis.js.map +1 -1
  309. package/dist/frontend/decl-projection.js +105 -10
  310. package/dist/frontend/decl-projection.js.map +1 -1
  311. package/dist/frontend/fork-target.js +67 -1
  312. package/dist/frontend/fork-target.js.map +1 -1
  313. package/dist/frontend/fork-target.test.js +43 -0
  314. package/dist/frontend/fork-target.test.js.map +1 -1
  315. package/dist/frontend/input-tracker.d.ts +4 -1
  316. package/dist/frontend/input-tracker.js +42 -4
  317. package/dist/frontend/input-tracker.js.map +1 -1
  318. package/dist/frontend/input-tracker.test.js +45 -0
  319. package/dist/frontend/input-tracker.test.js.map +1 -1
  320. package/dist/frontend/lowering/abstract-equality.js +38 -1
  321. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  322. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  323. package/dist/frontend/lowering/argument-counts.js +201 -0
  324. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  325. package/dist/frontend/lowering/array-values.d.ts +27 -0
  326. package/dist/frontend/lowering/array-values.js +112 -0
  327. package/dist/frontend/lowering/array-values.js.map +1 -1
  328. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  329. package/dist/frontend/lowering/binding-analysis.js +9 -3
  330. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  331. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  332. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  333. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  334. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  335. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  336. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  337. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  338. package/dist/frontend/lowering/builtins/compression.js +86 -5
  339. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/crypto.js +3 -1
  341. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  342. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  343. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  344. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  345. package/dist/frontend/lowering/builtins/dates.js +163 -9
  346. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
  348. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  349. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  350. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  351. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  352. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  353. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  355. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  356. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  357. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  358. package/dist/frontend/lowering/builtins/json.js +9 -3
  359. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  360. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  361. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  362. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  363. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  364. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  365. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  366. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  367. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  368. package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
  369. package/dist/frontend/lowering/builtins/promises.js +293 -139
  370. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  372. package/dist/frontend/lowering/builtins/readline.js +22 -11
  373. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  374. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  375. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  376. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  377. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  378. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  379. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  380. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  381. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  382. package/dist/frontend/lowering/builtins/x509.js +431 -0
  383. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  384. package/dist/frontend/lowering/call-arguments.js +44 -0
  385. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  386. package/dist/frontend/lowering/call-signatures.js +1 -2
  387. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  388. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  389. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  390. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  391. package/dist/frontend/lowering/cjs-inline-require.js +308 -5
  392. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  393. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  394. package/dist/frontend/lowering/class-attributes.js +52 -10
  395. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  396. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +23 -0
  397. package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
  398. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  399. package/dist/frontend/lowering/class-method-mutations.js +97 -26
  400. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  401. package/dist/frontend/lowering/class-method-values.js +71 -1
  402. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  403. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  404. package/dist/frontend/lowering/class-protocols.js +183 -1
  405. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  406. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  407. package/dist/frontend/lowering/class-prototypes.js +83 -2
  408. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  409. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  410. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  411. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  412. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  413. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  414. package/dist/frontend/lowering/coercions/structural.js +89 -10
  415. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  416. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  417. package/dist/frontend/lowering/coercions/unions.js +13 -6
  418. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  419. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  420. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  421. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  422. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  423. package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
  424. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  425. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  426. package/dist/frontend/lowering/containers/array-construction.js +107 -9
  427. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  428. package/dist/frontend/lowering/containers/array-methods.js +96 -8
  429. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  430. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  431. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  432. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  433. package/dist/frontend/lowering/containers/bytes.js +453 -45
  434. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  435. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  436. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  437. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  438. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  439. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  440. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  441. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  442. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  443. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  444. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  445. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  446. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  447. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  448. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  449. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  450. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  451. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  452. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  453. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  454. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  455. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  456. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  457. package/dist/frontend/lowering/date-values.d.ts +14 -0
  458. package/dist/frontend/lowering/date-values.js +254 -0
  459. package/dist/frontend/lowering/date-values.js.map +1 -0
  460. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  461. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  462. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  463. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  464. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  465. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  467. package/dist/frontend/lowering/expressions/array-literals.js +125 -26
  468. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  469. package/dist/frontend/lowering/expressions/binary.js +102 -26
  470. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/element-access.js +129 -6
  472. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  473. package/dist/frontend/lowering/expressions/identifiers.js +66 -4
  474. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  475. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  476. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  477. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  478. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  479. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  480. package/dist/frontend/lowering/expressions/property-access.js +121 -34
  481. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  482. package/dist/frontend/lowering/expressions/relational.js +76 -11
  483. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  484. package/dist/frontend/lowering/expressions/typeof.js +12 -1
  485. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  486. package/dist/frontend/lowering/expressions/updates.js +37 -11
  487. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  488. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  489. package/dist/frontend/lowering/f64-handles.js +16 -0
  490. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  491. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  492. package/dist/frontend/lowering/frozen-records.js +12 -4
  493. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  494. package/dist/frontend/lowering/function-context.d.ts +3 -0
  495. package/dist/frontend/lowering/function-context.js.map +1 -1
  496. package/dist/frontend/lowering/function-returns.js +30 -0
  497. package/dist/frontend/lowering/function-returns.js.map +1 -1
  498. package/dist/frontend/lowering/generic-functions.js +17 -6
  499. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  500. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  501. package/dist/frontend/lowering/indexed-unions.js +401 -0
  502. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  503. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  504. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  505. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  506. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  507. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  508. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  509. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  510. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  511. package/dist/frontend/lowering/js-collection-types.js +490 -0
  512. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  513. package/dist/frontend/lowering/key-order-witness.js +210 -32
  514. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  515. package/dist/frontend/lowering/key-order-witness.test.js +104 -4
  516. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  517. package/dist/frontend/lowering/lib-boundary.js +2 -2
  518. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  519. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  520. package/dist/frontend/lowering/lower-assert.js +298 -29
  521. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.js +116 -10
  525. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  526. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  527. package/dist/frontend/lowering/lower-classes.js +668 -222
  528. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  529. package/dist/frontend/lowering/lower-console.js +2 -1
  530. package/dist/frontend/lowering/lower-console.js.map +1 -1
  531. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  532. package/dist/frontend/lowering/lower-exprs.js +254 -3
  533. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  534. package/dist/frontend/lowering/lower-functions.js +7 -0
  535. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  536. package/dist/frontend/lowering/lower-generators.js +5 -4
  537. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  538. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  539. package/dist/frontend/lowering/lower-inspect.js +299 -57
  540. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  541. package/dist/frontend/lowering/lower-modules.js +49 -22
  542. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  543. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  544. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  545. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  546. package/dist/frontend/lowering/lower-node-module.js +1 -1
  547. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  548. package/dist/frontend/lowering/lower-server.js +126 -32
  549. package/dist/frontend/lowering/lower-server.js.map +1 -1
  550. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  551. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  552. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  553. package/dist/frontend/lowering/lower-stmts.js +393 -79
  554. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  555. package/dist/frontend/lowering/lower-stream.js +515 -121
  556. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  557. package/dist/frontend/lowering/lowerer.d.ts +82 -12
  558. package/dist/frontend/lowering/lowerer.js +317 -44
  559. package/dist/frontend/lowering/lowerer.js.map +1 -1
  560. package/dist/frontend/lowering/lowerer.test.js +1 -1
  561. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  562. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  563. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  564. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  565. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  566. package/dist/frontend/lowering/object-factory-new.js +20 -6
  567. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  568. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  569. package/dist/frontend/lowering/overload-choice.js +190 -0
  570. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  571. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  572. package/dist/frontend/lowering/private-brands.js +39 -0
  573. package/dist/frontend/lowering/private-brands.js.map +1 -1
  574. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  575. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  576. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  577. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  578. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  579. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  580. package/dist/frontend/lowering/site-dependencies.js +0 -15
  581. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  582. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  583. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  584. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  585. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  586. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  587. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  588. package/dist/frontend/lowering/surfaces.js +1630 -1540
  589. package/dist/frontend/lowering/surfaces.js.map +1 -1
  590. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  591. package/dist/frontend/lowering/symbol-fields.js +45 -2
  592. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  593. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  594. package/dist/frontend/lowering/union-narrow.js +6 -3
  595. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  596. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  597. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  598. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  599. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  600. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  601. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  602. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  603. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  604. package/dist/frontend/npm-static-prune.js +152 -111
  605. package/dist/frontend/npm-static-prune.js.map +1 -1
  606. package/dist/frontend/npm-static.js +35 -32
  607. package/dist/frontend/npm-static.js.map +1 -1
  608. package/dist/frontend/package-shims.d.ts +7 -4
  609. package/dist/frontend/package-shims.js +39 -40
  610. package/dist/frontend/package-shims.js.map +1 -1
  611. package/dist/frontend/pipeline-native.d.ts +2 -2
  612. package/dist/frontend/pipeline-native.js +2 -2
  613. package/dist/frontend/pipeline-native.js.map +1 -1
  614. package/dist/frontend/pipeline.d.ts +19 -2
  615. package/dist/frontend/pipeline.js +103 -12
  616. package/dist/frontend/pipeline.js.map +1 -1
  617. package/dist/frontend/program-analysis.d.ts +7 -1
  618. package/dist/frontend/program-analysis.js +8 -0
  619. package/dist/frontend/program-analysis.js.map +1 -1
  620. package/dist/frontend/program.d.ts +28 -5
  621. package/dist/frontend/program.js +422 -76
  622. package/dist/frontend/program.js.map +1 -1
  623. package/dist/frontend/resolve.d.ts +2 -0
  624. package/dist/frontend/resolve.js +5 -0
  625. package/dist/frontend/resolve.js.map +1 -1
  626. package/dist/frontend/services.d.ts +3 -0
  627. package/dist/frontend/services.js +31 -4
  628. package/dist/frontend/services.js.map +1 -1
  629. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  630. package/dist/frontend/shape-inference/analyze.js +3138 -0
  631. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  632. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  633. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  634. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  635. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  636. package/dist/frontend/shape-inference/domain.js +104 -0
  637. package/dist/frontend/shape-inference/domain.js.map +1 -0
  638. package/dist/frontend/shape-inference/index.d.ts +7 -0
  639. package/dist/frontend/shape-inference/index.js +19 -0
  640. package/dist/frontend/shape-inference/index.js.map +1 -0
  641. package/dist/frontend/shape-inference/report.d.ts +21 -0
  642. package/dist/frontend/shape-inference/report.js +348 -0
  643. package/dist/frontend/shape-inference/report.js.map +1 -0
  644. package/dist/frontend/token-equivalence.d.ts +6 -0
  645. package/dist/frontend/token-equivalence.js +66 -9
  646. package/dist/frontend/token-equivalence.js.map +1 -1
  647. package/dist/frontend/token-equivalence.test.js +33 -1
  648. package/dist/frontend/token-equivalence.test.js.map +1 -1
  649. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  650. package/dist/frontend/ts7/checker-features.js +45 -0
  651. package/dist/frontend/ts7/checker-features.js.map +1 -0
  652. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  653. package/dist/frontend/ts7/checker-features.test.js +40 -0
  654. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  655. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  656. package/dist/frontend/ts7/checker-server.js +46 -0
  657. package/dist/frontend/ts7/checker-server.js.map +1 -0
  658. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  659. package/dist/frontend/ts7/checker-server.test.js +38 -0
  660. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  661. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  662. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  663. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  664. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  665. package/dist/frontend/ts7/native-api.d.ts +1 -0
  666. package/dist/frontend/ts7/native-api.js +25 -2
  667. package/dist/frontend/ts7/native-api.js.map +1 -1
  668. package/dist/frontend/ts7/native-process.d.ts +9 -2
  669. package/dist/frontend/ts7/native-process.js +22 -4
  670. package/dist/frontend/ts7/native-process.js.map +1 -1
  671. package/dist/frontend/ts7/program-host.d.ts +11 -0
  672. package/dist/frontend/ts7/program-host.js +36 -22
  673. package/dist/frontend/ts7/program-host.js.map +1 -1
  674. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  675. package/dist/frontend/ts7/semantic-json.js +25 -5
  676. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  677. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  678. package/dist/frontend/ts7/semantic-model.js +8 -1
  679. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  680. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  681. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  682. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  683. package/dist/frontend/ts7/semantic-types.js +1 -1
  684. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  685. package/dist/frontend/ts7/source-parser.js +3 -1
  686. package/dist/frontend/ts7/source-parser.js.map +1 -1
  687. package/dist/frontend/tsc-codes.js +10 -0
  688. package/dist/frontend/tsc-codes.js.map +1 -1
  689. package/dist/frontend/type-mapper.d.ts +18 -6
  690. package/dist/frontend/type-mapper.js +205 -44
  691. package/dist/frontend/type-mapper.js.map +1 -1
  692. package/dist/index.d.ts +44 -3
  693. package/dist/index.js +39 -8
  694. package/dist/index.js.map +1 -1
  695. package/dist/ir/builtin-effects.js +37 -0
  696. package/dist/ir/builtin-effects.js.map +1 -1
  697. package/dist/ir/builtin-signatures.d.ts +7 -2
  698. package/dist/ir/builtin-signatures.js +5104 -4894
  699. package/dist/ir/builtin-signatures.js.map +1 -1
  700. package/dist/ir/callback-specialization.d.ts +4 -2
  701. package/dist/ir/callback-specialization.js +24 -9
  702. package/dist/ir/callback-specialization.js.map +1 -1
  703. package/dist/ir/capture-values.js +4 -2
  704. package/dist/ir/capture-values.js.map +1 -1
  705. package/dist/ir/char-unit-locals.d.ts +12 -2
  706. package/dist/ir/char-unit-locals.js +400 -58
  707. package/dist/ir/char-unit-locals.js.map +1 -1
  708. package/dist/ir/char-unit-locals.test.js +111 -0
  709. package/dist/ir/char-unit-locals.test.js.map +1 -1
  710. package/dist/ir/constant-globals.js +18 -4
  711. package/dist/ir/constant-globals.js.map +1 -1
  712. package/dist/ir/expression-inlining.d.ts +15 -0
  713. package/dist/ir/expression-inlining.js +166 -0
  714. package/dist/ir/expression-inlining.js.map +1 -0
  715. package/dist/ir/expression-inlining.test.d.ts +1 -0
  716. package/dist/ir/expression-inlining.test.js +123 -0
  717. package/dist/ir/expression-inlining.test.js.map +1 -0
  718. package/dist/ir/function-references.js +2 -0
  719. package/dist/ir/function-references.js.map +1 -1
  720. package/dist/ir/function-references.test.js +6 -0
  721. package/dist/ir/function-references.test.js.map +1 -1
  722. package/dist/ir/int32-arrays.d.ts +27 -6
  723. package/dist/ir/int32-arrays.js +106 -18
  724. package/dist/ir/int32-arrays.js.map +1 -1
  725. package/dist/ir/int32-slots.d.ts +26 -1
  726. package/dist/ir/int32-slots.js +291 -5
  727. package/dist/ir/int32-slots.js.map +1 -1
  728. package/dist/ir/int32-slots.test.js +38 -0
  729. package/dist/ir/int32-slots.test.js.map +1 -1
  730. package/dist/ir/integer-loop-facts.d.ts +5 -0
  731. package/dist/ir/integer-loop-facts.js +90 -1
  732. package/dist/ir/integer-loop-facts.js.map +1 -1
  733. package/dist/ir/integer-loops.d.ts +14 -1
  734. package/dist/ir/integer-loops.js +107 -11
  735. package/dist/ir/integer-loops.js.map +1 -1
  736. package/dist/ir/integer-loops.test.js +70 -0
  737. package/dist/ir/integer-loops.test.js.map +1 -1
  738. package/dist/ir/integer-ranges.js +18 -2
  739. package/dist/ir/integer-ranges.js.map +1 -1
  740. package/dist/ir/integer-ranges.test.js +64 -4
  741. package/dist/ir/integer-ranges.test.js.map +1 -1
  742. package/dist/ir/ir.d.ts +63 -11
  743. package/dist/ir/ir.js +47 -7
  744. package/dist/ir/ir.js.map +1 -1
  745. package/dist/ir/ir.test.js +2 -1
  746. package/dist/ir/ir.test.js.map +1 -1
  747. package/dist/ir/js-ic.d.ts +10 -3
  748. package/dist/ir/js-ic.js +14 -2
  749. package/dist/ir/js-ic.js.map +1 -1
  750. package/dist/ir/js-ic.test.js +11 -0
  751. package/dist/ir/js-ic.test.js.map +1 -1
  752. package/dist/ir/node-index.d.ts +7 -0
  753. package/dist/ir/node-index.js +32 -0
  754. package/dist/ir/node-index.js.map +1 -1
  755. package/dist/ir/receiver-readers.d.ts +6 -1
  756. package/dist/ir/receiver-readers.js +53 -28
  757. package/dist/ir/receiver-readers.js.map +1 -1
  758. package/dist/ir/row-pairs.d.ts +15 -0
  759. package/dist/ir/row-pairs.js +373 -0
  760. package/dist/ir/row-pairs.js.map +1 -0
  761. package/dist/ir/row-pairs.test.d.ts +1 -0
  762. package/dist/ir/row-pairs.test.js +129 -0
  763. package/dist/ir/row-pairs.test.js.map +1 -0
  764. package/dist/ir/runtime-features.d.ts +17 -4
  765. package/dist/ir/runtime-features.js +94 -13
  766. package/dist/ir/runtime-features.js.map +1 -1
  767. package/dist/ir/scalar-records.d.ts +15 -0
  768. package/dist/ir/scalar-records.js +301 -1
  769. package/dist/ir/scalar-records.js.map +1 -1
  770. package/dist/ir/scalar-records.test.js +181 -1
  771. package/dist/ir/scalar-records.test.js.map +1 -1
  772. package/dist/ir/self-captures.js +8 -0
  773. package/dist/ir/self-captures.js.map +1 -1
  774. package/dist/ir/validate.js +78 -28
  775. package/dist/ir/validate.js.map +1 -1
  776. package/dist/library/fence-eval.js +4 -4
  777. package/dist/library/fence-eval.js.map +1 -1
  778. package/dist/library/ir-policy.js +5 -0
  779. package/dist/library/ir-policy.js.map +1 -1
  780. package/dist/library/library-cache.d.ts +1 -0
  781. package/dist/library/library-cache.js +1 -0
  782. package/dist/library/library-cache.js.map +1 -1
  783. package/dist/library/library-cache.test.js +13 -0
  784. package/dist/library/library-cache.test.js.map +1 -1
  785. package/dist/native/cache.d.ts +5 -1
  786. package/dist/native/cache.js +15 -3
  787. package/dist/native/cache.js.map +1 -1
  788. package/dist/native/cli.js +6 -0
  789. package/dist/native/cli.js.map +1 -1
  790. package/dist/native/compiler.d.ts +3 -0
  791. package/dist/native/compiler.js +72 -26
  792. package/dist/native/compiler.js.map +1 -1
  793. package/dist/native/compiler.test.js +87 -2
  794. package/dist/native/compiler.test.js.map +1 -1
  795. package/dist/native/executable-cache-open.test.d.ts +1 -0
  796. package/dist/native/executable-cache-open.test.js +80 -0
  797. package/dist/native/executable-cache-open.test.js.map +1 -0
  798. package/dist/native/executable-cache.d.ts +43 -3
  799. package/dist/native/executable-cache.js +177 -36
  800. package/dist/native/executable-cache.js.map +1 -1
  801. package/dist/native/executable-cache.test.js +103 -0
  802. package/dist/native/executable-cache.test.js.map +1 -1
  803. package/dist/native/prepare.d.ts +1 -1
  804. package/dist/native/prepare.js +49 -17
  805. package/dist/native/prepare.js.map +1 -1
  806. package/dist/native/prepare.test.js +69 -3
  807. package/dist/native/prepare.test.js.map +1 -1
  808. package/dist/native/sanitizer.d.ts +1 -1
  809. package/dist/native/sanitizer.js +17 -3
  810. package/dist/native/sanitizer.js.map +1 -1
  811. package/dist/native/sanitizer.test.js +4 -0
  812. package/dist/native/sanitizer.test.js.map +1 -1
  813. package/dist/node-islands/classify.d.ts +14 -0
  814. package/dist/node-islands/classify.js +114 -0
  815. package/dist/node-islands/classify.js.map +1 -0
  816. package/dist/node-islands/detect.d.ts +13 -0
  817. package/dist/node-islands/detect.js +805 -0
  818. package/dist/node-islands/detect.js.map +1 -0
  819. package/dist/node-islands/detect.test.d.ts +1 -0
  820. package/dist/node-islands/detect.test.js +136 -0
  821. package/dist/node-islands/detect.test.js.map +1 -0
  822. package/dist/node-islands/origin.d.ts +21 -0
  823. package/dist/node-islands/origin.js +60 -0
  824. package/dist/node-islands/origin.js.map +1 -0
  825. package/dist/node-islands/policy.d.ts +49 -0
  826. package/dist/node-islands/policy.js +130 -0
  827. package/dist/node-islands/policy.js.map +1 -0
  828. package/dist/node-islands/report.d.ts +22 -0
  829. package/dist/node-islands/report.js +326 -0
  830. package/dist/node-islands/report.js.map +1 -0
  831. package/dist/node-islands/report.test.d.ts +1 -0
  832. package/dist/node-islands/report.test.js +228 -0
  833. package/dist/node-islands/report.test.js.map +1 -0
  834. package/dist/node-islands/rules.d.ts +20 -0
  835. package/dist/node-islands/rules.js +91 -0
  836. package/dist/node-islands/rules.js.map +1 -0
  837. package/dist/node-islands/scan.d.ts +53 -0
  838. package/dist/node-islands/scan.js +104 -0
  839. package/dist/node-islands/scan.js.map +1 -0
  840. package/dist/node-islands/summary.d.ts +78 -0
  841. package/dist/node-islands/summary.js +26 -0
  842. package/dist/node-islands/summary.js.map +1 -0
  843. package/dist/project-config.d.ts +50 -0
  844. package/dist/project-config.js +372 -0
  845. package/dist/project-config.js.map +1 -0
  846. package/dist/project-config.test.d.ts +1 -0
  847. package/dist/project-config.test.js +154 -0
  848. package/dist/project-config.test.js.map +1 -0
  849. package/dist/wasm/discover.js +6 -31
  850. package/dist/wasm/discover.js.map +1 -1
  851. package/package.json +20 -20
  852. package/surface-manifest.json +21 -38
@@ -1,4 +1,5 @@
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";
@@ -23,18 +24,20 @@ import { InternalCompilerError } from "../../errors.js";
23
24
  * explicit resource management, and blocked-binding poisoning. */
24
25
  import * as ts from "../ts7/adapter.js";
25
26
  import { lowerOptionalIndex } from "./undefined-index.js";
27
+ import { builtinNamespaceValue } from "./builtin-namespaces.js";
26
28
  import { processDataMemberValue, programReadsExitCode } from "./builtins/process.js";
27
29
  import { requireInitFlagStmt } from "./require-initialization.js";
28
30
  import { isJsonRequireDecl } from "./json-require.js";
31
+ import { isTimeValueDateDeclaration } from "./date-values.js";
29
32
  import { bindingSource } from "../binding-source.js";
30
33
  import { lowerConstructorReturn } from "./constructor-returns.js";
31
- import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, } from "./cjs-inline-require.js";
34
+ import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, splitRequireAssignmentOf, splitRequireBindingOf, splitRequireBindingOfIdent, splitRequireEarlyReadOf, wholeExportSymbolOfModule, } from "./cjs-inline-require.js";
32
35
  import { cjsExportMemberWriteGlobalOf, isCjsExportsIdentifier, isCjsModuleExports, isFreshExportsReset, } from "./cjs-exports-object.js";
33
36
  import { isDeadTscHelperDecl, tscInteropBindingOfDecl } from "./cjs-tsc-interop.js";
34
37
  import { arrayValueRead, arrayValueStore, arrayValueType, unionArrayValueRead, lowerSafeIndexRead, } from "./array-values.js";
35
38
  import { lowerForAwaitGenerator, lowerForOfGenerator, lowerYieldStarStatement, } from "./lower-generators.js";
36
39
  import { classAsyncGeneratorIterator, lowerForAwaitBuiltin } from "./lower-async-iteration.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";
40
+ 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";
38
41
  import { PoisonError, boundIdentifiersOf, dynFallbackType, neverTaintedJsType, staticImportNamespaceType, } from "./lowerer.js";
39
42
  import { enforceLibBoundary, lowerSurplusCalls } from "./lib-boundary.js";
40
43
  import { cjsExportAssignmentOf, cjsExportChainOf, cjsVoidInitPreambleReals, cjsExportDiscardReason, cjsExportTargetLiteral, isCjsJsFile, isEsModuleStamp, isJsSourceFile, locOf, requireEarlyReference, requireSpecOf, } from "../program.js";
@@ -50,7 +53,7 @@ import { lowerForOfHelperChain } from "./containers/iterator-helpers.js";
50
53
  import { objectIterOverIndexShape } from "./containers/indexed-objects.js";
51
54
  import { strCharsCall } from "./containers/array-construction.js";
52
55
  import { bindingContextualGenericFnNodeOf, bindingGenericFnAliasInfoOf, bindingGenericFnInfoOf, bindingGenericFnNodeOf, genericBindingPresenceStore, genericBindingStoredValue, implicitLocalFnInfoOf, implicitLocalFnNodeOf, implicitMethodCallInfersReturn, genericLocalClassBinding, } from "./generic-functions.js";
53
- import { bindingNeverReassigned, deadUnmappableBinding, nullishExprUnitOf, nullishGenericBindingUnitOf, } from "./binding-analysis.js";
56
+ import { bindingNeverReassigned, deadUnmappableBinding, fileWritesBinding, nullishExprUnitOf, nullishGenericBindingUnitOf, } from "./binding-analysis.js";
54
57
  import { hasExplicitJsDocReturn } from "./function-returns.js";
55
58
  import { recordKeysArrayCall } from "./lower-calls.js";
56
59
  import { registerOverloadedCallableAlias } from "./call-signatures.js";
@@ -60,7 +63,7 @@ import { classStaticDataFor } from "./class-static-data.js";
60
63
  import { objectFactorySignature } from "./object-factory-new.js";
61
64
  import { isClassCallback, lowerClassCallbackAssign } from "./class-callbacks.js";
62
65
  import { classForInHasKey, classPropertiesHelper } from "./class-dynamic-dispatch.js";
63
- import { genericIfaceBindingKeepsClass, superConditionLead } from "./lower-classes.js";
66
+ import { genericIfaceBindingKeepsClass, lowerClassStaticRead, staticReceiverClass, superConditionLead, } from "./lower-classes.js";
64
67
  import { lowerStreamUnderscoreAssign, streamClassAliasDecl, streamSidesOf, } from "./lower-stream.js";
65
68
  import { staticAssertInstanceDecl } from "./assert-instances.js";
66
69
  import { lowerHttpResPropertyAssignment, lowerHttpServerTimeoutAssignment, lowerNetServerMaxConnectionsAssignment, lowerServerCloseOverrideAssignment, } from "./lower-server.js";
@@ -90,6 +93,7 @@ import { constituentTypes } from "../ts7/checker.js";
90
93
  import { npmStaticPackageOfPath } from "../npm-static.js";
91
94
  import { fenceNodeModuleMutation } from "./lower-node-module.js";
92
95
  import { fencePerfEntryKeyWalk } from "./builtins/performance.js";
96
+ import { fenceX509KeyWalk } from "./builtins/x509.js";
93
97
  import { classGeneratorIterable } from "./class-iterables.js";
94
98
  import { iterableUnionOf, lowerForOfIterable } from "./iterable-values.js";
95
99
  /** An opted package's directly-returned empty array may take the function's
@@ -1371,7 +1375,39 @@ const THROWN_AS_DYN = new Set([
1371
1375
  "bytes",
1372
1376
  "func",
1373
1377
  "regex",
1378
+ "date",
1374
1379
  ]);
1380
+ /** A `return` at the top level of a CommonJS module (preflight admits it
1381
+ * there only): it ends the module's evaluation, and its value is
1382
+ * evaluated and discarded, as Node's module wrapper does. Top-level
1383
+ * bindings and export assignments after it would be left uninitialized
1384
+ * where Node leaves them in their temporal dead zone or absent, so a
1385
+ * module with any keeps a refusal. Null for a return inside a function. */
1386
+ function lowerModuleLevelReturn(lowerer, stmt) {
1387
+ let top = stmt;
1388
+ while (top.parent !== undefined && !ts.isSourceFile(top.parent)) {
1389
+ if (ts.isFunctionLike(top.parent) || ts.isClassStaticBlockDeclaration(top.parent))
1390
+ return null;
1391
+ top = top.parent;
1392
+ }
1393
+ const sf = top.parent;
1394
+ if (sf === undefined || !ts.isSourceFile(sf))
1395
+ return null;
1396
+ const stmts = sf.statements.nodes;
1397
+ const later = stmts.slice(stmts.indexOf(top) + 1);
1398
+ if (later.some((s) => ts.isVariableStatement(s) || ts.isClassDeclaration(s) || cjsExportAssignmentOf(s) !== null)) {
1399
+ lowerer.unsupported("SC1090", stmt, "a top-level return in a CommonJS module that declares variables or classes, or assigns exports, after it");
1400
+ }
1401
+ const loc = locOf(stmt);
1402
+ const ret = { kind: "return", value: null, loc };
1403
+ if (!stmt.expression)
1404
+ return ret;
1405
+ return {
1406
+ kind: "block",
1407
+ body: [{ kind: "exprStmt", expr: lowerer.lowerExpr(stmt.expression), loc }, ret],
1408
+ loc,
1409
+ };
1410
+ }
1375
1411
  export function lowerStmt(lowerer, stmt) {
1376
1412
  if (ownPrototypeResetStatement(lowerer, stmt))
1377
1413
  return { kind: "block", body: [], loc: locOf(stmt) };
@@ -1473,6 +1509,9 @@ export function lowerStmt(lowerer, stmt) {
1473
1509
  if (ts.isLabeledStatement(stmt))
1474
1510
  return lowerLabeled(lowerer, stmt);
1475
1511
  if (ts.isReturnStatement(stmt)) {
1512
+ const moduleReturn = lowerModuleLevelReturn(lowerer, stmt);
1513
+ if (moduleReturn)
1514
+ return moduleReturn;
1476
1515
  // Implicit-any instance RETURN INFERENCE (function-returns.ts
1477
1516
  // resolveInferredReturn): the value lowers BARE and the statement
1478
1517
  // records itself — the post-pass settles the instance's return type
@@ -1558,9 +1597,7 @@ export function lowerStmt(lowerer, stmt) {
1558
1597
  return { kind: "rethrow", localId: caughtLocal.id, loc: locOf(stmt) };
1559
1598
  }
1560
1599
  // Exception-representable values move into the runtime's exception
1561
- // cell. `throw f()` of a void call has no value; Date has numeric
1562
- // storage internally, but cannot preserve its object kind through the
1563
- // untyped catch boundary. Reject both rather than changing JS identity.
1600
+ // cell. `throw f()` of a void call has no value.
1564
1601
  let value = lowerer.lowerExpr(stmt.expression);
1565
1602
  if (value.type.kind === "void")
1566
1603
  lowerer.badType(stmt.expression, lowerer.typeOf(stmt.expression));
@@ -1574,15 +1611,12 @@ export function lowerStmt(lowerer, stmt) {
1574
1611
  value = { kind: "dynFrom", value, liveRef: true, type: DYN, loc: locOf(stmt.expression) };
1575
1612
  }
1576
1613
  else if (THROWN_AS_DYN.has(value.type.kind) && lowerer.dynConvertible(value.type)) {
1577
- // Arrays, Maps, Sets, typed arrays, Buffers, functions, regexes and
1578
- // unions over them keep their identity and contents the same way:
1579
- // the catch binding, `typeof`, `instanceof`, `Array.isArray`,
1580
- // inspection and typed views read the thrown object.
1614
+ // Arrays, Maps, Sets, typed arrays, Buffers, functions, regexes,
1615
+ // Dates and unions over them keep their identity and contents the
1616
+ // same way: the catch binding, `typeof`, `instanceof`,
1617
+ // `Array.isArray`, inspection and typed views read the thrown object.
1581
1618
  value = lowerer.coerceInto(stmt.expression, value, DYN);
1582
1619
  }
1583
- if (value.type.kind === "date") {
1584
- lowerer.unsupported("SC1090", stmt.expression, "throwing Date values (catch bindings cannot preserve Date's object kind; throw an Error or primitive instead)");
1585
- }
1586
1620
  // A dyn throw rides the REF cell arm (scr_throw_ref over the checked-dynamic tree
1587
1621
  // node — identity preserved through catch bindings, caughtToDyn
1588
1622
  // passes it back by reference). The JS-lane traced-call shape:
@@ -1662,6 +1696,19 @@ export function lowerVarStatement(lowerer, stmt) {
1662
1696
  });
1663
1697
  }
1664
1698
  function lowerVarDeclarator(lowerer, stmt, decl, isConst, isLet) {
1699
+ // `var m; m = require("./x")`: the declaration is alias plumbing; the
1700
+ // assignment owns the module's run-once %init (cjs-inline-require.ts).
1701
+ // A read that code before the assignment can reach keeps Node's hoisted
1702
+ // `undefined` divergence visible at build time, like a var require
1703
+ // declaration below runnable code.
1704
+ const split = splitRequireBindingOf(lowerer, decl);
1705
+ if (split !== null) {
1706
+ const early = splitRequireEarlyReadOf(lowerer, split);
1707
+ if (early !== null) {
1708
+ 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)`);
1709
+ }
1710
+ return [];
1711
+ }
1665
1712
  // The canonical ESM bridge to a compiled program module. Like a
1666
1713
  // top-level CommonJS require declaration, the binding is alias
1667
1714
  // plumbing while the dependency evaluates at this statement's
@@ -2290,7 +2337,7 @@ export function lowerBindingPattern(lowerer, pattern, srcRef, srcType, isLet, ou
2290
2337
  const itRef = () => ({ kind: "varRef", localId: it.id, type: citPat.iterT, loc });
2291
2338
  for (const el of pattern.elements.nodes) {
2292
2339
  const stepLoc = locOf(el);
2293
- const step = lowerer.classIteratorNextCall(citPat, itRef(), stepLoc);
2340
+ const step = lowerer.classIteratorNextCall(citPat, itRef(), null, stepLoc);
2294
2341
  if (ts.isOmittedExpression(el) || el.name === undefined) {
2295
2342
  out.push({ kind: "exprStmt", expr: step, loc: stepLoc });
2296
2343
  continue;
@@ -2564,6 +2611,16 @@ export function lowerBindingPattern(lowerer, pattern, srcRef, srcType, isLet, ou
2564
2611
  lowerer.lowerBindingPattern(pattern, () => lowerer.coerceToExpected(srcRef(), DYN), DYN, isLet, out, dynSpell, allowDynObject);
2565
2612
  return;
2566
2613
  }
2614
+ // A class in a JavaScript file, destructured through its own name
2615
+ // (`const { ANY, parse } = Comparator`): each element is the static
2616
+ // read `Comparator.ANY` — the static getter, field or method as Node
2617
+ // reads it, with the element's default applied when the read answers
2618
+ // undefined. Other class-valued sources keep the refusal below.
2619
+ if (srcType.kind === "classval" &&
2620
+ ts.isObjectBindingPattern(pattern) &&
2621
+ isJsSourceFile(ts.getSourceFileOfNode(pattern)) &&
2622
+ lowerClassValuePattern(lowerer, pattern, isLet, out))
2623
+ return;
2567
2624
  if (srcType.kind === "dyn") {
2568
2625
  // A runtime computed first key evaluates after RequireObjectCoercible:
2569
2626
  // a nullish source throws before the key's side effects run. Later
@@ -3559,7 +3616,8 @@ function stdlibGlobalTokenDestructure(lowerer, decl, isLet) {
3559
3616
  value =
3560
3617
  canonical === "crypto"
3561
3618
  ? { kind: "libCall", fn: "webcrypto.object", args: [], type: DYN, loc: locOf(el) }
3562
- : builtinGlobalValue(canonical, locOf(el), true);
3619
+ : (builtinNamespaceValue(lowerer, canonical, locOf(el)) ??
3620
+ builtinGlobalValue(canonical, locOf(el), true));
3563
3621
  }
3564
3622
  else if (globalName === "console" && !CONSOLE_CALL_MEMBERS.has(propName)) {
3565
3623
  token = `[builtin console.${propName}]`;
@@ -3636,6 +3694,46 @@ function stdlibGlobalTokenDestructure(lowerer, decl, isLet) {
3636
3694
  }
3637
3695
  return out;
3638
3696
  }
3697
+ /** `const { ANY, parse } = Comparator` in a JavaScript file, where the
3698
+ * declaration's initializer names the class exactly (staticReceiverClass):
3699
+ * one static read per element, left to right. False, with nothing
3700
+ * emitted, for other sources (a parameter or nested pattern over a class
3701
+ * value), which keep the class-value refusal. */
3702
+ function lowerClassValuePattern(lowerer, pattern, isLet, out) {
3703
+ const decl = pattern.parent;
3704
+ if (!ts.isVariableDeclaration(decl) || decl.initializer === undefined)
3705
+ return false;
3706
+ let receiver = decl.initializer;
3707
+ while (ts.isParenthesizedExpression(receiver))
3708
+ receiver = receiver.expression;
3709
+ const info = staticReceiverClass(lowerer, receiver);
3710
+ if (info === null)
3711
+ return false;
3712
+ for (const el of pattern.elements.nodes) {
3713
+ if (el.name === undefined)
3714
+ continue;
3715
+ if (el.dotDotDotToken)
3716
+ lowerer.unsupported("SC1031", el, "rest bindings over class values (the rest object copies the class's own enumerable statics)");
3717
+ const prop = el.propertyName ?? el.name;
3718
+ const name = ts.isIdentifier(prop) ||
3719
+ ts.isComputedPropertyName(prop) ||
3720
+ ts.isStringLiteralLike(prop) ||
3721
+ ts.isNumericLiteral(prop)
3722
+ ? patternKeyNameOf(lowerer, prop)
3723
+ : null;
3724
+ if (name === null)
3725
+ lowerer.unsupported("SC1031", el, "destructuring with computed keys that do not fold to one property name");
3726
+ if (name === "prototype" || name.startsWith("#"))
3727
+ lowerer.unsupported("SC1031", el, `destructuring '${name}' from a class value`);
3728
+ let value = lowerClassStaticRead(lowerer, info, name, receiver, receiver);
3729
+ if (value === null)
3730
+ lowerer.unsupported("SC1031", el, `destructuring the property '${name}' the class '${info.def.jsName ?? info.def.name}' does not declare as a static`);
3731
+ if (el.initializer)
3732
+ value = applyBindingDefault(lowerer, el, value);
3733
+ lowerer.bindPatternTarget(el.name, value, isLet, out);
3734
+ }
3735
+ return true;
3736
+ }
3639
3737
  /** `x = dflt` on a pattern position whose source value always EXISTS
3640
3738
  * (tuple positions, record fields): JS evaluates the default exactly
3641
3739
  * when the value is undefined — the undefined-arm ternary, lazy, so
@@ -4535,6 +4633,15 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4535
4633
  if (alias)
4536
4634
  return alias;
4537
4635
  }
4636
+ // A Date local whose identity no use observes stores its time value.
4637
+ if (isTimeValueDateDeclaration(lowerer, decl)) {
4638
+ const loc = locOf(decl);
4639
+ const date = lowerer.lowerExprExpecting(decl.initializer, DATE_T);
4640
+ const local = lowerer.declareLocal(decl.name, decl.name.text, F64, isLet || lowerer.timeValueDateWrites.has(decl));
4641
+ lowerer.timeValueDateLocals.add(local);
4642
+ const init = { kind: "libCall", fn: "date.getTime", args: [date], type: F64, loc };
4643
+ return { kind: "varDecl", localId: local.id, init, loc };
4644
+ }
4538
4645
  // A NULLISH generic binding (`const i: I<A & B> = null as any` — the
4539
4646
  // declared type has no mapping, the value is provably null/undefined
4540
4647
  // forever): no storage exists; reads know the value (member reads and
@@ -5833,7 +5940,7 @@ function lowerDynSwitch(lowerer, stmt, disc, labels) {
5833
5940
  loc: locOf(expression),
5834
5941
  };
5835
5942
  }
5836
- if (test.type.kind === "date" || !lowerer.dynConvertible(test.type)) {
5943
+ if (!lowerer.dynConvertible(test.type)) {
5837
5944
  lowerer.unsupported("SC1100", expression, "switch case values that cannot compare strictly with 'unknown'");
5838
5945
  }
5839
5946
  return {
@@ -6126,6 +6233,63 @@ function lowerDeleteStatement(lowerer, expr) {
6126
6233
  }
6127
6234
  lowerer.unsupported("SC1090", expr, `'delete' on '${lowerer.fmt(obj.type)}' receivers (process.env keys and pure Record<string, T> keys delete)`);
6128
6235
  }
6236
+ /** True when the `var`/`let` binding `nameNode` names cannot change after
6237
+ * the top-level CommonJS export statement `exportNode` that exports it by
6238
+ * reference, so importers read the value Node copies at the export: its
6239
+ * module's top level declares it once, with an initializer that runs
6240
+ * before the export, and nothing assigns it. The initializer runs earlier
6241
+ * in the same module, or in a module the exporting module required before
6242
+ * the export (`var hljs = require('./core'); module.exports = hljs;` over
6243
+ * highlight.js's `var highlight = HLJS({}); module.exports = highlight;`). */
6244
+ function unchangedAfterExport(lowerer, nameNode, exportNode) {
6245
+ const topLevelDeclaration = (symbol) => {
6246
+ const decl = symbol.declarations.length === 1 ? symbol.declarations[0] : undefined;
6247
+ return decl !== undefined &&
6248
+ ts.isVariableDeclaration(decl) &&
6249
+ ts.isIdentifier(decl.name) &&
6250
+ decl.initializer !== undefined &&
6251
+ ts.isVariableDeclarationList(decl.parent) &&
6252
+ ts.isVariableStatement(decl.parent.parent) &&
6253
+ ts.isSourceFile(decl.parent.parent.parent)
6254
+ ? decl
6255
+ : null;
6256
+ };
6257
+ const exportFile = ts.getSourceFileOfNode(exportNode);
6258
+ let exportStatement = exportNode;
6259
+ for (let parent = exportNode.parent; parent !== undefined && !ts.isSourceFile(parent);) {
6260
+ if (ts.isFunctionLike(parent) || ts.isClassDeclaration(parent) || ts.isClassExpression(parent))
6261
+ return false;
6262
+ exportStatement = parent;
6263
+ parent = parent.parent;
6264
+ }
6265
+ const runsBeforeExport = (decl) => {
6266
+ const statement = decl.parent?.parent;
6267
+ return statement?.parent === exportFile && statement.end <= exportStatement.pos;
6268
+ };
6269
+ const sym = lowerer.resolveValueSymbol(nameNode);
6270
+ const decl = sym ? topLevelDeclaration(sym) : null;
6271
+ if (!sym || !decl || !bindingNeverReassigned(lowerer, sym, decl))
6272
+ return false;
6273
+ if (ts.getSourceFileOfNode(decl) === exportFile)
6274
+ return runsBeforeExport(decl);
6275
+ // A binding of another module: the exporting module's own binding
6276
+ // `nameNode` names holds that module's require, evaluated before the
6277
+ // export, and this file does not assign the binding either.
6278
+ const local = lowerer.checker.getSymbolAtLocation(nameNode);
6279
+ const localDecl = local ? topLevelDeclaration(local) : null;
6280
+ if (!localDecl || !runsBeforeExport(localDecl))
6281
+ return false;
6282
+ let init = localDecl.initializer;
6283
+ while (ts.isParenthesizedExpression(init))
6284
+ init = init.expression;
6285
+ if (!ts.isCallExpression(init) ||
6286
+ !ts.isIdentifier(init.expression) ||
6287
+ init.expression.text !== "require" ||
6288
+ init.arguments.nodes.length !== 1 ||
6289
+ !ts.isStringLiteralLike(init.arguments.nodes[0]))
6290
+ return false;
6291
+ return !fileWritesBinding(sym, exportFile, (ident) => lowerer.resolveValueSymbol(ident));
6292
+ }
6129
6293
  /** A top-level CommonJS export statement (see cjsExportAssignmentOf):
6130
6294
  * `exports.f = <expr>` and each expression-valued property of
6131
6295
  * `module.exports = { ... }` assign their pre-registered export globals
@@ -6304,7 +6468,7 @@ function lowerCjsExportStatement(lowerer, cjs) {
6304
6468
  const fenceMutable = (nameNode) => {
6305
6469
  const sym = lowerer.resolveValueSymbol(nameNode);
6306
6470
  const g = sym ? lowerer.globalsBySymbol.get(sym) : undefined;
6307
- if (g?.mutable) {
6471
+ if (g?.mutable && !unchangedAfterExport(lowerer, nameNode, cjs.expr)) {
6308
6472
  lowerer.unsupported("SC1090", nameNode, `exporting the mutable 'let' binding '${nameNode.text}' by reference (Node copies its VALUE at this statement — declare it const, or export a function that reads it)`);
6309
6473
  }
6310
6474
  };
@@ -6411,6 +6575,22 @@ function lowerCjsSingleValueExport(lowerer, expr, loc) {
6411
6575
  return lowerer.requireInitStmt(req.spec, req.call) ?? { kind: "block", body: [], loc };
6412
6576
  }
6413
6577
  if (ts.isIdentifier(rhs)) {
6578
+ const split = splitRequireBindingOfIdent(lowerer, rhs);
6579
+ if (split !== null) {
6580
+ if (wholeExportSymbolOfModule(lowerer, split.dep) === null) {
6581
+ 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)`);
6582
+ }
6583
+ const root = lowerer.globalsByDeclNode.get(expr);
6584
+ if (root !== undefined) {
6585
+ return {
6586
+ kind: "assign",
6587
+ localId: root.id,
6588
+ value: lowerer.lowerExprExpecting(rhs, root.type),
6589
+ loc: locOf(rhs),
6590
+ };
6591
+ }
6592
+ return { kind: "block", body: [], loc };
6593
+ }
6414
6594
  const sym = lowerer.resolveValueSymbol(rhs);
6415
6595
  if (!sym)
6416
6596
  return null;
@@ -6429,7 +6609,7 @@ function lowerCjsSingleValueExport(lowerer, expr, loc) {
6429
6609
  }
6430
6610
  const g = lowerer.globalsBySymbol.get(sym);
6431
6611
  if (g) {
6432
- if (g.mutable) {
6612
+ if (g.mutable && !unchangedAfterExport(lowerer, rhs, expr)) {
6433
6613
  lowerer.unsupported("SC1090", rhs, `exporting the mutable 'let' binding '${rhs.text}' by reference (Node copies its VALUE at this statement — declare it const, or export a function that reads it)`);
6434
6614
  }
6435
6615
  return { kind: "block", body: [], loc };
@@ -7213,6 +7393,14 @@ export function lowerExprStatement(lowerer, expr) {
7213
7393
  if (!ts.isIdentifier(expr.left)) {
7214
7394
  lowerer.unsupported("SC1090", expr.left, "assignment to non-variables");
7215
7395
  }
7396
+ const splitAssign = splitRequireAssignmentOf(lowerer, expr);
7397
+ if (splitAssign !== null) {
7398
+ return (lowerer.requireInitStmt(splitAssign.spec, splitAssign.call) ?? {
7399
+ kind: "block",
7400
+ body: [],
7401
+ loc: locOf(expr),
7402
+ });
7403
+ }
7216
7404
  const target = lowerer.resolveWritable(expr.left);
7217
7405
  if (!target)
7218
7406
  lowerer.rejectUnresolved(expr.left, `assignment to '${expr.left.text}' (not a writable local or module global)`);
@@ -7498,7 +7686,9 @@ function destrSpellingOf(rhs) {
7498
7686
  return base === null ? null : `${base}.${e.name.text}`;
7499
7687
  }
7500
7688
  // `table[key]` and `list[0]`; V8 prints a numeric key in its canonical
7501
- // number form (`o[1.50]` reads "o[1.5]").
7689
+ // number form (`o[1.50]` reads "o[1.5]"), and a string key as a property
7690
+ // name with its text decoded (`o["a.b"]` and `o[\`a.b\`]` read "o.a.b").
7691
+ // The message is a C string, so a key holding NUL keeps the refusal.
7502
7692
  if (ts.isElementAccessExpression(e) && !e.questionDotToken) {
7503
7693
  const base = destrSpellingOf(e.expression);
7504
7694
  const key = e.argumentExpression;
@@ -7508,6 +7698,9 @@ function destrSpellingOf(rhs) {
7508
7698
  return `${base}[${key.text}]`;
7509
7699
  if (ts.isNumericLiteral(key))
7510
7700
  return `${base}[${String(Number(key.text))}]`;
7701
+ if ((ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)) &&
7702
+ !key.text.includes("\0"))
7703
+ return `${base}.${key.text}`;
7511
7704
  return null;
7512
7705
  }
7513
7706
  if (ts.isCallExpression(e) && !e.questionDotToken) {
@@ -8476,16 +8669,31 @@ export function lowerForOf(lowerer, stmt) {
8476
8669
  // iterator are awaited as the async-from-sync iterator awaits them, and
8477
8670
  // a value that is not iterable throws Node's TypeError.
8478
8671
  const headT = lowerer.mapTypeOf(lowerer.typeOf(stmt.expression));
8479
- const syncGenerator = (headT?.kind === "generator" && headT.async !== true) || isJsSourceFile(stmt.getSourceFile());
8672
+ // A class instance whose [Symbol.asyncIterator]() (or
8673
+ // [Symbol.iterator]()) returns an iterator object takes the same
8674
+ // checked-dynamic protocol over the boxed instance.
8675
+ const headClass = headT?.kind === "object" ? lowerer.classes.get(headT.className) : undefined;
8676
+ const classAsync = headClass !== undefined && lowerer.findMethodOn(headClass, "sym:asyncIterator") !== null;
8677
+ // Without [Symbol.asyncIterator], the loop opens [Symbol.iterator]() and
8678
+ // awaits its values, as the async-from-sync iterator does.
8679
+ const classSync = headClass !== undefined &&
8680
+ !classAsync &&
8681
+ lowerer.findMethodOn(headClass, "sym:iterator") !== null;
8682
+ const classIterable = classAsync || classSync;
8683
+ const syncGenerator = (headT?.kind === "generator" && headT.async !== true) ||
8684
+ classIterable ||
8685
+ isJsSourceFile(stmt.getSourceFile());
8480
8686
  if (lowerer.ctx.isAsync && (syncGenerator || isUntypedIterable(lowerer, stmt.expression))) {
8481
8687
  const iterable = lowerer.lowerExpr(stmt.expression);
8482
8688
  if (iterable.type.kind === "generator" && iterable.type.async)
8483
8689
  return lowerForAwaitGenerator(lowerer, stmt, iterable, labels);
8484
8690
  if (iterable.type.kind === "dyn")
8485
8691
  return lowerForOfDyn(lowerer, stmt, iterable, labels, true);
8486
- if ((iterable.type.kind === "generator" || isJsSourceFile(stmt.getSourceFile())) &&
8692
+ if ((iterable.type.kind === "generator" ||
8693
+ classIterable ||
8694
+ isJsSourceFile(stmt.getSourceFile())) &&
8487
8695
  lowerer.dynConvertible(iterable.type))
8488
- return lowerForOfDyn(lowerer, stmt, lowerer.coerceToExpected(iterable, DYN), labels, true);
8696
+ return lowerForOfDyn(lowerer, stmt, lowerer.coerceToExpected(iterable, DYN), labels, true, classSync && iterable.type.kind === "object");
8489
8697
  }
8490
8698
  // A NodeJS.ReadableStream iterates as the general Readable.
8491
8699
  requestGeneralStreamSurface(lowerer, stmt.expression);
@@ -8667,7 +8875,7 @@ export function lowerForOf(lowerer, stmt) {
8667
8875
  loc: locOf(iterSrc),
8668
8876
  };
8669
8877
  }
8670
- if (iterable.type.kind === "bytes") {
8878
+ if (iterable.type.kind === "bytes" || indexedUnionArms(lowerer, iterable.type)) {
8671
8879
  return lowerForOfBytes(lowerer, stmt, iterable, labels);
8672
8880
  }
8673
8881
  if (iterable.type.kind !== "array") {
@@ -8706,15 +8914,21 @@ export function lowerForOf(lowerer, stmt) {
8706
8914
  return lowerForOfGenerator(lowerer, stmt, generator, labels);
8707
8915
  // Class iterables ([Symbol.iterator]() + next() — classIteratorOf)
8708
8916
  // drive the same protocol with ordinary method calls.
8709
- const cit = lowerer.classIteratorOf(iterable.type);
8917
+ const cit = lowerer.classIteratorOf(iterable.type, { records: true, close: true });
8710
8918
  if (cit)
8711
8919
  return lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels);
8712
8920
  // A declared [Symbol.iterator] whose shape classIteratorOf refused
8713
8921
  // (an `any`-typed iterator or result, a declared return()/throw()):
8714
8922
  // name the protocol, not the class.
8715
8923
  const info = lowerer.classes.get(iterable.type.className);
8924
+ // In JavaScript the inferred shape is often a union of result
8925
+ // objects: the loop runs the iterator protocol over the boxed value.
8926
+ if (info &&
8927
+ isJsSourceFile(ts.getSourceFileOfNode(stmt)) &&
8928
+ lowerer.findMethodOn(info, "sym:iterator"))
8929
+ return lowerForOfDyn(lowerer, stmt, lowerer.coerceInto(stmt.expression, iterable, DYN), labels);
8716
8930
  if (info && lowerer.findMethodOn(info, "sym:iterator")) {
8717
- lowerer.unsupported("SC1090", stmt.expression, `for-of over this [Symbol.iterator] shape (the method must take no parameters and return an object whose zero-parameter next() returns a { value, done? } record with a boolean done; iterator classes declaring return()/throw() stay out — IteratorClose has no lowering)`);
8931
+ lowerer.unsupported("SC1090", stmt.expression, `for-of over this [Symbol.iterator] shape (the method must take no parameters and return an object whose zero-parameter next() returns a { value, done? } record with a boolean done, and whose return(), if any, takes no parameters and returns an object)`);
8718
8932
  }
8719
8933
  }
8720
8934
  if (iterable.type.kind === "record" && lowerer.shapes.get(iterable.type.shapeId)?.tuple) {
@@ -9242,40 +9456,53 @@ function lowerForOfStoredNumericIterator(lowerer, stmt, state, labels) {
9242
9456
  lowerer.unsupported("SC1031", decl.name);
9243
9457
  const loc = locOf(stmt);
9244
9458
  const sourceT = state.sourceType;
9245
- if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") || sourceT.kind === "bytes")) {
9459
+ // A union of typed arrays and number arrays (indexed-unions.ts) reads
9460
+ // through its arms' own length and element reads.
9461
+ const unionArms = indexedUnionArms(lowerer, sourceT);
9462
+ if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") ||
9463
+ sourceT.kind === "bytes" ||
9464
+ unionArms)) {
9246
9465
  throw new InternalCompilerError("internal: retained numeric iterator has a non-numeric source");
9247
9466
  }
9248
9467
  const indexRef = () => varRef(state.indexLocalId, F64, loc);
9249
9468
  const doneRef = () => varRef(state.doneLocalId, BOOL, loc);
9250
9469
  const sourceRef = () => varRef(state.sourceLocalId, sourceT, loc);
9251
- const sourceLength = () => sourceT.kind === "array"
9252
- ? {
9253
- kind: "arrIntrinsic",
9254
- method: "length",
9255
- receiver: sourceRef(),
9256
- args: [],
9257
- type: F64,
9258
- loc,
9259
- }
9260
- : {
9261
- kind: "bytesIntrinsic",
9262
- method: "length",
9263
- receiver: sourceRef(),
9264
- args: [],
9265
- type: F64,
9266
- loc,
9267
- };
9268
- const valueT = sourceT.kind === "array" ? arrayValueType(lowerer, F64) : F64;
9269
- const sourceValue = () => sourceT.kind === "array"
9270
- ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
9271
- : {
9272
- kind: "bytesIntrinsic",
9273
- method: "get",
9274
- receiver: sourceRef(),
9275
- args: [indexRef()],
9276
- type: F64,
9277
- loc,
9278
- };
9470
+ const sourceLength = () => unionArms
9471
+ ? lowerIndexedUnionMember(lowerer, sourceRef(), unionArms, "length", loc)
9472
+ : sourceT.kind === "array"
9473
+ ? {
9474
+ kind: "arrIntrinsic",
9475
+ method: "length",
9476
+ receiver: sourceRef(),
9477
+ args: [],
9478
+ type: F64,
9479
+ loc,
9480
+ }
9481
+ : {
9482
+ kind: "bytesIntrinsic",
9483
+ method: "length",
9484
+ receiver: sourceRef(),
9485
+ args: [],
9486
+ type: F64,
9487
+ loc,
9488
+ };
9489
+ const valueT = sourceT.kind === "array" || (unionArms && !allBytesArms(unionArms))
9490
+ ? arrayValueType(lowerer, F64)
9491
+ : F64;
9492
+ const sourceValue = () => unionArms
9493
+ ? allBytesArms(unionArms)
9494
+ ? lowerIndexedUnionNumberRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9495
+ : lowerIndexedUnionRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9496
+ : sourceT.kind === "array"
9497
+ ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
9498
+ : {
9499
+ kind: "bytesIntrinsic",
9500
+ method: "get",
9501
+ receiver: sourceRef(),
9502
+ args: [indexRef()],
9503
+ type: F64,
9504
+ loc,
9505
+ };
9279
9506
  const one = { kind: "numLit", value: 1, type: F64, loc };
9280
9507
  lowerer.scopes.push(new Map());
9281
9508
  try {
@@ -9535,11 +9762,13 @@ function lowerForOfMatchAll(lowerer, stmt, call, stored) {
9535
9762
  * } }
9536
9763
  *
9537
9764
  * A result record with NO done field never terminates — exactly JS
9538
- * (undefined is falsy forever; Node loops forever too). No
9539
- * IteratorClose: classIteratorOf already refused iterator classes
9540
- * declaring return()/throw(), so a break exits with nothing to close.
9541
- * `done: true` results bind nothing (the loop breaks before the value
9542
- * read), matching JS's ignore-the-final-value rule. */
9765
+ * (undefined is falsy forever; Node loops forever too). An iterator with
9766
+ * return() is closed when the loop leaves after a value arrived (break,
9767
+ * return, or a throw from the body), as IteratorClose does: a done flag
9768
+ * set around each step guards the call in a finally, and after a throw
9769
+ * from the body an error from return() is dropped. A throw from next()
9770
+ * does not close. `done: true` results bind nothing (the loop breaks
9771
+ * before the value read), matching JS's ignore-the-final-value rule. */
9543
9772
  function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9544
9773
  let exprTarget = null;
9545
9774
  let exprTargetNode = null;
@@ -9573,7 +9802,22 @@ function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9573
9802
  const r = lowerer.declareHiddenLocal("%cir", cit.resultT);
9574
9803
  const recvRef = { kind: "varRef", localId: recv.id, type: iterable.type, loc };
9575
9804
  const itRef = () => ({ kind: "varRef", localId: it.id, type: cit.iterT, loc });
9805
+ const nextRead = lowerer.classIteratorNextRead(cit, itRef(), loc);
9806
+ const next = nextRead ? lowerer.declareHiddenLocal("%cin", nextRead.type) : null;
9576
9807
  const rRef = () => ({ kind: "varRef", localId: r.id, type: cit.resultT, loc });
9808
+ const done = cit.hasReturn ? lowerer.declareHiddenLocal("%cid", BOOL) : null;
9809
+ if (done)
9810
+ done.mutable = true;
9811
+ const setDone = (value) => done
9812
+ ? [
9813
+ {
9814
+ kind: "assign",
9815
+ localId: done.id,
9816
+ value: { kind: "boolLit", value, type: BOOL, loc },
9817
+ loc,
9818
+ },
9819
+ ]
9820
+ : [];
9577
9821
  const varTarget = exprTarget ?? (decl ? forOfVarTarget(lowerer, decl) : null);
9578
9822
  const x = varTarget
9579
9823
  ? lowerer.declareHiddenLocal("%vof", cit.valueT)
@@ -9581,10 +9825,11 @@ function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9581
9825
  const xRef = { kind: "varRef", localId: x.id, type: cit.valueT, loc };
9582
9826
  const blame = decl?.name ?? exprTargetNode ?? stmt.initializer;
9583
9827
  const head = [
9828
+ ...setDone(true),
9584
9829
  {
9585
9830
  kind: "varDecl",
9586
9831
  localId: r.id,
9587
- init: lowerer.classIteratorNextCall(cit, itRef(), loc),
9832
+ init: lowerer.classIteratorNextCall(cit, itRef(), next ? varRef(next.id, next.type, loc) : null, loc),
9588
9833
  loc,
9589
9834
  },
9590
9835
  ...(cit.hasDone
@@ -9628,8 +9873,16 @@ function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9628
9873
  },
9629
9874
  ]
9630
9875
  : []),
9876
+ ...setDone(false),
9631
9877
  ];
9632
9878
  const body = lowerer.inCtl("loop", () => lowerer.lowerScopedBlock(stmt.statement), labels);
9879
+ const loop = {
9880
+ kind: "while",
9881
+ cond: { kind: "boolLit", value: true, type: BOOL, loc },
9882
+ body: [...head, ...body],
9883
+ ...(labels && { labels }),
9884
+ loc,
9885
+ };
9633
9886
  return {
9634
9887
  kind: "block",
9635
9888
  body: [
@@ -9640,13 +9893,48 @@ function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9640
9893
  init: lowerer.classIteratorOpenCall(cit, recvRef, loc),
9641
9894
  loc,
9642
9895
  },
9643
- {
9644
- kind: "while",
9645
- cond: { kind: "boolLit", value: true, type: BOOL, loc },
9646
- body: [...head, ...body],
9647
- ...(labels && { labels }),
9648
- loc,
9649
- },
9896
+ ...(next && nextRead
9897
+ ? [{ kind: "varDecl", localId: next.id, init: nextRead, loc }]
9898
+ : []),
9899
+ ...(done
9900
+ ? [
9901
+ {
9902
+ kind: "varDecl",
9903
+ localId: done.id,
9904
+ init: { kind: "boolLit", value: true, type: BOOL, loc },
9905
+ loc,
9906
+ },
9907
+ {
9908
+ kind: "tryCatch",
9909
+ tryBody: [loop],
9910
+ catchBody: null,
9911
+ catchLocalId: null,
9912
+ dropFinallyErrors: true,
9913
+ finallyBody: [
9914
+ {
9915
+ kind: "if",
9916
+ cond: {
9917
+ kind: "unary",
9918
+ op: "!",
9919
+ operand: { kind: "varRef", localId: done.id, type: BOOL, loc },
9920
+ type: BOOL,
9921
+ loc,
9922
+ },
9923
+ then: [
9924
+ {
9925
+ kind: "exprStmt",
9926
+ expr: lowerer.classIteratorReturnCall(cit, itRef(), loc),
9927
+ loc,
9928
+ },
9929
+ ],
9930
+ else_: null,
9931
+ loc,
9932
+ },
9933
+ ],
9934
+ loc,
9935
+ },
9936
+ ]
9937
+ : [loop]),
9650
9938
  ],
9651
9939
  loc,
9652
9940
  };
@@ -9658,7 +9946,7 @@ function lowerForOfClassIterator(lowerer, stmt, iterable, cit, labels) {
9658
9946
  /** A checked IteratorRecord stays live throughout the loop. Cache next once,
9659
9947
  * read done before value, and close only after a yielded value has arrived.
9660
9948
  * Abrupt body throws retain precedence over errors raised by return(). */
9661
- function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9949
+ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false, syncOpen = false) {
9662
9950
  const loc = locOf(stmt);
9663
9951
  const spell = notIterableSpelling(stmt.expression, asyncLoop ? "async iterable" : "iterable");
9664
9952
  const iterator = lowerer.declareHiddenLocal("%dofIterator", DYN);
@@ -9668,6 +9956,7 @@ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9668
9956
  done.mutable = true;
9669
9957
  const value = lowerer.declareHiddenLocal("%dofValue", DYN);
9670
9958
  const returned = lowerer.declareHiddenLocal("%dofReturn", DYN);
9959
+ const closed = lowerer.declareHiddenLocal("%dofClosed", DYN);
9671
9960
  const needsClose = lowerer.declareHiddenLocal("%dofNeedsClose", BOOL);
9672
9961
  needsClose.mutable = true;
9673
9962
  const error = lowerer.declareHiddenLocal("%dofError", CAUGHT);
@@ -9732,9 +10021,10 @@ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9732
10021
  },
9733
10022
  then: [
9734
10023
  {
9735
- kind: "exprStmt",
10024
+ kind: "varDecl",
10025
+ localId: closed.id,
9736
10026
  // return()'s (awaited) result must be an object, as for next().
9737
- expr: asyncLoop
10027
+ init: asyncLoop
9738
10028
  ? check(awaitDyn({
9739
10029
  kind: "dynCall",
9740
10030
  callee: varRef(returned.id, DYN, loc),
@@ -9747,6 +10037,27 @@ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9747
10037
  : call(varRef(returned.id, DYN, loc)),
9748
10038
  loc,
9749
10039
  },
10040
+ // A synchronous iterator's return() result is read as the
10041
+ // async-from-sync iterator reads it: done, then the value, which is
10042
+ // awaited, so a rejected promise there rejects the loop.
10043
+ ...(syncIterator
10044
+ ? [
10045
+ {
10046
+ kind: "if",
10047
+ cond: varRef(syncIterator.id, BOOL, loc),
10048
+ then: [
10049
+ { kind: "exprStmt", expr: get(varRef(closed.id, DYN, loc), "done"), loc },
10050
+ {
10051
+ kind: "exprStmt",
10052
+ expr: awaitDyn(get(varRef(closed.id, DYN, loc), "value")),
10053
+ loc,
10054
+ },
10055
+ ],
10056
+ else_: null,
10057
+ loc,
10058
+ },
10059
+ ]
10060
+ : []),
9750
10061
  ],
9751
10062
  else_: null,
9752
10063
  loc,
@@ -9855,7 +10166,7 @@ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9855
10166
  localId: iterator.id,
9856
10167
  init: check({
9857
10168
  kind: "libCall",
9858
- fn: asyncLoop ? "dyn.asyncIteratorOpen" : "dyn.iterator",
10169
+ fn: asyncLoop && !syncOpen ? "dyn.asyncIteratorOpen" : "dyn.iterator",
9859
10170
  args: [iterable, { kind: "strLit", value: spell, type: STRING, loc }],
9860
10171
  type: DYN,
9861
10172
  loc,
@@ -9867,13 +10178,15 @@ function lowerForOfDyn(lowerer, stmt, iterable, labels, asyncLoop = false) {
9867
10178
  {
9868
10179
  kind: "varDecl",
9869
10180
  localId: syncIterator.id,
9870
- init: {
9871
- kind: "libCall",
9872
- fn: "dyn.asyncIteratorWasSync",
9873
- args: [],
9874
- type: BOOL,
9875
- loc,
9876
- },
10181
+ init: syncOpen
10182
+ ? { kind: "boolLit", value: true, type: BOOL, loc }
10183
+ : {
10184
+ kind: "libCall",
10185
+ fn: "dyn.asyncIteratorWasSync",
10186
+ args: [],
10187
+ type: BOOL,
10188
+ loc,
10189
+ },
9877
10190
  loc,
9878
10191
  },
9879
10192
  ]
@@ -10275,6 +10588,7 @@ function lowerForIn(lowerer, stmt) {
10275
10588
  // them (accessor slots live outside declaredOrder), so the loop
10276
10589
  // fences rather than skip keys.
10277
10590
  fencePerfEntryKeyWalk(lowerer, receiver.type, stmt.expression, "for-in");
10591
+ fenceX509KeyWalk(lowerer, receiver.type, stmt.expression, "for-in");
10278
10592
  if (shapeHasAccessorSlots(rShape)) {
10279
10593
  lowerer.unsupported("SC1090", stmt.expression, "for-in over a shape carrying get/set accessor properties (Node visits the accessor names — the static key walk cannot; read the properties explicitly)");
10280
10594
  }