@scriptc/compiler 0.4.8 → 0.4.9

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 (536) hide show
  1. package/ambient/node-fallback/buffer.d.ts +2 -0
  2. package/ambient/node-fallback/child_process.d.ts +9 -3
  3. package/ambient/node-fallback/dns-promises.d.ts +25 -0
  4. package/ambient/node-fallback/dns.d.ts +29 -0
  5. package/ambient/node-fallback/test.d.ts +7 -0
  6. package/ambient/scriptc-node-fallback.d.ts +145 -2
  7. package/ambient/scriptc-overrides.d.ts +22 -13
  8. package/dist/backend/build-cache.d.ts +1 -1
  9. package/dist/backend/build-cache.js +1 -1
  10. package/dist/backend/build-cache.js.map +1 -1
  11. package/dist/backend/cache-root.d.ts +7 -0
  12. package/dist/backend/cache-root.js +27 -0
  13. package/dist/backend/cache-root.js.map +1 -1
  14. package/dist/backend/executable-features.js +5 -1
  15. package/dist/backend/executable-features.js.map +1 -1
  16. package/dist/backend/link-plan.js +7 -1
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/bytes-loop-versions.d.ts +12 -1
  19. package/dist/backend/llvm/bytes-loop-versions.js +107 -30
  20. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  21. package/dist/backend/llvm/bytes-loop-versions.test.js +96 -0
  22. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  23. package/dist/backend/llvm/checked-value-lifetimes.js +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +16 -5
  26. package/dist/backend/llvm/classes.js +34 -6
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +21 -2
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +9 -0
  31. package/dist/backend/llvm/common.js +9 -0
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/cpu-dispatch.d.ts +36 -2
  34. package/dist/backend/llvm/cpu-dispatch.js +96 -2
  35. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  36. package/dist/backend/llvm/dense-array-access.d.ts +5 -2
  37. package/dist/backend/llvm/dense-array-access.js +16 -12
  38. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  39. package/dist/backend/llvm/dense-array-access.test.js +3 -1
  40. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  41. package/dist/backend/llvm/dyn.d.ts +24 -0
  42. package/dist/backend/llvm/dyn.js +117 -3
  43. package/dist/backend/llvm/dyn.js.map +1 -1
  44. package/dist/backend/llvm/emit-function.js +6 -0
  45. package/dist/backend/llvm/emit-function.js.map +1 -1
  46. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  47. package/dist/backend/llvm/emit-journal.js.map +1 -1
  48. package/dist/backend/llvm/emit-module.js +48 -5
  49. package/dist/backend/llvm/emit-module.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.test.js +41 -0
  51. package/dist/backend/llvm/emit-module.test.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.js +11 -0
  53. package/dist/backend/llvm/emit-statements.js.map +1 -1
  54. package/dist/backend/llvm/emitter.d.ts +87 -7
  55. package/dist/backend/llvm/emitter.js +136 -15
  56. package/dist/backend/llvm/emitter.js.map +1 -1
  57. package/dist/backend/llvm/expr-async.js +28 -6
  58. package/dist/backend/llvm/expr-async.js.map +1 -1
  59. package/dist/backend/llvm/expr-containers.js +19 -5
  60. package/dist/backend/llvm/expr-containers.js.map +1 -1
  61. package/dist/backend/llvm/expr-dynamic.js +29 -1
  62. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  63. package/dist/backend/llvm/expr-primitives.js +104 -6
  64. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  65. package/dist/backend/llvm/expr-records.js +15 -1
  66. package/dist/backend/llvm/expr-records.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-bridges.js +53 -5
  68. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  69. package/dist/backend/llvm/inline-arrays.js +1 -1
  70. package/dist/backend/llvm/inline-arrays.js.map +1 -1
  71. package/dist/backend/llvm/js-ic.js +126 -2
  72. package/dist/backend/llvm/js-ic.js.map +1 -1
  73. package/dist/backend/llvm/lanes.d.ts +38 -0
  74. package/dist/backend/llvm/lanes.js +778 -0
  75. package/dist/backend/llvm/lanes.js.map +1 -0
  76. package/dist/backend/llvm/lanes.test.d.ts +1 -0
  77. package/dist/backend/llvm/lanes.test.js +402 -0
  78. package/dist/backend/llvm/lanes.test.js.map +1 -0
  79. package/dist/backend/llvm/lib-dispatch.js +9 -4
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-network.js +20 -0
  82. package/dist/backend/llvm/lib-network.js.map +1 -1
  83. package/dist/backend/llvm/lib-shared.js +27 -0
  84. package/dist/backend/llvm/lib-shared.js.map +1 -1
  85. package/dist/backend/llvm/lib-test.js +11 -0
  86. package/dist/backend/llvm/lib-test.js.map +1 -1
  87. package/dist/backend/llvm/local-array-reads.js +2 -2
  88. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  89. package/dist/backend/llvm/map-number-lookup.js +8 -2
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/nullable-unions.js +5 -2
  92. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  93. package/dist/backend/llvm/publish.d.ts +3 -0
  94. package/dist/backend/llvm/publish.js +2 -2
  95. package/dist/backend/llvm/publish.js.map +1 -1
  96. package/dist/backend/llvm/reference-writes.js +1 -0
  97. package/dist/backend/llvm/reference-writes.js.map +1 -1
  98. package/dist/backend/llvm/region-groups.js +43 -4
  99. package/dist/backend/llvm/region-groups.js.map +1 -1
  100. package/dist/backend/llvm/region-groups.test.js +79 -0
  101. package/dist/backend/llvm/region-groups.test.js.map +1 -1
  102. package/dist/backend/llvm/runtime-registries.test.js +32 -1
  103. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  104. package/dist/backend/llvm/shapes.js +10 -1
  105. package/dist/backend/llvm/shapes.js.map +1 -1
  106. package/dist/backend/llvm/string-reads.d.ts +1 -1
  107. package/dist/backend/llvm/string-reads.js +1 -1
  108. package/dist/backend/llvm/string-reads.js.map +1 -1
  109. package/dist/backend/llvm/unwind-abi.js +24 -2
  110. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  111. package/dist/backend/llvm/unwind-abi.test.js +38 -0
  112. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  113. package/dist/backend/llvm/walkers.d.ts +3 -0
  114. package/dist/backend/llvm/walkers.js +20 -2
  115. package/dist/backend/llvm/walkers.js.map +1 -1
  116. package/dist/backend/native/contracts.d.ts +15 -3
  117. package/dist/backend/native/executable.js +19 -5
  118. package/dist/backend/native/executable.js.map +1 -1
  119. package/dist/backend/native-codegen-core.d.ts +20 -0
  120. package/dist/backend/native-codegen-core.js +15 -0
  121. package/dist/backend/native-codegen-core.js.map +1 -1
  122. package/dist/backend/native-codegen.d.ts +5 -0
  123. package/dist/backend/native-codegen.js +62 -8
  124. package/dist/backend/native-codegen.js.map +1 -1
  125. package/dist/backend/native-codegen.test.js +48 -8
  126. package/dist/backend/native-codegen.test.js.map +1 -1
  127. package/dist/backend/native-link-info-core.d.ts +27 -3
  128. package/dist/backend/native-link-info-core.js.map +1 -1
  129. package/dist/backend/native-link-info.test.js +17 -1
  130. package/dist/backend/native-link-info.test.js.map +1 -1
  131. package/dist/backend/native-toolchain.d.ts +1 -1
  132. package/dist/backend/native-toolchain.js +1 -1
  133. package/dist/backend/native-toolchain.js.map +1 -1
  134. package/dist/backend/native-toolchain.test.js +14 -1
  135. package/dist/backend/native-toolchain.test.js.map +1 -1
  136. package/dist/backend/runtime-pack-core.d.ts +9 -3
  137. package/dist/backend/runtime-pack-core.js +6 -1
  138. package/dist/backend/runtime-pack-core.js.map +1 -1
  139. package/dist/backend/runtime-pack.test.js +32 -1
  140. package/dist/backend/runtime-pack.test.js.map +1 -1
  141. package/dist/backend/targets.d.ts +9 -1
  142. package/dist/backend/targets.js +11 -2
  143. package/dist/backend/targets.js.map +1 -1
  144. package/dist/backend/targets.test.js +6 -0
  145. package/dist/backend/targets.test.js.map +1 -1
  146. package/dist/cli/command.js +15 -1
  147. package/dist/cli/command.js.map +1 -1
  148. package/dist/cli/host.d.ts +6 -0
  149. package/dist/cli/mcp.d.ts +72 -0
  150. package/dist/cli/mcp.js +601 -0
  151. package/dist/cli/mcp.js.map +1 -0
  152. package/dist/cli/mcp.test.d.ts +1 -0
  153. package/dist/cli/mcp.test.js +380 -0
  154. package/dist/cli/mcp.test.js.map +1 -0
  155. package/dist/cli/output-options.d.ts +1 -0
  156. package/dist/cli/output-options.js +3 -0
  157. package/dist/cli/output-options.js.map +1 -1
  158. package/dist/cli/usage.d.ts +51 -1
  159. package/dist/cli/usage.js +709 -186
  160. package/dist/cli/usage.js.map +1 -1
  161. package/dist/compat/fetch-profile.js +9 -4
  162. package/dist/compat/fetch-profile.js.map +1 -1
  163. package/dist/compile-types.d.ts +17 -0
  164. package/dist/coverage/report.d.ts +5 -9
  165. package/dist/coverage/report.js.map +1 -1
  166. package/dist/executable/executable-cache.d.ts +17 -3
  167. package/dist/executable/executable-cache.js +17 -3
  168. package/dist/executable/executable-cache.js.map +1 -1
  169. package/dist/executable/prepare.js +87 -10
  170. package/dist/executable/prepare.js.map +1 -1
  171. package/dist/frontend/analysis.js +3 -2
  172. package/dist/frontend/analysis.js.map +1 -1
  173. package/dist/frontend/canon-map.js +13 -8
  174. package/dist/frontend/canon-map.js.map +1 -1
  175. package/dist/frontend/decl-projection.d.ts +18 -0
  176. package/dist/frontend/decl-projection.js +90 -22
  177. package/dist/frontend/decl-projection.js.map +1 -1
  178. package/dist/frontend/decl-projection.test.js +47 -1
  179. package/dist/frontend/decl-projection.test.js.map +1 -1
  180. package/dist/frontend/default-library.d.ts +10 -0
  181. package/dist/frontend/default-library.js +43 -0
  182. package/dist/frontend/default-library.js.map +1 -0
  183. package/dist/frontend/fork-target.js +54 -9
  184. package/dist/frontend/fork-target.js.map +1 -1
  185. package/dist/frontend/fork-target.test.js +82 -0
  186. package/dist/frontend/fork-target.test.js.map +1 -1
  187. package/dist/frontend/inferred-js-diagnostics.test.js +73 -0
  188. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  189. package/dist/frontend/lowering/abstract-equality.d.ts +2 -1
  190. package/dist/frontend/lowering/abstract-equality.js +7 -1
  191. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  192. package/dist/frontend/lowering/array-values.js +2 -2
  193. package/dist/frontend/lowering/array-values.js.map +1 -1
  194. package/dist/frontend/lowering/assertion-members.js +52 -2
  195. package/dist/frontend/lowering/assertion-members.js.map +1 -1
  196. package/dist/frontend/lowering/builtin-namespaces.d.ts +5 -0
  197. package/dist/frontend/lowering/builtin-namespaces.js +19 -12
  198. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/callable-aliases.js +42 -6
  200. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  201. package/dist/frontend/lowering/builtins/child-process.d.ts +12 -11
  202. package/dist/frontend/lowering/builtins/child-process.js +235 -38
  203. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/compression.d.ts +6 -1
  205. package/dist/frontend/lowering/builtins/compression.js +3 -3
  206. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/constants.js +2 -2
  208. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -1
  210. package/dist/frontend/lowering/builtins/crypto.js +9 -1
  211. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/dates.js +26 -6
  213. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/environment.d.ts +13 -1
  215. package/dist/frontend/lowering/builtins/environment.js +15 -4
  216. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/module-bindings.d.ts +33 -0
  218. package/dist/frontend/lowering/builtins/module-bindings.js +213 -11
  219. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-resolution.d.ts +9 -2
  221. package/dist/frontend/lowering/builtins/module-resolution.js +187 -19
  222. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/performance.js +1 -1
  224. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/process.js +40 -2
  226. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/promises.js +33 -0
  228. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/readline.d.ts +9 -5
  230. package/dist/frontend/lowering/builtins/readline.js +184 -75
  231. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/url.d.ts +4 -0
  233. package/dist/frontend/lowering/builtins/url.js +6 -0
  234. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  235. package/dist/frontend/lowering/call-arguments.js +15 -0
  236. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  237. package/dist/frontend/lowering/callable-properties.d.ts +34 -0
  238. package/dist/frontend/lowering/callable-properties.js +210 -0
  239. package/dist/frontend/lowering/callable-properties.js.map +1 -0
  240. package/dist/frontend/lowering/cjs-inline-require.d.ts +16 -0
  241. package/dist/frontend/lowering/cjs-inline-require.js +105 -0
  242. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  243. package/dist/frontend/lowering/cjs-inline-require.test.d.ts +1 -0
  244. package/dist/frontend/lowering/cjs-inline-require.test.js +61 -0
  245. package/dist/frontend/lowering/cjs-inline-require.test.js.map +1 -0
  246. package/dist/frontend/lowering/class-dynamic-dispatch.js +82 -2
  247. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  248. package/dist/frontend/lowering/class-protocols.d.ts +57 -4
  249. package/dist/frontend/lowering/class-protocols.js +597 -30
  250. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  251. package/dist/frontend/lowering/class-unions.js +2 -2
  252. package/dist/frontend/lowering/class-unions.js.map +1 -1
  253. package/dist/frontend/lowering/coercions/function-adapters.d.ts +12 -0
  254. package/dist/frontend/lowering/coercions/function-adapters.js +62 -0
  255. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  256. package/dist/frontend/lowering/coercions/structural-plans.js +56 -1
  257. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  258. package/dist/frontend/lowering/coercions/structural.js +9 -4
  259. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  260. package/dist/frontend/lowering/collection-ingestion.d.ts +9 -0
  261. package/dist/frontend/lowering/collection-ingestion.js +115 -41
  262. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  263. package/dist/frontend/lowering/containers/array-callbacks.js +16 -0
  264. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  265. package/dist/frontend/lowering/containers/bytes.js +66 -10
  266. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  267. package/dist/frontend/lowering/containers/collection-methods.js +61 -5
  268. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  269. package/dist/frontend/lowering/containers/filter-predicates.js +11 -0
  270. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  271. package/dist/frontend/lowering/containers/indexed-objects.d.ts +15 -0
  272. package/dist/frontend/lowering/containers/indexed-objects.js +213 -30
  273. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  274. package/dist/frontend/lowering/error-name-order.d.ts +16 -0
  275. package/dist/frontend/lowering/error-name-order.js +61 -0
  276. package/dist/frontend/lowering/error-name-order.js.map +1 -1
  277. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +17 -0
  278. package/dist/frontend/lowering/expressions/asserted-receiver.js +123 -1
  279. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -1
  280. package/dist/frontend/lowering/expressions/binary.js +147 -20
  281. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  282. package/dist/frontend/lowering/expressions/element-access.js +63 -14
  283. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  284. package/dist/frontend/lowering/expressions/erased-delete.d.ts +59 -0
  285. package/dist/frontend/lowering/expressions/erased-delete.js +247 -0
  286. package/dist/frontend/lowering/expressions/erased-delete.js.map +1 -0
  287. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +10 -0
  288. package/dist/frontend/lowering/expressions/hosted-narrowing.js +48 -1
  289. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  290. package/dist/frontend/lowering/expressions/identifiers.js +20 -0
  291. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/narrowing.d.ts +7 -2
  293. package/dist/frontend/lowering/expressions/narrowing.js +77 -45
  294. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +62 -19
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/optional-chains.js +19 -0
  298. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/property-access.d.ts +7 -7
  300. package/dist/frontend/lowering/expressions/property-access.js +247 -48
  301. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  302. package/dist/frontend/lowering/expressions/relational.d.ts +1 -0
  303. package/dist/frontend/lowering/expressions/relational.js +18 -8
  304. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  305. package/dist/frontend/lowering/expressions/union-fields.js +11 -5
  306. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  307. package/dist/frontend/lowering/expressions/updates.js +121 -11
  308. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  309. package/dist/frontend/lowering/function-context.d.ts +10 -0
  310. package/dist/frontend/lowering/function-context.js +36 -0
  311. package/dist/frontend/lowering/function-context.js.map +1 -1
  312. package/dist/frontend/lowering/function-returns.js +8 -8
  313. package/dist/frontend/lowering/function-returns.js.map +1 -1
  314. package/dist/frontend/lowering/handle-properties.d.ts +62 -3
  315. package/dist/frontend/lowering/handle-properties.js +674 -26
  316. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  317. package/dist/frontend/lowering/handle-properties.test.js +95 -2
  318. package/dist/frontend/lowering/handle-properties.test.js.map +1 -1
  319. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  320. package/dist/frontend/lowering/lower-builtin-values.js +44 -0
  321. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  322. package/dist/frontend/lowering/lower-calls.js +328 -136
  323. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  324. package/dist/frontend/lowering/lower-classes.js +82 -17
  325. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  326. package/dist/frontend/lowering/lower-event-emitter.js +113 -9
  327. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  328. package/dist/frontend/lowering/lower-expando.d.ts +13 -21
  329. package/dist/frontend/lowering/lower-expando.js +90 -126
  330. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  331. package/dist/frontend/lowering/lower-exprs.js +2 -2
  332. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  333. package/dist/frontend/lowering/lower-functions.js +65 -0
  334. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  335. package/dist/frontend/lowering/lower-inspect.js +471 -0
  336. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  337. package/dist/frontend/lowering/lower-modules.js +36 -10
  338. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  339. package/dist/frontend/lowering/lower-node-island.js +28 -0
  340. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  341. package/dist/frontend/lowering/lower-server.d.ts +53 -7
  342. package/dist/frontend/lowering/lower-server.js +213 -42
  343. package/dist/frontend/lowering/lower-server.js.map +1 -1
  344. package/dist/frontend/lowering/lower-stdlib.js +50 -7
  345. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  346. package/dist/frontend/lowering/lower-stmts.d.ts +24 -0
  347. package/dist/frontend/lowering/lower-stmts.js +463 -220
  348. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  349. package/dist/frontend/lowering/lower-stream.js +2 -2
  350. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  351. package/dist/frontend/lowering/lower-test.js +71 -2
  352. package/dist/frontend/lowering/lower-test.js.map +1 -1
  353. package/dist/frontend/lowering/lowerer.d.ts +81 -10
  354. package/dist/frontend/lowering/lowerer.js +319 -72
  355. package/dist/frontend/lowering/lowerer.js.map +1 -1
  356. package/dist/frontend/lowering/new-target.js +10 -2
  357. package/dist/frontend/lowering/new-target.js.map +1 -1
  358. package/dist/frontend/lowering/nullish-empty-pattern.js +3 -3
  359. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -1
  360. package/dist/frontend/lowering/partial-assertions.js +30 -5
  361. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  362. package/dist/frontend/lowering/primitive-throws.js +91 -1
  363. package/dist/frontend/lowering/primitive-throws.js.map +1 -1
  364. package/dist/frontend/lowering/primitive-wrappers.d.ts +9 -0
  365. package/dist/frontend/lowering/primitive-wrappers.js +2 -2
  366. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  367. package/dist/frontend/lowering/promise-executor-adapter.js +5 -2
  368. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  369. package/dist/frontend/lowering/record-links.js +7 -2
  370. package/dist/frontend/lowering/record-links.js.map +1 -1
  371. package/dist/frontend/lowering/surfaces.d.ts +4 -0
  372. package/dist/frontend/lowering/surfaces.js +118 -2
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/surfaces.test.d.ts +1 -0
  375. package/dist/frontend/lowering/surfaces.test.js +31 -0
  376. package/dist/frontend/lowering/surfaces.test.js.map +1 -0
  377. package/dist/frontend/mock-shapes.js +3 -3
  378. package/dist/frontend/mock-shapes.js.map +1 -1
  379. package/dist/frontend/npm-static-ladder.d.ts +21 -0
  380. package/dist/frontend/npm-static-ladder.js +2 -0
  381. package/dist/frontend/npm-static-ladder.js.map +1 -0
  382. package/dist/frontend/npm-static-ladder.test.d.ts +1 -0
  383. package/dist/frontend/npm-static-ladder.test.js +138 -0
  384. package/dist/frontend/npm-static-ladder.test.js.map +1 -0
  385. package/dist/frontend/npm-static-status.d.ts +15 -0
  386. package/dist/frontend/npm-static-status.js +2 -0
  387. package/dist/frontend/npm-static-status.js.map +1 -0
  388. package/dist/frontend/package-shims.js +1 -1
  389. package/dist/frontend/package-shims.js.map +1 -1
  390. package/dist/frontend/pipeline.d.ts +1 -1
  391. package/dist/frontend/pipeline.js +222 -25
  392. package/dist/frontend/pipeline.js.map +1 -1
  393. package/dist/frontend/program-analysis.d.ts +4 -0
  394. package/dist/frontend/program-analysis.js +6 -0
  395. package/dist/frontend/program-analysis.js.map +1 -1
  396. package/dist/frontend/program.js +258 -32
  397. package/dist/frontend/program.js.map +1 -1
  398. package/dist/frontend/program.test.js +30 -0
  399. package/dist/frontend/program.test.js.map +1 -1
  400. package/dist/frontend/resolve.js +29 -5
  401. package/dist/frontend/resolve.js.map +1 -1
  402. package/dist/frontend/resolve.test.js +40 -0
  403. package/dist/frontend/resolve.test.js.map +1 -1
  404. package/dist/frontend/services.d.ts +8 -0
  405. package/dist/frontend/services.js +7 -0
  406. package/dist/frontend/services.js.map +1 -1
  407. package/dist/frontend/ts7/checker.d.ts +7 -0
  408. package/dist/frontend/ts7/checker.js +12 -0
  409. package/dist/frontend/ts7/checker.js.map +1 -1
  410. package/dist/frontend/ts7/checker.test.js +1 -0
  411. package/dist/frontend/ts7/checker.test.js.map +1 -1
  412. package/dist/frontend/ts7/program-host.d.ts +39 -2
  413. package/dist/frontend/ts7/program-host.js +62 -8
  414. package/dist/frontend/ts7/program-host.js.map +1 -1
  415. package/dist/frontend/ts7/program-host.test.js +33 -0
  416. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  417. package/dist/frontend/ts7/session-cache.d.ts +5 -1
  418. package/dist/frontend/ts7/session-cache.js +7 -1
  419. package/dist/frontend/ts7/session-cache.js.map +1 -1
  420. package/dist/frontend/ts7/session-cache.test.js +37 -0
  421. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  422. package/dist/frontend/ts7/session.js +19 -1
  423. package/dist/frontend/ts7/session.js.map +1 -1
  424. package/dist/frontend/ts7/source-parser.d.ts +17 -2
  425. package/dist/frontend/ts7/source-parser.js +61 -2
  426. package/dist/frontend/ts7/source-parser.js.map +1 -1
  427. package/dist/frontend/ts7/source-parser.test.js +55 -2
  428. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  429. package/dist/frontend/tsc-codes.d.ts +3 -2
  430. package/dist/frontend/tsc-codes.js +129 -22
  431. package/dist/frontend/tsc-codes.js.map +1 -1
  432. package/dist/frontend/type-mapper.d.ts +5 -11
  433. package/dist/frontend/type-mapper.js +380 -70
  434. package/dist/frontend/type-mapper.js.map +1 -1
  435. package/dist/index.d.ts +1 -1
  436. package/dist/index.js +67 -7
  437. package/dist/index.js.map +1 -1
  438. package/dist/ir/builtin-effects.js +29 -0
  439. package/dist/ir/builtin-effects.js.map +1 -1
  440. package/dist/ir/builtin-signatures.d.ts +1 -1
  441. package/dist/ir/builtin-signatures.js +72 -6
  442. package/dist/ir/builtin-signatures.js.map +1 -1
  443. package/dist/ir/codec.generated.d.ts +1 -1
  444. package/dist/ir/codec.generated.js +321 -263
  445. package/dist/ir/codec.generated.js.map +1 -1
  446. package/dist/ir/constant-length-clones.d.ts +26 -0
  447. package/dist/ir/constant-length-clones.js +589 -0
  448. package/dist/ir/constant-length-clones.js.map +1 -0
  449. package/dist/ir/constant-length-clones.test.d.ts +1 -0
  450. package/dist/ir/constant-length-clones.test.js +292 -0
  451. package/dist/ir/constant-length-clones.test.js.map +1 -0
  452. package/dist/ir/constant-tables.d.ts +10 -5
  453. package/dist/ir/constant-tables.js +83 -17
  454. package/dist/ir/constant-tables.js.map +1 -1
  455. package/dist/ir/constant-tables.test.js +58 -1
  456. package/dist/ir/constant-tables.test.js.map +1 -1
  457. package/dist/ir/fields.generated.js +5 -2
  458. package/dist/ir/fields.generated.js.map +1 -1
  459. package/dist/ir/function-references.js +2 -0
  460. package/dist/ir/function-references.js.map +1 -1
  461. package/dist/ir/function-references.test.js +13 -0
  462. package/dist/ir/function-references.test.js.map +1 -1
  463. package/dist/ir/integer-loops.js +1 -0
  464. package/dist/ir/integer-loops.js.map +1 -1
  465. package/dist/ir/integer-loops.test.js +16 -0
  466. package/dist/ir/integer-loops.test.js.map +1 -1
  467. package/dist/ir/ir.d.ts +50 -6
  468. package/dist/ir/ir.js +44 -2
  469. package/dist/ir/ir.js.map +1 -1
  470. package/dist/ir/ir.test.js +83 -1
  471. package/dist/ir/ir.test.js.map +1 -1
  472. package/dist/ir/js-groups.js +5 -1
  473. package/dist/ir/js-groups.js.map +1 -1
  474. package/dist/ir/js-ic.d.ts +20 -0
  475. package/dist/ir/js-ic.js +81 -4
  476. package/dist/ir/js-ic.js.map +1 -1
  477. package/dist/ir/js-ic.test.js +8 -1
  478. package/dist/ir/js-ic.test.js.map +1 -1
  479. package/dist/ir/lane-plans.d.ts +86 -0
  480. package/dist/ir/lane-plans.js +589 -0
  481. package/dist/ir/lane-plans.js.map +1 -0
  482. package/dist/ir/lane-plans.test.d.ts +1 -0
  483. package/dist/ir/lane-plans.test.js +549 -0
  484. package/dist/ir/lane-plans.test.js.map +1 -0
  485. package/dist/ir/runtime-features.d.ts +68 -10
  486. package/dist/ir/runtime-features.js +285 -17
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/runtime-features.test.js +190 -1
  489. package/dist/ir/runtime-features.test.js.map +1 -1
  490. package/dist/ir/validate.js +61 -24
  491. package/dist/ir/validate.js.map +1 -1
  492. package/dist/native/cache.d.ts +5 -0
  493. package/dist/native/cache.js +23 -1
  494. package/dist/native/cache.js.map +1 -1
  495. package/dist/native/cache.test.js +29 -1
  496. package/dist/native/cache.test.js.map +1 -1
  497. package/dist/native/cli.js +4 -2
  498. package/dist/native/cli.js.map +1 -1
  499. package/dist/native/compiler.d.ts +11 -3
  500. package/dist/native/compiler.js +102 -16
  501. package/dist/native/compiler.js.map +1 -1
  502. package/dist/native/compiler.test.js +244 -2
  503. package/dist/native/compiler.test.js.map +1 -1
  504. package/dist/native/prepare.d.ts +14 -1
  505. package/dist/native/prepare.js +79 -29
  506. package/dist/native/prepare.js.map +1 -1
  507. package/dist/native/sanitizer.test.js +3 -0
  508. package/dist/native/sanitizer.test.js.map +1 -1
  509. package/dist/native/unchanged.d.ts +80 -0
  510. package/dist/native/unchanged.js +301 -0
  511. package/dist/native/unchanged.js.map +1 -0
  512. package/dist/native/unchanged.test.d.ts +1 -0
  513. package/dist/native/unchanged.test.js +249 -0
  514. package/dist/native/unchanged.test.js.map +1 -0
  515. package/dist/node-islands/boundary.d.ts +16 -0
  516. package/dist/node-islands/boundary.js +70 -7
  517. package/dist/node-islands/boundary.js.map +1 -1
  518. package/dist/node-islands/boundary.test.js +59 -14
  519. package/dist/node-islands/boundary.test.js.map +1 -1
  520. package/dist/node-islands/detect.js +203 -47
  521. package/dist/node-islands/detect.js.map +1 -1
  522. package/dist/node-islands/detect.test.js +45 -0
  523. package/dist/node-islands/detect.test.js.map +1 -1
  524. package/dist/node-islands/growth.js +4 -16
  525. package/dist/node-islands/growth.js.map +1 -1
  526. package/dist/node-islands/modules.d.ts +3 -0
  527. package/dist/node-islands/modules.js +143 -12
  528. package/dist/node-islands/modules.js.map +1 -1
  529. package/dist/node-islands/modules.test.js +125 -0
  530. package/dist/node-islands/modules.test.js.map +1 -1
  531. package/dist/node-islands/report.d.ts +1 -1
  532. package/dist/node-islands/report.js +2 -1
  533. package/dist/node-islands/report.js.map +1 -1
  534. package/package.json +20 -20
  535. package/shims/undici/core/request.ts +7 -1
  536. package/surface-manifest.json +380 -2
