@scriptc/compiler 0.2.4 → 0.2.6

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 (1201) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +972 -245
  2. package/ambient/scriptc-overrides.d.ts +5 -1
  3. package/ambient/scriptc.d.ts +22 -2
  4. package/dist/backend/build-cache.d.ts +4 -0
  5. package/dist/backend/build-cache.js +16 -2
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cycle-analysis.js +17 -5
  8. package/dist/backend/cycle-analysis.js.map +1 -1
  9. package/dist/backend/cycle-analysis.test.js +50 -11
  10. package/dist/backend/cycle-analysis.test.js.map +1 -1
  11. package/dist/backend/debug-symbols.js.map +1 -1
  12. package/dist/backend/executable-features.js +3 -1
  13. package/dist/backend/executable-features.js.map +1 -1
  14. package/dist/backend/external-c.d.ts +13 -6
  15. package/dist/backend/external-c.js +15 -3
  16. package/dist/backend/external-c.js.map +1 -1
  17. package/dist/backend/ffi-callbacks.js +6 -9
  18. package/dist/backend/ffi-callbacks.js.map +1 -1
  19. package/dist/backend/library-identity-markers.js.map +1 -1
  20. package/dist/backend/library-pack.d.ts +1 -1
  21. package/dist/backend/library-pack.js +81 -24
  22. package/dist/backend/library-pack.js.map +1 -1
  23. package/dist/backend/link-plan-core.d.ts +2 -0
  24. package/dist/backend/link-plan-core.js +10 -2
  25. package/dist/backend/link-plan-core.js.map +1 -1
  26. package/dist/backend/link-plan.d.ts +2 -1
  27. package/dist/backend/link-plan.js +7 -5
  28. package/dist/backend/link-plan.js.map +1 -1
  29. package/dist/backend/linker.d.ts +1 -1
  30. package/dist/backend/linker.js +42 -23
  31. package/dist/backend/linker.js.map +1 -1
  32. package/dist/backend/literals.js +5 -4
  33. package/dist/backend/literals.js.map +1 -1
  34. package/dist/backend/literals.test.js +30 -5
  35. package/dist/backend/literals.test.js.map +1 -1
  36. package/dist/backend/llvm/blocks.test.js +5 -2
  37. package/dist/backend/llvm/blocks.test.js.map +1 -1
  38. package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
  39. package/dist/backend/llvm/borrowed-receivers.js +43 -19
  40. package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
  41. package/dist/backend/llvm/byte-numbers.js +38 -5
  42. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  43. package/dist/backend/llvm/byte-windows.d.ts +31 -0
  44. package/dist/backend/llvm/byte-windows.js +334 -0
  45. package/dist/backend/llvm/byte-windows.js.map +1 -0
  46. package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
  47. package/dist/backend/llvm/byte-windows.test.js +244 -0
  48. package/dist/backend/llvm/byte-windows.test.js.map +1 -0
  49. package/dist/backend/llvm/bytes-bounds.js +73 -22
  50. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  51. package/dist/backend/llvm/call-lifetimes.d.ts +5 -2
  52. package/dist/backend/llvm/call-lifetimes.js +72 -19
  53. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  54. package/dist/backend/llvm/call-lifetimes.test.js +159 -28
  55. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  56. package/dist/backend/llvm/checked-value-lifetimes.d.ts +4 -0
  57. package/dist/backend/llvm/checked-value-lifetimes.js +14 -4
  58. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  59. package/dist/backend/llvm/classes.d.ts +14 -1
  60. package/dist/backend/llvm/classes.js +94 -19
  61. package/dist/backend/llvm/classes.js.map +1 -1
  62. package/dist/backend/llvm/classes.test.d.ts +1 -0
  63. package/dist/backend/llvm/classes.test.js +99 -0
  64. package/dist/backend/llvm/classes.test.js.map +1 -0
  65. package/dist/backend/llvm/common.js +4 -1
  66. package/dist/backend/llvm/common.js.map +1 -1
  67. package/dist/backend/llvm/constant-callbacks.d.ts +11 -0
  68. package/dist/backend/llvm/constant-callbacks.js +213 -0
  69. package/dist/backend/llvm/constant-callbacks.js.map +1 -0
  70. package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
  71. package/dist/backend/llvm/constant-callbacks.test.js +124 -0
  72. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
  73. package/dist/backend/llvm/counted-loops.js +10 -3
  74. package/dist/backend/llvm/counted-loops.js.map +1 -1
  75. package/dist/backend/llvm/debug-info.js +33 -13
  76. package/dist/backend/llvm/debug-info.js.map +1 -1
  77. package/dist/backend/llvm/debug-info.test.js +28 -6
  78. package/dist/backend/llvm/debug-info.test.js.map +1 -1
  79. package/dist/backend/llvm/dyn.d.ts +1 -1
  80. package/dist/backend/llvm/dyn.js +75 -56
  81. package/dist/backend/llvm/dyn.js.map +1 -1
  82. package/dist/backend/llvm/emitter.d.ts +28 -3
  83. package/dist/backend/llvm/emitter.js +506 -145
  84. package/dist/backend/llvm/emitter.js.map +1 -1
  85. package/dist/backend/llvm/emitter.test.js +247 -50
  86. package/dist/backend/llvm/emitter.test.js.map +1 -1
  87. package/dist/backend/llvm/expr-async.js +25 -6
  88. package/dist/backend/llvm/expr-async.js.map +1 -1
  89. package/dist/backend/llvm/expr-bytes.js +24 -4
  90. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  91. package/dist/backend/llvm/expr-callbacks.js +10 -4
  92. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  93. package/dist/backend/llvm/expr-calls.js +110 -31
  94. package/dist/backend/llvm/expr-calls.js.map +1 -1
  95. package/dist/backend/llvm/expr-containers.d.ts +2 -0
  96. package/dist/backend/llvm/expr-containers.js +112 -41
  97. package/dist/backend/llvm/expr-containers.js.map +1 -1
  98. package/dist/backend/llvm/expr-control.js +1 -3
  99. package/dist/backend/llvm/expr-control.js.map +1 -1
  100. package/dist/backend/llvm/expr-dispatch.js +3 -1
  101. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  102. package/dist/backend/llvm/expr-dynamic.js +55 -7
  103. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  104. package/dist/backend/llvm/expr-island.js +26 -6
  105. package/dist/backend/llvm/expr-island.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +95 -19
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +44 -2
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.js +10 -9
  111. package/dist/backend/llvm/expr-records.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.js +44 -26
  113. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-bridges.test.js +51 -14
  115. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-callbacks.js +34 -14
  117. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  118. package/dist/backend/llvm/integer-remainder.d.ts +7 -0
  119. package/dist/backend/llvm/integer-remainder.js +26 -0
  120. package/dist/backend/llvm/integer-remainder.js.map +1 -0
  121. package/dist/backend/llvm/integer-values.js +15 -4
  122. package/dist/backend/llvm/integer-values.js.map +1 -1
  123. package/dist/backend/llvm/integer-views.js +23 -7
  124. package/dist/backend/llvm/integer-views.js.map +1 -1
  125. package/dist/backend/llvm/integer-views.test.js +42 -7
  126. package/dist/backend/llvm/integer-views.test.js.map +1 -1
  127. package/dist/backend/llvm/layouts.js +1 -1
  128. package/dist/backend/llvm/layouts.js.map +1 -1
  129. package/dist/backend/llvm/lib-abi.js +20 -4
  130. package/dist/backend/llvm/lib-abi.js.map +1 -1
  131. package/dist/backend/llvm/lib-connect.js +7 -1
  132. package/dist/backend/llvm/lib-connect.js.map +1 -1
  133. package/dist/backend/llvm/lib-datagram.js +35 -10
  134. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  135. package/dist/backend/llvm/lib-dispatch.js +42 -38
  136. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  137. package/dist/backend/llvm/lib-filesystem.js +33 -18
  138. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  139. package/dist/backend/llvm/lib-http2.js +60 -15
  140. package/dist/backend/llvm/lib-http2.js.map +1 -1
  141. package/dist/backend/llvm/lib-lookup.js +12 -5
  142. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  143. package/dist/backend/llvm/lib-network.js +97 -31
  144. package/dist/backend/llvm/lib-network.js.map +1 -1
  145. package/dist/backend/llvm/lib-process.js +57 -14
  146. package/dist/backend/llvm/lib-process.js.map +1 -1
  147. package/dist/backend/llvm/lib-shared.js +122 -31
  148. package/dist/backend/llvm/lib-shared.js.map +1 -1
  149. package/dist/backend/llvm/lib-stream.js +33 -14
  150. package/dist/backend/llvm/lib-stream.js.map +1 -1
  151. package/dist/backend/llvm/lib-test.js +21 -7
  152. package/dist/backend/llvm/lib-test.js.map +1 -1
  153. package/dist/backend/llvm/lib-tls.js +69 -20
  154. package/dist/backend/llvm/lib-tls.js.map +1 -1
  155. package/dist/backend/llvm/local-array-reads.d.ts +9 -2
  156. package/dist/backend/llvm/local-array-reads.js +176 -89
  157. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  158. package/dist/backend/llvm/local-array-reads.test.js +394 -62
  159. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  160. package/dist/backend/llvm/local-union-storage.d.ts +25 -0
  161. package/dist/backend/llvm/local-union-storage.js +109 -0
  162. package/dist/backend/llvm/local-union-storage.js.map +1 -0
  163. package/dist/backend/llvm/local-union-storage.test.d.ts +1 -0
  164. package/dist/backend/llvm/local-union-storage.test.js +210 -0
  165. package/dist/backend/llvm/local-union-storage.test.js.map +1 -0
  166. package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
  167. package/dist/backend/llvm/loop-array-borrows.js +70 -0
  168. package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
  169. package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
  170. package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
  171. package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
  172. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -2
  173. package/dist/backend/llvm/map-read-lifetimes.js +64 -19
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/map-read-lifetimes.test.js +89 -17
  176. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  177. package/dist/backend/llvm/reference-effects.d.ts +5 -3
  178. package/dist/backend/llvm/reference-effects.js +74 -36
  179. package/dist/backend/llvm/reference-effects.js.map +1 -1
  180. package/dist/backend/llvm/reference-effects.test.js +92 -9
  181. package/dist/backend/llvm/reference-effects.test.js.map +1 -1
  182. package/dist/backend/llvm/shapes.d.ts +4 -1
  183. package/dist/backend/llvm/shapes.js +82 -24
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +3 -1
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/split-loops.d.ts +48 -0
  188. package/dist/backend/llvm/split-loops.js +183 -0
  189. package/dist/backend/llvm/split-loops.js.map +1 -0
  190. package/dist/backend/llvm/split.js +4 -11
  191. package/dist/backend/llvm/split.js.map +1 -1
  192. package/dist/backend/llvm/split.test.js +80 -8
  193. package/dist/backend/llvm/split.test.js.map +1 -1
  194. package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
  195. package/dist/backend/llvm/stack-callbacks.js +73 -0
  196. package/dist/backend/llvm/stack-callbacks.js.map +1 -0
  197. package/dist/backend/llvm/stack-captures.d.ts +25 -0
  198. package/dist/backend/llvm/stack-captures.js +150 -0
  199. package/dist/backend/llvm/stack-captures.js.map +1 -0
  200. package/dist/backend/llvm/stack-unions.js +14 -5
  201. package/dist/backend/llvm/stack-unions.js.map +1 -1
  202. package/dist/backend/llvm/stack-unions.test.js +151 -32
  203. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  204. package/dist/backend/llvm/string-construction.js.map +1 -1
  205. package/dist/backend/llvm/string-construction.test.js +32 -7
  206. package/dist/backend/llvm/string-construction.test.js.map +1 -1
  207. package/dist/backend/llvm/string-lifetimes.js +14 -8
  208. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  209. package/dist/backend/llvm/string-lifetimes.test.js +119 -29
  210. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  211. package/dist/backend/llvm/string-slices.d.ts +20 -0
  212. package/dist/backend/llvm/string-slices.js +87 -0
  213. package/dist/backend/llvm/string-slices.js.map +1 -0
  214. package/dist/backend/llvm/string-slices.test.d.ts +1 -0
  215. package/dist/backend/llvm/string-slices.test.js +98 -0
  216. package/dist/backend/llvm/string-slices.test.js.map +1 -0
  217. package/dist/backend/llvm/switch-dispatch.d.ts +9 -0
  218. package/dist/backend/llvm/switch-dispatch.js +114 -0
  219. package/dist/backend/llvm/switch-dispatch.js.map +1 -0
  220. package/dist/backend/llvm/switch-dispatch.test.d.ts +1 -0
  221. package/dist/backend/llvm/switch-dispatch.test.js +83 -0
  222. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -0
  223. package/dist/backend/llvm/unsupported.js.map +1 -1
  224. package/dist/backend/llvm/walkers.d.ts +4 -14
  225. package/dist/backend/llvm/walkers.js +58 -313
  226. package/dist/backend/llvm/walkers.js.map +1 -1
  227. package/dist/backend/mangle.js +9 -3
  228. package/dist/backend/mangle.js.map +1 -1
  229. package/dist/backend/may-throw.js +18 -8
  230. package/dist/backend/may-throw.js.map +1 -1
  231. package/dist/backend/may-throw.test.js +119 -23
  232. package/dist/backend/may-throw.test.js.map +1 -1
  233. package/dist/backend/native/artifact-stamps.d.ts +39 -0
  234. package/dist/backend/native/artifact-stamps.js +371 -0
  235. package/dist/backend/native/artifact-stamps.js.map +1 -0
  236. package/dist/backend/native/cache-warm.d.ts +24 -0
  237. package/dist/backend/native/cache-warm.js +80 -0
  238. package/dist/backend/native/cache-warm.js.map +1 -0
  239. package/dist/backend/native/compiler-fingerprint.d.ts +19 -0
  240. package/dist/backend/native/compiler-fingerprint.js +357 -0
  241. package/dist/backend/native/compiler-fingerprint.js.map +1 -0
  242. package/dist/backend/native/contracts.d.ts +316 -0
  243. package/dist/backend/native/contracts.js +2 -0
  244. package/dist/backend/native/contracts.js.map +1 -0
  245. package/dist/backend/native/dependency-files.d.ts +5 -0
  246. package/dist/backend/native/dependency-files.js +83 -0
  247. package/dist/backend/native/dependency-files.js.map +1 -0
  248. package/dist/backend/native/driver.d.ts +50 -0
  249. package/dist/backend/native/driver.js +294 -0
  250. package/dist/backend/native/driver.js.map +1 -0
  251. package/dist/backend/native/executable.d.ts +18 -0
  252. package/dist/backend/native/executable.js +1275 -0
  253. package/dist/backend/native/executable.js.map +1 -0
  254. package/dist/backend/native/library.d.ts +2 -0
  255. package/dist/backend/native/library.js +614 -0
  256. package/dist/backend/native/library.js.map +1 -0
  257. package/dist/backend/native/linker-fingerprint.d.ts +8 -0
  258. package/dist/backend/native/linker-fingerprint.js +174 -0
  259. package/dist/backend/native/linker-fingerprint.js.map +1 -0
  260. package/dist/backend/native/object-merge.d.ts +2 -0
  261. package/dist/backend/native/object-merge.js +154 -0
  262. package/dist/backend/native/object-merge.js.map +1 -0
  263. package/dist/backend/native/process.d.ts +17 -0
  264. package/dist/backend/native/process.js +42 -0
  265. package/dist/backend/native/process.js.map +1 -0
  266. package/dist/backend/native/program-shards.d.ts +21 -0
  267. package/dist/backend/native/program-shards.js +99 -0
  268. package/dist/backend/native/program-shards.js.map +1 -0
  269. package/dist/backend/native/runtime-inputs.d.ts +12 -0
  270. package/dist/backend/native/runtime-inputs.js +165 -0
  271. package/dist/backend/native/runtime-inputs.js.map +1 -0
  272. package/dist/backend/native/runtime-inputs.test.d.ts +1 -0
  273. package/dist/backend/native/runtime-inputs.test.js +64 -0
  274. package/dist/backend/native/runtime-inputs.test.js.map +1 -0
  275. package/dist/backend/native/runtime-objects.d.ts +16 -0
  276. package/dist/backend/native/runtime-objects.js +122 -0
  277. package/dist/backend/native/runtime-objects.js.map +1 -0
  278. package/dist/backend/native/session.d.ts +12 -0
  279. package/dist/backend/native/session.js +31 -0
  280. package/dist/backend/native/session.js.map +1 -0
  281. package/dist/backend/native/tool-identity.d.ts +37 -0
  282. package/dist/backend/native/tool-identity.js +310 -0
  283. package/dist/backend/native/tool-identity.js.map +1 -0
  284. package/dist/backend/native/trace-paths.d.ts +12 -0
  285. package/dist/backend/native/trace-paths.js +73 -0
  286. package/dist/backend/native/trace-paths.js.map +1 -0
  287. package/dist/backend/native/vendor.d.ts +1 -0
  288. package/dist/backend/native/vendor.js +12 -0
  289. package/dist/backend/native/vendor.js.map +1 -0
  290. package/dist/backend/native-codegen-core.d.ts +6 -0
  291. package/dist/backend/native-codegen-core.js +23 -1
  292. package/dist/backend/native-codegen-core.js.map +1 -1
  293. package/dist/backend/native-codegen.d.ts +5 -1
  294. package/dist/backend/native-codegen.js +52 -25
  295. package/dist/backend/native-codegen.js.map +1 -1
  296. package/dist/backend/native-codegen.test.js +59 -11
  297. package/dist/backend/native-codegen.test.js.map +1 -1
  298. package/dist/backend/native-link-info-core.d.ts +1 -0
  299. package/dist/backend/native-link-info-core.js +9 -5
  300. package/dist/backend/native-link-info-core.js.map +1 -1
  301. package/dist/backend/native-link-info.js +14 -5
  302. package/dist/backend/native-link-info.js.map +1 -1
  303. package/dist/backend/native-link-info.test.js +58 -13
  304. package/dist/backend/native-link-info.test.js.map +1 -1
  305. package/dist/backend/native-toolchain.d.ts +17 -450
  306. package/dist/backend/native-toolchain.js +17 -3971
  307. package/dist/backend/native-toolchain.js.map +1 -1
  308. package/dist/backend/native-toolchain.test.js +103 -72
  309. package/dist/backend/native-toolchain.test.js.map +1 -1
  310. package/dist/backend/native-tools.d.ts +3 -1
  311. package/dist/backend/native-tools.js +30 -9
  312. package/dist/backend/native-tools.js.map +1 -1
  313. package/dist/backend/object-localize.js +17 -14
  314. package/dist/backend/object-localize.js.map +1 -1
  315. package/dist/backend/object-localize.test.js +59 -12
  316. package/dist/backend/object-localize.test.js.map +1 -1
  317. package/dist/backend/runtime-abi.d.ts +2 -2
  318. package/dist/backend/runtime-abi.js +2 -2
  319. package/dist/backend/runtime-pack-core.d.ts +1 -0
  320. package/dist/backend/runtime-pack-core.js +104 -50
  321. package/dist/backend/runtime-pack-core.js.map +1 -1
  322. package/dist/backend/runtime-pack-native.js +5 -3
  323. package/dist/backend/runtime-pack-native.js.map +1 -1
  324. package/dist/backend/runtime-pack-targets.test.js +126 -17
  325. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  326. package/dist/backend/runtime-pack.d.ts +1 -1
  327. package/dist/backend/runtime-pack.js +11 -12
  328. package/dist/backend/runtime-pack.js.map +1 -1
  329. package/dist/backend/runtime-pack.test.js +51 -25
  330. package/dist/backend/runtime-pack.test.js.map +1 -1
  331. package/dist/backend/source-locations.js.map +1 -1
  332. package/dist/backend/source-locations.test.js +7 -2
  333. package/dist/backend/source-locations.test.js.map +1 -1
  334. package/dist/backend/target-diagnostics.js +44 -14
  335. package/dist/backend/target-diagnostics.js.map +1 -1
  336. package/dist/backend/target-diagnostics.test.js +93 -20
  337. package/dist/backend/target-diagnostics.test.js.map +1 -1
  338. package/dist/backend/targets.js +230 -86
  339. package/dist/backend/targets.js.map +1 -1
  340. package/dist/backend/targets.test.js +32 -18
  341. package/dist/backend/targets.test.js.map +1 -1
  342. package/dist/backend/toolchain-environment.js +5 -1
  343. package/dist/backend/toolchain-environment.js.map +1 -1
  344. package/dist/backend/vendor-archives.d.ts +2 -2
  345. package/dist/backend/vendor-archives.js +84 -35
  346. package/dist/backend/vendor-archives.js.map +1 -1
  347. package/dist/backend/vendor-inputs.js +13 -1
  348. package/dist/backend/vendor-inputs.js.map +1 -1
  349. package/dist/backend/warm-cache.d.ts +1 -1
  350. package/dist/backend/warm-cache.js +33 -9
  351. package/dist/backend/warm-cache.js.map +1 -1
  352. package/dist/cli/command.js +39 -9
  353. package/dist/cli/command.js.map +1 -1
  354. package/dist/cli/output-options.js +14 -4
  355. package/dist/cli/output-options.js.map +1 -1
  356. package/dist/cli/paths.js.map +1 -1
  357. package/dist/cli/wasi-runner.js.map +1 -1
  358. package/dist/compat/fetch-profile.js +36 -35
  359. package/dist/compat/fetch-profile.js.map +1 -1
  360. package/dist/coverage/report.js +16 -17
  361. package/dist/coverage/report.js.map +1 -1
  362. package/dist/coverage/surface-manifest.js +112 -26
  363. package/dist/coverage/surface-manifest.js.map +1 -1
  364. package/dist/diagnostics/diagnostic.js +55 -16
  365. package/dist/diagnostics/diagnostic.js.map +1 -1
  366. package/dist/executable/executable-cache.d.ts +2 -1
  367. package/dist/executable/executable-cache.js +79 -48
  368. package/dist/executable/executable-cache.js.map +1 -1
  369. package/dist/executable/executable-cache.test.js +90 -26
  370. package/dist/executable/executable-cache.test.js.map +1 -1
  371. package/dist/executable/prepare.js +2 -2
  372. package/dist/executable/prepare.js.map +1 -1
  373. package/dist/ffi/ffi-manifest.js +78 -20
  374. package/dist/ffi/ffi-manifest.js.map +1 -1
  375. package/dist/ffi/ffi-manifest.test.js +96 -16
  376. package/dist/ffi/ffi-manifest.test.js.map +1 -1
  377. package/dist/format-integer.js.map +1 -1
  378. package/dist/frontend/analysis.js +12 -2
  379. package/dist/frontend/analysis.js.map +1 -1
  380. package/dist/frontend/arguments-usage.js.map +1 -1
  381. package/dist/frontend/binding-source.js +9 -3
  382. package/dist/frontend/binding-source.js.map +1 -1
  383. package/dist/frontend/builtin-modules.js +46 -2
  384. package/dist/frontend/builtin-modules.js.map +1 -1
  385. package/dist/frontend/cjs-resolve.js +40 -17
  386. package/dist/frontend/cjs-resolve.js.map +1 -1
  387. package/dist/frontend/cjs-syntax.js +31 -10
  388. package/dist/frontend/cjs-syntax.js.map +1 -1
  389. package/dist/frontend/comptime-node.test.js +10 -11
  390. package/dist/frontend/comptime-node.test.js.map +1 -1
  391. package/dist/frontend/dts-paths.js +7 -3
  392. package/dist/frontend/dts-paths.js.map +1 -1
  393. package/dist/frontend/fork-target.d.ts +5 -0
  394. package/dist/frontend/fork-target.js +55 -18
  395. package/dist/frontend/fork-target.js.map +1 -1
  396. package/dist/frontend/fork-target.test.d.ts +1 -0
  397. package/dist/frontend/fork-target.test.js +59 -0
  398. package/dist/frontend/fork-target.test.js.map +1 -0
  399. package/dist/frontend/function-completion.js +11 -6
  400. package/dist/frontend/function-completion.js.map +1 -1
  401. package/dist/frontend/helper-tokens.js +53 -6
  402. package/dist/frontend/helper-tokens.js.map +1 -1
  403. package/dist/frontend/helper-tokens.test.js +18 -2
  404. package/dist/frontend/helper-tokens.test.js.map +1 -1
  405. package/dist/frontend/inferred-js-diagnostics.js +32 -12
  406. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  407. package/dist/frontend/inferred-js-diagnostics.test.js +11 -15
  408. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  409. package/dist/frontend/input-tracker.js +11 -11
  410. package/dist/frontend/input-tracker.js.map +1 -1
  411. package/dist/frontend/input-tracker.test.js +4 -1
  412. package/dist/frontend/input-tracker.test.js.map +1 -1
  413. package/dist/frontend/lib-contract.js +38 -9
  414. package/dist/frontend/lib-contract.js.map +1 -1
  415. package/dist/frontend/literal-values.js.map +1 -1
  416. package/dist/frontend/literal-values.test.js +28 -8
  417. package/dist/frontend/literal-values.test.js.map +1 -1
  418. package/dist/frontend/lowering/abstract-equality.js +53 -10
  419. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  420. package/dist/frontend/lowering/array-indexed-mutation.d.ts +1 -1
  421. package/dist/frontend/lowering/array-indexed-mutation.js +108 -106
  422. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  423. package/dist/frontend/lowering/array-values.js +37 -14
  424. package/dist/frontend/lowering/array-values.js.map +1 -1
  425. package/dist/frontend/lowering/binding-analysis.d.ts +50 -0
  426. package/dist/frontend/lowering/binding-analysis.js +376 -0
  427. package/dist/frontend/lowering/binding-analysis.js.map +1 -0
  428. package/dist/frontend/lowering/builtin-calls.d.ts +9 -0
  429. package/dist/frontend/lowering/builtin-calls.js +60 -0
  430. package/dist/frontend/lowering/builtin-calls.js.map +1 -0
  431. package/dist/frontend/lowering/builtins/arguments.d.ts +43 -0
  432. package/dist/frontend/lowering/builtins/arguments.js +247 -0
  433. package/dist/frontend/lowering/builtins/arguments.js.map +1 -0
  434. package/dist/frontend/lowering/builtins/async-context.d.ts +52 -0
  435. package/dist/frontend/lowering/builtins/async-context.js +436 -0
  436. package/dist/frontend/lowering/builtins/async-context.js.map +1 -0
  437. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -0
  438. package/dist/frontend/lowering/builtins/atomics.js +82 -0
  439. package/dist/frontend/lowering/builtins/atomics.js.map +1 -0
  440. package/dist/frontend/lowering/builtins/callable-aliases.d.ts +13 -0
  441. package/dist/frontend/lowering/builtins/callable-aliases.js +87 -0
  442. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -0
  443. package/dist/frontend/lowering/builtins/child-process-async.d.ts +18 -0
  444. package/dist/frontend/lowering/builtins/child-process-async.js +245 -0
  445. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -0
  446. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +21 -0
  447. package/dist/frontend/lowering/builtins/child-process-methods.js +362 -0
  448. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -0
  449. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +4 -0
  450. package/dist/frontend/lowering/builtins/child-process-sync.js +639 -0
  451. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -0
  452. package/dist/frontend/lowering/builtins/child-process.d.ts +55 -0
  453. package/dist/frontend/lowering/builtins/child-process.js +669 -0
  454. package/dist/frontend/lowering/builtins/child-process.js.map +1 -0
  455. package/dist/frontend/lowering/builtins/compression.d.ts +7 -0
  456. package/dist/frontend/lowering/builtins/compression.js +115 -0
  457. package/dist/frontend/lowering/builtins/compression.js.map +1 -0
  458. package/dist/frontend/lowering/builtins/console.d.ts +10 -0
  459. package/dist/frontend/lowering/builtins/console.js +38 -0
  460. package/dist/frontend/lowering/builtins/console.js.map +1 -0
  461. package/dist/frontend/lowering/builtins/constants.d.ts +24 -0
  462. package/dist/frontend/lowering/builtins/constants.js +141 -0
  463. package/dist/frontend/lowering/builtins/constants.js.map +1 -0
  464. package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
  465. package/dist/frontend/lowering/builtins/crypto.js +517 -0
  466. package/dist/frontend/lowering/builtins/crypto.js.map +1 -0
  467. package/dist/frontend/lowering/builtins/dates.d.ts +7 -0
  468. package/dist/frontend/lowering/builtins/dates.js +101 -0
  469. package/dist/frontend/lowering/builtins/dates.js.map +1 -0
  470. package/dist/frontend/lowering/builtins/environment.d.ts +34 -0
  471. package/dist/frontend/lowering/builtins/environment.js +95 -0
  472. package/dist/frontend/lowering/builtins/environment.js.map +1 -0
  473. package/dist/frontend/lowering/builtins/errors.d.ts +14 -0
  474. package/dist/frontend/lowering/builtins/errors.js +83 -0
  475. package/dist/frontend/lowering/builtins/errors.js.map +1 -0
  476. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +35 -0
  477. package/dist/frontend/lowering/builtins/filesystem-calls.js +725 -0
  478. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -0
  479. package/dist/frontend/lowering/builtins/filesystem.d.ts +108 -0
  480. package/dist/frontend/lowering/builtins/filesystem.js +1061 -0
  481. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -0
  482. package/dist/frontend/lowering/builtins/ipc.d.ts +8 -0
  483. package/dist/frontend/lowering/builtins/ipc.js +76 -0
  484. package/dist/frontend/lowering/builtins/ipc.js.map +1 -0
  485. package/dist/frontend/lowering/builtins/json.d.ts +12 -0
  486. package/dist/frontend/lowering/builtins/json.js +387 -0
  487. package/dist/frontend/lowering/builtins/json.js.map +1 -0
  488. package/dist/frontend/lowering/builtins/module-bindings.d.ts +85 -0
  489. package/dist/frontend/lowering/builtins/module-bindings.js +346 -0
  490. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -0
  491. package/dist/frontend/lowering/builtins/module-calls.d.ts +8 -0
  492. package/dist/frontend/lowering/builtins/module-calls.js +308 -0
  493. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -0
  494. package/dist/frontend/lowering/builtins/module-resolution.d.ts +38 -0
  495. package/dist/frontend/lowering/builtins/module-resolution.js +344 -0
  496. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -0
  497. package/dist/frontend/lowering/builtins/numbers.d.ts +15 -0
  498. package/dist/frontend/lowering/builtins/numbers.js +124 -0
  499. package/dist/frontend/lowering/builtins/numbers.js.map +1 -0
  500. package/dist/frontend/lowering/builtins/operating-system.d.ts +13 -0
  501. package/dist/frontend/lowering/builtins/operating-system.js +148 -0
  502. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -0
  503. package/dist/frontend/lowering/builtins/performance.d.ts +13 -0
  504. package/dist/frontend/lowering/builtins/performance.js +100 -0
  505. package/dist/frontend/lowering/builtins/performance.js.map +1 -0
  506. package/dist/frontend/lowering/builtins/process.d.ts +50 -0
  507. package/dist/frontend/lowering/builtins/process.js +1138 -0
  508. package/dist/frontend/lowering/builtins/process.js.map +1 -0
  509. package/dist/frontend/lowering/builtins/promises.d.ts +14 -0
  510. package/dist/frontend/lowering/builtins/promises.js +356 -0
  511. package/dist/frontend/lowering/builtins/promises.js.map +1 -0
  512. package/dist/frontend/lowering/builtins/properties.d.ts +11 -0
  513. package/dist/frontend/lowering/builtins/properties.js +186 -0
  514. package/dist/frontend/lowering/builtins/properties.js.map +1 -0
  515. package/dist/frontend/lowering/builtins/querystring.d.ts +19 -0
  516. package/dist/frontend/lowering/builtins/querystring.js +150 -0
  517. package/dist/frontend/lowering/builtins/querystring.js.map +1 -0
  518. package/dist/frontend/lowering/builtins/readline.d.ts +13 -0
  519. package/dist/frontend/lowering/builtins/readline.js +138 -0
  520. package/dist/frontend/lowering/builtins/readline.js.map +1 -0
  521. package/dist/frontend/lowering/builtins/receiver-types.d.ts +5 -0
  522. package/dist/frontend/lowering/builtins/receiver-types.js +15 -0
  523. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -0
  524. package/dist/frontend/lowering/builtins/reflection.d.ts +13 -0
  525. package/dist/frontend/lowering/builtins/reflection.js +95 -0
  526. package/dist/frontend/lowering/builtins/reflection.js.map +1 -0
  527. package/dist/frontend/lowering/builtins/strings.d.ts +14 -0
  528. package/dist/frontend/lowering/builtins/strings.js +121 -0
  529. package/dist/frontend/lowering/builtins/strings.js.map +1 -0
  530. package/dist/frontend/lowering/builtins/text-codecs.d.ts +29 -0
  531. package/dist/frontend/lowering/builtins/text-codecs.js +590 -0
  532. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -0
  533. package/dist/frontend/lowering/builtins/timers.d.ts +22 -0
  534. package/dist/frontend/lowering/builtins/timers.js +180 -0
  535. package/dist/frontend/lowering/builtins/timers.js.map +1 -0
  536. package/dist/frontend/lowering/builtins/url.d.ts +37 -0
  537. package/dist/frontend/lowering/builtins/url.js +596 -0
  538. package/dist/frontend/lowering/builtins/url.js.map +1 -0
  539. package/dist/frontend/lowering/builtins/util-types.d.ts +7 -0
  540. package/dist/frontend/lowering/builtins/util-types.js +31 -0
  541. package/dist/frontend/lowering/builtins/util-types.js.map +1 -0
  542. package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
  543. package/dist/frontend/lowering/builtins/workers.js +65 -0
  544. package/dist/frontend/lowering/builtins/workers.js.map +1 -0
  545. package/dist/frontend/lowering/call-arguments.d.ts +72 -0
  546. package/dist/frontend/lowering/call-arguments.js +618 -0
  547. package/dist/frontend/lowering/call-arguments.js.map +1 -0
  548. package/dist/frontend/lowering/call-signatures.d.ts +115 -0
  549. package/dist/frontend/lowering/call-signatures.js +719 -0
  550. package/dist/frontend/lowering/call-signatures.js.map +1 -0
  551. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  552. package/dist/frontend/lowering/checked-iterable-spread.js +53 -10
  553. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -1
  554. package/dist/frontend/lowering/checked-promise-all.js +41 -9
  555. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  556. package/dist/frontend/lowering/class-assertions.d.ts +7 -0
  557. package/dist/frontend/lowering/class-assertions.js +96 -0
  558. package/dist/frontend/lowering/class-assertions.js.map +1 -0
  559. package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
  560. package/dist/frontend/lowering/class-callbacks.js +130 -27
  561. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  562. package/dist/frontend/lowering/class-construction.d.ts +1 -1
  563. package/dist/frontend/lowering/class-construction.js +247 -50
  564. package/dist/frontend/lowering/class-construction.js.map +1 -1
  565. package/dist/frontend/lowering/class-descriptors.js +109 -29
  566. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  567. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -1
  568. package/dist/frontend/lowering/class-dynamic-dispatch.js +2471 -465
  569. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  570. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +284 -44
  571. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  572. package/dist/frontend/lowering/class-instance-constructor.js +17 -5
  573. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  574. package/dist/frontend/lowering/class-method-values.js +199 -51
  575. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  576. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  577. package/dist/frontend/lowering/class-protocols.js +126 -0
  578. package/dist/frontend/lowering/class-protocols.js.map +1 -0
  579. package/dist/frontend/lowering/class-prototypes.js +345 -86
  580. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  581. package/dist/frontend/lowering/class-runtime-statics.d.ts +1 -1
  582. package/dist/frontend/lowering/class-runtime-statics.js +80 -17
  583. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  584. package/dist/frontend/lowering/class-static-data.js +76 -16
  585. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  586. package/dist/frontend/lowering/coercions/builders.d.ts +13 -0
  587. package/dist/frontend/lowering/coercions/builders.js +77 -0
  588. package/dist/frontend/lowering/coercions/builders.js.map +1 -0
  589. package/dist/frontend/lowering/coercions/function-adapters.d.ts +58 -0
  590. package/dist/frontend/lowering/coercions/function-adapters.js +430 -0
  591. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -0
  592. package/dist/frontend/lowering/coercions/island.d.ts +37 -0
  593. package/dist/frontend/lowering/coercions/island.js +350 -0
  594. package/dist/frontend/lowering/coercions/island.js.map +1 -0
  595. package/dist/frontend/lowering/coercions/state.d.ts +14 -0
  596. package/dist/frontend/lowering/coercions/state.js +16 -0
  597. package/dist/frontend/lowering/coercions/state.js.map +1 -0
  598. package/dist/frontend/lowering/coercions/structural-plans.d.ts +40 -0
  599. package/dist/frontend/lowering/coercions/structural-plans.js +447 -0
  600. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -0
  601. package/dist/frontend/lowering/coercions/structural.d.ts +63 -0
  602. package/dist/frontend/lowering/coercions/structural.js +616 -0
  603. package/dist/frontend/lowering/coercions/structural.js.map +1 -0
  604. package/dist/frontend/lowering/coercions/unions.d.ts +65 -0
  605. package/dist/frontend/lowering/coercions/unions.js +318 -0
  606. package/dist/frontend/lowering/coercions/unions.js.map +1 -0
  607. package/dist/frontend/lowering/collection-ingestion.js +355 -72
  608. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  609. package/dist/frontend/lowering/containers/array-callbacks.d.ts +88 -0
  610. package/dist/frontend/lowering/containers/array-callbacks.js +1611 -0
  611. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -0
  612. package/dist/frontend/lowering/containers/array-construction.d.ts +42 -0
  613. package/dist/frontend/lowering/containers/array-construction.js +1044 -0
  614. package/dist/frontend/lowering/containers/array-construction.js.map +1 -0
  615. package/dist/frontend/lowering/containers/array-iteration.d.ts +16 -0
  616. package/dist/frontend/lowering/containers/array-iteration.js +95 -0
  617. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -0
  618. package/dist/frontend/lowering/containers/array-methods.d.ts +27 -0
  619. package/dist/frontend/lowering/containers/array-methods.js +1854 -0
  620. package/dist/frontend/lowering/containers/array-methods.js.map +1 -0
  621. package/dist/frontend/lowering/containers/bytes.d.ts +17 -17
  622. package/dist/frontend/lowering/containers/bytes.js +430 -138
  623. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  624. package/dist/frontend/lowering/containers/callback-arguments.d.ts +26 -0
  625. package/dist/frontend/lowering/containers/callback-arguments.js +179 -0
  626. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -0
  627. package/dist/frontend/lowering/containers/collection-grouping.d.ts +19 -0
  628. package/dist/frontend/lowering/containers/collection-grouping.js +297 -0
  629. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -0
  630. package/dist/frontend/lowering/containers/collection-methods.d.ts +57 -0
  631. package/dist/frontend/lowering/containers/collection-methods.js +1314 -0
  632. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -0
  633. package/dist/frontend/lowering/containers/dynamic-receivers.d.ts +18 -0
  634. package/dist/frontend/lowering/containers/dynamic-receivers.js +114 -0
  635. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -0
  636. package/dist/frontend/lowering/containers/for-of.d.ts +60 -0
  637. package/dist/frontend/lowering/containers/for-of.js +643 -0
  638. package/dist/frontend/lowering/containers/for-of.js.map +1 -0
  639. package/dist/frontend/lowering/containers/indexed-objects.d.ts +132 -0
  640. package/dist/frontend/lowering/containers/indexed-objects.js +1743 -0
  641. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -0
  642. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +20 -0
  643. package/dist/frontend/lowering/containers/iterator-helpers.js +809 -0
  644. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -0
  645. package/dist/frontend/lowering/containers/string-and-regexp.js +601 -160
  646. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  647. package/dist/frontend/lowering/containers/string-replacement.js +213 -63
  648. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  649. package/dist/frontend/lowering/crypto-tables.js +263 -64
  650. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  651. package/dist/frontend/lowering/deferred-module-initializers.js +172 -68
  652. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  653. package/dist/frontend/lowering/deferred-module-initializers.test.js +41 -8
  654. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  655. package/dist/frontend/lowering/error-methods.js +339 -65
  656. package/dist/frontend/lowering/error-methods.js.map +1 -1
  657. package/dist/frontend/lowering/expressions/evaluation-safety.js +3 -2
  658. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  659. package/dist/frontend/lowering/expressions/global-symbols.js +2 -1
  660. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -1
  661. package/dist/frontend/lowering/expressions/native-proxy.js +11 -5
  662. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  663. package/dist/frontend/lowering/expressions/nullish-assignment.js +67 -13
  664. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  665. package/dist/frontend/lowering/expressions/object-literals.js +588 -165
  666. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  667. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  668. package/dist/frontend/lowering/expressions/optional-chains.js +68 -17
  669. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  670. package/dist/frontend/lowering/expressions/union-field-write.js +45 -18
  671. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  672. package/dist/frontend/lowering/function-context.js +5 -1
  673. package/dist/frontend/lowering/function-context.js.map +1 -1
  674. package/dist/frontend/lowering/function-returns.d.ts +67 -0
  675. package/dist/frontend/lowering/function-returns.js +392 -0
  676. package/dist/frontend/lowering/function-returns.js.map +1 -0
  677. package/dist/frontend/lowering/generator-delegation.d.ts +1 -1
  678. package/dist/frontend/lowering/generator-delegation.js +171 -39
  679. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  680. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -1
  681. package/dist/frontend/lowering/generator-dynamic-dispatch.js +176 -36
  682. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  683. package/dist/frontend/lowering/generic-functions.d.ts +271 -0
  684. package/dist/frontend/lowering/generic-functions.js +1730 -0
  685. package/dist/frontend/lowering/generic-functions.js.map +1 -0
  686. package/dist/frontend/lowering/import-meta.d.ts +1 -1
  687. package/dist/frontend/lowering/import-meta.js +37 -14
  688. package/dist/frontend/lowering/import-meta.js.map +1 -1
  689. package/dist/frontend/lowering/indexed-comparison.js +6 -2
  690. package/dist/frontend/lowering/indexed-comparison.js.map +1 -1
  691. package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
  692. package/dist/frontend/lowering/instantiation-path.js +10 -0
  693. package/dist/frontend/lowering/instantiation-path.js.map +1 -0
  694. package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
  695. package/dist/frontend/lowering/instantiation-path.test.js +23 -0
  696. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
  697. package/dist/frontend/lowering/iterator-consumption.d.ts +9 -0
  698. package/dist/frontend/lowering/iterator-consumption.js +91 -0
  699. package/dist/frontend/lowering/iterator-consumption.js.map +1 -0
  700. package/dist/frontend/lowering/lib-boundary.js +40 -17
  701. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  702. package/dist/frontend/lowering/lib-boundary.test.js +49 -11
  703. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -1
  704. package/dist/frontend/lowering/lower-array-sort.d.ts +0 -19
  705. package/dist/frontend/lowering/lower-array-sort.js +331 -566
  706. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  707. package/dist/frontend/lowering/lower-assert.js +248 -43
  708. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  709. package/dist/frontend/lowering/lower-async-iteration.js +71 -16
  710. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  711. package/dist/frontend/lowering/lower-builtin-values.js +430 -77
  712. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  713. package/dist/frontend/lowering/lower-calls.d.ts +39 -558
  714. package/dist/frontend/lowering/lower-calls.js +2628 -5669
  715. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  716. package/dist/frontend/lowering/lower-classes.d.ts +248 -242
  717. package/dist/frontend/lowering/lower-classes.js +1820 -775
  718. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  719. package/dist/frontend/lowering/lower-comptime.d.ts +35 -35
  720. package/dist/frontend/lowering/lower-comptime.js +39 -37
  721. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  722. package/dist/frontend/lowering/lower-dgram.js +59 -31
  723. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  724. package/dist/frontend/lowering/lower-enums.js +5 -2
  725. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  726. package/dist/frontend/lowering/lower-event-emitter.js +323 -86
  727. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  728. package/dist/frontend/lowering/lower-expando.js +19 -7
  729. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  730. package/dist/frontend/lowering/lower-exprs.d.ts +194 -194
  731. package/dist/frontend/lowering/lower-exprs.js +3473 -1160
  732. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  733. package/dist/frontend/lowering/lower-functions.d.ts +23 -0
  734. package/dist/frontend/lowering/lower-functions.js +449 -0
  735. package/dist/frontend/lowering/lower-functions.js.map +1 -0
  736. package/dist/frontend/lowering/lower-generators.js +121 -32
  737. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  738. package/dist/frontend/lowering/lower-global-value.js +15 -4
  739. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  740. package/dist/frontend/lowering/lower-inspect.js +479 -89
  741. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  742. package/dist/frontend/lowering/lower-island.d.ts +79 -79
  743. package/dist/frontend/lowering/lower-island.js +366 -274
  744. package/dist/frontend/lowering/lower-island.js.map +1 -1
  745. package/dist/frontend/lowering/lower-island.test.js +7 -2
  746. package/dist/frontend/lowering/lower-island.test.js.map +1 -1
  747. package/dist/frontend/lowering/lower-mixins.js +17 -8
  748. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  749. package/dist/frontend/lowering/lower-modules.d.ts +95 -94
  750. package/dist/frontend/lowering/lower-modules.js +655 -329
  751. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  752. package/dist/frontend/lowering/lower-modules.test.js +91 -20
  753. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  754. package/dist/frontend/lowering/lower-namespaces.js +25 -8
  755. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  756. package/dist/frontend/lowering/lower-node-module.js +115 -34
  757. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  758. package/dist/frontend/lowering/lower-server.js +1210 -290
  759. package/dist/frontend/lowering/lower-server.js.map +1 -1
  760. package/dist/frontend/lowering/lower-stmts.d.ts +148 -148
  761. package/dist/frontend/lowering/lower-stmts.js +2324 -994
  762. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  763. package/dist/frontend/lowering/lower-stmts.test.js +13 -5
  764. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  765. package/dist/frontend/lowering/lower-stream.js +363 -91
  766. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  767. package/dist/frontend/lowering/lower-system-errors.js +30 -8
  768. package/dist/frontend/lowering/lower-system-errors.js.map +1 -1
  769. package/dist/frontend/lowering/lower-test.js +40 -13
  770. package/dist/frontend/lowering/lower-test.js.map +1 -1
  771. package/dist/frontend/lowering/lower-timers.d.ts +31 -0
  772. package/dist/frontend/lowering/lower-timers.js +336 -0
  773. package/dist/frontend/lowering/lower-timers.js.map +1 -0
  774. package/dist/frontend/lowering/lower-url.d.ts +1 -1
  775. package/dist/frontend/lowering/lower-url.js +46 -13
  776. package/dist/frontend/lowering/lower-url.js.map +1 -1
  777. package/dist/frontend/lowering/lowerer.d.ts +34 -352
  778. package/dist/frontend/lowering/lowerer.js +1074 -2712
  779. package/dist/frontend/lowering/lowerer.js.map +1 -1
  780. package/dist/frontend/lowering/lowerer.test.js +85 -17
  781. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  782. package/dist/frontend/lowering/module-namespace-elements.js +43 -8
  783. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  784. package/dist/frontend/lowering/native-ffi.d.ts +21 -1
  785. package/dist/frontend/lowering/native-ffi.js +487 -18
  786. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  787. package/dist/frontend/lowering/object-enumeration-receiver.js +55 -10
  788. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  789. package/dist/frontend/lowering/object-factory-new.d.ts +1 -1
  790. package/dist/frontend/lowering/object-factory-new.js +36 -11
  791. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  792. package/dist/frontend/lowering/optional-arguments.js +49 -20
  793. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  794. package/dist/frontend/lowering/pairs-snapshot.js +66 -14
  795. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  796. package/dist/frontend/lowering/runtime-optional-locals.js +3 -1
  797. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -1
  798. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -1
  799. package/dist/frontend/lowering/sanitize-class-types.js +4 -1
  800. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  801. package/dist/frontend/lowering/sanitize-class-types.test.js +86 -18
  802. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -1
  803. package/dist/frontend/lowering/split-consumers.d.ts +7 -0
  804. package/dist/frontend/lowering/split-consumers.js +64 -0
  805. package/dist/frontend/lowering/split-consumers.js.map +1 -0
  806. package/dist/frontend/lowering/static-this.js +13 -6
  807. package/dist/frontend/lowering/static-this.js.map +1 -1
  808. package/dist/frontend/lowering/string-index.js +32 -10
  809. package/dist/frontend/lowering/string-index.js.map +1 -1
  810. package/dist/frontend/lowering/surfaces.d.ts +45 -46
  811. package/dist/frontend/lowering/surfaces.js +1129 -256
  812. package/dist/frontend/lowering/surfaces.js.map +1 -1
  813. package/dist/frontend/lowering/symbol-fields.js +40 -15
  814. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  815. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  816. package/dist/frontend/lowering/text-decoder-encoding.js +236 -24
  817. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  818. package/dist/frontend/lowering/text-decoder-encoding.test.js +84 -12
  819. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  820. package/dist/frontend/lowering/union-narrow.js +59 -16
  821. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  822. package/dist/frontend/lowering/union-narrow.test.js +24 -7
  823. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  824. package/dist/frontend/lowering/union-retag.js +155 -40
  825. package/dist/frontend/lowering/union-retag.js.map +1 -1
  826. package/dist/frontend/lowering/union-retag.test.js +131 -33
  827. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  828. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -1
  829. package/dist/frontend/lowering/unregistered-class-types.test.js +34 -8
  830. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
  831. package/dist/frontend/module-source-candidates.d.ts +10 -0
  832. package/dist/frontend/module-source-candidates.js +40 -0
  833. package/dist/frontend/module-source-candidates.js.map +1 -0
  834. package/dist/frontend/module-source-candidates.test.d.ts +1 -0
  835. package/dist/frontend/module-source-candidates.test.js +53 -0
  836. package/dist/frontend/module-source-candidates.test.js.map +1 -0
  837. package/dist/frontend/module-syntax.js +21 -8
  838. package/dist/frontend/module-syntax.js.map +1 -1
  839. package/dist/frontend/module-syntax.test.js +37 -13
  840. package/dist/frontend/module-syntax.test.js.map +1 -1
  841. package/dist/frontend/npm-fetch-analysis.js +13 -4
  842. package/dist/frontend/npm-fetch-analysis.js.map +1 -1
  843. package/dist/frontend/npm-fetch-analysis.test.js +33 -10
  844. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -1
  845. package/dist/frontend/npm-fetch-node.js.map +1 -1
  846. package/dist/frontend/npm-fetch-syntax.js +4 -9
  847. package/dist/frontend/npm-fetch-syntax.js.map +1 -1
  848. package/dist/frontend/npm-node.js +3 -1
  849. package/dist/frontend/npm-node.js.map +1 -1
  850. package/dist/frontend/npm-static-bundled-cjs.js +88 -29
  851. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  852. package/dist/frontend/npm-static-bundled-cjs.test.js +29 -10
  853. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -1
  854. package/dist/frontend/npm-static-declaration-syntax.js +148 -56
  855. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  856. package/dist/frontend/npm-static-declarations.d.ts +1 -1
  857. package/dist/frontend/npm-static-declarations.js.map +1 -1
  858. package/dist/frontend/npm-static-declarations.test.js +33 -7
  859. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  860. package/dist/frontend/npm-static-prune.js +26 -12
  861. package/dist/frontend/npm-static-prune.js.map +1 -1
  862. package/dist/frontend/npm-static-prune.test.js +17 -3
  863. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  864. package/dist/frontend/npm-static-rewrite-host.js +2 -3
  865. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  866. package/dist/frontend/npm-static-rewrite-syntax.js +64 -21
  867. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  868. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  869. package/dist/frontend/npm-static-subtyping.js +9 -4
  870. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  871. package/dist/frontend/npm-static-subtyping.test.js +30 -6
  872. package/dist/frontend/npm-static-subtyping.test.js.map +1 -1
  873. package/dist/frontend/npm-static.js +15 -4
  874. package/dist/frontend/npm-static.js.map +1 -1
  875. package/dist/frontend/npm.js +122 -36
  876. package/dist/frontend/npm.js.map +1 -1
  877. package/dist/frontend/npm.test.js +30 -10
  878. package/dist/frontend/npm.test.js.map +1 -1
  879. package/dist/frontend/pipeline-native.js.map +1 -1
  880. package/dist/frontend/pipeline.js +25 -8
  881. package/dist/frontend/pipeline.js.map +1 -1
  882. package/dist/frontend/pipeline.test.js +21 -7
  883. package/dist/frontend/pipeline.test.js.map +1 -1
  884. package/dist/frontend/program-analysis.d.ts +2 -0
  885. package/dist/frontend/program-analysis.js +2 -0
  886. package/dist/frontend/program-analysis.js.map +1 -1
  887. package/dist/frontend/program-node.js +5 -3
  888. package/dist/frontend/program-node.js.map +1 -1
  889. package/dist/frontend/program.d.ts +2 -2
  890. package/dist/frontend/program.js +248 -127
  891. package/dist/frontend/program.js.map +1 -1
  892. package/dist/frontend/program.test.js +27 -27
  893. package/dist/frontend/program.test.js.map +1 -1
  894. package/dist/frontend/provenance-core.js +8 -4
  895. package/dist/frontend/provenance-core.js.map +1 -1
  896. package/dist/frontend/provenance-registry.js +1 -4
  897. package/dist/frontend/provenance-registry.js.map +1 -1
  898. package/dist/frontend/resolve.js +32 -20
  899. package/dist/frontend/resolve.js.map +1 -1
  900. package/dist/frontend/resolve.test.js +1 -1
  901. package/dist/frontend/resolve.test.js.map +1 -1
  902. package/dist/frontend/runtime-resolve.js +13 -4
  903. package/dist/frontend/runtime-resolve.js.map +1 -1
  904. package/dist/frontend/runtime-resolve.test.js +25 -9
  905. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  906. package/dist/frontend/services-node.js +6 -2
  907. package/dist/frontend/services-node.js.map +1 -1
  908. package/dist/frontend/services-node.test.js +18 -6
  909. package/dist/frontend/services-node.test.js.map +1 -1
  910. package/dist/frontend/services.js +8 -4
  911. package/dist/frontend/services.js.map +1 -1
  912. package/dist/frontend/services.test.js +6 -2
  913. package/dist/frontend/services.test.js.map +1 -1
  914. package/dist/frontend/ts7/api.js +12 -4
  915. package/dist/frontend/ts7/api.js.map +1 -1
  916. package/dist/frontend/ts7/ast-bytes.js +10 -3
  917. package/dist/frontend/ts7/ast-bytes.js.map +1 -1
  918. package/dist/frontend/ts7/ast-bytes.test.js +23 -4
  919. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -1
  920. package/dist/frontend/ts7/ast-guards.test.js +14 -5
  921. package/dist/frontend/ts7/ast-guards.test.js.map +1 -1
  922. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  923. package/dist/frontend/ts7/ast-node.js +490 -172
  924. package/dist/frontend/ts7/ast-node.js.map +1 -1
  925. package/dist/frontend/ts7/ast-node.test.js +150 -36
  926. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  927. package/dist/frontend/ts7/ast-text.js +13 -3
  928. package/dist/frontend/ts7/ast-text.js.map +1 -1
  929. package/dist/frontend/ts7/ast-text.test.js.map +1 -1
  930. package/dist/frontend/ts7/ast-types.js.map +1 -1
  931. package/dist/frontend/ts7/ast-wire.d.ts +5 -1
  932. package/dist/frontend/ts7/ast-wire.js +83 -20
  933. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  934. package/dist/frontend/ts7/ast-wire.test.js +53 -8
  935. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  936. package/dist/frontend/ts7/ast.d.ts +2 -1
  937. package/dist/frontend/ts7/ast.js +53 -30
  938. package/dist/frontend/ts7/ast.js.map +1 -1
  939. package/dist/frontend/ts7/census-check.js +1 -1
  940. package/dist/frontend/ts7/census-check.js.map +1 -1
  941. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  942. package/dist/frontend/ts7/checker.d.ts +8 -2
  943. package/dist/frontend/ts7/checker.js +46 -8
  944. package/dist/frontend/ts7/checker.js.map +1 -1
  945. package/dist/frontend/ts7/checker.test.js +96 -17
  946. package/dist/frontend/ts7/checker.test.js.map +1 -1
  947. package/dist/frontend/ts7/enums.test.js +9 -4
  948. package/dist/frontend/ts7/enums.test.js.map +1 -1
  949. package/dist/frontend/ts7/native-api.js.map +1 -1
  950. package/dist/frontend/ts7/native-host.js.map +1 -1
  951. package/dist/frontend/ts7/native-process.js +9 -3
  952. package/dist/frontend/ts7/native-process.js.map +1 -1
  953. package/dist/frontend/ts7/program-adapter.js +1 -1
  954. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  955. package/dist/frontend/ts7/program-host.d.ts +7 -0
  956. package/dist/frontend/ts7/program-host.js +33 -6
  957. package/dist/frontend/ts7/program-host.js.map +1 -1
  958. package/dist/frontend/ts7/program-host.test.js +72 -11
  959. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  960. package/dist/frontend/ts7/rpc-api.js +3 -1
  961. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  962. package/dist/frontend/ts7/rpc-client.js +15 -5
  963. package/dist/frontend/ts7/rpc-client.js.map +1 -1
  964. package/dist/frontend/ts7/rpc-client.test.js +26 -8
  965. package/dist/frontend/ts7/rpc-client.test.js.map +1 -1
  966. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
  967. package/dist/frontend/ts7/rpc-filesystem.test.js +43 -10
  968. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
  969. package/dist/frontend/ts7/rpc-process.js +16 -6
  970. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  971. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  972. package/dist/frontend/ts7/rpc-wire.d.ts +1 -0
  973. package/dist/frontend/ts7/rpc-wire.js +41 -14
  974. package/dist/frontend/ts7/rpc-wire.js.map +1 -1
  975. package/dist/frontend/ts7/rpc-wire.test.js +36 -6
  976. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -1
  977. package/dist/frontend/ts7/semantic-checker.js +209 -68
  978. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  979. package/dist/frontend/ts7/semantic-checker.test.js +29 -14
  980. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  981. package/dist/frontend/ts7/semantic-json.js +7 -1
  982. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  983. package/dist/frontend/ts7/semantic-json.test.js +17 -3
  984. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  985. package/dist/frontend/ts7/semantic-model.js +147 -51
  986. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  987. package/dist/frontend/ts7/semantic-model.test.js +72 -19
  988. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  989. package/dist/frontend/ts7/semantic-types.d.ts +2 -2
  990. package/dist/frontend/ts7/session-cache.js +10 -3
  991. package/dist/frontend/ts7/session-cache.js.map +1 -1
  992. package/dist/frontend/ts7/session-cache.test.js +13 -4
  993. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  994. package/dist/frontend/ts7/session-path.js +25 -10
  995. package/dist/frontend/ts7/session-path.js.map +1 -1
  996. package/dist/frontend/ts7/session-path.test.js +47 -4
  997. package/dist/frontend/ts7/session-path.test.js.map +1 -1
  998. package/dist/frontend/ts7/session-timing.js +22 -3
  999. package/dist/frontend/ts7/session-timing.js.map +1 -1
  1000. package/dist/frontend/ts7/session-timing.test.js +12 -3
  1001. package/dist/frontend/ts7/session-timing.test.js.map +1 -1
  1002. package/dist/frontend/ts7/session.d.ts +1 -0
  1003. package/dist/frontend/ts7/session.js +109 -35
  1004. package/dist/frontend/ts7/session.js.map +1 -1
  1005. package/dist/frontend/ts7/session.test.js +69 -15
  1006. package/dist/frontend/ts7/session.test.js.map +1 -1
  1007. package/dist/frontend/ts7/source-parser.js +17 -6
  1008. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1009. package/dist/frontend/ts7/source-parser.test.js +32 -9
  1010. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1011. package/dist/frontend/tsc-codes.js +56 -11
  1012. package/dist/frontend/tsc-codes.js.map +1 -1
  1013. package/dist/frontend/tsc-codes.test.d.ts +1 -0
  1014. package/dist/frontend/tsc-codes.test.js +16 -0
  1015. package/dist/frontend/tsc-codes.test.js.map +1 -0
  1016. package/dist/frontend/type-mapper.d.ts +3 -0
  1017. package/dist/frontend/type-mapper.js +589 -206
  1018. package/dist/frontend/type-mapper.js.map +1 -1
  1019. package/dist/frontend/type-mapper.test.js +108 -33
  1020. package/dist/frontend/type-mapper.test.js.map +1 -1
  1021. package/dist/frontend/union-discriminants.js +8 -2
  1022. package/dist/frontend/union-discriminants.js.map +1 -1
  1023. package/dist/frontend/union-discriminants.test.js +77 -20
  1024. package/dist/frontend/union-discriminants.test.js.map +1 -1
  1025. package/dist/frontend/worker-target.d.ts +6 -0
  1026. package/dist/frontend/worker-target.js +108 -0
  1027. package/dist/frontend/worker-target.js.map +1 -0
  1028. package/dist/frontend/worker-target.test.d.ts +1 -0
  1029. package/dist/frontend/worker-target.test.js +71 -0
  1030. package/dist/frontend/worker-target.test.js.map +1 -0
  1031. package/dist/index.d.ts +9 -8
  1032. package/dist/index.js +174 -88
  1033. package/dist/index.js.map +1 -1
  1034. package/dist/ir/analysis.js +95 -38
  1035. package/dist/ir/analysis.js.map +1 -1
  1036. package/dist/ir/analysis.test.js +91 -15
  1037. package/dist/ir/analysis.test.js.map +1 -1
  1038. package/dist/ir/api.d.ts +4 -0
  1039. package/dist/ir/api.js +6 -0
  1040. package/dist/ir/api.js.map +1 -0
  1041. package/dist/ir/build.d.ts +7 -0
  1042. package/dist/ir/build.js +27 -1
  1043. package/dist/ir/build.js.map +1 -1
  1044. package/dist/ir/builtin-effects.d.ts +9 -0
  1045. package/dist/ir/builtin-effects.js +643 -0
  1046. package/dist/ir/builtin-effects.js.map +1 -0
  1047. package/dist/ir/builtin-signatures.d.ts +15 -0
  1048. package/dist/ir/builtin-signatures.js +3397 -0
  1049. package/dist/ir/builtin-signatures.js.map +1 -0
  1050. package/dist/ir/byte-numbers.js +67 -16
  1051. package/dist/ir/byte-numbers.js.map +1 -1
  1052. package/dist/ir/byte-numbers.test.js +17 -4
  1053. package/dist/ir/byte-numbers.test.js.map +1 -1
  1054. package/dist/ir/constant-tables.js +13 -5
  1055. package/dist/ir/constant-tables.js.map +1 -1
  1056. package/dist/ir/constant-tables.test.js +47 -7
  1057. package/dist/ir/constant-tables.test.js.map +1 -1
  1058. package/dist/ir/control-flow.js +2 -1
  1059. package/dist/ir/control-flow.js.map +1 -1
  1060. package/dist/ir/control-flow.test.js +35 -11
  1061. package/dist/ir/control-flow.test.js.map +1 -1
  1062. package/dist/ir/initializer-bindings.d.ts +9 -0
  1063. package/dist/ir/initializer-bindings.js +115 -0
  1064. package/dist/ir/initializer-bindings.js.map +1 -0
  1065. package/dist/ir/initializer-bindings.test.d.ts +1 -0
  1066. package/dist/ir/initializer-bindings.test.js +118 -0
  1067. package/dist/ir/initializer-bindings.test.js.map +1 -0
  1068. package/dist/ir/integer-loop-facts.d.ts +12 -0
  1069. package/dist/ir/integer-loop-facts.js +137 -0
  1070. package/dist/ir/integer-loop-facts.js.map +1 -0
  1071. package/dist/ir/integer-loops.js +85 -30
  1072. package/dist/ir/integer-loops.js.map +1 -1
  1073. package/dist/ir/integer-loops.test.js +76 -13
  1074. package/dist/ir/integer-loops.test.js.map +1 -1
  1075. package/dist/ir/integer-ranges.js +93 -21
  1076. package/dist/ir/integer-ranges.js.map +1 -1
  1077. package/dist/ir/integer-ranges.test.js +199 -21
  1078. package/dist/ir/integer-ranges.test.js.map +1 -1
  1079. package/dist/ir/intrinsic-signatures.d.ts +20 -0
  1080. package/dist/ir/intrinsic-signatures.js +57 -0
  1081. package/dist/ir/intrinsic-signatures.js.map +1 -0
  1082. package/dist/ir/ir.d.ts +15 -2160
  1083. package/dist/ir/ir.js +160 -1396
  1084. package/dist/ir/ir.js.map +1 -1
  1085. package/dist/ir/ir.test.js +98 -77
  1086. package/dist/ir/ir.test.js.map +1 -1
  1087. package/dist/ir/numeric-call-specialization.d.ts +8 -0
  1088. package/dist/ir/numeric-call-specialization.js +198 -0
  1089. package/dist/ir/numeric-call-specialization.js.map +1 -0
  1090. package/dist/ir/runtime-features.d.ts +221 -0
  1091. package/dist/ir/runtime-features.js +552 -0
  1092. package/dist/ir/runtime-features.js.map +1 -0
  1093. package/dist/ir/runtime-features.test.d.ts +1 -0
  1094. package/dist/ir/runtime-features.test.js +98 -0
  1095. package/dist/ir/runtime-features.test.js.map +1 -0
  1096. package/dist/ir/scalar-records.js +130 -40
  1097. package/dist/ir/scalar-records.js.map +1 -1
  1098. package/dist/ir/scalar-records.test.js +146 -27
  1099. package/dist/ir/scalar-records.test.js.map +1 -1
  1100. package/dist/ir/serialize.d.ts +1 -1
  1101. package/dist/ir/serialize.js +7 -5
  1102. package/dist/ir/serialize.js.map +1 -1
  1103. package/dist/ir/serialize.test.js +44 -9
  1104. package/dist/ir/serialize.test.js.map +1 -1
  1105. package/dist/ir/traverse.js +156 -43
  1106. package/dist/ir/traverse.js.map +1 -1
  1107. package/dist/ir/traverse.test.js +99 -24
  1108. package/dist/ir/traverse.test.js.map +1 -1
  1109. package/dist/ir/validate.d.ts +1 -31
  1110. package/dist/ir/validate.js +869 -1910
  1111. package/dist/ir/validate.js.map +1 -1
  1112. package/dist/ir/validate.test.js +697 -114
  1113. package/dist/ir/validate.test.js.map +1 -1
  1114. package/dist/library/cache-primitives.js +9 -10
  1115. package/dist/library/cache-primitives.js.map +1 -1
  1116. package/dist/library/cache-reset.test.js +2 -1
  1117. package/dist/library/cache-reset.test.js.map +1 -1
  1118. package/dist/library/compiler-self-identity.js +11 -5
  1119. package/dist/library/compiler-self-identity.js.map +1 -1
  1120. package/dist/library/compiler-self-identity.test.js +10 -3
  1121. package/dist/library/compiler-self-identity.test.js.map +1 -1
  1122. package/dist/library/fence-eval.js +24 -7
  1123. package/dist/library/fence-eval.js.map +1 -1
  1124. package/dist/library/fence-eval.test.js +31 -7
  1125. package/dist/library/fence-eval.test.js.map +1 -1
  1126. package/dist/library/int-infer.js +199 -59
  1127. package/dist/library/int-infer.js.map +1 -1
  1128. package/dist/library/int-infer.test.js +137 -61
  1129. package/dist/library/int-infer.test.js.map +1 -1
  1130. package/dist/library/ir-policy.d.ts +27 -0
  1131. package/dist/library/ir-policy.js +234 -0
  1132. package/dist/library/ir-policy.js.map +1 -0
  1133. package/dist/library/library-cache.js +40 -17
  1134. package/dist/library/library-cache.js.map +1 -1
  1135. package/dist/library/library-cache.test.js +29 -18
  1136. package/dist/library/library-cache.test.js.map +1 -1
  1137. package/dist/library/library-profile.js +68 -13
  1138. package/dist/library/library-profile.js.map +1 -1
  1139. package/dist/library/prepare.js +48 -20
  1140. package/dist/library/prepare.js.map +1 -1
  1141. package/dist/library/semantic-source.js +16 -14
  1142. package/dist/library/semantic-source.js.map +1 -1
  1143. package/dist/library/semantic-source.test.js +9 -14
  1144. package/dist/library/semantic-source.test.js.map +1 -1
  1145. package/dist/library/sidecar-validate.js +53 -12
  1146. package/dist/library/sidecar-validate.js.map +1 -1
  1147. package/dist/library/sidecar.js +85 -24
  1148. package/dist/library/sidecar.js.map +1 -1
  1149. package/dist/library/trap-teaching.js +11 -2
  1150. package/dist/library/trap-teaching.js.map +1 -1
  1151. package/dist/native/cache.js +10 -4
  1152. package/dist/native/cache.js.map +1 -1
  1153. package/dist/native/cli.js +34 -9
  1154. package/dist/native/cli.js.map +1 -1
  1155. package/dist/native/compiler.js +191 -54
  1156. package/dist/native/compiler.js.map +1 -1
  1157. package/dist/native/compiler.test.js +134 -33
  1158. package/dist/native/compiler.test.js.map +1 -1
  1159. package/dist/native/comptime.js +23 -7
  1160. package/dist/native/comptime.js.map +1 -1
  1161. package/dist/native/comptime.test.js +26 -6
  1162. package/dist/native/comptime.test.js.map +1 -1
  1163. package/dist/native/executable-cache.js +77 -27
  1164. package/dist/native/executable-cache.js.map +1 -1
  1165. package/dist/native/executable-cache.test.js +41 -6
  1166. package/dist/native/executable-cache.test.js.map +1 -1
  1167. package/dist/native/file-identity.js +9 -2
  1168. package/dist/native/file-identity.js.map +1 -1
  1169. package/dist/native/file-identity.test.js.map +1 -1
  1170. package/dist/native/library.js +50 -12
  1171. package/dist/native/library.js.map +1 -1
  1172. package/dist/native/prepare.js +121 -34
  1173. package/dist/native/prepare.js.map +1 -1
  1174. package/dist/native/prepare.test.js +22 -6
  1175. package/dist/native/prepare.test.js.map +1 -1
  1176. package/dist/native/runtime-typescript.js +24 -11
  1177. package/dist/native/runtime-typescript.js.map +1 -1
  1178. package/dist/native/runtime-typescript.test.js.map +1 -1
  1179. package/dist/native/sanitizer.js +71 -18
  1180. package/dist/native/sanitizer.js.map +1 -1
  1181. package/dist/native/sanitizer.test.js +78 -20
  1182. package/dist/native/sanitizer.test.js.map +1 -1
  1183. package/dist/native/task.js.map +1 -1
  1184. package/dist/native/task.test.js +7 -2
  1185. package/dist/native/task.test.js.map +1 -1
  1186. package/dist/native/toolchain.js +68 -26
  1187. package/dist/native/toolchain.js.map +1 -1
  1188. package/dist/native/toolchain.test.js +59 -20
  1189. package/dist/native/toolchain.test.js.map +1 -1
  1190. package/dist/startup-cache.d.ts +1 -1
  1191. package/dist/startup-cache.js +1 -1
  1192. package/dist/startup-cache.js.map +1 -1
  1193. package/dist/timing.js.map +1 -1
  1194. package/package.json +20 -20
  1195. package/surface-manifest.json +30 -2
  1196. package/dist/frontend/lowering/lower-builtins.d.ts +0 -601
  1197. package/dist/frontend/lowering/lower-builtins.js +0 -8986
  1198. package/dist/frontend/lowering/lower-builtins.js.map +0 -1
  1199. package/dist/frontend/lowering/lower-containers.d.ts +0 -382
  1200. package/dist/frontend/lowering/lower-containers.js +0 -7344
  1201. package/dist/frontend/lowering/lower-containers.js.map +0 -1
