@scriptc/compiler 0.4.6 → 0.4.8

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 (1082) hide show
  1. package/ambient/node-fallback/child_process.d.ts +71 -22
  2. package/ambient/node-fallback/crypto.d.ts +15 -7
  3. package/ambient/node-fallback/events.d.ts +29 -6
  4. package/ambient/node-fallback/fs-promises.d.ts +1 -1
  5. package/ambient/node-fallback/fs.d.ts +57 -12
  6. package/ambient/node-fallback/http.d.ts +26 -18
  7. package/ambient/node-fallback/https.d.ts +5 -2
  8. package/ambient/node-fallback/net.d.ts +25 -0
  9. package/ambient/node-fallback/os.d.ts +11 -1
  10. package/ambient/node-fallback/path-posix.d.ts +6 -0
  11. package/ambient/node-fallback/path-win32.d.ts +5 -0
  12. package/ambient/node-fallback/path.d.ts +2 -0
  13. package/ambient/node-fallback/querystring.d.ts +3 -3
  14. package/ambient/node-fallback/zlib.d.ts +31 -2
  15. package/ambient/scriptc-node-fallback.d.ts +95 -20
  16. package/ambient/scriptc.d.ts +7 -2
  17. package/dist/backend/executable-features.js +22 -1
  18. package/dist/backend/executable-features.js.map +1 -1
  19. package/dist/backend/immutability.d.ts +12 -1
  20. package/dist/backend/immutability.js +50 -4
  21. package/dist/backend/immutability.js.map +1 -1
  22. package/dist/backend/immutability.test.js +95 -1
  23. package/dist/backend/immutability.test.js.map +1 -1
  24. package/dist/backend/library-pack.d.ts +6 -0
  25. package/dist/backend/library-pack.js +18 -5
  26. package/dist/backend/library-pack.js.map +1 -1
  27. package/dist/backend/library-pack.test.d.ts +1 -0
  28. package/dist/backend/library-pack.test.js +28 -0
  29. package/dist/backend/library-pack.test.js.map +1 -0
  30. package/dist/backend/linker.d.ts +20 -2
  31. package/dist/backend/linker.js +221 -35
  32. package/dist/backend/linker.js.map +1 -1
  33. package/dist/backend/lld.d.ts +15 -6
  34. package/dist/backend/lld.js +24 -16
  35. package/dist/backend/lld.js.map +1 -1
  36. package/dist/backend/lld.test.js +13 -5
  37. package/dist/backend/lld.test.js.map +1 -1
  38. package/dist/backend/llvm/alloc.d.ts +15 -2
  39. package/dist/backend/llvm/alloc.js +172 -36
  40. package/dist/backend/llvm/alloc.js.map +1 -1
  41. package/dist/backend/llvm/alloc.test.js +69 -1
  42. package/dist/backend/llvm/alloc.test.js.map +1 -1
  43. package/dist/backend/llvm/arenas.d.ts +17 -4
  44. package/dist/backend/llvm/arenas.js +105 -10
  45. package/dist/backend/llvm/arenas.js.map +1 -1
  46. package/dist/backend/llvm/arenas.test.js +229 -0
  47. package/dist/backend/llvm/arenas.test.js.map +1 -1
  48. package/dist/backend/llvm/bytes-alias.js +10 -1
  49. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  50. package/dist/backend/llvm/bytes-headers.js +6 -0
  51. package/dist/backend/llvm/bytes-headers.js.map +1 -1
  52. package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
  53. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  54. package/dist/backend/llvm/call-lifetimes.js +10 -0
  55. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  56. package/dist/backend/llvm/classes.d.ts +16 -9
  57. package/dist/backend/llvm/classes.js +142 -37
  58. package/dist/backend/llvm/classes.js.map +1 -1
  59. package/dist/backend/llvm/classes.test.js +42 -0
  60. package/dist/backend/llvm/classes.test.js.map +1 -1
  61. package/dist/backend/llvm/constant-callbacks.test.js +50 -1
  62. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  63. package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
  64. package/dist/backend/llvm/cpu-dispatch.js +34 -9
  65. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  66. package/dist/backend/llvm/dyn.d.ts +64 -3
  67. package/dist/backend/llvm/dyn.js +251 -15
  68. package/dist/backend/llvm/dyn.js.map +1 -1
  69. package/dist/backend/llvm/emit-function.js +68 -5
  70. package/dist/backend/llvm/emit-function.js.map +1 -1
  71. package/dist/backend/llvm/emit-module.js +226 -77
  72. package/dist/backend/llvm/emit-module.js.map +1 -1
  73. package/dist/backend/llvm/emit-module.test.d.ts +1 -0
  74. package/dist/backend/llvm/emit-module.test.js +52 -0
  75. package/dist/backend/llvm/emit-module.test.js.map +1 -0
  76. package/dist/backend/llvm/emit-statements.js +138 -34
  77. package/dist/backend/llvm/emit-statements.js.map +1 -1
  78. package/dist/backend/llvm/emitter.d.ts +142 -10
  79. package/dist/backend/llvm/emitter.js +523 -73
  80. package/dist/backend/llvm/emitter.js.map +1 -1
  81. package/dist/backend/llvm/emitter.test.js +31 -3
  82. package/dist/backend/llvm/emitter.test.js.map +1 -1
  83. package/dist/backend/llvm/expr-async.js +19 -1
  84. package/dist/backend/llvm/expr-async.js.map +1 -1
  85. package/dist/backend/llvm/expr-bytes.js +16 -1
  86. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  87. package/dist/backend/llvm/expr-calls.d.ts +4 -1
  88. package/dist/backend/llvm/expr-calls.js +38 -6
  89. package/dist/backend/llvm/expr-calls.js.map +1 -1
  90. package/dist/backend/llvm/expr-dynamic.js +237 -23
  91. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  92. package/dist/backend/llvm/expr-primitives.js +123 -12
  93. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  94. package/dist/backend/llvm/expr-records.d.ts +1 -1
  95. package/dist/backend/llvm/expr-records.js +124 -56
  96. package/dist/backend/llvm/expr-records.js.map +1 -1
  97. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  98. package/dist/backend/llvm/expr-stream-bridges.js +59 -2
  99. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  100. package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
  101. package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
  102. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  103. package/dist/backend/llvm/integer-values.d.ts +2 -0
  104. package/dist/backend/llvm/integer-values.js +6 -0
  105. package/dist/backend/llvm/integer-values.js.map +1 -1
  106. package/dist/backend/llvm/js-groups.d.ts +21 -0
  107. package/dist/backend/llvm/js-groups.js +277 -0
  108. package/dist/backend/llvm/js-groups.js.map +1 -0
  109. package/dist/backend/llvm/js-ic.d.ts +57 -1
  110. package/dist/backend/llvm/js-ic.js +389 -22
  111. package/dist/backend/llvm/js-ic.js.map +1 -1
  112. package/dist/backend/llvm/lib-dispatch.js +152 -1
  113. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  114. package/dist/backend/llvm/lib-filesystem.js +116 -11
  115. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  116. package/dist/backend/llvm/lib-network.js +33 -6
  117. package/dist/backend/llvm/lib-network.js.map +1 -1
  118. package/dist/backend/llvm/lib-process.js +180 -27
  119. package/dist/backend/llvm/lib-process.js.map +1 -1
  120. package/dist/backend/llvm/lib-shared.js +139 -2
  121. package/dist/backend/llvm/lib-shared.js.map +1 -1
  122. package/dist/backend/llvm/lib-stream.js +67 -0
  123. package/dist/backend/llvm/lib-stream.js.map +1 -1
  124. package/dist/backend/llvm/local-union-storage.test.js +32 -0
  125. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  126. package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
  127. package/dist/backend/llvm/loop-entry-versions.js +43 -21
  128. package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
  129. package/dist/backend/llvm/loop-state.d.ts +7 -1
  130. package/dist/backend/llvm/loop-state.js +26 -3
  131. package/dist/backend/llvm/loop-state.js.map +1 -1
  132. package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
  133. package/dist/backend/llvm/map-entry-fusion.js +3 -3
  134. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  135. package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
  136. package/dist/backend/llvm/map-number-lookup.js +7 -3
  137. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  138. package/dist/backend/llvm/map-number-lookup.test.js +58 -17
  139. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  140. package/dist/backend/llvm/nullable-unions.js +7 -6
  141. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  142. package/dist/backend/llvm/nullable-unions.test.js +4 -1
  143. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  144. package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
  145. package/dist/backend/llvm/receiver-brackets.test.js +68 -0
  146. package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
  147. package/dist/backend/llvm/receivers.js +3 -0
  148. package/dist/backend/llvm/receivers.js.map +1 -1
  149. package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
  150. package/dist/backend/llvm/record-entry-fusion.js +217 -0
  151. package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
  152. package/dist/backend/llvm/record-results.d.ts +5 -2
  153. package/dist/backend/llvm/record-results.js +13 -12
  154. package/dist/backend/llvm/record-results.js.map +1 -1
  155. package/dist/backend/llvm/record-views.d.ts +22 -2
  156. package/dist/backend/llvm/record-views.js +147 -12
  157. package/dist/backend/llvm/record-views.js.map +1 -1
  158. package/dist/backend/llvm/record-views.test.js +76 -0
  159. package/dist/backend/llvm/record-views.test.js.map +1 -1
  160. package/dist/backend/llvm/reference-effects.js +1 -0
  161. package/dist/backend/llvm/reference-effects.js.map +1 -1
  162. package/dist/backend/llvm/reference-writes.js +4 -0
  163. package/dist/backend/llvm/reference-writes.js.map +1 -1
  164. package/dist/backend/llvm/region-ir.js +1 -0
  165. package/dist/backend/llvm/region-ir.js.map +1 -1
  166. package/dist/backend/llvm/region-sites.d.ts +18 -0
  167. package/dist/backend/llvm/region-sites.js +79 -1
  168. package/dist/backend/llvm/region-sites.js.map +1 -1
  169. package/dist/backend/llvm/runtime-registries.test.js +53 -6
  170. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  171. package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
  172. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  173. package/dist/backend/llvm/shapes.d.ts +36 -3
  174. package/dist/backend/llvm/shapes.js +201 -16
  175. package/dist/backend/llvm/shapes.js.map +1 -1
  176. package/dist/backend/llvm/shapes.test.js +4 -0
  177. package/dist/backend/llvm/shapes.test.js.map +1 -1
  178. package/dist/backend/llvm/speculative-integers.d.ts +10 -1
  179. package/dist/backend/llvm/speculative-integers.js +59 -8
  180. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  181. package/dist/backend/llvm/stack-objects.d.ts +1 -2
  182. package/dist/backend/llvm/stack-objects.js +8 -5
  183. package/dist/backend/llvm/stack-objects.js.map +1 -1
  184. package/dist/backend/llvm/unwind-abi.d.ts +3 -3
  185. package/dist/backend/llvm/unwind-abi.js +8 -3
  186. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  187. package/dist/backend/llvm/walkers.d.ts +12 -0
  188. package/dist/backend/llvm/walkers.js +47 -3
  189. package/dist/backend/llvm/walkers.js.map +1 -1
  190. package/dist/backend/may-throw.js +12 -2
  191. package/dist/backend/may-throw.js.map +1 -1
  192. package/dist/backend/may-throw.test.js +13 -0
  193. package/dist/backend/may-throw.test.js.map +1 -1
  194. package/dist/backend/native/contracts.d.ts +94 -0
  195. package/dist/backend/native/executable.js +134 -10
  196. package/dist/backend/native/executable.js.map +1 -1
  197. package/dist/backend/native/helper-identity-record.d.ts +11 -0
  198. package/dist/backend/native/helper-identity-record.js +76 -0
  199. package/dist/backend/native/helper-identity-record.js.map +1 -0
  200. package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
  201. package/dist/backend/native/helper-identity-record.test.js +101 -0
  202. package/dist/backend/native/helper-identity-record.test.js.map +1 -0
  203. package/dist/backend/native/library.js +10 -2
  204. package/dist/backend/native/library.js.map +1 -1
  205. package/dist/backend/native/runtime-inputs.js +8 -1
  206. package/dist/backend/native/runtime-inputs.js.map +1 -1
  207. package/dist/backend/native/vendor.d.ts +1 -1
  208. package/dist/backend/native/vendor.js +1 -1
  209. package/dist/backend/native/vendor.js.map +1 -1
  210. package/dist/backend/native-codegen-core.d.ts +13 -10
  211. package/dist/backend/native-codegen-core.js +26 -13
  212. package/dist/backend/native-codegen-core.js.map +1 -1
  213. package/dist/backend/native-codegen.js +30 -8
  214. package/dist/backend/native-codegen.js.map +1 -1
  215. package/dist/backend/native-codegen.test.js +110 -14
  216. package/dist/backend/native-codegen.test.js.map +1 -1
  217. package/dist/backend/native-link-info-core.d.ts +72 -0
  218. package/dist/backend/native-link-info-core.js.map +1 -1
  219. package/dist/backend/native-link-info.js +1 -0
  220. package/dist/backend/native-link-info.js.map +1 -1
  221. package/dist/backend/native-profile.d.ts +4 -1
  222. package/dist/backend/native-profile.js +12 -1
  223. package/dist/backend/native-profile.js.map +1 -1
  224. package/dist/backend/native-profile.test.js +10 -0
  225. package/dist/backend/native-profile.test.js.map +1 -1
  226. package/dist/backend/publication.d.ts +4 -1
  227. package/dist/backend/publication.js +4 -2
  228. package/dist/backend/publication.js.map +1 -1
  229. package/dist/backend/runtime-abi.d.ts +2 -2
  230. package/dist/backend/runtime-abi.js +2 -2
  231. package/dist/backend/runtime-pack-core.d.ts +46 -7
  232. package/dist/backend/runtime-pack-core.js +37 -2
  233. package/dist/backend/runtime-pack-core.js.map +1 -1
  234. package/dist/backend/runtime-pack-native.d.ts +18 -1
  235. package/dist/backend/runtime-pack-native.js +138 -29
  236. package/dist/backend/runtime-pack-native.js.map +1 -1
  237. package/dist/backend/runtime-pack-native.test.js +166 -4
  238. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  239. package/dist/backend/runtime-pack-targets.test.js +3 -1
  240. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  241. package/dist/backend/runtime-pack.d.ts +7 -0
  242. package/dist/backend/runtime-pack.js +25 -3
  243. package/dist/backend/runtime-pack.js.map +1 -1
  244. package/dist/backend/runtime-pack.test.js +213 -12
  245. package/dist/backend/runtime-pack.test.js.map +1 -1
  246. package/dist/backend/tree-classes.d.ts +42 -0
  247. package/dist/backend/tree-classes.js +723 -0
  248. package/dist/backend/tree-classes.js.map +1 -0
  249. package/dist/backend/tree-classes.test.d.ts +1 -0
  250. package/dist/backend/tree-classes.test.js +338 -0
  251. package/dist/backend/tree-classes.test.js.map +1 -0
  252. package/dist/backend/vendor-archives.d.ts +8 -1
  253. package/dist/backend/vendor-archives.js +313 -8
  254. package/dist/backend/vendor-archives.js.map +1 -1
  255. package/dist/backend/vendor-inputs.d.ts +60 -3
  256. package/dist/backend/vendor-inputs.js +109 -3
  257. package/dist/backend/vendor-inputs.js.map +1 -1
  258. package/dist/backend/vendor-inputs.test.js +62 -1
  259. package/dist/backend/vendor-inputs.test.js.map +1 -1
  260. package/dist/backend/warm-cache.js +2 -0
  261. package/dist/backend/warm-cache.js.map +1 -1
  262. package/dist/compat/fetch-profile.d.ts +7 -1
  263. package/dist/compat/fetch-profile.js +25 -12
  264. package/dist/compat/fetch-profile.js.map +1 -1
  265. package/dist/compile-types.d.ts +7 -0
  266. package/dist/contracts/check.d.ts +3 -0
  267. package/dist/contracts/check.js +18 -5
  268. package/dist/contracts/check.js.map +1 -1
  269. package/dist/coverage/report.js +47 -0
  270. package/dist/coverage/report.js.map +1 -1
  271. package/dist/coverage/surface-manifest.js +1 -1
  272. package/dist/coverage/surface-manifest.js.map +1 -1
  273. package/dist/diagnostics/codes.d.ts +14 -0
  274. package/dist/diagnostics/codes.js +14 -0
  275. package/dist/diagnostics/codes.js.map +1 -1
  276. package/dist/diagnostics/diagnostic.d.ts +68 -0
  277. package/dist/diagnostics/diagnostic.js +186 -6
  278. package/dist/diagnostics/diagnostic.js.map +1 -1
  279. package/dist/diagnostics/dynamic-tier.js +3 -1
  280. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  281. package/dist/diagnostics/envelope.d.ts +18 -0
  282. package/dist/diagnostics/envelope.js.map +1 -1
  283. package/dist/executable/executable-cache.d.ts +48 -0
  284. package/dist/executable/executable-cache.js +38 -0
  285. package/dist/executable/executable-cache.js.map +1 -1
  286. package/dist/executable/executable-cache.test.js +127 -1
  287. package/dist/executable/executable-cache.test.js.map +1 -1
  288. package/dist/executable/prepare.d.ts +13 -3
  289. package/dist/executable/prepare.js +438 -234
  290. package/dist/executable/prepare.js.map +1 -1
  291. package/dist/frontend/analysis.js +200 -18
  292. package/dist/frontend/analysis.js.map +1 -1
  293. package/dist/frontend/builtin-modules.d.ts +4 -0
  294. package/dist/frontend/builtin-modules.js +10 -0
  295. package/dist/frontend/builtin-modules.js.map +1 -1
  296. package/dist/frontend/early-errors.d.ts +24 -0
  297. package/dist/frontend/early-errors.js +836 -0
  298. package/dist/frontend/early-errors.js.map +1 -0
  299. package/dist/frontend/early-errors.test.d.ts +1 -0
  300. package/dist/frontend/early-errors.test.js +207 -0
  301. package/dist/frontend/early-errors.test.js.map +1 -0
  302. package/dist/frontend/inferred-js-diagnostics.test.js +88 -0
  303. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  304. package/dist/frontend/input-tracker.d.ts +47 -0
  305. package/dist/frontend/input-tracker.js +173 -36
  306. package/dist/frontend/input-tracker.js.map +1 -1
  307. package/dist/frontend/input-tracker.test.js +86 -2
  308. package/dist/frontend/input-tracker.test.js.map +1 -1
  309. package/dist/frontend/js-inference.d.ts +2 -0
  310. package/dist/frontend/js-inference.js +18 -0
  311. package/dist/frontend/js-inference.js.map +1 -0
  312. package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
  313. package/dist/frontend/jsx-opinion-sites.test.js +86 -0
  314. package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
  315. package/dist/frontend/lib-exports.d.ts +23 -4
  316. package/dist/frontend/lib-exports.js +98 -26
  317. package/dist/frontend/lib-exports.js.map +1 -1
  318. package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
  319. package/dist/frontend/lowering/binding-analysis.js +86 -4
  320. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  321. package/dist/frontend/lowering/buffers.d.ts +8 -0
  322. package/dist/frontend/lowering/buffers.js +43 -0
  323. package/dist/frontend/lowering/buffers.js.map +1 -0
  324. package/dist/frontend/lowering/builtin-calls.js +13 -0
  325. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  326. package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
  327. package/dist/frontend/lowering/builtin-namespaces.js +41 -3
  328. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  329. package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
  330. package/dist/frontend/lowering/builtin-statics.js +407 -0
  331. package/dist/frontend/lowering/builtin-statics.js.map +1 -0
  332. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  333. package/dist/frontend/lowering/builtins/arguments.js +12 -0
  334. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  335. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
  336. package/dist/frontend/lowering/builtins/atomics.js +87 -1
  337. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
  339. package/dist/frontend/lowering/builtins/child-process-methods.js +52 -12
  340. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  341. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
  342. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
  343. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  344. package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
  345. package/dist/frontend/lowering/builtins/child-process.js +565 -28
  346. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  347. package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
  348. package/dist/frontend/lowering/builtins/compression.js +41 -21
  349. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  350. package/dist/frontend/lowering/builtins/constants.js +7 -2
  351. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  352. package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
  353. package/dist/frontend/lowering/builtins/dates.js +23 -1
  354. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  355. package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
  356. package/dist/frontend/lowering/builtins/environment.js +213 -2
  357. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  358. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  359. package/dist/frontend/lowering/builtins/filesystem-calls.js +75 -18
  360. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  361. package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
  362. package/dist/frontend/lowering/builtins/filesystem.js +185 -16
  363. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  364. package/dist/frontend/lowering/builtins/json.js +4 -0
  365. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  366. package/dist/frontend/lowering/builtins/module-calls.js +42 -3
  367. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  368. package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
  369. package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
  370. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  371. package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
  372. package/dist/frontend/lowering/builtins/numbers.js +10 -2
  373. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  374. package/dist/frontend/lowering/builtins/operating-system.d.ts +9 -5
  375. package/dist/frontend/lowering/builtins/operating-system.js +101 -20
  376. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  377. package/dist/frontend/lowering/builtins/process.d.ts +18 -2
  378. package/dist/frontend/lowering/builtins/process.js +386 -25
  379. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  380. package/dist/frontend/lowering/builtins/promises.js +169 -8
  381. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  382. package/dist/frontend/lowering/builtins/properties.js +6 -2
  383. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  384. package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
  385. package/dist/frontend/lowering/builtins/querystring.js +202 -18
  386. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  387. package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
  388. package/dist/frontend/lowering/builtins/readline.js +200 -38
  389. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  390. package/dist/frontend/lowering/builtins/reflection.js +60 -1
  391. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  392. package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
  393. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  394. package/dist/frontend/lowering/builtins/url.js +55 -13
  395. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  396. package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
  397. package/dist/frontend/lowering/builtins/v8.js +7 -5
  398. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  399. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
  400. package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
  401. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
  402. package/dist/frontend/lowering/builtins/webassembly.js +2 -0
  403. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  404. package/dist/frontend/lowering/call-arguments.d.ts +10 -0
  405. package/dist/frontend/lowering/call-arguments.js +37 -2
  406. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  407. package/dist/frontend/lowering/call-signatures.d.ts +10 -0
  408. package/dist/frontend/lowering/call-signatures.js +180 -0
  409. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  410. package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
  411. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  412. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  413. package/dist/frontend/lowering/cjs-inline-require.js +5 -0
  414. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  415. package/dist/frontend/lowering/class-construction.d.ts +14 -2
  416. package/dist/frontend/lowering/class-construction.js +99 -5
  417. package/dist/frontend/lowering/class-construction.js.map +1 -1
  418. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +14 -0
  419. package/dist/frontend/lowering/class-dynamic-dispatch.js +1376 -1009
  420. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  421. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
  422. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  423. package/dist/frontend/lowering/class-protocols.js +59 -10
  424. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  425. package/dist/frontend/lowering/class-prototypes.js +20 -15
  426. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  427. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  428. package/dist/frontend/lowering/class-runtime-statics.js +35 -1
  429. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  430. package/dist/frontend/lowering/class-unions.js +21 -4
  431. package/dist/frontend/lowering/class-unions.js.map +1 -1
  432. package/dist/frontend/lowering/class-views.d.ts +13 -0
  433. package/dist/frontend/lowering/class-views.js +51 -0
  434. package/dist/frontend/lowering/class-views.js.map +1 -0
  435. package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
  436. package/dist/frontend/lowering/coercions/function-adapters.js +63 -10
  437. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  438. package/dist/frontend/lowering/coercions/state.d.ts +15 -0
  439. package/dist/frontend/lowering/coercions/state.js +24 -0
  440. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  441. package/dist/frontend/lowering/coercions/structural-plans.js +75 -3
  442. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  443. package/dist/frontend/lowering/coercions/structural.js +39 -2
  444. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  445. package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
  446. package/dist/frontend/lowering/coercions/unions.js +54 -10
  447. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  448. package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
  449. package/dist/frontend/lowering/constructor-returns.js +284 -58
  450. package/dist/frontend/lowering/constructor-returns.js.map +1 -1
  451. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
  452. package/dist/frontend/lowering/containers/array-callbacks.js +288 -90
  453. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  454. package/dist/frontend/lowering/containers/array-construction.js +37 -8
  455. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  456. package/dist/frontend/lowering/containers/array-from-async.js +139 -3
  457. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  458. package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
  459. package/dist/frontend/lowering/containers/array-iteration.js +24 -7
  460. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
  461. package/dist/frontend/lowering/containers/array-methods.js +30 -11
  462. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  463. package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
  464. package/dist/frontend/lowering/containers/bytes.js +450 -86
  465. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  466. package/dist/frontend/lowering/containers/callback-arguments.d.ts +16 -0
  467. package/dist/frontend/lowering/containers/callback-arguments.js +74 -12
  468. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  469. package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
  470. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  471. package/dist/frontend/lowering/containers/collection-methods.js +52 -17
  472. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  473. package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
  474. package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
  475. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  476. package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
  477. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  478. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
  479. package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
  480. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  481. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
  482. package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
  483. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  484. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  485. package/dist/frontend/lowering/crypto-tables.js +5 -5
  486. package/dist/frontend/lowering/dispatch-sites.js +3 -0
  487. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  488. package/dist/frontend/lowering/divergences.d.ts +40 -0
  489. package/dist/frontend/lowering/divergences.js +239 -20
  490. package/dist/frontend/lowering/divergences.js.map +1 -1
  491. package/dist/frontend/lowering/effect-free.d.ts +12 -0
  492. package/dist/frontend/lowering/effect-free.js +44 -0
  493. package/dist/frontend/lowering/effect-free.js.map +1 -0
  494. package/dist/frontend/lowering/expressions/array-literals.d.ts +24 -0
  495. package/dist/frontend/lowering/expressions/array-literals.js +88 -10
  496. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  497. package/dist/frontend/lowering/expressions/binary.js +216 -14
  498. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  499. package/dist/frontend/lowering/expressions/element-access.js +272 -11
  500. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  501. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
  502. package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
  503. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  504. package/dist/frontend/lowering/expressions/identifiers.js +173 -4
  505. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  506. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
  507. package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
  508. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  509. package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
  510. package/dist/frontend/lowering/expressions/narrowing.js +195 -18
  511. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  512. package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
  513. package/dist/frontend/lowering/expressions/object-literals.js +951 -240
  514. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  515. package/dist/frontend/lowering/expressions/optional-chains.js +71 -21
  516. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  517. package/dist/frontend/lowering/expressions/property-access.d.ts +39 -0
  518. package/dist/frontend/lowering/expressions/property-access.js +1141 -87
  519. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  520. package/dist/frontend/lowering/expressions/relational.js +262 -4
  521. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  522. package/dist/frontend/lowering/expressions/typeof.js +25 -0
  523. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  524. package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
  525. package/dist/frontend/lowering/expressions/union-fields.js +103 -13
  526. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  527. package/dist/frontend/lowering/expressions/updates.js +156 -22
  528. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  529. package/dist/frontend/lowering/frozen-records.d.ts +6 -0
  530. package/dist/frontend/lowering/frozen-records.js +10 -4
  531. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  532. package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
  533. package/dist/frontend/lowering/frozen-records.test.js +44 -0
  534. package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
  535. package/dist/frontend/lowering/function-names.d.ts +9 -0
  536. package/dist/frontend/lowering/function-names.js +95 -0
  537. package/dist/frontend/lowering/function-names.js.map +1 -0
  538. package/dist/frontend/lowering/function-returns.js +42 -13
  539. package/dist/frontend/lowering/function-returns.js.map +1 -1
  540. package/dist/frontend/lowering/general-streams.js +5 -0
  541. package/dist/frontend/lowering/general-streams.js.map +1 -1
  542. package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
  543. package/dist/frontend/lowering/generator-delegation.js +301 -118
  544. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  545. package/dist/frontend/lowering/generic-functions.d.ts +75 -0
  546. package/dist/frontend/lowering/generic-functions.js +790 -18
  547. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  548. package/dist/frontend/lowering/global-function-values.d.ts +25 -0
  549. package/dist/frontend/lowering/global-function-values.js +193 -0
  550. package/dist/frontend/lowering/global-function-values.js.map +1 -0
  551. package/dist/frontend/lowering/global-values.d.ts +15 -4
  552. package/dist/frontend/lowering/global-values.js +67 -9
  553. package/dist/frontend/lowering/global-values.js.map +1 -1
  554. package/dist/frontend/lowering/handle-properties.js +34 -1
  555. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  556. package/dist/frontend/lowering/host-global-values.d.ts +31 -0
  557. package/dist/frontend/lowering/host-global-values.js +121 -0
  558. package/dist/frontend/lowering/host-global-values.js.map +1 -0
  559. package/dist/frontend/lowering/host-globals.d.ts +74 -0
  560. package/dist/frontend/lowering/host-globals.js +344 -0
  561. package/dist/frontend/lowering/host-globals.js.map +1 -0
  562. package/dist/frontend/lowering/http2-constants.js +1 -1
  563. package/dist/frontend/lowering/iterator-adapters.js +46 -17
  564. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  565. package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
  566. package/dist/frontend/lowering/iterator-prototype.js +160 -0
  567. package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
  568. package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
  569. package/dist/frontend/lowering/key-order-witness.js +571 -9
  570. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  571. package/dist/frontend/lowering/key-order-witness.test.js +1 -0
  572. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  573. package/dist/frontend/lowering/lib-boundary.js +25 -3
  574. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  575. package/dist/frontend/lowering/lower-assert.js +140 -16
  576. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  577. package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
  578. package/dist/frontend/lowering/lower-async-iteration.js +15 -0
  579. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  580. package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
  581. package/dist/frontend/lowering/lower-builtin-values.js +342 -58
  582. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  583. package/dist/frontend/lowering/lower-calls.d.ts +47 -1
  584. package/dist/frontend/lowering/lower-calls.js +1354 -273
  585. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  586. package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
  587. package/dist/frontend/lowering/lower-calls.test.js +121 -0
  588. package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
  589. package/dist/frontend/lowering/lower-classes.d.ts +36 -5
  590. package/dist/frontend/lowering/lower-classes.js +630 -89
  591. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  592. package/dist/frontend/lowering/lower-event-emitter.d.ts +15 -2
  593. package/dist/frontend/lowering/lower-event-emitter.js +610 -98
  594. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  595. package/dist/frontend/lowering/lower-exprs.d.ts +15 -1
  596. package/dist/frontend/lowering/lower-exprs.js +96 -20
  597. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  598. package/dist/frontend/lowering/lower-functions.js +27 -6
  599. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  600. package/dist/frontend/lowering/lower-generators.js +57 -10
  601. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  602. package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
  603. package/dist/frontend/lowering/lower-global-value.js +14 -5
  604. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  605. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  606. package/dist/frontend/lowering/lower-inspect.js +713 -92
  607. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  608. package/dist/frontend/lowering/lower-modules.js +135 -27
  609. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  610. package/dist/frontend/lowering/lower-namespaces.js +18 -0
  611. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  612. package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
  613. package/dist/frontend/lowering/lower-node-island.js +472 -67
  614. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  615. package/dist/frontend/lowering/lower-server.js +463 -96
  616. package/dist/frontend/lowering/lower-server.js.map +1 -1
  617. package/dist/frontend/lowering/lower-shared-modules.js +13 -1
  618. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
  619. package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
  620. package/dist/frontend/lowering/lower-stdlib.js +77 -18
  621. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  622. package/dist/frontend/lowering/lower-stmts.d.ts +24 -4
  623. package/dist/frontend/lowering/lower-stmts.js +831 -136
  624. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  625. package/dist/frontend/lowering/lower-stream.js +126 -8
  626. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  627. package/dist/frontend/lowering/lower-timers.js +243 -48
  628. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  629. package/dist/frontend/lowering/lower-url.js +6 -3
  630. package/dist/frontend/lowering/lower-url.js.map +1 -1
  631. package/dist/frontend/lowering/lowerer.d.ts +363 -21
  632. package/dist/frontend/lowering/lowerer.js +1224 -129
  633. package/dist/frontend/lowering/lowerer.js.map +1 -1
  634. package/dist/frontend/lowering/lowerer.test.js +19 -1
  635. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  636. package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
  637. package/dist/frontend/lowering/lowering-facts.js +323 -0
  638. package/dist/frontend/lowering/lowering-facts.js.map +1 -0
  639. package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
  640. package/dist/frontend/lowering/lowering-facts.test.js +100 -0
  641. package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
  642. package/dist/frontend/lowering/module-namespace-elements.js +15 -0
  643. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  644. package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
  645. package/dist/frontend/lowering/nan-coded-reads.js +112 -9
  646. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  647. package/dist/frontend/lowering/new-target.js +2 -2
  648. package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
  649. package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
  650. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
  651. package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
  652. package/dist/frontend/lowering/optional-arguments.js +26 -2
  653. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  654. package/dist/frontend/lowering/partial-assertions.d.ts +36 -0
  655. package/dist/frontend/lowering/partial-assertions.js +189 -0
  656. package/dist/frontend/lowering/partial-assertions.js.map +1 -0
  657. package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
  658. package/dist/frontend/lowering/primitive-throws.js +241 -0
  659. package/dist/frontend/lowering/primitive-throws.js.map +1 -0
  660. package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
  661. package/dist/frontend/lowering/primitive-wrappers.js +221 -0
  662. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
  663. package/dist/frontend/lowering/private-statics.d.ts +46 -0
  664. package/dist/frontend/lowering/private-statics.js +322 -0
  665. package/dist/frontend/lowering/private-statics.js.map +1 -0
  666. package/dist/frontend/lowering/record-inherited.d.ts +17 -1
  667. package/dist/frontend/lowering/record-inherited.js +16 -2
  668. package/dist/frontend/lowering/record-inherited.js.map +1 -1
  669. package/dist/frontend/lowering/record-links.d.ts +73 -0
  670. package/dist/frontend/lowering/record-links.js +797 -0
  671. package/dist/frontend/lowering/record-links.js.map +1 -0
  672. package/dist/frontend/lowering/record-sources.d.ts +12 -1
  673. package/dist/frontend/lowering/record-sources.js +60 -0
  674. package/dist/frontend/lowering/record-sources.js.map +1 -1
  675. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
  676. package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
  677. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  678. package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
  679. package/dist/frontend/lowering/runtime-optional-report.js +300 -0
  680. package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
  681. package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
  682. package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
  683. package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
  684. package/dist/frontend/lowering/static-typeof.d.ts +3 -1
  685. package/dist/frontend/lowering/static-typeof.js +6 -1
  686. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  687. package/dist/frontend/lowering/strict-equality.d.ts +4 -0
  688. package/dist/frontend/lowering/strict-equality.js +14 -0
  689. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  690. package/dist/frontend/lowering/strict-mode.d.ts +1 -5
  691. package/dist/frontend/lowering/strict-mode.js +4 -30
  692. package/dist/frontend/lowering/strict-mode.js.map +1 -1
  693. package/dist/frontend/lowering/structural-instances.d.ts +7 -0
  694. package/dist/frontend/lowering/structural-instances.js +23 -0
  695. package/dist/frontend/lowering/structural-instances.js.map +1 -1
  696. package/dist/frontend/lowering/surfaces.d.ts +42 -1
  697. package/dist/frontend/lowering/surfaces.js +212 -71
  698. package/dist/frontend/lowering/surfaces.js.map +1 -1
  699. package/dist/frontend/lowering/union-retag.d.ts +13 -1
  700. package/dist/frontend/lowering/union-retag.js +55 -1
  701. package/dist/frontend/lowering/union-retag.js.map +1 -1
  702. package/dist/frontend/lowering/union-retag.test.js +51 -0
  703. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  704. package/dist/frontend/lowering/unit-journal.d.ts +136 -17
  705. package/dist/frontend/lowering/unit-journal.js +324 -53
  706. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  707. package/dist/frontend/lowering/unit-journal.test.js +126 -3
  708. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  709. package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
  710. package/dist/frontend/lowering/unit-reuse.js +1008 -0
  711. package/dist/frontend/lowering/unit-reuse.js.map +1 -0
  712. package/dist/frontend/lowering/width-lift.d.ts +12 -0
  713. package/dist/frontend/lowering/zlib-constants.js +3 -2
  714. package/dist/frontend/lowering/zlib-constants.js.map +1 -1
  715. package/dist/frontend/npm-file-import.test.d.ts +1 -0
  716. package/dist/frontend/npm-file-import.test.js +76 -0
  717. package/dist/frontend/npm-file-import.test.js.map +1 -0
  718. package/dist/frontend/npm-static.js +95 -11
  719. package/dist/frontend/npm-static.js.map +1 -1
  720. package/dist/frontend/npm-static.test.js +95 -2
  721. package/dist/frontend/npm-static.test.js.map +1 -1
  722. package/dist/frontend/npm.d.ts +9 -0
  723. package/dist/frontend/npm.js +82 -0
  724. package/dist/frontend/npm.js.map +1 -1
  725. package/dist/frontend/pipeline-native.js +2 -1
  726. package/dist/frontend/pipeline-native.js.map +1 -1
  727. package/dist/frontend/pipeline.d.ts +9 -4
  728. package/dist/frontend/pipeline.js +162 -38
  729. package/dist/frontend/pipeline.js.map +1 -1
  730. package/dist/frontend/pipeline.test.js +68 -11
  731. package/dist/frontend/pipeline.test.js.map +1 -1
  732. package/dist/frontend/program-node.d.ts +3 -0
  733. package/dist/frontend/program-node.js +13 -6
  734. package/dist/frontend/program-node.js.map +1 -1
  735. package/dist/frontend/program.d.ts +71 -2
  736. package/dist/frontend/program.js +836 -411
  737. package/dist/frontend/program.js.map +1 -1
  738. package/dist/frontend/program.test.js +37 -1
  739. package/dist/frontend/program.test.js.map +1 -1
  740. package/dist/frontend/provenance-core.js +4 -0
  741. package/dist/frontend/provenance-core.js.map +1 -1
  742. package/dist/frontend/services-node.d.ts +7 -0
  743. package/dist/frontend/services-node.js +32 -1
  744. package/dist/frontend/services-node.js.map +1 -1
  745. package/dist/frontend/services-node.test.js +51 -0
  746. package/dist/frontend/services-node.test.js.map +1 -1
  747. package/dist/frontend/services.d.ts +14 -0
  748. package/dist/frontend/services.js +52 -2
  749. package/dist/frontend/services.js.map +1 -1
  750. package/dist/frontend/services.test.js +61 -1
  751. package/dist/frontend/services.test.js.map +1 -1
  752. package/dist/frontend/shape-inference/analyze.d.ts +5 -0
  753. package/dist/frontend/shape-inference/analyze.js +104 -4
  754. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  755. package/dist/frontend/shape-inference/domain.js +0 -1
  756. package/dist/frontend/shape-inference/domain.js.map +1 -1
  757. package/dist/frontend/shape-inference/index.js +5 -1
  758. package/dist/frontend/shape-inference/index.js.map +1 -1
  759. package/dist/frontend/shape-inference/memo.d.ts +2 -1
  760. package/dist/frontend/shape-inference/memo.js +6 -2
  761. package/dist/frontend/shape-inference/memo.js.map +1 -1
  762. package/dist/frontend/shape-inference/overlay.d.ts +1 -1
  763. package/dist/frontend/shape-inference/overlay.js +184 -4
  764. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  765. package/dist/frontend/shape-inference/static-objects.js +11 -6
  766. package/dist/frontend/shape-inference/static-objects.js.map +1 -1
  767. package/dist/frontend/source-phase-imports.test.d.ts +1 -0
  768. package/dist/frontend/source-phase-imports.test.js +37 -0
  769. package/dist/frontend/source-phase-imports.test.js.map +1 -0
  770. package/dist/frontend/tier-analysis.d.ts +9 -0
  771. package/dist/frontend/tier-analysis.js +1 -0
  772. package/dist/frontend/tier-analysis.js.map +1 -1
  773. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  774. package/dist/frontend/ts7/ast-node.js +12 -0
  775. package/dist/frontend/ts7/ast-node.js.map +1 -1
  776. package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
  777. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
  778. package/dist/frontend/ts7/ast-wire.js +3 -5
  779. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  780. package/dist/frontend/ts7/checker-backend.d.ts +13 -0
  781. package/dist/frontend/ts7/checker-backend.js +84 -2
  782. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  783. package/dist/frontend/ts7/checker-backend.test.js +126 -2
  784. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  785. package/dist/frontend/ts7/program-host.d.ts +22 -1
  786. package/dist/frontend/ts7/program-host.js +49 -4
  787. package/dist/frontend/ts7/program-host.js.map +1 -1
  788. package/dist/frontend/ts7/program-host.test.js +83 -0
  789. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  790. package/dist/frontend/ts7/rpc-process.d.ts +16 -1
  791. package/dist/frontend/ts7/rpc-process.js +170 -92
  792. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  793. package/dist/frontend/ts7/rpc-process.test.js +49 -21
  794. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  795. package/dist/frontend/tsc-codes.d.ts +57 -3
  796. package/dist/frontend/tsc-codes.js +956 -101
  797. package/dist/frontend/tsc-codes.js.map +1 -1
  798. package/dist/frontend/tsc-codes.test.js +221 -12
  799. package/dist/frontend/tsc-codes.test.js.map +1 -1
  800. package/dist/frontend/type-mapper.d.ts +98 -11
  801. package/dist/frontend/type-mapper.js +770 -182
  802. package/dist/frontend/type-mapper.js.map +1 -1
  803. package/dist/index.d.ts +1 -1
  804. package/dist/index.js +224 -15
  805. package/dist/index.js.map +1 -1
  806. package/dist/index.test.d.ts +1 -0
  807. package/dist/index.test.js +60 -0
  808. package/dist/index.test.js.map +1 -0
  809. package/dist/ir/api.d.ts +1 -1
  810. package/dist/ir/api.js +1 -1
  811. package/dist/ir/api.js.map +1 -1
  812. package/dist/ir/build.d.ts +3 -2
  813. package/dist/ir/build.js +4 -2
  814. package/dist/ir/build.js.map +1 -1
  815. package/dist/ir/builtin-effects.js +96 -0
  816. package/dist/ir/builtin-effects.js.map +1 -1
  817. package/dist/ir/builtin-signatures.d.ts +1 -1
  818. package/dist/ir/builtin-signatures.js +453 -26
  819. package/dist/ir/builtin-signatures.js.map +1 -1
  820. package/dist/ir/callback-specialization.d.ts +3 -2
  821. package/dist/ir/callback-specialization.js +35 -25
  822. package/dist/ir/callback-specialization.js.map +1 -1
  823. package/dist/ir/capture-values.d.ts +8 -4
  824. package/dist/ir/capture-values.js +9 -6
  825. package/dist/ir/capture-values.js.map +1 -1
  826. package/dist/ir/char-unit-locals.d.ts +6 -2
  827. package/dist/ir/char-unit-locals.js +11 -2
  828. package/dist/ir/char-unit-locals.js.map +1 -1
  829. package/dist/ir/class-key-index.d.ts +18 -0
  830. package/dist/ir/class-key-index.js +29 -0
  831. package/dist/ir/class-key-index.js.map +1 -0
  832. package/dist/ir/class-key-index.test.d.ts +1 -0
  833. package/dist/ir/class-key-index.test.js +25 -0
  834. package/dist/ir/class-key-index.test.js.map +1 -0
  835. package/dist/ir/codec.d.ts +82 -0
  836. package/dist/ir/codec.generated.d.ts +13 -0
  837. package/dist/ir/codec.generated.js +5350 -0
  838. package/dist/ir/codec.generated.js.map +1 -0
  839. package/dist/ir/codec.js +325 -0
  840. package/dist/ir/codec.js.map +1 -0
  841. package/dist/ir/codec.test.d.ts +1 -0
  842. package/dist/ir/codec.test.js +225 -0
  843. package/dist/ir/codec.test.js.map +1 -0
  844. package/dist/ir/constant-globals.d.ts +5 -2
  845. package/dist/ir/constant-globals.js +25 -27
  846. package/dist/ir/constant-globals.js.map +1 -1
  847. package/dist/ir/expression-inlining.d.ts +4 -2
  848. package/dist/ir/expression-inlining.js +8 -2
  849. package/dist/ir/expression-inlining.js.map +1 -1
  850. package/dist/ir/field-values.d.ts +5 -2
  851. package/dist/ir/field-values.js +32 -21
  852. package/dist/ir/field-values.js.map +1 -1
  853. package/dist/ir/fields.generated.d.ts +29 -10
  854. package/dist/ir/fields.generated.js +1039 -11
  855. package/dist/ir/fields.generated.js.map +1 -1
  856. package/dist/ir/fields.test.js +46 -2
  857. package/dist/ir/fields.test.js.map +1 -1
  858. package/dist/ir/final-fields.js +1 -1
  859. package/dist/ir/final-fields.js.map +1 -1
  860. package/dist/ir/function-references.d.ts +6 -4
  861. package/dist/ir/function-references.js +11 -4
  862. package/dist/ir/function-references.js.map +1 -1
  863. package/dist/ir/function-references.test.js +14 -0
  864. package/dist/ir/function-references.test.js.map +1 -1
  865. package/dist/ir/init-only-globals.d.ts +4 -2
  866. package/dist/ir/init-only-globals.js +17 -18
  867. package/dist/ir/init-only-globals.js.map +1 -1
  868. package/dist/ir/inline-array-sources.js +4 -1
  869. package/dist/ir/inline-array-sources.js.map +1 -1
  870. package/dist/ir/inline-array-views.d.ts +13 -0
  871. package/dist/ir/inline-array-views.js +945 -0
  872. package/dist/ir/inline-array-views.js.map +1 -0
  873. package/dist/ir/inline-arrays.d.ts +7 -0
  874. package/dist/ir/inline-arrays.js +190 -55
  875. package/dist/ir/inline-arrays.js.map +1 -1
  876. package/dist/ir/inline-arrays.test.js +140 -2
  877. package/dist/ir/inline-arrays.test.js.map +1 -1
  878. package/dist/ir/int32-slots.js +7 -0
  879. package/dist/ir/int32-slots.js.map +1 -1
  880. package/dist/ir/integer-ranges.js +16 -6
  881. package/dist/ir/integer-ranges.js.map +1 -1
  882. package/dist/ir/ir.d.ts +130 -44
  883. package/dist/ir/ir.js +7 -0
  884. package/dist/ir/ir.js.map +1 -1
  885. package/dist/ir/js-groups.d.ts +51 -0
  886. package/dist/ir/js-groups.js +394 -0
  887. package/dist/ir/js-groups.js.map +1 -0
  888. package/dist/ir/js-groups.test.d.ts +1 -0
  889. package/dist/ir/js-groups.test.js +555 -0
  890. package/dist/ir/js-groups.test.js.map +1 -0
  891. package/dist/ir/js-ic.d.ts +10 -9
  892. package/dist/ir/js-ic.js +58 -25
  893. package/dist/ir/js-ic.js.map +1 -1
  894. package/dist/ir/js-ic.test.js +37 -3
  895. package/dist/ir/js-ic.test.js.map +1 -1
  896. package/dist/ir/jsval.js +374 -63
  897. package/dist/ir/jsval.js.map +1 -1
  898. package/dist/ir/jsval.test.js +96 -2
  899. package/dist/ir/jsval.test.js.map +1 -1
  900. package/dist/ir/loop-entry-ranges.js +112 -9
  901. package/dist/ir/loop-entry-ranges.js.map +1 -1
  902. package/dist/ir/loop-entry-ranges.test.js +40 -0
  903. package/dist/ir/loop-entry-ranges.test.js.map +1 -1
  904. package/dist/ir/node-index.d.ts +23 -6
  905. package/dist/ir/node-index.js +126 -49
  906. package/dist/ir/node-index.js.map +1 -1
  907. package/dist/ir/numeric-call-specialization.d.ts +4 -2
  908. package/dist/ir/numeric-call-specialization.js +40 -26
  909. package/dist/ir/numeric-call-specialization.js.map +1 -1
  910. package/dist/ir/paired-while-loops.d.ts +4 -2
  911. package/dist/ir/paired-while-loops.js +8 -2
  912. package/dist/ir/paired-while-loops.js.map +1 -1
  913. package/dist/ir/parameter-versions.d.ts +13 -3
  914. package/dist/ir/parameter-versions.js +63 -40
  915. package/dist/ir/parameter-versions.js.map +1 -1
  916. package/dist/ir/property-bags.d.ts +4 -2
  917. package/dist/ir/property-bags.js +22 -17
  918. package/dist/ir/property-bags.js.map +1 -1
  919. package/dist/ir/receiver-readers.js +58 -2
  920. package/dist/ir/receiver-readers.js.map +1 -1
  921. package/dist/ir/row-pairs.d.ts +4 -2
  922. package/dist/ir/row-pairs.js +12 -11
  923. package/dist/ir/row-pairs.js.map +1 -1
  924. package/dist/ir/runtime-features.d.ts +139 -5
  925. package/dist/ir/runtime-features.js +397 -19
  926. package/dist/ir/runtime-features.js.map +1 -1
  927. package/dist/ir/runtime-features.test.js +135 -1
  928. package/dist/ir/runtime-features.test.js.map +1 -1
  929. package/dist/ir/runtime-jam-loops.d.ts +35 -0
  930. package/dist/ir/runtime-jam-loops.js +604 -0
  931. package/dist/ir/runtime-jam-loops.js.map +1 -0
  932. package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
  933. package/dist/ir/runtime-jam-loops.test.js +565 -0
  934. package/dist/ir/runtime-jam-loops.test.js.map +1 -0
  935. package/dist/ir/saturating-loop-jams.d.ts +11 -2
  936. package/dist/ir/saturating-loop-jams.js +56 -16
  937. package/dist/ir/saturating-loop-jams.js.map +1 -1
  938. package/dist/ir/saturating-loop-jams.test.js +39 -1
  939. package/dist/ir/saturating-loop-jams.test.js.map +1 -1
  940. package/dist/ir/scalar-records.d.ts +5 -2
  941. package/dist/ir/scalar-records.js +12 -2
  942. package/dist/ir/scalar-records.js.map +1 -1
  943. package/dist/ir/self-captures.d.ts +4 -2
  944. package/dist/ir/self-captures.js +40 -28
  945. package/dist/ir/self-captures.js.map +1 -1
  946. package/dist/ir/self-captures.test.js +15 -0
  947. package/dist/ir/self-captures.test.js.map +1 -1
  948. package/dist/ir/serialize.d.ts +8 -2
  949. package/dist/ir/serialize.js +92 -24
  950. package/dist/ir/serialize.js.map +1 -1
  951. package/dist/ir/serialize.test.js +26 -0
  952. package/dist/ir/serialize.test.js.map +1 -1
  953. package/dist/ir/tiers.js +1 -0
  954. package/dist/ir/tiers.js.map +1 -1
  955. package/dist/ir/traverse.js +4 -0
  956. package/dist/ir/traverse.js.map +1 -1
  957. package/dist/ir/typed-argument-clones.d.ts +30 -0
  958. package/dist/ir/typed-argument-clones.js +789 -0
  959. package/dist/ir/typed-argument-clones.js.map +1 -0
  960. package/dist/ir/union-arm-loops.d.ts +3 -0
  961. package/dist/ir/union-arm-loops.js +373 -0
  962. package/dist/ir/union-arm-loops.js.map +1 -0
  963. package/dist/ir/union-arm-loops.test.d.ts +1 -0
  964. package/dist/ir/union-arm-loops.test.js +230 -0
  965. package/dist/ir/union-arm-loops.test.js.map +1 -0
  966. package/dist/ir/validate.js +170 -22
  967. package/dist/ir/validate.js.map +1 -1
  968. package/dist/ir/validate.test.js +46 -0
  969. package/dist/ir/validate.test.js.map +1 -1
  970. package/dist/library/compiler-self-identity.d.ts +8 -2
  971. package/dist/library/compiler-self-identity.js +92 -18
  972. package/dist/library/compiler-self-identity.js.map +1 -1
  973. package/dist/library/compiler-self-identity.test.js +150 -3
  974. package/dist/library/compiler-self-identity.test.js.map +1 -1
  975. package/dist/library/int-infer.d.ts +5 -0
  976. package/dist/library/int-infer.js +15 -3
  977. package/dist/library/int-infer.js.map +1 -1
  978. package/dist/library/ir-policy.js +4 -0
  979. package/dist/library/ir-policy.js.map +1 -1
  980. package/dist/library/library-cache.d.ts +4 -0
  981. package/dist/library/library-cache.js +2 -0
  982. package/dist/library/library-cache.js.map +1 -1
  983. package/dist/library/library-cache.test.js +26 -0
  984. package/dist/library/library-cache.test.js.map +1 -1
  985. package/dist/library/prepare.js +99 -31
  986. package/dist/library/prepare.js.map +1 -1
  987. package/dist/native/cache.d.ts +7 -0
  988. package/dist/native/cache.js +49 -0
  989. package/dist/native/cache.js.map +1 -1
  990. package/dist/native/cache.test.js +13 -1
  991. package/dist/native/cache.test.js.map +1 -1
  992. package/dist/native/cli.js +2 -0
  993. package/dist/native/cli.js.map +1 -1
  994. package/dist/native/compiler.js +26 -5
  995. package/dist/native/compiler.js.map +1 -1
  996. package/dist/native/executable-cache-open.test.js +31 -5
  997. package/dist/native/executable-cache-open.test.js.map +1 -1
  998. package/dist/native/executable-cache.d.ts +6 -1
  999. package/dist/native/executable-cache.js +7 -1
  1000. package/dist/native/executable-cache.js.map +1 -1
  1001. package/dist/native/prepare.d.ts +3 -0
  1002. package/dist/native/prepare.js +74 -28
  1003. package/dist/native/prepare.js.map +1 -1
  1004. package/dist/native/prepare.test.js +25 -3
  1005. package/dist/native/prepare.test.js.map +1 -1
  1006. package/dist/native/sanitizer.js +63 -4
  1007. package/dist/native/sanitizer.js.map +1 -1
  1008. package/dist/native/sanitizer.test.js +93 -2
  1009. package/dist/native/sanitizer.test.js.map +1 -1
  1010. package/dist/native/toolchain.js +9 -2
  1011. package/dist/native/toolchain.js.map +1 -1
  1012. package/dist/node-islands/boundary.d.ts +37 -1
  1013. package/dist/node-islands/boundary.js +65 -7
  1014. package/dist/node-islands/boundary.js.map +1 -1
  1015. package/dist/node-islands/boundary.test.d.ts +1 -0
  1016. package/dist/node-islands/boundary.test.js +76 -0
  1017. package/dist/node-islands/boundary.test.js.map +1 -0
  1018. package/dist/node-islands/detect.d.ts +27 -1
  1019. package/dist/node-islands/detect.js +475 -40
  1020. package/dist/node-islands/detect.js.map +1 -1
  1021. package/dist/node-islands/detect.test.js +175 -4
  1022. package/dist/node-islands/detect.test.js.map +1 -1
  1023. package/dist/node-islands/effect-gate.js +30 -20
  1024. package/dist/node-islands/effect-gate.js.map +1 -1
  1025. package/dist/node-islands/effect-gate.test.js +4 -1
  1026. package/dist/node-islands/effect-gate.test.js.map +1 -1
  1027. package/dist/node-islands/graph-islands.d.ts +40 -0
  1028. package/dist/node-islands/graph-islands.js +128 -0
  1029. package/dist/node-islands/graph-islands.js.map +1 -0
  1030. package/dist/node-islands/growth.d.ts +57 -0
  1031. package/dist/node-islands/growth.js +205 -0
  1032. package/dist/node-islands/growth.js.map +1 -0
  1033. package/dist/node-islands/libnode.d.ts +1 -1
  1034. package/dist/node-islands/libnode.js +1 -1
  1035. package/dist/node-islands/libnode.js.map +1 -1
  1036. package/dist/node-islands/modules.d.ts +28 -0
  1037. package/dist/node-islands/modules.js +156 -0
  1038. package/dist/node-islands/modules.js.map +1 -1
  1039. package/dist/node-islands/modules.test.js +105 -1
  1040. package/dist/node-islands/modules.test.js.map +1 -1
  1041. package/dist/node-islands/policy.js +2 -3
  1042. package/dist/node-islands/policy.js.map +1 -1
  1043. package/dist/node-islands/probe-recorder.d.ts +1 -0
  1044. package/dist/node-islands/probe-recorder.js +596 -0
  1045. package/dist/node-islands/probe-recorder.js.map +1 -0
  1046. package/dist/node-islands/probe-recorder.test.d.ts +1 -0
  1047. package/dist/node-islands/probe-recorder.test.js +80 -0
  1048. package/dist/node-islands/probe-recorder.test.js.map +1 -0
  1049. package/dist/node-islands/report.d.ts +12 -0
  1050. package/dist/node-islands/report.js +28 -0
  1051. package/dist/node-islands/report.js.map +1 -1
  1052. package/dist/node-islands/report.test.js +4 -0
  1053. package/dist/node-islands/report.test.js.map +1 -1
  1054. package/dist/node-islands/rules.js +9 -0
  1055. package/dist/node-islands/rules.js.map +1 -1
  1056. package/dist/node-islands/scan.d.ts +16 -1
  1057. package/dist/node-islands/scan.js +110 -9
  1058. package/dist/node-islands/scan.js.map +1 -1
  1059. package/dist/node-islands/snapshot.d.ts +38 -1
  1060. package/dist/node-islands/snapshot.js +165 -161
  1061. package/dist/node-islands/snapshot.js.map +1 -1
  1062. package/dist/node-islands/snapshot.test.js +63 -2
  1063. package/dist/node-islands/snapshot.test.js.map +1 -1
  1064. package/dist/node-islands/summary.js +8 -0
  1065. package/dist/node-islands/summary.js.map +1 -1
  1066. package/dist/node-islands/type-strip.d.ts +11 -0
  1067. package/dist/node-islands/type-strip.js +157 -0
  1068. package/dist/node-islands/type-strip.js.map +1 -0
  1069. package/dist/node-islands/type-strip.test.d.ts +1 -0
  1070. package/dist/node-islands/type-strip.test.js +31 -0
  1071. package/dist/node-islands/type-strip.test.js.map +1 -0
  1072. package/dist/project-config.d.ts +4 -0
  1073. package/dist/project-config.js +19 -0
  1074. package/dist/project-config.js.map +1 -1
  1075. package/dist/project-config.test.js +10 -0
  1076. package/dist/project-config.test.js.map +1 -1
  1077. package/dist/wasm/translate.js +11 -5
  1078. package/dist/wasm/translate.js.map +1 -1
  1079. package/dist/wasm/translate.test.js +35 -0
  1080. package/dist/wasm/translate.test.js.map +1 -1
  1081. package/package.json +20 -20
  1082. package/surface-manifest.json +221 -122
