@scriptc/compiler 0.1.7 → 0.2.1

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 (1043) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +98 -39
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +15 -0
  4. package/dist/backend/build-cache.d.ts +1 -3
  5. package/dist/backend/build-cache.js +3 -22
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cache-root.d.ts +3 -0
  8. package/dist/backend/cache-root.js +23 -0
  9. package/dist/backend/cache-root.js.map +1 -0
  10. package/dist/backend/cycle-analysis.d.ts +15 -0
  11. package/dist/backend/cycle-analysis.js +108 -0
  12. package/dist/backend/cycle-analysis.js.map +1 -0
  13. package/dist/backend/cycle-analysis.test.js +124 -0
  14. package/dist/backend/cycle-analysis.test.js.map +1 -0
  15. package/dist/backend/executable-features.d.ts +4 -0
  16. package/dist/backend/executable-features.js +42 -0
  17. package/dist/backend/executable-features.js.map +1 -0
  18. package/dist/backend/external-c.d.ts +5 -27
  19. package/dist/backend/external-c.js +5 -40
  20. package/dist/backend/external-c.js.map +1 -1
  21. package/dist/backend/ffi-callbacks.d.ts +2 -3
  22. package/dist/backend/ffi-callbacks.js +2 -3
  23. package/dist/backend/ffi-callbacks.js.map +1 -1
  24. package/dist/backend/library-identity-markers.d.ts +4 -9
  25. package/dist/backend/library-identity-markers.js +11 -49
  26. package/dist/backend/library-identity-markers.js.map +1 -1
  27. package/dist/backend/library-pack.d.ts +5 -0
  28. package/dist/backend/library-pack.js +123 -0
  29. package/dist/backend/library-pack.js.map +1 -0
  30. package/dist/backend/link-plan-core.d.ts +20 -0
  31. package/dist/backend/link-plan-core.js +18 -0
  32. package/dist/backend/link-plan-core.js.map +1 -0
  33. package/dist/backend/link-plan.d.ts +1 -1
  34. package/dist/backend/link-plan.js +16 -17
  35. package/dist/backend/link-plan.js.map +1 -1
  36. package/dist/backend/link-trace.d.ts +2 -0
  37. package/dist/backend/link-trace.js +24 -0
  38. package/dist/backend/link-trace.js.map +1 -0
  39. package/dist/backend/linker.js +1 -1
  40. package/dist/backend/linker.js.map +1 -1
  41. package/dist/backend/literals.d.ts +9 -0
  42. package/dist/backend/literals.js +35 -0
  43. package/dist/backend/literals.js.map +1 -0
  44. package/dist/backend/literals.test.d.ts +1 -0
  45. package/dist/backend/literals.test.js +53 -0
  46. package/dist/backend/literals.test.js.map +1 -0
  47. package/dist/backend/llvm/blocks.d.ts +2 -0
  48. package/dist/backend/llvm/blocks.js +9 -4
  49. package/dist/backend/llvm/blocks.js.map +1 -1
  50. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  51. package/dist/backend/llvm/blocks.test.js +91 -0
  52. package/dist/backend/llvm/blocks.test.js.map +1 -0
  53. package/dist/backend/llvm/classes.d.ts +14 -8
  54. package/dist/backend/llvm/classes.js +88 -30
  55. package/dist/backend/llvm/classes.js.map +1 -1
  56. package/dist/backend/llvm/common.d.ts +5 -1
  57. package/dist/backend/llvm/common.js +45 -4
  58. package/dist/backend/llvm/common.js.map +1 -1
  59. package/dist/backend/llvm/debug-info.js +2 -7
  60. package/dist/backend/llvm/debug-info.js.map +1 -1
  61. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  62. package/dist/backend/llvm/debug-info.test.js +110 -0
  63. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  64. package/dist/backend/llvm/dyn.d.ts +21 -2
  65. package/dist/backend/llvm/dyn.js +647 -251
  66. package/dist/backend/llvm/dyn.js.map +1 -1
  67. package/dist/backend/llvm/emitter.d.ts +596 -1
  68. package/dist/backend/llvm/emitter.js +769 -425
  69. package/dist/backend/llvm/emitter.js.map +1 -1
  70. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  71. package/dist/backend/llvm/emitter.test.js +179 -0
  72. package/dist/backend/llvm/emitter.test.js.map +1 -0
  73. package/dist/backend/llvm/expr-async.js +23 -14
  74. package/dist/backend/llvm/expr-async.js.map +1 -1
  75. package/dist/backend/llvm/expr-bytes.d.ts +2 -2
  76. package/dist/backend/llvm/expr-bytes.js +60 -31
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  79. package/dist/backend/llvm/expr-callbacks.js +25 -22
  80. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  81. package/dist/backend/llvm/expr-calls.js +136 -35
  82. package/dist/backend/llvm/expr-calls.js.map +1 -1
  83. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  84. package/dist/backend/llvm/expr-containers.js +43 -14
  85. package/dist/backend/llvm/expr-containers.js.map +1 -1
  86. package/dist/backend/llvm/expr-context.d.ts +5 -260
  87. package/dist/backend/llvm/expr-control.js +10 -6
  88. package/dist/backend/llvm/expr-control.js.map +1 -1
  89. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  90. package/dist/backend/llvm/expr-dispatch.js +2 -0
  91. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  92. package/dist/backend/llvm/expr-dynamic.js +78 -81
  93. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  94. package/dist/backend/llvm/expr-island.d.ts +1 -1
  95. package/dist/backend/llvm/expr-island.js +11 -7
  96. package/dist/backend/llvm/expr-island.js.map +1 -1
  97. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  98. package/dist/backend/llvm/expr-primitives.js +62 -31
  99. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  100. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  101. package/dist/backend/llvm/expr-records.d.ts +5 -1
  102. package/dist/backend/llvm/expr-records.js +54 -7
  103. package/dist/backend/llvm/expr-records.js.map +1 -1
  104. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  105. package/dist/backend/llvm/expr-stream-bridges.js +220 -131
  106. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  107. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  108. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  109. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  110. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  111. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  112. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  113. package/dist/backend/llvm/layouts.d.ts +19 -0
  114. package/dist/backend/llvm/layouts.js +12 -0
  115. package/dist/backend/llvm/layouts.js.map +1 -0
  116. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  117. package/dist/backend/llvm/lib-abi.js +82 -0
  118. package/dist/backend/llvm/lib-abi.js.map +1 -0
  119. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  120. package/dist/backend/llvm/lib-connect.js +51 -0
  121. package/dist/backend/llvm/lib-connect.js.map +1 -0
  122. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  123. package/dist/backend/llvm/lib-datagram.js +135 -0
  124. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  125. package/dist/backend/llvm/lib-dispatch.js +50 -6
  126. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  127. package/dist/backend/llvm/lib-filesystem.js +30 -18
  128. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  129. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  130. package/dist/backend/llvm/lib-http2.js +215 -0
  131. package/dist/backend/llvm/lib-http2.js.map +1 -0
  132. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  133. package/dist/backend/llvm/lib-lookup.js +39 -0
  134. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  135. package/dist/backend/llvm/lib-network.js +25 -2
  136. package/dist/backend/llvm/lib-network.js.map +1 -1
  137. package/dist/backend/llvm/lib-process.js +44 -19
  138. package/dist/backend/llvm/lib-process.js.map +1 -1
  139. package/dist/backend/llvm/lib-shared.js +162 -3
  140. package/dist/backend/llvm/lib-shared.js.map +1 -1
  141. package/dist/backend/llvm/lib-stream.js +3 -2
  142. package/dist/backend/llvm/lib-stream.js.map +1 -1
  143. package/dist/backend/llvm/lib-test.d.ts +2 -0
  144. package/dist/backend/llvm/lib-test.js +34 -0
  145. package/dist/backend/llvm/lib-test.js.map +1 -0
  146. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  147. package/dist/backend/llvm/lib-tls.js +82 -0
  148. package/dist/backend/llvm/lib-tls.js.map +1 -0
  149. package/dist/backend/llvm/shapes.d.ts +10 -9
  150. package/dist/backend/llvm/shapes.js +42 -131
  151. package/dist/backend/llvm/shapes.js.map +1 -1
  152. package/dist/backend/llvm/unsupported.d.ts +1 -0
  153. package/dist/backend/llvm/unsupported.js +1 -2
  154. package/dist/backend/llvm/unsupported.js.map +1 -1
  155. package/dist/backend/llvm/walkers.js +1 -7
  156. package/dist/backend/llvm/walkers.js.map +1 -1
  157. package/dist/backend/mangle.d.ts +2 -2
  158. package/dist/backend/mangle.js +16 -5
  159. package/dist/backend/mangle.js.map +1 -1
  160. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  161. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  162. package/dist/backend/may-throw.js.map +1 -0
  163. package/dist/backend/may-throw.test.d.ts +1 -0
  164. package/dist/backend/may-throw.test.js +58 -0
  165. package/dist/backend/may-throw.test.js.map +1 -0
  166. package/dist/backend/native-codegen-core.d.ts +22 -0
  167. package/dist/backend/native-codegen-core.js +44 -0
  168. package/dist/backend/native-codegen-core.js.map +1 -0
  169. package/dist/backend/native-codegen.d.ts +3 -19
  170. package/dist/backend/native-codegen.js +5 -44
  171. package/dist/backend/native-codegen.js.map +1 -1
  172. package/dist/backend/native-codegen.test.js +2 -2
  173. package/dist/backend/native-codegen.test.js.map +1 -1
  174. package/dist/backend/native-link-info-core.d.ts +94 -0
  175. package/dist/backend/native-link-info-core.js +62 -0
  176. package/dist/backend/native-link-info-core.js.map +1 -0
  177. package/dist/backend/native-link-info.d.ts +3 -88
  178. package/dist/backend/native-link-info.js +12 -243
  179. package/dist/backend/native-link-info.js.map +1 -1
  180. package/dist/backend/native-link-info.test.js +41 -146
  181. package/dist/backend/native-link-info.test.js.map +1 -1
  182. package/dist/backend/native-toolchain.d.ts +12 -30
  183. package/dist/backend/native-toolchain.js +83 -233
  184. package/dist/backend/native-toolchain.js.map +1 -1
  185. package/dist/backend/native-toolchain.test.js +77 -5
  186. package/dist/backend/native-toolchain.test.js.map +1 -1
  187. package/dist/backend/native-tools.d.ts +24 -0
  188. package/dist/backend/native-tools.js +33 -0
  189. package/dist/backend/native-tools.js.map +1 -0
  190. package/dist/backend/object-localize.js +19 -8
  191. package/dist/backend/object-localize.js.map +1 -1
  192. package/dist/backend/object-localize.test.js +22 -0
  193. package/dist/backend/object-localize.test.js.map +1 -1
  194. package/dist/backend/runtime-abi.d.ts +2 -2
  195. package/dist/backend/runtime-abi.js +2 -2
  196. package/dist/backend/runtime-pack-core.d.ts +101 -0
  197. package/dist/backend/runtime-pack-core.js +172 -0
  198. package/dist/backend/runtime-pack-core.js.map +1 -0
  199. package/dist/backend/runtime-pack-native.d.ts +21 -0
  200. package/dist/backend/runtime-pack-native.js +73 -0
  201. package/dist/backend/runtime-pack-native.js.map +1 -0
  202. package/dist/backend/runtime-pack-targets.test.js +1 -1
  203. package/dist/backend/runtime-pack.d.ts +3 -83
  204. package/dist/backend/runtime-pack.js +8 -151
  205. package/dist/backend/runtime-pack.js.map +1 -1
  206. package/dist/backend/runtime-pack.test.js +24 -1
  207. package/dist/backend/runtime-pack.test.js.map +1 -1
  208. package/dist/backend/target-diagnostics.d.ts +22 -0
  209. package/dist/backend/target-diagnostics.js +108 -0
  210. package/dist/backend/target-diagnostics.js.map +1 -0
  211. package/dist/backend/target-platform.d.ts +15 -0
  212. package/dist/backend/target-platform.js +72 -0
  213. package/dist/backend/target-platform.js.map +1 -0
  214. package/dist/backend/targets.d.ts +13 -4
  215. package/dist/backend/targets.js +103 -34
  216. package/dist/backend/targets.js.map +1 -1
  217. package/dist/backend/targets.test.js +72 -4
  218. package/dist/backend/targets.test.js.map +1 -1
  219. package/dist/backend/toolchain-environment.d.ts +6 -0
  220. package/dist/backend/toolchain-environment.js +99 -0
  221. package/dist/backend/toolchain-environment.js.map +1 -0
  222. package/dist/backend/vendor-archives.d.ts +1 -9
  223. package/dist/backend/vendor-archives.js +2 -9
  224. package/dist/backend/vendor-archives.js.map +1 -1
  225. package/dist/backend/vendor-inputs.d.ts +9 -0
  226. package/dist/backend/vendor-inputs.js +10 -0
  227. package/dist/backend/vendor-inputs.js.map +1 -0
  228. package/dist/backend/warm-cache.d.ts +3 -0
  229. package/dist/backend/warm-cache.js +41 -0
  230. package/dist/backend/warm-cache.js.map +1 -0
  231. package/dist/cli/command.d.ts +3 -0
  232. package/dist/cli/command.js +328 -0
  233. package/dist/cli/command.js.map +1 -0
  234. package/dist/cli/host.d.ts +24 -0
  235. package/dist/cli/host.js +2 -0
  236. package/dist/cli/host.js.map +1 -0
  237. package/dist/cli/output-options.d.ts +26 -0
  238. package/dist/cli/output-options.js +60 -0
  239. package/dist/cli/output-options.js.map +1 -0
  240. package/dist/cli/paths.d.ts +12 -0
  241. package/dist/cli/paths.js +42 -0
  242. package/dist/cli/paths.js.map +1 -0
  243. package/dist/cli/usage.d.ts +74 -0
  244. package/dist/cli/usage.js +86 -0
  245. package/dist/cli/usage.js.map +1 -0
  246. package/dist/cli/wasi-paths.d.ts +8 -0
  247. package/dist/cli/wasi-paths.js +41 -0
  248. package/dist/cli/wasi-paths.js.map +1 -0
  249. package/dist/cli/wasi-runner.d.ts +2 -0
  250. package/dist/cli/wasi-runner.js +28 -0
  251. package/dist/cli/wasi-runner.js.map +1 -0
  252. package/dist/compat/fetch-profile.js +37 -7
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +162 -0
  255. package/dist/compile-types.js +2 -0
  256. package/dist/compile-types.js.map +1 -0
  257. package/dist/coverage/report.js +11 -5
  258. package/dist/coverage/report.js.map +1 -1
  259. package/dist/coverage/surface-manifest.js +5 -2
  260. package/dist/coverage/surface-manifest.js.map +1 -1
  261. package/dist/diagnostics/diagnostic.js +5 -10
  262. package/dist/diagnostics/diagnostic.js.map +1 -1
  263. package/dist/executable/executable-cache.d.ts +3 -4
  264. package/dist/executable/executable-cache.js +5 -6
  265. package/dist/executable/executable-cache.js.map +1 -1
  266. package/dist/executable/executable-cache.test.js +16 -17
  267. package/dist/executable/executable-cache.test.js.map +1 -1
  268. package/dist/executable/prepare.d.ts +14 -0
  269. package/dist/executable/prepare.js +66 -0
  270. package/dist/executable/prepare.js.map +1 -0
  271. package/dist/ffi/ffi-manifest.d.ts +11 -4
  272. package/dist/ffi/ffi-manifest.js +170 -58
  273. package/dist/ffi/ffi-manifest.js.map +1 -1
  274. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  275. package/dist/ffi/ffi-manifest.test.js +111 -0
  276. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  277. package/dist/format-integer.d.ts +3 -0
  278. package/dist/format-integer.js +14 -0
  279. package/dist/format-integer.js.map +1 -0
  280. package/dist/frontend/analysis.d.ts +5 -0
  281. package/dist/frontend/analysis.js +88 -0
  282. package/dist/frontend/analysis.js.map +1 -0
  283. package/dist/frontend/arguments-usage.d.ts +1 -3
  284. package/dist/frontend/arguments-usage.js.map +1 -1
  285. package/dist/frontend/builtin-modules.d.ts +1 -1
  286. package/dist/frontend/builtin-modules.js +1 -1
  287. package/dist/frontend/builtin-modules.js.map +1 -1
  288. package/dist/frontend/cjs-lexer.d.ts +4 -25
  289. package/dist/frontend/cjs-lexer.js +6 -806
  290. package/dist/frontend/cjs-lexer.js.map +1 -1
  291. package/dist/frontend/cjs-resolve.d.ts +5 -0
  292. package/dist/frontend/cjs-resolve.js +429 -0
  293. package/dist/frontend/cjs-resolve.js.map +1 -0
  294. package/dist/frontend/cjs-syntax.d.ts +26 -0
  295. package/dist/frontend/cjs-syntax.js +806 -0
  296. package/dist/frontend/cjs-syntax.js.map +1 -0
  297. package/dist/frontend/comptime-node.d.ts +4 -0
  298. package/dist/frontend/comptime-node.js +16 -0
  299. package/dist/frontend/comptime-node.js.map +1 -0
  300. package/dist/frontend/comptime-node.test.d.ts +1 -0
  301. package/dist/frontend/comptime-node.test.js +37 -0
  302. package/dist/frontend/comptime-node.test.js.map +1 -0
  303. package/dist/frontend/dts-paths.d.ts +3 -4
  304. package/dist/frontend/dts-paths.js +15 -8
  305. package/dist/frontend/dts-paths.js.map +1 -1
  306. package/dist/frontend/fork-target.js +2 -2
  307. package/dist/frontend/fork-target.js.map +1 -1
  308. package/dist/frontend/helper-tokens.d.ts +1 -0
  309. package/dist/frontend/helper-tokens.js +147 -0
  310. package/dist/frontend/helper-tokens.js.map +1 -0
  311. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  312. package/dist/frontend/helper-tokens.test.js +35 -0
  313. package/dist/frontend/helper-tokens.test.js.map +1 -0
  314. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  315. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  316. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  317. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  318. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  319. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  320. package/dist/frontend/input-tracker.d.ts +5 -2
  321. package/dist/frontend/input-tracker.js +24 -3
  322. package/dist/frontend/input-tracker.js.map +1 -1
  323. package/dist/frontend/input-tracker.test.js +23 -0
  324. package/dist/frontend/input-tracker.test.js.map +1 -1
  325. package/dist/frontend/lib-contract.js +32 -24
  326. package/dist/frontend/lib-contract.js.map +1 -1
  327. package/dist/frontend/literal-values.d.ts +4 -0
  328. package/dist/frontend/literal-values.js +21 -0
  329. package/dist/frontend/literal-values.js.map +1 -0
  330. package/dist/frontend/literal-values.test.d.ts +1 -0
  331. package/dist/frontend/literal-values.test.js +91 -0
  332. package/dist/frontend/literal-values.test.js.map +1 -0
  333. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  334. package/dist/frontend/lowering/abstract-equality.js +3 -0
  335. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  336. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  337. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  338. package/dist/frontend/lowering/array-values.d.ts +4 -1
  339. package/dist/frontend/lowering/array-values.js +43 -1
  340. package/dist/frontend/lowering/array-values.js.map +1 -1
  341. package/dist/frontend/lowering/callback-arg.js +1 -0
  342. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  343. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  344. package/dist/frontend/lowering/class-callbacks.js +74 -0
  345. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  346. package/dist/frontend/lowering/class-construction.d.ts +12 -0
  347. package/dist/frontend/lowering/class-construction.js +156 -0
  348. package/dist/frontend/lowering/class-construction.js.map +1 -0
  349. package/dist/frontend/lowering/class-descriptors.d.ts +10 -0
  350. package/dist/frontend/lowering/class-descriptors.js +114 -0
  351. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +51 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +1158 -0
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  355. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  356. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +93 -0
  357. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  358. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  359. package/dist/frontend/lowering/class-instance-constructor.js +67 -0
  360. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  361. package/dist/frontend/lowering/class-method-values.d.ts +13 -0
  362. package/dist/frontend/lowering/class-method-values.js +235 -0
  363. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  364. package/dist/frontend/lowering/class-prototypes.d.ts +19 -0
  365. package/dist/frontend/lowering/class-prototypes.js +242 -0
  366. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  367. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  368. package/dist/frontend/lowering/class-runtime-statics.js +66 -0
  369. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
  370. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  371. package/dist/frontend/lowering/class-static-data.js +56 -0
  372. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  373. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  374. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  375. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  376. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  377. package/dist/frontend/lowering/containers/bytes.js +208 -163
  378. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  379. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  380. package/dist/frontend/lowering/containers/string-and-regexp.js +58 -63
  381. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  382. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  383. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  384. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  385. package/dist/frontend/lowering/error-methods.d.ts +14 -0
  386. package/dist/frontend/lowering/error-methods.js +177 -0
  387. package/dist/frontend/lowering/error-methods.js.map +1 -0
  388. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  389. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  390. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  391. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  392. package/dist/frontend/lowering/expressions/native-proxy.js +51 -0
  393. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  394. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  395. package/dist/frontend/lowering/expressions/nullish-assignment.js +132 -0
  396. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  397. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  398. package/dist/frontend/lowering/expressions/object-literals.js +509 -183
  399. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  400. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
  401. package/dist/frontend/lowering/expressions/optional-chains.js +88 -24
  402. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  403. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  404. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  405. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  406. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  407. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  408. package/dist/frontend/lowering/function-context.d.ts +101 -0
  409. package/dist/frontend/lowering/function-context.js +109 -0
  410. package/dist/frontend/lowering/function-context.js.map +1 -0
  411. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  412. package/dist/frontend/lowering/generator-delegation.js +85 -0
  413. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  414. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +11 -0
  415. package/dist/frontend/lowering/generator-dynamic-dispatch.js +143 -0
  416. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  417. package/dist/frontend/lowering/lib-boundary.d.ts +4 -1
  418. package/dist/frontend/lowering/lib-boundary.js +112 -20
  419. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  420. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  421. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  422. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  423. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  424. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  425. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  426. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  427. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  428. package/dist/frontend/lowering/lower-builtin-values.d.ts +18 -0
  429. package/dist/frontend/lowering/lower-builtin-values.js +249 -0
  430. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  431. package/dist/frontend/lowering/lower-builtins.d.ts +33 -46
  432. package/dist/frontend/lowering/lower-builtins.js +676 -365
  433. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  434. package/dist/frontend/lowering/lower-calls.d.ts +28 -22
  435. package/dist/frontend/lowering/lower-calls.js +1660 -412
  436. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  437. package/dist/frontend/lowering/lower-classes.d.ts +95 -57
  438. package/dist/frontend/lowering/lower-classes.js +1491 -404
  439. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  440. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  441. package/dist/frontend/lowering/lower-comptime.js +23 -32
  442. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  443. package/dist/frontend/lowering/lower-containers.d.ts +36 -32
  444. package/dist/frontend/lowering/lower-containers.js +925 -181
  445. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  446. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  447. package/dist/frontend/lowering/lower-dgram.js +3 -2
  448. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  449. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  450. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  451. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  452. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  453. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  454. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  455. package/dist/frontend/lowering/lower-expando.js +14 -6
  456. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  457. package/dist/frontend/lowering/lower-exprs.d.ts +37 -13
  458. package/dist/frontend/lowering/lower-exprs.js +2163 -863
  459. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  460. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  461. package/dist/frontend/lowering/lower-generators.js +88 -46
  462. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  463. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  464. package/dist/frontend/lowering/lower-global-value.js +17 -0
  465. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  466. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  467. package/dist/frontend/lowering/lower-inspect.js +17 -8
  468. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  469. package/dist/frontend/lowering/lower-island.d.ts +7 -8
  470. package/dist/frontend/lowering/lower-island.js +66 -33
  471. package/dist/frontend/lowering/lower-island.js.map +1 -1
  472. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  473. package/dist/frontend/lowering/lower-mixins.js +5 -3
  474. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  475. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  476. package/dist/frontend/lowering/lower-modules.js +445 -39
  477. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  478. package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
  479. package/dist/frontend/lowering/lower-modules.test.js +39 -0
  480. package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  482. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  483. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +13 -10
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  487. package/dist/frontend/lowering/lower-server.js +6 -10
  488. package/dist/frontend/lowering/lower-server.js.map +1 -1
  489. package/dist/frontend/lowering/lower-stmts.d.ts +17 -17
  490. package/dist/frontend/lowering/lower-stmts.js +855 -514
  491. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  492. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +20 -11
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-test.js.map +1 -1
  497. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  498. package/dist/frontend/lowering/lower-url.js +77 -0
  499. package/dist/frontend/lowering/lower-url.js.map +1 -0
  500. package/dist/frontend/lowering/lowerer.d.ts +140 -190
  501. package/dist/frontend/lowering/lowerer.js +1193 -712
  502. package/dist/frontend/lowering/lowerer.js.map +1 -1
  503. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  504. package/dist/frontend/lowering/lowerer.test.js +172 -0
  505. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  506. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  507. package/dist/frontend/lowering/native-ffi.js +40 -0
  508. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  509. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  510. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  511. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  512. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  513. package/dist/frontend/lowering/object-factory-new.js +68 -0
  514. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  515. package/dist/frontend/lowering/optional-arguments.js +6 -1
  516. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  517. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  518. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  519. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  520. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  521. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  522. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  523. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  524. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  525. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  526. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  527. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  528. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  529. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  530. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  531. package/dist/frontend/lowering/static-this.d.ts +5 -1
  532. package/dist/frontend/lowering/static-this.js +28 -2
  533. package/dist/frontend/lowering/static-this.js.map +1 -1
  534. package/dist/frontend/lowering/string-index.d.ts +7 -0
  535. package/dist/frontend/lowering/string-index.js +39 -0
  536. package/dist/frontend/lowering/string-index.js.map +1 -0
  537. package/dist/frontend/lowering/surfaces.d.ts +10 -3
  538. package/dist/frontend/lowering/surfaces.js +86 -37
  539. package/dist/frontend/lowering/surfaces.js.map +1 -1
  540. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  541. package/dist/frontend/lowering/symbol-fields.js +183 -0
  542. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  543. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  544. package/dist/frontend/lowering/symbol-methods.js +30 -0
  545. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  546. package/dist/frontend/lowering/text-decoder-encoding.d.ts +12 -0
  547. package/dist/frontend/lowering/text-decoder-encoding.js +82 -0
  548. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  549. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  550. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  551. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  552. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  553. package/dist/frontend/lowering/union-narrow.js +59 -0
  554. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  555. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  556. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  557. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  558. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  559. package/dist/frontend/lowering/union-retag.js +259 -0
  560. package/dist/frontend/lowering/union-retag.js.map +1 -0
  561. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  562. package/dist/frontend/lowering/union-retag.test.js +405 -0
  563. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  564. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  565. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  566. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  567. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  568. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  569. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  570. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  571. package/dist/frontend/lowering/width-lift.js +2 -0
  572. package/dist/frontend/lowering/width-lift.js.map +1 -0
  573. package/dist/frontend/module-syntax.d.ts +58 -0
  574. package/dist/frontend/module-syntax.js +123 -0
  575. package/dist/frontend/module-syntax.js.map +1 -0
  576. package/dist/frontend/module-syntax.test.d.ts +1 -0
  577. package/dist/frontend/module-syntax.test.js +78 -0
  578. package/dist/frontend/module-syntax.test.js.map +1 -0
  579. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  580. package/dist/frontend/npm-fetch-analysis.js +100 -0
  581. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  582. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  583. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  584. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  585. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  586. package/dist/frontend/npm-fetch-node.js +12 -0
  587. package/dist/frontend/npm-fetch-node.js.map +1 -0
  588. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  589. package/dist/frontend/npm-fetch-syntax.js +207 -0
  590. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  591. package/dist/frontend/npm-node.d.ts +10 -0
  592. package/dist/frontend/npm-node.js +14 -0
  593. package/dist/frontend/npm-node.js.map +1 -0
  594. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  595. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  596. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  597. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  598. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  599. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  600. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  601. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  602. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  603. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  604. package/dist/frontend/npm-static-declarations.js +22 -561
  605. package/dist/frontend/npm-static-declarations.js.map +1 -1
  606. package/dist/frontend/npm-static-declarations.test.js +245 -6
  607. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  608. package/dist/frontend/npm-static-prune.d.ts +1 -1
  609. package/dist/frontend/npm-static-prune.js +121 -38
  610. package/dist/frontend/npm-static-prune.js.map +1 -1
  611. package/dist/frontend/npm-static-prune.test.js +9 -1
  612. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  613. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  614. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  615. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  616. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  617. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  618. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  619. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  620. package/dist/frontend/npm-static-rewrite.js +2 -1079
  621. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  622. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  623. package/dist/frontend/npm-static-subtyping.js +55 -0
  624. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  625. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  626. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  627. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  628. package/dist/frontend/npm-static.d.ts +7 -15
  629. package/dist/frontend/npm-static.js +19 -28
  630. package/dist/frontend/npm-static.js.map +1 -1
  631. package/dist/frontend/npm.d.ts +8 -69
  632. package/dist/frontend/npm.js +21 -361
  633. package/dist/frontend/npm.js.map +1 -1
  634. package/dist/frontend/npm.test.js +2 -2
  635. package/dist/frontend/npm.test.js.map +1 -1
  636. package/dist/frontend/pipeline-native.d.ts +6 -0
  637. package/dist/frontend/pipeline-native.js +32 -0
  638. package/dist/frontend/pipeline-native.js.map +1 -0
  639. package/dist/frontend/pipeline.d.ts +54 -0
  640. package/dist/frontend/pipeline.js +382 -0
  641. package/dist/frontend/pipeline.js.map +1 -0
  642. package/dist/frontend/pipeline.test.d.ts +1 -0
  643. package/dist/frontend/pipeline.test.js +77 -0
  644. package/dist/frontend/pipeline.test.js.map +1 -0
  645. package/dist/frontend/program-analysis.d.ts +10 -0
  646. package/dist/frontend/program-analysis.js +14 -0
  647. package/dist/frontend/program-analysis.js.map +1 -0
  648. package/dist/frontend/program-node.d.ts +9 -0
  649. package/dist/frontend/program-node.js +48 -0
  650. package/dist/frontend/program-node.js.map +1 -0
  651. package/dist/frontend/program.d.ts +39 -20
  652. package/dist/frontend/program.js +393 -189
  653. package/dist/frontend/program.js.map +1 -1
  654. package/dist/frontend/program.test.js +105 -2
  655. package/dist/frontend/program.test.js.map +1 -1
  656. package/dist/frontend/provenance-core.d.ts +9 -0
  657. package/dist/frontend/provenance-core.js +435 -0
  658. package/dist/frontend/provenance-core.js.map +1 -0
  659. package/dist/frontend/provenance.d.ts +0 -4
  660. package/dist/frontend/provenance.js +4 -459
  661. package/dist/frontend/provenance.js.map +1 -1
  662. package/dist/frontend/resolve.d.ts +3 -1
  663. package/dist/frontend/resolve.js +6 -3
  664. package/dist/frontend/resolve.js.map +1 -1
  665. package/dist/frontend/runtime-resolve.d.ts +4 -3
  666. package/dist/frontend/runtime-resolve.js +22 -18
  667. package/dist/frontend/runtime-resolve.js.map +1 -1
  668. package/dist/frontend/runtime-resolve.test.js +53 -0
  669. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  670. package/dist/frontend/services-node.d.ts +5 -0
  671. package/dist/frontend/services-node.js +19 -0
  672. package/dist/frontend/services-node.js.map +1 -0
  673. package/dist/frontend/services-node.test.d.ts +1 -0
  674. package/dist/frontend/services-node.test.js +70 -0
  675. package/dist/frontend/services-node.test.js.map +1 -0
  676. package/dist/frontend/services.d.ts +44 -0
  677. package/dist/frontend/services.js +90 -0
  678. package/dist/frontend/services.js.map +1 -0
  679. package/dist/frontend/services.test.d.ts +1 -0
  680. package/dist/frontend/services.test.js +174 -0
  681. package/dist/frontend/services.test.js.map +1 -0
  682. package/dist/frontend/ts7/adapter.d.ts +3 -3
  683. package/dist/frontend/ts7/adapter.js +14 -31
  684. package/dist/frontend/ts7/adapter.js.map +1 -1
  685. package/dist/frontend/ts7/api.d.ts +16 -0
  686. package/dist/frontend/ts7/api.js +24 -0
  687. package/dist/frontend/ts7/api.js.map +1 -0
  688. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  689. package/dist/frontend/ts7/ast-bytes.js +137 -0
  690. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  691. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  692. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  693. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  694. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  695. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  696. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  697. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  698. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  699. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  700. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  701. package/dist/frontend/ts7/ast-node.js +448 -0
  702. package/dist/frontend/ts7/ast-node.js.map +1 -0
  703. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  704. package/dist/frontend/ts7/ast-node.test.js +266 -0
  705. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  706. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  707. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  708. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  709. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  710. package/dist/frontend/ts7/ast-text.js +124 -0
  711. package/dist/frontend/ts7/ast-text.js.map +1 -0
  712. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  713. package/dist/frontend/ts7/ast-text.test.js +38 -0
  714. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  715. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  716. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  717. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  718. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  719. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  720. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  721. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  722. package/dist/frontend/ts7/ast-types.js +3 -0
  723. package/dist/frontend/ts7/ast-types.js.map +1 -0
  724. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  725. package/dist/frontend/ts7/ast-wire.js +267 -0
  726. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  727. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  728. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  729. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  730. package/dist/frontend/ts7/ast.d.ts +14 -14
  731. package/dist/frontend/ts7/ast.js +25 -18
  732. package/dist/frontend/ts7/ast.js.map +1 -1
  733. package/dist/frontend/ts7/census-check.js +1 -0
  734. package/dist/frontend/ts7/census-check.js.map +1 -1
  735. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  736. package/dist/frontend/ts7/checker-cache.js +92 -0
  737. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  738. package/dist/frontend/ts7/checker.d.ts +19 -46
  739. package/dist/frontend/ts7/checker.js +231 -161
  740. package/dist/frontend/ts7/checker.js.map +1 -1
  741. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  742. package/dist/frontend/ts7/checker.test.js +335 -0
  743. package/dist/frontend/ts7/checker.test.js.map +1 -0
  744. package/dist/frontend/ts7/enums.d.ts +4 -27
  745. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  746. package/dist/frontend/ts7/enums.generated.js +1313 -0
  747. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  748. package/dist/frontend/ts7/enums.js +4 -45
  749. package/dist/frontend/ts7/enums.js.map +1 -1
  750. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  751. package/dist/frontend/ts7/enums.test.js +48 -0
  752. package/dist/frontend/ts7/enums.test.js.map +1 -0
  753. package/dist/frontend/ts7/native-api.d.ts +10 -0
  754. package/dist/frontend/ts7/native-api.js +10 -0
  755. package/dist/frontend/ts7/native-api.js.map +1 -0
  756. package/dist/frontend/ts7/native-host.d.ts +2 -0
  757. package/dist/frontend/ts7/native-host.js +11 -0
  758. package/dist/frontend/ts7/native-host.js.map +1 -0
  759. package/dist/frontend/ts7/native-process.d.ts +14 -0
  760. package/dist/frontend/ts7/native-process.js +62 -0
  761. package/dist/frontend/ts7/native-process.js.map +1 -0
  762. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  763. package/dist/frontend/ts7/program-adapter.js +16 -310
  764. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  765. package/dist/frontend/ts7/program-host.d.ts +115 -0
  766. package/dist/frontend/ts7/program-host.js +347 -0
  767. package/dist/frontend/ts7/program-host.js.map +1 -0
  768. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  769. package/dist/frontend/ts7/program-host.test.js +207 -0
  770. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  771. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  772. package/dist/frontend/ts7/rpc-api.js +23 -0
  773. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  774. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  775. package/dist/frontend/ts7/rpc-client.js +102 -0
  776. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  777. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  778. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  779. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  780. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  781. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  782. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  783. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  784. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  785. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  786. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  787. package/dist/frontend/ts7/rpc-process.js +148 -0
  788. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  789. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  790. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  791. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  792. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  793. package/dist/frontend/ts7/rpc-wire.js +195 -0
  794. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  795. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  796. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  797. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  798. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  799. package/dist/frontend/ts7/semantic-checker.js +221 -0
  800. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  801. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  802. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  803. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  804. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  805. package/dist/frontend/ts7/semantic-json.js +47 -0
  806. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  807. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  808. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  809. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  810. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  811. package/dist/frontend/ts7/semantic-model.js +423 -0
  812. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  813. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  814. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  815. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  816. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  817. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  818. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  819. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  820. package/dist/frontend/ts7/semantic-types.js +2 -0
  821. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  822. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  823. package/dist/frontend/ts7/session-cache.js +97 -0
  824. package/dist/frontend/ts7/session-cache.js.map +1 -0
  825. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  826. package/dist/frontend/ts7/session-cache.test.js +87 -0
  827. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  828. package/dist/frontend/ts7/session-path.d.ts +18 -0
  829. package/dist/frontend/ts7/session-path.js +203 -0
  830. package/dist/frontend/ts7/session-path.js.map +1 -0
  831. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  832. package/dist/frontend/ts7/session-path.test.js +34 -0
  833. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  834. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  835. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  836. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  837. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  838. package/dist/frontend/ts7/session-timing.js +61 -0
  839. package/dist/frontend/ts7/session-timing.js.map +1 -0
  840. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  841. package/dist/frontend/ts7/session-timing.test.js +52 -0
  842. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  843. package/dist/frontend/ts7/session.d.ts +105 -0
  844. package/dist/frontend/ts7/session.js +233 -0
  845. package/dist/frontend/ts7/session.js.map +1 -0
  846. package/dist/frontend/ts7/session.test.d.ts +1 -0
  847. package/dist/frontend/ts7/session.test.js +215 -0
  848. package/dist/frontend/ts7/session.test.js.map +1 -0
  849. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  850. package/dist/frontend/ts7/source-parser-node.js +15 -0
  851. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  852. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  853. package/dist/frontend/ts7/source-parser.js +96 -0
  854. package/dist/frontend/ts7/source-parser.js.map +1 -0
  855. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  856. package/dist/frontend/ts7/source-parser.test.js +151 -0
  857. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  858. package/dist/frontend/ts7/syntax.d.ts +3 -0
  859. package/dist/frontend/ts7/syntax.js +4 -0
  860. package/dist/frontend/ts7/syntax.js.map +1 -0
  861. package/dist/frontend/tsc-codes.js +3 -0
  862. package/dist/frontend/tsc-codes.js.map +1 -1
  863. package/dist/frontend/type-mapper.d.ts +34 -18
  864. package/dist/frontend/type-mapper.js +552 -131
  865. package/dist/frontend/type-mapper.js.map +1 -1
  866. package/dist/frontend/type-mapper.test.js +146 -2
  867. package/dist/frontend/type-mapper.test.js.map +1 -1
  868. package/dist/frontend/union-discriminants.d.ts +16 -0
  869. package/dist/frontend/union-discriminants.js +98 -0
  870. package/dist/frontend/union-discriminants.js.map +1 -0
  871. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  872. package/dist/frontend/union-discriminants.test.js +182 -0
  873. package/dist/frontend/union-discriminants.test.js.map +1 -0
  874. package/dist/index.d.ts +7 -198
  875. package/dist/index.js +369 -1572
  876. package/dist/index.js.map +1 -1
  877. package/dist/ir/analysis.d.ts +16 -4
  878. package/dist/ir/analysis.js +23 -4
  879. package/dist/ir/analysis.js.map +1 -1
  880. package/dist/ir/analysis.test.js +15 -2
  881. package/dist/ir/analysis.test.js.map +1 -1
  882. package/dist/ir/constant-tables.js +67 -49
  883. package/dist/ir/constant-tables.js.map +1 -1
  884. package/dist/ir/constant-tables.test.js +1 -1
  885. package/dist/ir/control-flow.d.ts +6 -0
  886. package/dist/ir/control-flow.js +142 -0
  887. package/dist/ir/control-flow.js.map +1 -0
  888. package/dist/ir/control-flow.test.d.ts +1 -0
  889. package/dist/ir/control-flow.test.js +113 -0
  890. package/dist/ir/control-flow.test.js.map +1 -0
  891. package/dist/ir/integer-loops.js +7 -18
  892. package/dist/ir/integer-loops.js.map +1 -1
  893. package/dist/ir/integer-ranges.js +53 -27
  894. package/dist/ir/integer-ranges.js.map +1 -1
  895. package/dist/ir/ir.d.ts +334 -176
  896. package/dist/ir/ir.js +710 -903
  897. package/dist/ir/ir.js.map +1 -1
  898. package/dist/ir/ir.test.js +162 -1
  899. package/dist/ir/ir.test.js.map +1 -1
  900. package/dist/ir/scalar-records.js +165 -134
  901. package/dist/ir/scalar-records.js.map +1 -1
  902. package/dist/ir/scalar-records.test.js +1 -1
  903. package/dist/ir/serialize.d.ts +4 -2
  904. package/dist/ir/serialize.js +33 -14
  905. package/dist/ir/serialize.js.map +1 -1
  906. package/dist/ir/serialize.test.d.ts +1 -0
  907. package/dist/ir/serialize.test.js +57 -0
  908. package/dist/ir/serialize.test.js.map +1 -0
  909. package/dist/ir/traverse.d.ts +41 -0
  910. package/dist/ir/traverse.js +660 -0
  911. package/dist/ir/traverse.js.map +1 -0
  912. package/dist/ir/traverse.test.d.ts +1 -0
  913. package/dist/ir/traverse.test.js +242 -0
  914. package/dist/ir/traverse.test.js.map +1 -0
  915. package/dist/ir/validate.js +2018 -1498
  916. package/dist/ir/validate.js.map +1 -1
  917. package/dist/ir/validate.test.js +536 -2
  918. package/dist/ir/validate.test.js.map +1 -1
  919. package/dist/library/cache-primitives.d.ts +2 -3
  920. package/dist/library/cache-primitives.js +4 -6
  921. package/dist/library/cache-primitives.js.map +1 -1
  922. package/dist/library/fence-eval.js +2 -2
  923. package/dist/library/fence-eval.js.map +1 -1
  924. package/dist/library/int-infer.js +7 -6
  925. package/dist/library/int-infer.js.map +1 -1
  926. package/dist/library/int-infer.test.js +4 -4
  927. package/dist/library/library-cache.d.ts +3 -2
  928. package/dist/library/library-cache.js +5 -17
  929. package/dist/library/library-cache.js.map +1 -1
  930. package/dist/library/library-cache.test.js +54 -41
  931. package/dist/library/library-cache.test.js.map +1 -1
  932. package/dist/library/library-profile.d.ts +3 -1
  933. package/dist/library/library-profile.js +15 -6
  934. package/dist/library/library-profile.js.map +1 -1
  935. package/dist/library/prepare.d.ts +15 -0
  936. package/dist/library/prepare.js +584 -0
  937. package/dist/library/prepare.js.map +1 -0
  938. package/dist/library/semantic-source.d.ts +1 -1
  939. package/dist/library/semantic-source.js +8 -6
  940. package/dist/library/semantic-source.js.map +1 -1
  941. package/dist/library/sidecar-validate.js +4 -4
  942. package/dist/library/sidecar-validate.js.map +1 -1
  943. package/dist/library/sidecar.d.ts +2 -0
  944. package/dist/library/sidecar.js +10 -3
  945. package/dist/library/sidecar.js.map +1 -1
  946. package/dist/native/cache.d.ts +11 -0
  947. package/dist/native/cache.js +113 -0
  948. package/dist/native/cache.js.map +1 -0
  949. package/dist/native/cache.test.d.ts +1 -0
  950. package/dist/native/cache.test.js +66 -0
  951. package/dist/native/cache.test.js.map +1 -0
  952. package/dist/native/cli.d.ts +1 -0
  953. package/dist/native/cli.js +112 -0
  954. package/dist/native/cli.js.map +1 -0
  955. package/dist/native/compiler.d.ts +15 -0
  956. package/dist/native/compiler.js +336 -0
  957. package/dist/native/compiler.js.map +1 -0
  958. package/dist/native/compiler.test.d.ts +1 -0
  959. package/dist/native/compiler.test.js +174 -0
  960. package/dist/native/compiler.test.js.map +1 -0
  961. package/dist/native/comptime.d.ts +5 -0
  962. package/dist/native/comptime.js +73 -0
  963. package/dist/native/comptime.js.map +1 -0
  964. package/dist/native/comptime.test.d.ts +1 -0
  965. package/dist/native/comptime.test.js +65 -0
  966. package/dist/native/comptime.test.js.map +1 -0
  967. package/dist/native/executable-cache.d.ts +26 -0
  968. package/dist/native/executable-cache.js +228 -0
  969. package/dist/native/executable-cache.js.map +1 -0
  970. package/dist/native/executable-cache.test.d.ts +1 -0
  971. package/dist/native/executable-cache.test.js +151 -0
  972. package/dist/native/executable-cache.test.js.map +1 -0
  973. package/dist/native/file-identity.d.ts +4 -0
  974. package/dist/native/file-identity.js +14 -0
  975. package/dist/native/file-identity.js.map +1 -0
  976. package/dist/native/file-identity.test.d.ts +1 -0
  977. package/dist/native/file-identity.test.js +43 -0
  978. package/dist/native/file-identity.test.js.map +1 -0
  979. package/dist/native/library.d.ts +22 -0
  980. package/dist/native/library.js +83 -0
  981. package/dist/native/library.js.map +1 -0
  982. package/dist/native/prepare.d.ts +21 -0
  983. package/dist/native/prepare.js +174 -0
  984. package/dist/native/prepare.js.map +1 -0
  985. package/dist/native/prepare.test.d.ts +1 -0
  986. package/dist/native/prepare.test.js +70 -0
  987. package/dist/native/prepare.test.js.map +1 -0
  988. package/dist/native/sanitizer.d.ts +11 -0
  989. package/dist/native/sanitizer.js +137 -0
  990. package/dist/native/sanitizer.js.map +1 -0
  991. package/dist/native/sanitizer.test.d.ts +1 -0
  992. package/dist/native/sanitizer.test.js +58 -0
  993. package/dist/native/sanitizer.test.js.map +1 -0
  994. package/dist/native/task.d.ts +4 -0
  995. package/dist/native/task.js +16 -0
  996. package/dist/native/task.js.map +1 -0
  997. package/dist/native/task.test.d.ts +1 -0
  998. package/dist/native/task.test.js +17 -0
  999. package/dist/native/task.test.js.map +1 -0
  1000. package/dist/native/toolchain.d.ts +45 -0
  1001. package/dist/native/toolchain.js +94 -0
  1002. package/dist/native/toolchain.js.map +1 -0
  1003. package/dist/native/toolchain.test.d.ts +1 -0
  1004. package/dist/native/toolchain.test.js +85 -0
  1005. package/dist/native/toolchain.test.js.map +1 -0
  1006. package/dist/startup-cache.d.ts +1 -1
  1007. package/dist/startup-cache.js +2 -5
  1008. package/dist/startup-cache.js.map +1 -1
  1009. package/dist/timing.d.ts +4 -0
  1010. package/dist/timing.js +19 -0
  1011. package/dist/timing.js.map +1 -0
  1012. package/dist/wasi-paths.js +10 -7
  1013. package/dist/wasi-paths.js.map +1 -1
  1014. package/package.json +28 -19
  1015. package/surface-manifest.json +107 -98
  1016. package/dist/backend/c/async.d.ts +0 -171
  1017. package/dist/backend/c/async.js +0 -1317
  1018. package/dist/backend/c/async.js.map +0 -1
  1019. package/dist/backend/c/c-emitter.d.ts +0 -536
  1020. package/dist/backend/c/c-emitter.js +0 -1932
  1021. package/dist/backend/c/c-emitter.js.map +0 -1
  1022. package/dist/backend/c/exprs.d.ts +0 -15
  1023. package/dist/backend/c/exprs.js +0 -8847
  1024. package/dist/backend/c/exprs.js.map +0 -1
  1025. package/dist/backend/c/island.d.ts +0 -45
  1026. package/dist/backend/c/island.js +0 -281
  1027. package/dist/backend/c/island.js.map +0 -1
  1028. package/dist/backend/c/may-throw.js.map +0 -1
  1029. package/dist/backend/c/shapes.d.ts +0 -142
  1030. package/dist/backend/c/shapes.js +0 -603
  1031. package/dist/backend/c/shapes.js.map +0 -1
  1032. package/dist/backend/c/stmts.d.ts +0 -76
  1033. package/dist/backend/c/stmts.js +0 -1108
  1034. package/dist/backend/c/stmts.js.map +0 -1
  1035. package/dist/backend/c/types.d.ts +0 -71
  1036. package/dist/backend/c/types.js +0 -459
  1037. package/dist/backend/c/types.js.map +0 -1
  1038. package/dist/backend/c/types.test.js +0 -32
  1039. package/dist/backend/c/types.test.js.map +0 -1
  1040. package/dist/backend/c/walkers.d.ts +0 -134
  1041. package/dist/backend/c/walkers.js +0 -1772
  1042. package/dist/backend/c/walkers.js.map +0 -1
  1043. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,15 +1,18 @@
