@scriptc/compiler 0.4.0 → 0.4.2

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 (866) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +617 -83
  2. package/dist/backend/cycle-analysis.d.ts +2 -1
  3. package/dist/backend/cycle-analysis.js +4 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-mutability.d.ts +2 -1
  6. package/dist/backend/cycle-mutability.js +2 -2
  7. package/dist/backend/cycle-mutability.js.map +1 -1
  8. package/dist/backend/executable-features.js +10 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +2 -1
  11. package/dist/backend/immutability.js +2 -2
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/library-pack.js +7 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/link-plan-core.d.ts +2 -0
  16. package/dist/backend/link-plan-core.js +2 -0
  17. package/dist/backend/link-plan-core.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +1 -0
  19. package/dist/backend/link-plan.js +1 -0
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/alloc.d.ts +7 -3
  22. package/dist/backend/llvm/alloc.js +7 -4
  23. package/dist/backend/llvm/alloc.js.map +1 -1
  24. package/dist/backend/llvm/array-search.js +4 -1
  25. package/dist/backend/llvm/array-search.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
  27. package/dist/backend/llvm/bytes-loop-versions.js +115 -19
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/classes.d.ts +99 -2
  32. package/dist/backend/llvm/classes.js +436 -57
  33. package/dist/backend/llvm/classes.js.map +1 -1
  34. package/dist/backend/llvm/classes.test.js +235 -16
  35. package/dist/backend/llvm/classes.test.js.map +1 -1
  36. package/dist/backend/llvm/common.d.ts +21 -5
  37. package/dist/backend/llvm/common.js +50 -5
  38. package/dist/backend/llvm/common.js.map +1 -1
  39. package/dist/backend/llvm/constant-callbacks.js +8 -4
  40. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  42. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  43. package/dist/backend/llvm/counted-loops.d.ts +4 -1
  44. package/dist/backend/llvm/counted-loops.js +62 -23
  45. package/dist/backend/llvm/counted-loops.js.map +1 -1
  46. package/dist/backend/llvm/dense-array-access.d.ts +3 -1
  47. package/dist/backend/llvm/dense-array-access.js +61 -38
  48. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  49. package/dist/backend/llvm/dense-array-access.test.js +4 -0
  50. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  51. package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
  52. package/dist/backend/llvm/dense-array-loops.js +49 -13
  53. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  54. package/dist/backend/llvm/dense-array-loops.test.js +50 -14
  55. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  56. package/dist/backend/llvm/dyn.d.ts +34 -1
  57. package/dist/backend/llvm/dyn.js +393 -14
  58. package/dist/backend/llvm/dyn.js.map +1 -1
  59. package/dist/backend/llvm/emit-function.js +27 -8
  60. package/dist/backend/llvm/emit-function.js.map +1 -1
  61. package/dist/backend/llvm/emit-module.js +67 -39
  62. package/dist/backend/llvm/emit-module.js.map +1 -1
  63. package/dist/backend/llvm/emit-statements.d.ts +3 -25
  64. package/dist/backend/llvm/emit-statements.js +414 -37
  65. package/dist/backend/llvm/emit-statements.js.map +1 -1
  66. package/dist/backend/llvm/emitter.d.ts +159 -22
  67. package/dist/backend/llvm/emitter.js +573 -89
  68. package/dist/backend/llvm/emitter.js.map +1 -1
  69. package/dist/backend/llvm/expr-async.js +19 -0
  70. package/dist/backend/llvm/expr-async.js.map +1 -1
  71. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  72. package/dist/backend/llvm/expr-bytes.js +110 -40
  73. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  74. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  75. package/dist/backend/llvm/expr-calls.js +51 -26
  76. package/dist/backend/llvm/expr-calls.js.map +1 -1
  77. package/dist/backend/llvm/expr-containers.js +27 -14
  78. package/dist/backend/llvm/expr-containers.js.map +1 -1
  79. package/dist/backend/llvm/expr-control.js +2 -3
  80. package/dist/backend/llvm/expr-control.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +95 -5
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.js +29 -11
  84. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  85. package/dist/backend/llvm/expr-primitives.test.js +55 -0
  86. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +48 -20
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
  90. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  91. package/dist/backend/llvm/integer-clones.js +3 -3
  92. package/dist/backend/llvm/integer-clones.js.map +1 -1
  93. package/dist/backend/llvm/js-ic.d.ts +18 -0
  94. package/dist/backend/llvm/js-ic.js +712 -0
  95. package/dist/backend/llvm/js-ic.js.map +1 -0
  96. package/dist/backend/llvm/jsval.js +139 -11
  97. package/dist/backend/llvm/jsval.js.map +1 -1
  98. package/dist/backend/llvm/lib-dispatch.js +10 -0
  99. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  100. package/dist/backend/llvm/lib-filesystem.js +61 -0
  101. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  102. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  103. package/dist/backend/llvm/lib-http2.js +20 -17
  104. package/dist/backend/llvm/lib-http2.js.map +1 -1
  105. package/dist/backend/llvm/lib-process.js +69 -17
  106. package/dist/backend/llvm/lib-process.js.map +1 -1
  107. package/dist/backend/llvm/lib-shared.js +75 -1
  108. package/dist/backend/llvm/lib-shared.js.map +1 -1
  109. package/dist/backend/llvm/lib-stream.js +65 -28
  110. package/dist/backend/llvm/lib-stream.js.map +1 -1
  111. package/dist/backend/llvm/lib-tls.js +23 -0
  112. package/dist/backend/llvm/lib-tls.js.map +1 -1
  113. package/dist/backend/llvm/local-array-reads.js +91 -61
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  118. package/dist/backend/llvm/map-number-lookup.js +43 -7
  119. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  120. package/dist/backend/llvm/narrow-guards.js +64 -0
  121. package/dist/backend/llvm/narrow-guards.js.map +1 -1
  122. package/dist/backend/llvm/publish.d.ts +11 -1
  123. package/dist/backend/llvm/publish.js +80 -22
  124. package/dist/backend/llvm/publish.js.map +1 -1
  125. package/dist/backend/llvm/publish.test.js +3 -0
  126. package/dist/backend/llvm/publish.test.js.map +1 -1
  127. package/dist/backend/llvm/receivers.js +1 -1
  128. package/dist/backend/llvm/receivers.js.map +1 -1
  129. package/dist/backend/llvm/reference-writes.js +2 -0
  130. package/dist/backend/llvm/reference-writes.js.map +1 -1
  131. package/dist/backend/llvm/regex-matchers.js +161 -14
  132. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  133. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  134. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  135. package/dist/backend/llvm/regions.js +2 -2
  136. package/dist/backend/llvm/regions.js.map +1 -1
  137. package/dist/backend/llvm/regions.test.js +7 -1
  138. package/dist/backend/llvm/regions.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +17 -9
  140. package/dist/backend/llvm/shapes.js +21 -17
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  143. package/dist/backend/llvm/speculative-integers.js +94 -6
  144. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  145. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  146. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  147. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  148. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  149. package/dist/backend/llvm/string-reads.d.ts +4 -1
  150. package/dist/backend/llvm/string-reads.js +88 -4
  151. package/dist/backend/llvm/string-reads.js.map +1 -1
  152. package/dist/backend/llvm/thread-slots.test.js +5 -4
  153. package/dist/backend/llvm/thread-slots.test.js.map +1 -1
  154. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  155. package/dist/backend/llvm/wasm-modules.js +32 -9
  156. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +8 -0
  158. package/dist/backend/mangle.js +12 -0
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/native/contracts.d.ts +40 -2
  161. package/dist/backend/native/executable.js +40 -7
  162. package/dist/backend/native/executable.js.map +1 -1
  163. package/dist/backend/native/library.js +3 -1
  164. package/dist/backend/native/library.js.map +1 -1
  165. package/dist/backend/native-codegen.d.ts +17 -6
  166. package/dist/backend/native-codegen.js +55 -9
  167. package/dist/backend/native-codegen.js.map +1 -1
  168. package/dist/backend/native-codegen.test.js +18 -14
  169. package/dist/backend/native-codegen.test.js.map +1 -1
  170. package/dist/backend/native-link-info-core.d.ts +30 -2
  171. package/dist/backend/native-link-info-core.js.map +1 -1
  172. package/dist/backend/native-profile.d.ts +32 -0
  173. package/dist/backend/native-profile.js +39 -0
  174. package/dist/backend/native-profile.js.map +1 -0
  175. package/dist/backend/native-profile.test.d.ts +1 -0
  176. package/dist/backend/native-profile.test.js +58 -0
  177. package/dist/backend/native-profile.test.js.map +1 -0
  178. package/dist/backend/native-tools.d.ts +14 -0
  179. package/dist/backend/native-tools.js +13 -0
  180. package/dist/backend/native-tools.js.map +1 -1
  181. package/dist/backend/optimization.d.ts +2 -2
  182. package/dist/backend/runtime-abi.d.ts +2 -2
  183. package/dist/backend/runtime-abi.js +2 -2
  184. package/dist/backend/runtime-pack-core.d.ts +4 -0
  185. package/dist/backend/runtime-pack-core.js +4 -0
  186. package/dist/backend/runtime-pack-core.js.map +1 -1
  187. package/dist/backend/runtime-pack-targets.test.js +7 -1
  188. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  189. package/dist/backend/runtime-pack.d.ts +0 -21
  190. package/dist/backend/runtime-pack.js +0 -29
  191. package/dist/backend/runtime-pack.js.map +1 -1
  192. package/dist/backend/runtime-pack.test.js +12 -69
  193. package/dist/backend/runtime-pack.test.js.map +1 -1
  194. package/dist/backend/target-diagnostics.js +38 -1
  195. package/dist/backend/target-diagnostics.js.map +1 -1
  196. package/dist/backend/warm-cache.js +6 -0
  197. package/dist/backend/warm-cache.js.map +1 -1
  198. package/dist/cli/command.js +89 -7
  199. package/dist/cli/command.js.map +1 -1
  200. package/dist/cli/host.d.ts +3 -0
  201. package/dist/cli/output-options.d.ts +2 -0
  202. package/dist/cli/output-options.js +9 -0
  203. package/dist/cli/output-options.js.map +1 -1
  204. package/dist/cli/usage.d.ts +15 -1
  205. package/dist/cli/usage.js +30 -2
  206. package/dist/cli/usage.js.map +1 -1
  207. package/dist/compile-types.d.ts +9 -0
  208. package/dist/contracts/check.js +2 -3
  209. package/dist/contracts/check.js.map +1 -1
  210. package/dist/coverage/report.d.ts +7 -2
  211. package/dist/coverage/report.js +18 -0
  212. package/dist/coverage/report.js.map +1 -1
  213. package/dist/coverage/verdict-cache.d.ts +1 -0
  214. package/dist/coverage/verdict-cache.js +4 -0
  215. package/dist/coverage/verdict-cache.js.map +1 -1
  216. package/dist/coverage/verdict-semantic.js +4 -0
  217. package/dist/coverage/verdict-semantic.js.map +1 -1
  218. package/dist/diagnostics/diagnostic.js.map +1 -1
  219. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  220. package/dist/diagnostics/dynamic-tier.js +57 -0
  221. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  222. package/dist/diagnostics/envelope.d.ts +2 -1
  223. package/dist/diagnostics/envelope.js +5 -2
  224. package/dist/diagnostics/envelope.js.map +1 -1
  225. package/dist/executable/executable-cache.d.ts +32 -0
  226. package/dist/executable/executable-cache.js +65 -7
  227. package/dist/executable/executable-cache.js.map +1 -1
  228. package/dist/executable/executable-cache.test.js +50 -3
  229. package/dist/executable/executable-cache.test.js.map +1 -1
  230. package/dist/executable/prepare.js +3 -1
  231. package/dist/executable/prepare.js.map +1 -1
  232. package/dist/frontend/analysis.js +1 -0
  233. package/dist/frontend/analysis.js.map +1 -1
  234. package/dist/frontend/arguments-usage.d.ts +8 -0
  235. package/dist/frontend/arguments-usage.js +98 -0
  236. package/dist/frontend/arguments-usage.js.map +1 -1
  237. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  238. package/dist/frontend/arguments-usage.test.js +32 -0
  239. package/dist/frontend/arguments-usage.test.js.map +1 -0
  240. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  241. package/dist/frontend/builtin-package-aliases.js +133 -0
  242. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  243. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  244. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  245. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  246. package/dist/frontend/dispose-hook.d.ts +2 -0
  247. package/dist/frontend/dispose-hook.js +14 -0
  248. package/dist/frontend/dispose-hook.js.map +1 -0
  249. package/dist/frontend/dts-paths.d.ts +4 -0
  250. package/dist/frontend/dts-paths.js +9 -1
  251. package/dist/frontend/dts-paths.js.map +1 -1
  252. package/dist/frontend/jsx-entities.d.ts +4 -0
  253. package/dist/frontend/jsx-entities.js +259 -0
  254. package/dist/frontend/jsx-entities.js.map +1 -0
  255. package/dist/frontend/jsx-source.d.ts +71 -0
  256. package/dist/frontend/jsx-source.js +781 -0
  257. package/dist/frontend/jsx-source.js.map +1 -0
  258. package/dist/frontend/jsx-source.test.d.ts +1 -0
  259. package/dist/frontend/jsx-source.test.js +200 -0
  260. package/dist/frontend/jsx-source.test.js.map +1 -0
  261. package/dist/frontend/literal-values.test.js +8 -9
  262. package/dist/frontend/literal-values.test.js.map +1 -1
  263. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  264. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  265. package/dist/frontend/lowering/array-values.js +3 -2
  266. package/dist/frontend/lowering/array-values.js.map +1 -1
  267. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  268. package/dist/frontend/lowering/binding-analysis.js +2 -2
  269. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  271. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  272. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  273. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  274. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
  276. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
  277. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
  279. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  281. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  283. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  284. package/dist/frontend/lowering/builtins/crypto.d.ts +7 -2
  285. package/dist/frontend/lowering/builtins/crypto.js +63 -4
  286. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  288. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  289. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  290. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  291. package/dist/frontend/lowering/builtins/dates.js +55 -26
  292. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  293. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  294. package/dist/frontend/lowering/builtins/dh.js +151 -0
  295. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  296. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  297. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  298. package/dist/frontend/lowering/builtins/ecdh.d.ts +21 -0
  299. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  300. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  301. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  302. package/dist/frontend/lowering/builtins/errors.js +110 -0
  303. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  304. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  305. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  306. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  307. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  308. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  310. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  311. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  312. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  313. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  314. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  315. package/dist/frontend/lowering/builtins/json.js +54 -1
  316. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  317. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  318. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  319. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  321. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/numbers.js +9 -5
  323. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  324. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  325. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  326. package/dist/frontend/lowering/builtins/performance.js +3 -2
  327. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/process.d.ts +9 -0
  329. package/dist/frontend/lowering/builtins/process.js +47 -2
  330. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  331. package/dist/frontend/lowering/builtins/promises.js +3 -2
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
  334. package/dist/frontend/lowering/builtins/promisify-callback.js +23 -4
  335. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
  337. package/dist/frontend/lowering/builtins/readline.js +23 -6
  338. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  339. package/dist/frontend/lowering/builtins/reflection.js +26 -0
  340. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  341. package/dist/frontend/lowering/builtins/strings.js +13 -5
  342. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  343. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  344. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  345. package/dist/frontend/lowering/builtins/timers.js +6 -2
  346. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  348. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  349. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  350. package/dist/frontend/lowering/builtins/url.js +4 -3
  351. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/v8.js +2 -1
  353. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  354. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  355. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  356. package/dist/frontend/lowering/call-arguments.js +2 -1
  357. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  358. package/dist/frontend/lowering/call-signatures.d.ts +4 -0
  359. package/dist/frontend/lowering/call-signatures.js +137 -13
  360. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  361. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  362. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  363. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  364. package/dist/frontend/lowering/cjs-exports-object.js +34 -1
  365. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  366. package/dist/frontend/lowering/class-assertions.js +3 -2
  367. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  368. package/dist/frontend/lowering/class-construction.d.ts +2 -1
  369. package/dist/frontend/lowering/class-construction.js +8 -13
  370. package/dist/frontend/lowering/class-construction.js.map +1 -1
  371. package/dist/frontend/lowering/class-descriptors.js +1 -1
  372. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  373. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
  374. package/dist/frontend/lowering/class-dynamic-dispatch.js +577 -152
  375. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  376. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
  377. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  378. package/dist/frontend/lowering/class-method-mutations.js +3 -0
  379. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  380. package/dist/frontend/lowering/class-method-values.js +1 -1
  381. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  382. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  383. package/dist/frontend/lowering/class-protocols.js +117 -7
  384. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  385. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  386. package/dist/frontend/lowering/class-prototypes.js +42 -4
  387. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  388. package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
  389. package/dist/frontend/lowering/class-to-primitive.js +31 -8
  390. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  391. package/dist/frontend/lowering/class-unions.js +2 -1
  392. package/dist/frontend/lowering/class-unions.js.map +1 -1
  393. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  394. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  395. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  396. package/dist/frontend/lowering/coercions/function-adapters.js +105 -75
  397. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  398. package/dist/frontend/lowering/coercions/structural.js +8 -7
  399. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  400. package/dist/frontend/lowering/coercions/unions.js +8 -7
  401. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  402. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  403. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  404. package/dist/frontend/lowering/containers/array-callbacks.d.ts +15 -0
  405. package/dist/frontend/lowering/containers/array-callbacks.js +36 -32
  406. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  407. package/dist/frontend/lowering/containers/array-concat.js +2 -1
  408. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  409. package/dist/frontend/lowering/containers/array-construction.js +32 -4
  410. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  411. package/dist/frontend/lowering/containers/array-methods.js +11 -5
  412. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  413. package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
  414. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  415. package/dist/frontend/lowering/containers/bytes.d.ts +10 -1
  416. package/dist/frontend/lowering/containers/bytes.js +601 -24
  417. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  418. package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
  419. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  420. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  421. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  422. package/dist/frontend/lowering/containers/collection-methods.js +80 -10
  423. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  424. package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
  425. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  426. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  427. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  428. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  429. package/dist/frontend/lowering/containers/string-and-regexp.js +85 -22
  430. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  431. package/dist/frontend/lowering/containers/string-replacement.js +2 -1
  432. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  433. package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
  434. package/dist/frontend/lowering/cycle-initialization.js +177 -39
  435. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  436. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  437. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  438. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  439. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  440. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  441. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  442. package/dist/frontend/lowering/dispatch-sites.js +204 -0
  443. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  444. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  445. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  446. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  447. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  448. package/dist/frontend/lowering/dyn-streams.js +1 -1
  449. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  450. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  451. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  452. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  453. package/dist/frontend/lowering/error-methods.js +4 -0
  454. package/dist/frontend/lowering/error-methods.js.map +1 -1
  455. package/dist/frontend/lowering/expressions/array-literals.js +48 -13
  456. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  457. package/dist/frontend/lowering/expressions/binary.js +124 -8
  458. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  459. package/dist/frontend/lowering/expressions/element-access.js +30 -7
  460. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  461. package/dist/frontend/lowering/expressions/identifiers.js +46 -7
  462. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  463. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
  464. package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
  465. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  466. package/dist/frontend/lowering/expressions/narrowing.js +52 -7
  467. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  468. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
  469. package/dist/frontend/lowering/expressions/object-literals.js +75 -7
  470. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  471. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  472. package/dist/frontend/lowering/expressions/optional-chains.js +17 -8
  473. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  474. package/dist/frontend/lowering/expressions/property-access.d.ts +5 -4
  475. package/dist/frontend/lowering/expressions/property-access.js +351 -16
  476. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  477. package/dist/frontend/lowering/expressions/relational.js +112 -9
  478. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  479. package/dist/frontend/lowering/expressions/typeof.js +13 -0
  480. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  481. package/dist/frontend/lowering/expressions/updates.js +64 -10
  482. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  483. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  484. package/dist/frontend/lowering/generator-delegation.js +191 -1
  485. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  486. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  487. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  488. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  489. package/dist/frontend/lowering/generic-functions.d.ts +46 -1
  490. package/dist/frontend/lowering/generic-functions.js +660 -73
  491. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  492. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  493. package/dist/frontend/lowering/handle-properties.js +281 -0
  494. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  495. package/dist/frontend/lowering/intern-tables.js +2 -1
  496. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  497. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  498. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  499. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  500. package/dist/frontend/lowering/iterator-adapters.js +9 -8
  501. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  502. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  503. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  504. package/dist/frontend/lowering/json-require.js +2 -1
  505. package/dist/frontend/lowering/json-require.js.map +1 -1
  506. package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
  507. package/dist/frontend/lowering/key-order-witness.js +21 -4
  508. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  509. package/dist/frontend/lowering/key-order-witness.test.js +38 -2
  510. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  511. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  512. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  513. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  514. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  515. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  516. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  517. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  518. package/dist/frontend/lowering/lower-assert.js +6 -5
  519. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  520. package/dist/frontend/lowering/lower-async-iteration.js +3 -1
  521. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  522. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  523. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  524. package/dist/frontend/lowering/lower-calls.d.ts +4 -0
  525. package/dist/frontend/lowering/lower-calls.js +504 -97
  526. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  527. package/dist/frontend/lowering/lower-classes.d.ts +22 -0
  528. package/dist/frontend/lowering/lower-classes.js +339 -32
  529. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  530. package/dist/frontend/lowering/lower-dgram.js +65 -15
  531. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  532. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  533. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  534. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  535. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  536. package/dist/frontend/lowering/lower-exprs.js +148 -12
  537. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  538. package/dist/frontend/lowering/lower-functions.js +308 -72
  539. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  540. package/dist/frontend/lowering/lower-generators.js +10 -4
  541. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  542. package/dist/frontend/lowering/lower-inspect.js +578 -16
  543. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  544. package/dist/frontend/lowering/lower-mixins.js +2 -1
  545. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  546. package/dist/frontend/lowering/lower-mock.js +2 -1
  547. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  548. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  549. package/dist/frontend/lowering/lower-modules.js +227 -72
  550. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  551. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  552. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  553. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  554. package/dist/frontend/lowering/lower-namespaces.js +24 -3
  555. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  556. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  557. package/dist/frontend/lowering/lower-server.js +263 -60
  558. package/dist/frontend/lowering/lower-server.js.map +1 -1
  559. package/dist/frontend/lowering/lower-stdlib.js +39 -18
  560. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  561. package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
  562. package/dist/frontend/lowering/lower-stmts.js +584 -69
  563. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  564. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  565. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  566. package/dist/frontend/lowering/lower-stream.js +575 -165
  567. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  568. package/dist/frontend/lowering/lower-timers.js +21 -4
  569. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  570. package/dist/frontend/lowering/lowerer.d.ts +151 -30
  571. package/dist/frontend/lowering/lowerer.js +725 -84
  572. package/dist/frontend/lowering/lowerer.js.map +1 -1
  573. package/dist/frontend/lowering/lowerer.test.js +21 -9
  574. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  575. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  576. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  577. package/dist/frontend/lowering/native-ffi.js +1 -1
  578. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  579. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  580. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  581. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  582. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  583. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  584. package/dist/frontend/lowering/private-brands.js +66 -15
  585. package/dist/frontend/lowering/private-brands.js.map +1 -1
  586. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  587. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  588. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  589. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  590. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  591. package/dist/frontend/lowering/require-initialization.js +2 -1
  592. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  593. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  594. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  595. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  596. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  597. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  598. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  599. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  600. package/dist/frontend/lowering/site-dependencies.js +84 -0
  601. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  602. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  603. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  604. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  605. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  606. package/dist/frontend/lowering/stable-names.js +35 -0
  607. package/dist/frontend/lowering/stable-names.js.map +1 -0
  608. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  609. package/dist/frontend/lowering/static-typeof.js +172 -0
  610. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  611. package/dist/frontend/lowering/strict-equality.js +2 -1
  612. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  613. package/dist/frontend/lowering/string-index-bounds.js +3 -2
  614. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  615. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  616. package/dist/frontend/lowering/structural-positions.js +108 -0
  617. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  618. package/dist/frontend/lowering/surfaces.js +72 -30
  619. package/dist/frontend/lowering/surfaces.js.map +1 -1
  620. package/dist/frontend/lowering/thenables.d.ts +16 -0
  621. package/dist/frontend/lowering/thenables.js +124 -0
  622. package/dist/frontend/lowering/thenables.js.map +1 -0
  623. package/dist/frontend/lowering/var-hoisting.js +37 -3
  624. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  625. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  626. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  627. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  628. package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
  629. package/dist/frontend/npm-static-bundled-chunks.js +173 -2
  630. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  631. package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
  632. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  633. package/dist/frontend/npm-static-bundled-esm.js +224 -4
  634. package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
  635. package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
  636. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
  637. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  638. package/dist/frontend/npm-static-enum-iife.js +280 -0
  639. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  640. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  641. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  642. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  643. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  644. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  645. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  646. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  647. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  648. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  649. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  650. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  651. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  652. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  653. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  654. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  655. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  656. package/dist/frontend/npm-static-type-exports.js +261 -0
  657. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  658. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  659. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  660. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  661. package/dist/frontend/npm-static-umd.d.ts +6 -0
  662. package/dist/frontend/npm-static-umd.js +203 -0
  663. package/dist/frontend/npm-static-umd.js.map +1 -0
  664. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  665. package/dist/frontend/npm-static-umd.test.js +105 -0
  666. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  667. package/dist/frontend/npm-static.d.ts +16 -0
  668. package/dist/frontend/npm-static.js +93 -3
  669. package/dist/frontend/npm-static.js.map +1 -1
  670. package/dist/frontend/npm.js +13 -0
  671. package/dist/frontend/npm.js.map +1 -1
  672. package/dist/frontend/package-shims.d.ts +47 -0
  673. package/dist/frontend/package-shims.js +300 -0
  674. package/dist/frontend/package-shims.js.map +1 -0
  675. package/dist/frontend/pipeline.js +67 -1
  676. package/dist/frontend/pipeline.js.map +1 -1
  677. package/dist/frontend/program.d.ts +21 -0
  678. package/dist/frontend/program.js +174 -14
  679. package/dist/frontend/program.js.map +1 -1
  680. package/dist/frontend/program.test.js +1 -1
  681. package/dist/frontend/program.test.js.map +1 -1
  682. package/dist/frontend/resolve.js +13 -0
  683. package/dist/frontend/resolve.js.map +1 -1
  684. package/dist/frontend/services.d.ts +12 -0
  685. package/dist/frontend/services.js +37 -0
  686. package/dist/frontend/services.js.map +1 -1
  687. package/dist/frontend/ts7/ast-node.d.ts +21 -7
  688. package/dist/frontend/ts7/ast-node.js +131 -29
  689. package/dist/frontend/ts7/ast-node.js.map +1 -1
  690. package/dist/frontend/ts7/ast-node.test.js +60 -0
  691. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  692. package/dist/frontend/ts7/ast-wire.d.ts +27 -2
  693. package/dist/frontend/ts7/ast-wire.js +124 -21
  694. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  695. package/dist/frontend/ts7/ast.d.ts +23 -2
  696. package/dist/frontend/ts7/ast.js +143 -2
  697. package/dist/frontend/ts7/ast.js.map +1 -1
  698. package/dist/frontend/ts7/checker.d.ts +13 -1
  699. package/dist/frontend/ts7/checker.js +75 -1
  700. package/dist/frontend/ts7/checker.js.map +1 -1
  701. package/dist/frontend/ts7/checker.test.js +9 -6
  702. package/dist/frontend/ts7/checker.test.js.map +1 -1
  703. package/dist/frontend/ts7/enums.d.ts +3 -3
  704. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  705. package/dist/frontend/ts7/enums.generated.js +21 -0
  706. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  707. package/dist/frontend/ts7/enums.js +19 -0
  708. package/dist/frontend/ts7/enums.js.map +1 -1
  709. package/dist/frontend/ts7/program-host.d.ts +6 -5
  710. package/dist/frontend/ts7/program-host.js +12 -2
  711. package/dist/frontend/ts7/program-host.js.map +1 -1
  712. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  713. package/dist/frontend/ts7/semantic-checker.js +25 -20
  714. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  715. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  716. package/dist/frontend/ts7/semantic-json.js +146 -0
  717. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  718. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  719. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  720. package/dist/frontend/ts7/semantic-model.d.ts +18 -0
  721. package/dist/frontend/ts7/semantic-model.js +90 -16
  722. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  723. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  724. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  725. package/dist/frontend/ts7/session.d.ts +19 -4
  726. package/dist/frontend/ts7/session.js +1 -1
  727. package/dist/frontend/ts7/session.js.map +1 -1
  728. package/dist/frontend/tsc-codes.d.ts +1 -1
  729. package/dist/frontend/tsc-codes.js +7 -0
  730. package/dist/frontend/tsc-codes.js.map +1 -1
  731. package/dist/frontend/type-mapper.d.ts +38 -6
  732. package/dist/frontend/type-mapper.js +466 -47
  733. package/dist/frontend/type-mapper.js.map +1 -1
  734. package/dist/frontend/type-mapper.test.js +1 -1
  735. package/dist/frontend/type-mapper.test.js.map +1 -1
  736. package/dist/frontend-process-args.d.ts +4 -0
  737. package/dist/frontend-process-args.js +52 -0
  738. package/dist/frontend-process-args.js.map +1 -0
  739. package/dist/frontend-process-args.test.d.ts +1 -0
  740. package/dist/frontend-process-args.test.js +47 -0
  741. package/dist/frontend-process-args.test.js.map +1 -0
  742. package/dist/frontend-process.d.ts +1 -0
  743. package/dist/frontend-process.js +23 -0
  744. package/dist/frontend-process.js.map +1 -0
  745. package/dist/heap-collection.d.ts +16 -0
  746. package/dist/heap-collection.js +42 -0
  747. package/dist/heap-collection.js.map +1 -0
  748. package/dist/heap-collection.test.d.ts +1 -0
  749. package/dist/heap-collection.test.js +59 -0
  750. package/dist/heap-collection.test.js.map +1 -0
  751. package/dist/heap-pressure.d.ts +2 -0
  752. package/dist/heap-pressure.js +12 -0
  753. package/dist/heap-pressure.js.map +1 -0
  754. package/dist/index.d.ts +8 -0
  755. package/dist/index.js +453 -85
  756. package/dist/index.js.map +1 -1
  757. package/dist/ir/array-length-stability.d.ts +3 -2
  758. package/dist/ir/array-length-stability.js +22 -2
  759. package/dist/ir/array-length-stability.js.map +1 -1
  760. package/dist/ir/array-length-stability.test.js +47 -1
  761. package/dist/ir/array-length-stability.test.js.map +1 -1
  762. package/dist/ir/builtin-effects.js +41 -0
  763. package/dist/ir/builtin-effects.js.map +1 -1
  764. package/dist/ir/builtin-signatures.d.ts +5 -1
  765. package/dist/ir/builtin-signatures.js +187 -16
  766. package/dist/ir/builtin-signatures.js.map +1 -1
  767. package/dist/ir/final-fields.d.ts +2 -1
  768. package/dist/ir/final-fields.js +2 -2
  769. package/dist/ir/final-fields.js.map +1 -1
  770. package/dist/ir/function-references.test.js +2 -0
  771. package/dist/ir/function-references.test.js.map +1 -1
  772. package/dist/ir/int32-slots.d.ts +13 -5
  773. package/dist/ir/int32-slots.js +112 -115
  774. package/dist/ir/int32-slots.js.map +1 -1
  775. package/dist/ir/int32-slots.test.js +3 -1
  776. package/dist/ir/int32-slots.test.js.map +1 -1
  777. package/dist/ir/integer-loop-facts.d.ts +14 -4
  778. package/dist/ir/integer-loop-facts.js +172 -32
  779. package/dist/ir/integer-loop-facts.js.map +1 -1
  780. package/dist/ir/integer-loops.d.ts +49 -0
  781. package/dist/ir/integer-loops.js +193 -39
  782. package/dist/ir/integer-loops.js.map +1 -1
  783. package/dist/ir/integer-loops.test.js +201 -1
  784. package/dist/ir/integer-loops.test.js.map +1 -1
  785. package/dist/ir/integer-ranges.d.ts +10 -1
  786. package/dist/ir/integer-ranges.js +122 -25
  787. package/dist/ir/integer-ranges.js.map +1 -1
  788. package/dist/ir/integer-ranges.test.js +255 -1
  789. package/dist/ir/integer-ranges.test.js.map +1 -1
  790. package/dist/ir/ir.d.ts +17 -2
  791. package/dist/ir/ir.js +11 -1
  792. package/dist/ir/ir.js.map +1 -1
  793. package/dist/ir/js-ic.d.ts +52 -0
  794. package/dist/ir/js-ic.js +199 -0
  795. package/dist/ir/js-ic.js.map +1 -0
  796. package/dist/ir/js-ic.test.d.ts +1 -0
  797. package/dist/ir/js-ic.test.js +148 -0
  798. package/dist/ir/js-ic.test.js.map +1 -0
  799. package/dist/ir/jsval.js +38 -4
  800. package/dist/ir/jsval.js.map +1 -1
  801. package/dist/ir/runtime-features.d.ts +64 -5
  802. package/dist/ir/runtime-features.js +358 -101
  803. package/dist/ir/runtime-features.js.map +1 -1
  804. package/dist/ir/tiers.js +1 -0
  805. package/dist/ir/tiers.js.map +1 -1
  806. package/dist/ir/traverse.d.ts +2 -0
  807. package/dist/ir/traverse.js +124 -70
  808. package/dist/ir/traverse.js.map +1 -1
  809. package/dist/ir/validate.js +77 -24
  810. package/dist/ir/validate.js.map +1 -1
  811. package/dist/ir/validate.test.js +15 -2
  812. package/dist/ir/validate.test.js.map +1 -1
  813. package/dist/library/ir-policy.js +11 -0
  814. package/dist/library/ir-policy.js.map +1 -1
  815. package/dist/library/library-cache.d.ts +2 -0
  816. package/dist/library/library-cache.js.map +1 -1
  817. package/dist/library/prepare.js +2 -0
  818. package/dist/library/prepare.js.map +1 -1
  819. package/dist/native/cli.js +22 -0
  820. package/dist/native/cli.js.map +1 -1
  821. package/dist/native/compiler.js +33 -4
  822. package/dist/native/compiler.js.map +1 -1
  823. package/dist/native/executable-cache.js +3 -0
  824. package/dist/native/executable-cache.js.map +1 -1
  825. package/dist/native/prepare.js +8 -1
  826. package/dist/native/prepare.js.map +1 -1
  827. package/dist/native/sanitizer.test.js +10 -0
  828. package/dist/native/sanitizer.test.js.map +1 -1
  829. package/dist/startup-cache.d.ts +1 -0
  830. package/dist/startup-cache.js +1 -0
  831. package/dist/startup-cache.js.map +1 -1
  832. package/dist/text-parts.d.ts +7 -0
  833. package/dist/text-parts.js +44 -0
  834. package/dist/text-parts.js.map +1 -1
  835. package/dist/text-parts.test.d.ts +1 -0
  836. package/dist/text-parts.test.js +46 -0
  837. package/dist/text-parts.test.js.map +1 -0
  838. package/dist/timing.d.ts +9 -2
  839. package/dist/timing.js +7 -4
  840. package/dist/timing.js.map +1 -1
  841. package/dist/wasm/translate.d.ts +4 -0
  842. package/dist/wasm/translate.js +2 -2
  843. package/dist/wasm/translate.js.map +1 -1
  844. package/package.json +22 -21
  845. package/shims/fs-extra/core/api.ts +1192 -0
  846. package/shims/fs-extra/index.ts +9 -0
  847. package/shims/undici/core/agent.ts +163 -0
  848. package/shims/undici/core/api.ts +93 -0
  849. package/shims/undici/core/client.ts +1304 -0
  850. package/shims/undici/core/connector.ts +157 -0
  851. package/shims/undici/core/diagnostics-types.ts +68 -0
  852. package/shims/undici/core/diagnostics.ts +16 -0
  853. package/shims/undici/core/dispatcher.ts +574 -0
  854. package/shims/undici/core/errors-v5.ts +22 -0
  855. package/shims/undici/core/errors-v7.ts +25 -0
  856. package/shims/undici/core/errors.ts +255 -0
  857. package/shims/undici/core/fetch.ts +635 -0
  858. package/shims/undici/core/pool.ts +280 -0
  859. package/shims/undici/core/readable.ts +268 -0
  860. package/shims/undici/core/request.ts +313 -0
  861. package/shims/undici/core/timers.ts +80 -0
  862. package/shims/undici/core/types.ts +167 -0
  863. package/shims/undici/core/util.ts +67 -0
  864. package/shims/undici/v5.ts +119 -0
  865. package/shims/undici/v7.ts +119 -0
  866. package/surface-manifest.json +20 -52