@@ -10,11 +10,12 @@ import { isJsSourceFile, locOf } from "../../program.js";
10
10
  import { buildArraySortFn, buildSortKeyFn, closureKeyOrder, sortKeysId, sortKeysOrder, } from "../lower-array-sort.js";
11
11
  import { arrayIndexPresent, arraySlotSnapshot, arraySnapshotAppend, arraySnapshotValue, arrayValueRead, arrayValueStore, arrayValueType, currentArrayIndexPresent, elementMayBeForeign, foreignElementThrow, primitiveElement, slotSnapshotLocals, unreadArgument, } from "../array-values.js";
12
12
  import { typeKey } from "../../type-mapper.js";
13
- import { lowerArrayCallback, requireProducedArrayElement, callbackArrayElement, truthyFilterCallback, } from "./callback-arguments.js";
13
+ import { lowerArrayCallback, requireProducedArrayElement, unitOnlyArrayElement, callbackArrayElement, truthyFilterCallback, } from "./callback-arguments.js";
14
14
  import { reverseArrayLoop, arrayLengthDeclaration, arrayCallbackParams, arrayCallbackLocals, callArrayCallback, } from "./array-iteration.js";
15
15
  import { dynamicReceiverThrows } from "./dynamic-receivers.js";
16
16
  import { defaultAfterUndefined, lowerStaticallyUndefinedArgument } from "../optional-arguments.js";