@@ -899,6 +899,44 @@ export function recordOvfCapturePlan(lowerer, fromId, toId) {
899
899
  * index-signature record arm) builds this same helper through
900
900
  * recordOvfCapturePlan. */
901
901
  export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
902
+ return buildRecordCaptureHelper(lowerer, fromId, toId, loc, {
903
+ key: `ovf:${fromId}:${toId}`,
904
+ namePrefix: "%rec.capture",
905
+ excluded: EMPTY_CAPTURE_EXCLUSION,
906
+ propagateNullProto: true,
907
+ keepSourceTail: true,
908
+ });
909
+ }
910
+ /** Interned `%rec.rest.<n>(s)` — the fresh object `const { a, x, ...rest } =
911
+ * s` binds over an INDEX-SIGNATURE source (or into an index-signature rest
912
+ * type): the capture reshape with an explicit EXCLUSION set, which is the
913
+ * one thing JavaScript's CopyDataProperties does differently from a plain
914
+ * reshape. Declared target fields the two shapes share are direct-copied
915
+ * (presence kept), every other source declared field is keyed-written in
916
+ * declaration order, and the source overflow is copied in JS own-key order
917
+ * — each skipping an excluded literal key. The result is always a fresh
918
+ * object with `Object.prototype` (a rest copy never inherits its source's
919
+ * null prototype), so `nullProto` is not propagated. Null when the pair is
920
+ * outside the matrix (recordOvfCapturePlan's gates), when the rest type
921
+ * declares an excluded name (never a rest type tsc produces), or when the
922
+ * source could keep an out-of-shape view that the field-by-field rebuild
923
+ * cannot see — the caller keeps its named fence for those. */
924
+ export function lowerRecordRestCaptureHelper(lowerer, fromId, toId, excluded, loc) {
925
+ const names = [...new Set(excluded)].sort();
926
+ return buildRecordCaptureHelper(lowerer, fromId, toId, loc, {
927
+ // The set is part of the key, spelled so that two DIFFERENT sets can
928
+ // never produce one spelling: a property name may hold a comma
929
+ // (`{ "a,b": x, ...rest }` beside `{ a, b, ...rest }`) or be empty,
930
+ // and either would join into the other set's text.
931
+ key: `rest:${fromId}:${toId}:${JSON.stringify(names)}`,
932
+ namePrefix: "%rec.rest",
933
+ excluded: new Set(names),
934
+ propagateNullProto: false,
935
+ keepSourceTail: false,
936
+ });
937
+ }
938
+ const EMPTY_CAPTURE_EXCLUSION = new Set();
939
+ function buildRecordCaptureHelper(lowerer, fromId, toId, loc, opts) {
902
940
  const plan = recordOvfCapturePlan(lowerer, fromId, toId);
903
941
  if (!plan)
904
942
  return null;
@@ -910,16 +948,28 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
910
948
  const tIv = to.indexValue;
911
949
  if (tIv === undefined)
912
950
  return null;
951
+ const { excluded, propagateNullProto } = opts;
952
+ if (excluded.size > 0 && to.fields.some((f) => excluded.has(f.name)))
953
+ return null;
954
+ // A rest reshape over a CLOSED source that can keep an out-of-shape view
955
+ // cannot see that view's keys, and the checked-conversion tail would
956
+ // carry the excluded ones back in — decline (the caller keeps its named
957
+ // fence).
958
+ if (!opts.keepSourceTail &&
959
+ fIv === null &&
960
+ recordMayKeepSource(lowerer, { kind: "record", shapeId: fromId }))
961
+ return null;
913
962
  // The copy below writes the source's declared fields in order, so a
914
963
  // program that reaches it observes that order (the plan itself is pure:
915
964
  // a speculative widthLiftPlan call must not mark a shape observed).
916
965
  lowerer.keyOrder.observed.add(from.id);
917
- const { inits, fieldLifts, orderedFields, consumed } = plan;
918
- const key = `ovf:${fromId}:${toId}`;
966
+ const { fieldLifts, orderedFields, consumed } = plan;
967
+ const inits = excluded.size === 0 ? plan.inits : plan.inits.filter((d) => !excluded.has(d.name));
968
+ const key = opts.key;
919
969
  const existing = lowerer.valueHelpers.get(key);
920
970
  if (existing)
921
971
  return existing;
922
- const name = keyedHelperName(lowerer, "%rec.capture", key);
972
+ const name = keyedHelperName(lowerer, opts.namePrefix, key);
923
973
  lowerer.valueHelpers.set(key, name);
924
974
  const fromT = { kind: "record", shapeId: fromId };
925
975
  const toT = { kind: "record", shapeId: toId };
@@ -940,7 +990,7 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
940
990
  field: d.name,
941
991
  type: d.src,
942
992
  loc,
943
- }, to.fields.find((f) => f.name === d.name).type, loc), loc)
993
+ }, to.fields.find((f) => f.name === d.name).type, loc), loc, to.fields.find((f) => f.name === d.name))
944
994
  : {
945
995
  // No source property of this name: the field starts
946
996
  // absent (an overflow write below can supply it).
@@ -955,7 +1005,7 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
955
1005
  };