1
+ import { pathModuleValue } from "../lower-builtin-values.js";
1
2
  import { InternalCompilerError } from "../../../errors.js";
2
3
  import * as ts from "../../ts7/adapter.js";
3
4
  import { BOOL, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, canDynCheckTo, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
4
5
  import { isCjsExportTableLiteral, isJsSourceFile, locOf } from "../../program.js";
5
6
  import { NARROW_FIRST } from "../surfaces.js";
6
7
  import { recordShapeMismatchDiag } from "../../../diagnostics/diagnostic.js";
7
- import { PoisonError, dynUndefinedExpr } from "../lowerer.js";
8
+ import { PoisonError, dynUndefinedExpr, neverTaintedJsType } from "../lowerer.js";
8
9
  import { lowerIndexMergeHelper } from "../lower-containers.js";
9
- import { isGenericCallableMemberType } from "../../type-mapper.js";
10
- import { numLit, varRef } from "../../../ir/build.js";
10
+ import { isGenericCallableMemberType, jsOpenObjectType } from "../../type-mapper.js";
11
+ import { numLit, strLit, varRef } from "../../../ir/build.js";
11
12
  import { isSafeToRepeat } from "./evaluation-safety.js";
12
13
  import { tryLowerExpression } from "./try-lower-expression.js";
14
+ import { fenceSymbolFieldCopy } from "../symbol-fields.js";
15
+ import { planUnionRetag } from "../union-retag.js";
13
16
  /** `{ a: 1, b: "x" }` → recordLit. The record type comes from the
14
17
  * contextual type when tsc has one (annotated declarations, arguments,
15
18
  * nested literals) and from the literal's own type otherwise — both intern
@@ -31,10 +34,11 @@ function settledDropNames(lowerer, tsType) {
31
34
  !lowerer.checker.declarationsOf(sym).some((d) => ts.isInterfaceDeclaration(d) && lowerer.isStdlibFile(d.getSourceFile()))) {
32
35
  continue;
33
36
  }
34
- if (sym.name === "PromiseFulfilledResult")
35
- (names ??= new Set()).add("value");
36
- if (sym.name === "PromiseRejectedResult")
37
- (names ??= new Set()).add("reason");
37
+ if (sym.name === "PromiseFulfilledResult" || sym.name === "PromiseRejectedResult") {
38
+ if (names === null)
39
+ names = new Set();
40
+ names.add(sym.name === "PromiseFulfilledResult" ? "value" : "reason");
41
+ }
38
42
  }
39
43
  return names;
40
44
  }
@@ -179,15 +183,30 @@ function propNameText(lowerer, name) {
179
183
  * dyn's String() for dyn operands — `{ [field]: v }` where field is a
180
184
  * checked-dynamic param). Values convert through the usual dyn boundary
181
185
  * (dynFrom's domain, functions box); a value with no dyn representation
182
- * fences per property. Spreads copy through dyn.assign in source order;
183
- * accessors stay fenced. */
186
+ * fences per property. Spreads create own data properties in source order;
187
+ * accessors retain their captured getter and setter closures. */
184
188
  export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
185
189
  const loc = locOf(expr);
186
190
  let fields = [];
187
191
  let acc = null;
192
+ let hasAccessors = false;
188
193
  const flushFields = () => {
189
194
  if (fields.length === 0)
190
195
  return;
196
+ if (hasAccessors) {
197
+ for (const field of fields) {
198
+ const descriptor = { kind: "dynObjLit", type: DYN, loc, fields: [
199
+ { key: { kind: "strLit", value: "value", type: STRING, loc }, value: field.value },
200
+ ...["writable", "enumerable", "configurable"].map(name => ({
201
+ key: strLit(name, loc),
202
+ value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
203
+ })),
204
+ ] };
205
+ acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(field.key, DYN), descriptor], type: DYN, loc };
206
+ }
207
+ fields = [];
208
+ return;
209
+ }
191
210
  const chunk = { kind: "dynObjLit", fields, type: DYN, loc };