17
- import { checkedFilterNarrowing } from "./filter-predicates.js";
17
+ import { checkedFilterNarrowing, supersetGuardFields } from "./filter-predicates.js";
18
+ import { omittableTrailingParam } from "../coercions/function-adapters.js";
18
19
  /** `a.map(fn)` / `a.filter(fn)` / `a.forEach(fn)` desugar to a direct
19
20
  * call of a synthetic module function — one per method + element/result
20
21
  * type + callback-arity combination, interned — whose body is a plain
@@ -37,6 +38,7 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
37
38
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(argNode) ?? undefined);
38
39
  const present = !booleanFilter && presentElements(lowerer, call, elem);
39
40
  const valueT = callbackValueType(lowerer, elem, present);
41
+ const thisArg = hofThisArg(lowerer, call);
40
42
  if (booleanFilter) {
41
43
  if (valueT.kind === "union")
42
44
  lowerer.requireTruthyUnion(valueT.unionId, argNode);
@@ -48,7 +50,7 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
48
50
  }
49
51
  const callback = booleanFilter
50
52
  ? { fnArg: truthyFilterCallback(lowerer, valueT, loc), arity: 1, unread: false }
51
- : lowerArrayCallback(lowerer, argNode, [valueT], arrayOf(elem));
53
+ : lowerArrayCallback(lowerer, argNode, [valueT], arrayOf(elem), false, method === "map" ? (unitOnlyArrayElement(lowerer, call) ?? undefined) : undefined);
52
54
  const { fnArg, arity } = callback;
53
55
  // Only an array that can hold elements outside its element type needs to
54
56
  // leave an element its callback ignores unread.
@@ -81,15 +83,19 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
81
83
  const outElem = filtered !== null ? filtered.elem : callbackArrayElement(lowerer, call, fnRet);
82
84
  // A filter that re-tags its elements keeps the single union-typed visit.
83
85
  // A callback that never reads its element has no use for a typed one.
84
- const fast = present || booleanFilter || unread || (method === "filter" && !typeEquals(outElem, elem))
86
+ const fast = present ||
87
+ booleanFilter ||
88
+ unread ||
89
+ thisArg !== null ||
90
+ (method === "filter" && !typeEquals(outElem, elem))
85
91
  ? null
86
92
  : lowerFastCallback(lowerer, argNode, [valueT], 0, elem, arrayOf(elem), callback);
87
- const helper = arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
93
+ const helper = arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
88
94
  const resultType = method === "map" || method === "filter" ? arrayOf(outElem) : VOID;
89
95
  const result = {
90
96
  kind: "call",
91
97
  callee: helper,
92
- args: [receiver, fnArg, ...(fast ? [fast] : [])],
98
+ args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
93
99
  type: resultType,
94
100
  loc,
95
101
  };
@@ -104,6 +110,20 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
104
110
  loc,
105
111
  };
106
112
  }
113
+ /** The thisArg of a callback HOF call (`a.map(f, thisArg)`), lowered as the
114
+ * checked-dynamic value the helper hands the callback as its call-site
115
+ * receiver. Null when the call has no second argument, in which case the
116
+ * helper keeps the two-slot frame and the callback's `this` is the ambient
117
+ * one, exactly as before. */
118
+ function hofThisArg(lowerer, call) {
119
+ const node = call.arguments.nodes[1];
120
+ if (node === undefined)
121
+ return null;
122
+ if (call.arguments.nodes.length > 2) {
123
+ lowerer.noLowering(`.${ts.isPropertyAccessExpression(call.expression) ? call.expression.name.text : ""} with ${call.arguments.nodes.length} arguments`, call, "the supported form takes the callback and an optional thisArg");
124
+ }
125
+ return lowerer.lowerExprExpecting(node, DYN);
126
+ }
107
127
  /** The element a filter keeps, and the checked conversion of the result
108
128
  * to the checker's narrower element when the predicate does not prove it.
109
129
  * An inferred inline type predicate proves one source arm, or a class
@@ -158,6 +178,18 @@ function filterKeptElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
158
178
  const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
159
179
  "(the checker then skips the predicate) or annotate the result with the receiver's own " +
160
180
  "element type — and narrow the elements after";
181
+ // A record target that declares fields the receiver's record element has no
182
+ // slot for: the elements were narrowed when they were stored, so those
183
+ // fields no longer exist at runtime and no per-field check can recover them.
184
+ const widened = supersetGuardFields(lowerer, elem, outElem);
185
+ const missingFields = widened === null
186
+ ? ""
187
+ : ` (the receiver's element type has no slot for ${widened
188
+ .slice(0, 4)
189
+ .map((field) => `'${field}'`)
190
+ .join(", ")}${widened.length > 4 ? ` and ${widened.length - 4} more` : ""} — each ` +
191
+ `element was narrowed when it was stored, so those fields do not exist at runtime and ` +
192
+ `the predicate cannot make them real)`;
161
193
  const written = !booleanFilter &&
162
194
  ((!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) ||
163
195
  argNode.type !== undefined);
@@ -170,10 +202,10 @@ function filterKeptElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
170
202
  return helper;
171
203
  if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
172
204
  lowerer.unsupported("SC1090", argNode, `narrowing '.filter' to '${lowerer.fmt(outElem)}' through a callback VALUE (no checked ` +
173
- `conversion from '${lowerer.fmt(elem)}' — ${annotateEscape})`);
205
+ `conversion from '${lowerer.fmt(elem)}'${missingFields} — ${annotateEscape})`);
174
206
  }
175
207
  lowerer.unsupported("SC1090", argNode, `narrowing '.filter' to '${lowerer.fmt(outElem)}' with a hand-written type predicate (no ` +
176
- `checked conversion from '${lowerer.fmt(elem)}' — ${annotateEscape})`);
208
+ `checked conversion from '${lowerer.fmt(elem)}'${missingFields} — ${annotateEscape})`);
177
209
  }
178
210
  const classRefinement = !booleanFilter && outElem.kind === "object" && canAssertClassValue(lowerer, valueT, outElem);
179
211
  if (!classRefinement &&
@@ -439,8 +471,8 @@ const FILTER_SNAPSHOT = { isForeign: "vf.0", value: "v.0", foreign: "vd.0" };
439
471
  * combo. Named `%arr.<method>.<n>` ('%' keeps it out of the user
440
472
  * namespace); rides `liftedFns` into the module like a lifted lambda (it
441
473
  * is a plain function — no captures). */