956
1006
  // The source and its reshape are one object in JavaScript, so a
957
1007
  // null-prototype source (a match's groups, Object.groupBy) keeps it.
958
- const init = nullProtoRecordShape(lowerer, fromT) && nullProtoRecordShape(lowerer, toT)
1008
+ const init = propagateNullProto && nullProtoRecordShape(lowerer, fromT) && nullProtoRecordShape(lowerer, toT)
959
1009
  ? {
960
1010
  kind: "ternary",
961
1011
  cond: recordNullProtoTest(sRef, fromId, loc),
@@ -970,7 +1020,7 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
970
1020
  // Source declared fields in declaration order, skipping unset
971
1021
  // optionals (stance 37) and the direct-initialized (consumed) names.
972
1022
  for (const ff of orderedFields) {
973
- if (consumed.has(ff.name))
1023
+ if (consumed.has(ff.name) || excluded.has(ff.name))
974
1024
  continue;
975
1025
  const raw = {
976
1026
  kind: "recordGet",
@@ -1005,10 +1055,43 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
1005
1055
  body.push(fieldStmt);
1006
1056
  }
1007
1057
  // The source overflow, in JS own-key order (only index-signature
1008
- // sources carry one).
1058
+ // sources carry one). A rest reshape skips the excluded literal keys
1059
+ // here (a strEq chain against the key literal), which is what removes
1060
+ // the consumed entries from the fresh object.
1009
1061
  const ksT = arrayOf(STRING);
1010
1062
  if (fIv) {
1011
1063
  const ovfLift = plan.ovfLift;
1064
+ const ovfWrite = {
1065
+ kind: "recordKeySet",
1066
+ obj: outRef,
1067
+ shapeId: toId,
1068
+ key: varRef("k.0", STRING, loc),
1069
+ value: intoSlot({
1070
+ kind: "recordKeyGet",
1071
+ obj: sRef,
1072
+ shapeId: fromId,
1073
+ key: varRef("k.0", STRING, loc),
1074
+ overflowOnly: true,
1075
+ type: fIv,
1076
+ loc,
1077
+ }, ovfLift),
1078
+ loc,
1079
+ };
1080
+ let notExcluded = null;
1081
+ for (const name of [...excluded].sort()) {
1082
+ const test = {
1083
+ kind: "strEq",
1084
+ negated: true,
1085
+ left: varRef("k.0", STRING, loc),
1086
+ right: { kind: "strLit", value: name, type: STRING, loc },
1087
+ type: BOOL,
1088
+ loc,
1089
+ };
1090
+ notExcluded =
1091
+ notExcluded === null
1092
+ ? test
1093
+ : { kind: "logical", op: "&&", left: notExcluded, right: test, type: BOOL, loc };
1094
+ }
1012
1095
  body.push({
1013
1096
  kind: "varDecl",
1014
1097
  localId: "ks.0",
@@ -1034,22 +1117,9 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
1034
1117
  },
1035
1118
  loc,
1036
1119
  },
1037
- {
1038
- kind: "recordKeySet",
1039
- obj: outRef,
1040
- shapeId: toId,
1041
- key: varRef("k.0", STRING, loc),
1042
- value: intoSlot({
1043
- kind: "recordKeyGet",
1044
- obj: sRef,
1045
- shapeId: fromId,
1046
- key: varRef("k.0", STRING, loc),
1047
- overflowOnly: true,
1048
- type: fIv,
1049
- loc,
1050
- }, ovfLift),
1051
- loc,
1052
- },
1120
+ notExcluded === null
1121
+ ? ovfWrite
1122
+ : { kind: "if", cond: notExcluded, then: [ovfWrite], else_: null, loc },
1053
1123
  ]));