192
211
  acc = acc === null
193
212
  ? chunk
@@ -197,7 +216,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
197
216
  for (const prop of expr.properties) {
198
217
  if (ts.isSpreadAssignment(prop)) {
199
218
  flushFields();
200
- const raw = lowerer.lowerExpr(prop.expression);
219
+ const builtin = lowerer.builtinNamespaceModuleOf(prop.expression);
220
+ const raw = builtin === "path" || builtin === "path/posix" || builtin === "path/win32"
221
+ ? pathModuleValue(lowerer, builtin === "path" ? "path/posix" : builtin, locOf(prop))
222
+ : lowerer.lowerExpr(prop.expression);
223
+ fenceSymbolFieldCopy(lowerer, prop.expression, raw.type);
201
224
  const source = boxValue
202
225
  ? boxValue(prop.expression, raw)
203
226
  : lowerer.coerceToExpected(raw, DYN);
@@ -205,14 +228,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
205
228
  lowerer.unsupported("SC1101", prop.expression, `spreading '${lowerer.fmt(source.type)}' into a checked-dynamic object literal`);
206
229
  }
207
230
  acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
208
- acc = { kind: "libCall", fn: "dyn.assign", args: [acc, source], type: DYN, loc: locOf(prop) };
231
+ acc = { kind: "libCall", fn: "dyn.copyDataProperties", args: [acc, source], type: DYN, loc: locOf(prop) };
209
232
  continue;
210
233
  }