442
- function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRet, site = "", fastT = null, present = false, unread = false) {
443
- const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}:${typeKey(outElem)}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
474
+ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRet, site = "", fastT = null, present = false, unread = false, withThis = false) {
475
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}:${typeKey(outElem)}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
444
476
  const existing = lowerer.arrHofHelpers.get(key);
445
477
  if (existing)
446
478
  return existing;
@@ -456,7 +488,7 @@ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRe
456
488
  split: !!fastT,
457
489
  unread,
458
490
  });
459
- const fn = buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT, present, unread);
491
+ const fn = buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT, present, unread, withThis);
460
492
  lowerer.liftedFns.push(fastT ? withFastCallback(fn, fastT, elem) : fn);
461
493
  return name;
462
494
  }
@@ -465,10 +497,17 @@ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRe
465
497
  * original concrete array arm — never a copied `(T | U)[]` — and an
466
498
  * arm-specific function adapter wraps the element and receiver arguments
467
499
  * into the union-wide callback ABI. That preserves sparse-array reads,
468
- * callback mutation, and the callback's third-argument identity. */
500
+ * callback mutation, and the callback's third-argument identity.
501
+ *
502
+ * `filter` joins them: the kept elements are the checker's result element
503
+ * (`(b): b is TextContent` over `(TextContent | ImageContent)[] |
504
+ * (ThinkingContent | TextContent)[]` answers `TextContent[]`), so each arm
505
+ * filters its own array and converts its survivors through the checked
506
+ * narrowing — a predicate that kept an element it does not describe throws
507
+ * the TypeError. An arm with no such conversion leaves the fence in place. */
469
508
  export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