@@ -0,0 +1,1743 @@
1
+ import { countedFor, numLit, varRef } from "../../../ir/build.js";
2
+ import { objectEnumerationReceiver } from "../object-enumeration-receiver.js";
3
+ import { InternalCompilerError } from "../../../errors.js";
4
+ import * as ts from "../../ts7/adapter.js";
5
+ import { BOOL, DYN, F64, STRING, UNDEFINED_T, arrayOf, isRefCounted, isSupportedIndexValue, isUnitType, typeEquals, } from "../../../ir/ir.js";
6
+ import { tryLowerExpression } from "../expressions/try-lower-expression.js";
7
+ import { locOf } from "../../program.js";
8
+ import { typeKey } from "../../type-mapper.js";
9
+ import {} from "../lowerer.js";
10
+ /** Object() and new Object() preserve known object inputs. Primitive
11
+ * boxing and unproven checked-dynamic values retain their refusal. */
12
+ export function lowerObjectConstructor(lowerer, args, loc) {
13
+ if (args.length === 0) {
14
+ return {
15
+ kind: "recordLit",
16
+ fields: [],
17
+ type: { kind: "record", shapeId: lowerer.shapes.intern([]) },
18
+ loc,
19
+ };
20
+ }
21
+ if (args.length !== 1 || ts.isSpreadElement(args[0]))
22
+ return null;
23
+ const value = lowerer.lowerExpr(args[0]);
24
+ if (value.kind === "dynObjLit" || value.kind === "dynArrLit")
25
+ return value;
26
+ if ([
27
+ "record",
28
+ "array",
29
+ "object",
30
+ "regex",
31
+ "date",
32
+ "bytes",
33
+ "map",
34
+ "set",
35
+ "func",
36
+ "classval",
37
+ ].includes(value.type.kind))
38
+ return value;
39
+ return null;
40
+ }
41
+ /** `Object.keys/values/entries` over an INDEX-SIGNATURE (overflow-carrying)
42
+ * record shape: declared fields answer first from the compile-time field
43
+ * list (declaration order, undefined-valued fields skipped — exactly the
44
+ * fixed-shape lowering and SEMANTICS.md 37), then the overflow map's live
45
+ * keys in JS OWN-KEY order (canonical array indices ascending, then
46
+ * insertion order — recordOvfKeys). For a PURE index-signature shape
47
+ * (Record<string, T> — no declared fields, the typical CLI config patterns) the
48
+ * result order is Node-exact; hybrids inherit the documented
49
+ * declared-then-overflow divergence. Values surface as the checker's
50
+ * result element type: identity, an arm-into-union wrap, or (dyn
51
+ * results) the dyn conversion — recordKeyGet's own surfacing rules for
52
+ * the overflow, mirrored statically for declared fields. */
53
+ export function lowerObjectIterOverIndexShape(lowerer, call, member, argIr, shape) {
54
+ const resultT = lowerer.irTypeOf(call);
55
+ if (resultT.kind !== "array")
56
+ lowerer.badType(call, lowerer.typeOf(call)); // defensive
57
+ return objectIterOverIndexShape(lowerer, call, member, argIr, shape, objectEnumerationReceiver(lowerer, lowerer.lowerExpr(call.arguments[0]), argIr, locOf(call)), resultT, locOf(call));
58
+ }
59
+ /** The construction core, receiver/result pre-resolved — `node` anchors
60
+ * the fences. for-in reuses the "keys" arm directly (it iterates exactly
61
+ * the keys Object.keys answers; same intern key, one helper). */
62
+ export function objectIterOverIndexShape(lowerer, node, member, argIr, shape, receiver, resultT, loc) {
63
+ const iv = shape.indexValue;
64
+ // The result-element type values flow into (string for keys, the
65
+ // checker's element for values, the [string, V] tuple's "1" for
66
+ // entries).
67
+ let valueT = null;
68
+ let tupleT = null;
69
+ if (member === "values")
70
+ valueT = resultT.elem;
71
+ if (member === "entries") {
72
+ if (resultT.elem.kind !== "record")
73
+ lowerer.badType(node, lowerer.typeOf(node));
74
+ tupleT = resultT.elem;
75
+ const tupleShape = lowerer.shapes.get(resultT.elem.shapeId);
76
+ if (!tupleShape?.tuple || tupleShape.fields.length !== 2)
77
+ lowerer.badType(node, lowerer.typeOf(node));
78
+ valueT = tupleShape.fields.find((f) => f.name === "1").type;
79
+ }
80
+ // JS lists integer-like OWN keys first regardless of where they live;
81
+ // the declared-then-overflow order can only honor that when no
82
+ // DECLARED field name is integer-like (the overflow walk handles its
83
+ // own). Shapes that mix one in keep a fence, not a silent reorder.
84
+ const arrayIndexRe = /^(0|[1-9][0-9]{0,9})$/;
85
+ if (shape.fields.some((f) => arrayIndexRe.test(f.name) && Number(f.name) <= 4294967294)) {
86
+ lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (a declared field name is integer-like — JS orders integer keys first, across declared and overflow keys)`);
87
+ }
88
+ // The overflow value must surface as the element type (identity, an
89
+ // arm of a union element, or a dyn element over a dyn signature).
90
+ if (valueT) {
91
+ const ivSurfaces = typeEquals(iv, valueT) ||
92
+ (valueT.kind === "union" && lowerer.armTag(valueT.unionId, iv) >= 0) ||
93
+ (valueT.kind === "dyn" && iv.kind === "dyn");
94
+ if (!ivSurfaces) {
95
+ lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (the index signature's '${lowerer.fmt(iv)}' value cannot flow into the '${lowerer.fmt(valueT)}' result element)`);
96
+ }
97
+ }
98
+ const key = `obj.${member}:ovf:${argIr.shapeId}:${typeKey(resultT)}`;
99
+ let helper = lowerer.arrHofHelpers.get(key);
100
+ if (!helper) {
101
+ helper = `%obj.${member}.${lowerer.arrHofHelpers.size}`;
102
+ const outRef = varRef("out.0", resultT, loc);
103
+ const rRef = varRef("r.0", argIr, loc);
104
+ const push = (value) => ({
105
+ kind: "exprStmt",
106
+ expr: {
107
+ kind: "arrIntrinsic",
108
+ method: "push",
109
+ receiver: outRef,
110
+ args: [value],
111
+ type: F64,
112
+ loc,
113
+ },
114
+ loc,
115
+ });
116
+ const body = [
117
+ {
118
+ kind: "varDecl",
119
+ localId: "out.0",
120
+ init: { kind: "arrayLit", elems: [], type: resultT, loc },
121
+ loc,
122
+ },
123
+ ];
124
+ const fieldStmts = new Map();
125
+ // Declared fields, in declaration order. Undefined-valued fields
126
+ // skip at runtime (the unset-optional convention); values surface
127
+ // into the element type or the site fences with the field named.
128
+ const order = shape.declaredOrder ?? shape.fields.map((f) => f.name);
129
+ for (const name of order) {
130
+ const f = shape.fields.find((x) => x.name === name);
131
+ const raw = {
132
+ kind: "recordGet",
133
+ obj: rRef,
134
+ shapeId: argIr.shapeId,
135
+ field: f.name,
136
+ type: f.type,
137
+ loc,
138
+ };
139
+ const utag = f.type.kind === "union" ? lowerer.armTag(f.type.unionId, UNDEFINED_T) : -1;
140
+ // The pushed value per member; null when the field cannot surface.
141
+ const surfaced = () => {
142
+ if (!valueT)
143
+ return null;
144
+ if (typeEquals(f.type, valueT))
145
+ return raw;
146
+ if (valueT.kind === "dyn") {
147
+ return lowerer.dynConvertible(f.type)
148
+ ? { kind: "dynFrom", value: raw, type: DYN, loc }
149
+ : null;
150
+ }
151
+ if (valueT.kind === "union") {
152
+ const tag = lowerer.armTag(valueT.unionId, f.type);
153
+ if (tag >= 0)
154
+ return {
155
+ kind: "unionWrap",
156
+ unionId: valueT.unionId,
157
+ tag,
158
+ value: raw,
159
+ type: valueT,
160
+ loc,
161
+ };
162
+ // An undefined-armed field union whose ONE other arm is an
163
+ // element arm: narrow (the undefined case is guard-skipped),
164
+ // then wrap.
165
+ if (utag >= 0 && f.type.kind === "union") {
166
+ const others = (lowerer.unions.get(f.type.unionId)?.arms ?? []).filter((a) => a.kind !== "undefinedT");
167
+ if (others.length === 1) {
168
+ const otherTag = lowerer.armTag(valueT.unionId, others[0]);
169
+ const narrowTag = lowerer.armTag(f.type.unionId, others[0]);
170
+ if (otherTag >= 0 && narrowTag >= 0) {
171
+ const other = others[0];
172
+ // A UNIT other arm pushes the unit LITERAL (undefined
173
+ // was filtered above, so the unit is null; units carry
174
+ // no payload and narrowing to a unit arm is malformed
175
+ // IR) — the fixed-shape helper's rule exactly.
176
+ const narrowed = isUnitType(other)
177
+ ? { kind: "unitLit", unit: "null", type: other, loc }
178
+ : {
179
+ kind: "unionNarrow",
180
+ unionId: f.type.unionId,
181
+ tag: narrowTag,
182
+ value: raw,
183
+ type: other,
184
+ loc,
185
+ };
186
+ return {
187
+ kind: "unionWrap",
188
+ unionId: valueT.unionId,
189
+ tag: otherTag,
190
+ value: narrowed,
191
+ type: valueT,
192
+ loc,
193
+ };
194
+ }
195
+ }
196
+ }
197
+ }
198
+ return null;
199
+ };
200
+ let pushed;
201
+ if (member === "keys") {
202
+ pushed = { kind: "strLit", value: f.name, type: STRING, loc };
203
+ }
204
+ else {
205
+ const s = surfaced();
206
+ if (!s) {
207
+ lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (field '${f.name}' of type '${lowerer.fmt(f.type)}' cannot flow into the '${lowerer.fmt(valueT)}' result element — read the fields directly)`);
208
+ }
209
+ pushed =
210
+ member === "values"
211
+ ? s
212
+ : {
213
+ kind: "recordLit",
214
+ fields: [
215
+ { name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
216
+ { name: "1", value: s },
217
+ ],
218
+ type: tupleT,
219
+ loc,
220
+ };
221
+ }
222
+ const fieldStmt = utag >= 0 && f.type.kind === "union"
223
+ ? {
224
+ kind: "if",
225
+ cond: {
226
+ kind: "unionIsTag",
227
+ unionId: f.type.unionId,
228
+ tag: utag,
229
+ negated: true,
230
+ value: raw,
231
+ type: BOOL,
232
+ loc,
233
+ },
234
+ then: [push(pushed)],
235
+ else_: null,
236
+ loc,
237
+ }
238
+ : push(pushed);
239
+ fieldStmts.set(f.name, fieldStmt);
240
+ body.push(fieldStmt);
241
+ }
242
+ // The overflow walk: a fresh key snapshot in JS own-key order, each
243
+ // value read back through the overflow-only keyed read (declared
244
+ // names never live in the overflow map).
245
+ const ksT = arrayOf(STRING);
246
+ const ksRef = varRef("ks.0", ksT, loc);
247
+ const kRef = varRef("k.0", STRING, loc);
248
+ const readValue = valueT
249
+ ? {
250
+ kind: "recordKeyGet",
251
+ obj: rRef,
252
+ shapeId: argIr.shapeId,
253
+ key: kRef,
254
+ overflowOnly: true,
255
+ type: valueT,
256
+ loc,
257
+ }
258
+ : null;
259
+ const loopPushed = member === "keys"
260
+ ? kRef
261
+ : member === "values"
262
+ ? readValue
263
+ : {
264
+ kind: "recordLit",
265
+ fields: [
266
+ { name: "0", value: kRef },
267
+ { name: "1", value: readValue },
268
+ ],
269
+ type: tupleT,
270
+ loc,
271
+ };
272
+ body.push({
273
+ kind: "varDecl",
274
+ localId: "ks.0",
275
+ init: { kind: "recordOvfKeys", obj: rRef, shapeId: argIr.shapeId, type: ksT, loc },
276
+ loc,
277
+ }, countedFor(loc, { kind: "arrIntrinsic", method: "length", receiver: ksRef, args: [], type: F64, loc }, () => [
278
+ {
279
+ kind: "varDecl",
280
+ localId: "k.0",
281
+ init: {
282
+ kind: "arrayGet",
283
+ arr: ksRef,
284
+ index: varRef("i.0", F64, loc),
285
+ type: STRING,
286
+ loc,
287
+ },
288
+ loc,
289
+ },
290
+ push(loopPushed),
291
+ ]), { kind: "return", value: outRef, loc });
292
+ const suffix = body.slice(1 + fieldStmts.size);
293
+ lowerer.arrHofHelpers.set(key, helper);
294
+ const fn = {
295
+ name: helper,
296
+ params: [{ localId: "r.0", name: "r", type: argIr }],
297
+ returnType: resultT,
298
+ locals: [
299
+ { id: "r.0", name: "r", type: argIr, mutable: true },
300
+ { id: "out.0", name: "out", type: resultT, mutable: false },
301
+ { id: "ks.0", name: "ks", type: ksT, mutable: false },
302
+ { id: "i.0", name: "i", type: F64, mutable: true },
303
+ { id: "k.0", name: "k", type: STRING, mutable: false },
304
+ ],
305
+ body,
306
+ loc,
307
+ };
308
+ lowerer.shapeOrderHelperFinalizers.push(() => {
309
+ const current = lowerer.shapes.get(argIr.shapeId) ?? shape;
310
+ const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
311
+ fn.body = [
312
+ body[0],
313
+ ...currentOrder.flatMap((name) => {
314
+ const stmt = fieldStmts.get(name);
315
+ return stmt ? [stmt] : [];
316
+ }),
317
+ ...suffix,
318
+ ];
319
+ });
320
+ lowerer.liftedFns.push(fn);
321
+ }
322
+ return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
323
+ }
324
+ /** `Object.fromEntries(pairs)` over a `[string, V][]` VALUE into the
325
+ * checker's own index-signature result shape (`{ [k: string]: V }` —
326
+ * always declared-field-free from the lib signature): an interned helper
327
+ * loops the pairs and keyed-writes each into a fresh record's overflow —
328
+ * later duplicates overwrite in place (first insertion position wins for
329
+ * ORDER, last value wins — exactly JS). Values flow into the signature's
330
+ * value slot (dyn slots convert JSON-safe values, identity otherwise).
331
+ * The `as ModelPricing` reshape AFTER it is the width-coercion capture
332
+ * (lowerRecordOvfCaptureHelper). Null when the argument or result shape
333
+ * is outside this (Maps, richer iterables → the SC2020 fence). */
334
+ export function lowerObjectFromEntriesCall(lowerer, call, callee) {
335
+ const typed = lowerTypedObjectFromEntriesCall(lowerer, call, callee);
336
+ if (typed)
337
+ return typed;
338
+ if (!ts.isPropertyAccessExpression(callee) ||
339
+ call.questionDotToken ||
340
+ callee.questionDotToken ||
341
+ !lowerer.isStdlibGlobal(callee.expression, "Object") ||
342
+ callee.name.text !== "fromEntries" ||
343
+ call.arguments.length !== 1 ||
344
+ ts.isSpreadElement(call.arguments[0]))
345
+ return null;
346
+ if (lowerer.dynamic)
347
+ return null;
348
+ return {
349
+ kind: "libCall",
350
+ fn: "dyn.fromEntries",
351
+ type: DYN,
352
+ loc: locOf(call),
353
+ args: [lowerer.lowerExprExpecting(call.arguments[0], DYN)],
354
+ };
355
+ }
356
+ function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
357
+ if (!ts.isPropertyAccessExpression(callee))
358
+ return null;
359
+ if (call.questionDotToken || callee.questionDotToken)
360
+ return null;
361
+ if (!lowerer.isStdlibGlobal(callee.expression, "Object"))
362
+ return null;
363
+ if (callee.name.text !== "fromEntries")
364
+ return null;
365
+ if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0]))
366
+ return null;
367
+ const argNode = call.arguments[0];
368
+ const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
369
+ if (argIr?.kind !== "array")
370
+ return null;
371
+ const represented = tryLowerExpression(lowerer, argNode);
372
+ if (represented && !typeEquals(represented.type, argIr))
373
+ return null;
374
+ // `Object.fromEntries(rows)` over a `string[][]` VALUE — the env-line
375
+ // idiom (`envArray.map((env) => env.split('='))`). The checker has no
376
+ // tuple to type here (string[] misses the lib's [PropertyKey, T]
377
+ // overload, so the Iterable<readonly any[]> one answers `any`), but
378
+ // the honest static result IS typable: the index-signature record over
379
+ // the row's read positions — key ToPropertyKey(row[0]) ("undefined"
380
+ // when the row is empty, exactly Node), value row[1] as the
381
+ // `string | undefined` union (a 1-element row's [1] read IS undefined
382
+ // in Node; 'A=B=C'.split('=') takes 'B' and drops the tail). Later
383
+ // duplicates overwrite in place — first insertion position wins for
384
+ // ORDER, last value wins, the tuple path's rule.
385
+ if (argIr.elem.kind === "array" && argIr.elem.elem.kind === "string") {
386
+ return lowerFromEntriesStringRows(lowerer, call, argNode, argIr);
387
+ }
388
+ if (argIr.elem.kind !== "record")
389
+ return null;
390
+ const tupleShape = lowerer.shapes.get(argIr.elem.shapeId);
391
+ if (!tupleShape?.tuple || tupleShape.fields.length !== 2)
392
+ return null;
393
+ const keyT = tupleShape.fields.find((f) => f.name === "0").type;
394
+ const valT = tupleShape.fields.find((f) => f.name === "1").type;
395
+ if (keyT.kind !== "string")
396
+ return null;
397
+ // The result shape is interned directly — the lib's `{ [k: string]: T }`
398
+ // return type is lib-declared and deliberately does not map through
399
+ // provenance; the PURE index-signature shape over the tuple's value
400
+ // type IS that type (structurally identical to Record<string, T>, so
401
+ // it interns to the same shape a user annotation would).
402
+ if (!isSupportedIndexValue(valT))
403
+ return null;
404
+ const resultT = {
405
+ kind: "record",
406
+ shapeId: lowerer.shapes.intern([], false, valT, []),
407
+ };
408
+ const iv = valT;
409
+ const loc = locOf(call);
410
+ // The tuple's value position must flow into the index-value slot.
411
+ const convertible = typeEquals(valT, iv) || (iv.kind === "dyn" && lowerer.dynConvertible(valT));
412
+ const convert = (v) => typeEquals(valT, iv) ? v : { kind: "dynFrom", value: v, type: DYN, loc };
413
+ if (!convertible) {
414
+ lowerer.unsupported("SC1090", call, `Object.fromEntries over '${lowerer.fmt(argIr)}' (the tuple's '${lowerer.fmt(valT)}' value cannot flow into the '${lowerer.fmt(iv)}' signature slot)`);
415
+ }
416
+ // Enumeration/filtering may keep the array in checked-dynamic storage.
417
+ // Validate its tuple layout before calling a helper with a native-array
418
+ // ABI; opaque tuple values themselves retain their original references.
419
+ const receiver = lowerer.lowerExprExpecting(argNode, argIr);
420
+ const key = `obj.fromEntries:${argIr.elem.shapeId}:${resultT.shapeId}`;
421
+ let helper = lowerer.arrHofHelpers.get(key);
422
+ if (!helper) {
423
+ helper = `%obj.fromEntries.${lowerer.arrHofHelpers.size}`;
424
+ const tupleT = argIr.elem;
425
+ const tRef = varRef("t.0", tupleT, loc);
426
+ const body = [
427
+ {
428
+ kind: "varDecl",
429
+ localId: "out.0",
430
+ init: { kind: "recordLit", fields: [], type: resultT, loc },
431
+ loc,
432
+ },
433
+ countedFor(loc, {
434
+ kind: "arrIntrinsic",
435
+ method: "length",
436
+ receiver: varRef("a.0", argIr, loc),
437
+ args: [],
438
+ type: F64,
439
+ loc,
440
+ }, () => [
441
+ {
442
+ kind: "varDecl",
443
+ localId: "t.0",
444
+ init: {
445
+ kind: "arrayGet",
446
+ arr: varRef("a.0", argIr, loc),
447
+ index: varRef("i.0", F64, loc),
448
+ type: tupleT,
449
+ loc,
450
+ },
451
+ loc,
452
+ },
453
+ {
454
+ kind: "recordKeySet",
455
+ obj: varRef("out.0", resultT, loc),
456
+ shapeId: resultT.shapeId,
457
+ key: {
458
+ kind: "recordGet",
459
+ obj: tRef,
460
+ shapeId: tupleT.shapeId,
461
+ field: "0",
462
+ type: STRING,
463
+ loc,
464
+ },
465
+ value: convert({
466
+ kind: "recordGet",
467
+ obj: tRef,
468
+ shapeId: tupleT.shapeId,
469
+ field: "1",
470
+ type: valT,
471
+ loc,
472
+ }),
473
+ loc,
474
+ },
475
+ ]),
476
+ { kind: "return", value: varRef("out.0", resultT, loc), loc },
477
+ ];
478
+ lowerer.arrHofHelpers.set(key, helper);
479
+ lowerer.liftedFns.push({
480
+ name: helper,
481
+ params: [{ localId: "a.0", name: "a", type: argIr }],
482
+ returnType: resultT,
483
+ locals: [
484
+ { id: "a.0", name: "a", type: argIr, mutable: true },
485
+ { id: "out.0", name: "out", type: resultT, mutable: false },
486
+ { id: "i.0", name: "i", type: F64, mutable: true },
487
+ { id: "t.0", name: "t", type: tupleT, mutable: false },
488
+ ],
489
+ body,
490
+ loc,
491
+ });
492
+ }
493
+ return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
494
+ }
495
+ /** The string-rows half of lowerObjectFromEntriesCall (see the caller's
496
+ * comment): an interned helper loops the `string[][]` rows and
497
+ * keyed-writes ToPropertyKey(row[0]) → row[1] into a fresh
498
+ * `{ [k: string]: string | undefined }` record. Row reads are lazy
499
+ * ternaries over the row's length — a static string[] read past the end
500
+ * would trap, but Node's fromEntries reads entry[0]/entry[1] as plain
501
+ * (possibly-undefined) gets: the empty row keys "undefined", the
502
+ * 1-element row's value is the union's undefined arm. */
503
+ function lowerFromEntriesStringRows(lowerer, call, argNode, argIr) {
504
+ const loc = locOf(call);
505
+ const rowT = argIr.elem; // string[]
506
+ const valT = { kind: "union", unionId: lowerer.unions.intern([STRING, UNDEFINED_T]) };
507
+ const strTag = lowerer.armTag(valT.unionId, STRING);
508
+ const resultT = {
509
+ kind: "record",
510
+ shapeId: lowerer.shapes.intern([], false, valT, []),
511
+ };
512
+ const receiver = lowerer.lowerExpr(argNode);
513
+ const key = `obj.fromEntries:strrows:${resultT.shapeId}`;
514
+ let helper = lowerer.arrHofHelpers.get(key);
515
+ if (!helper) {
516
+ helper = `%obj.fromEntries.${lowerer.arrHofHelpers.size}`;
517
+ const tRef = varRef("t.0", rowT, loc);
518
+ const rowLen = {
519
+ kind: "arrIntrinsic",
520
+ method: "length",
521
+ receiver: tRef,
522
+ args: [],
523
+ type: F64,
524
+ loc,
525
+ };
526
+ const lenAtLeast = (n) => ({
527
+ kind: "bin",
528
+ op: ">=",
529
+ left: rowLen,
530
+ right: numLit(n, loc),
531
+ type: BOOL,
532
+ loc,
533
+ });
534
+ const body = [
535
+ {
536
+ kind: "varDecl",
537
+ localId: "out.0",
538
+ init: { kind: "recordLit", fields: [], type: resultT, loc },
539
+ loc,
540
+ },
541
+ countedFor(loc, {
542
+ kind: "arrIntrinsic",
543
+ method: "length",
544
+ receiver: varRef("a.0", argIr, loc),
545
+ args: [],
546
+ type: F64,
547
+ loc,
548
+ }, () => [
549
+ {
550
+ kind: "varDecl",
551
+ localId: "t.0",
552
+ init: {
553
+ kind: "arrayGet",
554
+ arr: varRef("a.0", argIr, loc),
555
+ index: varRef("i.0", F64, loc),
556
+ type: rowT,
557
+ loc,
558
+ },
559
+ loc,
560
+ },
561
+ {
562
+ kind: "recordKeySet",
563
+ obj: varRef("out.0", resultT, loc),
564
+ shapeId: resultT.shapeId,
565
+ key: {
566
+ kind: "ternary",
567
+ cond: lenAtLeast(1),
568
+ then: { kind: "arrayGet", arr: tRef, index: numLit(0, loc), type: STRING, loc },
569
+ else_: { kind: "strLit", value: "undefined", type: STRING, loc },
570
+ type: STRING,
571
+ loc,
572
+ },
573
+ value: {
574
+ kind: "ternary",
575
+ cond: lenAtLeast(2),
576
+ then: {
577
+ kind: "unionWrap",
578
+ unionId: valT.unionId,
579
+ tag: strTag,
580
+ value: { kind: "arrayGet", arr: tRef, index: numLit(1, loc), type: STRING, loc },
581
+ type: valT,
582
+ loc,
583
+ },
584
+ else_: lowerer.wrappedUndefined(valT, loc),
585
+ type: valT,
586
+ loc,
587
+ },
588
+ loc,
589
+ },
590
+ ]),
591
+ { kind: "return", value: varRef("out.0", resultT, loc), loc },
592
+ ];
593
+ lowerer.arrHofHelpers.set(key, helper);
594
+ lowerer.liftedFns.push({
595
+ name: helper,
596
+ params: [{ localId: "a.0", name: "a", type: argIr }],
597
+ returnType: resultT,
598
+ locals: [
599
+ { id: "a.0", name: "a", type: argIr, mutable: true },
600
+ { id: "out.0", name: "out", type: resultT, mutable: false },
601
+ { id: "i.0", name: "i", type: F64, mutable: true },
602
+ { id: "t.0", name: "t", type: rowT, mutable: false },
603
+ ],
604
+ body,
605
+ loc,
606
+ });
607
+ }
608
+ return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
609
+ }
610
+ /** Interned `%rec.capture.<n>(s)` — the INDEX-SIGNATURE reshape behind
611
+ * `Object.fromEntries(entries) as ModelPricing` (hybrid→hybrid width
612
+ * coercion) and `const r: Record<string, number> = { a: 1, b: 2 }`
613
+ * (a DECLARED-fields shape narrowing into a pure overflow shape — the
614
+ * record becomes width-free key/value storage), both called from
615
+ * widthCoerce after recordWidthHelper declines: builds the target shape
616
+ * fresh — declared fields default to their undefined arms — then
617
+ * keyed-writes every source key into it, declared fields first in the
618
+ * source's DECLARATION order (skipping ones holding the undefined arm,
619
+ * the unset convention — insertion order is what Object.keys/JSON
620
+ * answer, stance 37), then the source overflow in JS own-key order. A
621
+ * key colliding with a target DECLARED field validates through the
622
+ * keyed write's dynCheck (a mismatch throws the catchable TypeError —
623
+ * divergence 34), which is exactly what makes the `as` honest. The
624
+ * result is a COPY (divergence 36's stance). Null when the pair is
625
+ * outside the supported matrix: the target needs an index signature,
626
+ * every source value (declared fields, and the overflow slot when the
627
+ * source carries one) must enter the target's value slot (identity, a
628
+ * width lift — arm wrap/re-tag/nested reshape, or JSON-safe into a dyn
629
+ * slot), and every target field must either be initialized directly by
630
+ * a same-named source declared field (the rule that admits REQUIRED
631
+ * declared members) or be optional-flavored (the fresh record's
632
+ * default) and writable at runtime. */
633
+ export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
634
+ const from = lowerer.shapes.get(fromId);
635
+ const to = lowerer.shapes.get(toId);
636
+ if (!from || !to?.indexValue || from.tuple || to.tuple)
637
+ return null;
638
+ const fIv = from.indexValue ?? null;
639
+ const tIv = to.indexValue;
640
+ // How a source value enters the target's value slot: identity, the
641
+ // dyn conversion, or a width lift (wrap/retag/nested reshape).
642
+ const slotLift = (t) => {
643
+ if (typeEquals(t, tIv))
644
+ return { how: "copy" };
645
+ if (tIv.kind === "dyn" && (t.kind === "dyn" || lowerer.dynConvertible(t)))
646
+ return "dyn";
647
+ return lowerer.widthLiftPlan(t, tIv);
648
+ };
649
+ // The overflow value slot must line up (sources without an index
650
+ // signature have no overflow to carry over).
651
+ if (fIv && slotLift(fIv) === null)
652
+ return null;
653
+ const inits = [];
654
+ const consumed = new Set();
655
+ for (const tf of to.fields) {
656
+ const sf = from.fields.find((f) => f.name === tf.name);
657
+ const directLift = sf ? lowerer.widthLiftPlan(sf.type, tf.type) : null;
658
+ if (sf && directLift) {
659
+ inits.push({ name: tf.name, kind: "direct", src: sf.type, lift: directLift });
660
+ consumed.add(tf.name);
661
+ continue;
662
+ }
663
+ if (tf.type.kind !== "union")
664
+ return null;
665
+ const utag = lowerer.armTag(tf.type.unionId, UNDEFINED_T);
666
+ if (utag < 0)
667
+ return null;
668
+ if (tIv.kind === "dyn" ? !lowerer.dynConvertible(tf.type) : !typeEquals(tf.type, tIv))
669
+ return null;
670
+ inits.push({ name: tf.name, kind: "undef", unionId: tf.type.unionId, utag });
671
+ }
672
+ // Every source declared field must flow into the keyed-write slot —
673
+ // in DECLARATION order (insertion order below; declaredOrder omits
674
+ // internal '%'-fields, which never enter the copy).
675
+ const orderedFields = from.declaredOrder
676
+ ? from.declaredOrder.flatMap((n) => {
677
+ const f = from.fields.find((x) => x.name === n);
678
+ return f ? [f] : [];
679
+ })
680
+ : from.fields;
681
+ const fieldLifts = new Map();
682
+ for (const ff of orderedFields) {
683
+ if (consumed.has(ff.name))
684
+ continue; // direct-initialized above
685
+ const lift = slotLift(ff.type);
686
+ if (lift === null)
687
+ return null;
688
+ fieldLifts.set(ff.name, lift);
689
+ }
690
+ // DISPATCH writes — keys that can hit a declared target slot: the
691
+ // overflow loop's runtime keys, and a literal source-field name the
692
+ // target also declares. Non-dyn slots store THROUGH on a collision, so
693
+ // such writes need every declared field to BE the slot type (the
694
+ // validator's recordKeySet rule); dyn slots validate per field
695
+ // (dynCheck), so each field must be dyn-convertible. Writes to
696
+ // literal names the target does NOT declare are overflowOnly and
697
+ // exempt — which is what lets a direct-initialized required field
698
+ // (`id: number` beside a `number | undefined` slot) coexist with a
699
+ // declared-only source, while an index-signature source declines.
700
+ const dispatchWrites = fIv !== undefined ||
701
+ orderedFields.some((ff) => !consumed.has(ff.name) && to.fields.some((f) => f.name === ff.name));
702
+ if (dispatchWrites) {
703
+ if (tIv.kind === "dyn"
704
+ ? !to.fields.every((f) => lowerer.dynConvertible(f.type))
705
+ : !to.fields.every((f) => typeEquals(f.type, tIv))) {
706
+ return null;
707
+ }
708
+ }
709
+ const key = `ovf:${fromId}:${toId}`;
710
+ const existing = lowerer.valueHelpers.get(key);
711
+ if (existing)
712
+ return existing;
713
+ const name = `%rec.capture.${lowerer.valueHelpers.size}`;
714
+ lowerer.valueHelpers.set(key, name);
715
+ const fromT = { kind: "record", shapeId: fromId };
716
+ const toT = { kind: "record", shapeId: toId };
717
+ const sRef = varRef("s.0", fromT, loc);
718
+ const outRef = varRef("out.0", toT, loc);
719
+ const intoSlot = (v, lift) => lift === "dyn"
720
+ ? { kind: "dynFrom", value: v, type: DYN, loc }
721
+ : lowerer.applyWidthLift(lift, v, tIv, loc);
722
+ const body = [
723
+ {
724
+ kind: "varDecl",
725
+ localId: "out.0",
726
+ init: {
727
+ kind: "recordLit",
728
+ fields: inits.map((d) => ({
729
+ name: d.name,
730
+ value: d.kind === "direct"
731
+ ? lowerer.applyWidthLift(d.lift, {
732
+ kind: "recordGet",
733
+ obj: sRef,
734
+ shapeId: fromId,
735
+ field: d.name,
736
+ type: d.src,
737
+ loc,
738
+ }, to.fields.find((f) => f.name === d.name).type, loc)
739
+ : {
740
+ kind: "unionWrap",
741
+ unionId: d.unionId,
742
+ tag: d.utag,
743
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
744
+ type: to.fields.find((f) => f.name === d.name).type,
745
+ loc,
746
+ },
747
+ })),
748
+ type: toT,
749
+ loc,
750
+ },
751
+ loc,
752
+ },
753
+ ];
754
+ const fieldStmts = new Map();
755
+ // Source declared fields in declaration order, skipping unset
756
+ // optionals (stance 37) and the direct-initialized (consumed) names.
757
+ for (const ff of orderedFields) {
758
+ if (consumed.has(ff.name))
759
+ continue;
760
+ const raw = {
761
+ kind: "recordGet",
762
+ obj: sRef,
763
+ shapeId: fromId,
764
+ field: ff.name,
765
+ type: ff.type,
766
+ loc,
767
+ };
768
+ const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
769
+ const write = {
770
+ kind: "recordKeySet",
771
+ obj: outRef,
772
+ shapeId: toId,
773
+ key: { kind: "strLit", value: ff.name, type: STRING, loc },
774
+ value: intoSlot(raw, fieldLifts.get(ff.name)),
775
+ // A literal name the target does not declare can only land in the
776
+ // overflow — skip the declared dispatch (and its validator gate).
777
+ ...(to.fields.some((f) => f.name === ff.name) ? {} : { overflowOnly: true }),
778
+ loc,
779
+ };
780
+ const fieldStmt = utag >= 0 && ff.type.kind === "union"
781
+ ? {
782
+ kind: "if",
783
+ cond: {
784
+ kind: "unionIsTag",
785
+ unionId: ff.type.unionId,
786
+ tag: utag,
787
+ negated: true,
788
+ value: raw,
789
+ type: BOOL,
790
+ loc,
791
+ },
792
+ then: [write],
793
+ else_: null,
794
+ loc,
795
+ }
796
+ : write;
797
+ fieldStmts.set(ff.name, fieldStmt);
798
+ body.push(fieldStmt);
799
+ }
800
+ // The source overflow, in JS own-key order (only index-signature
801
+ // sources carry one).
802
+ const ksT = arrayOf(STRING);
803
+ if (fIv) {
804
+ const ovfLift = slotLift(fIv);
805
+ body.push({
806
+ kind: "varDecl",
807
+ localId: "ks.0",
808
+ init: { kind: "recordOvfKeys", obj: sRef, shapeId: fromId, type: ksT, loc },
809
+ loc,
810
+ }, countedFor(loc, {
811
+ kind: "arrIntrinsic",
812
+ method: "length",
813
+ receiver: varRef("ks.0", ksT, loc),
814
+ args: [],
815
+ type: F64,
816
+ loc,
817
+ }, () => [
818
+ {
819
+ kind: "varDecl",
820
+ localId: "k.0",
821
+ init: {
822
+ kind: "arrayGet",
823
+ arr: varRef("ks.0", ksT, loc),
824
+ index: varRef("i.0", F64, loc),
825
+ type: STRING,
826
+ loc,
827
+ },
828
+ loc,
829
+ },
830
+ {
831
+ kind: "recordKeySet",
832
+ obj: outRef,
833
+ shapeId: toId,
834
+ key: varRef("k.0", STRING, loc),
835
+ value: intoSlot({
836
+ kind: "recordKeyGet",
837
+ obj: sRef,
838
+ shapeId: fromId,
839
+ key: varRef("k.0", STRING, loc),
840
+ overflowOnly: true,
841
+ type: fIv,
842
+ loc,
843
+ }, ovfLift),
844
+ loc,
845
+ },
846
+ ]));
847
+ }
848
+ body.push({ kind: "return", value: outRef, loc });
849
+ const suffix = body.slice(1 + fieldStmts.size);
850
+ const fn = {
851
+ name,
852
+ params: [{ localId: "s.0", name: "s", type: fromT }],
853
+ returnType: toT,
854
+ locals: [
855
+ { id: "s.0", name: "s", type: fromT, mutable: true },
856
+ { id: "out.0", name: "out", type: toT, mutable: false },
857
+ ...(fIv
858
+ ? [
859
+ { id: "ks.0", name: "ks", type: ksT, mutable: false },
860
+ { id: "i.0", name: "i", type: F64, mutable: true },
861
+ { id: "k.0", name: "k", type: STRING, mutable: false },
862
+ ]
863
+ : []),
864
+ ],
865
+ body,
866
+ loc,
867
+ };
868
+ lowerer.shapeOrderHelperFinalizers.push(() => {
869
+ const current = lowerer.shapes.get(fromId) ?? from;
870
+ const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
871
+ fn.body = [
872
+ body[0],
873
+ ...currentOrder.flatMap((field) => {
874
+ const stmt = fieldStmts.get(field);
875
+ return stmt ? [stmt] : [];
876
+ }),
877
+ ...suffix,
878
+ ];
879
+ });
880
+ lowerer.liftedFns.push(fn);
881
+ return name;
882
+ }
883
+ /** `Object.assign(target, ...sources)` into an INDEX-SIGNATURE record:
884
+ * the capture helper's keyed-write walk aimed at the EXISTING target —
885
+ * each source's declared fields write in declaration order (unset
886
+ * optionals skip, stance 37), then its overflow in JS own-key order,
887
+ * and the result IS the target (identity, like JS — later reads through
888
+ * the target see every merged key). One interned `%obj.assign.<n>(t, s)`
889
+ * per (target shape, source shape) pair; multiple sources chain. Null
890
+ * when outside the matrix: the target needs an index signature, every
891
+ * source value must enter its value slot (identity, a width lift, or
892
+ * the dyn conversion), and tsc's `T & U` result type must collapse back
893
+ * to the target's own record shape (the self-shaped merges init-config
894
+ * patterns spell). */
895
+ export function lowerObjectAssignIndexShape(lowerer, call) {
896
+ if (call.arguments.length < 2 || call.arguments.some((a) => ts.isSpreadElement(a)))
897
+ return null;
898
+ const loc = locOf(call);
899
+ const targetIr = lowerer.mapTypeOf(lowerer.typeOf(call.arguments[0]));
900
+ if (targetIr?.kind !== "record")
901
+ return null;
902
+ const to = lowerer.shapes.get(targetIr.shapeId);
903
+ if (!to?.indexValue || to.tuple)
904
+ return null;
905
+ // tsc types the call `T & U & …`; the runtime value is the TARGET
906
+ // record (its shape, its identity). The lowering is honest exactly
907
+ // when nothing observes the intersection: the result is DISCARDED
908
+ // (expression-statement position — the mutate-in-place spelling), or
909
+ // the intersection collapses back to the target's own mapped record.
910
+ let parent = call.parent;
911
+ while (ts.isParenthesizedExpression(parent) || ts.isVoidExpression(parent))
912
+ parent = parent.parent;
913
+ const discarded = ts.isExpressionStatement(parent);
914
+ if (!discarded) {
915
+ const resultIr = lowerer.mapTypeOf(lowerer.typeOf(call));
916
+ if (!resultIr || !typeEquals(resultIr, targetIr))
917
+ return null;
918
+ }
919
+ const tIv = to.indexValue;
920
+ const slotLift = (t) => {
921
+ if (typeEquals(t, tIv))
922
+ return { how: "copy" };
923
+ if (tIv.kind === "dyn" && (t.kind === "dyn" || lowerer.dynConvertible(t)))
924
+ return "dyn";
925
+ return lowerer.widthLiftPlan(t, tIv);
926
+ };
927
+ const plans = [];
928
+ for (const argNode of call.arguments.slice(1)) {
929
+ const srcIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
930
+ if (srcIr?.kind !== "record")
931
+ return null;
932
+ const from = lowerer.shapes.get(srcIr.shapeId);
933
+ if (!from || from.tuple)
934
+ return null;
935
+ if (from.fields.some((f) => f.name.startsWith("%")))
936
+ return null;
937
+ const orderedFields = from.declaredOrder
938
+ ? from.declaredOrder.flatMap((n) => {
939
+ const f = from.fields.find((x) => x.name === n);
940
+ return f ? [f] : [];
941
+ })
942
+ : from.fields;
943
+ const fields = [];
944
+ for (const ff of orderedFields) {
945
+ const lift = slotLift(ff.type);
946
+ if (lift === null)
947
+ return null;
948
+ fields.push({ name: ff.name, type: ff.type, lift });
949
+ }
950
+ let ovfLift = null;
951
+ if (from.indexValue) {
952
+ ovfLift = slotLift(from.indexValue);
953
+ if (ovfLift === null)
954
+ return null;
955
+ }
956
+ plans.push({ fromId: srcIr.shapeId, fields, ovfLift });
957
+ }
958
+ const helperFor = (plan) => {
959
+ const key = `assign:${targetIr.shapeId}:${plan.fromId}`;
960
+ const existing = lowerer.valueHelpers.get(key);
961
+ if (existing)
962
+ return existing;
963
+ const name = `%obj.assign.${lowerer.valueHelpers.size}`;
964
+ lowerer.valueHelpers.set(key, name);
965
+ const toT = { kind: "record", shapeId: targetIr.shapeId };
966
+ const fromT = { kind: "record", shapeId: plan.fromId };
967
+ const tRef = varRef("t.0", toT, loc);
968
+ const sRef = varRef("s.0", fromT, loc);
969
+ const intoSlot = (v, lift) => lift === "dyn"
970
+ ? { kind: "dynFrom", value: v, type: DYN, loc }
971
+ : lowerer.applyWidthLift(lift, v, tIv, loc);
972
+ const body = [];
973
+ const fieldStmts = new Map();
974
+ for (const ff of plan.fields) {
975
+ const raw = {
976
+ kind: "recordGet",
977
+ obj: sRef,
978
+ shapeId: plan.fromId,
979
+ field: ff.name,
980
+ type: ff.type,
981
+ loc,
982
+ };
983
+ const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
984
+ const write = {
985
+ kind: "recordKeySet",
986
+ obj: tRef,
987
+ shapeId: targetIr.shapeId,
988
+ key: { kind: "strLit", value: ff.name, type: STRING, loc },
989
+ value: intoSlot(raw, ff.lift),
990
+ loc,
991
+ };
992
+ const fieldStmt = utag >= 0 && ff.type.kind === "union"
993
+ ? {
994
+ kind: "if",
995
+ cond: {
996
+ kind: "unionIsTag",
997
+ unionId: ff.type.unionId,
998
+ tag: utag,
999
+ negated: true,
1000
+ value: raw,
1001
+ type: BOOL,
1002
+ loc,
1003
+ },
1004
+ then: [write],
1005
+ else_: null,
1006
+ loc,
1007
+ }
1008
+ : write;
1009
+ fieldStmts.set(ff.name, fieldStmt);
1010
+ body.push(fieldStmt);
1011
+ }
1012
+ const ksT = arrayOf(STRING);
1013
+ const fromShape = lowerer.shapes.get(plan.fromId);
1014
+ if (plan.ovfLift !== null && fromShape.indexValue) {
1015
+ const fIv = fromShape.indexValue;
1016
+ const ovfLift = plan.ovfLift;
1017
+ body.push({
1018
+ kind: "varDecl",
1019
+ localId: "ks.0",
1020
+ init: { kind: "recordOvfKeys", obj: sRef, shapeId: plan.fromId, type: ksT, loc },
1021
+ loc,
1022
+ }, countedFor(loc, {
1023
+ kind: "arrIntrinsic",
1024
+ method: "length",
1025
+ receiver: varRef("ks.0", ksT, loc),
1026
+ args: [],
1027
+ type: F64,
1028
+ loc,
1029
+ }, () => [
1030
+ {
1031
+ kind: "varDecl",
1032
+ localId: "k.0",
1033
+ init: {
1034
+ kind: "arrayGet",
1035
+ arr: varRef("ks.0", ksT, loc),
1036
+ index: varRef("i.0", F64, loc),
1037
+ type: STRING,
1038
+ loc,
1039
+ },
1040
+ loc,
1041
+ },
1042
+ {
1043
+ kind: "recordKeySet",
1044
+ obj: tRef,
1045
+ shapeId: targetIr.shapeId,
1046
+ key: varRef("k.0", STRING, loc),
1047
+ value: intoSlot({
1048
+ kind: "recordKeyGet",
1049
+ obj: sRef,
1050
+ shapeId: plan.fromId,
1051
+ key: varRef("k.0", STRING, loc),
1052
+ overflowOnly: true,
1053
+ type: fIv,
1054
+ loc,
1055
+ }, ovfLift),
1056
+ loc,
1057
+ },
1058
+ ]));
1059
+ }
1060
+ body.push({ kind: "return", value: tRef, loc });
1061
+ const suffix = body.slice(fieldStmts.size);
1062
+ const fn = {
1063
+ name,
1064
+ params: [
1065
+ { localId: "t.0", name: "t", type: toT },
1066
+ { localId: "s.0", name: "s", type: fromT },
1067
+ ],
1068
+ returnType: toT,
1069
+ locals: [
1070
+ { id: "t.0", name: "t", type: toT, mutable: true },
1071
+ { id: "s.0", name: "s", type: fromT, mutable: true },
1072
+ ...(plan.ovfLift !== null && fromShape.indexValue
1073
+ ? [
1074
+ { id: "ks.0", name: "ks", type: ksT, mutable: false },
1075
+ { id: "i.0", name: "i", type: F64, mutable: true },
1076
+ { id: "k.0", name: "k", type: STRING, mutable: false },
1077
+ ]
1078
+ : []),
1079
+ ],
1080
+ body,
1081
+ loc,
1082
+ };
1083
+ lowerer.shapeOrderHelperFinalizers.push(() => {
1084
+ const current = lowerer.shapes.get(plan.fromId) ?? fromShape;
1085
+ const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
1086
+ fn.body = [
1087
+ ...currentOrder.flatMap((field) => {
1088
+ const stmt = fieldStmts.get(field);
1089
+ return stmt ? [stmt] : [];
1090
+ }),
1091
+ ...suffix,
1092
+ ];
1093
+ });
1094
+ lowerer.liftedFns.push(fn);
1095
+ return name;
1096
+ };
1097
+ let acc = lowerer.lowerExprExpecting(call.arguments[0], targetIr);
1098
+ for (let i = 0; i < plans.length; i++) {
1099
+ const src = lowerer.lowerExprExpecting(call.arguments[i + 1], {
1100
+ kind: "record",
1101
+ shapeId: plans[i].fromId,
1102
+ });
1103
+ acc = { kind: "call", callee: helperFor(plans[i]), args: [acc, src], type: targetIr, loc };
1104
+ }
1105
+ return acc;
1106
+ }
1107
+ /** The interned merge helper behind `{ ...a, ...b, K: v }` literals whose
1108
+ * TARGET shape is a PURE index-signature record (no declared fields) —
1109
+ * the spawn-env pattern (`{ ...process.env, ...extraEnv }`). Contributors
1110
+ * apply in literal order with keyed writes, so JS's last-write-wins holds
1111
+ * for colliding runtime keys. Spread sources must be index-signature
1112
+ * records whose value slot IS the target's or LIFTS into it (a
1113
+ * `Record<string, string>` spreads into a `string | undefined` target by
1114
+ * wrapping each copied value); their declared fields copy first (skipping
1115
+ * undefined-armed absents — the unset convention), then their overflow in
1116
+ * JS own-key order. Explicit values arrive pre-coerced to the target's
1117
+ * value slot. Null when a spread source is outside that matrix (the
1118
+ * caller keeps its fence). */
1119
+ export function lowerIndexMergeHelper(lowerer, toId, contributors, loc) {
1120
+ const to = lowerer.shapes.get(toId);
1121
+ if (!to?.indexValue || to.tuple || to.fields.length > 0)
1122
+ return null;
1123
+ const tIv = to.indexValue;
1124
+ // Per-source plan: how each spread's values reach the target slot —
1125
+ // identity, a one-arm wrap, or (a SUB-UNION value slot: the
1126
+ // `{ ...proxyRes.headers }` spread into OutgoingHttpHeaders, whose
1127
+ // slot adds arms the source never carries) an arm-wise re-tag. A
1128
+ // FIXED-shape source (the `{ ...DEFAULT_TOKENS }` config-defaults
1129
+ // pattern) plans per FIELD instead: each declared field keyed-writes
1130
+ // when its type enters the slot (identity, the dyn conversion, or a
1131
+ // width lift — the capture helper's matrix); accessor/reserved slots
1132
+ // decline (a spread would need the getter's computed value).
1133
+ const srcPlans = [];
1134
+ for (const c of contributors) {
1135
+ // A conditional spread needs the undefined arm as its "absent"
1136
+ // value — a target slot without one can't carry the empty arm.
1137
+ if (c.kind === "condField" &&
1138
+ (tIv.kind !== "union" || lowerer.armTag(tIv.unionId, UNDEFINED_T) < 0)) {
1139
+ return null;
1140
+ }
1141
+ if (c.kind !== "spread")
1142
+ continue;
1143
+ const from = lowerer.shapes.get(c.shapeId);
1144
+ if (!from || from.tuple)
1145
+ return null;
1146
+ if (!from.indexValue) {
1147
+ if (from.fields.some((f) => f.name.startsWith("%")))
1148
+ return null;
1149
+ const fields = new Map();
1150
+ for (const ff of from.fields) {
1151
+ const lift = typeEquals(ff.type, tIv)
1152
+ ? { how: "copy" }
1153
+ : tIv.kind === "dyn" && (ff.type.kind === "dyn" || lowerer.dynConvertible(ff.type))
1154
+ ? "dyn"
1155
+ : lowerer.widthLiftPlan(ff.type, tIv);
1156
+ if (lift === null)
1157
+ return null;
1158
+ fields.set(ff.name, lift);
1159
+ }
1160
+ srcPlans.push({ shapeId: c.shapeId, wrapTag: -1, retag: null, fields });
1161
+ continue;
1162
+ }
1163
+ const fIv = from.indexValue;
1164
+ let wrapTag = -1;
1165
+ let retag = null;
1166
+ if (!typeEquals(fIv, tIv)) {
1167
+ if (tIv.kind !== "union")
1168
+ return null;
1169
+ wrapTag = lowerer.armTag(tIv.unionId, fIv);
1170
+ if (wrapTag < 0) {
1171
+ if (!(fIv.kind === "union" && lowerer.unionRetagMappable(fIv.unionId, tIv.unionId)))
1172
+ return null;
1173
+ retag = lowerer.unionRetagHelper(fIv.unionId, tIv.unionId, loc);
1174
+ if (retag === null)
1175
+ return null;
1176
+ }
1177
+ }
1178
+ for (const ff of from.fields) {
1179
+ // Declared source fields must reach the slot the same way the
1180
+ // overflow does (fields typed AS the source's own value slot); a
1181
+ // shape outside that keeps the fence.
1182
+ if (!typeEquals(ff.type, fIv))
1183
+ return null;
1184
+ }
1185
+ srcPlans.push({ shapeId: c.shapeId, wrapTag, retag, fields: null });
1186
+ }
1187
+ const key = `ixmerge:${toId}:` +
1188
+ contributors
1189
+ .map((c) => c.kind === "spread"
1190
+ ? `s${c.shapeId}`
1191
+ : c.kind === "condField"
1192
+ ? `c${c.name}`
1193
+ : c.kind === "keyedField"
1194
+ ? "k"
1195
+ : `f${c.name}`)
1196
+ .join(",");
1197
+ const existing = lowerer.valueHelpers.get(key);
1198
+ if (existing)
1199
+ return existing;
1200
+ const name = `%rec.merge.${lowerer.valueHelpers.size}`;
1201
+ lowerer.valueHelpers.set(key, name);
1202
+ const toT = { kind: "record", shapeId: toId };
1203
+ const ksT = arrayOf(STRING);
1204
+ const outRef = varRef("out.0", toT, loc);
1205
+ const params = [];
1206
+ const locals = [{ id: "out.0", name: "out", type: toT, mutable: false }];
1207
+ const body = [
1208
+ {
1209
+ kind: "varDecl",
1210
+ localId: "out.0",
1211
+ init: { kind: "recordLit", fields: [], type: toT, loc },
1212
+ loc,
1213
+ },
1214
+ ];
1215
+ let spreadNo = 0;
1216
+ contributors.forEach((c, ci) => {
1217
+ if (c.kind === "keyedField") {
1218
+ // The runtime key and its value are consecutive parameters — the
1219
+ // call site's argument order IS the property's key-then-value
1220
+ // evaluation order.
1221
+ const kid = `kk.${ci}`;
1222
+ const pid = `v.${ci}`;
1223
+ params.push({ localId: kid, name: `kk${ci}`, type: STRING }, { localId: pid, name: `v${ci}`, type: tIv });
1224
+ locals.push({ id: kid, name: `kk${ci}`, type: STRING, mutable: false }, { id: pid, name: `v${ci}`, type: tIv, mutable: false });
1225
+ body.push({
1226
+ kind: "recordKeySet",
1227
+ obj: outRef,
1228
+ shapeId: toId,
1229
+ key: varRef(kid, STRING, loc),
1230
+ value: varRef(pid, tIv, loc),
1231
+ overflowOnly: true,
1232
+ loc,
1233
+ });
1234
+ return;
1235
+ }
1236
+ if (c.kind === "field" || c.kind === "condField") {
1237
+ const pid = `v.${ci}`;
1238
+ params.push({ localId: pid, name: `v${ci}`, type: tIv });
1239
+ locals.push({ id: pid, name: `v${ci}`, type: tIv, mutable: false });
1240
+ const write = {
1241
+ kind: "recordKeySet",
1242
+ obj: outRef,
1243
+ shapeId: toId,
1244
+ key: { kind: "strLit", value: c.name, type: STRING, loc },
1245
+ value: varRef(pid, tIv, loc),
1246
+ overflowOnly: true,
1247
+ loc,
1248
+ };
1249
+ if (c.kind === "condField" && tIv.kind === "union") {
1250
+ // The key writes only when the spread's condition held (its
1251
+ // value arg holds the interned undefined arm otherwise) — an
1252
+ // absent key STAYS absent, presence being the observable.
1253
+ // (The pre-pass above guaranteed the undefined arm exists.)
1254
+ const undefTag = lowerer.armTag(tIv.unionId, UNDEFINED_T);
1255
+ body.push({
1256
+ kind: "if",
1257
+ cond: {
1258
+ kind: "unionIsTag",
1259
+ unionId: tIv.unionId,
1260
+ tag: undefTag,
1261
+ negated: true,
1262
+ value: varRef(pid, tIv, loc),
1263
+ type: BOOL,
1264
+ loc,
1265
+ },
1266
+ then: [write],
1267
+ else_: null,
1268
+ loc,
1269
+ });
1270
+ return;
1271
+ }
1272
+ body.push(write);
1273
+ return;
1274
+ }
1275
+ const plan = srcPlans[spreadNo];
1276
+ const n = spreadNo++;
1277
+ const from = lowerer.shapes.get(plan.shapeId);
1278
+ const fromT = { kind: "record", shapeId: plan.shapeId };
1279
+ const sid = `s.${ci}`;
1280
+ params.push({ localId: sid, name: `s${ci}`, type: fromT });
1281
+ locals.push({ id: sid, name: `s${ci}`, type: fromT, mutable: false });
1282
+ const sRef = varRef(sid, fromT, loc);
1283
+ // A FIXED-shape source: each declared field keyed-writes through its
1284
+ // own planned lift (absent optionals skip — the unset convention);
1285
+ // no overflow exists to walk.
1286
+ if (plan.fields !== null) {
1287
+ for (const ff of from.fields) {
1288
+ const lift = plan.fields.get(ff.name);
1289
+ const raw = {
1290
+ kind: "recordGet",
1291
+ obj: sRef,
1292
+ shapeId: plan.shapeId,
1293
+ field: ff.name,
1294
+ type: ff.type,
1295
+ loc,
1296
+ };
1297
+ const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
1298
+ const write = {
1299
+ kind: "recordKeySet",
1300
+ obj: outRef,
1301
+ shapeId: toId,
1302
+ key: { kind: "strLit", value: ff.name, type: STRING, loc },
1303
+ value: lift === "dyn"
1304
+ ? { kind: "dynFrom", value: raw, type: DYN, loc }
1305
+ : lowerer.applyWidthLift(lift, raw, tIv, loc),
1306
+ overflowOnly: true,
1307
+ loc,
1308
+ };
1309
+ body.push(utag >= 0 && ff.type.kind === "union"
1310
+ ? {
1311
+ kind: "if",
1312
+ cond: {
1313
+ kind: "unionIsTag",
1314
+ unionId: ff.type.unionId,
1315
+ tag: utag,
1316
+ negated: true,
1317
+ value: raw,
1318
+ type: BOOL,
1319
+ loc,
1320
+ },
1321
+ then: [write],
1322
+ else_: null,
1323
+ loc,
1324
+ }
1325
+ : write);
1326
+ }
1327
+ return;
1328
+ }
1329
+ const fIv = from.indexValue;
1330
+ const intoSlot = (v) => plan.retag !== null
1331
+ ? { kind: "call", callee: plan.retag, args: [v], type: tIv, loc }
1332
+ : plan.wrapTag < 0
1333
+ ? v
1334
+ : {
1335
+ kind: "unionWrap",
1336
+ unionId: tIv.unionId,
1337
+ tag: plan.wrapTag,
1338
+ value: v,
1339
+ type: tIv,
1340
+ loc,
1341
+ };
1342
+ // Declared source fields first (literal keys; absent optionals skip).
1343
+ for (const ff of from.fields) {
1344
+ const raw = {
1345
+ kind: "recordGet",
1346
+ obj: sRef,
1347
+ shapeId: plan.shapeId,
1348
+ field: ff.name,
1349
+ type: ff.type,
1350
+ loc,
1351
+ };
1352
+ const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
1353
+ const write = {
1354
+ kind: "recordKeySet",
1355
+ obj: outRef,
1356
+ shapeId: toId,
1357
+ key: { kind: "strLit", value: ff.name, type: STRING, loc },
1358
+ value: intoSlot(raw),
1359
+ overflowOnly: true,
1360
+ loc,
1361
+ };
1362
+ body.push(utag >= 0 && ff.type.kind === "union"
1363
+ ? {
1364
+ kind: "if",
1365
+ cond: {
1366
+ kind: "unionIsTag",
1367
+ unionId: ff.type.unionId,
1368
+ tag: utag,
1369
+ negated: true,
1370
+ value: raw,
1371
+ type: BOOL,
1372
+ loc,
1373
+ },
1374
+ then: [write],
1375
+ else_: null,
1376
+ loc,
1377
+ }
1378
+ : write);
1379
+ }
1380
+ // Then the source overflow, in JS own-key order.
1381
+ const ks = `ks.${ci}`;
1382
+ const iv = `i.${ci}`;
1383
+ const kv = `k.${ci}`;
1384
+ locals.push({ id: ks, name: `ks${n}`, type: ksT, mutable: false }, { id: iv, name: `i${n}`, type: F64, mutable: true }, { id: kv, name: `k${n}`, type: STRING, mutable: false });
1385
+ body.push({
1386
+ kind: "varDecl",
1387
+ localId: ks,
1388
+ init: { kind: "recordOvfKeys", obj: sRef, shapeId: plan.shapeId, type: ksT, loc },
1389
+ loc,
1390
+ }, {
1391
+ kind: "for",
1392
+ init: { kind: "varDecl", localId: iv, init: numLit(0, loc), loc },
1393
+ cond: {
1394
+ kind: "bin",
1395
+ op: "<",
1396
+ left: varRef(iv, F64, loc),
1397
+ right: {
1398
+ kind: "arrIntrinsic",
1399
+ method: "length",
1400
+ receiver: varRef(ks, ksT, loc),
1401
+ args: [],
1402
+ type: F64,
1403
+ loc,
1404
+ },
1405
+ type: BOOL,
1406
+ loc,
1407
+ },
1408
+ update: {
1409
+ kind: "assign",
1410
+ localId: iv,
1411
+ value: {
1412
+ kind: "bin",
1413
+ op: "+",
1414
+ left: varRef(iv, F64, loc),
1415
+ right: numLit(1, loc),
1416
+ type: F64,
1417
+ loc,
1418
+ },
1419
+ loc,
1420
+ },
1421
+ body: [
1422
+ {
1423
+ kind: "varDecl",
1424
+ localId: kv,
1425
+ init: {
1426
+ kind: "arrayGet",
1427
+ arr: varRef(ks, ksT, loc),
1428
+ index: varRef(iv, F64, loc),
1429
+ type: STRING,
1430
+ loc,
1431
+ },
1432
+ loc,
1433
+ },
1434
+ {
1435
+ kind: "recordKeySet",
1436
+ obj: outRef,
1437
+ shapeId: toId,
1438
+ key: varRef(kv, STRING, loc),
1439
+ value: intoSlot({
1440
+ kind: "recordKeyGet",
1441
+ obj: sRef,
1442
+ shapeId: plan.shapeId,
1443
+ key: varRef(kv, STRING, loc),
1444
+ overflowOnly: true,
1445
+ type: fIv,
1446
+ loc,
1447
+ }),
1448
+ overflowOnly: true,
1449
+ loc,
1450
+ },
1451
+ ],
1452
+ loc,
1453
+ });
1454
+ });
1455
+ body.push({ kind: "return", value: outRef, loc });
1456
+ lowerer.liftedFns.push({ name, params, returnType: toT, locals, body, loc });
1457
+ return name;
1458
+ }
1459
+ /** The interned helper flattening an env-shaped record into the
1460
+ * [k0, v0, k1, v1, ...] string[] cp.execSync consumes — declared string
1461
+ * fields first (undefined-armed absents skipped, the Node-drops-undefined
1462
+ * rule), then index-signature overflow in JS own-key order. Every value
1463
+ * source must be a string or a `string | undefined` union whose value arm
1464
+ * is a string. Null when the shape carries a non-string field/value slot
1465
+ * (the caller fences). */
1466
+ export function lowerEnvToPairsHelper(lowerer, shapeId, loc) {
1467
+ const shape = lowerer.shapes.get(shapeId);
1468
+ if (!shape || shape.tuple)
1469
+ return null;
1470
+ // A string | undefined value flows as its string arm; a bare string
1471
+ // flows directly. `unwrapStr` returns the code (or null → fence).
1472
+ const strArmTag = (t) => {
1473
+ if (t.kind === "string")
1474
+ return "plain";
1475
+ if (t.kind !== "union")
1476
+ return null;
1477
+ const def = lowerer.unions.get(t.unionId);
1478
+ if (!def)
1479
+ return null;
1480
+ const nonUnit = def.arms.filter((a) => !isRefCounted(a) || a.kind === "string");
1481
+ // Exactly a string arm plus unit arms (string | undefined).
1482
+ const strTag = def.arms.findIndex((a) => a.kind === "string");
1483
+ if (strTag < 0)
1484
+ return null;
1485
+ if (!def.arms.every((a) => a.kind === "string" || a.kind === "undefinedT" || a.kind === "nullT")) {
1486
+ return null;
1487
+ }
1488
+ void nonUnit;
1489
+ return strTag;
1490
+ };
1491
+ // The HEADER value matrix (OutgoingHttpHeaders — `number | string |
1492
+ // string[] | undefined`): numbers format (Node's String(n)), arrays
1493
+ // expand to one pair per element (Node writes one line each), units
1494
+ // skip. Slots whose arms fit neither matrix keep the fence.
1495
+ const headerArms = (t) => {
1496
+ if (t.kind !== "union")
1497
+ return null;
1498
+ const def = lowerer.unions.get(t.unionId);
1499
+ if (!def)
1500
+ return null;
1501
+ if (!def.arms.every((a) => a.kind === "string" ||
1502
+ a.kind === "f64" ||
1503
+ (a.kind === "array" && a.elem.kind === "string") ||
1504
+ a.kind === "undefinedT" ||
1505
+ a.kind === "nullT")) {
1506
+ return null;
1507
+ }
1508
+ return {
1509
+ str: def.arms.findIndex((a) => a.kind === "string"),
1510
+ f64: def.arms.findIndex((a) => a.kind === "f64"),
1511
+ arr: def.arms.findIndex((a) => a.kind === "array"),
1512
+ };
1513
+ };
1514
+ const slotOk = (t) => strArmTag(t) !== null || headerArms(t) !== null;
1515
+ for (const f of shape.fields) {
1516
+ if (!slotOk(f.type))
1517
+ return null;
1518
+ }
1519
+ if (shape.indexValue && !slotOk(shape.indexValue))
1520
+ return null;
1521
+ const key = `env.pairs:${shapeId}`;
1522
+ const existing = lowerer.valueHelpers.get(key);
1523
+ if (existing)
1524
+ return existing;
1525
+ const name = `%env.pairs.${lowerer.valueHelpers.size}`;
1526
+ lowerer.valueHelpers.set(key, name);
1527
+ const recT = { kind: "record", shapeId };
1528
+ const arrT = arrayOf(STRING);
1529
+ const sRef = varRef("s.0", recT, loc);
1530
+ const outRef = varRef("out.0", arrT, loc);
1531
+ // The string value of a field/overflow read: unwrap the union arm, or
1532
+ // pass a plain string through.
1533
+ const asStr = (raw, t) => {
1534
+ const tag = strArmTag(t);
1535
+ if (tag === "plain" || tag === null)
1536
+ return raw;
1537
+ if (t.kind !== "union")
1538
+ return raw;
1539
+ return { kind: "unionNarrow", unionId: t.unionId, tag, value: raw, type: STRING, loc };
1540
+ };
1541
+ const pushOne = (v) => ({
1542
+ kind: "exprStmt",
1543
+ expr: { kind: "arrIntrinsic", method: "push", receiver: outRef, args: [v], type: F64, loc },
1544
+ loc,
1545
+ });
1546
+ const push = (k, v) => ({
1547
+ kind: "block",
1548
+ body: [pushOne(k), pushOne(v)],
1549
+ loc,
1550
+ });
1551
+ const locals = [
1552
+ { id: "s.0", name: "s", type: recT, mutable: true },
1553
+ { id: "out.0", name: "out", type: arrT, mutable: false },
1554
+ ];
1555
+ // One write per entry: the string|undefined fast path keeps its
1556
+ // historic shape; a header slot dispatches arm-wise (string pushes,
1557
+ // f64 formats via toString, string[] expands element-wise — repeated
1558
+ // same-name pairs, one per element — and units skip).
1559
+ let siteNo = 0;
1560
+ const writeFor = (k, raw, t) => {
1561
+ const st = strArmTag(t);
1562
+ if (st !== null) {
1563
+ const write = push(k, asStr(raw, t));
1564
+ const utag = t.kind === "union" ? lowerer.armTag(t.unionId, UNDEFINED_T) : -1;
1565
+ return utag >= 0 && t.kind === "union"
1566
+ ? {
1567
+ kind: "if",
1568
+ cond: {
1569
+ kind: "unionIsTag",
1570
+ unionId: t.unionId,
1571
+ tag: utag,
1572
+ negated: true,
1573
+ value: raw,
1574
+ type: BOOL,
1575
+ loc,
1576
+ },
1577
+ then: [write],
1578
+ else_: null,
1579
+ loc,
1580
+ }
1581
+ : write;
1582
+ }
1583
+ if (t.kind !== "union")
1584
+ throw new InternalCompilerError("lowerer bug: header slot outside the pairs matrix");
1585
+ const ha = headerArms(t);
1586
+ const isTag = (tag) => ({
1587
+ kind: "unionIsTag",
1588
+ unionId: t.unionId,
1589
+ tag,
1590
+ negated: false,
1591
+ value: raw,
1592
+ type: BOOL,
1593
+ loc,
1594
+ });
1595
+ const narrowTo = (tag, nt) => ({
1596
+ kind: "unionNarrow",
1597
+ unionId: t.unionId,
1598
+ tag,
1599
+ value: raw,
1600
+ type: nt,
1601
+ loc,
1602
+ });
1603
+ let chain = [];
1604
+ if (ha.arr >= 0) {
1605
+ const uid = siteNo++;
1606
+ const aT = arrayOf(STRING);
1607
+ locals.push({ id: `a.${uid}`, name: `a${uid}`, type: aT, mutable: false }, { id: `j.${uid}`, name: `j${uid}`, type: F64, mutable: true });
1608
+ const aRef = varRef(`a.${uid}`, aT, loc);
1609
+ const jRef = varRef(`j.${uid}`, F64, loc);
1610
+ chain = [
1611
+ {
1612
+ kind: "if",
1613
+ cond: isTag(ha.arr),
1614
+ then: [
1615
+ { kind: "varDecl", localId: `a.${uid}`, init: narrowTo(ha.arr, aT), loc },
1616
+ {
1617
+ kind: "for",
1618
+ init: { kind: "varDecl", localId: `j.${uid}`, init: numLit(0, loc), loc },
1619
+ cond: {
1620
+ kind: "bin",
1621
+ op: "<",
1622
+ left: jRef,
1623
+ right: {
1624
+ kind: "arrIntrinsic",
1625
+ method: "length",
1626
+ receiver: aRef,
1627
+ args: [],
1628
+ type: F64,
1629
+ loc,
1630
+ },
1631
+ type: BOOL,
1632
+ loc,
1633
+ },
1634
+ update: {
1635
+ kind: "assign",
1636
+ localId: `j.${uid}`,
1637
+ value: { kind: "bin", op: "+", left: jRef, right: numLit(1, loc), type: F64, loc },
1638
+ loc,
1639
+ },
1640
+ body: [push(k, { kind: "arrayGet", arr: aRef, index: jRef, type: STRING, loc })],
1641
+ loc,
1642
+ },
1643
+ ],
1644
+ else_: chain.length > 0 ? chain : null,
1645
+ loc,
1646
+ },
1647
+ ];
1648
+ }
1649
+ if (ha.f64 >= 0) {
1650
+ chain = [
1651
+ {
1652
+ kind: "if",
1653
+ cond: isTag(ha.f64),
1654
+ then: [push(k, { kind: "toString", operand: narrowTo(ha.f64, F64), type: STRING, loc })],
1655
+ else_: chain.length > 0 ? chain : null,
1656
+ loc,
1657
+ },
1658
+ ];
1659
+ }
1660
+ if (ha.str >= 0) {
1661
+ chain = [
1662
+ {
1663
+ kind: "if",
1664
+ cond: isTag(ha.str),
1665
+ then: [push(k, narrowTo(ha.str, STRING))],
1666
+ else_: chain.length > 0 ? chain : null,
1667
+ loc,
1668
+ },
1669
+ ];
1670
+ }
1671
+ return { kind: "block", body: chain, loc };
1672
+ };
1673
+ const body = [
1674
+ {
1675
+ kind: "varDecl",
1676
+ localId: "out.0",
1677
+ init: { kind: "arrayLit", elems: [], type: arrT, loc },
1678
+ loc,
1679
+ },
1680
+ ];
1681
+ for (const f of shape.fields) {
1682
+ const raw = { kind: "recordGet", obj: sRef, shapeId, field: f.name, type: f.type, loc };
1683
+ const k = { kind: "strLit", value: f.name, type: STRING, loc };
1684
+ body.push(writeFor(k, raw, f.type));
1685
+ }
1686
+ if (shape.indexValue) {
1687
+ const iv = shape.indexValue;
1688
+ const ksT = arrayOf(STRING);
1689
+ locals.push({ id: "ks.0", name: "ks", type: ksT, mutable: false }, { id: "i.0", name: "i", type: F64, mutable: true }, { id: "k.0", name: "k", type: STRING, mutable: false }, { id: "raw.0", name: "raw", type: iv, mutable: false });
1690
+ const rawRead = {
1691
+ kind: "recordKeyGet",
1692
+ obj: sRef,
1693
+ shapeId,
1694
+ key: varRef("k.0", STRING, loc),
1695
+ overflowOnly: true,
1696
+ type: iv,
1697
+ loc,
1698
+ };
1699
+ const utag = iv.kind === "union" ? lowerer.armTag(iv.unionId, UNDEFINED_T) : -1;
1700
+ const innerBody = [
1701
+ {
1702
+ kind: "varDecl",
1703
+ localId: "k.0",
1704
+ init: {
1705
+ kind: "arrayGet",
1706
+ arr: varRef("ks.0", ksT, loc),
1707
+ index: varRef("i.0", F64, loc),
1708
+ type: STRING,
1709
+ loc,
1710
+ },
1711
+ loc,
1712
+ },
1713
+ { kind: "varDecl", localId: "raw.0", init: rawRead, loc },
1714
+ ];
1715
+ const rawRef = varRef("raw.0", iv, loc);
1716
+ void utag;
1717
+ innerBody.push(writeFor(varRef("k.0", STRING, loc), rawRef, iv));
1718
+ body.push({
1719
+ kind: "varDecl",
1720
+ localId: "ks.0",
1721
+ init: { kind: "recordOvfKeys", obj: sRef, shapeId, type: ksT, loc },
1722
+ loc,
1723
+ }, countedFor(loc, {
1724
+ kind: "arrIntrinsic",
1725
+ method: "length",
1726
+ receiver: varRef("ks.0", ksT, loc),
1727
+ args: [],
1728
+ type: F64,
1729
+ loc,
1730
+ }, () => innerBody));
1731
+ }
1732
+ body.push({ kind: "return", value: outRef, loc });
1733
+ lowerer.liftedFns.push({
1734
+ name,
1735
+ params: [{ localId: "s.0", name: "s", type: recT }],
1736
+ returnType: arrT,
1737
+ locals,
1738
+ body,
1739
+ loc,
1740
+ });
1741
+ return name;
1742
+ }
1743
+ //# sourceMappingURL=indexed-objects.js.map