@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,14 +1,15 @@
1
+ import { lowerAsyncLocalStorageOptions } from "./builtins/async-context.js";
1
2
  import { DATE_TIME_FIELD, dateRootOf, dateSuperCall, isDatePrototypeMethod, lowerDateSuperMethodCall, } from "./builtins/date-classes.js";
2
3
  import { predeclareForwardClass } from "./lower-stmts.js";
3
4
  import { lowerDateStaticCall } from "./builtins/dates.js";
4
5
  import { keyedHelperName } from "./stable-names.js";
5
6
  import { lowerValueReturningConstructorNew } from "./js-dynamic-objects.js";
6
7
  import { adaptPromiseExecutor } from "./promise-executor-adapter.js";
7
- import { dynUndefinedExpr, nodeThrowExpr, varRef } from "../../ir/build.js";
8
+ import { dynUndefinedExpr, nodeThrowExpr, strLit, varRef } from "../../ir/build.js";
8
9
  import { constructedFromValue, constructedValue, superIntoResultSlot, } from "./constructor-returns.js";
9
10
  import { checkedIterableSpread } from "./checked-iterable-spread.js";
10
- import { lowerReadlineUiNew } from "./builtins/readline.js";
11
- import { builtinMemberRequireDecl } from "./builtins/module-bindings.js";
11
+ import { lowerReadlineInterfaceNew, lowerReadlineUiNew } from "./builtins/readline.js";
12
+ import { builtinMemberBindingTarget, builtinMemberRequireDecl, } from "./builtins/module-bindings.js";
12
13
  import { checkedClassUnionAssertion } from "./class-assertions.js";
13
14
  import { collectClassMethodMutations } from "./class-method-mutations.js";
14
15
  import { InternalCompilerError } from "../../errors.js";
@@ -25,7 +26,7 @@ import { lowerZlibStreamNew, zlibClassName, zlibStreamModeOf } from "./builtins/
25
26
  import { everyStmtList } from "../../ir/traverse.js";
26
27
  import { builtinClassAliasOf, builtinClassRefOf, } from "./builtins/class-values.js";
27
28
  import { inlineNamespaceRequireOf, lowerWithInlineRequireInit } from "./cjs-inline-require.js";
28
- import { BOOL, canDynCheckTo, DATE_T, DYN, F64, bytesOf, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
29
+ import { BOOL, BYTES_U8, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
29
30
  import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, genericLocalClassResult, } from "./generic-functions.js";
30
31
  import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
31
32
  import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
@@ -33,20 +34,20 @@ import { bodyReadsArguments } from "../arguments-usage.js";
33
34
  import { errorNameAfterField, errorViewFields } from "./error-name-order.js";
34
35
  import { checkedJsDocumentedParameter, documentedParameter, generatorMeta, } from "./call-signatures.js";
35
36
  import { omittedArgFor } from "./call-arguments.js";
36
- import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, } from "../type-mapper.js";
37
+ import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, X509_DER_FIELD, X509_PUBLIC_KEY_FIELD, } from "../type-mapper.js";
37
38
  import { canonicalBuiltinModule, cjsClassExprWholeExportOf, isCjsJsFile, isJsSourceFile, isModuleExportsAccess, locOf, requireSpecOf, } from "../program.js";
38
39
  import { PoisonError, dynFallbackType, jsFuncNameOf, newFnCtx, own } from "./lowerer.js";
39
40
  import { isAssertClassNew } from "./assert-instances.js";
40
41
  import { isCjsRequireGlobal } from "./lower-node-module.js";
41
42
  import { lowerArrayConstructor } from "./containers/array-construction.js";
43
+ import { initializedCollectionType } from "./js-collection-types.js";
42
44
  import { lowerMapSeedNew, lowerSetSeedNew } from "./containers/collection-methods.js";
43
45
  import { lowerObjectConstructor } from "./containers/indexed-objects.js";
44
- import { knownBufEncoding, lowerNodeModulesBufferConstruct } from "./containers/bytes.js";
45
- import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
46
+ import { knownBufEncoding, lowerBufferConstruct } from "./containers/bytes.js";
46
47
  import { lowerSearchParamsNew } from "./builtins/url.js";
47
48
  import { lowerTextCodecNew } from "./builtins/text-codecs.js";
48
49
  import { lowerBroadcastChannelNew, lowerMessageChannelNew, lowerWorkerNew, } from "./builtins/workers.js";