470
509
  const method = access.name.text;
471
- if (method !== "map" && method !== "forEach")
510
+ if (method !== "map" && method !== "forEach" && method !== "filter")
472
511
  return null;
473
512
  if (!lowerer.isStdlibMember(access))
474
513
  return null;
@@ -504,7 +543,7 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
504
543
  ? valueArms[0]
505
544
  : { kind: "union", unionId: lowerer.unions.intern(valueArms) };
506
545
  const argNode = call.arguments.nodes[0];
507
- const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [valueT], receiverT);
546
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [valueT], receiverT, false, method === "map" ? (unitOnlyArrayElement(lowerer, call) ?? undefined) : undefined);
508
547
  const fnRet = fnArg.type.ret;
509
548
  if (method === "map" && fnRet.kind === "void") {
510
549
  // `void[]` has no element (see the plain-receiver map path).
@@ -512,14 +551,50 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
512
551
  }
513
552
  if (method === "map")
514
553
  requireProducedArrayElement(lowerer, call, "'.map()'", fnRet);
515
- const outElem = method === "map" ? callbackArrayElement(lowerer, call, fnRet) : VOID;
516
- const resultT = method === "map" ? arrayOf(outElem) : VOID;
554
+ if (method === "filter" && !filterPredicateOk(lowerer, fnRet)) {
555
+ if (fnRet.kind === "void") {
556
+ lowerer.unsupported("SC1090", call, "'.filter()' with a void-returning predicate (the callback return value is erased before its truthiness can be tested)");
557
+ }
558
+ lowerer.badType(call, lowerer.typeOf(call));
559
+ }
560
+ // `map` stores the callback's answer; `filter` keeps the elements its
561
+ // predicate named. The kept element is the CHECKER's result element, which
562
+ // for a written type predicate is narrower than every arm's own:
563
+ // `(b): b is TextContent` over `(TextContent | ImageContent)[] |
564
+ // (ThinkingContent | TextContent)[]` answers `TextContent[]`. Each arm
565
+ // filters its own concrete array and converts its survivors to that
566
+ // element through the checked narrowing — a predicate that kept an element
567
+ // it does not describe throws instead of misreading it. No conversion the
568
+ // arms cannot make honestly means the fence stays.
569
+ let outElem = VOID;
570
+ const narrowing = [];
571
+ if (method === "map") {
572
+ outElem = callbackArrayElement(lowerer, call, fnRet);
573
+ }
574
+ else if (method === "filter") {
575
+ const result = lowerer.mapTypeOf(lowerer.typeOf(call));
576
+ if (!result || result.kind !== "array")
577
+ return null;
578
+ outElem = result.elem;
579
+ const typeText = filterTypeText(lowerer, call);
580
+ for (const array of arrays) {
581
+ if (typeEquals(array.elem, outElem)) {
582
+ narrowing.push(null);
583
+ continue;
584
+ }
585
+ const helper = checkedFilterNarrowing(lowerer, array.elem, outElem, typeText, locOf(call));
586
+ if (helper === null)
587
+ return null;
588
+ narrowing.push(helper);
589
+ }
590
+ }
591
+ const resultT = method === "forEach" ? VOID : arrayOf(outElem);
517
592
  for (const array of arrays) {
518
593
  const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
519
594
  if (!lowerer.cleanFuncAdaptable(fnArg.type, armFnT))
520
595
  return null;
521
596
  }