211
- if (!ts.isPropertyAssignment(prop) &&
212
- !ts.isShorthandPropertyAssignment(prop) &&
213
- !ts.isMethodDeclaration(prop)) {
214
- lowerer.unsupported("SC1090", prop, "accessors in a runtime-keyed (computed-key) object literal");
215
- }
216
234
  const name = prop.name;
217
235
  let key;
218
236
  if (ts.isComputedPropertyName(name)) {
@@ -222,10 +240,14 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
222
240
  }
223
241
  else {
224
242
  let k = lowerer.lowerExpr(name.expression);
225
- if (k.type.kind === "f64" || k.type.kind === "bool" || k.type.kind === "dyn") {
243
+ if (k.type.kind === "symbol")
244
+ k = lowerer.coerceToExpected(k, DYN);
245
+ else if (k.type.kind === "dyn")
246
+ k = { kind: "libCall", fn: "dyn.propertyKey", args: [k], type: DYN, loc: locOf(name) };
247
+ else if (k.type.kind === "f64" || k.type.kind === "bool") {
226
248
  k = { kind: "toString", operand: k, type: STRING, loc: locOf(name) };
227
249
  }
228
- if (k.type.kind !== "string") {
250
+ if (k.type.kind !== "string" && k.type.kind !== "dyn") {
229
251
  lowerer.unsupported("SC1090", name, `'${lowerer.fmt(k.type)}'-typed computed property keys (string, number, boolean, and unknown keys stringify)`);
230
252
  }
231
253
  key = k;
@@ -240,6 +262,25 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
240
262
  else {
241
263
  lowerer.unsupported("SC1090", prop, "non-identifier property names");
242
264
  }
265
+ if (ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)) {
266
+ flushFields();
267
+ hasAccessors = true;
268
+ acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
269
+ if (!isJsSourceFile(expr.getSourceFile()))
270
+ lowerer.rejectThisInObjectMethod(prop.body ?? prop);
271
+ const fn = lowerer.lowerLambda(prop);
272
+ const descriptor = {
273
+ kind: "dynObjLit", type: DYN, loc: locOf(prop), fields: [
274
+ { key: { kind: "strLit", value: ts.isGetAccessorDeclaration(prop) ? "get" : "set", type: STRING, loc }, value: lowerer.coerceToExpected(fn, DYN) },
275
+ ...["enumerable", "configurable"].map(name => ({
276
+ key: strLit(name, loc),
277
+ value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
278
+ })),
279
+ ],
280
+ };
281
+ acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(key, DYN), descriptor], type: DYN, loc };
282
+ continue;
283
+ }
243
284
  const valueExpr = ts.isMethodDeclaration(prop)
244
285
  ? prop
245
286
  : ts.isShorthandPropertyAssignment(prop)
@@ -252,8 +293,10 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
252
293
  const propDiagsBefore = lowerer.diags.length;
253
294
  try {
254
295
  const lowerValue = () => ts.isMethodDeclaration(prop)
255
- ? (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop))
256
- : lowerer.lowerExpr(valueExpr);
296
+ ? (isJsSourceFile(expr.getSourceFile()) ? lowerer.lowerLambda(prop) : (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop)))
297
+ : !boxValue && ts.isObjectLiteralExpression(valueExpr)
298
+ ? lowerer.lowerExprExpecting(valueExpr, DYN)
299
+ : lowerer.lowerExpr(valueExpr);
257
300
  raw =