@@ -1,3 +1,4 @@
1
+ import { keyedHelperName } from "./stable-names.js";
1
2
  import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
2
3
  import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
3
4
  import { lowerDynStreamMemberCall } from "./dyn-streams.js";
@@ -51,7 +52,7 @@ import { createRequireSpecOf } from "./builtins/module-bindings.js";
51
52
  import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
52
53
  import { lowerCreateRequireCall, lowerImportMetaResolveCall, lowerRequireResolveCall, } from "./builtins/module-resolution.js";
53
54
  import { isWebCryptoReceiver, lowerCipherMethodCall, lowerCryptoGetRandomValues, lowerCryptoHashMethodCall, lowerPromisifiedCryptoCall, } from "./builtins/crypto.js";
54
- import { lowerErrorIsErrorCall } from "./builtins/errors.js";
55
+ import { lowerErrorCaptureStackTraceCall, lowerErrorIsErrorCall } from "./builtins/errors.js";
55
56
  import { lowerPromisifiedDnsCall } from "./lower-dgram.js";
56
57
  import { lowerDisposableStackUseCall } from "./builtins/disposable-stack.js";
57
58
  import { lowerDirentMethodCall, lowerFileHandleMethodCall, lowerDirMethodCall, lowerWatcherMethodCall, } from "./builtins/filesystem.js";