1054
1124
  }
1055
1125
  // A CLOSED source can still hold own keys its shape does not declare: a
@@ -1066,7 +1136,8 @@ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
1066
1136
  // and the view can only exist if the program converts something into a
1067
1137
  // closed record at all. Both facts are settled before the shape helpers
1068
1138
  // finalize their bodies, so the tail is chosen there.
1069
- const sourcedFromView = fIv === null &&
1139
+ const sourcedFromView = opts.keepSourceTail &&
1140
+ fIv === null &&
1070
1141
  recordMayKeepSource(lowerer, fromT) &&
1071
1142
  canDynCheckTo(toT, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id));
1072
1143
  body.push({ kind: "return", value: outRef, loc });
@@ -1168,9 +1239,28 @@ export function lowerObjectAssignIndexShape(lowerer, call) {
1168
1239
  return "dyn";
1169
1240
  return lowerer.widthLiftPlan(t, tIv);
1170
1241
  };
1242
+ // A dyn source's values arrive untyped, so each one enters the target's
1243
+ // index-value slot through a CHECKED conversion: a value outside the
1244
+ // slot throws the catchable TypeError where JS stores it (SEMANTICS.md's
1245
+ // cast divergence, the same stance every dyn→typed conversion takes). A
1246
+ // runtime key can collide with a DECLARED target field, and the keyed
1247
+ // write stores a non-dyn value through such a slot unchecked — so those
1248
+ // fields must be the slot type (or, for a dyn slot, dyn-convertible).
1249
+ const dynSourceOpen = tIv.kind === "dyn"
1250
+ ? to.fields.every((f) => lowerer.dynConvertible(f.type))
1251
+ : canDynCheckTo(tIv, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)) && to.fields.every((f) => typeEquals(f.type, tIv));
1171
1252
  const plans = [];