258
301
  fenceClosureProbe(lowerer, valueExpr, undefined, lowerValue) ??
259
302
  lowerValue();
@@ -279,6 +322,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
279
322
  let v = boxValue
280
323
  ? boxValue(valueExpr, raw)
281
324
  : lowerer.coerceToExpected(raw, DYN);
325
+ // A JS object's array-valued properties retain the same source array.
326
+ // Repeated references must compare equal and mutations remain shared.
327
+ if (!boxValue && isJsSourceFile(prop.getSourceFile()) && v.kind === "dynFrom" && v.value.type.kind === "array") {
328
+ v = { ...v, liveRef: true };
329
+ }
282
330
  if (v.type.kind !== "dyn") {
283
331
  const convDiagsBefore = lowerer.diags.length;
284
332
  try {
@@ -307,7 +355,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
307
355
  fields.push({ key, value: v });
308
356
  }
309
357
  flushFields();
310
- return acc ?? { kind: "dynObjLit", fields: [], type: DYN, loc };
358
+ if (acc !== null)
359
+ return acc;
360
+ return { kind: "dynObjLit", fields: [], type: DYN, loc };
311
361
  }
312
362
  /** Spreading a source whose shape carries accessor slots: Node's copy
313
363
  * invokes each getter exactly once in insertion order — even for keys a
@@ -319,6 +369,16 @@ function fenceAccessorSpreadSource(lowerer, prop, srcShape) {
319
369
  lowerer.unsupported("SC1090", prop, "object spread of sources carrying get/set accessor properties (Node invokes each getter once during the copy — the field-copy desugar cannot model the calls; bind the reads to consts first)");
320
370
  }
321
371
  }
372
+ /** Only definitely present later records replace earlier defaults. A
373
+ * callback binding may store undefined despite its checker annotation. */
374
+ function laterSpreadType(lowerer, expr) {
375
+ let source = expr;
376
+ while (ts.isParenthesizedExpression(source))
377
+ source = source.expression;
378
+ if (ts.isIdentifier(source))
379
+ return lowerer.lowerExpr(source).type;
380
+ return lowerer.mapTypeOf(lowerer.typeOf(source));
381
+ }
322
382
  /** The JS trap-closure fallback for FUNCTION-VALUED object properties: a
323
383
  * lambda whose body fails to lower inside a JS object literal becomes a
324
384
  * closure of the field's exact func type whose body is the runtime fence —
@@ -379,33 +439,48 @@ function fenceClosureProbe(lowerer, node, slotType, attempt) {
379
439
  * (excess-property freshness — tsc already enforced it), every arm field
380
440
  * missing from the literal must be optional-flavored (an undefined-armed
381
441
  * union, or a dyn slot — the absent-completion rule), and each present
382
- * field's LITERAL type must fit the member's field type — literal against
383
- * literal decides by VALUE (the discriminant), everything else by the
384
- * widened IR pair under the width-lift relation. Exactly ONE fitting arm
442
+ * field's TypeScript type must fit the member's field type — literal against
443
+ * literal decides by VALUE (the discriminant), everything else through the
444
+ * checker. The chosen arm then directs construction of nested literals;
445
+ * probing their inferred IR layout too early can reject the right arm and
446
+ * select a smaller unrelated record that drops fields. Exactly ONE fitting arm
385
447
  * answers it; zero or several answer null and the caller keeps its
386
- * fences. Plain property-assignment/shorthand literals only — spreads,
387
- * accessors, methods, and unfoldable computed keys keep their own paths. */
448
+ * fences. A spread uses the checker's resulting properties so overridden
449
+ * discriminants and narrowed recursive source arms keep their identity.
450
+ * Accessors, methods, and unfoldable computed keys keep their own paths. */
388
451
  function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
389
452
  if (!tsType.isUnionType())
390
453
  return null;
391
454
  const props = [];
455
+ let hasSpread = false;
392
456
  for (const p of expr.properties) {
393
457
  if (ts.isPropertyAssignment(p) && !ts.isComputedPropertyName(p.name)) {
394
- props.push({ name: propNameText(lowerer, p.name), node: p.initializer });
458
+ props.push({ name: propNameText(lowerer, p.name), type: lowerer.typeOf(p.initializer) });
395
459
  }
396
460
  else if (ts.isShorthandPropertyAssignment(p) && ts.isIdentifier(p.name)) {
397
- props.push({ name: p.name.text, node: p.name });
461
+ props.push({ name: p.name.text, type: lowerer.typeOf(p.name) });
462
+ }
463
+ else if (ts.isSpreadAssignment(p)) {
464
+ hasSpread = true;
398
465
  }
399
466
  else {
400
467
  return null;
401
468
  }
402
469
  }
403
- /** litT fits ftT: unions per arm; literal-vs-literal by value; unit
404
- * types only into their own unit; otherwise the widened IR pair must be
405
- * equal or width-liftable. */
470
+ if (hasSpread) {
471
+ const own = lowerer.typeOf(expr);
472
+ // Conditional/union spreads need runtime selection, not one guessed arm.
473
+ if (own.isUnionType())
474
+ return null;
475
+ props.length = 0;
476
+ for (const property of lowerer.checker.getPropertiesOfType(own)) {
477
+ props.push({ name: property.name, type: lowerer.checker.getTypeOfSymbol(property) });
478
+ }
479
+ }
480
+ /** Cheap literal discriminants avoid checker traffic for unrelated arms.
481
+ * Compound types need the checker's semantic assignability, including
482
+ * recursive unions, never intersections, and contextual empty arrays. */
406
483
  const fits = (litT, ftT) => {
407
- if (ftT.isUnionType())
408
- return ts.constituentTypes(ftT).some((a) => fits(litT, a));
409
484
  if (ftT.isStringLiteralType())
410
485
  return litT.isStringLiteralType() && litT.value === ftT.value;
411
486
  if (ftT.isNumberLiteralType())
@@ -417,13 +492,7 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
417
492
  return (litT.flags & ts.TypeFlags.Null) !== 0;
418
493
  if (ftT.flags & ts.TypeFlags.Undefined)
419
494
  return (litT.flags & ts.TypeFlags.Undefined) !== 0;
420
- if (litT.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))
421
- return false;
422
- const li = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(litT));
423
- const fi = lowerer.mapTypeOf(ftT);
424
- if (!li || !fi)
425
- return false;
426
- return typeEquals(li, fi) || lowerer.widthLiftPlan(li, fi) !== null;
495
+ return lowerer.checker.isTypeAssignableTo(litT, ftT);
427
496
  };
428
497
  const armShapeIds = new Set(recordArms.map((a) => a.shapeId));
429
498
  const candidates = new Set();
@@ -456,14 +525,14 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
456
525
  const sym = lowerer.checker.getPropertyOfType(member, p.name);
457
526
  if (!sym)
458
527
  return false;
459
- return fits(lowerer.typeOf(p.node), lowerer.checker.getTypeOfSymbol(sym));
528
+ return fits(p.type, lowerer.checker.getTypeOfSymbol(sym));
460
529
  });
461
530
  if (fieldsFit)
462
531
  candidates.add(mMapped.shapeId);
463
532
  }
464
533
  if (candidates.size !== 1)
465
534
  return null;
466
- const [only] = candidates;
535
+ const [only] = [...candidates];
467
536
  return recordArms.find((a) => a.shapeId === only) ?? null;
468
537
  }