@@ -59,9 +60,10 @@ import { fencePerfEntryKeyWalk, isPerfEntryType, lowerHistogramMethodCall, lower
59
60
  import { lowerProcStreamMethodCall, lowerProcessBuiltinModuleNamespace, } from "./builtins/process.js";
60
61
  import { recordMayKeepSource, throughRecordSource } from "./record-sources.js";
61
62
  import { lowerReflectCall } from "./builtins/reflection.js";
62
- import { lowerAbsenceProbe, v8CalleeText, lowerOptionalNumber, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, } from "./lower-exprs.js";
63
+ import { lowerAbsenceProbe, v8CalleeText, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, primitiveCtorClosure, } from "./lower-exprs.js";
63
64
  import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
64
65
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
66
+ import { lowerChildMethodValue, lowerChildPropertyCall } from "./handle-properties.js";
65
67
  import { classToNumberConversion } from "./class-to-primitive.js";
66
68
  import { hasRuntimeStatics } from "./class-runtime-statics.js";
67
69
  import { structuralReadType } from "./class-unions.js";
@@ -70,6 +72,7 @@ import { EMITTER_API_MEMBERS, exactClassOfReceiver, exactInstanceClassOf, findGe
70
72
  import { classCallbackCall, isClassCallback } from "./class-callbacks.js";
71
73
  import { emitterRooted, lowerEmitterMethodCall } from "./lower-event-emitter.js";
72
74
  import { eventTargetApiMethod, lowerEventTargetMethodCall } from "./lower-event-target.js";
75
+ import { dateRootOf, isDatePrototypeMethod, lowerInheritedDateMethodCall, } from "./builtins/date-classes.js";
73
76
  import { lowerConsoleInstanceCall, lowerConsoleMethodCall, lowerConsoleOutput, } from "./lower-console.js";
74
77
  import { STREAM_API_MEMBERS, STREAM_OPERATORS, lowerStreamMethodCall, lowerStreamStaticCall, streamSidesOf, } from "./lower-stream.js";
75
78
  import { ambientNsRootOf, ambientUndefReadType, ambientUndefVarRootOf, ambientUndefinedFnSymbolOf, contextualUndefReadType, fenceEarlyAliasUse, fenceEarlyNsMemberRef, nsMemberIdentOf, nsUndefRead, } from "./lower-namespaces.js";
@@ -738,10 +741,9 @@ export function lowerCall(lowerer, expr) {
738
741
  // excludes shadowed names. parseInt's omitted radix completes
739
742
  // to 0 — the spec's "undefined" (base 10 with the 0x hex escape);
740
743
  // parseFloat lowers the STRING form only (Node would ToString other
741
- // values — no static story); isNaN/isFinite's arguments are
742
- // checker-pinned (or checked) to number, where the global's ToNumber
743
- // coercion is the identity and the tests are Number.isNaN /
744
- // Number.isFinite exactly (ms's `isFinite(val)` guard).
744
+ // values — no static story); isNaN/isFinite apply the global's
745
+ // ToNumber to any argument, then test like Number.isNaN /
746
+ // Number.isFinite.
745
747
  if ((expr.expression.text === "parseInt" ||
746
748
  expr.expression.text === "isNaN" ||
747
749
  expr.expression.text === "parseFloat" ||
@@ -840,15 +842,11 @@ export function lowerCall(lowerer, expr) {
840
842
  }
841
843
  if (islFn && expr.arguments.nodes.length === islFn.args.length) {
842
844
  // The static forms above already took the exactly-typed argument
843
- // (a string for parseFloat, a number for isFinite): name the
844
- // argument type that refused the call, so the message states the
845
- // condition rather than reading as if the global itself were
846
- // unsupported.
845
+ // (a string for parseFloat): name the argument type that refused
846
+ // the call, so the message states the condition rather than
847
+ // reading as if the global itself were unsupported.
847
848
  const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]);
848
- const exact = expr.expression.text === "isFinite" ? "number" : "string";
849
- lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, exact === "string"
850
- ? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)"
851
- : "only a number argument compiles statically: narrow the argument to a number first");
849
+ lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)");
852
850
  }
