@scriptc/compiler 0.4.8 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/ambient/node-fallback/buffer.d.ts +2 -0
  2. package/ambient/node-fallback/child_process.d.ts +9 -3
  3. package/ambient/node-fallback/dns-promises.d.ts +25 -0
  4. package/ambient/node-fallback/dns.d.ts +29 -0
  5. package/ambient/node-fallback/test.d.ts +7 -0
  6. package/ambient/scriptc-node-fallback.d.ts +145 -2
  7. package/ambient/scriptc-overrides.d.ts +22 -13
  8. package/dist/backend/build-cache.d.ts +1 -1
  9. package/dist/backend/build-cache.js +1 -1
  10. package/dist/backend/build-cache.js.map +1 -1
  11. package/dist/backend/cache-root.d.ts +7 -0
  12. package/dist/backend/cache-root.js +27 -0
  13. package/dist/backend/cache-root.js.map +1 -1
  14. package/dist/backend/executable-features.js +5 -1
  15. package/dist/backend/executable-features.js.map +1 -1
  16. package/dist/backend/link-plan.js +7 -1
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/bytes-loop-versions.d.ts +12 -1
  19. package/dist/backend/llvm/bytes-loop-versions.js +107 -30
  20. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  21. package/dist/backend/llvm/bytes-loop-versions.test.js +96 -0
  22. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  23. package/dist/backend/llvm/checked-value-lifetimes.js +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +16 -5
  26. package/dist/backend/llvm/classes.js +34 -6
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +21 -2
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +9 -0
  31. package/dist/backend/llvm/common.js +9 -0
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/cpu-dispatch.d.ts +36 -2
  34. package/dist/backend/llvm/cpu-dispatch.js +96 -2
  35. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  36. package/dist/backend/llvm/dense-array-access.d.ts +5 -2
  37. package/dist/backend/llvm/dense-array-access.js +16 -12
  38. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  39. package/dist/backend/llvm/dense-array-access.test.js +3 -1
  40. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  41. package/dist/backend/llvm/dyn.d.ts +24 -0
  42. package/dist/backend/llvm/dyn.js +117 -3
  43. package/dist/backend/llvm/dyn.js.map +1 -1
  44. package/dist/backend/llvm/emit-function.js +6 -0
  45. package/dist/backend/llvm/emit-function.js.map +1 -1
  46. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  47. package/dist/backend/llvm/emit-journal.js.map +1 -1
  48. package/dist/backend/llvm/emit-module.js +48 -5
  49. package/dist/backend/llvm/emit-module.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.test.js +41 -0
  51. package/dist/backend/llvm/emit-module.test.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.js +11 -0
  53. package/dist/backend/llvm/emit-statements.js.map +1 -1
  54. package/dist/backend/llvm/emitter.d.ts +87 -7
  55. package/dist/backend/llvm/emitter.js +136 -15
  56. package/dist/backend/llvm/emitter.js.map +1 -1
  57. package/dist/backend/llvm/expr-async.js +28 -6
  58. package/dist/backend/llvm/expr-async.js.map +1 -1
  59. package/dist/backend/llvm/expr-containers.js +19 -5
  60. package/dist/backend/llvm/expr-containers.js.map +1 -1
  61. package/dist/backend/llvm/expr-dynamic.js +29 -1
  62. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  63. package/dist/backend/llvm/expr-primitives.js +104 -6
  64. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  65. package/dist/backend/llvm/expr-records.js +15 -1
  66. package/dist/backend/llvm/expr-records.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-bridges.js +53 -5
  68. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  69. package/dist/backend/llvm/inline-arrays.js +1 -1
  70. package/dist/backend/llvm/inline-arrays.js.map +1 -1
  71. package/dist/backend/llvm/js-ic.js +126 -2
  72. package/dist/backend/llvm/js-ic.js.map +1 -1
  73. package/dist/backend/llvm/lanes.d.ts +38 -0
  74. package/dist/backend/llvm/lanes.js +778 -0
  75. package/dist/backend/llvm/lanes.js.map +1 -0
  76. package/dist/backend/llvm/lanes.test.d.ts +1 -0
  77. package/dist/backend/llvm/lanes.test.js +402 -0
  78. package/dist/backend/llvm/lanes.test.js.map +1 -0
  79. package/dist/backend/llvm/lib-dispatch.js +9 -4
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-network.js +20 -0
  82. package/dist/backend/llvm/lib-network.js.map +1 -1
  83. package/dist/backend/llvm/lib-shared.js +27 -0
  84. package/dist/backend/llvm/lib-shared.js.map +1 -1
  85. package/dist/backend/llvm/lib-test.js +11 -0
  86. package/dist/backend/llvm/lib-test.js.map +1 -1
  87. package/dist/backend/llvm/local-array-reads.js +2 -2
  88. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  89. package/dist/backend/llvm/map-number-lookup.js +8 -2
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/nullable-unions.js +5 -2
  92. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  93. package/dist/backend/llvm/publish.d.ts +3 -0
  94. package/dist/backend/llvm/publish.js +2 -2
  95. package/dist/backend/llvm/publish.js.map +1 -1
  96. package/dist/backend/llvm/reference-writes.js +1 -0
  97. package/dist/backend/llvm/reference-writes.js.map +1 -1
  98. package/dist/backend/llvm/region-groups.js +43 -4
  99. package/dist/backend/llvm/region-groups.js.map +1 -1
  100. package/dist/backend/llvm/region-groups.test.js +79 -0
  101. package/dist/backend/llvm/region-groups.test.js.map +1 -1
  102. package/dist/backend/llvm/runtime-registries.test.js +32 -1
  103. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  104. package/dist/backend/llvm/shapes.js +10 -1
  105. package/dist/backend/llvm/shapes.js.map +1 -1
  106. package/dist/backend/llvm/string-reads.d.ts +1 -1
  107. package/dist/backend/llvm/string-reads.js +1 -1
  108. package/dist/backend/llvm/string-reads.js.map +1 -1
  109. package/dist/backend/llvm/unwind-abi.js +24 -2
  110. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  111. package/dist/backend/llvm/unwind-abi.test.js +38 -0
  112. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  113. package/dist/backend/llvm/walkers.d.ts +3 -0
  114. package/dist/backend/llvm/walkers.js +20 -2
  115. package/dist/backend/llvm/walkers.js.map +1 -1
  116. package/dist/backend/native/contracts.d.ts +15 -3
  117. package/dist/backend/native/executable.js +19 -5
  118. package/dist/backend/native/executable.js.map +1 -1
  119. package/dist/backend/native-codegen-core.d.ts +20 -0
  120. package/dist/backend/native-codegen-core.js +15 -0
  121. package/dist/backend/native-codegen-core.js.map +1 -1
  122. package/dist/backend/native-codegen.d.ts +5 -0
  123. package/dist/backend/native-codegen.js +62 -8
  124. package/dist/backend/native-codegen.js.map +1 -1
  125. package/dist/backend/native-codegen.test.js +48 -8
  126. package/dist/backend/native-codegen.test.js.map +1 -1
  127. package/dist/backend/native-link-info-core.d.ts +27 -3
  128. package/dist/backend/native-link-info-core.js.map +1 -1
  129. package/dist/backend/native-link-info.test.js +17 -1
  130. package/dist/backend/native-link-info.test.js.map +1 -1
  131. package/dist/backend/native-toolchain.d.ts +1 -1
  132. package/dist/backend/native-toolchain.js +1 -1
  133. package/dist/backend/native-toolchain.js.map +1 -1
  134. package/dist/backend/native-toolchain.test.js +14 -1
  135. package/dist/backend/native-toolchain.test.js.map +1 -1
  136. package/dist/backend/runtime-pack-core.d.ts +9 -3
  137. package/dist/backend/runtime-pack-core.js +6 -1
  138. package/dist/backend/runtime-pack-core.js.map +1 -1
  139. package/dist/backend/runtime-pack.test.js +32 -1
  140. package/dist/backend/runtime-pack.test.js.map +1 -1
  141. package/dist/backend/targets.d.ts +9 -1
  142. package/dist/backend/targets.js +11 -2
  143. package/dist/backend/targets.js.map +1 -1
  144. package/dist/backend/targets.test.js +6 -0
  145. package/dist/backend/targets.test.js.map +1 -1
  146. package/dist/cli/command.js +15 -1
  147. package/dist/cli/command.js.map +1 -1
  148. package/dist/cli/host.d.ts +6 -0
  149. package/dist/cli/mcp.d.ts +72 -0
  150. package/dist/cli/mcp.js +601 -0
  151. package/dist/cli/mcp.js.map +1 -0
  152. package/dist/cli/mcp.test.d.ts +1 -0
  153. package/dist/cli/mcp.test.js +380 -0
  154. package/dist/cli/mcp.test.js.map +1 -0
  155. package/dist/cli/output-options.d.ts +1 -0
  156. package/dist/cli/output-options.js +3 -0
  157. package/dist/cli/output-options.js.map +1 -1
  158. package/dist/cli/usage.d.ts +51 -1
  159. package/dist/cli/usage.js +709 -186
  160. package/dist/cli/usage.js.map +1 -1
  161. package/dist/compat/fetch-profile.js +9 -4
  162. package/dist/compat/fetch-profile.js.map +1 -1
  163. package/dist/compile-types.d.ts +17 -0
  164. package/dist/coverage/report.d.ts +5 -9
  165. package/dist/coverage/report.js.map +1 -1
  166. package/dist/executable/executable-cache.d.ts +17 -3
  167. package/dist/executable/executable-cache.js +17 -3
  168. package/dist/executable/executable-cache.js.map +1 -1
  169. package/dist/executable/prepare.js +87 -10
  170. package/dist/executable/prepare.js.map +1 -1
  171. package/dist/frontend/analysis.js +3 -2
  172. package/dist/frontend/analysis.js.map +1 -1
  173. package/dist/frontend/canon-map.js +13 -8
  174. package/dist/frontend/canon-map.js.map +1 -1
  175. package/dist/frontend/decl-projection.d.ts +18 -0
  176. package/dist/frontend/decl-projection.js +90 -22
  177. package/dist/frontend/decl-projection.js.map +1 -1
  178. package/dist/frontend/decl-projection.test.js +47 -1
  179. package/dist/frontend/decl-projection.test.js.map +1 -1
  180. package/dist/frontend/default-library.d.ts +10 -0
  181. package/dist/frontend/default-library.js +43 -0
  182. package/dist/frontend/default-library.js.map +1 -0
  183. package/dist/frontend/fork-target.js +54 -9
  184. package/dist/frontend/fork-target.js.map +1 -1
  185. package/dist/frontend/fork-target.test.js +82 -0
  186. package/dist/frontend/fork-target.test.js.map +1 -1
  187. package/dist/frontend/inferred-js-diagnostics.test.js +73 -0
  188. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  189. package/dist/frontend/lowering/abstract-equality.d.ts +2 -1
  190. package/dist/frontend/lowering/abstract-equality.js +7 -1
  191. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  192. package/dist/frontend/lowering/array-values.js +2 -2
  193. package/dist/frontend/lowering/array-values.js.map +1 -1
  194. package/dist/frontend/lowering/assertion-members.js +52 -2
  195. package/dist/frontend/lowering/assertion-members.js.map +1 -1
  196. package/dist/frontend/lowering/builtin-namespaces.d.ts +5 -0
  197. package/dist/frontend/lowering/builtin-namespaces.js +19 -12
  198. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/callable-aliases.js +42 -6
  200. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  201. package/dist/frontend/lowering/builtins/child-process.d.ts +12 -11
  202. package/dist/frontend/lowering/builtins/child-process.js +235 -38
  203. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/compression.d.ts +6 -1
  205. package/dist/frontend/lowering/builtins/compression.js +3 -3
  206. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/constants.js +2 -2
  208. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -1
  210. package/dist/frontend/lowering/builtins/crypto.js +9 -1
  211. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/dates.js +26 -6
  213. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/environment.d.ts +13 -1
  215. package/dist/frontend/lowering/builtins/environment.js +15 -4
  216. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/module-bindings.d.ts +33 -0
  218. package/dist/frontend/lowering/builtins/module-bindings.js +213 -11
  219. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-resolution.d.ts +9 -2
  221. package/dist/frontend/lowering/builtins/module-resolution.js +187 -19
  222. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/performance.js +1 -1
  224. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/process.js +40 -2
  226. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/promises.js +33 -0
  228. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/readline.d.ts +9 -5
  230. package/dist/frontend/lowering/builtins/readline.js +184 -75
  231. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/url.d.ts +4 -0
  233. package/dist/frontend/lowering/builtins/url.js +6 -0
  234. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  235. package/dist/frontend/lowering/call-arguments.js +15 -0
  236. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  237. package/dist/frontend/lowering/callable-properties.d.ts +34 -0
  238. package/dist/frontend/lowering/callable-properties.js +210 -0
  239. package/dist/frontend/lowering/callable-properties.js.map +1 -0
  240. package/dist/frontend/lowering/cjs-inline-require.d.ts +16 -0
  241. package/dist/frontend/lowering/cjs-inline-require.js +105 -0
  242. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  243. package/dist/frontend/lowering/cjs-inline-require.test.d.ts +1 -0
  244. package/dist/frontend/lowering/cjs-inline-require.test.js +61 -0
  245. package/dist/frontend/lowering/cjs-inline-require.test.js.map +1 -0
  246. package/dist/frontend/lowering/class-dynamic-dispatch.js +82 -2
  247. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  248. package/dist/frontend/lowering/class-protocols.d.ts +57 -4
  249. package/dist/frontend/lowering/class-protocols.js +597 -30
  250. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  251. package/dist/frontend/lowering/class-unions.js +2 -2
  252. package/dist/frontend/lowering/class-unions.js.map +1 -1
  253. package/dist/frontend/lowering/coercions/function-adapters.d.ts +12 -0
  254. package/dist/frontend/lowering/coercions/function-adapters.js +62 -0
  255. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  256. package/dist/frontend/lowering/coercions/structural-plans.js +56 -1
  257. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  258. package/dist/frontend/lowering/coercions/structural.js +9 -4
  259. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  260. package/dist/frontend/lowering/collection-ingestion.d.ts +9 -0
  261. package/dist/frontend/lowering/collection-ingestion.js +115 -41
  262. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  263. package/dist/frontend/lowering/containers/array-callbacks.js +16 -0
  264. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  265. package/dist/frontend/lowering/containers/bytes.js +66 -10
  266. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  267. package/dist/frontend/lowering/containers/collection-methods.js +61 -5
  268. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  269. package/dist/frontend/lowering/containers/filter-predicates.js +11 -0
  270. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  271. package/dist/frontend/lowering/containers/indexed-objects.d.ts +15 -0
  272. package/dist/frontend/lowering/containers/indexed-objects.js +213 -30
  273. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  274. package/dist/frontend/lowering/error-name-order.d.ts +16 -0
  275. package/dist/frontend/lowering/error-name-order.js +61 -0
  276. package/dist/frontend/lowering/error-name-order.js.map +1 -1
  277. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +17 -0
  278. package/dist/frontend/lowering/expressions/asserted-receiver.js +123 -1
  279. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -1
  280. package/dist/frontend/lowering/expressions/binary.js +147 -20
  281. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  282. package/dist/frontend/lowering/expressions/element-access.js +63 -14
  283. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  284. package/dist/frontend/lowering/expressions/erased-delete.d.ts +59 -0
  285. package/dist/frontend/lowering/expressions/erased-delete.js +247 -0
  286. package/dist/frontend/lowering/expressions/erased-delete.js.map +1 -0
  287. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +10 -0
  288. package/dist/frontend/lowering/expressions/hosted-narrowing.js +48 -1
  289. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  290. package/dist/frontend/lowering/expressions/identifiers.js +20 -0
  291. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/narrowing.d.ts +7 -2
  293. package/dist/frontend/lowering/expressions/narrowing.js +77 -45
  294. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +62 -19
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/optional-chains.js +19 -0
  298. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/property-access.d.ts +7 -7
  300. package/dist/frontend/lowering/expressions/property-access.js +247 -48
  301. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  302. package/dist/frontend/lowering/expressions/relational.d.ts +1 -0
  303. package/dist/frontend/lowering/expressions/relational.js +18 -8
  304. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  305. package/dist/frontend/lowering/expressions/union-fields.js +11 -5
  306. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  307. package/dist/frontend/lowering/expressions/updates.js +121 -11
  308. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  309. package/dist/frontend/lowering/function-context.d.ts +10 -0
  310. package/dist/frontend/lowering/function-context.js +36 -0
  311. package/dist/frontend/lowering/function-context.js.map +1 -1
  312. package/dist/frontend/lowering/function-returns.js +8 -8
  313. package/dist/frontend/lowering/function-returns.js.map +1 -1
  314. package/dist/frontend/lowering/handle-properties.d.ts +62 -3
  315. package/dist/frontend/lowering/handle-properties.js +674 -26
  316. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  317. package/dist/frontend/lowering/handle-properties.test.js +95 -2
  318. package/dist/frontend/lowering/handle-properties.test.js.map +1 -1
  319. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  320. package/dist/frontend/lowering/lower-builtin-values.js +44 -0
  321. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  322. package/dist/frontend/lowering/lower-calls.js +328 -136
  323. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  324. package/dist/frontend/lowering/lower-classes.js +82 -17
  325. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  326. package/dist/frontend/lowering/lower-event-emitter.js +113 -9
  327. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  328. package/dist/frontend/lowering/lower-expando.d.ts +13 -21
  329. package/dist/frontend/lowering/lower-expando.js +90 -126
  330. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  331. package/dist/frontend/lowering/lower-exprs.js +2 -2
  332. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  333. package/dist/frontend/lowering/lower-functions.js +65 -0
  334. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  335. package/dist/frontend/lowering/lower-inspect.js +471 -0
  336. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  337. package/dist/frontend/lowering/lower-modules.js +36 -10
  338. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  339. package/dist/frontend/lowering/lower-node-island.js +28 -0
  340. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  341. package/dist/frontend/lowering/lower-server.d.ts +53 -7
  342. package/dist/frontend/lowering/lower-server.js +213 -42
  343. package/dist/frontend/lowering/lower-server.js.map +1 -1
  344. package/dist/frontend/lowering/lower-stdlib.js +50 -7
  345. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  346. package/dist/frontend/lowering/lower-stmts.d.ts +24 -0
  347. package/dist/frontend/lowering/lower-stmts.js +463 -220
  348. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  349. package/dist/frontend/lowering/lower-stream.js +2 -2
  350. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  351. package/dist/frontend/lowering/lower-test.js +71 -2
  352. package/dist/frontend/lowering/lower-test.js.map +1 -1
  353. package/dist/frontend/lowering/lowerer.d.ts +81 -10
  354. package/dist/frontend/lowering/lowerer.js +319 -72
  355. package/dist/frontend/lowering/lowerer.js.map +1 -1
  356. package/dist/frontend/lowering/new-target.js +10 -2
  357. package/dist/frontend/lowering/new-target.js.map +1 -1
  358. package/dist/frontend/lowering/nullish-empty-pattern.js +3 -3
  359. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -1
  360. package/dist/frontend/lowering/partial-assertions.js +30 -5
  361. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  362. package/dist/frontend/lowering/primitive-throws.js +91 -1
  363. package/dist/frontend/lowering/primitive-throws.js.map +1 -1
  364. package/dist/frontend/lowering/primitive-wrappers.d.ts +9 -0
  365. package/dist/frontend/lowering/primitive-wrappers.js +2 -2
  366. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  367. package/dist/frontend/lowering/promise-executor-adapter.js +5 -2
  368. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  369. package/dist/frontend/lowering/record-links.js +7 -2
  370. package/dist/frontend/lowering/record-links.js.map +1 -1
  371. package/dist/frontend/lowering/surfaces.d.ts +4 -0
  372. package/dist/frontend/lowering/surfaces.js +118 -2
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/surfaces.test.d.ts +1 -0
  375. package/dist/frontend/lowering/surfaces.test.js +31 -0
  376. package/dist/frontend/lowering/surfaces.test.js.map +1 -0
  377. package/dist/frontend/mock-shapes.js +3 -3
  378. package/dist/frontend/mock-shapes.js.map +1 -1
  379. package/dist/frontend/npm-static-ladder.d.ts +21 -0
  380. package/dist/frontend/npm-static-ladder.js +2 -0
  381. package/dist/frontend/npm-static-ladder.js.map +1 -0
  382. package/dist/frontend/npm-static-ladder.test.d.ts +1 -0
  383. package/dist/frontend/npm-static-ladder.test.js +138 -0
  384. package/dist/frontend/npm-static-ladder.test.js.map +1 -0
  385. package/dist/frontend/npm-static-status.d.ts +15 -0
  386. package/dist/frontend/npm-static-status.js +2 -0
  387. package/dist/frontend/npm-static-status.js.map +1 -0
  388. package/dist/frontend/package-shims.js +1 -1
  389. package/dist/frontend/package-shims.js.map +1 -1
  390. package/dist/frontend/pipeline.d.ts +1 -1
  391. package/dist/frontend/pipeline.js +222 -25
  392. package/dist/frontend/pipeline.js.map +1 -1
  393. package/dist/frontend/program-analysis.d.ts +4 -0
  394. package/dist/frontend/program-analysis.js +6 -0
  395. package/dist/frontend/program-analysis.js.map +1 -1
  396. package/dist/frontend/program.js +258 -32
  397. package/dist/frontend/program.js.map +1 -1
  398. package/dist/frontend/program.test.js +30 -0
  399. package/dist/frontend/program.test.js.map +1 -1
  400. package/dist/frontend/resolve.js +29 -5
  401. package/dist/frontend/resolve.js.map +1 -1
  402. package/dist/frontend/resolve.test.js +40 -0
  403. package/dist/frontend/resolve.test.js.map +1 -1
  404. package/dist/frontend/services.d.ts +8 -0
  405. package/dist/frontend/services.js +7 -0
  406. package/dist/frontend/services.js.map +1 -1
  407. package/dist/frontend/ts7/checker.d.ts +7 -0
  408. package/dist/frontend/ts7/checker.js +12 -0
  409. package/dist/frontend/ts7/checker.js.map +1 -1
  410. package/dist/frontend/ts7/checker.test.js +1 -0
  411. package/dist/frontend/ts7/checker.test.js.map +1 -1
  412. package/dist/frontend/ts7/program-host.d.ts +39 -2
  413. package/dist/frontend/ts7/program-host.js +62 -8
  414. package/dist/frontend/ts7/program-host.js.map +1 -1
  415. package/dist/frontend/ts7/program-host.test.js +33 -0
  416. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  417. package/dist/frontend/ts7/session-cache.d.ts +5 -1
  418. package/dist/frontend/ts7/session-cache.js +7 -1
  419. package/dist/frontend/ts7/session-cache.js.map +1 -1
  420. package/dist/frontend/ts7/session-cache.test.js +37 -0
  421. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  422. package/dist/frontend/ts7/session.js +19 -1
  423. package/dist/frontend/ts7/session.js.map +1 -1
  424. package/dist/frontend/ts7/source-parser.d.ts +17 -2
  425. package/dist/frontend/ts7/source-parser.js +61 -2
  426. package/dist/frontend/ts7/source-parser.js.map +1 -1
  427. package/dist/frontend/ts7/source-parser.test.js +55 -2
  428. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  429. package/dist/frontend/tsc-codes.d.ts +3 -2
  430. package/dist/frontend/tsc-codes.js +129 -22
  431. package/dist/frontend/tsc-codes.js.map +1 -1
  432. package/dist/frontend/type-mapper.d.ts +5 -11
  433. package/dist/frontend/type-mapper.js +380 -70
  434. package/dist/frontend/type-mapper.js.map +1 -1
  435. package/dist/index.d.ts +1 -1
  436. package/dist/index.js +67 -7
  437. package/dist/index.js.map +1 -1
  438. package/dist/ir/builtin-effects.js +29 -0
  439. package/dist/ir/builtin-effects.js.map +1 -1
  440. package/dist/ir/builtin-signatures.d.ts +1 -1
  441. package/dist/ir/builtin-signatures.js +72 -6
  442. package/dist/ir/builtin-signatures.js.map +1 -1
  443. package/dist/ir/codec.generated.d.ts +1 -1
  444. package/dist/ir/codec.generated.js +321 -263
  445. package/dist/ir/codec.generated.js.map +1 -1
  446. package/dist/ir/constant-length-clones.d.ts +26 -0
  447. package/dist/ir/constant-length-clones.js +589 -0
  448. package/dist/ir/constant-length-clones.js.map +1 -0
  449. package/dist/ir/constant-length-clones.test.d.ts +1 -0
  450. package/dist/ir/constant-length-clones.test.js +292 -0
  451. package/dist/ir/constant-length-clones.test.js.map +1 -0
  452. package/dist/ir/constant-tables.d.ts +10 -5
  453. package/dist/ir/constant-tables.js +83 -17
  454. package/dist/ir/constant-tables.js.map +1 -1
  455. package/dist/ir/constant-tables.test.js +58 -1
  456. package/dist/ir/constant-tables.test.js.map +1 -1
  457. package/dist/ir/fields.generated.js +5 -2
  458. package/dist/ir/fields.generated.js.map +1 -1
  459. package/dist/ir/function-references.js +2 -0
  460. package/dist/ir/function-references.js.map +1 -1
  461. package/dist/ir/function-references.test.js +13 -0
  462. package/dist/ir/function-references.test.js.map +1 -1
  463. package/dist/ir/integer-loops.js +1 -0
  464. package/dist/ir/integer-loops.js.map +1 -1
  465. package/dist/ir/integer-loops.test.js +16 -0
  466. package/dist/ir/integer-loops.test.js.map +1 -1
  467. package/dist/ir/ir.d.ts +50 -6
  468. package/dist/ir/ir.js +44 -2
  469. package/dist/ir/ir.js.map +1 -1
  470. package/dist/ir/ir.test.js +83 -1
  471. package/dist/ir/ir.test.js.map +1 -1
  472. package/dist/ir/js-groups.js +5 -1
  473. package/dist/ir/js-groups.js.map +1 -1
  474. package/dist/ir/js-ic.d.ts +20 -0
  475. package/dist/ir/js-ic.js +81 -4
  476. package/dist/ir/js-ic.js.map +1 -1
  477. package/dist/ir/js-ic.test.js +8 -1
  478. package/dist/ir/js-ic.test.js.map +1 -1
  479. package/dist/ir/lane-plans.d.ts +86 -0
  480. package/dist/ir/lane-plans.js +589 -0
  481. package/dist/ir/lane-plans.js.map +1 -0
  482. package/dist/ir/lane-plans.test.d.ts +1 -0
  483. package/dist/ir/lane-plans.test.js +549 -0
  484. package/dist/ir/lane-plans.test.js.map +1 -0
  485. package/dist/ir/runtime-features.d.ts +68 -10
  486. package/dist/ir/runtime-features.js +285 -17
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/runtime-features.test.js +190 -1
  489. package/dist/ir/runtime-features.test.js.map +1 -1
  490. package/dist/ir/validate.js +61 -24
  491. package/dist/ir/validate.js.map +1 -1
  492. package/dist/native/cache.d.ts +5 -0
  493. package/dist/native/cache.js +23 -1
  494. package/dist/native/cache.js.map +1 -1
  495. package/dist/native/cache.test.js +29 -1
  496. package/dist/native/cache.test.js.map +1 -1
  497. package/dist/native/cli.js +4 -2
  498. package/dist/native/cli.js.map +1 -1
  499. package/dist/native/compiler.d.ts +11 -3
  500. package/dist/native/compiler.js +102 -16
  501. package/dist/native/compiler.js.map +1 -1
  502. package/dist/native/compiler.test.js +244 -2
  503. package/dist/native/compiler.test.js.map +1 -1
  504. package/dist/native/prepare.d.ts +14 -1
  505. package/dist/native/prepare.js +79 -29
  506. package/dist/native/prepare.js.map +1 -1
  507. package/dist/native/sanitizer.test.js +3 -0
  508. package/dist/native/sanitizer.test.js.map +1 -1
  509. package/dist/native/unchanged.d.ts +80 -0
  510. package/dist/native/unchanged.js +301 -0
  511. package/dist/native/unchanged.js.map +1 -0
  512. package/dist/native/unchanged.test.d.ts +1 -0
  513. package/dist/native/unchanged.test.js +249 -0
  514. package/dist/native/unchanged.test.js.map +1 -0
  515. package/dist/node-islands/boundary.d.ts +16 -0
  516. package/dist/node-islands/boundary.js +70 -7
  517. package/dist/node-islands/boundary.js.map +1 -1
  518. package/dist/node-islands/boundary.test.js +59 -14
  519. package/dist/node-islands/boundary.test.js.map +1 -1
  520. package/dist/node-islands/detect.js +203 -47
  521. package/dist/node-islands/detect.js.map +1 -1
  522. package/dist/node-islands/detect.test.js +45 -0
  523. package/dist/node-islands/detect.test.js.map +1 -1
  524. package/dist/node-islands/growth.js +4 -16
  525. package/dist/node-islands/growth.js.map +1 -1
  526. package/dist/node-islands/modules.d.ts +3 -0
  527. package/dist/node-islands/modules.js +143 -12
  528. package/dist/node-islands/modules.js.map +1 -1
  529. package/dist/node-islands/modules.test.js +125 -0
  530. package/dist/node-islands/modules.test.js.map +1 -1
  531. package/dist/node-islands/report.d.ts +1 -1
  532. package/dist/node-islands/report.js +2 -1
  533. package/dist/node-islands/report.js.map +1 -1
  534. package/package.json +20 -20
  535. package/shims/undici/core/request.ts +7 -1
  536. package/surface-manifest.json +380 -2