469
538
  /** Object spread treats nullish sources as empty. Preserve evaluation once,
@@ -499,8 +568,40 @@ function lowerOptionalIndexSpreadSource(lowerer, source, loc) {
499
568
  };
500
569
  return prefix.length === 0 ? selected : { kind: "seqExpr", stmts: prefix, result: selected, type: recordType, loc };
501
570
  }
502
- export function lowerObjectLiteral(lowerer, expr) {
571
+ export function lowerObjectLiteral(lowerer, expr, expected) {
572
+ // Unannotated JavaScript accumulator fields have no element contract.
573
+ // Preserve their checked arrays instead of assigning never[] a numeric ABI.
574
+ if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((prop) => ts.isPropertyAssignment(prop) && (ts.isArrayLiteralExpression(prop.initializer) &&
575
+ prop.initializer.elements.length === 0 || neverTaintedJsType(lowerer, prop.initializer, lowerer.typeOf(prop.initializer))))) {
576
+ return lowerDynObjectLiteral(lowerer, expr);
577
+ }
578
+ if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((prop) => ts.isPropertyAssignment(prop) && lowerer.mapTypeOf(lowerer.typeOf(prop.initializer))?.kind === "array" &&
579
+ tryLowerExpression(lowerer, prop.initializer)?.type.kind === "dyn")) {
580
+ return lowerDynObjectLiteral(lowerer, expr);
581
+ }
582
+ // JavaScript object methods/accessors carry a live receiver. Keep the
583
+ // literal in checked native storage instead of erasing its prototype ABI.
584
+ if (isJsSourceFile(expr.getSourceFile()) && (expr.properties.length === 0 || expr.properties.some((prop) => ts.isMethodDeclaration(prop) || ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)))) {
585
+ return lowerDynObjectLiteral(lowerer, expr);
586
+ }
503
587
  const loc = locOf(expr);
588
+ // Module collection already chose checked storage for this JavaScript
589
+ // binding. Construct in that representation: an intermediate record would
590
+ // check nested aliases back into inferred shapes and lose their identity.
591
+ if (isJsSourceFile(expr.getSourceFile()) && ts.isVariableDeclaration(expr.parent) &&
592
+ expr.parent.initializer === expr && ts.isIdentifier(expr.parent.name) &&
593
+ lowerer.globalOf(expr.parent.name)?.type.kind === "dyn") {
594
+ return lowerDynObjectLiteral(lowerer, expr);
595
+ }
596
+ // A checked spread carries runtime symbol keys and receiver-sensitive
597
+ // methods absent from its inferred record shape. Copy the real properties.
598
+ if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((property) => ts.isSpreadAssignment(property) && (lowerer.builtinNamespaceModuleOf(property.expression)?.startsWith("path") ||
599
+ tryLowerExpression(lowerer, property.expression)?.type.kind === "dyn"))) {
600
+ return lowerDynObjectLiteral(lowerer, expr);
601
+ }
602
+ const unionClone = lowerUnionRecordClone(lowerer, expr);
603
+ if (unionClone !== null)
604
+ return unionClone;
504
605
  // The RUNTIME-KEYED literal (JS): a computed key that doesn't fold to a
505
606
  // compile-time string means the literal's shape is not a compile-time
506
607
  // fact — no record shape can hold it. The whole literal builds as a dyn
@@ -511,7 +612,7 @@ export function lowerObjectLiteral(lowerer, expr) {
511
612
  if (isJsSourceFile(expr.getSourceFile()) &&
512
613
  expr.properties.some((p) => {
513
614
  const n = ts.isSpreadAssignment(p) ? undefined : p.name;
514
- return n !== undefined && ts.isComputedPropertyName(n) && literalComputedKey(lowerer, n) === null;
615
+ return n !== undefined && ts.isComputedPropertyName(n);
515
616
  })) {
516
617
  return lowerDynObjectLiteral(lowerer, expr);
517
618
  }
@@ -578,6 +679,17 @@ export function lowerObjectLiteral(lowerer, expr) {
578
679
  lowerer.rejectThisInObjectMethod(prop.body ?? prop);
579
680
  }
580
681
  let tsType = lowerer.checker.getContextualType(expr) ?? lowerer.typeOf(expr);
682
+ // An inferred binding pattern supplies placeholders such as
683
+ // { nested: { value: any } }. Construct the literal's own fields so
684
+ // those placeholders do not erase instantiated generic storage.
685
+ if (!expected && ts.isVariableDeclaration(expr.parent) && !expr.parent.type &&
686
+ ts.isObjectBindingPattern(expr.parent.name) && expr.parent.initializer === expr) {
687
+ tsType = lowerer.typeOf(expr);
688
+ }
689
+ // `as never` supplies no construction layout. Keep the literal's own
690
+ // fields so an exhaustiveness witness cannot erase a reachable value.
691
+ if (lowerer.checker.isNeverType(tsType))
692
+ tsType = lowerer.typeOf(expr);
581
693
  // `lit satisfies T` is TYPE-LEVEL only: the expression's checker type —
582
694
  // and therefore the shape every downstream consumer sees — is the
583
695
  // literal's OWN type (T still contextually types members, so inferred
@@ -609,6 +721,13 @@ export function lowerObjectLiteral(lowerer, expr) {
609
721
  tsType = lowerer.checker.getAwaitedType(tsType) ?? tsType;
610
722
  }
611
723
  let mapped = lowerer.mapTypeOf(tsType);
724
+ // A checked-dynamic source has runtime keys even when later explicit
725
+ // fields make the literal's inferred type look like a fixed record.
726
+ // Keep a checked-dynamic destination in that representation so copying
727
+ // preserves keys, evaluation order, and fields overwritten afterwards.
728
+ if (mapped?.kind === "dyn" && expr.properties.some((p) => ts.isSpreadAssignment(p) && lowerer.mapTypeOf(lowerer.typeOf(p.expression))?.kind === "dyn")) {
729
+ return lowerDynObjectLiteral(lowerer, expr);
730
+ }
612
731
  // A JavaScript call can contextually type an object literal as string even
613
732
  // though the literal itself is a record. Keep its own shape so a caller
614
733
  // performing ToString can convert it after the value is built.
@@ -675,7 +794,11 @@ export function lowerObjectLiteral(lowerer, expr) {
675
794
  // gate DECLINED it (a project-declared typedef that absorbed to the
676
795
  // island through checker-`any` field residue): the literal builds at
677
796
  // its own type like every unmappable context.
678
- if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval") {
797
+ // An index-signature literal can inherit a callable contextual type for
798
+ // a prototype-named DATA property (notably `toString`). Object literals
799
+ // have no call signature; construct their own data shape and let the
800
+ // surrounding assignment/assertion enforce the destination contract.
801
+ if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval" || mapped.kind === "func") {
679
802
  const ctxUnion = mapped?.kind === "union" ? mapped : null;
680
803
  mapped = lowerer.mapTypeOf(lowerer.typeOf(expr)) ?? mapped;
681
804
  // A literal whose own shape re-tags into NO arm of the contextual
@@ -697,7 +820,10 @@ export function lowerObjectLiteral(lowerer, expr) {
697
820
  if (recordArms.length === 1) {
698
821
  const armShape = lowerer.shapes.get(recordArms[0].shapeId);
699
822
  if ((mapped?.kind !== "record" || mapped.shapeId !== recordArms[0].shapeId) &&
700
- !armShape?.tuple) {
823
+ !armShape?.tuple &&
824
+ // `{} | undefined` supplies no layout for a populated options
825
+ // literal, just as a bare empty-record context supplies none.
826
+ (expr.properties.length === 0 || (armShape && (armShape.fields.length > 0 || armShape.indexValue)))) {
701
827
  mapped = recordArms[0];
702
828
  }
703
829
  }
@@ -715,7 +841,11 @@ export function lowerObjectLiteral(lowerer, expr) {
715
841
  // exactly ONE member fits, build AS that arm — its field types
716
842
  // drive every property's coercion, exactly the single-record-arm
717
843
  // rule above. Ambiguous literals keep the SC2003 fence.
718
- if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId)) {
844
+ // Recursive arms can have identical stored field layouts while
845
+ // retaining distinct nominal knots. An inferred spread shape can
846
+ // match the wrong knot, so consult discriminants even if that shape
847
+ // already appears in the union.
848
+ if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId) || expr.properties.some(ts.isSpreadAssignment)) {
719
849
  const arm = literalUnionArmOf(lowerer, expr, tsType, recordArms);
720
850
  if (arm)
721
851
  mapped = arm;
@@ -767,13 +897,36 @@ export function lowerObjectLiteral(lowerer, expr) {
767
897
  // descriptor records with `any` values) — builds as a dyn OBJECT:
768
898
  // each field converts through the usual dyn boundary, and dynamic
769
899
  // consumers ride the keyed-dyn paths. TypeScript keeps the fence.
770
- if ((!mapped || mapped.kind === "dyn") && isJsSourceFile(expr.getSourceFile())) {
900
+ if (mapped?.kind === "dyn" || (!mapped && isJsSourceFile(expr.getSourceFile())) ||
901
+ (!expected && mapped && jsOpenObjectType(expr, mapped, lowerer.shapes, lowerer.unions).kind === "dyn")) {
771
902
  return lowerDynObjectLiteral(lowerer, expr);
772
903
  }
773
904
  if (!mapped || mapped.kind !== "record")
774
905
  lowerer.badType(expr, tsType);
775
906
  let type = mapped;
907
+ // A fresh, plain literal can construct its fields directly for a known
908
+ // destination with the same field set. This matters for inferred
909
+ // conditional records: an empty array in one arm has no element layout
910
+ // until the join supplies it. Existing values still use width coercion;
911
+ // extra fields, spreads, accessors, and keyed shapes retain their paths.
912
+ if (expected && !isJsSourceFile(expr.getSourceFile()) &&
913
+ expr.properties.every((p) => ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p))) {
914
+ const own = lowerer.shapes.get(type.shapeId);
915
+ const target = lowerer.shapes.get(expected.shapeId);
916
+ if (!own.tuple && !target.tuple && !own.indexValue && !target.indexValue &&
917
+ !shapeHasAccessorSlots(own) && !shapeHasAccessorSlots(target) &&
918
+ target.fields.every((field) => own.fields.some((candidate) => candidate.name === field.name) ||
919
+ field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) &&
920
+ own.fields.every((field) => target.fields.some((candidate) => candidate.name === field.name))) {
921
+ type = { kind: "record", shapeId: expected.shapeId };
922
+ }
923
+ }
776
924
  let shape = lowerer.shapes.get(type.shapeId);
925
+ // JavaScript Dates carry native object identity in checked storage. An
926
+ // inferred scalar Date field would erase that identity before boxing.
927
+ if (isJsSourceFile(expr.getSourceFile()) && shape.fields.some((field) => field.type.kind === "date")) {
928
+ return lowerDynObjectLiteral(lowerer, expr);
929
+ }
777
930
  // ACCESSOR properties, JS literals only (TS accessors fill the shape's
778
931
  // %get:/%set: closure slots below): no record storage exists for them,
779
932
  // so the literal's shape NARROWS to its plain fields (reads resolve
@@ -793,21 +946,20 @@ export function lowerObjectLiteral(lowerer, expr) {
793
946
  }
794
947
  const fieldTypes = new Map(shape.fields.map((f) => [f.name, f.type]));
795
948
  // File-scope JavaScript object bindings live in the checked-dynamic tree
796
- // to preserve open writes and identity. Build an optional-field literal
797
- // from its actually written keys so Object.hasOwn can distinguish an
798
- // omitted property from a present property whose value is undefined.
949
+ // to preserve open writes and identity. The checker can infer fields
950
+ // from later writes; those fields must remain absent when the literal
951
+ // is first evaluated.
799
952
  const topLevelJsDecl = ts.isVariableDeclaration(expr.parent) &&
800
953
  expr.parent.initializer === expr &&
801
- ts.isVariableStatement(expr.parent.parent.parent) &&
802
- ts.isSourceFile(expr.parent.parent.parent.parent);
954
+ ts.isVariableStatement(expr.parent?.parent?.parent) &&
955
+ ts.isSourceFile(expr.parent?.parent?.parent?.parent);
803
956
  const assignedProperties = expr.properties.filter((prop) => ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop));
804
957
  if (topLevelJsDecl && isJsSourceFile(expr.getSourceFile()) &&
805
958
  assignedProperties.length === expr.properties.length) {
806
959
  const provided = new Set(assignedProperties.map((prop) => propNameText(lowerer, prop.name)));
807
- const omittedOptional = shape.fields.some((field) => !provided.has(field.name) && field.type.kind === "union" &&
808
- lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0);
809
- if (omittedOptional)
960
+ if (shape.fields.some((field) => !provided.has(field.name))) {
810
961
  return lowerDynObjectLiteral(lowerer, expr);
962
+ }
811
963
  }
812
964
  // The clone probe may lower the leading spread before declining (a
813
965
  // static `as` cast can make the checker-visible shape match while its
@@ -982,15 +1134,10 @@ export function lowerObjectLiteral(lowerer, expr) {
982
1134
  lowerer.unsupported("SC1090", prop.name, "computed property keys (compile-time-known keys fold — a pure expression whose checker type is one string or number literal: consts, enum members, quoted keys, templates of those — `{ [MARKER]: v }`; runtime string keys write through an index-signature target; symbol keys stay out)");
983
1135
  }
984
1136
  }
985
- // A DECLARED-fields target built ENTIRELY from index-signature spreads —
986
- // `{ ...Object.fromEntries(...), ...Object.fromEntries(...) }` typed
987
- // AppConfig (the defaults-merge idiom over runtime-keyed sources): the
988
- // field-by-field desugar cannot enumerate runtime keys, so the literal
989
- // lowers as ONE interned merge-helper call — sources evaluate once each
990
- // in source order (the call's argument order — computed sources
991
- // included, no re-read), contributors apply in order with per-key
992
- // dispatch onto the declared fields (JS last-write-wins). Divergence 68
993
- // has the runtime rules (validated collisions, extra keys dropped).
1137
+ // A declared destination combining fixed records and runtime-keyed
1138
+ // sources needs both layouts. Apply each source before evaluating the
1139
+ // next expression, with checked overflow collisions and optional-field
1140
+ // completion. Extra runtime keys follow the declared-shape width policy.
994
1141
  if (!shape.indexValue &&
995
1142
  !shape.tuple &&
996
1143
  shape.fields.length > 0 &&
@@ -998,7 +1145,7 @@ export function lowerObjectLiteral(lowerer, expr) {
998
1145
  expr.properties.every((p) => ts.isSpreadAssignment(p) && !conditionalSpreadOf(p.expression)) &&
999
1146
  expr.properties.some((p) => {
1000
1147
  const t = lowerer.mapTypeOf(lowerer.typeOf(p.expression));
1001
- return t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
1148
+ return t?.kind === "dyn" || t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
1002
1149
  })) {
1003
1150
  return lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc);
1004
1151
  }
@@ -1010,6 +1157,16 @@ export function lowerObjectLiteral(lowerer, expr) {
1010
1157
  throw new PoisonError();
1011
1158
  };
1012
1159
  const fields = [];
1160
+ const spreadStmts = [];
1161
+ const hasSpread = expr.properties.some(ts.isSpreadAssignment);
1162
+ const captured = new Set();
1163
+ const capture = (value) => {
1164
+ const local = lowerer.declareHiddenLocal("%spreadValue", value.type);
1165
+ spreadStmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
1166
+ const ref = varRef(local.id, value.type, value.loc);
1167
+ captured.add(ref);
1168
+ return ref;
1169
+ };
1013
1170
  // Field names introduced by conditional spreads: their ternary carries
1014
1171
  // the spread's whole evaluation (cond once, value lazily), so a LATER
1015
1172
  // contributor overriding one would silently drop that evaluation —
@@ -1019,6 +1176,21 @@ export function lowerObjectLiteral(lowerer, expr) {
1019
1176
  // member reads narrow away; see the catch in the property loop).
1020
1177
  const droppedNames = new Set();
1021
1178
  for (const prop of expr.properties) {
1179
+ // A later contributor can mutate an earlier source or overwrite a
1180
+ // value with effects. Snapshot pending fields at their source position,
1181
+ // before evaluating the next contributor, even if they are overwritten.
1182
+ if (hasSpread) {
1183
+ for (let i = 0; i < fields.length; i++) {
1184
+ const field = fields[i];
1185
+ if (field.drop) {
1186
+ spreadStmts.push({ kind: "exprStmt", expr: field.value, loc: field.value.loc });
1187
+ fields.splice(i--, 1);
1188
+ continue;
1189
+ }
1190
+ if (!captured.has(field.value))
1191
+ field.value = capture(field.value);
1192
+ }
1193
+ }
1022
1194
  if (ts.isSpreadAssignment(prop)) {
1023
1195
  const cs = conditionalSpreadOf(prop.expression);
1024
1196
  if (cs && cs !== "unsupported") {
@@ -1035,7 +1207,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1035
1207
  if (shape.indexValue) {
1036
1208
  lowerer.unsupported("SC1090", prop, "conditional spreads into index-signature keys (overflow entries model presence — write the key in an if statement instead)");
1037
1209
  }
1038
- throw shapeMismatch(prop);
1210
+ shapeMismatch(prop);
1039
1211
  }
1040
1212
  const absent = lowerer.wrappedUndefined(fieldType, locOf(prop));
1041
1213
  if (!absent) {
@@ -1070,28 +1242,22 @@ export function lowerObjectLiteral(lowerer, expr) {
1070
1242
  // shape. Every source field must land on the target shape with an
1071
1243
  // equal type (a wider source would silently DROP fields JS keeps —
1072
1244
  // the width fence, same as literals). Later contributors override
1073
- // earlier ones (JS last-write-wins; the reads are side-effect-free,
1074
- // so dropping the earlier read is exact). Identifier sources
1075
- // re-read per field (historic path); any OTHER source must be a
1076
- // re-emittable pure read, sharing one lowered node per field.
1077
- // The desugar's one-entry-per-name list reads spread fields
1078
- // EAGERLY at the spread's position, so an explicit property
1079
- // BEFORE a spread would need JS's overwrite — order-fenced (the
1080
- // index-signature merge path above takes any order).
1081
- if (expr.properties
1082
- .slice(0, expr.properties.indexOf(prop))
1083
- .some((p) => !ts.isSpreadAssignment(p))) {
1084
- lowerer.unsupported("SC1090", prop, "object spread after explicit properties (spreads must come first — a later spread would overwrite them with JS semantics the desugar does not model)");
1085
- }
1245
+ // earlier ones (JS last-write-wins). Evaluate the source exactly
1246
+ // once, including empty sources and those whose fields are all
1247
+ // overridden. Field snapshots above preserve the copy order.
1086
1248
  let srcNode = prop.expression;
1087
1249
  while (ts.isParenthesizedExpression(srcNode))
1088
1250
  srcNode = srcNode.expression;
1089
- const srcLowered = prop === expr.properties[0] && leadingSpreadLowered !== null
1251
+ const srcLowered = capture(prop === expr.properties[0] && leadingSpreadLowered !== null
1090
1252
  ? leadingSpreadLowered
1091
- : ts.isIdentifier(srcNode)
1092
- ? null
1093
- : lowerer.lowerExpr(srcNode);
1094
- const srcType = srcLowered ? srcLowered.type : lowerer.mapTypeOf(lowerer.typeOf(srcNode));
1253
+ : lowerer.lowerExpr(srcNode));
1254
+ // Array callbacks can receive a record-or-undefined ABI even when
1255
+ // TypeScript describes a required record. Select the copy strategy
1256
+ // from that stored representation so absent sources copy nothing.
1257
+ // Checked-dynamic bindings still use the checker's field contract.
1258
+ const srcType = srcLowered.type.kind === "dyn"
1259
+ ? lowerer.mapTypeOf(lowerer.typeOf(srcNode))
1260
+ : srcLowered.type;
1095
1261
  // `...options.installConfig` — a spread of `Partial<X> | undefined`
1096
1262
  // (the optional-options merge idiom `{ ...DEFAULTS, ...overrides }`):
1097
1263
  // JS spreads nothing for the unit arm and copies present keys
@@ -1108,9 +1274,6 @@ export function lowerObjectLiteral(lowerer, expr) {
1108
1274
  !def.arms.every((a) => a.kind === "record" || isUnitType(a))) {
1109
1275
  lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(srcType)}' sources (only known record shapes spread — ${NARROW_FIRST})`);
1110
1276
  }
1111
- if (srcLowered && !isSafeToRepeat(srcLowered)) {
1112
- lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
1113
- }
1114
1277
  const recArm = recArms[0];
1115
1278
  const recTag = def.arms.indexOf(recArm);
1116
1279
  // A checked-dynamic VALUE under the union-mapped checker type
@@ -1133,7 +1296,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1133
1296
  if (ts.isSpreadAssignment(later)) {
1134
1297
  if (conditionalSpreadOf(later.expression))
1135
1298
  continue;
1136
- const lt = lowerer.mapTypeOf(lowerer.typeOf(later.expression));
1299
+ const lt = laterSpreadType(lowerer, later.expression);
1137
1300
  if (lt?.kind === "record") {
1138
1301
  for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
1139
1302
  laterNames.add(lf.name);
@@ -1234,9 +1397,6 @@ export function lowerObjectLiteral(lowerer, expr) {
1234
1397
  if (srcType?.kind !== "record") {
1235
1398
  lowerer.unsupported("SC1090", prop, `object spread of '${srcType ? lowerer.fmt(srcType) : lowerer.checker.typeToString(lowerer.typeOf(srcNode))}' sources (only known record shapes spread — ${NARROW_FIRST})`);
1236
1399
  }
1237
- if (srcLowered && !isSafeToRepeat(srcLowered)) {
1238
- lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
1239
- }
1240
1400
  const srcShape = lowerer.shapes.get(srcType.shapeId);
1241
1401
  if (!srcShape)
1242
1402
  throw new InternalCompilerError(`lowerer bug: spread of unknown shape ${srcType.shapeId}`);
@@ -1258,7 +1418,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1258
1418
  if (ts.isSpreadAssignment(later)) {
1259
1419
  if (conditionalSpreadOf(later.expression))
1260
1420
  continue;
1261
- const lt = lowerer.mapTypeOf(lowerer.typeOf(later.expression));
1421
+ const lt = laterSpreadType(lowerer, later.expression);
1262
1422
  if (lt?.kind === "record") {
1263
1423
  for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
1264
1424
  laterNames.add(lf.name);
@@ -1372,7 +1532,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1372
1532
  if (fieldTypes.has(name)) {
1373
1533
  lowerer.unsupported("SC1090", prop, `a get/set accessor satisfying the data property '${name}' of '${lowerer.fmt(type)}' (the record slot stores a plain value — Node would keep the accessor live through this type)`);
1374
1534
  }
1375
- throw shapeMismatch(prop);
1535
+ shapeMismatch(prop);
1376
1536
  }
1377
1537
  const closure = lowerer.coerceInto(prop, lowerer.lowerLambda(prop), slotT);
1378
1538
  if (!typeEquals(closure.type, slotT))
@@ -1396,7 +1556,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1396
1556
  // side effects; calls resolve statically against this declaration);
1397
1557
  // a computed initializer would need its evaluation kept — fenced.
1398
1558
  if (!fieldType && !ts.isSpreadAssignment(prop)) {
1399
- const memberSym = prop.name && lowerer.checker.getSymbolAtLocation(prop.name);
1559
+ const memberSym = prop.name ? lowerer.checker.getSymbolAtLocation(prop.name) : undefined;
1400
1560
  const memberT = memberSym ? lowerer.checker.getTypeOfSymbol(memberSym) : undefined;
1401
1561
  if (memberT && isGenericCallableMemberType(memberT, lowerer.checker)) {
1402
1562
  const pureInit = (() => {
@@ -1436,7 +1596,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1436
1596
  }
1437
1597
  continue;
1438
1598
  }
1439
- throw shapeMismatch(prop);
1599
+ shapeMismatch(prop);
1440
1600
  }
1441
1601
  let value;
1442
1602
  let valueNode = prop;
@@ -1444,17 +1604,15 @@ export function lowerObjectLiteral(lowerer, expr) {
1444
1604
  try {
1445
1605
  if (ts.isPropertyAssignment(prop)) {
1446
1606
  valueNode = prop.initializer;
1447
- // ARRAY-LITERAL initializers route through the expected-type
1448
- // lowering: a union field with one array-family arm builds the
1449
- // literal AS that arm (lowerExprExpecting's IR-directed rule —
1450
- // the option-table `default: [{ value: [] }]` shape), where the
1451
- // bare lowering would take the JS dyn fallback and fence.
1607
+ // Fresh construction gets the field's destination before lowering
1608
+ // nested arrays, records, or conditional branches. Existing values
1609
+ // retain their runtime representation until the field coercion.
1452
1610
  let init = prop.initializer;
1453
- while (ts.isParenthesizedExpression(init))
1611
+ while (ts.isParenthesizedExpression(init) || ts.isSatisfiesExpression(init))
1454
1612
  init = init.expression;
1455
1613
  value =
1456
1614
  fenceClosureProbe(lowerer, prop.initializer, fieldType, () => lowerer.lowerExpr(prop.initializer)) ??
1457
- (fieldType !== undefined && ts.isArrayLiteralExpression(init)
1615
+ (fieldType !== undefined && (ts.isArrayLiteralExpression(init) || ts.isObjectLiteralExpression(init) || ts.isConditionalExpression(init))
1458
1616
  ? lowerer.lowerExprExpecting(prop.initializer, fieldType)
1459
1617
  : lowerer.lowerExpr(prop.initializer));
1460
1618
  }
@@ -1466,7 +1624,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1466
1624
  fenceClosureProbe(lowerer, prop, fieldType, () => lowerer.lowerLambda(prop)) ?? lowerer.lowerLambda(prop);
1467
1625
  }
1468
1626
  else {
1469
- lowerer.unsupported("SC1090", prop, `syntax '${ts.SyntaxKind[prop.kind]}'`);
1627
+ lowerer.unsupported("SC1090", prop, `syntax '${ts.syntaxKindName(prop.kind)}'`);
1470
1628
  }
1471
1629
  }
1472
1630
  catch (err) {
@@ -1554,11 +1712,129 @@ export function lowerObjectLiteral(lowerer, expr) {
1554
1712
  (f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
1555
1713
  absentHandle;
1556
1714
  if (!absent)
1557
- throw shapeMismatch(expr); // only optional and 'unknown' fields may be omitted
1715
+ shapeMismatch(expr); // only optional and 'unknown' fields may be omitted
1558
1716
  fields.push({ name: f.name, value: absent });
1559
1717
  }
1560
1718
  }
1561
- return { kind: "recordLit", fields, type, loc };
1719
+ const result = { kind: "recordLit", fields, type, loc };
1720
+ return spreadStmts.length === 0 ? result : { kind: "seqExpr", stmts: spreadStmts, result, type, loc };
1721
+ }
1722
+ /** A union of plain records can preserve its existing variant while
1723
+ * replacing shared fields. Dispatch before constructing the copy: only
1724
+ * the selected arm evaluates overrides, and recordClone snapshots fields
1725
+ * before an override can mutate the original. Nested references retain
1726
+ * their identity. Changing a discriminator or adding variant-specific
1727
+ * fields needs a different result layout and stays on the ordinary path. */
1728
+ function lowerUnionRecordClone(lowerer, expr) {
1729
+ if (isJsSourceFile(expr.getSourceFile()))
1730
+ return null;
1731
+ const spread = expr.properties[0];
1732
+ if (!spread || !ts.isSpreadAssignment(spread))
1733
+ return null;
1734
+ let sourceNode = spread.expression;
1735
+ while (ts.isParenthesizedExpression(sourceNode) || ts.isSatisfiesExpression(sourceNode))
1736
+ sourceNode = sourceNode.expression;
1737
+ // Conditional spreads construct optional keys, including the empty arm.
1738
+ // Their dedicated lowering owns that layout rather than a union clone.
1739
+ if (ts.isConditionalExpression(sourceNode))
1740
+ return null;
1741
+ const sourceType = lowerer.mapTypeOf(lowerer.typeOf(spread.expression));
1742
+ if (sourceType?.kind !== "union")
1743
+ return null;
1744
+ const def = lowerer.unions.get(sourceType.unionId);
1745
+ if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "record"))
1746
+ return null;
1747
+ const props = [];
1748
+ const names = [];
1749
+ for (const prop of expr.properties.slice(1)) {
1750
+ if ((!ts.isPropertyAssignment(prop) && !ts.isShorthandPropertyAssignment(prop)) ||
1751
+ (!ts.isIdentifier(prop.name) && !ts.isStringLiteral(prop.name)))
1752
+ return null;
1753
+ const name = prop.name.text;
1754
+ if (names.includes(name) || name === def.discriminant?.field || name === "__proto__")
1755
+ return null;
1756
+ props.push(prop);
1757
+ names.push(name);
1758
+ }
1759
+ for (const arm of def.arms) {
1760
+ if (arm.kind !== "record")
1761
+ return null;
1762
+ const shape = lowerer.shapes.get(arm.shapeId);
1763
+ if (!shape || shape.indexValue || shape.tuple || shapeHasAccessorSlots(shape) ||
1764
+ !names.every((name) => shape.fields.some((field) => field.name === name)))
1765
+ return null;
1766
+ for (let index = 0; index < props.length; index++) {
1767
+ const prop = props[index];
1768
+ const node = ts.isPropertyAssignment(prop) ? prop.initializer : prop.name;
1769
+ const valueType = lowerer.mapTypeOf(lowerer.typeOf(node));
1770
+ const fieldType = shape.fields.find((field) => field.name === names[index]).type;
1771
+ const lift = valueType ? lowerer.widthLiftPlan(valueType, fieldType) : null;
1772
+ // The inferred result must retain an override's own fields and
1773
+ // aliases. A structural copy into the source field's narrower shape
1774
+ // would silently reshape an unannotated spread expression.
1775
+ if (!lift)
1776
+ return null;
1777
+ if (lift.how === "retag" && valueType?.kind === "union" && fieldType.kind === "union") {
1778
+ const from = lowerer.unions.get(valueType.unionId);
1779
+ const to = lowerer.unions.get(fieldType.unionId);
1780
+ const plan = from && to ? planUnionRetag(from, to, (id) => lowerer.shapes.get(id), (source, target) => lowerer.widthLiftPlan(source, target)) : null;
1781
+ if (!plan || !plan.every((arm) => arm.kind === "direct"
1782
+ ? arm.route.lift.how === "copy" || arm.route.lift.how === "upcast"
1783
+ : arm.kind === "discriminant" && arm.routes.every((route) => route.lift.how === "copy" || route.lift.how === "upcast")))
1784
+ return null;
1785
+ }
1786
+ else if (lift.how !== "copy" && lift.how !== "wrap" && lift.how !== "upcast")
1787
+ return null;
1788
+ }
1789
+ }
1790
+ let source = lowerer.lowerExpr(spread.expression);
1791
+ // Hidden runtime absence must never be mistaken for a record payload.
1792
+ // An earlier guard can remove that arm; an unguarded optional spread
1793
+ // still needs a destination able to represent the empty copy.
1794
+ if (!typeEquals(source.type, sourceType) && source.type.kind === "union" && ts.isIdentifier(spread.expression)) {
1795
+ const local = lowerer.resolveLocal(spread.expression);
1796
+ const symbol = lowerer.resolveValueSymbol(spread.expression);
1797
+ const captured = local?.boxed === true || symbol && lowerer.ctx.captureBySymbol.has(symbol);
1798
+ if (local && !captured && !lowerer.runtimeOptionalLocals.has(lowerer.runtimeOptionalRootOf(local))) {
1799
+ const helper = lowerer.narrowedRetagHelper(spread.expression, source.type.unionId, sourceType.unionId, source.loc);
1800
+ if (helper)
1801
+ source = { kind: "call", callee: helper, args: [source], type: sourceType, loc: source.loc };
1802
+ }
1803
+ }
1804
+ if (!typeEquals(source.type, sourceType)) {
1805
+ lowerer.unsupported("SC1090", spread, "a union record clone whose stored source still includes absence");
1806
+ }
1807
+ const loc = locOf(expr);
1808
+ const saved = lowerer.declareHiddenLocal("%unionClone", sourceType);
1809
+ const ref = varRef(saved.id, sourceType, loc);
1810
+ let result = null;
1811
+ for (let tag = def.arms.length - 1; tag >= 0; tag--) {
1812
+ const arm = def.arms[tag];
1813
+ if (arm.kind !== "record")
1814
+ throw new InternalCompilerError("union clone arm is not a record");
1815
+ const shape = lowerer.shapes.get(arm.shapeId);
1816
+ const overrides = [];
1817
+ for (let index = 0; index < props.length; index++) {
1818
+ const prop = props[index];
1819
+ const name = names[index];
1820
+ const fieldType = shape.fields.find((field) => field.name === name).type;
1821
+ const value = ts.isPropertyAssignment(prop)
1822
+ ? lowerer.lowerExprExpecting(prop.initializer, fieldType)
1823
+ : lowerer.coerceInto(prop, lowerer.lowerShorthandValue(prop), fieldType);
1824
+ overrides.push({ name, value });
1825
+ }
1826
+ const clone = { kind: "recordClone",
1827
+ source: { kind: "unionNarrow", value: ref, unionId: sourceType.unionId, tag, type: arm, loc },
1828
+ overrides, type: arm, loc };
1829
+ const wrapped = { kind: "unionWrap", value: clone, unionId: sourceType.unionId, tag, type: sourceType, loc };
1830
+ result = result === null ? wrapped : {
1831
+ kind: "ternary", cond: { kind: "unionIsTag", value: ref, unionId: sourceType.unionId, tag, negated: false, type: BOOL, loc },
1832
+ then: wrapped, else_: result, type: sourceType, loc,
1833
+ };
1834
+ }
1835
+ if (result === null)
1836
+ throw new InternalCompilerError("union clone has no arms");
1837
+ return { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: sourceType, loc };
1562
1838
  }