853
851
  }
854
852
  // A TYPE-GUARD call on a catch binding (`isErrnoException(err)` —
@@ -1160,6 +1158,7 @@ export function lowerCall(lowerer, expr) {
1160
1158
  lowerCipherMethodCall(lowerer, expr, expr.expression) ??
1161
1159
  lowerFileHandleMethodCall(lowerer, expr, expr.expression) ??
1162
1160
  lowerDirMethodCall(lowerer, expr, expr.expression) ??
1161
+ lowerChildPropertyCall(lowerer, expr, expr.expression) ??
1163
1162
  lowerer.lowerChildMethodCall(expr, expr.expression) ??
1164
1163
  // Piped child-output stream receivers — on/once("data" | "end").
1165
1164
  lowerChildStreamMethodCall(lowerer, expr, expr.expression) ??
@@ -1235,9 +1234,10 @@ export function lowerCall(lowerer, expr) {
1235
1234
  lowerer.fenceStaticReadableStreamMember(expr.expression, "call") ??
1236
1235
  lowerDisposableStackUseCall(lowerer, expr, expr.expression) ??
1237
1236
  lowerer.lowerStdlibMethodCall(expr, expr.expression) ??
1238
- // crypto.getRandomValues on the WebCrypto global (untyped in
1239
- // fallback builds, so before the dyn receiver path) or webcrypto.
1240
- lowerWebCryptoGetRandomValues(lowerer, expr, expr.expression) ??
1237
+ // crypto.getRandomValues / randomUUID on the WebCrypto global
1238
+ // (untyped in fallback builds, so before the dyn receiver path) or
1239
+ // webcrypto.
1240
+ lowerWebCryptoMethodCall(lowerer, expr, expr.expression) ??
1241
1241
  // Dyn receivers (JSON.parse-derived `unknown`/`any` values) —
1242
1242
  lowerDynReceiverMethodCall(lowerer, expr, expr.expression) ??
1243
1243
  // Narrowing filters (inferred predicates, filter(Boolean)) claim
@@ -1246,6 +1246,7 @@ export function lowerCall(lowerer, expr) {
1246
1246
  lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
1247
1247
  lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
1248
1248
  lowerErrorIsErrorCall(lowerer, expr, expr.expression) ??
1249
+ lowerErrorCaptureStackTraceCall(lowerer, expr, expr.expression) ??
1249
1250
  lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
1250
1251
  lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
1251
1252
  lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
@@ -1335,6 +1336,11 @@ export function lowerCall(lowerer, expr) {
1335
1336
  return nsUndefRead(lowerer, ambientRoot.text, expr, t);
1336
1337
  }
1337
1338
  }
1339
+ {
1340
+ const childCall = lowerChildPropertyCall(lowerer, expr, expr.expression, true);
1341
+ if (childCall)
1342
+ return childCall;
1343
+ }
1338
1344
  // The lib fence's METHOD-CALL chokepoint: a stdlib-declared member
1339
1345
  // that every lowering above declined — an unlowered member
1340
1346
  // (m.keys(), p.then(f), Object.keys(o)) or an unlowered call FORM of
@@ -1696,7 +1702,7 @@ function lowerOptionalNumberDefault(lowerer, value, dflt, loc) {
1696
1702
  const key = `number.optionalDefault:${widened.unionId}:${dflt}`;
1697
1703
  let helper = lowerer.valueHelpers.get(key);
1698
1704
  if (!helper) {
1699
- helper = `%number.optionalDefault.${lowerer.valueHelpers.size}`;
1705
+ helper = keyedHelperName(lowerer, "%number.optionalDefault", key);
1700
1706
  lowerer.valueHelpers.set(key, helper);
1701
1707
  const input = varRef("value.0", widened, loc);
1702
1708
  lowerer.liftedFns.push({
@@ -1774,6 +1780,59 @@ function lowerStringMethodCallWithOptionalArgs(lowerer, call, access, receiver,
1774
1780
  }
1775
1781
  return changed ? { ...lowered, args } : lowered;
1776
1782
  }
1783
+ /** `.then(String)` / `.then(Number)` / `.then(Boolean)` over a promise of
1784
+ * a number, string or boolean: the ambient constructor converts its first
1785
+ * argument (the settled value), so the handler is an interned closure over
1786
+ * the settled type applying that conversion. The constructors' own value
1787
+ * form takes a string, which a number or boolean settled value is not.
1788
+ * Null for every other handler. */
1789
+ function primitiveConversionHandler(lowerer, node, inner) {
1790
+ if (!ts.isIdentifier(node))
1791
+ return null;
1792
+ const name = node.text;
1793
+ if (name !== "String" && name !== "Number" && name !== "Boolean")
1794
+ return null;
1795
+ // A string settled value already fits the constructors' value form.
1796
+ if (inner.kind !== "f64" && inner.kind !== "bool")
1797
+ return null;
1798
+ if (!lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(node) ?? undefined))
1799
+ return null;
1800
+ const loc = locOf(node);
1801
+ const ret = name === "String" ? STRING : name === "Number" ? F64 : BOOL;
1802
+ const fnT = funcOf([inner], ret);
1803
+ const key = `then.${name}:${typeKey(inner)}`;
1804
+ let fnName = lowerer.arrHofHelpers.get(key);
1805
+ if (fnName === undefined) {
1806
+ fnName = keyedHelperName(lowerer, `%then.${name}`, key);
1807
+ lowerer.arrHofHelpers.set(key, fnName);
1808
+ const value = varRef("v.0", inner, loc);
1809
+ let body;
1810
+ if (name === "Boolean")
1811
+ body = { kind: "toBool", operand: value, type: BOOL, loc };
1812
+ else if (name === "String")
1813
+ body = { kind: "toString", operand: value, type: STRING, loc };
1814
+ else if (inner.kind === "f64")
1815
+ body = value;
1816
+ else
1817
+ body = {
1818
+ kind: "ternary",
1819
+ cond: value,
1820
+ then: { kind: "numLit", value: 1, type: F64, loc },
1821
+ else_: { kind: "numLit", value: 0, type: F64, loc },
1822
+ type: F64,
1823
+ loc,
1824
+ };
1825
+ lowerer.liftedFns.push({
1826
+ name: fnName,
1827
+ params: [{ localId: "v.0", name: "v", type: inner }],
1828
+ returnType: ret,
1829
+ locals: [{ id: "v.0", name: "v", type: inner, mutable: false }],
1830
+ body: [{ kind: "return", value: body, loc }],
1831
+ loc,
1832
+ });
1833
+ }
1834
+ return { kind: "closure", fnName, captures: [], type: fnT, loc };
1835
+ }
1777
1836
  function lowerNumberConstructorValue(lowerer, argNode, loc) {
1778
1837
  const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, argNode);
1779
1838
  if (undefinedArg) {
@@ -1898,7 +1957,7 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
1898
1957
  const key = `bigint.scalar:${unionId}`;
1899
1958
  let helper = lowerer.valueHelpers.get(key);
1900
1959
  if (!helper) {
1901
- helper = `%bigint.scalar.${lowerer.valueHelpers.size}`;
1960
+ helper = keyedHelperName(lowerer, "%bigint.scalar", key);
1902
1961
  lowerer.valueHelpers.set(key, helper);
1903
1962
  const value = varRef("value.0", arg.type, loc);
1904
1963
  const body = [];
@@ -2587,6 +2646,12 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2587
2646
  const receiver = lowerer.ensureString(receiverValue, receiverNode);
2588
2647
  return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.nodes.slice(1));
2589
2648
  }
2649
+ /** ToNumber of a union of strings, numbers, booleans, null and undefined, as
2650
+ * `Number(value)` converts it; null for other types. Unary `+` takes it too:
2651
+ * the two conversions differ only for BigInt, which such unions don't hold. */
2652
+ export function lowerPrimitiveUnionNumber(lowerer, arg, node, loc) {
2653
+ return (lowerOptionalStringNumber(lowerer, arg, loc) ?? lowerScalarUnionNumber(lowerer, arg, node, loc));
2654
+ }
2590
2655
  function lowerScalarUnionNumber(lowerer, arg, node, loc) {
2591
2656
  if (arg.type.kind !== "union" ||
2592
2657
  !lowerer.unions
@@ -2596,7 +2661,7 @@ function lowerScalarUnionNumber(lowerer, arg, node, loc) {
2596
2661
  const key = `number.scalar:${arg.type.unionId}`;
2597
2662
  let helper = lowerer.valueHelpers.get(key);
2598
2663
  if (!helper) {
2599
- helper = `%number.scalar.${lowerer.valueHelpers.size}`;
2664
+ helper = keyedHelperName(lowerer, "%number.scalar", key);
2600
2665
  lowerer.valueHelpers.set(key, helper);
2601
2666
  const value = varRef("value.0", arg.type, loc);
2602
2667
  const nan = {
@@ -2637,7 +2702,7 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
2637
2702
  const key = `${label}.optionalString:${arg.type.unionId}`;
2638
2703
  let helper = lowerer.valueHelpers.get(key);
2639
2704
  if (!helper) {
2640
- helper = `%${label}.optionalString.${lowerer.valueHelpers.size}`;
2705
+ helper = keyedHelperName(lowerer, `%${label}.optionalString`, key);
2641
2706
  lowerer.valueHelpers.set(key, helper);
2642
2707
  const value = varRef("value.0", arg.type, loc);
2643
2708
  lowerer.liftedFns.push({
@@ -2781,6 +2846,9 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
2781
2846
  ? lowerer.checker.getNonNullableType(rawRecvTs)
2782
2847
  : rawRecvTs;
2783
2848
  if (lowerer.classImplementedProtocol(recvTs)) {
2849
+ const viewed = pickViewGenericMethodCall(lowerer, call, access, recvTs);
2850
+ if (viewed)
2851
+ return viewed;
2784
2852
  const property = lowerer.checker.getPropertyOfType(recvTs, access.name.text);
2785
2853
  if (property &&
2786
2854
  isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker))
@@ -3045,6 +3113,16 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3045
3113
  // IS Node's semantics for every possible dyn value. Shared names would
3046
3114
  // need a receiver-kind dispatch — they keep the fence.
3047
3115
  if (DYN_STRING_ONLY_METHODS.has(access.name.text) && !ownCallable) {
3116
+ // An object-typed receiver the member is missing from (a JavaScript
3117
+ // module object whose members are assigned in a function body,
3118
+ // `common.repeat(" ", n)`) holds a string or an object with that
3119
+ // member: dispatch on the receiver's runtime kind.
3120
+ if (!checkerUntyped &&
3121
+ (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0 &&
3122
+ !call.questionDotToken &&
3123
+ !access.questionDotToken &&
3124
+ !call.arguments.nodes.some(ts.isSpreadElement))
3125
+ return lowerStringOrMemberCall(lowerer, call, access, recv);
3048
3126
  const checked = () => dynStringReceiver(lowerer, recv, access);
3049
3127
  return (lowerRegexMethodCall(lowerer, call, access, checked) ??
3050
3128
  lowerStringMethodCall(lowerer, call, access, checked));
@@ -3116,7 +3194,18 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3116
3194
  ?.arms.every((arm) => arm.kind === "object" &&
3117
3195
  lowerer.classes.get(arm.className)?.fields.has(access.name.text)))
3118
3196
  return true;
3197
+ // A standard-library member spelled as a function-typed property
3198
+ // (undici-types declares Headers.append/forEach/... and the body mixin
3199
+ // as `readonly append: (...) => void`; scriptc's own declarations use
3200
+ // methods) is still the handle's native method: it takes the shared
3201
+ // receiver dispatch below either way (which also calls a plain object's
3202
+ // own member), so the lowering does not depend on which declaration
3203
+ // file supplies the type.
3204
+ const libMethod = prop !== undefined &&
3205
+ prop.declarations.length > 0 &&
3206
+ prop.declarations.every((decl) => lowerer.isStdlibFile(decl.getSourceFile()));
3119
3207
  return (prop !== undefined &&
3208
+ !libMethod &&
3120
3209
  prop.declarations.some((decl) => ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)));
3121
3210
  })();
3122
3211
  // Protocol methods keep their static signature: instances of the
@@ -3220,6 +3309,79 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3220
3309
  loc,
3221
3310
  };
3222
3311
  }
3312
+ /** `value.name(...args)` on a dyn receiver that may be a string or an
3313
+ * object: a string runs the String.prototype lowering, any other value
3314
+ * calls its member. The member is read before the arguments are
3315
+ * evaluated, and the arguments are evaluated once for either branch. */
3316
+ function lowerStringOrMemberCall(lowerer, call, access, recv) {
3317
+ const loc = locOf(call);
3318
+ const receiverLocal = lowerer.declareHiddenLocal("%dynCallReceiver", DYN);
3319
+ const receiver = varRef(receiverLocal.id, DYN, loc);
3320
+ const isString = { kind: "dynTest", test: "string", value: receiver, type: BOOL, loc };
3321
+ const calleeLocal = lowerer.declareHiddenLocal("%dynCallCallee", DYN);
3322
+ const callee = varRef(calleeLocal.id, DYN, loc);
3323
+ const stmts = [
3324
+ { kind: "varDecl", localId: receiverLocal.id, init: recv, loc },
3325
+ {
3326
+ kind: "varDecl",
3327
+ localId: calleeLocal.id,
3328
+ init: {
3329
+ kind: "ternary",
3330
+ cond: isString,
3331
+ then: dynUndefinedExpr(loc),
3332
+ else_: {
3333
+ kind: "dynKeyGet",
3334
+ key: { kind: "strLit", value: access.name.text, type: STRING, loc: locOf(access) },
3335
+ value: receiver,
3336
+ type: DYN,
3337
+ loc: locOf(access),
3338
+ },
3339
+ type: DYN,
3340
+ loc,
3341
+ },
3342
+ loc,
3343
+ },
3344
+ ];
3345
+ const args = call.arguments.nodes.map((node) => {
3346
+ const value = lowerer.lowerExpr(node);
3347
+ const local = lowerer.declareHiddenLocal("%dynCallArg", value.type);
3348
+ stmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
3349
+ return { node, value: varRef(local.id, value.type, value.loc) };
3350
+ });
3351
+ // String.prototype methods ignore arguments past the ones they read.
3352
+ const arity = DYN_STRING_ONLY_ARITY[access.name.text] ?? call.arguments.nodes.length;
3353
+ const stringReceiver = () => ({ kind: "dynCheck", value: receiver, type: STRING, loc });
3354
+ const lowerString = () => (call.arguments.nodes.length <= arity
3355
+ ? lowerRegexMethodCall(lowerer, call, access, stringReceiver)
3356
+ : null) ??
3357
+ lowerStringMethodCall(lowerer, call, access, stringReceiver, call.arguments.nodes.slice(0, arity));
3358
+ const stringCall = lowerer.withExpressionOverrides(args, lowerString);
3359
+ const memberCall = {
3360
+ kind: "dynCall",
3361
+ callee,
3362
+ receiver,
3363
+ calleeName: ts.getTextOfNode(access),
3364
+ args: args.map((arg) => lowerer.coerceToExpected(arg.value, DYN)),
3365
+ type: DYN,
3366
+ loc,
3367
+ };
3368
+ return {
3369
+ kind: "seqExpr",
3370
+ stmts,
3371
+ result: {
3372
+ kind: "ternary",
3373
+ cond: isString,
3374
+ then: stringCall
3375
+ ? lowerer.coerceToExpected(stringCall, DYN)
3376
+ : nodeThrowExpr(0, "SC1090", `method calls like '${ts.getTextOfNode(access)}' on a string are not supported yet [SC1090 at ${ts.getSourceFileOfNode(call).fileName}:${ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(call), ts.tokenStartOfNode(call)).line + 1}]`, DYN, loc),
3377
+ else_: memberCall,
3378
+ type: DYN,
3379
+ loc,
3380
+ },
3381
+ type: DYN,
3382
+ loc,
3383
+ };
3384
+ }
3223
3385
  /** Prototype method names of the checked-dynamic tree-representable kinds (String, Array,
3224
3386
  * Object, Function, Number prototypes): a dyn receiver call on one of
3225
3387
  * these could be a REAL method on a real value, which a stored-member
@@ -3381,6 +3543,12 @@ const DYN_DISPATCH_METHODS = new Set([
3381
3543
  "prependOnceListener",
3382
3544
  "listeners",
3383
3545
  "listenerCount",
3546
+ // The rest of EventEmitter.prototype, which compiled emitters answer
3547
+ // through the class dispatch (class-dynamic-dispatch.ts).
3548
+ "rawListeners",
3549
+ "eventNames",
3550
+ "setMaxListeners",
3551
+ "getMaxListeners",
3384
3552
  "write",
3385
3553
  "end",
3386
3554
  "destroy",
@@ -3590,7 +3758,19 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3590
3758
  }
3591
3759
  }
3592
3760
  }
3761
+ // `String`, `Number` or `Boolean` as the callback of an array method
3762
+ // (`values.map(String)` over an unknown array): the method calls it with
3763
+ // each element, whatever its type, and cannot observe which function
3764
+ // value it received, so it gets the constructor's form that converts any
3765
+ // argument rather than the string-input form typed code stores.
3766
+ const arrayCallbackReceiver = ARRAY_CALLBACK_METHODS.has(method) &&
3767
+ lowerer.checker.isArrayType(lowerer.typeOf(access.expression));
3593
3768
  const args = call.arguments.nodes.map((arg, i) => {
3769
+ const primitive = i === 0 && arrayCallbackReceiver && ts.isIdentifier(arg)
3770
+ ? stdlibGlobalNameOf(lowerer, arg)
3771
+ : null;
3772
+ if (primitive === "String" || primitive === "Number" || primitive === "Boolean")
3773
+ return lowerer.coerceInto(arg, primitiveCtorClosure(lowerer, primitive, locOf(arg), true), DYN);
3594
3774
  if (i === 0 && predicate)
3595
3775
  return lowerer.coerceInto(arg, predicate, DYN);
3596
3776
  const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, arg);
@@ -3608,6 +3788,20 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3608
3788
  loc: locOf(call),
3609
3789
  };
3610
3790
  }
3791
+ /** Array.prototype methods whose first argument is a callback they call
3792
+ * with the elements. */
3793
+ const ARRAY_CALLBACK_METHODS = new Set([
3794
+ "map",
3795
+ "filter",
3796
+ "forEach",
3797
+ "some",
3798
+ "every",
3799
+ "find",
3800
+ "findIndex",
3801
+ "findLast",
3802
+ "findLastIndex",
3803
+ "flatMap",
3804
+ ]);
3611
3805
  /** Every String.prototype method name a typed or dyn string lowering
3612
3806
  * answers. */
3613
3807
  function isStringMethodName(name) {
@@ -3618,6 +3812,28 @@ function isStringMethodName(name) {
3618
3812
  name === "normalize" ||
3619
3813
  name === "lastIndexOf");
3620
3814
  }
3815
+ /** How many arguments each DYN_STRING_ONLY_METHODS method reads. */
3816
+ const DYN_STRING_ONLY_ARITY = {
3817
+ charCodeAt: 1,
3818
+ charAt: 1,
3819
+ startsWith: 2,
3820
+ endsWith: 2,
3821
+ substring: 2,
3822
+ repeat: 1,
3823
+ trim: 0,
3824
+ trimStart: 0,
3825
+ trimEnd: 0,
3826
+ split: 2,
3827
+ padStart: 2,
3828
+ padEnd: 2,
3829
+ toLowerCase: 0,
3830
+ toUpperCase: 0,
3831
+ replace: 2,
3832
+ replaceAll: 2,
3833
+ match: 1,
3834
+ matchAll: 1,
3835
+ search: 1,
3836
+ };
3621
3837
  /** STR_METHODS ∪ the regex-form names, MINUS everything Array (or any
3622
3838
  * other dyn kind's prototype) also declares. */
3623
3839
  const DYN_STRING_ONLY_METHODS = new Set([
@@ -3656,8 +3872,14 @@ function lowerArrayIsArrayCall(lowerer, call, access) {
3656
3872
  if (call.arguments.nodes.length !== 1)
3657
3873
  return null; // the stdlib chokepoint fences
3658
3874
  const argNode = call.arguments.nodes[0];
3659
- const arg = lowerer.lowerExpr(argNode);
3875
+ let arg = lowerer.lowerExpr(argNode);
3660
3876
  const loc = locOf(call);
3877
+ // A checker-narrowed dyn read arrives as a validated extraction (the
3878
+ // dynCheck bridge). The runtime value may be wider than the flow type
3879
+ // claims (an overload narrower than what arrives), so test the dyn value
3880
+ // itself instead of folding on the extracted type (typeof's rule).
3881
+ if (arg.kind === "dynCheck" && arg.value.type.kind === "dyn")
3882
+ arg = arg.value;
3661
3883
  if (arg.type.kind === "dyn") {
3662
3884
  return { kind: "dynTest", test: "array", value: arg, type: BOOL, loc };
3663
3885
  }
@@ -3933,7 +4155,7 @@ function lowerDefaultToStringCall(lowerer, call, access) {
3933
4155
  const key = `objToStr:${typeKey(recv.type)}${missing ? `:${missing}` : ""}`;
3934
4156
  let helper = lowerer.valueHelpers.get(key);
3935
4157
  if (!helper) {
3936
- helper = `%obj.tostr.${lowerer.valueHelpers.size}`;
4158
+ helper = keyedHelperName(lowerer, "%obj.tostr", key);
3937
4159
  lowerer.valueHelpers.set(key, helper);
3938
4160
  const o = varRef("o.0", recv.type, loc);
3939
4161
  lowerer.liftedFns.push({
@@ -4545,7 +4767,7 @@ function loweredTemplateStrings(lowerer, expr, cooked, loc, raw) {
4545
4767
  const site = lowerer.globalsList.length;
4546
4768
  const globalId = `%g.templateStrings.${site}`;
4547
4769
  const readyId = `%g.templateStringsReady.${site}`;
4548
- getter = `%templateStrings.get.${lowerer.valueHelpers.size}`;
4770
+ getter = keyedHelperName(lowerer, "%templateStrings.get", key);
4549
4771
  lowerer.valueHelpers.set(key, getter);
4550
4772
  lowerer.globalsList.push({ id: globalId, name: "%templateStrings", type, mutable: true }, { id: readyId, name: "%templateStringsReady", type: BOOL, mutable: true });
4551
4773
  lowerer.liftedFns.push({
@@ -4714,7 +4936,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4714
4936
  // IS the spec's identity/thrower/no-op substitution for all three
4715
4937
  // members. An argument expression, when present, is undefined/null
4716
4938
  // by construction — nothing to evaluate.
4717
- const fnName = `%fn${lowerer.lambdaCounter++}_${member}pass`;
4939
+ const fnName = lowerer.closureName(loc, `_${member}pass`);
4718
4940
  const funcType = { kind: "func", params: [promT], ret: promT };
4719
4941
  const fnCtx = newFnCtx(true, null, funcType, inner);
4720
4942
  fnCtx.isAsync = true;
@@ -4796,7 +5018,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4796
5018
  // Evaluate both callback expressions before the wrapper runs, in source order.
4797
5019
  const fulfilled = fulfilledAbsent ? null : boxHandler(fulfilledNode, true);
4798
5020
  const rejected = rejectedAbsent ? null : boxHandler(rejectedNode, false);
4799
- const fnName = `%fn${lowerer.lambdaCounter++}_then2`;
5021
+ const fnName = lowerer.closureName(loc, "_then2");
4800
5022
  const paramTypes = [
4801
5023
  promT,
4802
5024
  ...(fulfilled ? [fulfilled.value.type] : []),
@@ -4982,7 +5204,8 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4982
5204
  // the handle is the value's only story, isIslandExpr's local rule).
4983
5205
  if (inner.kind === "moduleNs")
4984
5206
  markModuleNsHandlerParams(lowerer, call.arguments.nodes[0], inner);
4985
- let cb = lowerer.lowerExpr(call.arguments.nodes[0]);
5207
+ let cb = primitiveConversionHandler(lowerer, call.arguments.nodes[0], inner) ??
5208
+ lowerer.lowerExpr(call.arguments.nodes[0]);
4986
5209
  // A TYPED handler on a DYN-settling promise (the tracePromise
4987
5210
  // result's `.then((value) => ...)` — the checker's generic
4988
5211
  // instantiation typed the parameter, but the settled value is a
@@ -5014,7 +5237,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5014
5237
  lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
5015
5238
  };
5016
5239
  const resultT = { kind: "promise", inner: DYN };
5017
- const fnName = `%fn${lowerer.lambdaCounter++}_then`;
5240
+ const fnName = lowerer.closureName(loc, "_then");
5018
5241
  const funcType = {
5019
5242
  kind: "func",
5020
5243
  params: [promT, DYN],
@@ -5097,7 +5320,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5097
5320
  lowerer.noLowering("then with this handler's result type", call, "the combined result must be a representable promise");
5098
5321
  }
5099
5322
  const R = resultT.inner;
5100
- const fnName = `%fn${lowerer.lambdaCounter++}_then`;
5323
+ const fnName = lowerer.closureName(loc, "_then");
5101
5324
  const funcType = {
5102
5325
  kind: "func",
5103
5326
  params: [promT, cb.type],
@@ -5201,7 +5424,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5201
5424
  if (cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void") {
5202
5425
  lowerer.unsupported("SC1090", call.arguments.nodes[0], "finally callbacks with parameters or a return value (use () => { ... })");
5203
5426
  }
5204
- const fnName = `%fn${lowerer.lambdaCounter++}_finally`;
5427
+ const fnName = lowerer.closureName(loc, "_finally");
5205
5428
  const funcType = {
5206
5429
  kind: "func",
5207
5430
  params: [promT, cb.type],
@@ -5297,7 +5520,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5297
5520
  }
5298
5521
  if (cb.type.kind === "dyn") {
5299
5522
  const resultT = { kind: "promise", inner: DYN };
5300
- const fnName = `%fn${lowerer.lambdaCounter++}_catchdyn`;
5523
+ const fnName = lowerer.closureName(loc, "_catchdyn");
5301
5524
  const funcType = {
5302
5525
  kind: "func",
5303
5526
  params: [promT, DYN],
@@ -5414,7 +5637,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5414
5637
  "own type, or annotate the handler `(): undefined =>` for the T | undefined result");
5415
5638
  }
5416
5639
  const R = resultT.inner;
5417
- const fnName = `%fn${lowerer.lambdaCounter++}_catch`;
5640
+ const fnName = lowerer.closureName(loc, "_catch");
5418
5641
  const funcType = { kind: "func", params: [promT], ret: resultT };
5419
5642
  const fnCtx = newFnCtx(true, null, funcType, R);
5420
5643
  fnCtx.isAsync = true;
@@ -5632,7 +5855,7 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
5632
5855
  const existing = lowerer.arrHofHelpers.get(key);
5633
5856
  if (existing)
5634
5857
  return existing;
5635
- const name = `%arr.filterNarrow.${lowerer.arrHofHelpers.size}`;
5858
+ const name = keyedHelperName(lowerer, "%arr.filterNarrow", key);
5636
5859
  lowerer.arrHofHelpers.set(key, name);
5637
5860
  const arrT = arrayOf(elem);
5638
5861
  const outT = arrayOf(outElem);
@@ -5854,7 +6077,7 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5854
6077
  const key = `obj.keys:${argIr.shapeId}:${typeKey(resultT)}`;
5855
6078
  let helper = lowerer.arrHofHelpers.get(key);
5856
6079
  if (!helper) {
5857
- helper = `%obj.keys.${lowerer.arrHofHelpers.size}`;
6080
+ helper = keyedHelperName(lowerer, "%obj.keys", key);
5858
6081
  const ref = { kind: "varRef", localId: "r.0", type: argIr, loc };
5859
6082
  const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
5860
6083
  lowerer.arrHofHelpers.set(key, helper);
@@ -5922,7 +6145,7 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
5922
6145
  const existing = lowerer.arrHofHelpers.get(key);
5923
6146
  if (existing)
5924
6147
  return existing;
5925
- const helper = `%obj.hasOwn.${lowerer.arrHofHelpers.size}`;
6148
+ const helper = keyedHelperName(lowerer, "%obj.hasOwn", key);
5926
6149
  lowerer.arrHofHelpers.set(key, helper);
5927
6150
  const shape = lowerer.shapes.get(shapeId);
5928
6151
  const recT = { kind: "record", shapeId };
@@ -6000,7 +6223,7 @@ function classAssignHelper(lowerer, className, srcShapeId, loc) {
6000
6223
  const existing = lowerer.arrHofHelpers.get(key);
6001
6224
  if (existing)
6002
6225
  return existing;
6003
- const helper = `%obj.assignClass.${lowerer.arrHofHelpers.size}`;
6226
+ const helper = keyedHelperName(lowerer, "%obj.assignClass", key);
6004
6227
  lowerer.arrHofHelpers.set(key, helper);
6005
6228
  const sShape = lowerer.shapes.get(srcShapeId);
6006
6229
  const oT = { kind: "object", className };
@@ -6061,7 +6284,7 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
6061
6284
  const existing = lowerer.arrHofHelpers.get(key);
6062
6285
  if (existing)
6063
6286
  return existing;
6064
- const helper = `%obj.assign.${lowerer.arrHofHelpers.size}`;
6287
+ const helper = keyedHelperName(lowerer, "%obj.assign", key);
6065
6288
  lowerer.arrHofHelpers.set(key, helper);
6066
6289
  const sShape = lowerer.shapes.get(srcShapeId);
6067
6290
  const tShape = lowerer.shapes.get(targetShapeId);
@@ -6242,6 +6465,33 @@ function lowerObjectStaticCall(lowerer, call, access) {
6242
6465
  if (!lowerer.isStdlibGlobal(access.expression, "Object"))
6243
6466
  return null;
6244
6467
  const member = access.name.text;
6468
+ // `Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")` (Effect's
6469
+ // isStackTraceLimitWritable): Error's own writable, enumerable,
6470
+ // configurable data property holding the current limit. The interned
6471
+ // Error value models no other statics (builtinGlobalValueAt).
6472
+ const [first, second] = call.arguments.nodes;
6473
+ if (member === "getOwnPropertyDescriptor" &&
6474
+ call.arguments.nodes.length === 2 &&
6475
+ lowerer.isStdlibGlobal(first, "Error") &&
6476
+ ts.isStringLiteralLike(second) &&
6477
+ second.text === "stackTraceLimit") {
6478
+ const loc = locOf(call);
6479
+ const dyn = (value) => ({ kind: "dynFrom", value, type: DYN, loc });
6480
+ const yes = dyn({ kind: "boolLit", value: true, type: BOOL, loc });
6481
+ const limit = { kind: "libCall", fn: "error.stackLimitGet", args: [], type: F64, loc };
6482
+ return {
6483
+ kind: "dynObjLit",
6484
+ fields: [
6485
+ { key: { kind: "strLit", value: "value", type: STRING, loc }, value: dyn(limit) },
6486
+ ...["writable", "enumerable", "configurable"].map((key) => ({
6487
+ key: { kind: "strLit", value: key, type: STRING, loc },
6488
+ value: yes,
6489
+ })),
6490
+ ],
6491
+ type: DYN,
6492
+ loc,
6493
+ };
6494
+ }
6245
6495
  if ((member === "getOwnPropertyNames" ||
6246
6496
  member === "getOwnPropertySymbols" ||
6247
6497
  member === "getOwnPropertyDescriptors") &&
@@ -6596,6 +6846,11 @@ function lowerObjectStaticCall(lowerer, call, access) {
6596
6846
  const target = lowerer.lowerExpr(call.arguments.nodes[0]);
6597
6847
  const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]);
6598
6848
  fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1], rawSource.type);
6849
+ let targetNode = call.arguments.nodes[0];
6850
+ while (ts.isParenthesizedExpression(targetNode))
6851
+ targetNode = targetNode.expression;
6852
+ if (ts.isObjectLiteralExpression(targetNode))
6853
+ fenceClassCopyIntoFreshObject(lowerer, call, call.arguments.nodes[1], rawSource);
6599
6854
  const source = lowerer.coerceToExpected(rawSource, DYN);
6600
6855
  if (target.type.kind === "dyn" && source.type.kind === "dyn") {
6601
6856
  return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
@@ -6734,19 +6989,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
6734
6989
  const srcNode = spread ? argNode.expression : argNode;
6735
6990
  const rawSource = lowerer.lowerExpr(srcNode);
6736
6991
  fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread);
6737
- // A class instance copied into a fresh object
6738
- // (`Object.assign({}, instance)`): the result is a plain
6739
- // object holding the instance's own fields, never an
6740
- // instance, so a result the checker types as the class has
6741
- // no representation (the checked cast would throw).
6742
- if (rawSource.type.kind === "object" &&
6743
- freshLiteralTarget &&
6744
- !ts.isExpressionStatement(call.parent)) {
6745
- const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
6746
- if (resultT !== null && resultT.kind === "object") {
6747
- lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
6748
- }
6749
- }
6992
+ if (freshLiteralTarget)
6993
+ fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource);
6750
6994
  const src = lowerer.coerceToExpected(rawSource, DYN);
6751
6995
  if (src.type.kind !== "dyn") {
6752
6996
  ok = false;
@@ -6968,6 +7212,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6968
7212
  loc,
6969
7213
  };
6970
7214
  }
7215
+ const fnIntegrity = functionIntegrity(lowerer, member, value, call.arguments.nodes[0], locOf(call));
7216
+ if (fnIntegrity)
7217
+ return fnIntegrity;
6971
7218
  if (member === "preventExtensions" || member === "seal") {
6972
7219
  const integrity = lowerClassIntegrity(lowerer, call, member, value);
6973
7220
  if (integrity)
@@ -7045,6 +7292,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
7045
7292
  arm.kind === "string" ||
7046
7293
  arm.kind === "symbol"))
7047
7294
  return value;
7295
+ const fnIntegrity = functionIntegrity(lowerer, "freeze", value, argNode, locOf(call));
7296
+ if (fnIntegrity)
7297
+ return fnIntegrity;
7048
7298
  const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
7049
7299
  if (integrity)
7050
7300
  return integrity;
@@ -7364,7 +7614,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
7364
7614
  const key = `obj.${member}:${argIr.shapeId}:${typeKey(resultT)}`;
7365
7615
  let helper = lowerer.arrHofHelpers.get(key);
7366
7616
  if (!helper) {
7367
- helper = `%obj.${member}.${lowerer.arrHofHelpers.size}`;
7617
+ helper = keyedHelperName(lowerer, `%obj.${member}`, key);
7368
7618
  const recT = argIr;
7369
7619
  const ref = { kind: "varRef", localId: "r.0", type: recT, loc };
7370
7620
  const outRef = { kind: "varRef", localId: "out.0", type: resultT, loc };
@@ -7927,7 +8177,7 @@ function lowerInlineArrowBind(lowerer, call, access) {
7927
8177
  const length = firstDefault < 0 ? arrow.parameters.nodes.length : firstDefault;
7928
8178
  const key = `arrow.bind:${typeKey(type)}:${length}`;
7929
8179
  const existing = lowerer.arrHofHelpers.get(key);
7930
- const name = existing ?? `%arrow.bind.${lowerer.arrHofHelpers.size}`;
8180
+ const name = existing ?? keyedHelperName(lowerer, "%arrow.bind", key);
7931
8181
  if (!existing) {
7932
8182
  lowerer.arrHofHelpers.set(key, name);
7933
8183
  lowerer.freshClosureAdapters.add(name);
@@ -8174,13 +8424,31 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
8174
8424
  if ((name === "apply" || name === "call" || name === "bind") &&
8175
8425
  lowerer.checker.getCallSignatures(recvT).length > 0) {
8176
8426
  const value = tryLowerExpression(lowerer, access.expression);
8177
- if (value?.type.kind === "func" &&
8178
- lowerer.dynConvertible(value.type) &&
8427
+ // Builtin function values held as checked-dynamic functions
8428
+ // (String.fromCharCode, JSON.stringify) bind the same way, and so
8429
+ // does a member that lowers to a checked-dynamic value (a native
8430
+ // handle's method read in JavaScript).
8431
+ if (value &&
8432
+ (value.type.kind === "dyn" ||
8433
+ (value.type.kind === "func" && lowerer.dynConvertible(value.type))) &&
8179
8434
  !call.arguments.nodes.some(ts.isSpreadElement)) {
8180
8435
  const loc = locOf(call);
8181
8436
  return {
8182
8437
  kind: "dynInvoke",
8183
- recv: { kind: "dynFrom", value, type: DYN, loc },
8438
+ recv: value.type.kind === "dyn" ? value : { kind: "dynFrom", value, type: DYN, loc },
8439
+ method: name,
8440
+ calleeName: ts.getTextOfNode(access),
8441
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8442
+ type: DYN,
8443
+ loc,
8444
+ };
8445
+ }
8446
+ const childMethod = lowerChildMethodValue(lowerer, access.expression);
8447
+ if (childMethod && !call.arguments.nodes.some(ts.isSpreadElement)) {
8448
+ const loc = locOf(call);
8449
+ return {
8450
+ kind: "dynInvoke",
8451
+ recv: childMethod,
8184
8452
  method: name,
8185
8453
  calleeName: ts.getTextOfNode(access),
8186
8454
  args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
@@ -8363,6 +8631,10 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8363
8631
  if (info && !found && eventTargetApiMethod(info, access.name.text)) {
8364
8632
  return lowerEventTargetMethodCall(lowerer, call, access, info, lowerReceiver());
8365
8633
  }
8634
+ // The Date methods a class declared `extends Date` does not declare.
8635
+ if (info && !found && dateRootOf(info) && isDatePrototypeMethod(access.name.text)) {
8636
+ return lowerInheritedDateMethodCall(lowerer, call, access.name.text, info, lowerReceiver());
8637
+ }
8366
8638
  // GENERIC methods (own type parameters) never enter the methods table:
8367
8639
  // they monomorphize per call site and dispatch statically
8368
8640
  // (lowerClassGenericMethodCall has the exactness rules).
@@ -8721,7 +8993,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
8721
8993
  const receiverRef = varRef(receiverLocal.id, receiverT, loc);
8722
8994
  let helper = lowerer.unionCallHelpers.get(key);
8723
8995
  if (!helper) {
8724
- helper = `%union.call.${lowerer.unionCallHelpers.size}`;
8996
+ helper = keyedHelperName(lowerer, "%union.call", key);
8725
8997
  lowerer.unionCallHelpers.set(key, helper);
8726
8998
  const receiverRef = varRef("this.0", receiverT, loc);
8727
8999
  const branch = (plan) => {
@@ -8801,7 +9073,7 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
8801
9073
  const existing = lowerer.unionCallHelpers.get(key);
8802
9074
  if (existing)
8803
9075
  return existing;
8804
- const name = `%union.call.${lowerer.unionCallHelpers.size}`;
9076
+ const name = keyedHelperName(lowerer, "%union.call", key);
8805
9077
  lowerer.unionCallHelpers.set(key, name);
8806
9078
  // A probe that catches a refusal while the body lowers must not leave
8807
9079
  // the name registered for a helper that was never emitted.
@@ -8906,20 +9178,43 @@ function loweredArgumentText(lowerer, arg) {
8906
9178
  * fences; null when the argument shape has no static form (the caller
8907
9179
  * reports the SC2012 refusal). */
8908
9180
  export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
8909
- if (name === "parseInt" || name === "isNaN") {
9181
+ if (name === "parseInt" || name === "isNaN" || name === "isFinite") {
8910
9182
  const maxArgs = name === "parseInt" ? 2 : 1;
8911
9183
  if (args.length < 1 || args.length > maxArgs) {
8912
9184
  lowerer.noLowering(`${name} with ${args.length} argument${args.length === 1 ? "" : "s"}`, call);
8913
9185
  }
8914
- if (name === "isNaN") {
8915
- // The global's ToNumber turns a missing value into NaN.
9186
+ if (name === "isNaN" || name === "isFinite") {
9187
+ // The global's ToNumber turns a missing value into NaN, converts
9188
+ // strings, booleans and null, and calls valueOf/toString on objects.
8916
9189
  const x = lowerToNumberArgument(lowerer, args[0]);
8917
- return { kind: "libCall", fn: "num.isNaN", args: [x], type: BOOL, loc };
9190
+ const fn = name === "isNaN" ? "num.isNaN" : "number.isFinite";
9191
+ return { kind: "libCall", fn, args: [x], type: BOOL, loc };
8918
9192
  }
8919
9193
  const radix = args[1]
8920
9194
  ? lowerer.lowerExprExpecting(args[1], F64)
8921
9195
  : { kind: "numLit", value: 0, type: F64, loc };
8922
- const optional = optionalCallValue(lowerer, args[0]);
9196
+ let optional = optionalCallValue(lowerer, args[0]);
9197
+ let lowered = null;
9198
+ // A possibly-missing or untyped text in JavaScript (`parseInt(process.
9199
+ // env.PORT, 10)`): TypeScript rejects the call, Node parses the text
9200
+ // of whatever arrives ("undefined").
9201
+ if (optional === null && isJsSourceFile(ts.getSourceFileOfNode(call))) {
9202
+ const argT = lowerer.typeOf(args[0]);
9203
+ const parts = argT.isUnionType() ? ts.constituentTypes(argT) : [argT];
9204
+ if (parts.some((part) => (part.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Null | ts.TypeFlags.Any)) !== 0)) {
9205
+ const raw = lowerer.lowerExpr(args[0]);
9206
+ if (raw.type.kind === "union") {
9207
+ optional = raw;
9208
+ lowered = raw;
9209
+ }
9210
+ else {
9211
+ const text = raw.type.kind === "dyn"
9212
+ ? { kind: "libCall", fn: "dyn.toStringCoerce", args: [raw], type: STRING, loc }
9213
+ : lowerer.coerceInto(args[0], raw, STRING);
9214
+ return { kind: "libCall", fn: "num.parseInt", args: [text, radix], type: F64, loc };
9215
+ }
9216
+ }
9217
+ }
8923
9218
  if (optional?.type.kind === "union") {
8924
9219
  const def = lowerer.unions.get(optional.type.unionId);
8925
9220
  const stringTag = def?.arms.findIndex((arm) => arm.kind === "string") ?? -1;
@@ -8930,7 +9225,7 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
8930
9225
  const key = `parseInt.optional:${unionT.unionId}`;
8931
9226
  let helper = lowerer.valueHelpers.get(key);
8932
9227
  if (!helper) {
8933
- helper = `%parseInt.optional.${lowerer.valueHelpers.size}`;
9228
+ helper = keyedHelperName(lowerer, "%parseInt.optional", key);
8934
9229
  lowerer.valueHelpers.set(key, helper);
8935
9230
  const value = { kind: "varRef", localId: "value.0", type: unionT, loc };
8936
9231
  const radixRef = { kind: "varRef", localId: "radix.0", type: F64, loc };
@@ -9014,30 +9309,37 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9014
9309
  return { kind: "call", callee: helper, args: [optional, radix], type: F64, loc };
9015
9310
  }
9016
9311
  }
9017
- const s = lowerer.lowerExprExpecting(args[0], STRING);
9312
+ const s = lowered !== null
9313
+ ? lowerer.coerceInto(args[0], lowered, STRING)
9314
+ : lowerer.lowerExprExpecting(args[0], STRING);
9018
9315
  return { kind: "libCall", fn: "num.parseInt", args: [s, radix], type: F64, loc };
9019
9316
  }
9020
- // STATIC parseFloat/isFinite over exactly-typed arguments —
9021
- // parseInt's siblings (num.parseFloat is ECMA 19.2.4's decimal-
9022
- // literal prefix parse in scr_string.c; a number-typed isFinite IS
9023
- // Number.isFinite — the global's ToNumber coercion is the identity
9024
- // there, ms's `isFinite(val)` guard). Other argument types retain
9025
- // their native coercion checks or the SC2012 refusal. The probe never
9026
- // emits — lowering is IR construction.
9027
- if ((name === "parseFloat" || name === "isFinite") && args.length === 1) {
9028
- if (name === "parseFloat") {
9029
- const optional = optionalCallValue(lowerer, args[0]);
9030
- if (optional) {
9031
- const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
9032
- if (parsed)
9033
- return parsed;
9034
- }
9317
+ // parseFloat takes one argument; Node ignores the rest after evaluating
9318
+ // them (`parseFloat(text, 10)`). Literal and identifier extras have
9319
+ // nothing to evaluate.
9320
+ if (name === "parseFloat" &&
9321
+ args.length > 1 &&
9322
+ args
9323
+ .slice(1)
9324
+ .every((arg) => ts.isNumericLiteral(arg) || ts.isStringLiteral(arg) || ts.isIdentifier(arg)))
9325
+ return lowerStaticNumberGlobal(lowerer, name, call, args.slice(0, 1), loc);
9326
+ // STATIC parseFloat over string arguments — parseInt's sibling
9327
+ // (num.parseFloat is ECMA 19.2.4's decimal-literal prefix parse in
9328
+ // scr_string.c). Other argument types retain their native coercion
9329
+ // checks or the SC2012 refusal. The probe never emits — lowering is IR
9330
+ // construction.
9331
+ if (name === "parseFloat" && args.length === 1) {
9332
+ const optional = optionalCallValue(lowerer, args[0]);
9333
+ if (optional) {
9334
+ const parsed = lowerOptionalStringNumber(lowerer, optional, loc, "num.parseFloat", "parseFloat");
9335
+ if (parsed)
9336
+ return parsed;
9035
9337
  }
9036
9338
  const probed = tryLowerExpression(lowerer, args[0]);
9037
- if (name === "parseFloat" && probed?.type.kind === "string") {
9339
+ if (probed?.type.kind === "string") {
9038
9340
  return { kind: "libCall", fn: "num.parseFloat", args: [probed], type: F64, loc };
9039
9341
  }
9040
- if (name === "parseFloat" && probed?.type.kind === "dyn") {
9342
+ if (probed?.type.kind === "dyn") {
9041
9343
  return {
9042
9344
  kind: "libCall",
9043
9345
  fn: "num.parseFloat",
@@ -9046,29 +9348,38 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
9046
9348
  loc,
9047
9349
  };
9048
9350
  }
9049
- if (name === "isFinite" && probed?.type.kind === "f64") {
9050
- return { kind: "libCall", fn: "number.isFinite", args: [probed], type: BOOL, loc };
9051
- }
9052
- // A number the checker trusts but storage may hold missing (an
9053
- // out-of-range read): the global's ToNumber makes undefined NaN.
9054
- if (name === "isFinite" &&
9055
- probed?.type.kind === "union" &&
9056
- lowerer.armTag(probed.type.unionId, UNDEFINED_T) >= 0 &&
9057
- lowerer.stripUndefinedArm(probed.type).kind === "f64") {
9058
- const x = lowerOptionalNumber(lowerer, probed, loc, args[0]);
9059
- return { kind: "libCall", fn: "number.isFinite", args: [x], type: BOOL, loc };
9060
- }
9061
9351
  }
9062
9352
  return null;
9063
9353
  }
9064
- /** `crypto.getRandomValues(view)` on the WebCrypto global or webcrypto. */
9065
- function lowerWebCryptoGetRandomValues(lowerer, call, access) {
9066
- if (access.name.text !== "getRandomValues" ||
9354
+ /** `crypto.getRandomValues(view)` and `crypto.randomUUID()` on the
9355
+ * WebCrypto global or webcrypto. Other argument counts (JavaScript only)
9356
+ * invoke the dynamic object's method, which ignores extra arguments and
9357
+ * throws Node's missing-argument TypeError. */
9358
+ function lowerWebCryptoMethodCall(lowerer, call, access) {
9359
+ const member = access.name.text;
9360
+ if ((member !== "getRandomValues" && member !== "randomUUID") ||
9067
9361
  call.questionDotToken ||
9068
9362
  access.questionDotToken ||
9069
9363
  !isWebCryptoReceiver(lowerer, access.expression))
9070
9364
  return null;
9071
- return lowerCryptoGetRandomValues(lowerer, call);
9365
+ const args = call.arguments.nodes;
9366
+ if (member === "getRandomValues" && args.length === 1) {
9367
+ return lowerCryptoGetRandomValues(lowerer, call);
9368
+ }
9369
+ if (member === "randomUUID" && args.length === 0) {
9370
+ return { kind: "libCall", fn: "crypto.randomUUID", args: [], type: STRING, loc: locOf(call) };
9371
+ }
9372
+ if (args.some(ts.isSpreadElement))
9373
+ return null;
9374
+ return {
9375
+ kind: "dynInvoke",
9376
+ recv: lowerer.lowerExprExpecting(access.expression, DYN),
9377
+ method: member,
9378
+ calleeName: v8CalleeText(access),
9379
+ args: args.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
9380
+ type: DYN,
9381
+ loc: locOf(call),
9382
+ };
9072
9383
  }
9073
9384
  /** A then handler's promise-armed result (`.then(() => cached ?? load())`
9074
9385
  * typed `T | Promise<T>`, or a `Promise<void> | void` callback's result):
@@ -9084,6 +9395,43 @@ function maybePromiseHandlerResult(lowerer, call, value, R) {
9084
9395
  }
9085
9396
  return stmt;
9086
9397
  }
9398
+ /** `view.m(args)` where `view` is a `Pick<C, K>` / `Omit<C, K>` view of a
9399
+ * program class C and `m` is one of C's GENERIC methods (its overloads
9400
+ * included): generic methods have no dispatchable method value, so the
9401
+ * view's live receiver is extracted as the C instance it holds (a checked
9402
+ * extraction — a value of another class throws Node-style TypeError
9403
+ * text naming C) and the call monomorphizes statically against C, the
9404
+ * same lowering a C-typed receiver gets. Null for other receivers. */
9405
+ function pickViewGenericMethodCall(lowerer, call, access, recvTs) {
9406
+ const alias = recvTs.getAliasSymbol();
9407
+ if (alias === undefined || (ts.symbolName(alias) !== "Pick" && ts.symbolName(alias) !== "Omit"))
9408
+ return null;
9409
+ if (!alias.declarations.every((d) => ts.getSourceFileOfNode(d).isDeclarationFile))
9410
+ return null;
9411
+ const source = recvTs.getAliasTypeArguments()[0];
9412
+ const symbol = source?.getSymbol();
9413
+ const info = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
9414
+ if (!info || call.questionDotToken || access.questionDotToken)
9415
+ return null;
9416
+ const found = findGenericMethodOn(lowerer, info, access.name.text);
9417
+ if (!found)
9418
+ return null;
9419
+ const loc = locOf(access.expression);
9420
+ const lowered = lowerer.lowerExpr(access.expression);
9421
+ const instance = { kind: "object", className: info.def.name };
9422
+ // A view that statically holds an instance of another class (a
9423
+ // structurally compatible one) calls that class's method in Node, not
9424
+ // C's: the call is refused rather than extracted as a C instance.
9425
+ if (lowered.type.kind === "object" &&
9426
+ lowered.type.className !== info.def.name &&
9427
+ !lowerer.isSubclassOf(lowered.type.className, info.def.name)) {
9428
+ lowerer.unsupported("SC1090", access, `calling the generic method '${access.name.text}' through a '${ts.symbolName(alias)}' view of '${info.def.name}' that holds a '${lowerer.fmt(lowered.type)}'`);
9429
+ }
9430
+ const receiver = lowered.type.kind === "object"
9431
+ ? lowered
9432
+ : { kind: "dynCheck", value: lowerer.coerceToExpected(lowered, DYN), type: instance, loc };
9433
+ return lowerClassGenericMethodCall(lowerer, call, access, info, found, receiver);
9434
+ }
9087
9435
  /** `Object.assign(err, ...sources)` in TypeScript onto an error-hierarchy
9088
9436
  * target (`Object.assign(new Error(message), details)`): the sources'
9089
9437
  * own members land on the error — the runtime copy over its
@@ -9134,4 +9482,63 @@ function lowerObjectAssignOntoError(lowerer, call) {
9134
9482
  loc,
9135
9483
  };
9136
9484
  }
9485
+ /** `Object.freeze(fn)` and the other integrity operations on a function
9486
+ * value: the function's checked-dynamic face holds its own properties (the
9487
+ * ones a program assigns, `name`, `length`, `prototype`) and their
9488
+ * integrity state, which the runtime keeps on its property table. The
9489
+ * mutators answer the function itself; the queries answer from the table.
9490
+ * Null for other values. */
9491
+ function functionIntegrity(lowerer, member, value, node, loc) {
9492
+ if (value.type.kind !== "func" || !lowerer.dynConvertible(value.type))
9493
+ return null;
9494
+ const operations = {
9495
+ freeze: "dyn.freeze",
9496
+ seal: "dyn.seal",
9497
+ preventExtensions: "dyn.preventExtensions",
9498
+ isSealed: "dyn.isSealed",
9499
+ isExtensible: "dyn.isExtensible",
9500
+ };
9501
+ if (!(member in operations))
9502
+ return null;
9503
+ const fn = operations[member];
9504
+ // The first operation on a function creates its property table, whose
9505
+ // `name` comes from the box: give the box the function's JS name, as a
9506
+ // closure flowing into any checked-dynamic slot gets.
9507
+ const name = jsFuncNameOf(node, lowerer);
9508
+ const boxed = (e) => {
9509
+ const box = lowerer.coerceToExpected(e, DYN);
9510
+ return box.kind === "dynFrom" && name !== null ? { ...box, fnName: name } : box;
9511
+ };
9512
+ if (fn === "dyn.isSealed" || fn === "dyn.isExtensible") {
9513
+ return { kind: "libCall", fn, args: [boxed(value)], type: BOOL, loc };
9514
+ }
9515
+ const held = lowerer.declareHiddenLocal("%integrityFn", value.type);
9516
+ const ref = () => ({ kind: "varRef", localId: held.id, type: value.type, loc });
9517
+ return {
9518
+ kind: "seqExpr",
9519
+ stmts: [
9520
+ { kind: "varDecl", localId: held.id, init: value, loc },
9521
+ {
9522
+ kind: "exprStmt",
9523
+ expr: { kind: "libCall", fn, args: [boxed(ref())], type: DYN, loc },
9524
+ loc,
9525
+ },
9526
+ ],
9527
+ result: ref(),
9528
+ type: value.type,
9529
+ loc,
9530
+ };
9531
+ }
9532
+ /** A class instance copied into a fresh object (`Object.assign({},
9533
+ * instance)`): the result is a plain object holding the instance's own
9534
+ * fields, never an instance, so a result the checker types as the class has
9535
+ * no representation (the checked cast would throw). */
9536
+ function fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource) {
9537
+ if (rawSource.type.kind !== "object" || ts.isExpressionStatement(call.parent))
9538
+ return;
9539
+ const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
9540
+ if (resultT === null || resultT.kind !== "object")
9541
+ return;
9542
+ lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
9543
+ }
9137
9544
  //# sourceMappingURL=lower-calls.js.map