@scriptc/compiler 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +470 -66
  2. package/dist/backend/cycle-analysis.d.ts +4 -1
  3. package/dist/backend/cycle-analysis.js +6 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +55 -0
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +7 -0
  8. package/dist/backend/cycle-mutability.js +19 -1
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +2 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.d.ts +6 -3
  13. package/dist/backend/immutability.js +33 -29
  14. package/dist/backend/immutability.js.map +1 -1
  15. package/dist/backend/library-pack.js +1 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/llvm/alloc.d.ts +16 -1
  18. package/dist/backend/llvm/alloc.js +54 -4
  19. package/dist/backend/llvm/alloc.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
  21. package/dist/backend/llvm/appended-array-literals.js +44 -36
  22. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  23. package/dist/backend/llvm/appended-array-literals.test.js +4 -3
  24. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
  25. package/dist/backend/llvm/array-search.d.ts +4 -3
  26. package/dist/backend/llvm/array-search.js +21 -9
  27. package/dist/backend/llvm/array-search.js.map +1 -1
  28. package/dist/backend/llvm/blocks.d.ts +1 -1
  29. package/dist/backend/llvm/blocks.js +2 -2
  30. package/dist/backend/llvm/blocks.js.map +1 -1
  31. package/dist/backend/llvm/byte-windows.js +2 -0
  32. package/dist/backend/llvm/byte-windows.js.map +1 -1
  33. package/dist/backend/llvm/bytes-alias.d.ts +6 -1
  34. package/dist/backend/llvm/bytes-alias.js +8 -2
  35. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  36. package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
  37. package/dist/backend/llvm/bytes-loop-versions.js +479 -32
  38. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  39. package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
  40. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  41. package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
  42. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  43. package/dist/backend/llvm/classes.d.ts +7 -5
  44. package/dist/backend/llvm/classes.js +44 -20
  45. package/dist/backend/llvm/classes.js.map +1 -1
  46. package/dist/backend/llvm/classes.test.js +167 -7
  47. package/dist/backend/llvm/classes.test.js.map +1 -1
  48. package/dist/backend/llvm/common.d.ts +9 -3
  49. package/dist/backend/llvm/common.js +9 -3
  50. package/dist/backend/llvm/common.js.map +1 -1
  51. package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
  52. package/dist/backend/llvm/constant-callbacks.js +83 -52
  53. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/counted-loops.d.ts +7 -0
  55. package/dist/backend/llvm/counted-loops.js +18 -0
  56. package/dist/backend/llvm/counted-loops.js.map +1 -1
  57. package/dist/backend/llvm/debug-info.js +2 -5
  58. package/dist/backend/llvm/debug-info.js.map +1 -1
  59. package/dist/backend/llvm/dense-array-access.d.ts +39 -8
  60. package/dist/backend/llvm/dense-array-access.js +222 -52
  61. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  62. package/dist/backend/llvm/dense-array-access.test.js +36 -0
  63. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  64. package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
  65. package/dist/backend/llvm/dense-array-loops.js +194 -5
  66. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  67. package/dist/backend/llvm/dense-array-loops.test.js +90 -1
  68. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  69. package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
  70. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  71. package/dist/backend/llvm/dyn.d.ts +30 -0
  72. package/dist/backend/llvm/dyn.js +373 -70
  73. package/dist/backend/llvm/dyn.js.map +1 -1
  74. package/dist/backend/llvm/emit-function.js +13 -28
  75. package/dist/backend/llvm/emit-function.js.map +1 -1
  76. package/dist/backend/llvm/emit-journal.d.ts +93 -0
  77. package/dist/backend/llvm/emit-journal.js +170 -0
  78. package/dist/backend/llvm/emit-journal.js.map +1 -0
  79. package/dist/backend/llvm/emit-module.js +211 -33
  80. package/dist/backend/llvm/emit-module.js.map +1 -1
  81. package/dist/backend/llvm/emit-statements.d.ts +0 -4
  82. package/dist/backend/llvm/emit-statements.js +268 -84
  83. package/dist/backend/llvm/emit-statements.js.map +1 -1
  84. package/dist/backend/llvm/emitter-state.d.ts +7 -0
  85. package/dist/backend/llvm/emitter-state.js +14 -0
  86. package/dist/backend/llvm/emitter-state.js.map +1 -0
  87. package/dist/backend/llvm/emitter.d.ts +186 -37
  88. package/dist/backend/llvm/emitter.js +733 -90
  89. package/dist/backend/llvm/emitter.js.map +1 -1
  90. package/dist/backend/llvm/emitter.test.js +65 -7
  91. package/dist/backend/llvm/emitter.test.js.map +1 -1
  92. package/dist/backend/llvm/expr-async.js +11 -13
  93. package/dist/backend/llvm/expr-async.js.map +1 -1
  94. package/dist/backend/llvm/expr-bytes.js +48 -20
  95. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  96. package/dist/backend/llvm/expr-callbacks.js +47 -0
  97. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  98. package/dist/backend/llvm/expr-calls.js +28 -14
  99. package/dist/backend/llvm/expr-calls.js.map +1 -1
  100. package/dist/backend/llvm/expr-containers.d.ts +14 -2
  101. package/dist/backend/llvm/expr-containers.js +143 -37
  102. package/dist/backend/llvm/expr-containers.js.map +1 -1
  103. package/dist/backend/llvm/expr-context.d.ts +14 -0
  104. package/dist/backend/llvm/expr-dynamic.js +18 -11
  105. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +119 -38
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +11 -6
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.d.ts +12 -0
  111. package/dist/backend/llvm/expr-records.js +106 -0
  112. package/dist/backend/llvm/expr-records.js.map +1 -1
  113. package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
  114. package/dist/backend/llvm/expr-stream-bridges.js +210 -69
  115. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  117. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  118. package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
  119. package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
  120. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  121. package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
  122. package/dist/backend/llvm/int32-kind-loops.js +106 -0
  123. package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
  124. package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
  125. package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
  126. package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
  127. package/dist/backend/llvm/integer-values.d.ts +25 -1
  128. package/dist/backend/llvm/integer-values.js +95 -0
  129. package/dist/backend/llvm/integer-values.js.map +1 -1
  130. package/dist/backend/llvm/js-ic.d.ts +1 -1
  131. package/dist/backend/llvm/js-ic.js +1 -1
  132. package/dist/backend/llvm/js-ic.js.map +1 -1
  133. package/dist/backend/llvm/key-orders.d.ts +7 -0
  134. package/dist/backend/llvm/key-orders.js +33 -0
  135. package/dist/backend/llvm/key-orders.js.map +1 -0
  136. package/dist/backend/llvm/lib-connect.js +4 -0
  137. package/dist/backend/llvm/lib-connect.js.map +1 -1
  138. package/dist/backend/llvm/lib-datagram.js +11 -0
  139. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  140. package/dist/backend/llvm/lib-dispatch.js +213 -5
  141. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  142. package/dist/backend/llvm/lib-filesystem.js +4 -4
  143. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  144. package/dist/backend/llvm/lib-http2.js +4 -0
  145. package/dist/backend/llvm/lib-http2.js.map +1 -1
  146. package/dist/backend/llvm/lib-lookup.js +16 -6
  147. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  148. package/dist/backend/llvm/lib-process.js +37 -1
  149. package/dist/backend/llvm/lib-process.js.map +1 -1
  150. package/dist/backend/llvm/lib-shared.js +94 -2
  151. package/dist/backend/llvm/lib-shared.js.map +1 -1
  152. package/dist/backend/llvm/lib-stream.js +35 -5
  153. package/dist/backend/llvm/lib-stream.js.map +1 -1
  154. package/dist/backend/llvm/local-array-reads.js +115 -19
  155. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  156. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  157. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  158. package/dist/backend/llvm/loop-state.d.ts +33 -0
  159. package/dist/backend/llvm/loop-state.js +42 -0
  160. package/dist/backend/llvm/loop-state.js.map +1 -0
  161. package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
  162. package/dist/backend/llvm/map-number-lookup.js +91 -31
  163. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  164. package/dist/backend/llvm/map-number-lookup.test.js +55 -0
  165. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  166. package/dist/backend/llvm/map-read-lifetimes.js +4 -2
  167. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  168. package/dist/backend/llvm/nullable-unions.d.ts +2 -1
  169. package/dist/backend/llvm/nullable-unions.js +15 -3
  170. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  171. package/dist/backend/llvm/publish.d.ts +10 -0
  172. package/dist/backend/llvm/publish.js +15 -3
  173. package/dist/backend/llvm/publish.js.map +1 -1
  174. package/dist/backend/llvm/receivers.js +6 -1
  175. package/dist/backend/llvm/receivers.js.map +1 -1
  176. package/dist/backend/llvm/record-results.d.ts +1 -9
  177. package/dist/backend/llvm/record-results.js +2 -11
  178. package/dist/backend/llvm/record-results.js.map +1 -1
  179. package/dist/backend/llvm/reference-effects.js +3 -0
  180. package/dist/backend/llvm/reference-effects.js.map +1 -1
  181. package/dist/backend/llvm/reference-writes.d.ts +7 -2
  182. package/dist/backend/llvm/reference-writes.js +89 -72
  183. package/dist/backend/llvm/reference-writes.js.map +1 -1
  184. package/dist/backend/llvm/running-extrema.d.ts +11 -0
  185. package/dist/backend/llvm/running-extrema.js +115 -0
  186. package/dist/backend/llvm/running-extrema.js.map +1 -0
  187. package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
  188. package/dist/backend/llvm/running-extrema.test.js +89 -0
  189. package/dist/backend/llvm/running-extrema.test.js.map +1 -0
  190. package/dist/backend/llvm/shapes.d.ts +71 -15
  191. package/dist/backend/llvm/shapes.js +224 -40
  192. package/dist/backend/llvm/shapes.js.map +1 -1
  193. package/dist/backend/llvm/shapes.test.js +53 -7
  194. package/dist/backend/llvm/shapes.test.js.map +1 -1
  195. package/dist/backend/llvm/speculative-integers.d.ts +6 -0
  196. package/dist/backend/llvm/speculative-integers.js +2 -2
  197. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  198. package/dist/backend/llvm/stack-captures.js +1 -5
  199. package/dist/backend/llvm/stack-captures.js.map +1 -1
  200. package/dist/backend/llvm/stack-objects.d.ts +3 -2
  201. package/dist/backend/llvm/stack-objects.js +5 -2
  202. package/dist/backend/llvm/stack-objects.js.map +1 -1
  203. package/dist/backend/llvm/string-reads.d.ts +12 -0
  204. package/dist/backend/llvm/string-reads.js +44 -0
  205. package/dist/backend/llvm/string-reads.js.map +1 -1
  206. package/dist/backend/llvm/union-repr.d.ts +4 -3
  207. package/dist/backend/llvm/union-repr.js +6 -5
  208. package/dist/backend/llvm/union-repr.js.map +1 -1
  209. package/dist/backend/llvm/walk-borrows.d.ts +3 -0
  210. package/dist/backend/llvm/walk-borrows.js +46 -41
  211. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  212. package/dist/backend/llvm/walkers.d.ts +3 -0
  213. package/dist/backend/llvm/walkers.js +101 -65
  214. package/dist/backend/llvm/walkers.js.map +1 -1
  215. package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
  216. package/dist/backend/llvm/wrapping-sums.js +126 -0
  217. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  218. package/dist/backend/may-throw.d.ts +8 -10
  219. package/dist/backend/may-throw.js +14 -10
  220. package/dist/backend/may-throw.js.map +1 -1
  221. package/dist/backend/native/contracts.d.ts +5 -0
  222. package/dist/backend/native/executable.js +7 -0
  223. package/dist/backend/native/executable.js.map +1 -1
  224. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  225. package/dist/backend/native/runtime-inputs.js +1 -0
  226. package/dist/backend/native/runtime-inputs.js.map +1 -1
  227. package/dist/backend/native-codegen-core.d.ts +5 -3
  228. package/dist/backend/native-codegen-core.js +13 -6
  229. package/dist/backend/native-codegen-core.js.map +1 -1
  230. package/dist/backend/native-codegen.test.js +6 -4
  231. package/dist/backend/native-codegen.test.js.map +1 -1
  232. package/dist/backend/native-link-info-core.d.ts +4 -0
  233. package/dist/backend/native-link-info-core.js.map +1 -1
  234. package/dist/backend/publication.d.ts +12 -1
  235. package/dist/backend/publication.js +37 -14
  236. package/dist/backend/publication.js.map +1 -1
  237. package/dist/backend/publication.test.js +30 -0
  238. package/dist/backend/publication.test.js.map +1 -1
  239. package/dist/backend/result-slots.d.ts +16 -0
  240. package/dist/backend/result-slots.js +23 -0
  241. package/dist/backend/result-slots.js.map +1 -0
  242. package/dist/backend/runtime-abi.d.ts +2 -2
  243. package/dist/backend/runtime-abi.js +2 -2
  244. package/dist/backend/runtime-pack-core.d.ts +1 -0
  245. package/dist/backend/runtime-pack-core.js +1 -0
  246. package/dist/backend/runtime-pack-core.js.map +1 -1
  247. package/dist/backend/runtime-pack-targets.test.js +2 -1
  248. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  249. package/dist/backend/runtime-pack.test.js +2 -1
  250. package/dist/backend/runtime-pack.test.js.map +1 -1
  251. package/dist/backend/stack-observations.d.ts +2 -1
  252. package/dist/backend/stack-observations.js +67 -42
  253. package/dist/backend/stack-observations.js.map +1 -1
  254. package/dist/backend/target-cpu.d.ts +26 -0
  255. package/dist/backend/target-cpu.js +98 -0
  256. package/dist/backend/target-cpu.js.map +1 -0
  257. package/dist/backend/target-cpu.test.d.ts +1 -0
  258. package/dist/backend/target-cpu.test.js +38 -0
  259. package/dist/backend/target-cpu.test.js.map +1 -0
  260. package/dist/backend/target-diagnostics.js +5 -3
  261. package/dist/backend/target-diagnostics.js.map +1 -1
  262. package/dist/backend/warm-cache.js +1 -0
  263. package/dist/backend/warm-cache.js.map +1 -1
  264. package/dist/cli/command.js +20 -1
  265. package/dist/cli/command.js.map +1 -1
  266. package/dist/cli/usage.d.ts +4 -1
  267. package/dist/cli/usage.js +10 -3
  268. package/dist/cli/usage.js.map +1 -1
  269. package/dist/compat/fetch-profile.js +1 -1
  270. package/dist/compat/fetch-profile.js.map +1 -1
  271. package/dist/compile-types.d.ts +7 -0
  272. package/dist/contracts/check.js +4 -3
  273. package/dist/contracts/check.js.map +1 -1
  274. package/dist/contracts/int32-elements.js +10 -2
  275. package/dist/contracts/int32-elements.js.map +1 -1
  276. package/dist/coverage/report.js +12 -3
  277. package/dist/coverage/report.js.map +1 -1
  278. package/dist/diagnostics/diagnostic.d.ts +4 -0
  279. package/dist/diagnostics/diagnostic.js +1 -1
  280. package/dist/diagnostics/diagnostic.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +3 -0
  282. package/dist/diagnostics/envelope.js +1 -0
  283. package/dist/diagnostics/envelope.js.map +1 -1
  284. package/dist/executable/executable-cache.d.ts +5 -0
  285. package/dist/executable/executable-cache.js +5 -0
  286. package/dist/executable/executable-cache.js.map +1 -1
  287. package/dist/executable/executable-cache.test.js +3 -0
  288. package/dist/executable/executable-cache.test.js.map +1 -1
  289. package/dist/frontend/decl-projection.d.ts +41 -0
  290. package/dist/frontend/decl-projection.js +949 -0
  291. package/dist/frontend/decl-projection.js.map +1 -0
  292. package/dist/frontend/decl-projection.test.d.ts +1 -0
  293. package/dist/frontend/decl-projection.test.js +30 -0
  294. package/dist/frontend/decl-projection.test.js.map +1 -0
  295. package/dist/frontend/dts-paths.d.ts +15 -0
  296. package/dist/frontend/dts-paths.js +25 -0
  297. package/dist/frontend/dts-paths.js.map +1 -1
  298. package/dist/frontend/input-tracker.d.ts +6 -0
  299. package/dist/frontend/input-tracker.js +51 -28
  300. package/dist/frontend/input-tracker.js.map +1 -1
  301. package/dist/frontend/input-tracker.test.js +19 -0
  302. package/dist/frontend/input-tracker.test.js.map +1 -1
  303. package/dist/frontend/lowering/array-values.js +100 -2
  304. package/dist/frontend/lowering/array-values.js.map +1 -1
  305. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  306. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  307. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  308. package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
  309. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  310. package/dist/frontend/lowering/builtins/child-process.js +13 -2
  311. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  312. package/dist/frontend/lowering/builtins/crypto.js +87 -10
  313. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/dates.js +4 -1
  315. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  317. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  318. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  319. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  320. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  321. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  322. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  323. package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
  324. package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
  325. package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
  326. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  327. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/numbers.js +9 -1
  329. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
  331. package/dist/frontend/lowering/builtins/promises.js +236 -139
  332. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  334. package/dist/frontend/lowering/builtins/readline.js +35 -3
  335. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/url.js +24 -1
  337. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +6 -3
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/call-signatures.js +0 -1
  341. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  342. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  343. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  344. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  345. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  346. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  347. package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
  348. package/dist/frontend/lowering/class-callbacks.js +82 -12
  349. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  350. package/dist/frontend/lowering/class-construction.d.ts +4 -1
  351. package/dist/frontend/lowering/class-construction.js +17 -3
  352. package/dist/frontend/lowering/class-construction.js.map +1 -1
  353. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
  355. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  358. package/dist/frontend/lowering/class-iterables.d.ts +2 -1
  359. package/dist/frontend/lowering/class-iterables.js +9 -1
  360. package/dist/frontend/lowering/class-iterables.js.map +1 -1
  361. package/dist/frontend/lowering/class-method-mutations.js +83 -24
  362. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  363. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  364. package/dist/frontend/lowering/class-protocols.js +183 -1
  365. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  366. package/dist/frontend/lowering/class-prototypes.js +31 -2
  367. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  368. package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
  369. package/dist/frontend/lowering/class-runtime-statics.js +29 -4
  370. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  371. package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
  372. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  373. package/dist/frontend/lowering/coercions/structural.js +91 -1
  374. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  375. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  376. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  377. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  378. package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
  379. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  380. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  381. package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
  382. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  383. package/dist/frontend/lowering/containers/array-concat.js +10 -0
  384. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  385. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  386. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  387. package/dist/frontend/lowering/containers/array-methods.js +26 -3
  388. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  389. package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
  390. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  391. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  392. package/dist/frontend/lowering/containers/bytes.js +455 -46
  393. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  394. package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
  395. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  396. package/dist/frontend/lowering/containers/collection-methods.js +7 -2
  397. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  398. package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
  399. package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
  400. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
  401. package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
  402. package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
  403. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  404. package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
  405. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  406. package/dist/frontend/lowering/containers/string-replacement.js +43 -19
  407. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  408. package/dist/frontend/lowering/date-values.d.ts +11 -0
  409. package/dist/frontend/lowering/date-values.js +207 -0
  410. package/dist/frontend/lowering/date-values.js.map +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js +15 -1
  412. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  413. package/dist/frontend/lowering/divergences.js +9 -1
  414. package/dist/frontend/lowering/divergences.js.map +1 -1
  415. package/dist/frontend/lowering/error-methods.js +47 -2
  416. package/dist/frontend/lowering/error-methods.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/array-literals.js +53 -0
  418. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/binary.js +100 -28
  420. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/element-access.js +169 -13
  422. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  423. package/dist/frontend/lowering/expressions/identifiers.js +64 -5
  424. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  425. package/dist/frontend/lowering/expressions/narrowing.js +95 -1
  426. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  427. package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
  428. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  429. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  430. package/dist/frontend/lowering/expressions/object-literals.js +138 -51
  431. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
  433. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  434. package/dist/frontend/lowering/expressions/property-access.js +168 -10
  435. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  436. package/dist/frontend/lowering/expressions/relational.js +212 -33
  437. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  438. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  439. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  440. package/dist/frontend/lowering/expressions/union-fields.js +4 -0
  441. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  442. package/dist/frontend/lowering/expressions/updates.js +39 -3
  443. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  444. package/dist/frontend/lowering/frozen-records.d.ts +28 -0
  445. package/dist/frontend/lowering/frozen-records.js +322 -0
  446. package/dist/frontend/lowering/frozen-records.js.map +1 -0
  447. package/dist/frontend/lowering/function-returns.js +64 -0
  448. package/dist/frontend/lowering/function-returns.js.map +1 -1
  449. package/dist/frontend/lowering/generic-functions.js +7 -2
  450. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  451. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  452. package/dist/frontend/lowering/indexed-unions.js +401 -0
  453. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  454. package/dist/frontend/lowering/iterable-values.d.ts +49 -0
  455. package/dist/frontend/lowering/iterable-values.js +297 -0
  456. package/dist/frontend/lowering/iterable-values.js.map +1 -0
  457. package/dist/frontend/lowering/iterator-adapters.js +186 -1
  458. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  459. package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
  460. package/dist/frontend/lowering/js-class-fields.js +45 -10
  461. package/dist/frontend/lowering/js-class-fields.js.map +1 -1
  462. package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
  463. package/dist/frontend/lowering/key-order-witness.js +974 -48
  464. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  465. package/dist/frontend/lowering/key-order-witness.test.js +530 -10
  466. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  467. package/dist/frontend/lowering/lower-assert.js +15 -3
  468. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  469. package/dist/frontend/lowering/lower-async-iteration.js +4 -1
  470. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  471. package/dist/frontend/lowering/lower-calls.d.ts +7 -0
  472. package/dist/frontend/lowering/lower-calls.js +462 -44
  473. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  474. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  475. package/dist/frontend/lowering/lower-classes.js +324 -69
  476. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  477. package/dist/frontend/lowering/lower-dgram.js +3 -1
  478. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  479. package/dist/frontend/lowering/lower-exprs.js +215 -3
  480. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  481. package/dist/frontend/lowering/lower-functions.d.ts +11 -0
  482. package/dist/frontend/lowering/lower-functions.js +83 -0
  483. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  484. package/dist/frontend/lowering/lower-generators.js +42 -32
  485. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  486. package/dist/frontend/lowering/lower-global-value.js +6 -3
  487. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  488. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  489. package/dist/frontend/lowering/lower-inspect.js +53 -17
  490. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  491. package/dist/frontend/lowering/lower-modules.js +53 -5
  492. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  493. package/dist/frontend/lowering/lower-namespaces.js +5 -1
  494. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.js +2 -2
  496. package/dist/frontend/lowering/lower-server.js.map +1 -1
  497. package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
  498. package/dist/frontend/lowering/lower-stdlib.js +30 -0
  499. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  500. package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
  501. package/dist/frontend/lowering/lower-stmts.js +553 -81
  502. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  503. package/dist/frontend/lowering/lower-stream.d.ts +20 -2
  504. package/dist/frontend/lowering/lower-stream.js +1483 -156
  505. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  506. package/dist/frontend/lowering/lowerer.d.ts +107 -8
  507. package/dist/frontend/lowering/lowerer.js +381 -36
  508. package/dist/frontend/lowering/lowerer.js.map +1 -1
  509. package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
  510. package/dist/frontend/lowering/module-namespace-elements.js +82 -5
  511. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  512. package/dist/frontend/lowering/new-target.d.ts +12 -0
  513. package/dist/frontend/lowering/new-target.js +280 -0
  514. package/dist/frontend/lowering/new-target.js.map +1 -0
  515. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  516. package/dist/frontend/lowering/object-factory-new.js +20 -6
  517. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  518. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  519. package/dist/frontend/lowering/overload-choice.js +190 -0
  520. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  521. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  522. package/dist/frontend/lowering/surfaces.js +73 -8
  523. package/dist/frontend/lowering/surfaces.js.map +1 -1
  524. package/dist/frontend/lowering/undefined-index.d.ts +27 -0
  525. package/dist/frontend/lowering/undefined-index.js +82 -0
  526. package/dist/frontend/lowering/undefined-index.js.map +1 -0
  527. package/dist/frontend/lowering/var-hoisting.js +29 -13
  528. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  529. package/dist/frontend/lowering/width-lift.d.ts +18 -0
  530. package/dist/frontend/npm-static-bundled-chunks.js +9 -11
  531. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  532. package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
  533. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  534. package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
  535. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  536. package/dist/frontend/npm-static.js +4 -20
  537. package/dist/frontend/npm-static.js.map +1 -1
  538. package/dist/frontend/package-shims.d.ts +3 -0
  539. package/dist/frontend/package-shims.js +71 -8
  540. package/dist/frontend/package-shims.js.map +1 -1
  541. package/dist/frontend/pipeline.js +19 -11
  542. package/dist/frontend/pipeline.js.map +1 -1
  543. package/dist/frontend/process-fork.d.ts +25 -0
  544. package/dist/frontend/process-fork.js +2 -0
  545. package/dist/frontend/process-fork.js.map +1 -0
  546. package/dist/frontend/program-analysis.d.ts +5 -1
  547. package/dist/frontend/program-analysis.js +5 -0
  548. package/dist/frontend/program-analysis.js.map +1 -1
  549. package/dist/frontend/program.d.ts +21 -6
  550. package/dist/frontend/program.js +681 -83
  551. package/dist/frontend/program.js.map +1 -1
  552. package/dist/frontend/program.test.js +43 -3
  553. package/dist/frontend/program.test.js.map +1 -1
  554. package/dist/frontend/token-equivalence.d.ts +3 -0
  555. package/dist/frontend/token-equivalence.js +409 -0
  556. package/dist/frontend/token-equivalence.js.map +1 -0
  557. package/dist/frontend/token-equivalence.test.d.ts +1 -0
  558. package/dist/frontend/token-equivalence.test.js +67 -0
  559. package/dist/frontend/token-equivalence.test.js.map +1 -0
  560. package/dist/frontend/ts7/ast-node.d.ts +22 -0
  561. package/dist/frontend/ts7/ast-node.js +1048 -103
  562. package/dist/frontend/ts7/ast-node.js.map +1 -1
  563. package/dist/frontend/ts7/ast-node.test.js +24 -0
  564. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  565. package/dist/frontend/ts7/ast-wire.d.ts +4 -3
  566. package/dist/frontend/ts7/ast-wire.js +34 -24
  567. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  568. package/dist/frontend/ts7/ast-wire.test.js +23 -0
  569. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  570. package/dist/frontend/ts7/checker-backend.d.ts +3 -4
  571. package/dist/frontend/ts7/checker-backend.js +2 -2
  572. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  573. package/dist/frontend/ts7/checker-backend.test.js +5 -9
  574. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  575. package/dist/frontend/ts7/checker.d.ts +4 -0
  576. package/dist/frontend/ts7/checker.js +7 -0
  577. package/dist/frontend/ts7/checker.js.map +1 -1
  578. package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
  579. package/dist/frontend/ts7/lib-diagnostics.js +307 -0
  580. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
  581. package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
  582. package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
  583. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
  584. package/dist/frontend/ts7/program-host.d.ts +7 -0
  585. package/dist/frontend/ts7/program-host.js +25 -2
  586. package/dist/frontend/ts7/program-host.js.map +1 -1
  587. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  588. package/dist/frontend/ts7/semantic-model.js +5 -0
  589. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  590. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  591. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  592. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  593. package/dist/frontend/ts7/semantic-types.js +1 -1
  594. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  595. package/dist/frontend/ts7/session.d.ts +14 -1
  596. package/dist/frontend/ts7/session.js +22 -0
  597. package/dist/frontend/ts7/session.js.map +1 -1
  598. package/dist/frontend/type-mapper.d.ts +13 -1
  599. package/dist/frontend/type-mapper.js +229 -20
  600. package/dist/frontend/type-mapper.js.map +1 -1
  601. package/dist/index.d.ts +0 -5
  602. package/dist/index.js +46 -4
  603. package/dist/index.js.map +1 -1
  604. package/dist/ir/analysis.js +5 -3
  605. package/dist/ir/analysis.js.map +1 -1
  606. package/dist/ir/array-length-stability.d.ts +4 -0
  607. package/dist/ir/array-length-stability.js +19 -6
  608. package/dist/ir/array-length-stability.js.map +1 -1
  609. package/dist/ir/array-length-stability.test.js +24 -0
  610. package/dist/ir/array-length-stability.test.js.map +1 -1
  611. package/dist/ir/builtin-effects.d.ts +7 -0
  612. package/dist/ir/builtin-effects.js +60 -0
  613. package/dist/ir/builtin-effects.js.map +1 -1
  614. package/dist/ir/builtin-signatures.d.ts +6 -4
  615. package/dist/ir/builtin-signatures.js +222 -13
  616. package/dist/ir/builtin-signatures.js.map +1 -1
  617. package/dist/ir/callback-specialization.d.ts +2 -1
  618. package/dist/ir/callback-specialization.js +23 -18
  619. package/dist/ir/callback-specialization.js.map +1 -1
  620. package/dist/ir/char-unit-locals.d.ts +19 -0
  621. package/dist/ir/char-unit-locals.js +185 -0
  622. package/dist/ir/char-unit-locals.js.map +1 -0
  623. package/dist/ir/char-unit-locals.test.d.ts +1 -0
  624. package/dist/ir/char-unit-locals.test.js +94 -0
  625. package/dist/ir/char-unit-locals.test.js.map +1 -0
  626. package/dist/ir/final-fields.d.ts +2 -1
  627. package/dist/ir/final-fields.js +14 -16
  628. package/dist/ir/final-fields.js.map +1 -1
  629. package/dist/ir/function-references.d.ts +2 -0
  630. package/dist/ir/function-references.js +2 -0
  631. package/dist/ir/function-references.js.map +1 -1
  632. package/dist/ir/function-references.test.js +3 -0
  633. package/dist/ir/function-references.test.js.map +1 -1
  634. package/dist/ir/initializer-bindings.d.ts +2 -1
  635. package/dist/ir/initializer-bindings.js +27 -20
  636. package/dist/ir/initializer-bindings.js.map +1 -1
  637. package/dist/ir/int32-arrays.d.ts +108 -0
  638. package/dist/ir/int32-arrays.js +831 -0
  639. package/dist/ir/int32-arrays.js.map +1 -0
  640. package/dist/ir/int32-slots.d.ts +24 -2
  641. package/dist/ir/int32-slots.js +266 -57
  642. package/dist/ir/int32-slots.js.map +1 -1
  643. package/dist/ir/int32-slots.test.js +33 -0
  644. package/dist/ir/int32-slots.test.js.map +1 -1
  645. package/dist/ir/integer-loops.d.ts +3 -3
  646. package/dist/ir/integer-loops.js +28 -10
  647. package/dist/ir/integer-loops.js.map +1 -1
  648. package/dist/ir/integer-loops.test.js +10 -0
  649. package/dist/ir/integer-loops.test.js.map +1 -1
  650. package/dist/ir/integer-ranges.d.ts +5 -0
  651. package/dist/ir/integer-ranges.js +125 -12
  652. package/dist/ir/integer-ranges.js.map +1 -1
  653. package/dist/ir/integer-ranges.test.js +30 -0
  654. package/dist/ir/integer-ranges.test.js.map +1 -1
  655. package/dist/ir/ir.d.ts +83 -10
  656. package/dist/ir/ir.js +77 -6
  657. package/dist/ir/ir.js.map +1 -1
  658. package/dist/ir/ir.test.js +23 -2
  659. package/dist/ir/ir.test.js.map +1 -1
  660. package/dist/ir/js-ic.d.ts +4 -0
  661. package/dist/ir/js-ic.js +17 -1
  662. package/dist/ir/js-ic.js.map +1 -1
  663. package/dist/ir/js-ic.test.js +46 -0
  664. package/dist/ir/js-ic.test.js.map +1 -1
  665. package/dist/ir/node-index.d.ts +57 -0
  666. package/dist/ir/node-index.js +215 -0
  667. package/dist/ir/node-index.js.map +1 -0
  668. package/dist/ir/paired-while-loops.d.ts +25 -0
  669. package/dist/ir/paired-while-loops.js +335 -0
  670. package/dist/ir/paired-while-loops.js.map +1 -0
  671. package/dist/ir/paired-while-loops.test.d.ts +1 -0
  672. package/dist/ir/paired-while-loops.test.js +163 -0
  673. package/dist/ir/paired-while-loops.test.js.map +1 -0
  674. package/dist/ir/parameter-versions.d.ts +25 -0
  675. package/dist/ir/parameter-versions.js +300 -0
  676. package/dist/ir/parameter-versions.js.map +1 -0
  677. package/dist/ir/runtime-features.d.ts +34 -13
  678. package/dist/ir/runtime-features.js +177 -39
  679. package/dist/ir/runtime-features.js.map +1 -1
  680. package/dist/ir/serialize.d.ts +12 -2
  681. package/dist/ir/serialize.js +16 -3
  682. package/dist/ir/serialize.js.map +1 -1
  683. package/dist/ir/serialize.test.js +17 -0
  684. package/dist/ir/serialize.test.js.map +1 -1
  685. package/dist/ir/traverse.js +18 -6
  686. package/dist/ir/traverse.js.map +1 -1
  687. package/dist/ir/validate.js +167 -40
  688. package/dist/ir/validate.js.map +1 -1
  689. package/dist/library/ir-policy.js +3 -0
  690. package/dist/library/ir-policy.js.map +1 -1
  691. package/dist/native/cache.d.ts +6 -1
  692. package/dist/native/cache.js +28 -5
  693. package/dist/native/cache.js.map +1 -1
  694. package/dist/native/cache.test.js +16 -2
  695. package/dist/native/cache.test.js.map +1 -1
  696. package/dist/native/cli.js +21 -1
  697. package/dist/native/cli.js.map +1 -1
  698. package/dist/native/compiler.js +8 -6
  699. package/dist/native/compiler.js.map +1 -1
  700. package/dist/native/executable-cache.d.ts +1 -1
  701. package/dist/native/executable-cache.js +2 -2
  702. package/dist/native/executable-cache.js.map +1 -1
  703. package/dist/native/prepare.d.ts +4 -2
  704. package/dist/native/prepare.js +130 -32
  705. package/dist/native/prepare.js.map +1 -1
  706. package/dist/native/prepare.test.js +96 -20
  707. package/dist/native/prepare.test.js.map +1 -1
  708. package/dist/native/sanitizer.test.js +2 -0
  709. package/dist/native/sanitizer.test.js.map +1 -1
  710. package/dist/native/text-file.d.ts +13 -3
  711. package/dist/native/text-file.js +63 -9
  712. package/dist/native/text-file.js.map +1 -1
  713. package/dist/native/text-file.test.d.ts +1 -0
  714. package/dist/native/text-file.test.js +49 -0
  715. package/dist/native/text-file.test.js.map +1 -0
  716. package/dist/native/toolchain.js +4 -4
  717. package/dist/native/toolchain.js.map +1 -1
  718. package/dist/native/toolchain.test.js +3 -3
  719. package/dist/native/toolchain.test.js.map +1 -1
  720. package/package.json +21 -21
  721. package/shims/chalk/v5.ts +688 -0
  722. package/shims/hono-node-server/v2.ts +645 -0
  723. package/shims/hot-shots/client.ts +1126 -0
  724. package/shims/hot-shots/v8-unix-dgram.ts +8 -0
  725. package/shims/hot-shots/v8.ts +8 -0
  726. package/surface-manifest.json +27 -7