1563
1839
  /** Parses the conditional-spread idiom `...(c ? { k: v, ... } : {})`
1564
1840
  * (either orientation). Returns the condition, the non-empty arm's
@@ -1617,17 +1893,22 @@ export function conditionalSpreadOf(expr) {
1617
1893
  * untyped copy would store the lie) — and a key naming NO declared field
1618
1894
  * is DROPPED (the shape cannot represent it; Node keeps it invisibly —
1619
1895
  * divergence 68). Later contributors overwrite earlier ones
1620
- * (last-write-wins). Sources must be PURE index-signature records. */
1896
+ * (last-write-wins). Fixed, hybrid, and pure index records may contribute. */
1621
1897
  function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
1622
1898
  const srcs = [];
1623
1899
  for (const prop of expr.properties) {
1624
1900
  const spread = prop; // caller-checked: all spreads
1625
1901
  const value = lowerer.lowerExpr(spread.expression);
1902
+ if (value.type.kind === "dyn") {
1903
+ srcs.push({ value, shapeId: "dyn" });
1904
+ continue;
1905
+ }
1626
1906
  const srcShape = value.type.kind === "record" ? lowerer.shapes.get(value.type.shapeId) : undefined;
1627
- if (value.type.kind !== "record" || !srcShape?.indexValue || srcShape.tuple || srcShape.fields.length > 0) {
1628
- lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only PURE index-signature records — Object.fromEntries results, Record<string, T> values — spread into a declared shape)`);
1907
+ if (value.type.kind !== "record" || !srcShape || srcShape.tuple) {
1908
+ lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only records spread into a declared shape)`);
1629
1909
  }
1630
- srcs.push({ value, shapeId: value.type.shapeId, iv: srcShape.indexValue });
1910
+ fenceAccessorSpreadSource(lowerer, prop, srcShape);
1911
+ srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
1631
1912
  }
1632
1913
  // Every target field must be optional: absent keys leave the undefined
1633
1914
  // arm, exactly the unset-optional representation.
@@ -1690,75 +1971,109 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
1690
1971
  }