522
- const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, locOf(call));
597
+ const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, narrowing, locOf(call));
523
598
  return {
524
599
  kind: "call",
525
600
  callee: helper,
@@ -531,9 +606,14 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
531
606
  loc: locOf(call),
532
607
  };
533
608
  }
534
- function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, loc) {
535
- const resultT = method === "map" ? arrayOf(outElem) : VOID;
536
- const key = `union:${method}:${receiverT.unionId}:${typeKey(callbackT)}:${typeKey(resultT)}`;
609
+ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, narrowing, loc) {
610
+ const resultT = method === "forEach" ? VOID : arrayOf(outElem);
611
+ // A filter's per-arm conversions are part of what the helper does, so two
612
+ // sites that share receiver, callback and result but convert differently
613
+ // keep their own helper. `map`/`forEach` never narrow, and leaving their
614
+ // key untouched keeps the helpers a program already emitted byte-identical.
615
+ const narrowingKey = method === "filter" ? `:${narrowing.map((helper) => helper ?? "").join(",")}` : "";
616
+ const key = `union:${method}:${receiverT.unionId}:${typeKey(callbackT)}:${typeKey(resultT)}${narrowingKey}`;
537
617
  const existing = lowerer.arrHofHelpers.get(key);
538
618
  if (existing)
539
619
  return existing;
@@ -541,7 +621,7 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
541
621
  lowerer.arrHofHelpers.set(key, name);
542
622
  const receiver = varRef("a.0", receiverT, loc);
543
623
  const callback = varRef("f.0", callbackT, loc);
544
- const branch = (array) => {
624
+ const branch = (array, index) => {
545
625
  const tag = lowerer.armTag(receiverT.unionId, array);
546
626
  const concrete = {
547
627
  kind: "unionNarrow",
@@ -556,16 +636,29 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
556
636
  if (!typeEquals(adapted.type, armFnT)) {
557
637
  throw new InternalCompilerError("lowerer bug: union-array callback stopped adapting");
558
638
  }
559
- const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, outElem);
560
- const invoke = { kind: "call", callee, args: [concrete, adapted], type: resultT, loc };
639
+ const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, method === "filter" ? array.elem : outElem);
640
+ const invoke = {
641
+ kind: "call",
642
+ callee,
643
+ args: [concrete, adapted],
644
+ type: method === "filter" ? arrayOf(array.elem) : resultT,
645
+ loc,
646
+ };
647
+ // Survivors of this arm's own array, converted to the checker's result
648
+ // element. The helper throws for a kept element the predicate does not
649
+ // describe, so a lying predicate never reinterprets a value.
650
+ const armNarrow = narrowing[index] ?? null;
651
+ const answer = armNarrow === null
652
+ ? invoke
653
+ : { kind: "call", callee: armNarrow, args: [invoke], type: resultT, loc };
561
654
  return resultT.kind === "void"
562
655
  ? [
563
656
  { kind: "exprStmt", expr: invoke, loc },
564
657
  { kind: "return", value: null, loc },
565
658
  ]
566
- : [{ kind: "return", value: invoke, loc }];
659
+ : [{ kind: "return", value: answer, loc }];
567
660
  };
568
- let body = branch(arrays[arrays.length - 1]);
661
+ let body = branch(arrays[arrays.length - 1], arrays.length - 1);
569
662
  for (let i = arrays.length - 2; i >= 0; i--) {
570
663
  const array = arrays[i];
571
664
  body = [
@@ -580,7 +673,7 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
580
673
  type: BOOL,
581
674
  loc,
582
675
  },
583
- then: branch(array),
676
+ then: branch(array, i),
584
677
  else_: body,
585
678
  loc,
586
679
  },
@@ -632,13 +725,13 @@ function filterRetainedValue(lowerer, v, elem, outElem, loc) {
632
725
  * `arity` is the callback's declared parameter count (1–3): the loop
633
726
  * passes the index and the receiver itself after the element when the
634
727
  * callback names them, exactly the arguments JS supplies. */
635
- function buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT = null, present = false, unread = false) {
728
+ function buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT = null, present = false, unread = false, withThis = false) {
636
729
  const arrT = arrayOf(elem);
637
730
  const valueT = callbackValueType(lowerer, elem, present);
638
731
  const fnT = funcOf([valueT, F64, arrT].slice(0, arity), fnRet);
639
- const locals = arrayCallbackLocals(arrT, fnT);
640
- const params = arrayCallbackParams(arrT, fnT);
641
- const callF = (arg) => callArrayCallback(arrT, fnT, fnRet, arity, arg, loc);
732
+ const locals = arrayCallbackLocals(arrT, fnT, withThis);
733
+ const params = arrayCallbackParams(arrT, fnT, withThis);
734
+ const callF = (arg) => callArrayCallback(arrT, fnT, fnRet, arity, arg, loc, withThis);
642
735
  const getElem = callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc);
643
736
  // What the callback takes: the element, or a placeholder for one it
644
737
  // ignores (callbackValueRead's `unread`).
@@ -907,6 +1000,7 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
907
1000
  const argNode = call.arguments.nodes[0];
908
1001
  if (!argNode)
909
1002
  lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
1003
+ const thisArg = hofThisArg(lowerer, call);
910
1004
  // find's result must be reachable from the element itself; a predicate
911
1005
  // that narrows to another layout keeps the optional element visit.
912
1006
  const present = presentElements(lowerer, call, elem) &&
@@ -930,17 +1024,17 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
930
1024
  method === "every" ||
931
1025
  method === "findIndex" ||
932
1026
  method === "findLastIndex") {
933
- const fast = present || unread
1027
+ const fast = present || unread || thisArg !== null
934
1028
  ? null
935
1029
  : lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, { fnArg, arity }, bindUntyped);
936
1030
  const fastT = fast?.type ?? null;
937
1031
  const helper = method === "findIndex" || method === "findLastIndex"
938
- ? findIndexHelper(lowerer, elem, fnRet, arity, last, loc, callbackSite(fast ?? fnArg), fastT, present, unread)
939
- : someEveryHelper(lowerer, method, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fastT, present, unread);
1032
+ ? findIndexHelper(lowerer, elem, fnRet, arity, last, loc, callbackSite(fast ?? fnArg), fastT, present, unread, thisArg !== null)
1033
+ : someEveryHelper(lowerer, method, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fastT, present, unread, thisArg !== null);
940
1034
  return {
941
1035
  kind: "call",
942
1036
  callee: helper,
943
- args: [receiver, fnArg, ...(fast ? [fast] : [])],
1037
+ args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
944
1038
  type: method === "findIndex" || method === "findLastIndex" ? F64 : BOOL,
945
1039
  loc,
946
1040
  };
@@ -962,8 +1056,14 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
962
1056
  if (undefTag < 0)
963
1057
  lowerer.badType(call, lowerer.typeOf(call));
964
1058
  const retag = findResultRetag(lowerer, call, argNode, method, valueT, resultT, unchangedElement);
965
- const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, callbackSite(fnArg), present, unread);
966
- return { kind: "call", callee: helper, args: [receiver, fnArg], type: resultT, loc };
1059
+ const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, callbackSite(fnArg), present, unread, thisArg !== null);
1060
+ return {
1061
+ kind: "call",
1062
+ callee: helper,
1063
+ args: [receiver, fnArg, ...(thisArg ? [thisArg] : [])],
1064
+ type: resultT,
1065
+ loc,
1066
+ };
967
1067
  }