@@ -1,5 +1,5 @@
1
1
  import { recordToEnvPairs } from "./environment.js";
2
- import { boolLit, numLit, strLit, varRef } from "../../../ir/build.js";
2
+ import { boolLit, nodeThrowExpr, numLit, strLit, varRef } from "../../../ir/build.js";
3
3
  import { keyedHelperName } from "../stable-names.js";
4
4
  import { InternalCompilerError } from "../../../errors.js";
5
5
  import { resolve } from "node:path";
@@ -141,12 +141,12 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
141
141
  if (!ts.isObjectLiteralExpression(optsNode)) {
142
142
  const runtime = lowerSpawnSyncRuntimeOptions(lowerer, optsNode, expr.arguments.nodes[1], loc);
143
143
  if (runtime) {
144
- return {
144
+ const call = (fn, extra, callCmd = cmd, callArgs = argv) => ({
145
145
  kind: "libCall",
146
- fn: "cp.spawnSyncExt",
146
+ fn,
147
147
  args: [
148
- cmd,
149
- argv,
148
+ callCmd,
149
+ callArgs,
150
150
  runtime.timeout,
151
151
  killSignal,
152
152
  runtime.inMode,
@@ -156,12 +156,44 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
156
156
  runtime.input,
157
157
  runtime.hasInput,
158
158
  runtime.shell,
159
+ ...extra,
159
160
  ],
160
161
  type: SPAWNRES_T,
161
162
  loc,
162
- };
163
+ });
164
+ // An absent `env` inherits our environment; a present one replaces
165
+ // it. The two entry points differ only in that argument, so the
166
+ // member's presence test picks one at the call. Node evaluates the
167
+ // command and its arguments before it reads the options record, so
168
+ // both go into hidden locals the presence test follows: a command
169
+ // that adds or drops `env` in the record decides the entry point,
170
+ // as it does under Node.
171
+ if (runtime.hasEnv !== null && runtime.envPairs !== null) {
172
+ const cmdLocal = lowerer.declareHiddenLocal("%spawnSyncCmd", cmd.type);
173
+ const argvLocal = lowerer.declareHiddenLocal("%spawnSyncArgs", argv.type);
174
+ const cmdArg = varRef(cmdLocal.id, cmd.type, loc);
175
+ const argvArg = varRef(argvLocal.id, argv.type, loc);
176
+ return {
177
+ kind: "seqExpr",
178
+ stmts: [
179
+ { kind: "varDecl", localId: cmdLocal.id, init: cmd, loc },
180
+ { kind: "varDecl", localId: argvLocal.id, init: argv, loc },
181
+ ],
182
+ result: {
183
+ kind: "ternary",
184
+ cond: runtime.hasEnv,
185
+ then: call("cp.spawnSyncExtEnv", [runtime.envPairs], cmdArg, argvArg),
186
+ else_: call("cp.spawnSyncExt", [], cmdArg, argvArg),
187
+ type: SPAWNRES_T,
188
+ loc,
189
+ },
190
+ type: SPAWNRES_T,
191
+ loc,
192
+ };
193
+ }
194
+ return call("cp.spawnSyncExt", []);
163
195
  }
164
- lowerer.noLowering("spawnSync with a non-literal options argument", optsNode, "pass the options inline so each member can be checked, or give them the SpawnSyncOptionsWithStringEncoding type (env and killSignal stay literal)");
196
+ lowerer.noLowering("spawnSync with a non-literal options argument", optsNode, "pass the options inline so each member can be checked, or give them the SpawnSyncOptionsWithStringEncoding type (killSignal stays literal)");
165
197
  }