1691
1972
  lowerer.unsupported("SC1090", expr, `object spread into '${lowerer.fmt(type)}' where the source's '${lowerer.fmt(iv)}' values cannot reach the '${lowerer.fmt(f.type)}' field '${f.name}' (the value slot must be the field type, 'unknown', or a union covering the field's arms)`);
1692
1973
  };
1693
- const key = `declmerge:${type.shapeId}:${srcs.map((s) => s.shapeId).join(",")}`;
1694
- let helper = lowerer.widthHelpers.get(key);
1695
- if (!helper) {
1696
- helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
1697
- const outRef = varRef("out.0", type, loc);
1698
- const ksT = arrayOf(STRING);
1699
- const locals = [{ id: "out.0", name: "out", type, mutable: false }];
1700
- const params = srcs.map((s, j) => {
1701
- locals.push({ id: `s${j}.0`, name: `s${j}`, type: s.value.type, mutable: true });
1702
- return { localId: `s${j}.0`, name: `s${j}`, type: s.value.type };
1703
- });
1704
- const body = [
1705
- {
1706
- kind: "varDecl",
1707
- localId: "out.0",
1708
- init: {
1709
- kind: "recordLit",
1710
- fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })),
1711
- type,
1712
- loc,
1713
- },
1714
- loc,
1715
- },
1716
- ];
1717
- srcs.forEach((s, j) => {
1718
- const sRef = varRef(`s${j}.0`, s.value.type, loc);
1719
- const kRef = varRef(`k${j}.0`, STRING, loc);
1720
- const vRef = varRef(`v${j}.0`, s.iv, loc);
1721
- locals.push({ id: `ks${j}.0`, name: `ks${j}`, type: ksT, mutable: false }, { id: `i${j}.0`, name: `i${j}`, type: F64, mutable: true }, { id: `k${j}.0`, name: `k${j}`, type: STRING, mutable: false }, { id: `v${j}.0`, name: `v${j}`, type: s.iv, mutable: false });
1722
- // Per-key dispatch: if (k === "a") { write a } else if ... else drop.
1723
- const dispatch = shape.fields.reduceRight((rest, f) => {
1724
- const write = (value) => ({ kind: "recordSet", obj: outRef, shapeId: type.shapeId, field: f.name, value, loc });
1725
- const c = conv(s.iv, f, vRef);
1726
- const thenBody = "value" in c ? [write(c.value)] : c.stmts(write);
1727
- return [{
1728
- kind: "if",
1729
- cond: { kind: "strEq", negated: false, left: kRef, right: { kind: "strLit", value: f.name, type: STRING, loc }, type: BOOL, loc },
1730
- then: thenBody,
1731
- else_: rest.length > 0 ? rest : null,
1732
- loc,
1733
- }];
1734
- }, []);
1735
- body.push({ kind: "varDecl", localId: `ks${j}.0`, init: { kind: "recordOvfKeys", obj: sRef, shapeId: s.shapeId, type: ksT, loc }, loc }, {
1736
- kind: "for",
1737
- init: { kind: "varDecl", localId: `i${j}.0`, init: numLit(0, loc), loc },
1738
- cond: { kind: "bin", op: "<", left: varRef(`i${j}.0`, F64, loc), right: { kind: "arrIntrinsic", method: "length", receiver: varRef(`ks${j}.0`, ksT, loc), args: [], type: F64, loc }, type: BOOL, loc },
1739
- update: { kind: "assign", localId: `i${j}.0`, value: { kind: "bin", op: "+", left: varRef(`i${j}.0`, F64, loc), right: numLit(1, loc), type: F64, loc }, loc },
1740
- body: [
1741
- { kind: "varDecl", localId: `k${j}.0`, init: { kind: "arrayGet", arr: varRef(`ks${j}.0`, ksT, loc), index: varRef(`i${j}.0`, F64, loc), type: STRING, loc }, loc },
1742
- { kind: "varDecl", localId: `v${j}.0`, init: { kind: "recordKeyGet", obj: sRef, shapeId: s.shapeId, key: kRef, overflowOnly: true, type: s.iv, loc }, loc },
1743
- ...dispatch,
1744
- ],
1745
- loc,
1746
- });
1747
- });
1748
- body.push({ kind: "return", value: outRef, loc });
1749
- lowerer.liftedFns.push({
1750
- name: helper,
1751
- params,
1752
- returnType: type,
1753
- locals,
1754
- body,
1974
+ // Apply each source before evaluating the next expression. Passing all
1975
+ // sources as one helper's arguments would read an earlier record after a
1976
+ // later source factory mutated it, contrary to object spread evaluation.
1977
+ const out = lowerer.declareHiddenLocal("%declMerge", type);
1978
+ const outRef = varRef(out.id, type, loc);
1979
+ const stmts = [{
1980
+ kind: "varDecl", localId: out.id,
1981
+ init: { kind: "recordLit", fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })), type, loc },
1755
1982
  loc,
1756
- });
1757
- // Registered only after a fence-free build: a conv() fence mid-build
1758
- // must not leave a phantom helper behind for the next literal.
1759
- lowerer.widthHelpers.set(key, helper);
1983
+ }];
1984
+ for (const source of srcs) {
1985
+ const key = `declmerge-source:${type.shapeId}:${source.shapeId}`;
1986
+ let helper = lowerer.widthHelpers.get(key);
1987
+ if (!helper) {
1988
+ helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
1989
+ const sourceType = source.value.type;
1990
+ const destination = varRef("out.0", type, loc);
1991
+ const receiver = varRef("source.0", sourceType, loc);
1992
+ const locals = [
1993
+ { id: "out.0", name: "out", type, mutable: false },
1994
+ { id: "source.0", name: "source", type: sourceType, mutable: false },
1995
+ ];
1996
+ const body = [];
1997
+ if (!source.shape) {
1998
+ // CopyDataProperties skips nullish sources, even when an erased
1999
+ // record view supplies the checker's apparent object type.
2000
+ body.push({
2001
+ kind: "if", cond: { kind: "dynTest", test: "nullish", value: receiver, type: BOOL, loc },
2002
+ then: [{ kind: "return", value: destination, loc }], else_: null, loc,
2003
+ });
2004
+ }
2005
+ for (const field of source.shape?.fields ?? []) {
2006
+ const target = shape.fields.find((candidate) => candidate.name === field.name);
2007
+ if (!target)
2008
+ continue; // The declared destination drops extra keys.
2009
+ const raw = { kind: "recordGet", obj: receiver, shapeId: source.shapeId, field: field.name, type: field.type, loc };
2010
+ const lift = lowerer.widthLiftPlan(field.type, target.type);
2011
+ if (!lift) {
2012
+ lowerer.unsupported("SC1090", expr, `object spread of field '${field.name}' from '${lowerer.fmt(field.type)}' into '${lowerer.fmt(target.type)}'`);
2013
+ }
2014
+ const write = {
2015
+ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name,
2016
+ value: lowerer.applyWidthLift(lift, raw, target.type, loc), loc,
2017
+ };
2018
+ // Optional declared fields use the established unset convention.
2019
+ // A dyn field, including a present undefined, is a real property;
2020
+ // its checked conversion runs and can overwrite an earlier value.
2021
+ const absent = field.type.kind === "union" ? lowerer.armTag(field.type.unionId, UNDEFINED_T) : -1;
2022
+ if (absent >= 0 && field.type.kind === "union") {
2023
+ body.push({ kind: "if", cond: {
2024
+ kind: "unionIsTag", unionId: field.type.unionId, tag: absent, negated: true, value: raw, type: BOOL, loc,
2025
+ }, then: [write], else_: null, loc });
2026
+ }
2027
+ else
2028
+ body.push(write);
2029
+ }
2030
+ const iv = source.shape ? source.shape.indexValue : DYN;
2031
+ if (iv) {
2032
+ const keysType = arrayOf(STRING);
2033
+ const keys = varRef("keys.0", keysType, loc);
2034
+ const index = varRef("index.0", F64, loc);
2035
+ const name = varRef("key.0", STRING, loc);
2036
+ const value = varRef("value.0", iv, loc);
2037
+ locals.push({ id: "keys.0", name: "keys", type: keysType, mutable: false }, { id: "index.0", name: "index", type: F64, mutable: true }, { id: "key.0", name: "key", type: STRING, mutable: false }, { id: "value.0", name: "value", type: iv, mutable: false });
2038
+ const dispatch = shape.fields.reduceRight((rest, field) => {
2039
+ const write = (value) => ({ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name, value, loc });
2040
+ const converted = conv(iv, field, value);
2041
+ return [{
2042
+ kind: "if",
2043
+ cond: { kind: "strEq", negated: false, left: name, right: { kind: "strLit", value: field.name, type: STRING, loc }, type: BOOL, loc },
2044
+ then: "value" in converted ? [write(converted.value)] : converted.stmts(write),
2045
+ else_: rest.length > 0 ? rest : null, loc,
2046
+ }];
2047
+ }, []);
2048
+ body.push({ kind: "varDecl", localId: "keys.0", init: source.shape
2049
+ ? { kind: "recordOvfKeys", obj: receiver, shapeId: source.shapeId, type: keysType, loc }
2050
+ : { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.objKeys", args: [receiver], type: DYN, loc }, type: keysType, loc }, loc }, {
2051
+ kind: "for",
2052
+ init: { kind: "varDecl", localId: "index.0", init: numLit(0, loc), loc },
2053
+ cond: { kind: "bin", op: "<", left: index, right: { kind: "arrIntrinsic", method: "length", receiver: keys, args: [], type: F64, loc }, type: BOOL, loc },
2054
+ update: { kind: "assign", localId: "index.0", value: { kind: "bin", op: "+", left: index, right: numLit(1, loc), type: F64, loc }, loc },
2055
+ body: [
2056
+ { kind: "varDecl", localId: "key.0", init: { kind: "arrayGet", arr: keys, index, type: STRING, loc }, loc },
2057
+ { kind: "varDecl", localId: "value.0", init: source.shape
2058
+ ? { kind: "recordKeyGet", obj: receiver, shapeId: source.shapeId, key: name, overflowOnly: true, type: iv, loc }
2059
+ : { kind: "dynKeyGet", value: receiver, key: name, type: DYN, loc }, loc },
2060
+ ...dispatch,
2061
+ ], loc,
2062
+ });
2063
+ }
2064
+ body.push({ kind: "return", value: destination, loc });
2065
+ lowerer.liftedFns.push({
2066
+ name: helper,
2067
+ params: [{ localId: "out.0", name: "out", type }, { localId: "source.0", name: "source", type: sourceType }],
2068
+ returnType: type, locals, body, loc,
2069
+ });
2070
+ // Publish only a fully checked helper: rejected conversions must not
2071
+ // leave an entry that a later literal could reuse without a body.
2072
+ lowerer.widthHelpers.set(key, helper);
2073
+ }
2074
+ stmts.push({ kind: "exprStmt", expr: { kind: "call", callee: helper, args: [outRef, source.value], type, loc }, loc });
1760
2075
  }
1761
- return { kind: "call", callee: helper, args: srcs.map((s) => s.value), type, loc };
2076
+ return { kind: "seqExpr", stmts, result: outRef, type, loc };
1762
2077
  }
1763
2078
  /** The value of a shorthand property (`{ x }`): the binding `x` refers to.
1764
2079
  * The property name's own symbol is the PROPERTY, so resolution goes
@@ -1769,6 +2084,14 @@ export function lowerShorthandValue(lowerer, prop) {
1769
2084
  const propName = prop.name;
1770
2085
  const loc = locOf(propName);
1771
2086
  const symbol = lowerer.checker.getShorthandAssignmentValueSymbol(prop);
2087
+ // Import identifiers in shorthand position carry the property's symbol,
2088
+ // so the ordinary identifier expression path cannot resolve them.
2089
+ const builtin = lowerer.builtinImportOf(propName);
2090
+ if (builtin) {
2091
+ const callable = lowerer.lowerBuiltinCallableValue(builtin, loc);
2092
+ if (callable)
2093
+ return callable;
2094
+ }
1772
2095
  if (symbol) {
1773
2096
  if (lowerer.ctx.selfSymbol === symbol) {
1774
2097
  return { kind: "selfRef", type: lowerer.ctx.selfType, loc };
@@ -1786,7 +2109,7 @@ export function lowerShorthandValue(lowerer, prop) {
1786
2109
  const sig = lowerer.fnSigsBySymbol.get(resolved);
1787
2110
  const decl = lowerer.checker.declarationsOf(resolved)[0];
1788
2111
  if (sig && decl && ts.isFunctionDeclaration(decl) &&
1789
- (ts.isSourceFile(decl.parent) || lowerer.nsBlocks.get(decl.parent) === "flattened")) {
2112
+ (ts.isSourceFile(decl.parent) || (decl.parent !== undefined && lowerer.nsBlocks.get(decl.parent) === "flattened"))) {
1790
2113
  lowerer.noteEdge(sig.name);
1791
2114
  const funcType = {
1792
2115
  kind: "func",
@@ -1797,17 +2120,20 @@ export function lowerShorthandValue(lowerer, prop) {
1797
2120
  lowerer.requireExactArityValue(prop, propName, sig.params, funcType);
1798
2121
  return { kind: "closure", fnName: sig.name, captures: [], type: funcType, loc };
1799
2122
  }
1800
- if (lowerer.genericFnsBySymbol.has(resolved)) {
2123
+ const generic = lowerer.genericFnsBySymbol.get(resolved);
2124
+ if (generic?.implicitParams)
2125
+ return lowerer.lowerGenericFnValue(propName, generic);
2126
+ if (generic) {
1801
2127
  lowerer.unsupported("SC1090", prop, `generic functions as values (call '${propName.text}' directly)`);
1802
2128
  }
1803
2129
  }
1804
2130
  lowerer.rejectUnresolvedSymbol(symbol ? (symbol.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(symbol) : symbol) : null, propName.text, prop, `the reference to '${propName.text}' (a binding form with no lowering)`);
1805
2131
  }
1806
- /** Rejects any `this` inside an object-literal method body — including in
1807
- * nested arrows, which inherit the method's `this` (nested function
1808
- * expressions reset it, but their bare `this` is already a tsc error
1809
- * under noImplicitThis, so over-rejecting them here changes nothing). */
2132
+ /** Rejects the method's own receiver, including lexical captures in
2133
+ * arrows. Nested ordinary functions bind their own ambient receiver. */
1810
2134
  export function rejectThisInObjectMethod(lowerer, node) {
2135
+ if (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isAccessor(node))
2136
+ return;
1811
2137
  if (node.kind === ts.SyntaxKind.ThisKeyword) {
1812
2138
  lowerer.unsupported("SC1090", node, "references to 'this' in object literal methods");
1813
2139
  }