968
1068
  /** The retag helper that converts a found element into find's result union,
969
1069
  * or null when the element converts directly. Only an inline callback with
@@ -1017,9 +1117,9 @@ export function predicateToBoolean(e) {
1017
1117
  * for (i = 0; i < n; i++) { v = a[i]; if (f(v)) return <v as result arm>; }
1018
1118
  * return <undefined arm>;
1019
1119
  */
1020
- function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, site = "", present = false, unread = false) {
1120
+ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, site = "", present = false, unread = false, withThis = false) {
1021
1121
  const method = last ? "findLast" : "find";
1022
- const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}${site}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
1122
+ const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}${site}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
1023
1123
  const existing = lowerer.arrHofHelpers.get(key);
1024
1124
  if (existing)
1025
1125
  return existing;
@@ -1056,7 +1156,7 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
1056
1156
  ...arraySlotSnapshot(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, FILTER_SNAPSHOT, loc),
1057
1157
  {
1058
1158
  kind: "if",
1059
- cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, placeholder ?? v, loc)),
1159
+ cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, placeholder ?? v, loc, withThis)),
1060
1160
  then: [
1061
1161
  {
1062
1162
  kind: "return",
@@ -1072,7 +1172,7 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
1072
1172
  read,
1073
1173
  {
1074
1174
  kind: "if",
1075
- cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, v, loc)),
1175
+ cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, v, loc, withThis)),
1076
1176
  then: [{ kind: "return", value: found, loc }],
1077
1177
  else_: null,
1078
1178
  loc,
@@ -1089,10 +1189,10 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
1089
1189
  ];
1090
1190
  lowerer.liftedFns.push({
1091
1191
  name,
1092
- params: arrayCallbackParams(arrT, fnT),
1192
+ params: arrayCallbackParams(arrT, fnT, withThis),
1093
1193
  returnType: resultT,
1094
1194
  locals: [
1095
- ...arrayCallbackLocals(arrT, fnT),
1195
+ ...arrayCallbackLocals(arrT, fnT, withThis),
1096
1196
  { id: "v.0", name: "v", type: valueT, mutable: false },
1097
1197
  ...(ignored
1098
1198
  ? slotSnapshotLocals(lowerer, elem, FILTER_SNAPSHOT).filter((l) => l.id !== "v.0")
@@ -1120,9 +1220,9 @@ function findFoundValue(lowerer, v, resultT, retag, loc) {
1120
1220
  *
1121
1221
  * n = a.length; for (...) if (f(a[i], i, a)) return i; return -1;
1122
1222
  */
1123
- function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fastT = null, present = false, unread = false) {
1223
+ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
1124
1224
  const method = last ? "findLastIndex" : "findIndex";
1125
- const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
1225
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
1126
1226
  const existing = lowerer.arrHofHelpers.get(key);
1127
1227
  if (existing)
1128
1228
  return existing;
@@ -1144,7 +1244,7 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
1144
1244
  const visit = [
1145
1245
  {
1146
1246
  kind: "if",
1147
- cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc)),
1247
+ cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis)),
1148
1248
  then: [{ kind: "return", value: varRef("i.0", F64, loc), loc }],
1149
1249
  else_: null,
1150
1250
  loc,
@@ -1160,9 +1260,9 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
1160
1260
  ];
1161
1261
  lowerer.liftedFns.push(withFastCallback({
1162
1262
  name,
1163
- params: arrayCallbackParams(arrT, fnT),
1263
+ params: arrayCallbackParams(arrT, fnT, withThis),
1164
1264
  returnType: F64,
1165
- locals: [...arrayCallbackLocals(arrT, fnT)],
1265
+ locals: [...arrayCallbackLocals(arrT, fnT, withThis)],
1166
1266
  body,
1167
1267
  loc,
1168
1268
  }, fastT, elem));
@@ -1173,8 +1273,8 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
1173
1273
  * some: n = a.length; for (...) if (f(a[i])) return true; return false;
1174
1274
  * every: n = a.length; for (...) if (!f(a[i])) return false; return true;
1175
1275
  */
1176
- function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false) {
1177
- const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
1276
+ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
1277
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
1178
1278
  const existing = lowerer.arrHofHelpers.get(key);
1179
1279
  if (existing)
1180
1280
  return existing;
@@ -1192,7 +1292,7 @@ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fa
1192
1292
  });
1193
1293
  const arrT = arrayOf(elem);
1194
1294
  const fnT = funcOf([callbackValueType(lowerer, elem, present), F64, arrT].slice(0, arity), fnRet);
1195
- const callF = predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc));
1295
+ const callF = predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis));
1196
1296
  const body = [
1197
1297
  arrayLengthDeclaration(arrT, loc),
1198
1298
  countedFor(loc, varRef("n.0", F64, loc), () => [
@@ -1218,9 +1318,9 @@ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fa
1218
1318
  ];
1219
1319
  lowerer.liftedFns.push(withFastCallback({
1220
1320
  name,
1221
- params: arrayCallbackParams(arrT, fnT),
1321
+ params: arrayCallbackParams(arrT, fnT, withThis),
1222
1322
  returnType: BOOL,
1223
- locals: [...arrayCallbackLocals(arrT, fnT)],
1323
+ locals: [...arrayCallbackLocals(arrT, fnT, withThis)],
1224
1324
  body,
1225
1325
  loc,
1226
1326
  }, fastT, elem));
@@ -1239,6 +1339,7 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
1239
1339
  const argNode = call.arguments.nodes[0];
1240
1340
  if (!argNode)
1241
1341
  lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
1342
+ const thisArg = hofThisArg(lowerer, call);
1242
1343
  const present = presentElements(lowerer, call, elem);
1243
1344
  const lowered = lowerArrayCallback(lowerer, argNode, [callbackValueType(lowerer, elem, present)], arrT);
1244
1345
  const { fnArg, arity } = lowered;
@@ -1253,7 +1354,7 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
1253
1354
  recv: { kind: "dynFrom", value: receiver, liveRef: true, type: DYN, loc },
1254
1355
  method: "flatMap",
1255
1356
  calleeName: ts.getTextOfNode(access),
1256
- args: [{ kind: "dynFrom", value: fnArg, type: DYN, loc }],
1357
+ args: [{ kind: "dynFrom", value: fnArg, type: DYN, loc }, ...(thisArg ? [thisArg] : [])],
1257
1358
  type: DYN,
1258
1359
  loc,
1259
1360
  };
@@ -1264,11 +1365,11 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
1264
1365
  ? flatMapUnionPlan(lowerer, call, argNode, fnRet)
1265
1366
  : null;
1266
1367
  if (plan) {
1267
- const helper = flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present);
1368
+ const helper = flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present, thisArg !== null);
1268
1369
  return {
1269
1370
  kind: "call",
1270
1371
  callee: helper,
1271
- args: [receiver, fnArg],
1372
+ args: [receiver, fnArg, ...(thisArg ? [thisArg] : [])],
1272
1373
  type: arrayOf(plan.outElem),
1273
1374
  loc,
1274
1375
  };
@@ -1284,32 +1385,32 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
1284
1385
  lowerer.badType(call, lowerer.typeOf(call));
1285
1386
  requireProducedArrayElement(lowerer, call, "'.flatMap()'", fnRet);
1286
1387
  const outElem = callbackArrayElement(lowerer, call, fnRet);
1287
- const fast = present || unread
1388
+ const fast = present || unread || thisArg !== null
1288
1389
  ? null
1289
1390
  : lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, {
1290
1391
  fnArg,
1291
1392
  arity,
1292
1393
  });
1293
- const helper = arrayHofHelper(lowerer, "flatMap", elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
1394
+ const helper = arrayHofHelper(lowerer, "flatMap", elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
1294
1395
  return {
1295
1396
  kind: "call",
1296
1397
  callee: helper,
1297
- args: [receiver, fnArg, ...(fast ? [fast] : [])],
1398
+ args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
1298
1399
  type: arrayOf(outElem),
1299
1400
  loc,
1300
1401
  };
1301
1402
  }
1302
- const fast = present || unread
1403
+ const fast = present || unread || thisArg !== null
1303
1404
  ? null
1304
1405
  : lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, {
1305
1406
  fnArg,
1306
1407
  arity,
1307
1408
  });
1308
- const helper = flatMapHelper(lowerer, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
1409
+ const helper = flatMapHelper(lowerer, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
1309
1410
  return {
1310
1411
  kind: "call",
1311
1412
  callee: helper,
1312
- args: [receiver, fnArg, ...(fast ? [fast] : [])],
1413
+ args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
1313
1414
  type: fnRet,
1314
1415
  loc,
1315
1416
  };
@@ -1326,16 +1427,19 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
1326
1427
  const arms = lowerer.unions.get(fnRet.unionId)?.arms;
1327
1428
  if (!arms)
1328
1429
  return null;
1329
- // The `never[]` constituents of the callback's checked result.
1430
+ // The constituents of the callback's checked result that can hold no
1431
+ // element: a `never[]` arm, and the empty tuple a bare `[]` arm infers
1432
+ // when the enclosing call has a contextual array type (`return x ? [a]
1433
+ // : []` in a `f(): T[]`).
1330
1434
  const emptyArms = [];
1331
1435
  const signature = lowerer.checker.getCallSignatures(lowerer.typeOf(argNode))[0];
1332
1436
  if (signature) {
1333
1437
  const ret = lowerer.checker.getReturnTypeOfSignature(signature);
1334
1438
  for (const part of ret.isUnionType() ? ts.constituentTypes(ret) : [ret]) {
1335
- if (!lowerer.checker.isArrayType(part))
1439
+ if (!lowerer.checker.isArrayType(part) && !lowerer.checker.isTupleType(part))
1336
1440
  continue;
1337
- const [element] = lowerer.checker.getTypeArguments(part);
1338
- if (element === undefined || (element.flags & ts.TypeFlags.Never) === 0)
1441
+ const element = lowerer.checker.getTypeArguments(part)[0];
1442
+ if (element !== undefined && (element.flags & ts.TypeFlags.Never) === 0)
1339
1443
  continue;
1340
1444
  const mapped = lowerer.mapTypeOf(part);
1341
1445
  if (mapped)
@@ -1352,6 +1456,7 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
1352
1456
  return false;
1353
1457
  return lowerer.armTag(outElem.unionId, t) >= 0;
1354
1458
  };
1459
+ const tupleConverts = (arm) => (lowerer.shapes.get(arm.shapeId)?.fields ?? []).every((f) => converts(f.type));
1355
1460
  const plan = [];
1356
1461
  for (const arm of arms) {
1357
1462
  if (arm.kind === "array" && emptyArms.some((e) => typeEquals(e, arm)))
@@ -1360,6 +1465,11 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
1360
1465
  // undefined included, so its element type is the result's.
1361
1466
  else if (arm.kind === "array" && typeEquals(arm.elem, outElem))
1362
1467
  plan.push("spread");
1468
+ // A contextual array type makes a multi-statement body's `[pair]`
1469
+ // infer as a one-element TUPLE (`return x ? [pair] : []`), whose
1470
+ // fields contribute in order.
1471
+ else if (arm.kind === "record" && lowerer.shapes.get(arm.shapeId)?.tuple && tupleConverts(arm))
1472
+ plan.push("tuple");
1363
1473
  else if (arm.kind !== "array" && converts(arm))
1364
1474
  plan.push("value");
1365
1475
  else
@@ -1370,10 +1480,10 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
1370
1480
  /** The flatMap loop over a union-returning callback: each result tests
1371
1481
  * its arm and appends its elements, nothing, or itself (Node's
1372
1482
  * IsArray decision per value). */
1373
- function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1483
+ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present, withThis = false) {
1374
1484
  // The plan is part of the key: one union result type can carry an empty
1375
1485
  // `never[]` arm in one callback and a populated array arm in another.
1376
- const key = `flatMapUnion:${typeKey(elem)}:${typeKey(fnRet)}:${typeKey(plan.outElem)}:${plan.arms.join(",")}:${arity}${present ? ":present" : ""}`;
1486
+ const key = `flatMapUnion:${typeKey(elem)}:${typeKey(fnRet)}:${typeKey(plan.outElem)}:${plan.arms.join(",")}:${arity}${present ? ":present" : ""}${withThis ? ":this" : ""}`;
1377
1487
  const existing = lowerer.arrHofHelpers.get(key);
1378
1488
  if (existing)
1379
1489
  return existing;
@@ -1394,7 +1504,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1394
1504
  loc,
1395
1505
  });
1396
1506
  const locals = [
1397
- ...arrayCallbackLocals(arrT, fnT),
1507
+ ...arrayCallbackLocals(arrT, fnT, withThis),
1398
1508
  { id: "out.0", name: "out", type: outT, mutable: false },
1399
1509
  { id: "r.0", name: "r", type: fnRet, mutable: false },
1400
1510
  ];
@@ -1410,6 +1520,23 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1410
1520
  };
1411
1521
  if (plan.arms[tag] === "empty")
1412
1522
  return [];
1523
+ if (plan.arms[tag] === "tuple") {
1524
+ const tuple = arm;
1525
+ // The fields are stored by name ("0", "1", "10", "2", …): the
1526
+ // elements append in index order.
1527
+ const elements = [...(lowerer.shapes.get(tuple.shapeId)?.fields ?? [])].sort((a, b) => Number(a.name) - Number(b.name));
1528
+ return elements.map((field) => {
1529
+ const read = {
1530
+ kind: "recordGet",
1531
+ obj: narrowed,
1532
+ shapeId: tuple.shapeId,
1533
+ field: field.name,
1534
+ type: field.type,
1535
+ loc,
1536
+ };
1537
+ return arrayValueStore(lowerer, outRef(), outLength(), lowerer.coerceToExpected(read, plan.outElem), plan.outElem, loc);
1538
+ });
1539
+ }
1413
1540
  if (plan.arms[tag] === "value") {
1414
1541
  // A unit arm's value is the unit itself, which has no narrowed
1415
1542
  // representation.
@@ -1522,7 +1649,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1522
1649
  {
1523
1650
  kind: "varDecl",
1524
1651
  localId: "r.0",
1525
- init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc), loc),
1652
+ init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc), loc, withThis),
1526
1653
  loc,