166
198
  const applyStdio = (node) => {
167
199
  const modeOf = (v, fd) => {
@@ -462,7 +494,7 @@ function lowerSpawnSyncRuntimeOptions(lowerer, optsNode, argsNode, loc) {
462
494
  const shapeId = opts.type.shapeId;
463
495
  const shape = lowerer.shapes.get(shapeId);
464
496
  const names = shape?.fields.map((f) => f.name).join(",");
465
- if (names !== "cwd,encoding,input,shell,stdio,timeout,windowsHide")
497
+ if (names !== "cwd,encoding,env,input,shell,stdio,timeout,windowsHide")
466
498
  return null;
467
499
  if (opts.kind !== "varRef" && opts.kind !== "recordGet" && opts.kind !== "fieldGet") {
468
500
  lowerer.noLowering("spawnSync with a computed options argument", optsNode, "the member reads re-read the options — bind the object to a const first");
@@ -526,6 +558,64 @@ function lowerSpawnSyncRuntimeOptions(lowerer, optsNode, argsNode, loc) {
526
558
  loc,
527
559
  }
528
560
  : boolLit(true, loc);
561
+ // The `env` member replaces the child's environment. Presence rides
562
+ // apart from the value (an absent option inherits ours): only the
563
+ // present branch converts the record to pairs.
564
+ const envField = shape.fields.find((f) => f.name === "env");
565
+ let hasEnv = null;
566
+ let envPairs = null;
567
+ if (envField) {
568
+ const ft = envField.type;
569
+ const readEnv = { kind: "recordGet", obj: opts, shapeId, field: "env", type: ft, loc };
570
+ const pairsOf = (rec, value) => {
571
+ if (rec.kind !== "record")
572
+ return null;
573
+ const helper = lowerer.envToPairsHelper(rec.shapeId, loc);
574
+ return helper === null
575
+ ? null
576
+ : { kind: "call", callee: helper, args: [value], type: arrayOf(STRING), loc };
577
+ };
578
+ if (ft.kind === "union") {
579
+ const arms = lowerer.unions.get(ft.unionId)?.arms ?? [];
580
+ let rec = null;
581
+ for (const arm of arms) {
582
+ if (arm.kind === "record") {
583
+ rec = arm;
584
+ break;
585
+ }
586
+ }
587
+ const uTag = lowerer.armTag(ft.unionId, UNDEFINED_T);
588
+ if (rec !== null && uTag >= 0) {
589
+ hasEnv = {
590
+ kind: "unionIsTag",
591
+ unionId: ft.unionId,
592
+ tag: uTag,
593
+ negated: true,
594
+ value: readEnv,
595
+ type: BOOL,
596
+ loc,
597
+ };
598
+ envPairs = pairsOf(rec, {
599
+ kind: "unionNarrow",
600
+ unionId: ft.unionId,
601
+ tag: lowerer.armTag(ft.unionId, rec),
602
+ value: readEnv,
603
+ type: rec,
604
+ loc,
605
+ });
606
+ }
607
+ }
608
+ else if (ft.kind === "record") {
609
+ hasEnv = boolLit(true, loc);
610
+ envPairs = pairsOf(ft, readEnv);
611
+ }
612
+ // A member that exists but cannot convert must not fall back to the
613
+ // inheriting entry point: that would silently run the child WITHOUT
614
+ // the environment the caller asked for.
615
+ if (hasEnv === null || envPairs === null) {
616
+ lowerer.noLowering("spawnSync with an unsupported `env` record", optsNode, "every env value must be a string or `string | undefined` — the replacement environment converts to [key, value] pairs");
617
+ }
618
+ }
529
619
  return {
530
620
  cwd: readOpt("cwd", emptyStr, STRING),
531
621
  input: readOpt("input", emptyStr, STRING),
@@ -549,6 +639,8 @@ function lowerSpawnSyncRuntimeOptions(lowerer, optsNode, argsNode, loc) {
549
639
  inMode,
550
640
  outMode: modeCall(1),
551
641
  errMode: modeCall(2),
642
+ hasEnv,
643
+ envPairs,
552
644
  };
553
645
  }
554
646
  /** Interned `%cp.spawnSyncStdioMode.<fd>` — the runtime stdio-mode
@@ -716,20 +808,83 @@ function spawnSyncStdioModeHelper(lowerer, shapeId, stdioT, fd, loc) {
716
808
  });
717
809
  return name;
718
810
  }
811
+ /** A runtime stdio SLOT expression whose TYPE is a union of the supported
812
+ * literals (`useStdin ? "pipe" : "ignore"`): the expression evaluates once
813
+ * into a hidden local, and a strEq chain maps the value to its mode (0
814
+ * ignore, 1 inherit, 3 pipe). The type proves the value is one of them; a
815
+ * lying assertion lands on the runtime TypeError Node raises for an
816
+ * invalid stdio value. Null for anything else — the literal and fd paths,
817
+ * and the fences, stay where they are. */
818
+ function stdioModeExpr(lowerer, el, t, which) {
819
+ const parts = t.isUnionType() ? ts.constituentTypes(t) : [t];
820
+ if (parts.length < 2)
821
+ return null;
822
+ let hasPipe = false;
823
+ let hasInherit = false;
824
+ let hasIgnore = false;
825
+ for (const part of parts) {
826
+ if (!part.isStringLiteralType())
827
+ return null;
828
+ const literal = part.value;
829
+ if (literal === "pipe")
830
+ hasPipe = true;
831
+ else if (literal === "inherit")
832
+ hasInherit = true;
833
+ else if (literal === "ignore")
834
+ hasIgnore = true;
835
+ else
836
+ return null;
837
+ }
838
+ const slotLoc = locOf(el);
839
+ const value = lowerer.lowerExprExpecting(el, STRING);
840
+ const local = lowerer.declareHiddenLocal(`stdio${which}`, STRING);
841
+ local.mutable = true;
842
+ const read = () => varRef(local.id, STRING, slotLoc);
843
+ const withMode = (name, m, next) => ({
844
+ kind: "ternary",
845
+ cond: {
846
+ kind: "strEq",
847
+ negated: false,
848
+ left: read(),
849
+ right: strLit(name, slotLoc),
850
+ type: BOOL,
851
+ loc: slotLoc,
852
+ },
853
+ then: numLit(m, slotLoc),
854
+ else_: next,
855
+ type: F64,
856
+ loc: slotLoc,
857
+ });
858
+ let mode = nodeThrowExpr(1, "ERR_INVALID_ARG_VALUE", 'spawn stdio must be "pipe", "ignore", or "inherit"', F64, slotLoc);
859
+ if (hasPipe)
860
+ mode = withMode("pipe", 3, mode);
861
+ if (hasInherit)
862
+ mode = withMode("inherit", 1, mode);
863
+ if (hasIgnore)
864
+ mode = withMode("ignore", 0, mode);
865
+ return {
866
+ kind: "seqExpr",
867
+ stmts: [{ kind: "assign", localId: local.id, value, loc: slotLoc }],
868
+ result: mode,
869
+ type: F64,
870
+ loc: slotLoc,
871
+ };
872
+ }
719
873
  /** `spawn(command, args?, options)` → one cp.spawn / cp.spawnOpts
720
874
  * libCall. Computed options use native runtime normalization. Inline
721
- * stdio accepts "ignore", "inherit", or "pipe" as the scalar,
722
- * or the 3-tuple whose stdin pipe becomes child.stdin, stdout/stderr
723
- * pipes become child.stdout/child.stderr, and output slots may also be
724
- * number fds. Omitting stdio uses Node's default: all three piped. The
725
- * other lowered
726
- * members: `detached` (a boolean literal, inline or carried by the
727
- * conditional spread `...(c ? { detached: true } : {})` in either
875
+ * stdio accepts "ignore", "inherit", or "pipe" as the scalar, or the
876
+ * 3-tuple whose stdin pipe becomes child.stdin, stdout/stderr pipes
877
+ * become child.stdout/child.stderr, and output slots may also be number
878
+ * fds; a 3-tuple slot whose type is a union of those literals
879
+ * (`useStdin ? "pipe" : "ignore"`) evaluates once and maps to its mode
880
+ * at the call. Omitting stdio uses Node's default: all three piped. The
881
+ * other lowered members: `detached` (a boolean literal, inline or carried
882
+ * by the conditional spread `...(c ? { detached: true } : {})` in either
728
883
  * orientation — POSIX_SPAWN_SETSID, the child gets its own session and
729
- * process group like Node's), `env` (a
730
- * REPLACEMENT environment, the exec-core pairs machinery), `cwd`, and
731
- * `windowsHide` (a POSIX no-op). The bare `{ stdio: "ignore" }` shape
732
- * keeps its historical cp.spawn lowering. */
884
+ * process group like Node's), `env` (a REPLACEMENT environment, the
885
+ * exec-core pairs machinery), `cwd`, and `windowsHide` (a POSIX no-op).
886
+ * The bare `{ stdio: "ignore" }` shape keeps its historical cp.spawn
887
+ * lowering. */
733
888
  export function lowerSpawnCall(lowerer, expr, loc) {
734
889
  if (expr.arguments.nodes.length > 3 || expr.arguments.nodes.some(ts.isSpreadElement)) {
735
890
  lowerer.noLowering("spawn with this argument shape", expr, 'the supported form is spawn(command, args?, { stdio: "pipe" | "ignore" | "inherit", detached?, env?, cwd? })');
@@ -770,7 +925,11 @@ export function lowerSpawnCall(lowerer, expr, loc) {
770
925
  // the out/err fd expressions for mode 2 (the daemon-log idiom:
771
926
  // stdio: ["ignore", logFd, logFd]).
772
927
  let sawStdio = false;
773
- let inMode = 0, outMode = 0, errMode = 0;
928
+ // A slot may be a runtime expression (a union of the three literals), so
929
+ // each mode is an IrExpr: a literal here, the mapped expression there.
930
+ let inMode = numLit(0, loc);
931
+ let outMode = numLit(0, loc);
932
+ let errMode = numLit(0, loc);
774
933
  let outFd = numLit(0, loc);
775
934
  let errFd = numLit(0, loc);
776
935
  let detached = boolLit(false, loc);
@@ -780,6 +939,19 @@ export function lowerSpawnCall(lowerer, expr, loc) {
780
939
  let envPairs = { kind: "arrayLit", elems: [], type: arrayOf(STRING), loc };
781
940
  let cwd = emptyStr;
782
941
  let plain = true; // exactly { stdio: "ignore" }: the historical libCall
942
+ // Node evaluates the command, then the arguments, then the options
943
+ // object's members in source order. A member value that needs a hidden
944
+ // local is bound in that order, so a side effect in an earlier member (a
945
+ // call, an assignment) shapes a later one as it does under Node.
946
+ const valuePrelude = [];
947
+ const bindInto = (stmts, name, value) => {
948
+ if (value.kind === "strLit" || value.kind === "numLit" || value.kind === "boolLit")
949
+ return value;
950
+ const local = lowerer.declareHiddenLocal(name, value.type);
951
+ stmts.push({ kind: "varDecl", localId: local.id, init: value, loc });
952
+ return varRef(local.id, value.type, loc);
953
+ };
954
+ const bind = (name, value) => bindInto(valuePrelude, name, value);
783
955
  if (optsNode && ts.isObjectLiteralExpression(optsNode)) {
784
956
  for (const p of optsNode.properties.nodes) {
785
957
  // The conditional-spread idiom `...(isWindows ? {} : { detached:
@@ -802,14 +974,14 @@ export function lowerSpawnCall(lowerer, expr, loc) {
802
974
  : null;
803
975
  if (lit !== null) {
804
976
  const cond = lowerer.lowerCondition(cs.cond);
805
- detached = {
977
+ detached = bind("%spawnDetached", {
806
978
  kind: "ternary",
807
979
  cond,
808
980
  then: boolLit(cs.whenTrue ? lit : false, loc),
809
981
  else_: boolLit(cs.whenTrue ? false : lit, loc),
810
982
  type: BOOL,
811
983
  loc,
812
- };
984
+ });
813
985
  plain = false;
814
986
  continue;
815
987
  }
@@ -825,6 +997,9 @@ export function lowerSpawnCall(lowerer, expr, loc) {
825
997
  // The 3-tuple form: every slot accepts a literal, including
826
998
  // "pipe" (child.stdin/stdout/stderr); stdout/stderr also accept
827
999
  // a number-typed fd (an openSync result — dup2'd into the child).
1000
+ // A slot EXPRESSION whose type is a union of the three literals
1001
+ // (`useStdin ? "pipe" : "ignore"`) evaluates once into a hidden
1002
+ // local and maps to its mode at the call.
828
1003
  if (ts.isArrayLiteralExpression(m.value) && m.value.elements.nodes.length === 3) {
829
1004
  const slot = (el, which) => {
830
1005
  const t = lowerer.typeOf(el);
@@ -832,7 +1007,7 @@ export function lowerSpawnCall(lowerer, expr, loc) {
832
1007
  if (t.value !== "ignore" && t.value !== "inherit" && t.value !== "pipe") {
833
1008
  lowerer.noLowering(`spawn with stdio "${t.value}"`, el, '"ignore", "inherit", "pipe", and number output fds are the supported stdio slots');
834
1009
  }
835
- const mode = t.value === "inherit" ? 1 : t.value === "pipe" ? 3 : 0;
1010
+ const mode = numLit(t.value === "inherit" ? 1 : t.value === "pipe" ? 3 : 0, loc);
836
1011
  if (which === 0)
837
1012
  inMode = mode;
838
1013
  else if (which === 1)
@@ -843,19 +1018,31 @@ export function lowerSpawnCall(lowerer, expr, loc) {
843
1018
  plain = false;
844
1019
  return;
845
1020
  }
1021
+ const runtimeMode = stdioModeExpr(lowerer, el, t, which);
1022
+ if (runtimeMode) {
1023
+ const mode = bind(`%spawnStdio${which}Mode`, runtimeMode);
1024
+ if (which === 0)
1025
+ inMode = mode;
1026
+ else if (which === 1)
1027
+ outMode = mode;
1028
+ else
1029
+ errMode = mode;
1030
+ plain = false;
1031
+ return;
1032
+ }
846
1033
  if (which === 0) {
847
1034
  lowerer.noLowering("spawn with this stdin slot", el, 'stdin takes "pipe", "ignore", or "inherit" (fd stdin has no lowering)');
848
1035
  }
849
1036
  if (lowerer.mapTypeOf(t)?.kind !== "f64") {
850
1037
  lowerer.noLowering("spawn with this stdio option", el, 'each slot is "ignore", "inherit", or a number fd (an openSync result)');
851
1038
  }
852
- const fd = lowerer.lowerExprExpecting(el, F64);
1039
+ const fd = bind(which === 1 ? "%spawnStdoutFd" : "%spawnStderrFd", lowerer.lowerExprExpecting(el, F64));
853
1040
  if (which === 1) {
854
- outMode = 2;
1041
+ outMode = numLit(2, loc);
855
1042
  outFd = fd;
856
1043
  }
857
1044
  else {
858
- errMode = 2;
1045
+ errMode = numLit(2, loc);
859
1046
  errFd = fd;
860
1047
  }
861
1048
  };
@@ -870,7 +1057,7 @@ export function lowerSpawnCall(lowerer, expr, loc) {
870
1057
  lowerer.noLowering("spawn with this stdio option", m.value, '"pipe", "ignore", and "inherit" are the supported stdio literals ' +
871
1058
  "(or a 3-tuple of those and number output fds)");
872
1059
  }
873
- const mode = v === "inherit" ? 1 : v === "pipe" ? 3 : 0;
1060
+ const mode = numLit(v === "inherit" ? 1 : v === "pipe" ? 3 : 0, loc);
874
1061
  inMode = outMode = errMode = mode;
875
1062
  sawStdio = true;
876
1063
  if (v !== "ignore")
@@ -889,18 +1076,18 @@ export function lowerSpawnCall(lowerer, expr, loc) {
889
1076
  // A runtime boolean — the portable daemon idiom `detached:
890
1077
  // process.platform !== "win32"` — reaches the same
891
1078
  // POSIX_SPAWN_SETSID flag through scr_spawn_opts's bool slot.
892
- detached = lowerer.lowerExprExpecting(m.value, BOOL);
1079
+ detached = bind("%spawnDetached", lowerer.lowerExprExpecting(m.value, BOOL));
893
1080
  plain = false;
894
1081
  }
895
1082
  break;
896
1083
  }
897
1084
  case "env":
898
1085
  hasEnv = boolLit(true, loc);
899
- envPairs = recordToEnvPairs(lowerer, m.value);
1086
+ envPairs = bind("%spawnEnv", recordToEnvPairs(lowerer, m.value));
900
1087
  plain = false;
901
1088
  break;
902
1089
  case "cwd":
903
- cwd = lowerer.lowerExprExpecting(m.value, STRING);
1090
+ cwd = bind("%spawnCwd", lowerer.lowerExprExpecting(m.value, STRING));
904
1091
  plain = false;
905
1092
  break;
906
1093
  case "windowsHide":
@@ -925,7 +1112,7 @@ export function lowerSpawnCall(lowerer, expr, loc) {
925
1112
  }
926
1113
  }
927
1114
  if (!sawStdio) {
928
- inMode = outMode = errMode = 3;
1115
+ inMode = outMode = errMode = numLit(3, loc);
929
1116
  plain = false;
930
1117
  }
931
1118
  // Node joins [command, ...args] with single spaces for the shell form, and
@@ -940,15 +1127,15 @@ export function lowerSpawnCall(lowerer, expr, loc) {
940
1127
  if (plain) {
941
1128
  return { kind: "libCall", fn: "cp.spawn", args: [cmd, argv], type: CHILD_T, loc };
942
1129
  }
943
- return {
1130
+ const callOf = (callCmd, callArgs) => ({
944
1131
  kind: "libCall",
945
1132
  fn: "cp.spawnOpts",
946
1133
  args: [
947
- cmd,
948
- argv,
949
- numLit(inMode, loc),
950
- numLit(outMode, loc),
951
- numLit(errMode, loc),
1134
+ callCmd,
1135
+ callArgs,
1136
+ inMode,
1137
+ outMode,
1138
+ errMode,
952
1139
  outFd,
953
1140
  errFd,
954
1141
  detached,
@@ -959,7 +1146,17 @@ export function lowerSpawnCall(lowerer, expr, loc) {
959
1146
  ],
960
1147
  type: CHILD_T,
961
1148
  loc,
962
- };
1149
+ });
1150
+ if (valuePrelude.length === 0)
1151
+ return callOf(cmd, argv);
1152
+ // The bound member values were collected in source order; the command and
1153
+ // the arguments precede them, so an earlier value that changes a later
1154
+ // one's input is seen as in Node.
1155
+ const stmts = [];
1156
+ const callCmd = bindInto(stmts, "%spawnCmd", cmd);
1157
+ const callArgs = bindInto(stmts, "%spawnArgs", argv);
1158
+ stmts.push(...valuePrelude);
1159
+ return { kind: "seqExpr", stmts, result: callOf(callCmd, callArgs), type: CHILD_T, loc };
963
1160
  }
964
1161
  /** `fork(staticModulePath, args?, options?)` embeds the selected program
965
1162
  * module and re-executes the native artifact with one private target id.