@@ -1,4 +1,5 @@
1
1
  import { keyedHelperName } from "./stable-names.js";
2
+ import { perKeyOrder } from "./key-order-witness.js";
2
3
  import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
3
4
  import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
4
5
  import { lowerDynStreamMemberCall } from "./dyn-streams.js";
@@ -29,9 +30,10 @@ import { lowerClassSymbolMethodCall } from "./symbol-methods.js";
29
30
  import { lowerReadlineDisposeCall } from "./builtins/readline.js";
30
31
  import { errorToStringCall } from "./error-methods.js";
31
32
  import { lowerClassPrototypeAssign, lowerClassPrototypeDescriptors } from "./class-prototypes.js";
32
- import { BYTES_ELEMENT_NAME, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
33
+ import { BYTES_ELEMENT_NAME, BYTES_U8, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, shapeKeyOrders, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
33
34
  import { lowerProtocolMethodCall } from "./class-protocol-dispatch.js";
34
35
  import { isJsSourceFile, locOf, requireSpecOf } from "../program.js";
36
+ import { isPackageShimFile, isShimIntrinsicName } from "../package-shims.js";
35
37
  import { lowerJsonRequireCall } from "./json-require.js";
36
38
  import { lowerAssertInstanceCall } from "./assert-instances.js";
37
39
  import { isGenericCallableMemberType, isOverloadedCallableMemberType, typeKey, } from "../type-mapper.js";
@@ -46,7 +48,7 @@ import { lowerGeneratorHelperCall, lowerHelperReturnCall, lowerIteratorFromCall,
46
48
  import { lowerObjectAssignIndexShape, lowerObjectConstructor, lowerObjectFromEntriesCall, lowerObjectIterOverIndexShape, } from "./containers/indexed-objects.js";
47
49
  import { lowerTupleReadMethodCall } from "./containers/array-methods.js";
48
50
  import { tryFuseIndexRead } from "./array-values.js";
49
- import { lowerBytesStaticCall } from "./containers/bytes.js";
51
+ import { lowerBufferConstruct, lowerBytesPrototypeSetCall, lowerBytesStaticCall, } from "./containers/bytes.js";
50
52
  import { lowerRegexMethodCall, lowerStringIndexCall, lowerStringMethodCall, lowerStringPaddingCall, lowerStringSplitCall, isDynPrimitiveKindMethod, lowerDynPrimitiveMethodCall, lowerExtraNumberMethodCall, } from "./containers/string-and-regexp.js";
51
53
  import { createRequireSpecOf } from "./builtins/module-bindings.js";
52
54
  import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
@@ -82,19 +84,72 @@ import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedA
82
84
  import { fenceSymbolFieldCopy } from "./symbol-fields.js";
83
85
  import { lowerClassDataDescriptor, lowerClassDescriptorRead } from "./class-descriptors.js";
84
86
  import { lowerClassFieldDefine, lowerClassIntegrity } from "./class-attributes.js";
87
+ import { freezableRecordType, lowerNativeFreeze } from "./frozen-records.js";
85
88
  import { classStaticDataFor } from "./class-static-data.js";
86
89
  import { lowerUrlFactory } from "./lower-url.js";
87
90
  import { nullishValueUnitOf } from "./binding-analysis.js";
88
91
  import { spreadNeedsRuntimeArity, completeFuncValueArgs, lowerSpreadArgsCall, completeArgs, } from "./call-arguments.js";
89
92
  import { isThisParameter } from "./call-signatures.js";
93
+ import { dynamicOverloadChoice } from "./overload-choice.js";
90
94
  import { lowerStringIteratorValue } from "./iterator-adapters.js";
91
95
  import { checkedArmExtraction } from "./coercions/unions.js";
92
96
  import { maybePromiseReturnStmt, promiseArmedUnionOf } from "./maybe-promise.js";
93
97
  import { requireObjLitGenericReceiver, objLitGenericFnNodeOf, objLitGenericFnInfoOf, genericCallInstance, } from "./generic-functions.js";
94
98
  import { codeGenerationCalleeOf, lowerCodeGenerationCall } from "./code-generation.js";
95
99
  const ZLIB_STREAM_METHODS = new Set(["flush", "params", "close", "reset"]);
100
+ /** `Object.defineProperty(target, ...)`, `Object.defineProperties`,
101
+ * `Reflect.defineProperty`, and `target.__defineGetter__/__defineSetter__`
102
+ * over a target that may hold an Error can install an accessor over an
103
+ * error's `name` or `message` (error-methods.ts). */
104
+ function noteErrorAccessorReflection(lowerer, expr) {
105
+ const callee = expr.expression;
106
+ if (!ts.isPropertyAccessExpression(callee))
107
+ return;
108
+ const member = callee.name.text;
109
+ const target = member === "defineProperty" || member === "defineProperties"
110
+ ? expr.arguments.nodes[0]
111
+ : member === "__defineGetter__" || member === "__defineSetter__"
112
+ ? callee.expression
113
+ : undefined;
114
+ if (!target)
115
+ return;
116
+ const error = lowerer.checker.resolveName("Error", ts.SymbolFlags.Type, target, false);
117
+ const errorType = error ? lowerer.checker.getDeclaredTypeOfSymbol(error) : null;
118
+ if (mayHoldError(lowerer, lowerer.checker.getTypeAtLocation(target), errorType))
119
+ lowerer.errorAccessorReflection = locOf(expr);
120
+ }
121
+ /** An untyped or generic type, a type Error is assignable to (`object`,
122
+ * `{}`, `Object`, `{ message?: string }`), or
123
+ * an Error-shaped type with both `name` and `message`, alone or in a
124
+ * union or intersection. */
125
+ function mayHoldError(lowerer, type, errorType) {
126
+ if (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Instantiable))
127
+ return true;
128
+ if (type.flags & (ts.TypeFlags.Union | ts.TypeFlags.Intersection))
129
+ return ts.constituentTypes(type).some((part) => mayHoldError(lowerer, part, errorType));
130
+ return ((lowerer.checker.getPropertyOfType(type, "message") !== undefined &&
131
+ lowerer.checker.getPropertyOfType(type, "name") !== undefined) ||
132
+ (errorType !== null && lowerer.checker.isTypeAssignableTo(errorType, type)));
133
+ }
134
+ /** The `f` of a `(0, f)` callee (a numeric left operand, so dropping it
135
+ * changes only the call's receiver), or null. */
136
+ function receiverlessCalleeOf(callee) {
137
+ let e = callee;
138
+ while (ts.isParenthesizedExpression(e))
139
+ e = e.expression;
140
+ if (!ts.isBinaryExpression(e) ||
141
+ e.operatorToken.kind !== ts.SyntaxKind.CommaToken ||
142
+ !ts.isNumericLiteral(e.left))
143
+ return null;
144
+ let right = e.right;
145
+ while (ts.isParenthesizedExpression(right))
146
+ right = right.expression;
147
+ return right;
148
+ }
96
149
  export function lowerCall(lowerer, expr) {
97
150
  const loc = locOf(expr);
151
+ if (lowerer.errorAccessorReflection === null)
152
+ noteErrorAccessorReflection(lowerer, expr);
98
153
  // Object's checker return type is `any`. Claim known object inputs
99
154
  // before generic checked-dynamic dispatch tries to load the constructor.
100
155
  if (ts.isIdentifier(expr.expression) &&
@@ -113,6 +168,17 @@ export function lowerCall(lowerer, expr) {
113
168
  const json = lowerJsonRequireCall(lowerer, expr);
114
169
  if (json)
115
170
  return json;
171
+ // `(0, ns.member)(...)` over a builtin module (tsc's and esbuild's call
172
+ // without a receiver): Node's module functions do not read `this`, so it
173
+ // is the member call.
174
+ {
175
+ const member = receiverlessCalleeOf(expr.expression);
176
+ if (member !== null && ts.isPropertyAccessExpression(member)) {
177
+ const builtin = lowerer.lowerNamespaceBuiltinCall(expr, member);
178
+ if (builtin)
179
+ return builtin;
180
+ }
181
+ }
116
182
  // eval(...) and Function(...): Node's EvalError under
117
183
  // --disallow-code-generation-from-strings (code-generation.ts).
118
184
  {
@@ -120,6 +186,21 @@ export function lowerCall(lowerer, expr) {
120
186
  if (codeGeneration !== null)
121
187
  return lowerCodeGenerationCall(lowerer, expr, codeGeneration);
122
188
  }
189
+ // The deprecated Buffer(...) call (containers/bytes.ts). The checker
190
+ // types it `any`, so the bytes cross as a checked-dynamic value, which
191
+ // keeps the Buffer brand for inspection.
192
+ {
193
+ const buffer = lowerBufferConstruct(lowerer, expr);
194
+ if (buffer)
195
+ return { kind: "dynFrom", value: buffer, type: DYN, loc };
196
+ }
197
+ // A package shim's runtime intrinsic (a bodiless `declare function`
198
+ // named scriptcUnixDgram* in a shipped shim): a direct runtime call.
199
+ if (ts.isIdentifier(expr.expression) && isShimIntrinsicName(expr.expression.text)) {
200
+ const intrinsic = lowerShimIntrinsicCall(lowerer, expr, expr.expression, loc);
201
+ if (intrinsic)
202
+ return intrinsic;
203
+ }
123
204
  // Inline require() of a program module (cjs-inline-require.ts): a
124
205
  // member call over its export table resolves like a binding's member
125
206
  // call after the module's %init at this position; the require itself
@@ -1195,6 +1276,7 @@ export function lowerCall(lowerer, expr) {
1195
1276
  lowerer.lowerTestMethodCall(expr, expr.expression) ??
1196
1277
  lowerer.lowerTimeoutMethodCall(expr, expr.expression) ??
1197
1278
  lowerArrayPrototypeBorrowCall(lowerer, expr, expr.expression) ??
1279
+ lowerBytesPrototypeSetCall(lowerer, expr, expr.expression) ??
1198
1280
  lowerObjectOwnPrototypeCall(lowerer, expr, expr.expression) ??
1199
1281
  lowerObjectPrototypeCall(lowerer, expr, expr.expression) ??
1200
1282
  lowerStringPrototypeCall(lowerer, expr, expr.expression) ??
@@ -1305,7 +1387,17 @@ export function lowerCall(lowerer, expr) {
1305
1387
  }
1306
1388
  const accessorTarget = lowerer.fieldTarget(expr.expression);
1307
1389
  if (accessorTarget?.container === "accessor") {
1308
- const callee = lowerer.fieldGetExpr(accessorTarget, locOf(expr.expression), expr.expression);
1390
+ let callee = lowerer.fieldGetExpr(accessorTarget, locOf(expr.expression), expr.expression);
1391
+ // A getter returning a callable class instance (chalk's
1392
+ // `chalk.red("x")`): call through its `%call` field.
1393
+ if (callee.type.kind === "object") {
1394
+ const direct = callableInstanceStringCall(lowerer, expr, callee, locOf(expr));
1395
+ if (direct)
1396
+ return direct;
1397
+ callee = lowerer.hybridCallUnwrap(callee);
1398
+ if (callee.type.kind === "func")
1399
+ return lowerCallThroughValue(lowerer, expr, callee, locOf(expr));
1400
+ }
1309
1401
  if (callee.type.kind === "func") {
1310
1402
  const args = completeFuncValueArgs(lowerer, expr, callee.type, locOf(expr));
1311
1403
  return { kind: "callValue", callee, args, type: callee.type.ret, loc: locOf(expr) };
@@ -1522,8 +1614,47 @@ export function lowerCall(lowerer, expr) {
1522
1614
  // a non-func IR type was already rejected while lowering the callee.
1523
1615
  // HYBRID (function-with-properties) values call through their %call slot.
1524
1616
  let callee = lowerer.lowerExpr(expr.expression);
1525
- if (callee.type.kind === "record")
1617
+ {
1618
+ const direct = callableInstanceStringCall(lowerer, expr, callee, loc);
1619
+ if (direct)
1620
+ return direct;
1621
+ }
1622
+ if (callee.type.kind === "record" || callee.type.kind === "object")
1526
1623
  callee = lowerer.hybridCallUnwrap(callee);
1624
+ return lowerCallThroughValue(lowerer, expr, callee, loc);
1625
+ }
1626
+ /** A callable class instance called with one string: its `%call1` method
1627
+ * when the class has one (the chalk shim's typed fast path), skipping the
1628
+ * variadic closure's checked-dynamic arguments. */
1629
+ function callableInstanceStringCall(lowerer, expr, callee, loc) {
1630
+ if (callee.type.kind !== "object" || expr.arguments.nodes.length !== 1)
1631
+ return null;
1632
+ const arg = expr.arguments.nodes[0];
1633
+ if (ts.isSpreadElement(arg))
1634
+ return null;
1635
+ const info = lowerer.classes.get(callee.type.className);
1636
+ if (info === undefined || !info.fields.has("%call") || !lowerer.findMethodOn(info, "%call1"))
1637
+ return null;
1638
+ const value = lowerer.lowerExpr(arg);
1639
+ if (value.type.kind === "string")
1640
+ return lowerer.accessorCall(callee.type.className, "%call1", callee, [value], STRING, loc);
1641
+ // Any other argument (a number behind a cast): the variadic closure,
1642
+ // through the checked-dynamic call as lowerCallThroughValue would.
1643
+ const closure = lowerer.hybridCallUnwrap(callee);
1644
+ if (closure.type.kind !== "func")
1645
+ return null;
1646
+ return {
1647
+ kind: "dynCall",
1648
+ callee: { kind: "dynFrom", value: closure, type: DYN, loc },
1649
+ calleeName: ts.isIdentifier(expr.expression) ? expr.expression.text : "value",
1650
+ args: [lowerer.coerceToExpected(value, DYN)],
1651
+ type: DYN,
1652
+ loc,
1653
+ };
1654
+ }
1655
+ /** A call through an evaluated callee value: checked-dynamic callees,
1656
+ * function unions, typed-rest and runtime-arity closures. */
1657
+ function lowerCallThroughValue(lowerer, expr, callee, loc) {
1527
1658
  // A CHECKED-DYNAMIC callee — `fn(a, b)` where fn is an implicit-any
1528
1659
  // JS binding (the mustCall body's `fn(...args)`), a dyn capture, or a
1529
1660
  // keyed read off a dyn value: the dynCall boundary. Arguments convert
@@ -1917,6 +2048,20 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
1917
2048
  return { kind: "libCall", fn: "bigint.parse", args: [arg], type: BIGINT_T, loc };
1918
2049
  if (arg.type.kind === "f64")
1919
2050
  return { kind: "libCall", fn: "bigint.fromF64", args: [arg], type: BIGINT_T, loc };
2051
+ // Byte storage converts through ToPrimitive, which BigInt then parses: a
2052
+ // typed array's text is its elements joined with "," (one element reads
2053
+ // as that element, none as 0n, several throw the SyntaxError for the
2054
+ // joined text), a Buffer's is its UTF-8 decoding and a DataView's is
2055
+ // "[object DataView]". The runtime value tells them apart, as for String.
2056
+ if (arg.type.kind === "bytes") {
2057
+ const text = {
2058
+ kind: "toString",
2059
+ operand: { kind: "dynFrom", value: arg, type: DYN, loc },
2060
+ type: STRING,
2061
+ loc,
2062
+ };
2063
+ return { kind: "libCall", fn: "bigint.parse", args: [text], type: BIGINT_T, loc };
2064
+ }
1920
2065
  if (arg.type.kind === "bool") {
1921
2066
  return {
1922
2067
  kind: "ternary",
@@ -1952,6 +2097,7 @@ function lowerBigIntConstructorValue(lowerer, arg, loc) {
1952
2097
  arm.kind === "string" ||
1953
2098
  arm.kind === "f64" ||
1954
2099
  arm.kind === "bool" ||
2100
+ arm.kind === "bytes" ||
1955
2101
  isUnitType(arm)))
1956
2102
  return null;
1957
2103
  const key = `bigint.scalar:${unionId}`;
@@ -2989,6 +3135,15 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
2989
3135
  // 'unknown' slot does.
2990
3136
  if (checkerUntyped && DYN_HANDLE_KINDS.has(recv.type.kind))
2991
3137
  recv = lowerer.coerceToExpected(recv, DYN);
3138
+ // A typed array whose checker type collapsed to `any` (a JS binding
3139
+ // referenced in its own initializer's inference — hono's etag digest
3140
+ // `const nextChunk = new Uint8Array(new ArrayBuffer(f(chunk)))` beside
3141
+ // `chunk = nextChunk`) still lowered to its native bytes. The typed
3142
+ // lowerings key on the checker type and decline it, so it boxes by
3143
+ // reference (the box shares the native storage, so writes through the
3144
+ // call stay visible) and the call dispatches on the runtime kind.
3145
+ if (checkerUntyped && recv.type.kind === "bytes")
3146
+ recv = lowerer.coerceToExpected(recv, DYN);
2992
3147
  // The last-resort retry (boxTypedTemporary — every other lowering
2993
3148
  // already declined): a checker-`any` receiver whose value is a FRESH
2994
3149
  // typed result of an earlier step in the chain (`out.split("\n")`
@@ -3108,17 +3263,21 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3108
3263
  if (access.name.text === "flatMap")
3109
3264
  return lowerDynArrayFlatMapCall(lowerer, call, access, recv);
3110
3265
  // String methods claim only names NO other dyn-representable kind's
3111
- // prototype declares (Array carries includes/indexOf/slice too): for
3112
- // these, "the receiver is a string, or the call throws V8's TypeError"
3113
- // IS Node's semantics for every possible dyn value. Shared names would
3114
- // need a receiver-kind dispatch — they keep the fence.
3266
+ // prototype declares (Array carries includes/indexOf/slice too), so no
3267
+ // other kind inherits them. Shared names would need a receiver-kind
3268
+ // dispatch — they keep the fence.
3115
3269
  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 &&
3270
+ // A checked-dynamic object can still carry its OWN member of that
3271
+ // name: zod's schemas assign `trim`, `toLowerCase` and `startsWith`
3272
+ // in their constructors (`z.string().trim().min(1)`), an object's
3273
+ // prototype can define `trim`, and a JavaScript module object can
3274
+ // assign `repeat` in a function body (`common.repeat(" ", n)`, an
3275
+ // object-typed receiver the member is missing from). An untyped
3276
+ // receiver, or a member the checker cannot type, dispatches on the
3277
+ // receiver's runtime kind: a string runs the string lowering, anything
3278
+ // else calls its member as Node does.
3279
+ if ((checkerUntyped ||
3280
+ (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
3122
3281
  !call.questionDotToken &&
3123
3282
  !access.questionDotToken &&
3124
3283
  !call.arguments.nodes.some(ts.isSpreadElement))
@@ -3142,7 +3301,12 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3142
3301
  }
3143
3302
  // The argument is a radix for bigint and an encoding for Buffer.
3144
3303
  // Preserve its runtime value so receiver dispatch can choose correctly.
3145
- if (access.name.text === "toString" && call.arguments.nodes.length <= 1) {
3304
+ // An authored own `toString` member (zod's `errorUtil.toString`, which
3305
+ // answers string | undefined) is an ordinary method call instead.
3306
+ if (access.name.text === "toString" &&
3307
+ call.arguments.nodes.length <= 1 &&
3308
+ !ownCallable &&
3309
+ !(checkerUntyped && jsAssignsOwnToString(lowerer, access.expression))) {
3146
3310
  const argument = call.arguments.nodes[0];
3147
3311
  return {
3148
3312
  kind: "libCall",
@@ -3244,11 +3408,17 @@ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = f
3244
3408
  // The same holds when only the MEMBER is checker-untyped: TypeScript
3245
3409
  // importing chalk's JavaScript source types the default export as a
3246
3410
  // plain function, so `chalk.bold` reads as `any` on a typed receiver.
3411
+ const ownToString = access.name.text === "toString" &&
3412
+ checkerUntyped &&
3413
+ jsAssignsOwnToString(lowerer, access.expression);
3247
3414
  const stringOnlyName = (checkerUntyped ||
3248
3415
  (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
3249
3416
  !ownCallable &&
3250
3417
  DYN_STRING_PROTO_ONLY_NAMES.has(access.name.text);
3251
- if (DYN_PROTO_METHOD_NAMES.has(access.name.text) && !ownCallable && !stringOnlyName)
3418
+ if (DYN_PROTO_METHOD_NAMES.has(access.name.text) &&
3419
+ !ownCallable &&
3420
+ !ownToString &&
3421
+ !stringOnlyName)
3252
3422
  return null;
3253
3423
  // Optional forms (`obj.cb?.()`, `obj?.cb()`) belong to the chain
3254
3424
  // machinery's short-circuit semantics — not modeled here yet.
@@ -3509,6 +3679,7 @@ const DYN_DISPATCH_METHODS = new Set([
3509
3679
  "shift",
3510
3680
  "unshift",
3511
3681
  "slice",
3682
+ "splice",
3512
3683
  "at",
3513
3684
  "indexOf",
3514
3685
  "lastIndexOf",
@@ -3650,6 +3821,9 @@ const DYN_DISPATCH_METHODS = new Set([
3650
3821
  "additionalHeaders",
3651
3822
  "altsvc",
3652
3823
  "origin",
3824
+ // FinalizationRegistry's methods (scr_finalization_registry_new).
3825
+ "register",
3826
+ "unregister",
3653
3827
  // Worker and MessagePort methods use the owning context's handle adapter.
3654
3828
  "postMessage",
3655
3829
  "terminate",
@@ -3661,6 +3835,15 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3661
3835
  if ((!DYN_DISPATCH_METHODS.has(method) && !isJsSourceFile(ts.getSourceFileOfNode(call))) ||
3662
3836
  lowerer.chainBlocked(call, access))
3663
3837
  return null;
3838
+ // readable.compose lowers its stages from their syntax, so it needs the
3839
+ // stream's class: a stream a JavaScript function returns untyped has none.
3840
+ if (method === "compose") {
3841
+ const recvT = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
3842
+ if (recvT?.kind === "object" &&
3843
+ streamSidesOf(lowerer, lowerer.classes.get(recvT.className)) !== null) {
3844
+ lowerer.noLowering("readable.compose on a stream held as a checked-dynamic value", call, "type the stream where it comes from, such as a JSDoc @returns {Readable} on the function that returns it");
3845
+ }
3846
+ }
3664
3847
  if (call.arguments.nodes.some((arg) => ts.isSpreadElement(arg))) {
3665
3848
  const loc = locOf(call);
3666
3849
  const local = lowerer.declareHiddenLocal("%spreadReceiver", DYN);
@@ -4531,6 +4714,10 @@ function isSoleAbstractMethod(decl) {
4531
4714
  return !owner.members.nodes.some((member) => member !== decl && ts.isMethodDeclaration(member) && ts.getTextOfNode(member.name) === name);
4532
4715
  }
4533
4716
  function reconcileOverloadReturn(lowerer, expr, call) {
4717
+ // The checker's overload is a guess for a checked-dynamic argument
4718
+ // another overload accepts: the implementation's value stands.
4719
+ if (ts.isCallExpression(expr) && dynamicOverloadChoice(lowerer, expr))
4720
+ return call;
4534
4721
  const rsig = lowerer.checker.getResolvedSignature(expr);
4535
4722
  const rdecl = rsig ? rsig.declaration : undefined;
4536
4723
  // Nominal covariant overrides share the base's return ABI, but retain
@@ -5315,7 +5502,19 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
5315
5502
  !(param.kind === "dyn" && (inner.kind === "void" || lowerer.dynConvertible(inner)))) {
5316
5503
  lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers whose parameter is not the settled value's type (expected '${lowerer.fmt(inner)}', got '${lowerer.fmt(param)}')`);
5317
5504
  }
5318
- const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
5505
+ let resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
5506
+ // JavaScript whose declared result type has no mapping (zod's
5507
+ // `Promise.all(items).then((r) => ParseStatus.mergeArray(status, r))`,
5508
+ // typed by a .d.ts union): the handler's value settles the promise as
5509
+ // a checked-dynamic value, checked where it is used.
5510
+ if (resultT?.kind !== "promise" &&
5511
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
5512
+ cb.type.kind === "func" &&
5513
+ cb.type.ret.kind !== "promise" &&
5514
+ cb.type.ret.kind !== "void" &&
5515
+ (cb.type.ret.kind === "dyn" || lowerer.dynConvertible(cb.type.ret))) {
5516
+ resultT = { kind: "promise", inner: DYN };
5517
+ }
5319
5518
  if (resultT?.kind !== "promise") {
5320
5519
  lowerer.noLowering("then with this handler's result type", call, "the combined result must be a representable promise");
5321
5520
  }
@@ -5790,6 +5989,13 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5790
5989
  const narrowed = outElem !== null && !typeEquals(outElem, elem);
5791
5990
  if (!narrowed && !isBooleanArg)
5792
5991
  return null;
5992
+ // A written predicate (`(p): p is Cat => ...`, a guard function value)
5993
+ // proves nothing at run time: the generic array HOF path filters the
5994
+ // receiver's elements and converts the kept ones checked
5995
+ // (filterResultElem).
5996
+ if (!isBooleanArg &&
5997
+ ((!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) || argNode.type))
5998
+ return null;
5793
5999
  const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
5794
6000
  "(the checker then skips the predicate) or annotate the result with the receiver's own " +
5795
6001
  "element type — and narrow the elements after";
@@ -5799,6 +6005,10 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5799
6005
  lowerer.badType(call, callT); // defensive: a narrowed non-union receiver
5800
6006
  }
5801
6007
  tag = lowerer.armTag(elem.unionId, outElem);
6008
+ // Several kept arms: the generic path converts the kept elements to
6009
+ // the narrower union (filterResultElem).
6010
+ if (tag < 0 && !isBooleanArg)
6011
+ return null;
5802
6012
  if (tag < 0) {
5803
6013
  lowerer.unsupported("SC1090", call, `'.filter' narrowing '${lowerer.fmt(elem)}' elements to the multi-arm '${lowerer.fmt(outElem)}' ` +
5804
6014
  `(only a SINGLE arm re-tags — ${annotateEscape})`);
@@ -5815,17 +6025,8 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5815
6025
  const helper = filterNarrowHelper(lowerer, "truthy", elem, outElem ?? elem, tag, loc);
5816
6026
  return { kind: "call", callee: helper, args: [receiver], type: arrayOf(outElem ?? elem), loc };
5817
6027
  }
5818
- // Inferred type predicate: inline function literal, NO return
5819
- // annotation (a written one is an unchecked assertion), and the
5820
- // checker reports a predicate over parameter 0.
5821
- if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
5822
- lowerer.unsupported("SC1090", argNode, `narrowing '.filter' through a callback VALUE ` +
5823
- `(only an inline callback whose predicate the checker inferred can re-tag — ${annotateEscape})`);
5824
- }
5825
- if (argNode.type) {
5826
- lowerer.unsupported("SC1090", argNode, `narrowing '.filter' with a hand-written type predicate ` +
5827
- `(a written 'x is T' is an unchecked assertion nothing validates at runtime — ${annotateEscape})`);
5828
- }
6028
+ // An inferred type predicate: an inline function literal with no return
6029
+ // annotation, over parameter 0 (written predicates returned above).
5829
6030
  // The receiver evaluates FIRST, in the enclosing function, like JS.
5830
6031
  const receiver = lowerer.lowerExpr(access.expression);
5831
6032
  const fnArg = lowerer.lowerExpr(argNode);
@@ -6103,8 +6304,10 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
6103
6304
  loc,
6104
6305
  },
6105
6306
  ];
6106
- const order = current.declaredOrder ?? current.fields.map((f) => f.name);
6107
- for (const name of order) {
6307
+ // One walk per key order (see perKeyOrder).
6308
+ const orders = shapeKeyOrders(current);
6309
+ const walks = orders.map(() => []);
6310
+ for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
6108
6311
  const f = current.fields.find((x) => x.name === name);
6109
6312
  const pushStmt = {
6110
6313
  kind: "exprStmt",
@@ -6121,10 +6324,11 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
6121
6324
  // Fields that can be absent push behind their presence test (the
6122
6325
  // key exists exactly when Object.keys would list it).
6123
6326
  const present = lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc);
6124
- body.push(present.kind === "recordHas"
6327
+ walks[k].push(present.kind === "recordHas"
6125
6328
  ? { kind: "if", cond: present, then: [pushStmt], else_: null, loc }
6126
6329
  : pushStmt);
6127
6330
  }
6331
+ body.push(...perKeyOrder(current, ref, walks, loc));
6128
6332
  body.push({ kind: "return", value: outRef, loc });
6129
6333
  fn.body = body;
6130
6334
  };
@@ -6140,7 +6344,7 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
6140
6344
  * (a key is own exactly when Object.keys would list it — the two share
6141
6345
  * the test), everything else true. Unmatched keys probe the overflow
6142
6346
  * map when present, so explicit undefined values remain own keys. */
6143
- function recordHasOwnHelper(lowerer, shapeId, loc) {
6347
+ export function recordHasOwnHelper(lowerer, shapeId, loc) {
6144
6348
  const key = `obj.hasOwn:${shapeId}`;
6145
6349
  const existing = lowerer.arrHofHelpers.get(key);
6146
6350
  if (existing)
@@ -7107,6 +7311,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
7107
7311
  ...(fnName !== null ? { fnName } : {}),
7108
7312
  };
7109
7313
  }
7314
+ // A class value (`Object.defineProperty(Definition, "name", { value })`)
7315
+ // boxes to its constructor function, whose own-property table holds the
7316
+ // definition for every alias of the class.
7317
+ if (target?.type.kind === "classval" && lowerer.dynConvertible(target.type)) {
7318
+ target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments.nodes[0]) };
7319
+ }
7110
7320
  const descriptorPrimitive = member === "getOwnPropertyDescriptor" &&
7111
7321
  target &&
7112
7322
  (target.type.kind === "bool" || target.type.kind === "f64" || target.type.kind === "string");
@@ -7215,6 +7425,22 @@ function lowerObjectStaticCall(lowerer, call, access) {
7215
7425
  const fnIntegrity = functionIntegrity(lowerer, member, value, call.arguments.nodes[0], locOf(call));
7216
7426
  if (fnIntegrity)
7217
7427
  return fnIntegrity;
7428
+ // A Map or Set has no own properties: freeze, seal and preventExtensions
7429
+ // all only make it not extensible.
7430
+ if (value.type.kind === "map" || value.type.kind === "set") {
7431
+ if (member === "preventExtensions" || member === "seal")
7432
+ return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
7433
+ const extensible = {
7434
+ kind: "libCall",
7435
+ fn: "collection.isExtensible",
7436
+ args: [value],
7437
+ type: BOOL,
7438
+ loc: locOf(call),
7439
+ };
7440
+ return member === "isExtensible"
7441
+ ? extensible
7442
+ : { kind: "unary", op: "!", operand: extensible, type: BOOL, loc: locOf(call) };
7443
+ }
7218
7444
  if (member === "preventExtensions" || member === "seal") {
7219
7445
  const integrity = lowerClassIntegrity(lowerer, call, member, value);
7220
7446
  if (integrity)
@@ -7251,10 +7477,42 @@ function lowerObjectStaticCall(lowerer, call, access) {
7251
7477
  // the argument — no alias exists, so the frozen bit is unobservable
7252
7478
  // (writes through the Readonly<T> result are compile errors, and no
7253
7479
  // other reference can write). Primitives pass through per ES2015.
7254
- // Aliased objects keep a fence: a later write through the original
7255
- // reference would need the runtime frozen bit (strict mode throws).
7480
+ // Aliased records get the frozen bit of their rc word (frozen-records.ts);
7481
+ // other aliased objects keep a fence: a later write through the original
7482
+ // reference would need a runtime frozen bit (strict mode throws).
7256
7483
  if (member === "isFrozen" && call.arguments.nodes.length === 1) {
7257
- const value = lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN);
7484
+ const argNode = call.arguments.nodes[0];
7485
+ const probedKind = tryLowerExpression(lowerer, argNode)?.type.kind;
7486
+ if (probedKind === "record" ||
7487
+ probedKind === "array" ||
7488
+ probedKind === "map" ||
7489
+ probedKind === "set") {
7490
+ const native = lowerer.lowerExpr(argNode);
7491
+ const loc = locOf(call);
7492
+ if (native.type.kind === "record" || native.type.kind === "array")
7493
+ return {
7494
+ kind: "libCall",
7495
+ fn: native.type.kind === "record" ? "record.isFrozen" : "array.isFrozen",
7496
+ args: [native],
7497
+ type: BOOL,
7498
+ loc,
7499
+ };
7500
+ if (native.type.kind === "map" || native.type.kind === "set")
7501
+ return {
7502
+ kind: "unary",
7503
+ op: "!",
7504
+ operand: {
7505
+ kind: "libCall",
7506
+ fn: "collection.isExtensible",
7507
+ args: [native],
7508
+ type: BOOL,
7509
+ loc,
7510
+ },
7511
+ type: BOOL,
7512
+ loc,
7513
+ };
7514
+ }
7515
+ const value = lowerer.lowerExprExpecting(argNode, DYN);
7258
7516
  return { kind: "libCall", fn: "dyn.isFrozen", args: [value], type: BOOL, loc: locOf(call) };
7259
7517
  }
7260
7518
  if (member === "freeze") {
@@ -7298,6 +7556,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
7298
7556
  const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
7299
7557
  if (integrity)
7300
7558
  return integrity;
7559
+ if (freezableRecordType(lowerer, value.type))
7560
+ return lowerNativeFreeze(lowerer, "record.freeze", value, locOf(call));
7561
+ if (value.type.kind === "array")
7562
+ return lowerNativeFreeze(lowerer, "array.freeze", value, locOf(call));
7563
+ if (value.type.kind === "map" || value.type.kind === "set")
7564
+ return lowerNativeFreeze(lowerer, "collection.preventExtensions", value, locOf(call));
7301
7565
  lowerer.noLowering("Object.freeze of a possibly-aliased value", call, "freeze of a FRESH object/array literal (and of primitives) compiles — frozen-ness is unobservable there; an aliased target's later writes would need the runtime frozen bit");
7302
7566
  }
7303
7567
  // `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
@@ -7418,12 +7682,14 @@ function lowerObjectStaticCall(lowerer, call, access) {
7418
7682
  const moduleSymbol = source ? lowerer.checker.getSymbolAtLocation(source) : undefined;
7419
7683
  const names = [];
7420
7684
  moduleSymbol?.getExports().forEach((symbol, key) => {
7685
+ // Internal names (`__export`) start with `__`; an exported name that
7686
+ // does is keyed with an extra `_` (escapedSymbolName).
7421
7687
  const name = String(key);
7422
- if (name.startsWith("__") || name === "export=")
7688
+ if ((name.startsWith("__") && !name.startsWith("___")) || name === "export=")
7423
7689
  return;
7424
7690
  const target = symbol.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(symbol) : symbol;
7425
7691
  if (target.flags & ts.SymbolFlags.Value)
7426
- names.push(name);
7692
+ names.push(ts.symbolName(symbol));
7427
7693
  });
7428
7694
  names.sort();
7429
7695
  const loc = locOf(call);
@@ -7465,10 +7731,14 @@ function lowerObjectStaticCall(lowerer, call, access) {
7465
7731
  const isJsUnion = probed?.type.kind === "union" &&
7466
7732
  isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7467
7733
  lowerer.dynConvertible(probed.type);
7734
+ // An array walks its live view: the present indices, then its numeric
7735
+ // and named properties.
7736
+ const isArray = probed?.type.kind === "array" && lowerer.dynConvertible(probed.type);
7468
7737
  if (isDyn ||
7469
7738
  isPrimitive ||
7470
7739
  isFunction ||
7471
7740
  isJsUnion ||
7741
+ isArray ||
7472
7742
  (probed && isDynTypedRefType(probed.type))) {
7473
7743
  const fn = member === "keys"
7474
7744
  ? "dyn.objKeys"
@@ -7477,7 +7747,13 @@ function lowerObjectStaticCall(lowerer, call, access) {
7477
7747
  : "dyn.objEntries";
7478
7748
  let v = lowerer.lowerExpr(argNode);
7479
7749
  if (v.type.kind !== "dyn")
7480
- v = { kind: "dynFrom", value: v, type: DYN, loc: locOf(call) };
7750
+ v = {
7751
+ kind: "dynFrom",
7752
+ value: v,
7753
+ ...(isArray ? { liveRef: true } : {}),
7754
+ type: DYN,
7755
+ loc: locOf(call),
7756
+ };
7481
7757
  // In TypeScript the keys come back as a native string[] and the
7482
7758
  // entries as a native [string, any][]: the checker keeps every later
7483
7759
  // write to the arrays well typed. JavaScript may store anything into
@@ -7640,8 +7916,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
7640
7916
  loc,
7641
7917
  },
7642
7918
  ];
7643
- const order = current.declaredOrder ?? current.fields.map((f) => f.name);
7644
- for (const name of order) {
7919
+ // One walk per key order (see perKeyOrder).
7920
+ const orders = shapeKeyOrders(current);
7921
+ const walks = orders.map(() => []);
7922
+ for (const [k, name] of orders.flatMap((order, k) => order.map((name) => [k, name]))) {
7645
7923
  const f = current.fields.find((x) => x.name === name);
7646
7924
  const raw = {
7647
7925
  kind: "recordGet",
@@ -7796,8 +8074,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
7796
8074
  loc,
7797
8075
  };
7798
8076
  }
7799
- body.push(stmt);
8077
+ walks[k].push(stmt);
7800
8078
  }
8079
+ body.push(...perKeyOrder(current, ref, walks, loc));
7801
8080
  body.push({ kind: "return", value: outRef, loc });
7802
8081
  fn.body = body;
7803
8082
  };
@@ -8032,7 +8311,17 @@ export function lowerRecordFieldCall(lowerer, call, access) {
8032
8311
  // A HYBRID (function-with-properties) field is callable through its
8033
8312
  // reserved %call slot — `colors.blue("x")` where blue also carries
8034
8313
  // `.bold` (the chalk shape).
8035
- if (callee.type.kind === "record")
8314
+ if (callee.type.kind === "object" && !init) {
8315
+ const direct = callableInstanceStringCall(lowerer, call, callee, loc);
8316
+ if (direct)
8317
+ return direct;
8318
+ // Other argument counts call the %call closure through its value, as
8319
+ // a call on the builder itself does (`theme.error("a", "b")`).
8320
+ const closure = lowerer.hybridCallUnwrap(callee);
8321
+ if (closure !== callee)
8322
+ return lowerCallThroughValue(lowerer, call, closure, loc);
8323
+ }
8324
+ if (callee.type.kind === "record" || callee.type.kind === "object")
8036
8325
  callee = lowerer.hybridCallUnwrap(callee);
8037
8326
  // Inferred JavaScript option records can retain checked callables in
8038
8327
  // fields even when the checker only describes those members as any.
@@ -8608,7 +8897,9 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8608
8897
  // so both guards would pass an emitter-named call).
8609
8898
  if (info &&
8610
8899
  !found &&
8611
- (STREAM_API_MEMBERS.has(access.name.text) || STREAM_OPERATORS.has(access.name.text)) &&
8900
+ (STREAM_API_MEMBERS.has(access.name.text) ||
8901
+ STREAM_OPERATORS.has(access.name.text) ||
8902
+ access.name.text === "compose") &&
8612
8903
  streamSidesOf(lowerer, info) !== null) {
8613
8904
  const stream = lowerStreamMethodCall(lowerer, call, access, info);
8614
8905
  if (stream)
@@ -8809,7 +9100,23 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8809
9100
  type: found.sig.ret,
8810
9101
  loc,
8811
9102
  };
8812
- const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access));
9103
+ // The declaring class's original value, built with the observed slot.
9104
+ // An override below (a virtual call) keeps the dynamic call: a slot
9105
+ // reassigned to an ancestor's method must not reach the override. So do
9106
+ // methods declared in unchecked JavaScript, whose results are inferred,
9107
+ // and calls with a spread argument: the dynamic call drains the spread
9108
+ // through the iterator's current `next`, which may be a replacement.
9109
+ const declarerFile = found.declarer.decl ? ts.getSourceFileOfNode(found.declarer.decl) : null;
9110
+ const original = virtual ||
9111
+ call.arguments.nodes.some(ts.isSpreadElement) ||
9112
+ !declarerFile ||
9113
+ (isJsSourceFile(declarerFile) && !lowerer.checkedJsFile(declarerFile))
9114
+ ? undefined
9115
+ : {
9116
+ originalId: () => found.declarer.prototypeOriginals?.get(method),
9117
+ directCall: () => fallback,
9118
+ };
9119
+ const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access), original);
8813
9120
  return {
8814
9121
  kind: "seqExpr",
8815
9122
  stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
@@ -9541,4 +9848,115 @@ function fenceClassCopyIntoFreshObject(lowerer, call, srcNode, rawSource) {
9541
9848
  return;
9542
9849
  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
9850
  }
9851
+ /** True when an untyped JavaScript receiver names a binding whose declaring
9852
+ * file assigns it an own `toString` (the TypeScript namespace downlevel
9853
+ * `errorUtil.toString = (message) => ...` in zod): its calls answer what
9854
+ * that function returns, not Object.prototype.toString's string. */
9855
+ function jsAssignsOwnToString(lowerer, receiver) {
9856
+ if (!ts.isIdentifier(receiver))
9857
+ return false;
9858
+ const decl = bindingDeclaration(lowerer, receiver);
9859
+ if (decl === undefined)
9860
+ return false;
9861
+ const sf = ts.getSourceFileOfNode(decl);
9862
+ if (!isJsSourceFile(sf))
9863
+ return false;
9864
+ let targets = lowerer.ownToStringTargets.get(sf);
9865
+ if (targets === undefined) {
9866
+ targets = ownToStringTargets(lowerer, sf);
9867
+ lowerer.ownToStringTargets.set(sf, targets);
9868
+ }
9869
+ return targets.has(decl);
9870
+ }
9871
+ const unparenthesized = (e) => {
9872
+ let out = e;
9873
+ while (ts.isParenthesizedExpression(out))
9874
+ out = out.expression;
9875
+ return out;
9876
+ };
9877
+ /** The declaration of the binding an identifier names, through imports. */
9878
+ function bindingDeclaration(lowerer, id) {
9879
+ let sym = lowerer.checker.getSymbolAtLocation(id);
9880
+ if (sym !== undefined && (sym.flags & ts.SymbolFlags.Alias) !== 0)
9881
+ sym = lowerer.checker.getAliasedSymbol(sym);
9882
+ return sym?.valueDeclaration ?? sym?.declarations?.[0];
9883
+ }
9884
+ /** The declarations of the bindings a file's assignments `x.toString = ...`
9885
+ * (or `x["toString"] = ...`) give an own `toString`. An assignment through
9886
+ * the parameter of an immediately called function counts for the binding
9887
+ * the call passes (`(function (ns) { ns.toString = f; })(ns || (ns = {}))`). */
9888
+ function ownToStringTargets(lowerer, sf) {
9889
+ const targets = new Set();
9890
+ const visit = (node) => {
9891
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
9892
+ const left = unparenthesized(node.left);
9893
+ const named = (ts.isPropertyAccessExpression(left) && left.name.text === "toString") ||
9894
+ (ts.isElementAccessExpression(left) &&
9895
+ ts.isStringLiteralLike(left.argumentExpression) &&
9896
+ left.argumentExpression.text === "toString");
9897
+ const target = named
9898
+ ? unparenthesized(left.expression)
9899
+ : undefined;
9900
+ if (target !== undefined && ts.isIdentifier(target)) {
9901
+ const decl = bindingDeclaration(lowerer, target);
9902
+ if (decl !== undefined) {
9903
+ targets.add(decl);
9904
+ const passed = iifeArgumentDeclaration(lowerer, decl);
9905
+ if (passed !== undefined)
9906
+ targets.add(passed);
9907
+ }
9908
+ }
9909
+ }
9910
+ ts.forEachChild(node, visit);
9911
+ };
9912
+ visit(sf);
9913
+ return targets;
9914
+ }
9915
+ /** For a parameter of an immediately called function, the declaration of
9916
+ * the binding its argument names: `x`, `x || (x = {})` or `(x = {})`. */
9917
+ function iifeArgumentDeclaration(lowerer, param) {
9918
+ if (!ts.isParameter(param))
9919
+ return undefined;
9920
+ const fn = param.parent;
9921
+ if (!ts.isFunctionExpression(fn) && !ts.isArrowFunction(fn))
9922
+ return undefined;
9923
+ let callee = fn;
9924
+ while (ts.isParenthesizedExpression(callee.parent))
9925
+ callee = callee.parent;
9926
+ const call = callee.parent;
9927
+ if (!ts.isCallExpression(call) || call.expression !== callee)
9928
+ return undefined;
9929
+ const index = fn.parameters.nodes.indexOf(param);
9930
+ let arg = index < 0 ? undefined : call.arguments.nodes[index];
9931
+ if (arg === undefined)
9932
+ return undefined;
9933
+ arg = unparenthesized(arg);
9934
+ if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.BarBarToken)
9935
+ arg = unparenthesized(arg.left);
9936
+ if (ts.isBinaryExpression(arg) && arg.operatorToken.kind === ts.SyntaxKind.EqualsToken)
9937
+ arg = unparenthesized(arg.left);
9938
+ return ts.isIdentifier(arg) ? bindingDeclaration(lowerer, arg) : undefined;
9939
+ }
9940
+ /** The runtime calls package shims declare as bodiless functions. */
9941
+ const SHIM_INTRINSICS = new Map([
9942
+ ["scriptcUnixDgramSocket", { fn: "dgram.unixSocket", args: [], ret: F64 }],
9943
+ ["scriptcUnixDgramConnect", { fn: "dgram.unixConnect", args: [F64, STRING], ret: F64 }],
9944
+ ["scriptcUnixDgramSend", { fn: "dgram.unixSend", args: [F64, BYTES_U8], ret: F64 }],
9945
+ ["scriptcUnixDgramClose", { fn: "dgram.unixClose", args: [F64], ret: F64 }],
9946
+ ["scriptcResponseLight", { fn: "fetch.responseLight", args: [DYN], ret: arrayOf(STRING) }],
9947
+ ]);
9948
+ function lowerShimIntrinsicCall(lowerer, expr, callee, loc) {
9949
+ const intrinsic = SHIM_INTRINSICS.get(callee.text);
9950
+ if (intrinsic === undefined)
9951
+ return null;
9952
+ const decl = lowerer.checker.getSymbolAtLocation(callee)?.valueDeclaration;
9953
+ if (decl === undefined ||
9954
+ !ts.isFunctionDeclaration(decl) ||
9955
+ decl.body ||
9956
+ !isPackageShimFile(ts.getSourceFileOfNode(decl).fileName) ||
9957
+ expr.arguments.nodes.length !== intrinsic.args.length)
9958
+ return null;
9959
+ const args = expr.arguments.nodes.map((arg, i) => lowerer.lowerExprExpecting(arg, intrinsic.args[i]));
9960
+ return { kind: "libCall", fn: intrinsic.fn, args, type: intrinsic.ret, loc };
9961
+ }
9544
9962
  //# sourceMappingURL=lower-calls.js.map