1172
1253
  for (const argNode of call.arguments.nodes.slice(1)) {
1173
1254
  const srcIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
1255
+ if (srcIr?.kind === "dyn") {
1256
+ // The target keeps its typed representation while the checker's
1257
+ // `T & U` answer for a dyn `U` is some other type, so only the
1258
+ // mutate-in-place spelling (result discarded) can be lowered.
1259
+ if (!discarded || !dynSourceOpen)
1260
+ return null;
1261
+ plans.push({ kind: "dyn" });
1262
+ continue;
1263
+ }
1174
1264
  if (srcIr?.kind !== "record")
1175
1265
  return null;
1176
1266
  const from = lowerer.shapes.get(srcIr.shapeId);
@@ -1198,7 +1288,7 @@ export function lowerObjectAssignIndexShape(lowerer, call) {
1198
1288
  if (ovfLift === null)
1199
1289
  return null;
1200
1290
  }
1201
- plans.push({ fromId: srcIr.shapeId, fields, ovfLift });
1291
+ plans.push({ kind: "record", fromId: srcIr.shapeId, fields, ovfLift });
1202
1292
  }
1203
1293
  const helperFor = (plan) => {
1204
1294
  const key = `assign:${targetIr.shapeId}:${plan.fromId}`;
@@ -1331,13 +1421,106 @@ export function lowerObjectAssignIndexShape(lowerer, call) {
1331
1421
  lowerer.liftedFns.push(fn);
1332
1422
  return name;
1333
1423
  };
1424
+ /** Interned `%obj.assignDyn.<n>(t, s)` — the same keyed-write walk for a
1425
+ * source with no static shape: `Object.keys(s)` own-key order (what
1426
+ * `Object.assign` copies), each value read back through the key and
1427
+ * checked into the target's index-value slot by the keyed write. A
1428
+ * null/undefined source copies nothing, exactly JS's rule that
1429
+ * `Object.assign` SKIPS such sources (where `Object.keys` would throw). */
1430
+ const dynHelperFor = () => {
1431
+ const key = `assign:${targetIr.shapeId}:dyn`;
1432
+ const existing = lowerer.valueHelpers.get(key);
1433
+ if (existing)
1434
+ return existing;
1435
+ const name = keyedHelperName(lowerer, "%obj.assignDyn", key);
1436
+ lowerer.valueHelpers.set(key, name);
1437
+ const toT = { kind: "record", shapeId: targetIr.shapeId };
1438
+ const tRef = varRef("t.0", toT, loc);
1439
+ const sRef = varRef("s.0", DYN, loc);
1440
+ const ksT = arrayOf(STRING);
1441
+ const kRef = varRef("k.0", STRING, loc);
1442
+ const read = { kind: "dynKeyGet", key: kRef, value: sRef, type: DYN, loc };
1443
+ const value = tIv.kind === "dyn" ? read : { kind: "dynCheck", value: read, type: tIv, loc };
1444
+ const fn = {
1445
+ name,
1446
+ params: [
1447
+ { localId: "t.0", name: "t", type: toT },
1448
+ { localId: "s.0", name: "s", type: DYN },
1449
+ ],
1450
+ returnType: toT,
1451
+ locals: [
1452
+ { id: "t.0", name: "t", type: toT, mutable: true },
1453
+ { id: "s.0", name: "s", type: DYN, mutable: false },
1454
+ { id: "ks.0", name: "ks", type: ksT, mutable: false },
1455
+ { id: "i.0", name: "i", type: F64, mutable: true },
1456
+ { id: "k.0", name: "k", type: STRING, mutable: false },
1457
+ ],
1458
+ body: [
1459
+ {
1460
+ kind: "if",
1461
+ cond: { kind: "dynTest", test: "nullish", value: sRef, type: BOOL, loc },
1462
+ then: [{ kind: "return", value: tRef, loc }],
1463
+ else_: [
1464
+ {
1465
+ kind: "varDecl",
1466
+ localId: "ks.0",
1467
+ init: {
1468
+ kind: "libCall",
1469
+ fn: "dyn.objKeyStrings",
1470
+ args: [sRef],
1471
+ type: ksT,
1472
+ loc,
1473
+ },
1474
+ loc,
1475
+ },
1476
+ countedFor(loc, {
1477
+ kind: "arrIntrinsic",
1478
+ method: "length",
1479
+ receiver: varRef("ks.0", ksT, loc),
1480
+ args: [],
1481
+ type: F64,
1482
+ loc,
1483
+ }, () => [
1484
+ {
1485
+ kind: "varDecl",
1486
+ localId: "k.0",
1487
+ init: {
1488
+ kind: "arrayGet",
1489
+ arr: varRef("ks.0", ksT, loc),
1490
+ index: varRef("i.0", F64, loc),
1491
+ type: STRING,
1492
+ loc,
1493
+ },
1494
+ loc,
1495
+ },
1496
+ {
1497
+ kind: "recordKeySet",
1498
+ obj: tRef,
1499
+ shapeId: targetIr.shapeId,
1500
+ key: kRef,
1501
+ value,
1502
+ loc,
1503
+ },
1504
+ ]),
1505
+ ],
1506
+ loc,
1507
+ },
1508
+ { kind: "return", value: tRef, loc },
1509
+ ],
1510
+ loc,
1511
+ };
1512
+ lowerer.liftedFns.push(fn);
1513
+ return name;
1514
+ };
1334
1515
  let acc = lowerer.lowerExprExpecting(call.arguments.nodes[0], targetIr);
1335
1516
  for (let i = 0; i < plans.length; i++) {
1336
- const src = lowerer.lowerExprExpecting(call.arguments.nodes[i + 1], {
1337
- kind: "record",
1338
- shapeId: plans[i].fromId,
1339
- });
1340
- acc = { kind: "call", callee: helperFor(plans[i]), args: [acc, src], type: targetIr, loc };
1517
+ const plan = plans[i];
1518
+ const argNode = call.arguments.nodes[i + 1];
1519
+ const src = plan.kind === "dyn"
1520
+ ? lowerer.coerceToExpected(lowerer.lowerExpr(argNode), DYN)
1521
+ : lowerer.lowerExprExpecting(argNode, { kind: "record", shapeId: plan.fromId });
1522
+ const callee = plan.kind === "dyn" ? dynHelperFor() : helperFor(plan);
1523
+ acc = { kind: "call", callee, args: [acc, src], type: targetIr, loc };
1341
1524
  }
1342
1525
  return acc;
1343
1526
  }