1527
1654
  },
1528
1655
  ...dispatch,
@@ -1535,7 +1662,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1535
1662
  ];
1536
1663
  lowerer.liftedFns.push({
1537
1664
  name,
1538
- params: arrayCallbackParams(arrT, fnT),
1665
+ params: arrayCallbackParams(arrT, fnT, withThis),
1539
1666
  returnType: outT,
1540
1667
  locals,
1541
1668
  body,
@@ -1552,8 +1679,8 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
1552
1679
  * }
1553
1680
  * return out;
1554
1681
  */
1555
- function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false) {
1556
- const key = `flatMap:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
1682
+ function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
1683
+ const key = `flatMap:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
1557
1684
  const existing = lowerer.arrHofHelpers.get(key);
1558
1685
  if (existing)
1559
1686
  return existing;
@@ -1638,7 +1765,7 @@ function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null
1638
1765
  {
1639
1766
  kind: "varDecl",
1640
1767
  localId: "r.0",
1641
- init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc),
1768
+ init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis),
1642
1769
  loc,
1643
1770
  },
1644
1771
  {
@@ -1664,10 +1791,10 @@ function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null
1664
1791
  ];
1665
1792
  lowerer.liftedFns.push(withFastCallback({
1666
1793
  name,
1667
- params: arrayCallbackParams(arrT, fnT),
1794
+ params: arrayCallbackParams(arrT, fnT, withThis),
1668
1795
  returnType: fnRet,
1669
1796
  locals: [
1670
- ...arrayCallbackLocals(arrT, fnT),
1797
+ ...arrayCallbackLocals(arrT, fnT, withThis),
1671
1798
  { id: "out.0", name: "out", type: fnRet, mutable: false },
1672
1799
  { id: "r.0", name: "r", type: fnRet, mutable: false },
1673
1800
  { id: "m.0", name: "m", type: F64, mutable: false },
@@ -1692,19 +1819,46 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
1692
1819
  if (!argNode)
1693
1820
  lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
1694
1821
  const hasInit = call.arguments.nodes.length === 2;
1695
- const accT = lowerer.runtimeOptionalReduceTypes.get(call) ??
1696
- (hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
1697
- if (accT.kind === "void" || accT.kind === "func")
1822
+ const overrideT = lowerer.runtimeOptionalReduceTypes.get(call) ?? null;
1823
+ const staticAccT = overrideT ?? (hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
1824
+ if (staticAccT.kind === "void" || staticAccT.kind === "func")
1698
1825
  lowerer.badType(call, lowerer.typeOf(call));
1699
- const lowered = lowerArrayCallback(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT, false, accT);
1826
+ const lowered = lowerArrayCallback(lowerer, argNode, [staticAccT, arrayValueType(lowerer, elem)], arrT, false, staticAccT);
1700
1827
  const { fnArg, arity } = lowered;
1828
+ // A JavaScript function with NO declared parameters whose body reads
1829
+ // `arguments` has that hidden slot as its whole ABI, which the synthetic
1830
+ // loop cannot fill: `callValue` passes exactly the declared parameters
1831
+ // (none), so the callback would see an empty `arguments` where JavaScript
1832
+ // passes (accumulator, element, index, array). Name the parameters
1833
+ // instead; that is the same value with a checkable type. Read the
1834
+ // callback's OWN type: the slot adaptation above (a dyn function boundary)
1835
+ // erases the hidden slot from `fnArg.type`. A callback that names its
1836
+ // parameters keeps working — `arguments` is built from the call's
1837
+ // arguments there, not from a hidden slot.
1838
+ if (lowered.rawType.kind === "func" &&
1839
+ lowered.rawType.params.length === 0 &&
1840
+ lowered.rawType.rest === true &&
1841
+ lowered.rawType.restAbi === undefined)
1842
+ lowerer.unsupported("SC1090", argNode, "a reduce callback that reads 'arguments' (name the parameters the callback uses)");
1843
+ // The callback's own answer is what the accumulator receives. An inline
1844
+ // lambda is contextually typed by the call (its returns coerce inside its
1845
+ // own lowering), but a function DECLARATION keeps its declared return. When
1846
+ // the checker's accumulator type cannot hold that value — `xs.reduce(function
1847
+ // () { count++ }, 1)` answers undefined, a program the checker already
1848
+ // diagnosed — the accumulator is the checked-dynamic value JavaScript
1849
+ // produces instead of a miscast (the untyped-reduce shape; see
1850
+ // accumulatorAdmitsAnswer).
1851
+ const accT = overrideT !== null || accumulatorAdmitsAnswer(lowerer, staticAccT, fnArg.type.ret)
1852
+ ? staticAccT
1853
+ : DYN;
1701
1854
  // Only an array that can hold elements outside its element type needs to
1702
- // leave an element its callback ignores unread.
1855
+ // leave an element its callback ignores unread. A dynamic accumulator is
1856
+ // the untyped shape; it keeps the single visit and the callback's own ABI.
1703
1857
  const unread = lowered.unread && elementMayBeForeign(lowerer, elem);
1704
- const fast = unread
1858
+ const fast = unread || accT.kind === "dyn"
1705
1859
  ? null
1706
1860
  : lowerFastCallback(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], 1, elem, arrT, { fnArg, arity }, false, accT);
1707
- const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type.ret, arity, hasInit, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, unread);
1861
+ const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type, hasInit, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, unread);
1708
1862
  const args = [receiver, fnArg];
1709
1863
  if (hasInit)
1710
1864
  args.push(lowerer.lowerExprExpecting(call.arguments.nodes[1], accT));
@@ -1714,6 +1868,33 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
1714
1868
  args.push(fast);
1715
1869
  return { kind: "call", callee: helper, args, type: accT, loc };
1716
1870
  }
1871
+ /** The accumulator's value as the callback's first parameter declares it.
1872
+ * Equal types pass the local straight through; a dynamic accumulator handed
1873
+ * to a typed parameter converts at the call (the callback is lowered first,
1874
+ * so its ABI is a fact and a value of another kind throws — "types don't
1875
+ * lie"). */
1876
+ function accumulatorArgument(lowerer, param, accT, loc) {
1877
+ const value = varRef("acc.0", accT, loc);
1878
+ return param === undefined || typeEquals(param, accT)
1879
+ ? value
1880
+ : lowerer.coerceToExpected(value, param);
1881
+ }
1882
+ /** Whether the checker's accumulator type stores the callback's answer
1883
+ * itself. A scalar accumulator holds only its own scalar, and a void answer
1884
+ * (a callback with no return statement) is `undefined`; both leave the
1885
+ * checker's type unable to carry the value (a program the checker already
1886
+ * diagnosed), which the reduction accumulates dynamically instead of
1887
+ * miscasting. Every other pair keeps `coerceToExpected`'s static plan. */
1888
+ function accumulatorAdmitsAnswer(lowerer, accT, fnRet) {
1889
+ if (lowerer.coercibleValue(fnRet, accT))
1890
+ return true;
1891
+ if (fnRet.kind === "void" || isUnitType(fnRet))
1892
+ return false;
1893
+ return !(scalarKind(accT) && scalarKind(fnRet));
1894
+ }
1895
+ function scalarKind(t) {
1896
+ return t.kind === "f64" || t.kind === "string" || t.kind === "bool";
1897
+ }
1717
1898
  /** The reduce/reduceRight loops, from existing IR nodes:
1718
1899
  *
1719
1900
  * with init: acc = z; n = a.length; for (...) acc = f(acc, a[i]); return acc;
@@ -1724,14 +1905,23 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
1724
1905
  * reduce walks 0→n-1, reduceRight n-1→0; the seed without an initial
1725
1906
  * value is a[0] / a[n-1] and the loop starts one past it. The empty-array
1726
1907
  * TypeError message is Node's exact message. */
1727
- function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc, site = "", fastT = null, unread = false) {
1908
+ function reduceHelper(lowerer, method, elem, accT, fnArg, hasInit, loc, site = "", fastT = null, unread = false) {
1909
+ // The callback's own ABI decides the helper's `f` slot: a dynamic
1910
+ // accumulator (accT) is coerced at the call and the store, so the closure
1911
+ // keeps the parameter types its lowering produced.
1912
+ const fnT = fnArg;
1913
+ const fnRet = fnT.ret;
1914
+ const arity = fnT.params.length;
1728
1915
  const key = `${method}:${typeKey(elem)}:${typeKey(accT)}:${typeKey(fnRet)}:${arity}:${hasInit ? "init" : "seed"}${site}${fastT ? ":split" : ""}${unread ? ":unread" : ""}`;
1729
1916
  const existing = lowerer.arrHofHelpers.get(key);
1730
1917
  if (existing)
1731
1918
  return existing;
1732
1919
  const name = keyedHelperName(lowerer, `%arr.${method}`, key);
1733
1920
  lowerer.arrHofHelpers.set(key, name);
1734
- if (method === "reduce")
1921
+ // A dynamic accumulator stays out of the pipeline registry: the fused
1922
+ // loops type their accumulator from the checker's view (arrHofInfo), which
1923
+ // this shape contradicts.
1924
+ if (method === "reduce" && accT.kind !== "dyn")
1735
1925
  lowerer.arrHofInfo.set(name, {
1736
1926
  method,
1737
1927
  elem,
@@ -1744,7 +1934,6 @@ function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc, s
1744
1934
  unread,
1745
1935
  });
1746
1936
  const arrT = arrayOf(elem);
1747
- const fnT = funcOf([accT, arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
1748
1937
  const n = varRef("n.0", F64, loc);
1749
1938
  const i = varRef("i.0", F64, loc);
1750
1939
  const right = method === "reduceRight";
@@ -1861,7 +2050,12 @@ function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc, s
1861
2050
  value: lowerer.coerceToExpected({
1862
2051
  kind: "callValue",
1863
2052
  callee: varRef("f.0", fnT, loc),
1864
- args: [varRef("acc.0", accT, loc), visited(), i, varRef("a.0", arrT, loc)].slice(0, arity),
2053
+ args: [
2054
+ accumulatorArgument(lowerer, fnT.params[0], accT, loc),
2055
+ visited(),
2056
+ i,
2057
+ varRef("a.0", arrT, loc),
2058
+ ].slice(0, arity),
1865
2059
  type: fnRet,
1866
2060
  loc,
1867
2061
  }, accT),
@@ -1985,16 +2179,20 @@ export function lowerArraySortCall(lowerer, call, access, elem, arrT) {
1985
2179
  }
1986
2180
  let fnArg = undefinedArg ?? lowerOptionalElementComparator(lowerer, argNode, unwrappedArg, elem, arrT);
1987
2181
  // Reusable JS comparators often accept checked values. Adapt the array's
1988
- // element ABI just as other array callbacks do before sorting.
2182
+ // element ABI just as other array callbacks do before sorting. A
2183
+ // comparator declaring MORE parameters than sort passes (`(a, b, loose?)`,
2184
+ // the imported semver shape) receives the surplus ones as undefined — the
2185
+ // completion an ordinary two-argument call performs — so it adapts to the
2186
+ // (a, b) slot like any other wider signature.
1989
2187
  if (fnArg.type.kind === "func" &&
1990
- fnArg.type.params.length <= 2 &&
1991
- fnArg.type.params.every((param) => lowerer.coercibleValue(elem, param))) {
2188
+ fnArg.type.params.slice(2).every((param) => omittableTrailingParam(lowerer, param)) &&
2189
+ fnArg.type.params.slice(0, 2).every((param) => lowerer.coercibleValue(elem, param))) {
1992
2190
  // Arithmetic on inferred JS values retains a checked result because
1993
2191
  // it can produce BigInt. The sort callback still requires a number.
1994
2192
  const result = fnArg.type.ret.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(argNode))
1995
2193
  ? F64
1996
2194
  : fnArg.type.ret;
1997
- const expected = funcOf(fnArg.type.params.map(() => elem), result);
2195
+ const expected = funcOf(fnArg.type.params.slice(0, 2).map(() => elem), result);
1998
2196
  if (!typeEquals(fnArg.type, expected))
1999
2197
  fnArg = lowerer.coerceToExpected(fnArg, expected);
2000
2198
  }