49
- import { unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
50
+ import { noLoweringDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
50
51
  import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, streamExtraCallbacks, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
51
52
  import { builtinEventTargetBaseOf, eventTargetApiMembers, eventTargetApiMethod, eventTargetRootOf, eventTargetSuperCall, lowerEventTargetMethodCall, } from "./lower-event-target.js";
52
53
  import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
@@ -63,11 +64,11 @@ import { accessorInterceptsBase, accessorNames, construction, constructionPrefix
63
64
  import { lowerObjectFactoryNew } from "./object-factory-new.js";
64
65
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
65
66
  import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
66
- import { classPrototypeData } from "./class-prototypes.js";
67
+ import { classPrototypeData, reflectClassPrototype } from "./class-prototypes.js";
67
68
  import { constructionEscape } from "./construction-escapes.js";
68
69
  import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
69
70
  import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
70
- import { reflectedClassStaticMethodValue } from "./class-method-values.js";
71
+ import { reflectedClassMethodValue, reflectedClassStaticMethodValue, } from "./class-method-values.js";
71
72
  import { identifierReadSymbol } from "./surfaces.js";
72
73
  export function returnsOnlyThis(member) {
73
74
  const body = member.body;
@@ -891,7 +892,7 @@ function undefArmedFieldType(lowerer, p) {
891
892
  const byKey = new Map();
892
893
  const arms = mapped.kind === "union" ? (lowerer.unions.get(mapped.unionId)?.arms ?? []) : [mapped];
893
894
  for (const a of arms) {
894
- if (a.kind === "map" || a.kind === "regex" || a.kind === "date" || a.kind === "generator") {
895
+ if (a.kind === "map" || a.kind === "regex" || a.kind === "generator") {
895
896
  return null;
896
897
  }
897
898
  byKey.set(typeKey(a), a);
@@ -3042,7 +3043,6 @@ mixin) {
3042
3043
  declared.kind !== "union" &&
3043
3044
  declared.kind !== "dyn" &&
3044
3045
  declared.kind !== "map" &&
3045
- declared.kind !== "date" &&
3046
3046
  declared.kind !== "generator" &&
3047
3047
  declared.kind !== "void" &&
3048
3048
  declared.kind !== "caught";
@@ -3432,6 +3432,11 @@ mixin) {
3432
3432
  // INSTANTIATION prints its family's name — JS has one `Box`.
3433
3433
  jsName: jsNameOverride ?? decl.name?.text ?? "",
3434
3434
  ...(base ? { base: base.def.name } : {}),
3435
+ ...(decl.members.nodes.some((member) => ts.isPropertyDeclaration(member) &&
3436
+ !ts.isPrivateIdentifier(member.name) &&
3437
+ member.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.StaticKeyword))
3438
+ ? { ownStaticFields: true }
3439
+ : {}),
3435
3440
  jsLength: ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) === -1
3436
3441
  ? ctor.parameters.nodes.length
3437
3442
  : Math.max(0, ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) ?? 0),
@@ -4601,20 +4606,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
4601
4606
  return null;
4602
4607
  if (expr.questionDotToken)
4603
4608
  return null;
4604
- if (!ts.isIdentifier(expr.expression) &&
4605
- expr.expression.kind !== ts.SyntaxKind.ThisKeyword &&
4606
- exactClassOfReceiver(lowerer, expr.expression) === null)
4609
+ const info = staticReceiverClass(lowerer, expr.expression);
4610
+ if (!info)
4607
4611
  return null;
4608
- const symbol = ts.isIdentifier(expr.expression)
4609
- ? lowerer.resolveValueSymbol(expr.expression)
4610
- : null;
4612
+ return lowerClassStaticRead(lowerer, info, expr.name.text, expr.expression, expr);
4613
+ }
4614
+ /** The class a static member read through `receiver` reads exactly: the
4615
+ * class a name binds (directly, through a require binding, or through a
4616
+ * const alias), or null. */
4617
+ export function staticReceiverClass(lowerer, receiver) {
4618
+ if (!ts.isIdentifier(receiver) &&
4619
+ receiver.kind !== ts.SyntaxKind.ThisKeyword &&
4620
+ exactClassOfReceiver(lowerer, receiver) === null)
4621
+ return null;
4622
+ const symbol = ts.isIdentifier(receiver) ? lowerer.resolveValueSymbol(receiver) : null;
4611
4623
  const info = (symbol ? lowerer.classBySymbol.get(symbol) : undefined) ??
4612
4624
  // A require binding over `module.exports = class {…}` (the alias
4613
4625
  // lands on the expression's own symbol): resolve/collect on demand,
4614
4626
  // or `C.name` below would fall through to paths that answer for
4615
4627
  // stdlib globals instead of this class.
4616
4628
  propertyAssignedClassInfoOf(lowerer, symbol) ??
4617
- exactClassOfReceiver(lowerer, expr.expression) ??
4629
+ exactClassOfReceiver(lowerer, receiver) ??
4618
4630
  undefined;
4619
4631
  if (!info)
4620
4632
  return null;
@@ -4625,20 +4637,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
4625
4637
  // runtime value.
4626
4638
  if (info.classDecorators?.valueGlobalId !== undefined)
4627
4639
  return null;
4628
- const loc = locOf(expr);
4629
- const found = findStaticOn(lowerer, info, expr.name.text);
4640
+ return info;
4641
+ }
4642
+ /** The static member `name` of `info` read through `receiver` (an exact
4643
+ * reference to the class, see staticReceiverClass): `C.name` for the
4644
+ * property access `site`, or a destructuring element over `C` whose
4645
+ * initializer is `site`. Null when the class has no such member. */
4646
+ export function lowerClassStaticRead(lowerer, info, name, receiver, site) {
4647
+ const loc = locOf(site);
4648
+ const found = findStaticOn(lowerer, info, name);
4630
4649
  // A Date static read as a value through a class declared `extends Date`:
4631
4650
  // the statics lower only as calls.
4632
4651
  if (!found &&
4633
4652
  dateRootOf(info) &&
4634
- ["now", "parse", "UTC"].includes(expr.name.text) &&
4635
- !(ts.isCallExpression(expr.parent) && expr.parent.expression === expr))
4636
- lowerer.noLowering(`Date.${expr.name.text} read through a class that extends Date`, expr);
4653
+ ["now", "parse", "UTC"].includes(name) &&
4654
+ !(ts.isCallExpression(site.parent) && site.parent.expression === site))
4655
+ lowerer.noLowering(`Date.${name} read through a class that extends Date`, site);
4637
4656
  if (hasRuntimeStatics(info) && !found?.field)
4638
4657
  return {
4639
4658
  kind: "dynKeyGet",
4640
- value: lowerer.coerceToExpected(classValueRef(lowerer, info, expr.expression), DYN),
4641
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4659
+ value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
4660
+ key: { kind: "strLit", value: name, type: STRING, loc },
4642
4661
  type: DYN,
4643
4662
  loc,
4644
4663
  };
@@ -4646,8 +4665,8 @@ export function lowerStaticFieldRead(lowerer, expr) {
4646
4665
  // name: in JS the brand lives on that one constructor object, so
4647
4666
  // `D.#s` (a subclass receiver) throws Node's TypeError instead of
4648
4667
  // reaching up the chain — reported as SC1090 instead of resolved.
4649
- if (found && expr.name.text.startsWith("#") && found.declarer !== info) {
4650
- lowerer.unsupported("SC1090", expr, `reading the private static '${expr.name.text}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
4668
+ if (found && name.startsWith("#") && found.declarer !== info) {
4669
+ lowerer.unsupported("SC1090", site, `reading the private static '${name}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
4651
4670
  }
4652
4671
  if (found?.field !== undefined) {
4653
4672
  const value = {
@@ -4656,30 +4675,32 @@ export function lowerStaticFieldRead(lowerer, expr) {
4656
4675
  type: found.field.type,
4657
4676
  loc,
4658
4677
  };
4659
- return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
4678
+ return found.field.runtimeOptional || !ts.isPropertyAccessExpression(site)
4679
+ ? value
4680
+ : lowerer.maybeNarrow(value, site);
4660
4681
  }
4661
4682
  if (found) {
4662
- return staticMethodValue(lowerer, found.declarer, expr.name.text, found.method, expr, loc);
4683
+ return staticMethodValue(lowerer, found.declarer, name, found.method, site, loc);
4663
4684
  }
4664
4685
  // A GENERIC static method as a VALUE: the pinned-value rule verbatim
4665
4686
  // (lowerGenericFnValue) — a slot spelling one concrete signature names
4666
4687
  // an instance, an unpinned reference fences by name.
4667
4688
  {
4668
- const gfound = findGenericStaticOn(lowerer, info, expr.name.text);
4689
+ const gfound = findGenericStaticOn(lowerer, info, name);
4669
4690
  if (gfound)
4670
- return lowerer.lowerGenericFnValue(expr, gfound.info);
4691
+ return lowerer.lowerGenericFnValue(site, gfound.info);
4671
4692
  }
4672
4693
  // `C.name` — the JS-observable class name, a compile-time constant on
4673
4694
  // the direct spelling (tsc rejects user statics named `name`, so the
4674
4695
  // chain above can never shadow it in TypeScript sources). A class of an
4675
4696
  // import cycle reads it from its class object instead, whose reference
4676
4697
  // checks the class's initialization (checkCycleBindingAccesses).
4677
- if (expr.name.text === "name" && info.def.jsName !== undefined) {
4698
+ if (name === "name" && info.def.jsName !== undefined) {
4678
4699
  if (lowerer.classInitFlags.get(info.def.name)?.cycle === true)
4679
4700
  return {
4680
4701
  kind: "libCall",
4681
4702
  fn: "class.name",
4682
- args: [classValueRef(lowerer, info, expr.expression)],
4703
+ args: [classValueRef(lowerer, info, receiver)],
4683
4704
  type: STRING,
4684
4705
  loc,
4685
4706
  };
@@ -4688,26 +4709,26 @@ export function lowerStaticFieldRead(lowerer, expr) {
4688
4709
  if (info.callableBase)
4689
4710
  return {
4690
4711
  kind: "dynKeyGet",
4691
- value: lowerer.coerceToExpected(classValueRef(lowerer, info, expr.expression), DYN),
4692
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4712
+ value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
4713
+ key: { kind: "strLit", value: name, type: STRING, loc },
4693
4714
  type: DYN,
4694
4715
  loc,
4695
4716
  };
4696
- const data = classStaticDataFor(lowerer, info, expr.name.text, loc);
4717
+ const data = classStaticDataFor(lowerer, info, name, loc);
4697
4718
  if (data) {
4698
4719
  const value = {
4699
4720
  kind: "dynKeyGet",
4700
4721
  value: data,
4701
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4722
+ key: { kind: "strLit", value: name, type: STRING, loc },
4702
4723
  type: DYN,
4703
4724
  loc,
4704
4725
  };
4705
4726
  // JavaScript often assigns public statics after the class declaration.
4706
4727
  // Their storage stays mutable and checked, while reads retain the
4707
4728
  // checker's concrete type instead of losing the method receiver.
4708
- const type = isJsSourceFile(ts.getSourceFileOfNode(expr))
4729
+ const type = isJsSourceFile(ts.getSourceFileOfNode(site))
4709
4730
  ? null
4710
- : lowerer.mapTypeOf(lowerer.typeOf(expr));
4731
+ : lowerer.mapTypeOf(lowerer.typeOf(site));
4711
4732
  return type ? lowerer.coerceToExpected(value, type) : value;
4712
4733
  }
4713
4734
  return null;
@@ -5454,7 +5475,7 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
5454
5475
  kind: "dynInvoke",
5455
5476
  recv: lowerer.lowerExprExpecting(access.expression, DYN),
5456
5477
  method: access.name.text,
5457
- calleeName: access.name.text,
5478
+ calleeName: ts.getTextOfNode(access),
5458
5479
  args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
5459
5480
  type: DYN,
5460
5481
  loc,
@@ -5757,8 +5778,8 @@ function capturesEnclosingScope(lowerer, member, classDecl) {
5757
5778
  * reflection: the member a runtime lookup finds can then differ. */
5758
5779
  function memberAssigned(lowerer, member, name) {
5759
5780
  let found = false;
5760
- for (const sf of lowerer.program.getSourceFiles()) {
5761
- if (sf.isDeclarationFile || found)
5781
+ for (const sf of lowerer.program.getImplementationSourceFiles()) {
5782
+ if (found)
5762
5783
  continue;
5763
5784
  if (!sf.text.includes(name))
5764
5785
  continue;
@@ -6808,14 +6829,23 @@ export function classMemberNameOf(lowerer, name) {
6808
6829
  member === "asyncIterator" ||
6809
6830
  member === "dispose" ||
6810
6831
  member === "asyncDispose" ||
6811
- member === "toPrimitive") {
6832
+ member === "toPrimitive" ||
6833
+ // A toStringTag field keeps its symbol field name; its accessor and
6834
+ // method forms take the method slot name.
6835
+ (member === "toStringTag" && !ts.isPropertyDeclaration(name.parent))) {
6812
6836
  return `sym:${member}`;
6813
6837
  }
6814
6838
  }
6815
6839
  return (classSymbolKeyOf(lowerer, name.expression)?.fieldName ??
6816
6840
  lowerer.foldedStringKeyOf(name.expression));
6817
6841
  }
6818
- export function classIteratorOf(lowerer, t) {
6842
+ /** A return() result type that is always an object: IteratorClose after a
6843
+ * break throws a TypeError for any other result, which these desugars do
6844
+ * not model. */
6845
+ function objectResult(t) {
6846
+ return t.kind === "record" || t.kind === "object";
6847
+ }
6848
+ export function classIteratorOf(lowerer, t, options = {}) {
6819
6849
  if (t.kind !== "object")
6820
6850
  return null;
6821
6851
  const info = lowerer.classes.get(t.className);
@@ -6825,19 +6855,48 @@ export function classIteratorOf(lowerer, t) {
6825
6855
  if (!iter || iter.sig.params.length !== 0 || iter.sig.abstract === true)
6826
6856
  return null;
6827
6857
  const iterT = iter.sig.ret;
6828
- if (iterT.kind !== "object")
6829
- return null;
6830
- const itInfo = lowerer.classes.get(iterT.className);
6831
- if (!itInfo)
6832
- return null;
6833
- // IteratorClose honesty: a declared return()/throw() would be called
6834
- // by JS on abrupt completion; these desugars never close.
6835
- if (findMethodOn(lowerer, itInfo, "return") || findMethodOn(lowerer, itInfo, "throw"))
6836
- return null;
6837
- const next = findMethodOn(lowerer, itInfo, "next");
6838
- if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
6858
+ let resultT;
6859
+ let hasReturn;
6860
+ if (iterT.kind === "object") {
6861
+ const itInfo = lowerer.classes.get(iterT.className);
6862
+ if (!itInfo)
6863
+ return null;
6864
+ // IteratorClose honesty: a declared return() would be called by JS on
6865
+ // abrupt completion, so only a consumer that closes takes it; for-of
6866
+ // never calls throw(), the other consumers refuse it.
6867
+ const close = findMethodOn(lowerer, itInfo, "return");
6868
+ if (close &&
6869
+ (!options.close ||
6870
+ close.sig.abstract === true ||
6871
+ close.sig.params.length !== 0 ||
6872
+ !objectResult(close.sig.ret)))
6873
+ return null;
6874
+ if (findMethodOn(lowerer, itInfo, "throw") && !options.close)
6875
+ return null;
6876
+ const next = findMethodOn(lowerer, itInfo, "next");
6877
+ if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
6878
+ return null;
6879
+ resultT = next.sig.ret;
6880
+ hasReturn = !!close;
6881
+ }
6882
+ else if (iterT.kind === "record" && options.records) {
6883
+ const fields = lowerer.shapes.get(iterT.shapeId)?.fields;
6884
+ const next = fields?.find((f) => f.name === "next")?.type;
6885
+ if (!next || next.kind !== "func" || next.params.length !== 0 || next.rest)
6886
+ return null;
6887
+ const close = fields?.find((f) => f.name === "return")?.type;
6888
+ if (close &&
6889
+ (!options.close ||
6890
+ close.kind !== "func" ||
6891
+ close.params.length !== 0 ||
6892
+ close.rest ||
6893
+ !objectResult(close.ret)))
6894
+ return null;
6895
+ resultT = next.ret;
6896
+ hasReturn = close !== undefined;
6897
+ }
6898
+ else
6839
6899
  return null;
6840
- const resultT = next.sig.ret;
6841
6900
  if (resultT.kind !== "record")
6842
6901
  return null;
6843
6902
  const shape = lowerer.shapes.get(resultT.shapeId);
@@ -6853,12 +6912,62 @@ export function classIteratorOf(lowerer, t) {
6853
6912
  resultT,
6854
6913
  valueT: value.type,
6855
6914
  hasDone: done !== undefined,
6915
+ hasReturn,
6856
6916
  };
6857
6917
  }
6858
- /** The `it.next()` step of a class iterator as an ordinary (possibly
6859
- * virtual) method call. */
6860
- export function classIteratorNextCall(lowerer, cit, itRef, loc) {
6861
- return accessorCall(lowerer, cit.iterT.className, "next", itRef, [], cit.resultT, loc);
6918
+ /** The `next` an object-literal iterator's protocol calls, read once when
6919
+ * the iterator opens: JS keeps the `next` it reads then in the iterator
6920
+ * record, so a `next` the iterator assigns while it runs is not called.
6921
+ * Null for an iterator class, whose `next` is a method. */
6922
+ export function classIteratorNextRead(lowerer, cit, itRef, loc) {
6923
+ const iterT = cit.iterT;
6924
+ if (iterT.kind === "object")
6925
+ return null;
6926
+ const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === "next");
6927
+ return {
6928
+ kind: "recordGet",
6929
+ obj: itRef,
6930
+ shapeId: iterT.shapeId,
6931
+ field: "next",
6932
+ type: field.type,
6933
+ loc,
6934
+ };
6935
+ }
6936
+ /** The `it.next()` step of a class iterator: an ordinary (possibly
6937
+ * virtual) method call, or the call of `next`, the object-literal
6938
+ * iterator's `next` that classIteratorNextRead read when it opened. */
6939
+ export function classIteratorNextCall(lowerer, cit, itRef, next, loc) {
6940
+ if (next === null || next.type.kind !== "func")
6941
+ return classIteratorMethodCall(lowerer, cit, "next", itRef, loc);
6942
+ return { kind: "callValue", callee: next, args: [], type: next.type.ret, loc };
6943
+ }
6944
+ /** `it.next()` or `it.return()` of a class iterator: a (possibly virtual)
6945
+ * method call of an iterator class, or the call of an object-literal
6946
+ * iterator's function field. */
6947
+ export function classIteratorMethodCall(lowerer, cit, method, itRef, loc) {
6948
+ const iterT = cit.iterT;
6949
+ if (iterT.kind === "object") {
6950
+ const ret = method === "next"
6951
+ ? cit.resultT
6952
+ : findMethodOn(lowerer, lowerer.classes.get(iterT.className), "return").sig.ret;
6953
+ return accessorCall(lowerer, iterT.className, method, itRef, [], ret, loc);
6954
+ }
6955
+ const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === method);
6956
+ const fnT = field.type;
6957
+ return {
6958
+ kind: "callValue",
6959
+ callee: {
6960
+ kind: "recordGet",
6961
+ obj: itRef,
6962
+ shapeId: iterT.shapeId,
6963
+ field: method,
6964
+ type: fnT,
6965
+ loc,
6966
+ },
6967
+ args: [],
6968
+ type: fnT.ret,
6969
+ loc,
6970
+ };
6862
6971
  }
6863
6972
  /** `recv[Symbol.iterator]()` as an ordinary method call. */
6864
6973
  export function classIteratorOpenCall(lowerer, cit, recv, loc) {
@@ -6874,13 +6983,16 @@ export function classIteratorOpenCall(lowerer, cit, recv, loc) {
6874
6983
  * when the value isn't a recognized class iterable or the element
6875
6984
  * doesn't coerce — spread fences stay. */
6876
6985
  export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6877
- const cit = classIteratorOf(lowerer, src.type);
6986
+ // A spread takes every value, so it never closes the iterator.
6987
+ const cit = classIteratorOf(lowerer, src.type, { records: true, close: true });
6878
6988
  if (!cit)
6879
6989
  return null;
6880
6990
  const outElem = elemT ?? cit.valueT;
6881
6991
  // Probe the element coercion purely: identical types, or an arm of a
6882
6992
  // union destination (the wrap coerceToExpected applies below).
6883
- if (!typeEquals(outElem, cit.valueT)) {
6993
+ // A checked-dynamic value (`IteratorResult<T>`'s value is `T | any`)
6994
+ // converts to the destination element with a check.
6995
+ if (!typeEquals(outElem, cit.valueT) && cit.valueT.kind !== "dyn") {
6884
6996
  if (outElem.kind !== "union" || lowerer.armTag(outElem.unionId, cit.valueT) < 0)
6885
6997
  return null;
6886
6998
  }
@@ -6893,6 +7005,8 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6893
7005
  const recvT = { kind: "object", className: cit.className };
6894
7006
  const recvRef = { kind: "varRef", localId: "r.0", type: recvT, loc };
6895
7007
  const itRef = { kind: "varRef", localId: "it.0", type: cit.iterT, loc };
7008
+ const nextRead = classIteratorNextRead(lowerer, cit, itRef, loc);
7009
+ const nextRef = nextRead ? varRef("next.0", nextRead.type, loc) : null;
6896
7010
  const outRef = { kind: "varRef", localId: "out.0", type: outT, loc };
6897
7011
  const resRef = { kind: "varRef", localId: "res.0", type: cit.resultT, loc };
6898
7012
  const valueRead = {
@@ -6907,7 +7021,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6907
7021
  {
6908
7022
  kind: "varDecl",
6909
7023
  localId: "res.0",
6910
- init: classIteratorNextCall(lowerer, cit, itRef, loc),
7024
+ init: classIteratorNextCall(lowerer, cit, itRef, nextRef, loc),
6911
7025
  loc,
6912
7026
  },
6913
7027
  ...(cit.hasDone
@@ -6948,6 +7062,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6948
7062
  locals: [
6949
7063
  { id: "r.0", name: "r", type: recvT, mutable: false },
6950
7064
  { id: "it.0", name: "it", type: cit.iterT, mutable: false },
7065
+ ...(nextRead ? [{ id: "next.0", name: "next", type: nextRead.type, mutable: false }] : []),
6951
7066
  { id: "out.0", name: "out", type: outT, mutable: false },
6952
7067
  { id: "res.0", name: "res", type: cit.resultT, mutable: true },
6953
7068
  ],
@@ -6964,6 +7079,9 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6964
7079
  init: classIteratorOpenCall(lowerer, cit, recvRef, loc),
6965
7080
  loc,
6966
7081
  },
7082
+ ...(nextRead
7083
+ ? [{ kind: "varDecl", localId: "next.0", init: nextRead, loc }]
7084
+ : []),
6967
7085
  {
6968
7086
  kind: "while",
6969
7087
  cond: { kind: "boolLit", value: true, type: BOOL, loc },
@@ -6993,7 +7111,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6993
7111
  * next() still yields): the drain loop keyed by the iterator class. */
6994
7112
  export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
6995
7113
  const outT = arrayOf(cit.valueT);
6996
- const key = `it:${cit.iterT.className}`;
7114
+ const key = `it:${cit.iterT.kind === "object" ? cit.iterT.className : typeKey(cit.iterT)}`;
6997
7115
  let name = lowerer.iterDrainHelpers.get(key);
6998
7116
  if (!name) {
6999
7117
  name = keyedHelperName(lowerer, "%iter.drain", key);
@@ -7005,7 +7123,7 @@ export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
7005
7123
  {
7006
7124
  kind: "varDecl",
7007
7125
  localId: "res.0",
7008
- init: classIteratorNextCall(lowerer, cit, itRef, loc),
7126
+ init: classIteratorNextCall(lowerer, cit, itRef, null, loc),
7009
7127
  loc,
7010
7128
  },
7011
7129
  ...(cit.hasDone
@@ -7907,22 +8025,51 @@ export function lowerSuperMethodCall(lowerer, call, access) {
7907
8025
  lowerer.unsupported("SC1080", access);
7908
8026
  const loc = locOf(call);
7909
8027
  const thisRef = { kind: "varRef", localId: thisLocal.id, type: thisLocal.type, loc };
7910
- if (lowerer.prototypeMethodAccesses.has(access.name.text)) {
7911
- const prototype = classPrototypeData(lowerer, cls.base, loc);
7912
- if (prototype) {
7913
- const callee = {
7914
- kind: "dynKeyGet",
7915
- value: prototype,
7916
- key: { kind: "strLit", value: access.name.text, type: STRING, loc },
7917
- type: DYN,
7918
- loc,
7919
- };
8028
+ // A method whose `this` is the call-site receiver (a JavaScript class's
8029
+ // receiver-independent method value, reflectedClassMethodValue) looks the
8030
+ // method up on the base class's complete prototype, as `super` reads
8031
+ // [[HomeObject]].[[Prototype]], and calls it with that receiver.
8032
+ const dynamicThis = thisRef.type.kind === "dyn";
8033
+ // While no code reads a prototype method by name (which could replace it),
8034
+ // that method is the declaring class's own: its receiver-independent value
8035
+ // is called directly. Reflecting the base's whole prototype instead would
8036
+ // put its members on the prototype chain of every subclass instance's
8037
+ // property bag, ahead of the subclasses' own compiled overrides.
8038
+ const declared = dynamicThis && !lowerer.prototypeMethodAccesses.has(access.name.text)
8039
+ ? reflectedClassMethodValue(lowerer, found.declarer, access.name.text)
8040
+ : null;
8041
+ if (dynamicThis || lowerer.prototypeMethodAccesses.has(access.name.text)) {
8042
+ const prototype = declared
8043
+ ? null
8044
+ : dynamicThis && cls.base.decl
8045
+ ? reflectClassPrototype(lowerer, cls.base, loc, classValueRef(lowerer, cls.base, access))
8046
+ : classPrototypeData(lowerer, cls.base, loc);
8047
+ if (declared || prototype) {
8048
+ const callee = declared
8049
+ ? lowerer.coerceToExpected(declared, DYN)
8050
+ : {
8051
+ kind: "dynKeyGet",
8052
+ value: prototype,
8053
+ key: { kind: "strLit", value: access.name.text, type: STRING, loc },
8054
+ type: DYN,
8055
+ loc,
8056
+ };
8057
+ // Spread arguments are spread into the dynamic call, as in a dynamic method call.
8058
+ const spreads = [];
8059
+ const args = call.arguments.nodes.map((arg, index) => {
8060
+ if (!ts.isSpreadElement(arg))
8061
+ return lowerer.lowerExprExpecting(arg, DYN);
8062
+ const spelling = ts.getTextOfNode(arg.expression);
8063
+ spreads.push({ arg: index, what: spelling });
8064
+ return checkedIterableSpread(lowerer, lowerer.lowerExpr(arg.expression), spelling, loc);
8065
+ });
7920
8066
  const value = {
7921
8067
  kind: "dynCall",
7922
8068
  callee,
7923
8069
  receiver: lowerer.coerceToExpected(thisRef, DYN),
7924
8070
  calleeName: ts.getTextOfNode(access),
7925
- args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8071
+ args,
8072
+ ...(spreads.length > 0 ? { spreads } : {}),
7926
8073
  type: DYN,
7927
8074
  loc,
7928
8075
  };
@@ -8240,6 +8387,59 @@ function assignedThisFieldType(lowerer, expr) {
8240
8387
  }
8241
8388
  return lowerer.currentClass?.fields.get(parent.left.name.text) ?? null;
8242
8389
  }
8390
+ /** `new arr[i](args)` through a narrowed element read: an interned lifted
8391
+ * function takes the read and the completed arguments, which evaluate in
8392
+ * that order as call arguments, then runs the check and constructs. JS
8393
+ * evaluates the arguments before it checks that the callee constructs, and
8394
+ * the arguments stay in the one call, where a spread's argument pack lives
8395
+ * until every argument has read it. */
8396
+ function checkedElementConstruction(lowerer, info, narrowed, args, loc) {
8397
+ const type = { kind: "object", className: info.def.name };
8398
+ const key = `newChecked:${narrowed.check}:${info.def.name}:${args.map((a) => typeKey(a.type)).join(",")}`;
8399
+ let name = lowerer.valueHelpers.get(key);
8400
+ if (!name) {
8401
+ name = keyedHelperName(lowerer, "%new.checked", key);
8402
+ lowerer.valueHelpers.set(key, name);
8403
+ const params = [
8404
+ { localId: "value", name: "value", type: narrowed.unionT },
8405
+ { localId: "message", name: "message", type: STRING },
8406
+ ...args.map((arg, i) => ({ localId: `arg.${i}`, name: `arg${i}`, type: arg.type })),
8407
+ ];
8408
+ lowerer.liftedFns.push({
8409
+ name,
8410
+ params,
8411
+ returnType: type,
8412
+ locals: params.map((p) => ({ id: p.localId, name: p.name, type: p.type, mutable: false })),
8413
+ body: [
8414
+ {
8415
+ kind: "return",
8416
+ value: {
8417
+ kind: "newValue",
8418
+ callee: {
8419
+ kind: "call",
8420
+ callee: narrowed.check,
8421
+ args: [varRef("value", narrowed.unionT, loc), varRef("message", STRING, loc)],
8422
+ type: narrowed.calleeT,
8423
+ loc,
8424
+ },
8425
+ args: params.slice(2).map((p) => varRef(p.localId, p.type, loc)),
8426
+ type,
8427
+ loc,
8428
+ },
8429
+ loc,
8430
+ },
8431
+ ],
8432
+ loc,
8433
+ });
8434
+ }
8435
+ return {
8436
+ kind: "call",
8437
+ callee: name,
8438
+ args: [narrowed.read, narrowed.message, ...args],
8439
+ type,
8440
+ loc,
8441
+ };
8442
+ }
8243
8443
  /** Map, Set and the error classes construct in lowerNew's identifier
8244
8444
  * branch, which a module member alias of one (`new mod.M()`) also takes. */
8245
8445
  function isCollectionOrErrorClass(ref) {
@@ -8247,9 +8447,9 @@ function isCollectionOrErrorClass(ref) {
8247
8447
  }
8248
8448
  export function lowerNew(lowerer, expr) {
8249
8449
  const loc = locOf(expr);
8250
- // A dependency's deprecated `new Buffer(...)` fallback (containers/bytes.ts).
8450
+ // The deprecated `new Buffer(...)` (containers/bytes.ts).
8251
8451
  {
8252
- const buffer = lowerNodeModulesBufferConstruct(lowerer, expr);
8452
+ const buffer = lowerBufferConstruct(lowerer, expr);
8253
8453
  if (buffer)
8254
8454
  return buffer;
8255
8455
  }
@@ -8277,7 +8477,7 @@ export function lowerNew(lowerer, expr) {
8277
8477
  const worker = lowerWorkerNew(lowerer, expr);
8278
8478
  if (worker)
8279
8479
  return worker;
8280
- const readlineUi = lowerReadlineUiNew(lowerer, expr);
8480
+ const readlineUi = lowerReadlineUiNew(lowerer, expr) ?? lowerReadlineInterfaceNew(lowerer, expr);
8281
8481
  if (readlineUi)
8282
8482
  return readlineUi;
8283
8483
  const channel = lowerMessageChannelNew(lowerer, expr) ?? lowerBroadcastChannelNew(lowerer, expr);
@@ -8348,19 +8548,39 @@ export function lowerNew(lowerer, expr) {
8348
8548
  lowerer.isStdlibGlobal(expr.expression.expression, "Intl")) {
8349
8549
  const args = expr.arguments?.nodes ?? [];
8350
8550
  const undefinedArg = (arg) => (lowerer.typeOf(arg).flags & ts.TypeFlags.Undefined) !== 0;
8351
- if (args.length > 2 || (args[0] && !undefinedArg(args[0]))) {
8352
- lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale or pass undefined for default Unicode grapheme segmentation");
8353
- }
8551
+ // A literal language tag: Unicode grapheme clusters have no locale
8552
+ // tailoring. Only tags of the form language[-script][-region] are
8553
+ // accepted; each is well-formed, so Node constructs the segmenter
8554
+ // without the RangeError a malformed tag throws.
8555
+ const literalLocale = (arg) => ts.isStringLiteralLike(arg) &&
8556
+ /^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?$/.test(arg.text);
8557
+ if (args.length > 2 || (args[0] && !undefinedArg(args[0]) && !literalLocale(args[0]))) {
8558
+ lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale, pass undefined, or pass one language tag as a string literal");
8559
+ }
8560
+ // JavaScript dependencies may construct word and sentence segmenters
8561
+ // that they use only on some paths (pi-tui's shared word segmenter):
8562
+ // the construction compiles and their segment() throws SC2020.
8563
+ // TypeScript sources keep the build-time refusal.
8564
+ const granularities = isJsSourceFile(ts.getSourceFileOfNode(expr))
8565
+ ? ["grapheme", "word", "sentence"]
8566
+ : ["grapheme"];
8354
8567
  const options = args[1];
8355
- if (options &&
8356
- !undefinedArg(options) &&
8357
- !(ts.isObjectLiteralExpression(options) &&
8358
- options.properties.nodes.every((property) => ts.isPropertyAssignment(property) &&
8359
- (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
8360
- property.name.text === "granularity" &&
8361
- ts.isStringLiteral(property.initializer) &&
8362
- property.initializer.text === "grapheme"))) {
8363
- lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8568
+ let granularity = "grapheme";
8569
+ if (options && !undefinedArg(options)) {
8570
+ // An object literal of `granularity` entries (none: the default; a
8571
+ // repeated key: the last one, as in JavaScript).
8572
+ if (!ts.isObjectLiteralExpression(options))
8573
+ lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8574
+ for (const property of options.properties.nodes) {
8575
+ if (!ts.isPropertyAssignment(property) ||
8576
+ !(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ||
8577
+ property.name.text !== "granularity" ||
8578
+ !ts.isStringLiteral(property.initializer) ||
8579
+ !granularities.includes(property.initializer.text)) {
8580
+ lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8581
+ }
8582
+ granularity = property.initializer.text;
8583
+ }
8364
8584
  }
8365
8585
  // Explicit undefined expressions can carry effects; retain argument order.
8366
8586
  const stmts = args.map((arg) => {
@@ -8371,7 +8591,22 @@ export function lowerNew(lowerer, expr) {
8371
8591
  loc: locOf(arg),
8372
8592
  };
8373
8593
  });
8374
- const result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
8594
+ let result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
8595
+ // A word or sentence segmenter carries its segment() refusal, which
8596
+ // coverage lists as deferred to runtime.
8597
+ if (granularity !== "grapheme") {
8598
+ const surface = `Intl.Segmenter segmentation with granularity '${granularity}'`;
8599
+ lowerer.runtimeFences.push(noLoweringDiag(surface, loc, "only grapheme segmenters segment; word and sentence segmenters construct"));
8600
+ const line = ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(expr), loc.start).line;
8601
+ const refusal = `${surface} is not supported yet [SC2020 at ${loc.file}:${line + 1}]`;
8602
+ result = {
8603
+ kind: "libCall",
8604
+ fn: "intl.segmenterRefusing",
8605
+ args: [strLit(refusal, loc)],
8606
+ type: DYN,
8607
+ loc,
8608
+ };
8609
+ }
8375
8610
  return stmts.length ? { kind: "seqExpr", stmts, result, type: DYN, loc } : result;
8376
8611
  }
8377
8612
  // A package declaration without a compiled constructor cannot provide
@@ -8535,6 +8770,47 @@ export function lowerNew(lowerer, expr) {
8535
8770
  if (agent)
8536
8771
  return agent;
8537
8772
  }
8773
+ // `new crypto.X509Certificate(data)` — the Dirent-style data record:
8774
+ // the certificate's lowered members (fingerprint — the SHA-1 of the
8775
+ // DER, uppercase colon-separated — plus the validFrom/validTo
8776
+ // validity window in Node's ASN1_TIME_print shape) compute AT
8777
+ // CONSTRUCTION, when Node parses too, so unparseable input throws
8778
+ // Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
8779
+ // handle never exists. Both import forms (`crypto.X509Certificate`
8780
+ // through the namespace, named `X509Certificate`); Buffer input only
8781
+ // — the readFileSync idiom. mapType interns the matching record, so
8782
+ // locals and the composed member reads all flow. The data argument
8783
+ // feeds THREE field computations, so construction goes through an
8784
+ // interned helper whose parameter evaluates it exactly once.
8785
+ // It runs before the standard-library constructor fence below, which
8786
+ // also sees `const X = require("crypto").X509Certificate` as the
8787
+ // builtin class.
8788
+ {
8789
+ const callee = expr.expression;
8790
+ const isX509 = (ts.isPropertyAccessExpression(callee) &&
8791
+ callee.name.text === "X509Certificate" &&
8792
+ lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
8793
+ (ts.isIdentifier(callee) &&
8794
+ (() => {
8795
+ const bi = lowerer.builtinImportOf(callee);
8796
+ return bi?.module === "crypto" && bi.member === "X509Certificate";
8797
+ })());
8798
+ if (isX509) {
8799
+ const args = expr.arguments?.nodes ?? [];
8800
+ if (args.length !== 1) {
8801
+ lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
8802
+ }
8803
+ const data = lowerer.lowerExpr(args[0]);
8804
+ const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
8805
+ if (!isBytes && data.type.kind !== "string") {
8806
+ lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
8807
+ }
8808
+ const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
8809
+ if (t?.kind !== "record")
8810
+ lowerer.badType(expr, lowerer.typeOf(expr));
8811
+ return x509RecordCall(lowerer, data, t, loc);
8812
+ }
8813
+ }
8538
8814
  if (ts.isIdentifier(expr.expression) ||
8539
8815
  (ts.isPropertyAccessExpression(expr.expression) &&
8540
8816
  ts.isIdentifier(expr.expression.name) &&
@@ -8547,7 +8823,9 @@ export function lowerNew(lowerer, expr) {
8547
8823
  if (ts.isIdentifier(expr.expression))
8548
8824
  fenceEarlyAliasUse(lowerer, expr.expression, expr);
8549
8825
  const identifier = ts.isIdentifier(expr.expression) ? expr.expression : expr.expression.name;
8550
- const symbol = ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null;
8826
+ // `const SD = require("string_decoder").StringDecoder; new SD()`
8827
+ // constructs the member, as a named import of it does.
8828
+ const symbol = builtinMemberBindingTarget(lowerer, ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null);
8551
8829
  if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Array")) {
8552
8830
  return lowerArrayConstructor(lowerer, expr, expr.arguments?.nodes ?? []);
8553
8831
  }
@@ -8825,8 +9103,31 @@ export function lowerNew(lowerer, expr) {
8825
9103
  if (arg.type.kind === "string") {
8826
9104
  return { kind: "libCall", fn: "date.newString", args: [arg], type: DATE_T, loc };
8827
9105
  }
9106
+ // new Date(date): a new Date object with the same time value.
8828
9107
  if (arg.type.kind === "date") {
8829
- return arg;
9108
+ const time = { kind: "libCall", fn: "date.getTime", args: [arg], type: F64, loc };
9109
+ return { kind: "libCall", fn: "date.newMs", args: [time], type: DATE_T, loc };
9110
+ }
9111
+ // A union (`Date | string | number`) or checked-dynamic value: the
9112
+ // runtime's constructor reads a Date's time value, parses a string
9113
+ // and converts anything else to a primitive and a number.
9114
+ if ((arg.type.kind === "union" || arg.type.kind === "dyn") &&
9115
+ lowerer.dynConvertible(arg.type)) {
9116
+ const value = {
9117
+ kind: "libCall",
9118
+ fn: "date.nativeNewValue",
9119
+ args: [
9120
+ {
9121
+ kind: "dynArrLit",
9122
+ elems: [lowerer.coerceToExpected(arg, DYN)],
9123
+ type: DYN,
9124
+ loc,
9125
+ },
9126
+ ],
9127
+ type: DYN,
9128
+ loc,
9129
+ };
9130
+ return { kind: "libCall", fn: "date.checkedValue", args: [value], type: DATE_T, loc };
8830
9131
  }
8831
9132
  lowerer.noLowering(`new Date of '${lowerer.fmt(arg.type)}' values`, args[0], "pass milliseconds, a date string, or another Date value", symbol);
8832
9133
  }
@@ -8952,7 +9253,12 @@ export function lowerNew(lowerer, expr) {
8952
9253
  // expression). The CONTEXTUAL type carries the annotation — adopt
8953
9254
  // it when it is a supported map. TS type arguments keep winning:
8954
9255
  // their expression type already maps.
8955
- if (mapped?.kind !== "map" || contextualSeed) {
9256
+ const inferred = initializedCollectionType(lowerer, expr);
9257
+ if (inferred) {
9258
+ tsType = inferred;
9259
+ mapped = lowerer.mapTypeOf(inferred);
9260
+ }
9261
+ else if (mapped?.kind !== "map" || contextualSeed) {
8956
9262
  const ctx = lowerer.checker.getContextualType(expr);
8957
9263
  const ctxMapped = ctx ? lowerer.mapTypeOf(ctx) : null;
8958
9264
  if (ctx && ctxMapped?.kind === "map") {
@@ -9005,7 +9311,7 @@ export function lowerNew(lowerer, expr) {
9005
9311
  if (targs[1]) {
9006
9312
  lowerer.unsupported("SC1090", expr, `Map values of type '${lowerer.checker.typeToString(targs[1])}' ` +
9007
9313
  `(Map values must be number, string, boolean, records, class instances, functions, ` +
9008
- `typed arrays, arrays, promises, Maps, Sets, or supported unions and checked values)`);
9314
+ `typed arrays, arrays, promises, Dates, Maps, Sets, or supported unions and checked values)`);
9009
9315
  }
9010
9316
  lowerer.badType(expr, tsType);
9011
9317
  }
@@ -9062,7 +9368,8 @@ export function lowerNew(lowerer, expr) {
9062
9368
  // `new Set<T>()`: construct + bulk add from supported values,
9063
9369
  // including live collection cursors. Duplicates collapse in insertion order.
9064
9370
  if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Set")) {
9065
- const tsType = lowerer.typeOf(expr);
9371
+ const inferred = initializedCollectionType(lowerer, expr);
9372
+ const tsType = inferred ?? lowerer.typeOf(expr);
9066
9373
  let mapped = lowerer.mapTypeOf(tsType);
9067
9374
  const fieldType = assignedThisFieldType(lowerer, expr);
9068
9375
  if (mapped?.kind !== "set" && fieldType?.kind === "set")
@@ -9123,15 +9430,21 @@ export function lowerNew(lowerer, expr) {
9123
9430
  lowerer.badType(expr, tsType);
9124
9431
  }
9125
9432
  // `new AsyncLocalStorage()` (node:async_hooks): a fresh store id —
9126
- // an f64 handle (type-mapper.ts), the Channel story. Construction options
9127
- // ({ defaultValue, name }) have no lowering yet.
9433
+ // an f64 handle (type-mapper.ts), the Channel story. The options form
9434
+ // ({ defaultValue, name }) passes the options object as a dyn value.
9128
9435
  if (symbol !== null &&
9129
9436
  ts.symbolName(symbol) === "AsyncLocalStorage" &&
9130
9437
  lowerer.isStdlibSymbol(symbol)) {
9131
- if ((expr.arguments?.nodes.length ?? 0) > 0) {
9132
- lowerer.noLowering("new AsyncLocalStorage(options)", expr, "the zero-argument constructor is the supported form (defaultValue/name options have no lowering yet)");
9133
- }
9134
- return { kind: "libCall", fn: "als.new", args: [], type: F64, loc };
9438
+ const options = expr.arguments?.nodes[0];
9439
+ if (options === undefined)
9440
+ return { kind: "libCall", fn: "als.new", args: [], type: F64, loc };
9441
+ return {
9442
+ kind: "libCall",
9443
+ fn: "als.newOptions",
9444
+ args: [lowerAsyncLocalStorageOptions(lowerer, options)],
9445
+ type: F64,
9446
+ loc,
9447
+ };
9135
9448
  }
9136
9449
  // `new Promise<T>((resolve) => ...)`: the ambient Promise constructor.
9137
9450
  if (symbol !== null && ts.symbolName(symbol) === "Promise" && lowerer.isStdlibSymbol(symbol)) {
@@ -9201,38 +9514,6 @@ export function lowerNew(lowerer, expr) {
9201
9514
  // families carry pointed hints: each states WHY no honest static
9202
9515
  // lowering exists (or what to use instead).
9203
9516
  if (lowerer.isStdlibSymbol(symbol ?? undefined)) {
9204
- // The deprecated `new Buffer(string, encoding?)` ctor's string arm
9205
- // with a NON-STRING first argument and a string second: Node
9206
- // throws ERR_INVALID_ARG_TYPE synchronously (and DEP0005 never
9207
- // fires on this throwing path, so the compiled silence matches).
9208
- // Every other new Buffer form keeps the fence below — the
9209
- // constructing forms would owe the deprecation warning.
9210
- if (expr.expression.text === "Buffer" &&
9211
- expr.arguments?.nodes.length === 2 &&
9212
- !expr.arguments.nodes.some(ts.isSpreadElement) &&
9213
- lowerer.mapTypeOf(lowerer.typeOf(expr.arguments.nodes[0]))?.kind !== "string" &&
9214
- lowerer.mapTypeOf(lowerer.typeOf(expr.arguments.nodes[1]))?.kind === "string") {
9215
- const first = lowerer.lowerExpr(expr.arguments.nodes[0]);
9216
- if (first.kind === "unitLit" ||
9217
- first.type.kind === "dyn" ||
9218
- lowerer.dynConvertible(first.type)) {
9219
- const got = first.type.kind === "dyn" ? first : { kind: "dynFrom", value: first, type: DYN, loc };
9220
- // The encoding argument still evaluates in Node before the
9221
- // throw only via the ctor body's later reads — it does NOT
9222
- // observe it before throwing, so dropping it is exact for
9223
- // effect-free operands; effectful ones keep the fence.
9224
- const enc = lowerer.lowerExpr(expr.arguments.nodes[1]);
9225
- if (enc.kind === "strLit" || isSafeToRepeat(enc)) {
9226
- return {
9227
- kind: "libCall",
9228
- fn: "buffer.newStringFail",
9229
- args: [got],
9230
- type: bytesOf("u8"),
9231
- loc,
9232
- };
9233
- }
9234
- }
9235
- }
9236
9517
  const ctorHints = {
9237
9518
  RegExp: "use a regex literal (/pattern/flags) — constructed regexes have no lowering",
9238
9519
  String: "boxed wrapper objects have no lowering — use the string primitive (the box is only distinguishable via typeof/identity, which nothing here can honor)",
@@ -9247,79 +9528,6 @@ export function lowerNew(lowerer, expr) {
9247
9528
  lowerer.noLowering(`new ${expr.expression.text}`, expr, ctorHints[ts.isIdentifier(expr.expression) ? expr.expression.text : expr.expression.name.text], symbol);
9248
9529
  }
9249
9530
  }
9250
- // `new crypto.X509Certificate(data)` — the Dirent-style data record:
9251
- // the certificate's lowered members (fingerprint — the SHA-1 of the
9252
- // DER, uppercase colon-separated — plus the validFrom/validTo
9253
- // validity window in Node's ASN1_TIME_print shape) compute AT
9254
- // CONSTRUCTION, when Node parses too, so unparseable input throws
9255
- // Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
9256
- // handle never exists. Both import forms (`crypto.X509Certificate`
9257
- // through the namespace, named `X509Certificate`); Buffer input only
9258
- // — the readFileSync idiom. mapType interns the matching record, so
9259
- // locals and the composed member reads all flow. The data argument
9260
- // feeds THREE field computations, so construction goes through an
9261
- // interned helper whose parameter evaluates it exactly once.
9262
- {
9263
- const callee = expr.expression;
9264
- const isX509 = (ts.isPropertyAccessExpression(callee) &&
9265
- callee.name.text === "X509Certificate" &&
9266
- lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
9267
- (ts.isIdentifier(callee) &&
9268
- (() => {
9269
- const bi = lowerer.builtinImportOf(callee);
9270
- return bi?.module === "crypto" && bi.member === "X509Certificate";
9271
- })());
9272
- if (isX509) {
9273
- const args = expr.arguments?.nodes ?? [];
9274
- if (args.length !== 1) {
9275
- lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
9276
- }
9277
- const data = lowerer.lowerExpr(args[0]);
9278
- const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
9279
- if (!isBytes && data.type.kind !== "string") {
9280
- lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
9281
- }
9282
- const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
9283
- if (t?.kind !== "record")
9284
- lowerer.badType(expr, lowerer.typeOf(expr));
9285
- const key = `x509.record:${isBytes ? "bytes" : "str"}`;
9286
- let helper = lowerer.valueHelpers.get(key);
9287
- if (!helper) {
9288
- helper = keyedHelperName(lowerer, "%x509.record", key);
9289
- lowerer.valueHelpers.set(key, helper);
9290
- const dataT = data.type;
9291
- const dRef = { kind: "varRef", localId: "d.0", type: dataT, loc };
9292
- const field = (name, fn) => ({
9293
- name,
9294
- value: { kind: "libCall", fn, args: [dRef], type: STRING, loc },
9295
- });
9296
- lowerer.liftedFns.push({
9297
- name: helper,
9298
- params: [{ localId: "d.0", name: "d", type: dataT }],
9299
- returnType: t,
9300
- locals: [{ id: "d.0", name: "d", type: dataT, mutable: false }],
9301
- body: [
9302
- {
9303
- kind: "return",
9304
- value: {
9305
- kind: "recordLit",
9306
- fields: [
9307
- field("fingerprint", isBytes ? "crypto.x509Fingerprint" : "crypto.x509FingerprintStr"),
9308
- field("validFrom", isBytes ? "crypto.x509ValidFrom" : "crypto.x509ValidFromStr"),
9309
- field("validTo", isBytes ? "crypto.x509ValidTo" : "crypto.x509ValidToStr"),
9310
- ],
9311
- type: t,
9312
- loc,
9313
- },
9314
- loc,
9315
- },
9316
- ],
9317
- loc,
9318
- });
9319
- }
9320
- return { kind: "call", callee: helper, args: [data], type: t, loc };
9321
- }
9322
- }
9323
9531
  // `new X(...)` through a class VALUE (a classval-typed binding, array
9324
9532
  // element, map read, param): the newValue dispatch through the class
9325
9533
  // object's construct thunk. Arguments complete against the STATIC
@@ -9358,9 +9566,108 @@ export function lowerNew(lowerer, expr) {
9358
9566
  if (info.generic) {
9359
9567
  lowerer.unsupported("SC1090", expr, "constructing through a class value of an uninstantiated generic type (annotate the slot with a concrete instantiation — e.g. 'new (v: number) => Box<number>')");
9360
9568
  }
9361
- const callee = lowerer.lowerExpr(expr.expression);
9569
+ let callee = lowerer.lowerExpr(expr.expression);
9362
9570
  if (callee.type.kind === "dyn")
9363
9571
  return lowerCheckedConstructor(lowerer, expr, callee);
9572
+ /** The union-typed element read a narrowing check guards, and the
9573
+ * check (`%new.callee`) that yields the class value or throws. */
9574
+ let narrowedCallee = null;
9575
+ // An array element read (`new T[0]()` over `[Dog, Animal]`, whose
9576
+ // checker type is the common base) keeps the undefined an index past
9577
+ // the end reads: the class value is narrowed out with a check, which
9578
+ // throws a TypeError for undefined.
9579
+ if (callee.type.kind === "union") {
9580
+ const arms = lowerer.unions.get(callee.type.unionId)?.arms ?? [];
9581
+ const classArms = arms.filter((arm) => arm.kind === "classval");
9582
+ if (classArms.length === 1 &&
9583
+ classArms[0].kind === "classval" &&
9584
+ classArms[0].className === calleeT.className &&
9585
+ arms.every((arm) => arm.kind === "classval" || arm.kind === "undefinedT")) {
9586
+ const unionT = callee.type;
9587
+ const helper = lowerer.narrowedArmHelper(unionT.unionId, calleeT, callee.loc);
9588
+ if (helper) {
9589
+ const loc = callee.loc;
9590
+ const name = `%new.callee:${unionT.unionId}`;
9591
+ if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
9592
+ const undefinedTag = lowerer.armTag(unionT.unionId, UNDEFINED_T);
9593
+ const value = { kind: "varRef", localId: "value", type: unionT, loc };
9594
+ lowerer.liftedFns.push({
9595
+ name,
9596
+ params: [
9597
+ { localId: "value", name: "value", type: unionT },
9598
+ { localId: "message", name: "message", type: STRING },
9599
+ ],
9600
+ locals: [
9601
+ { id: "value", name: "value", type: unionT, mutable: false },
9602
+ { id: "message", name: "message", type: STRING, mutable: false },
9603
+ ],
9604
+ returnType: calleeT,
9605
+ body: [
9606
+ ...(undefinedTag >= 0
9607
+ ? [
9608
+ {
9609
+ kind: "if",
9610
+ cond: {
9611
+ kind: "unionIsTag",
9612
+ unionId: unionT.unionId,
9613
+ tag: undefinedTag,
9614
+ negated: false,
9615
+ value,
9616
+ type: BOOL,
9617
+ loc,
9618
+ },
9619
+ then: [
9620
+ {
9621
+ kind: "throw",
9622
+ value: {
9623
+ kind: "libCall",
9624
+ fn: "error.new",
9625
+ args: [{ kind: "varRef", localId: "message", type: STRING, loc }],
9626
+ type: { kind: "object", className: "%TypeError" },
9627
+ loc,
9628
+ },
9629
+ loc,
9630
+ },
9631
+ ],
9632
+ else_: null,
9633
+ loc,
9634
+ },
9635
+ ]
9636
+ : []),
9637
+ {
9638
+ kind: "return",
9639
+ value: lowerer.checkedNarrowCall(helper, value, calleeT, loc),
9640
+ loc,
9641
+ },
9642
+ ],
9643
+ loc,
9644
+ });
9645
+ }
9646
+ // JavaScript evaluates the arguments before it checks that the
9647
+ // callee constructs, so the check runs at the construction
9648
+ // (checkedElementConstruction).
9649
+ narrowedCallee = {
9650
+ read: callee,
9651
+ check: name,
9652
+ unionT,
9653
+ calleeT,
9654
+ message: {
9655
+ kind: "strLit",
9656
+ value: `${expr.expression.getText()} is not a constructor`,
9657
+ type: STRING,
9658
+ loc,
9659
+ },
9660
+ };
9661
+ callee = {
9662
+ kind: "call",
9663
+ callee: name,
9664
+ args: [callee, narrowedCallee.message],
9665
+ type: calleeT,
9666
+ loc,
9667
+ };
9668
+ }
9669
+ }
9670
+ }
9364
9671
  if (callee.type.kind !== "classval")
9365
9672
  lowerer.badType(expr.expression, lowerer.typeOf(expr.expression));
9366
9673
  lowerer.noteEdge(classValueConstructor(info.def).fn);
@@ -9386,13 +9693,15 @@ export function lowerNew(lowerer, expr) {
9386
9693
  refuseInheritedBuiltinCtorArgs(lowerer, info, expr);
9387
9694
  defineClassValueConstruct(lowerer, info);
9388
9695
  const args = lowerer.completeArgs(expr.arguments?.nodes ?? [], classValueParams(info), loc, expr);
9389
- const built = constructedFromValue(lowerer, info, {
9390
- kind: "newValue",
9391
- callee,
9392
- args,
9393
- type: { kind: "object", className: info.def.name },
9394
- loc,
9395
- }, expr);
9696
+ const built = constructedFromValue(lowerer, info, narrowedCallee !== null
9697
+ ? checkedElementConstruction(lowerer, info, narrowedCallee, args, loc)
9698
+ : {
9699
+ kind: "newValue",
9700
+ callee,
9701
+ args,
9702
+ type: { kind: "object", className: info.def.name },
9703
+ loc,
9704
+ }, expr);
9396
9705
  // A runtime class slot widened from a union (`[Readable, Writable]`'s
9397
9706
  // elements hold EventEmitter values): the checker types the result as
9398
9707
  // the union of the arms' instances, which the checked class view
@@ -9527,14 +9836,149 @@ function genericFieldFnNodeOf(member) {
9527
9836
  }
9528
9837
  return null;
9529
9838
  }
9839
+ /** The lifted `new crypto.X509Certificate(d)` constructor: raw decodes the
9840
+ * input once (Node's PEM error throws here), and every other field reads
9841
+ * raw. subjectAltName, infoAccess and signatureAlgorithm hold undefined
9842
+ * where the runtime answers "". */
9843
+ /** The X509Certificate record `t` built from `data`, a certificate Buffer
9844
+ * (PEM or DER) or PEM string, through the interned constructor helper.
9845
+ * `der` marks a Buffer known to hold a certificate's DER (a TLS socket's),
9846
+ * which is read without looking for PEM armor inside it. */
9847
+ export function x509RecordCall(lowerer, data, t, loc, der = false) {
9848
+ const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
9849
+ const key = `x509.record:${der ? "der" : isBytes ? "bytes" : "str"}`;
9850
+ let helper = lowerer.valueHelpers.get(key);
9851
+ if (!helper) {
9852
+ helper = keyedHelperName(lowerer, "%x509.record", key);
9853
+ lowerer.valueHelpers.set(key, helper);
9854
+ lowerer.liftedFns.push(x509RecordHelper(lowerer, helper, data.type, t, isBytes, der, loc));
9855
+ }
9856
+ return { kind: "call", callee: helper, args: [data], type: t, loc };
9857
+ }
9858
+ function x509RecordHelper(lowerer, name, dataT, t, isBytes, der, loc) {
9859
+ const shape = lowerer.shapes.get(t.shapeId);
9860
+ if (!shape)
9861
+ throw new InternalCompilerError("lowerer bug: X509Certificate shape unregistered");
9862
+ const raw = { kind: "varRef", localId: "raw.0", type: BYTES_U8, loc };
9863
+ const call = (fn, type) => ({
9864
+ kind: "libCall",
9865
+ fn,
9866
+ args: [raw],
9867
+ type,
9868
+ loc,
9869
+ });
9870
+ const locals = [
9871
+ { id: "d.0", name: "d", type: dataT, mutable: false },
9872
+ { id: "raw.0", name: "raw", type: BYTES_U8, mutable: false },
9873
+ ];
9874
+ const decls = [
9875
+ {
9876
+ kind: "varDecl",
9877
+ localId: "raw.0",
9878
+ init: {
9879
+ kind: "libCall",
9880
+ fn: der ? "crypto.x509RawDer" : isBytes ? "crypto.x509Raw" : "crypto.x509RawStr",
9881
+ args: [{ kind: "varRef", localId: "d.0", type: dataT, loc }],
9882
+ type: BYTES_U8,
9883
+ loc,
9884
+ },
9885
+ loc,
9886
+ },
9887
+ ];
9888
+ const validTime = (fn) => ({
9889
+ kind: "libCall",
9890
+ fn: "date.newString",
9891
+ args: [call(fn, STRING)],
9892
+ type: DATE_T,
9893
+ loc,
9894
+ });
9895
+ const values = {
9896
+ ca: () => call("crypto.x509Ca", BOOL),
9897
+ fingerprint: () => call("crypto.x509Fingerprint", STRING),
9898
+ fingerprint256: () => call("crypto.x509Fingerprint256", STRING),
9899
+ fingerprint512: () => call("crypto.x509Fingerprint512", STRING),
9900
+ subject: () => call("crypto.x509Subject", STRING),
9901
+ subjectAltName: (type) => optionalText("san", "crypto.x509SubjectAltName", type),
9902
+ infoAccess: (type) => optionalText("access", "crypto.x509InfoAccess", type),
9903
+ issuer: () => call("crypto.x509Issuer", STRING),
9904
+ raw: () => raw,
9905
+ serialNumber: () => call("crypto.x509SerialNumber", STRING),
9906
+ signatureAlgorithm: (type) => optionalText("sigalg", "crypto.x509SignatureAlgorithm", type),
9907
+ signatureAlgorithmOid: () => call("crypto.x509SignatureAlgorithmOid", STRING),
9908
+ validFrom: () => call("crypto.x509ValidFrom", STRING),
9909
+ validFromDate: () => validTime("crypto.x509ValidFrom"),
9910
+ validTo: () => call("crypto.x509ValidTo", STRING),
9911
+ validToDate: () => validTime("crypto.x509ValidTo"),
9912
+ [X509_PUBLIC_KEY_FIELD]: () => ({
9913
+ kind: "dynFrom",
9914
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
9915
+ type: DYN,
9916
+ loc,
9917
+ }),
9918
+ // A copy: writes into `raw` must not reach the methods.
9919
+ [X509_DER_FIELD]: () => call("crypto.x509RawDer", BYTES_U8),
9920
+ };
9921
+ /** A string | undefined field: the runtime's text, or undefined for "". */
9922
+ function optionalText(local, fn, type) {
9923
+ if (type.kind !== "union")
9924
+ throw new InternalCompilerError("lowerer bug: X509Certificate optional field type");
9925
+ const def = lowerer.unions.get(type.unionId);
9926
+ const stringTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
9927
+ const undefinedTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
9928
+ if (stringTag < 0 || undefinedTag < 0)
9929
+ throw new InternalCompilerError("lowerer bug: X509Certificate optional field arms");
9930
+ const id = `${local}.0`;
9931
+ locals.push({ id, name: local, type: STRING, mutable: false });
9932
+ decls.push({ kind: "varDecl", localId: id, init: call(fn, STRING), loc });
9933
+ const text = { kind: "varRef", localId: id, type: STRING, loc };
9934
+ return {
9935
+ kind: "ternary",
9936
+ cond: {
9937
+ kind: "strEq",
9938
+ negated: false,
9939
+ left: text,
9940
+ right: { kind: "strLit", value: "", type: STRING, loc },
9941
+ type: BOOL,
9942
+ loc,
9943
+ },
9944
+ then: {
9945
+ kind: "unionWrap",
9946
+ unionId: type.unionId,
9947
+ tag: undefinedTag,
9948
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
9949
+ type,
9950
+ loc,
9951
+ },
9952
+ else_: { kind: "unionWrap", unionId: type.unionId, tag: stringTag, value: text, type, loc },
9953
+ type,
9954
+ loc,
9955
+ };
9956
+ }
9957
+ const fields = shape.fields.map((f) => {
9958
+ const value = values[f.name];
9959
+ if (!value)
9960
+ throw new InternalCompilerError(`lowerer bug: X509Certificate field ${f.name}`);
9961
+ return { name: f.name, value: value(f.type) };
9962
+ });
9963
+ return {
9964
+ name,
9965
+ params: [{ localId: "d.0", name: "d", type: dataT }],
9966
+ returnType: t,
9967
+ locals,
9968
+ body: [...decls, { kind: "return", value: { kind: "recordLit", fields, type: t, loc }, loc }],
9969
+ loc,
9970
+ };
9971
+ }
9530
9972
  /** Whether a JavaScript class's own binding is the target of
9531
- * `Object.defineProperty`/`defineProperties` in its file
9532
- * (`Object.defineProperty(Definition, "name", { value })`): its constructor
9973
+ * `Object.defineProperty`/`defineProperties` or `Reflect.deleteProperty` in
9974
+ * its file (`Object.defineProperty(Definition, "name", { value })`,
9975
+ * `Reflect.deleteProperty(Response, "getResponseState")`): its constructor
9533
9976
  * then needs a live own-property table. */
9534
9977
  function definedThroughReflection(lowerer, decl) {
9535
9978
  const name = decl.name;
9536
9979
  const sf = ts.getSourceFileOfNode(decl);
9537
- if (name === undefined || !sf.text.includes("definePropert"))
9980
+ if (name === undefined ||
9981
+ (!sf.text.includes("definePropert") && !sf.text.includes("deleteProperty")))
9538
9982
  return false;
9539
9983
  const symbol = lowerer.checker.getSymbolAtLocation(name);
9540
9984
  if (symbol === undefined)
@@ -9545,9 +9989,11 @@ function definedThroughReflection(lowerer, decl) {
9545
9989
  return "stop";
9546
9990
  if (ts.isCallExpression(node) &&
9547
9991
  ts.isPropertyAccessExpression(node.expression) &&
9548
- (node.expression.name.text === "defineProperty" ||
9992
+ (((node.expression.name.text === "defineProperty" ||
9549
9993
  node.expression.name.text === "defineProperties") &&
9550
- lowerer.stdlibGlobalMember(node.expression, "Object") !== null) {
9994
+ lowerer.stdlibGlobalMember(node.expression, "Object") !== null) ||
9995
+ (node.expression.name.text === "deleteProperty" &&
9996
+ lowerer.stdlibGlobalMember(node.expression, "Reflect") !== null))) {
9551
9997
  const target = node.arguments.nodes[0];
9552
9998
  if (target !== undefined &&
9553
9999
  ts.isIdentifier(target) &&