@scriptc/compiler 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (776) hide show
  1. package/ambient/node-fallback/child_process.d.ts +71 -22
  2. package/ambient/node-fallback/crypto.d.ts +15 -7
  3. package/ambient/node-fallback/events.d.ts +23 -5
  4. package/ambient/node-fallback/fs.d.ts +3 -2
  5. package/ambient/node-fallback/http.d.ts +23 -17
  6. package/ambient/node-fallback/https.d.ts +5 -2
  7. package/ambient/node-fallback/net.d.ts +6 -0
  8. package/ambient/node-fallback/os.d.ts +11 -1
  9. package/ambient/node-fallback/path-posix.d.ts +6 -0
  10. package/ambient/node-fallback/path-win32.d.ts +5 -0
  11. package/ambient/node-fallback/path.d.ts +2 -0
  12. package/ambient/node-fallback/zlib.d.ts +31 -2
  13. package/ambient/scriptc-node-fallback.d.ts +37 -7
  14. package/ambient/scriptc.d.ts +7 -2
  15. package/dist/backend/executable-features.js +11 -3
  16. package/dist/backend/executable-features.js.map +1 -1
  17. package/dist/backend/library-pack.d.ts +6 -0
  18. package/dist/backend/library-pack.js +17 -6
  19. package/dist/backend/library-pack.js.map +1 -1
  20. package/dist/backend/library-pack.test.d.ts +1 -0
  21. package/dist/backend/library-pack.test.js +28 -0
  22. package/dist/backend/library-pack.test.js.map +1 -0
  23. package/dist/backend/linker.d.ts +9 -2
  24. package/dist/backend/linker.js +190 -32
  25. package/dist/backend/linker.js.map +1 -1
  26. package/dist/backend/lld.d.ts +8 -4
  27. package/dist/backend/lld.js +19 -13
  28. package/dist/backend/lld.js.map +1 -1
  29. package/dist/backend/lld.test.js +3 -1
  30. package/dist/backend/lld.test.js.map +1 -1
  31. package/dist/backend/llvm/alloc.d.ts +15 -2
  32. package/dist/backend/llvm/alloc.js +172 -36
  33. package/dist/backend/llvm/alloc.js.map +1 -1
  34. package/dist/backend/llvm/alloc.test.js +69 -1
  35. package/dist/backend/llvm/alloc.test.js.map +1 -1
  36. package/dist/backend/llvm/arenas.d.ts +17 -4
  37. package/dist/backend/llvm/arenas.js +105 -10
  38. package/dist/backend/llvm/arenas.js.map +1 -1
  39. package/dist/backend/llvm/arenas.test.js +229 -0
  40. package/dist/backend/llvm/arenas.test.js.map +1 -1
  41. package/dist/backend/llvm/bytes-alias.js +10 -1
  42. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  43. package/dist/backend/llvm/bytes-headers.js +6 -0
  44. package/dist/backend/llvm/bytes-headers.js.map +1 -1
  45. package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
  46. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  47. package/dist/backend/llvm/call-lifetimes.js +10 -0
  48. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  49. package/dist/backend/llvm/classes.d.ts +16 -9
  50. package/dist/backend/llvm/classes.js +142 -37
  51. package/dist/backend/llvm/classes.js.map +1 -1
  52. package/dist/backend/llvm/classes.test.js +42 -0
  53. package/dist/backend/llvm/classes.test.js.map +1 -1
  54. package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
  55. package/dist/backend/llvm/cpu-dispatch.js +31 -7
  56. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  57. package/dist/backend/llvm/dyn.d.ts +12 -3
  58. package/dist/backend/llvm/dyn.js +31 -7
  59. package/dist/backend/llvm/dyn.js.map +1 -1
  60. package/dist/backend/llvm/emit-function.js +67 -4
  61. package/dist/backend/llvm/emit-function.js.map +1 -1
  62. package/dist/backend/llvm/emit-module.js +90 -39
  63. package/dist/backend/llvm/emit-module.js.map +1 -1
  64. package/dist/backend/llvm/emit-module.test.d.ts +1 -0
  65. package/dist/backend/llvm/emit-module.test.js +52 -0
  66. package/dist/backend/llvm/emit-module.test.js.map +1 -0
  67. package/dist/backend/llvm/emit-statements.js +99 -15
  68. package/dist/backend/llvm/emit-statements.js.map +1 -1
  69. package/dist/backend/llvm/emitter.d.ts +113 -8
  70. package/dist/backend/llvm/emitter.js +438 -67
  71. package/dist/backend/llvm/emitter.js.map +1 -1
  72. package/dist/backend/llvm/emitter.test.js +31 -3
  73. package/dist/backend/llvm/emitter.test.js.map +1 -1
  74. package/dist/backend/llvm/expr-async.js +19 -1
  75. package/dist/backend/llvm/expr-async.js.map +1 -1
  76. package/dist/backend/llvm/expr-bytes.js +16 -1
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-calls.js +18 -2
  79. package/dist/backend/llvm/expr-calls.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.js +31 -10
  81. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  82. package/dist/backend/llvm/expr-primitives.js +31 -3
  83. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  84. package/dist/backend/llvm/expr-records.d.ts +1 -1
  85. package/dist/backend/llvm/expr-records.js +124 -56
  86. package/dist/backend/llvm/expr-records.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +17 -0
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/js-groups.d.ts +21 -0
  90. package/dist/backend/llvm/js-groups.js +277 -0
  91. package/dist/backend/llvm/js-groups.js.map +1 -0
  92. package/dist/backend/llvm/js-ic.d.ts +19 -1
  93. package/dist/backend/llvm/js-ic.js +96 -23
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/lib-dispatch.js +132 -1
  96. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  97. package/dist/backend/llvm/lib-network.js +33 -6
  98. package/dist/backend/llvm/lib-network.js.map +1 -1
  99. package/dist/backend/llvm/lib-process.js +44 -3
  100. package/dist/backend/llvm/lib-process.js.map +1 -1
  101. package/dist/backend/llvm/lib-shared.js +69 -2
  102. package/dist/backend/llvm/lib-shared.js.map +1 -1
  103. package/dist/backend/llvm/local-union-storage.test.js +32 -0
  104. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  105. package/dist/backend/llvm/loop-state.js +7 -2
  106. package/dist/backend/llvm/loop-state.js.map +1 -1
  107. package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
  108. package/dist/backend/llvm/map-entry-fusion.js +3 -3
  109. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  110. package/dist/backend/llvm/map-number-lookup.test.js +6 -6
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  112. package/dist/backend/llvm/nullable-unions.js +7 -6
  113. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  114. package/dist/backend/llvm/nullable-unions.test.js +4 -1
  115. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  116. package/dist/backend/llvm/receivers.js +3 -0
  117. package/dist/backend/llvm/receivers.js.map +1 -1
  118. package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
  119. package/dist/backend/llvm/record-entry-fusion.js +217 -0
  120. package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
  121. package/dist/backend/llvm/record-results.d.ts +5 -2
  122. package/dist/backend/llvm/record-results.js +13 -12
  123. package/dist/backend/llvm/record-results.js.map +1 -1
  124. package/dist/backend/llvm/record-views.js +12 -6
  125. package/dist/backend/llvm/record-views.js.map +1 -1
  126. package/dist/backend/llvm/reference-effects.js +1 -0
  127. package/dist/backend/llvm/reference-effects.js.map +1 -1
  128. package/dist/backend/llvm/reference-writes.js +3 -0
  129. package/dist/backend/llvm/reference-writes.js.map +1 -1
  130. package/dist/backend/llvm/region-ir.js +1 -0
  131. package/dist/backend/llvm/region-ir.js.map +1 -1
  132. package/dist/backend/llvm/region-sites.d.ts +18 -0
  133. package/dist/backend/llvm/region-sites.js +79 -1
  134. package/dist/backend/llvm/region-sites.js.map +1 -1
  135. package/dist/backend/llvm/runtime-registries.test.js +53 -6
  136. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  137. package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
  138. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +33 -3
  140. package/dist/backend/llvm/shapes.js +183 -13
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/stack-objects.d.ts +1 -2
  143. package/dist/backend/llvm/stack-objects.js +8 -5
  144. package/dist/backend/llvm/stack-objects.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +12 -0
  146. package/dist/backend/llvm/walkers.js +46 -2
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +12 -2
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/may-throw.test.js +13 -0
  151. package/dist/backend/may-throw.test.js.map +1 -1
  152. package/dist/backend/native/contracts.d.ts +48 -8
  153. package/dist/backend/native/executable.js +55 -13
  154. package/dist/backend/native/executable.js.map +1 -1
  155. package/dist/backend/native/helper-identity-record.d.ts +11 -0
  156. package/dist/backend/native/helper-identity-record.js +76 -0
  157. package/dist/backend/native/helper-identity-record.js.map +1 -0
  158. package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
  159. package/dist/backend/native/helper-identity-record.test.js +101 -0
  160. package/dist/backend/native/helper-identity-record.test.js.map +1 -0
  161. package/dist/backend/native/library.js +9 -1
  162. package/dist/backend/native/library.js.map +1 -1
  163. package/dist/backend/native/runtime-inputs.js +4 -1
  164. package/dist/backend/native/runtime-inputs.js.map +1 -1
  165. package/dist/backend/native/vendor.d.ts +1 -1
  166. package/dist/backend/native/vendor.js +1 -1
  167. package/dist/backend/native/vendor.js.map +1 -1
  168. package/dist/backend/native-codegen-core.d.ts +13 -10
  169. package/dist/backend/native-codegen-core.js +26 -13
  170. package/dist/backend/native-codegen-core.js.map +1 -1
  171. package/dist/backend/native-codegen.js +27 -8
  172. package/dist/backend/native-codegen.js.map +1 -1
  173. package/dist/backend/native-codegen.test.js +110 -14
  174. package/dist/backend/native-codegen.test.js.map +1 -1
  175. package/dist/backend/native-link-info-core.d.ts +37 -8
  176. package/dist/backend/native-link-info-core.js.map +1 -1
  177. package/dist/backend/runtime-pack-core.d.ts +17 -2
  178. package/dist/backend/runtime-pack-core.js +18 -3
  179. package/dist/backend/runtime-pack-core.js.map +1 -1
  180. package/dist/backend/runtime-pack-targets.test.js +1 -1
  181. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  182. package/dist/backend/runtime-pack.test.js +211 -2
  183. package/dist/backend/runtime-pack.test.js.map +1 -1
  184. package/dist/backend/tree-classes.d.ts +42 -0
  185. package/dist/backend/tree-classes.js +723 -0
  186. package/dist/backend/tree-classes.js.map +1 -0
  187. package/dist/backend/tree-classes.test.d.ts +1 -0
  188. package/dist/backend/tree-classes.test.js +338 -0
  189. package/dist/backend/tree-classes.test.js.map +1 -0
  190. package/dist/backend/vendor-archives.d.ts +5 -1
  191. package/dist/backend/vendor-archives.js +51 -7
  192. package/dist/backend/vendor-archives.js.map +1 -1
  193. package/dist/backend/vendor-inputs.d.ts +25 -4
  194. package/dist/backend/vendor-inputs.js +68 -4
  195. package/dist/backend/vendor-inputs.js.map +1 -1
  196. package/dist/backend/vendor-inputs.test.js +35 -1
  197. package/dist/backend/vendor-inputs.test.js.map +1 -1
  198. package/dist/backend/warm-cache.js +1 -1
  199. package/dist/backend/warm-cache.js.map +1 -1
  200. package/dist/compat/fetch-profile.js +2 -2
  201. package/dist/coverage/report.js +47 -0
  202. package/dist/coverage/report.js.map +1 -1
  203. package/dist/coverage/surface-manifest.js +1 -1
  204. package/dist/diagnostics/codes.d.ts +8 -0
  205. package/dist/diagnostics/codes.js +8 -0
  206. package/dist/diagnostics/codes.js.map +1 -1
  207. package/dist/diagnostics/diagnostic.d.ts +27 -9
  208. package/dist/diagnostics/diagnostic.js +60 -19
  209. package/dist/diagnostics/diagnostic.js.map +1 -1
  210. package/dist/diagnostics/envelope.d.ts +18 -0
  211. package/dist/diagnostics/envelope.js.map +1 -1
  212. package/dist/executable/executable-cache.d.ts +21 -2
  213. package/dist/executable/executable-cache.js +21 -1
  214. package/dist/executable/executable-cache.js.map +1 -1
  215. package/dist/executable/executable-cache.test.js +123 -1
  216. package/dist/executable/executable-cache.test.js.map +1 -1
  217. package/dist/executable/prepare.js +199 -248
  218. package/dist/executable/prepare.js.map +1 -1
  219. package/dist/frontend/analysis.js +200 -18
  220. package/dist/frontend/analysis.js.map +1 -1
  221. package/dist/frontend/builtin-modules.d.ts +4 -0
  222. package/dist/frontend/builtin-modules.js +10 -0
  223. package/dist/frontend/builtin-modules.js.map +1 -1
  224. package/dist/frontend/early-errors.d.ts +12 -2
  225. package/dist/frontend/early-errors.js +535 -4
  226. package/dist/frontend/early-errors.js.map +1 -1
  227. package/dist/frontend/early-errors.test.js +165 -0
  228. package/dist/frontend/early-errors.test.js.map +1 -1
  229. package/dist/frontend/inferred-js-diagnostics.test.js +65 -0
  230. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  231. package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
  232. package/dist/frontend/jsx-opinion-sites.test.js +86 -0
  233. package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
  234. package/dist/frontend/lib-exports.d.ts +23 -4
  235. package/dist/frontend/lib-exports.js +98 -26
  236. package/dist/frontend/lib-exports.js.map +1 -1
  237. package/dist/frontend/lowering/binding-analysis.js +21 -3
  238. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  239. package/dist/frontend/lowering/buffers.d.ts +8 -0
  240. package/dist/frontend/lowering/buffers.js +43 -0
  241. package/dist/frontend/lowering/buffers.js.map +1 -0
  242. package/dist/frontend/lowering/builtin-calls.js +4 -0
  243. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  244. package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
  245. package/dist/frontend/lowering/builtin-namespaces.js +24 -3
  246. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  247. package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
  248. package/dist/frontend/lowering/builtin-statics.js +407 -0
  249. package/dist/frontend/lowering/builtin-statics.js.map +1 -0
  250. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  251. package/dist/frontend/lowering/builtins/arguments.js +12 -0
  252. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  253. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
  254. package/dist/frontend/lowering/builtins/atomics.js +87 -1
  255. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  256. package/dist/frontend/lowering/builtins/child-process-methods.js +2 -2
  257. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
  259. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
  260. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  261. package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
  262. package/dist/frontend/lowering/builtins/child-process.js +560 -27
  263. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
  265. package/dist/frontend/lowering/builtins/compression.js +41 -21
  266. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/constants.js +7 -2
  268. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  270. package/dist/frontend/lowering/builtins/filesystem-calls.js +28 -2
  271. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/json.js +4 -0
  273. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  274. package/dist/frontend/lowering/builtins/module-calls.js +3 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
  277. package/dist/frontend/lowering/builtins/numbers.js +10 -2
  278. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  279. package/dist/frontend/lowering/builtins/operating-system.d.ts +6 -3
  280. package/dist/frontend/lowering/builtins/operating-system.js +96 -16
  281. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  283. package/dist/frontend/lowering/builtins/process.js +103 -8
  284. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  285. package/dist/frontend/lowering/builtins/promises.js +169 -8
  286. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/properties.js +6 -2
  288. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  289. package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
  290. package/dist/frontend/lowering/builtins/readline.js +180 -36
  291. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  292. package/dist/frontend/lowering/builtins/url.js +35 -12
  293. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  294. package/dist/frontend/lowering/builtins/webassembly.js +2 -0
  295. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  296. package/dist/frontend/lowering/call-arguments.d.ts +10 -0
  297. package/dist/frontend/lowering/call-arguments.js +37 -2
  298. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  299. package/dist/frontend/lowering/call-signatures.d.ts +10 -0
  300. package/dist/frontend/lowering/call-signatures.js +103 -0
  301. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  302. package/dist/frontend/lowering/class-construction.d.ts +14 -2
  303. package/dist/frontend/lowering/class-construction.js +99 -5
  304. package/dist/frontend/lowering/class-construction.js.map +1 -1
  305. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +9 -0
  306. package/dist/frontend/lowering/class-dynamic-dispatch.js +1283 -1030
  307. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  308. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
  309. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  310. package/dist/frontend/lowering/class-prototypes.js +20 -15
  311. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  312. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  313. package/dist/frontend/lowering/class-runtime-statics.js +20 -1
  314. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  315. package/dist/frontend/lowering/class-unions.js +21 -4
  316. package/dist/frontend/lowering/class-unions.js.map +1 -1
  317. package/dist/frontend/lowering/coercions/function-adapters.js +9 -0
  318. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  319. package/dist/frontend/lowering/coercions/state.d.ts +8 -0
  320. package/dist/frontend/lowering/coercions/state.js +17 -0
  321. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  322. package/dist/frontend/lowering/coercions/structural-plans.js +20 -5
  323. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  324. package/dist/frontend/lowering/coercions/structural.js +10 -1
  325. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  326. package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
  327. package/dist/frontend/lowering/coercions/unions.js +54 -10
  328. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  329. package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
  330. package/dist/frontend/lowering/constructor-returns.js +284 -58
  331. package/dist/frontend/lowering/constructor-returns.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-callbacks.js +156 -62
  333. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  334. package/dist/frontend/lowering/containers/array-construction.js +21 -3
  335. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  336. package/dist/frontend/lowering/containers/array-from-async.js +139 -3
  337. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  338. package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
  339. package/dist/frontend/lowering/containers/array-iteration.js +24 -7
  340. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
  341. package/dist/frontend/lowering/containers/array-methods.js +14 -11
  342. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  343. package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
  344. package/dist/frontend/lowering/containers/bytes.js +446 -86
  345. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  346. package/dist/frontend/lowering/containers/callback-arguments.d.ts +5 -0
  347. package/dist/frontend/lowering/containers/callback-arguments.js +21 -12
  348. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  349. package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
  350. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  351. package/dist/frontend/lowering/containers/collection-methods.js +52 -17
  352. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  353. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
  354. package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
  355. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  356. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
  357. package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
  358. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  359. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  360. package/dist/frontend/lowering/crypto-tables.js +5 -5
  361. package/dist/frontend/lowering/dispatch-sites.js +3 -0
  362. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  363. package/dist/frontend/lowering/divergences.d.ts +40 -0
  364. package/dist/frontend/lowering/divergences.js +239 -20
  365. package/dist/frontend/lowering/divergences.js.map +1 -1
  366. package/dist/frontend/lowering/effect-free.d.ts +12 -0
  367. package/dist/frontend/lowering/effect-free.js +44 -0
  368. package/dist/frontend/lowering/effect-free.js.map +1 -0
  369. package/dist/frontend/lowering/expressions/array-literals.d.ts +10 -0
  370. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  371. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  372. package/dist/frontend/lowering/expressions/binary.js +115 -5
  373. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  374. package/dist/frontend/lowering/expressions/element-access.js +151 -7
  375. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  376. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
  377. package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
  378. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  379. package/dist/frontend/lowering/expressions/identifiers.js +31 -2
  380. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  381. package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
  382. package/dist/frontend/lowering/expressions/narrowing.js +175 -22
  383. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  384. package/dist/frontend/lowering/expressions/object-literals.js +173 -11
  385. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  386. package/dist/frontend/lowering/expressions/optional-chains.js +5 -1
  387. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  388. package/dist/frontend/lowering/expressions/property-access.d.ts +8 -0
  389. package/dist/frontend/lowering/expressions/property-access.js +379 -109
  390. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  391. package/dist/frontend/lowering/expressions/relational.js +237 -7
  392. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  393. package/dist/frontend/lowering/expressions/typeof.js +8 -0
  394. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  395. package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
  396. package/dist/frontend/lowering/expressions/union-fields.js +103 -13
  397. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  398. package/dist/frontend/lowering/expressions/updates.js +74 -55
  399. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  400. package/dist/frontend/lowering/function-returns.js +37 -10
  401. package/dist/frontend/lowering/function-returns.js.map +1 -1
  402. package/dist/frontend/lowering/general-streams.js +5 -0
  403. package/dist/frontend/lowering/general-streams.js.map +1 -1
  404. package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
  405. package/dist/frontend/lowering/generator-delegation.js +301 -118
  406. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  407. package/dist/frontend/lowering/generic-functions.d.ts +27 -1
  408. package/dist/frontend/lowering/generic-functions.js +432 -18
  409. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  410. package/dist/frontend/lowering/global-function-values.d.ts +25 -0
  411. package/dist/frontend/lowering/global-function-values.js +193 -0
  412. package/dist/frontend/lowering/global-function-values.js.map +1 -0
  413. package/dist/frontend/lowering/global-values.d.ts +6 -4
  414. package/dist/frontend/lowering/global-values.js +24 -10
  415. package/dist/frontend/lowering/global-values.js.map +1 -1
  416. package/dist/frontend/lowering/host-global-values.d.ts +31 -0
  417. package/dist/frontend/lowering/host-global-values.js +121 -0
  418. package/dist/frontend/lowering/host-global-values.js.map +1 -0
  419. package/dist/frontend/lowering/host-globals.d.ts +74 -0
  420. package/dist/frontend/lowering/host-globals.js +344 -0
  421. package/dist/frontend/lowering/host-globals.js.map +1 -0
  422. package/dist/frontend/lowering/http2-constants.js +1 -1
  423. package/dist/frontend/lowering/iterator-adapters.js +46 -17
  424. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  425. package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
  426. package/dist/frontend/lowering/iterator-prototype.js +160 -0
  427. package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
  428. package/dist/frontend/lowering/key-order-witness.js +43 -22
  429. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  430. package/dist/frontend/lowering/key-order-witness.test.js +1 -0
  431. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  432. package/dist/frontend/lowering/lib-boundary.js +11 -3
  433. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  434. package/dist/frontend/lowering/lower-assert.js +30 -15
  435. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  436. package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
  437. package/dist/frontend/lowering/lower-async-iteration.js +15 -0
  438. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  439. package/dist/frontend/lowering/lower-builtin-values.js +11 -1
  440. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  441. package/dist/frontend/lowering/lower-calls.d.ts +25 -0
  442. package/dist/frontend/lowering/lower-calls.js +929 -227
  443. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  444. package/dist/frontend/lowering/lower-calls.test.js +59 -16
  445. package/dist/frontend/lowering/lower-calls.test.js.map +1 -1
  446. package/dist/frontend/lowering/lower-classes.d.ts +20 -0
  447. package/dist/frontend/lowering/lower-classes.js +468 -44
  448. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  449. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -2
  450. package/dist/frontend/lowering/lower-event-emitter.js +253 -83
  451. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  452. package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
  453. package/dist/frontend/lowering/lower-exprs.js +71 -20
  454. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  455. package/dist/frontend/lowering/lower-functions.js +25 -6
  456. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  457. package/dist/frontend/lowering/lower-generators.js +57 -10
  458. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  459. package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
  460. package/dist/frontend/lowering/lower-global-value.js +14 -5
  461. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  462. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  463. package/dist/frontend/lowering/lower-inspect.js +638 -64
  464. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  465. package/dist/frontend/lowering/lower-modules.js +48 -2
  466. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  467. package/dist/frontend/lowering/lower-namespaces.js +18 -0
  468. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  469. package/dist/frontend/lowering/lower-node-island.js +16 -6
  470. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  471. package/dist/frontend/lowering/lower-server.js +303 -87
  472. package/dist/frontend/lowering/lower-server.js.map +1 -1
  473. package/dist/frontend/lowering/lower-stdlib.js +45 -0
  474. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  475. package/dist/frontend/lowering/lower-stmts.d.ts +14 -11
  476. package/dist/frontend/lowering/lower-stmts.js +270 -52
  477. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  478. package/dist/frontend/lowering/lower-timers.js +110 -27
  479. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  480. package/dist/frontend/lowering/lower-url.js +6 -3
  481. package/dist/frontend/lowering/lower-url.js.map +1 -1
  482. package/dist/frontend/lowering/lowerer.d.ts +227 -21
  483. package/dist/frontend/lowering/lowerer.js +651 -92
  484. package/dist/frontend/lowering/lowerer.js.map +1 -1
  485. package/dist/frontend/lowering/lowerer.test.js +18 -0
  486. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  487. package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
  488. package/dist/frontend/lowering/lowering-facts.js +323 -0
  489. package/dist/frontend/lowering/lowering-facts.js.map +1 -0
  490. package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
  491. package/dist/frontend/lowering/lowering-facts.test.js +100 -0
  492. package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
  493. package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
  494. package/dist/frontend/lowering/nan-coded-reads.js +112 -9
  495. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  496. package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
  497. package/dist/frontend/lowering/optional-arguments.js +26 -2
  498. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  499. package/dist/frontend/lowering/partial-assertions.d.ts +0 -3
  500. package/dist/frontend/lowering/partial-assertions.js +9 -15
  501. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  502. package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
  503. package/dist/frontend/lowering/primitive-throws.js +241 -0
  504. package/dist/frontend/lowering/primitive-throws.js.map +1 -0
  505. package/dist/frontend/lowering/primitive-wrappers.js +1 -0
  506. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  507. package/dist/frontend/lowering/record-inherited.d.ts +17 -1
  508. package/dist/frontend/lowering/record-inherited.js +16 -2
  509. package/dist/frontend/lowering/record-inherited.js.map +1 -1
  510. package/dist/frontend/lowering/record-links.d.ts +73 -0
  511. package/dist/frontend/lowering/record-links.js +797 -0
  512. package/dist/frontend/lowering/record-links.js.map +1 -0
  513. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
  514. package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
  515. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  516. package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
  517. package/dist/frontend/lowering/runtime-optional-report.js +300 -0
  518. package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
  519. package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
  520. package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
  521. package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
  522. package/dist/frontend/lowering/static-typeof.d.ts +3 -1
  523. package/dist/frontend/lowering/static-typeof.js +6 -1
  524. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  525. package/dist/frontend/lowering/strict-mode.d.ts +1 -5
  526. package/dist/frontend/lowering/strict-mode.js +4 -30
  527. package/dist/frontend/lowering/strict-mode.js.map +1 -1
  528. package/dist/frontend/lowering/structural-instances.d.ts +7 -0
  529. package/dist/frontend/lowering/structural-instances.js +23 -0
  530. package/dist/frontend/lowering/structural-instances.js.map +1 -1
  531. package/dist/frontend/lowering/surfaces.d.ts +15 -1
  532. package/dist/frontend/lowering/surfaces.js +78 -10
  533. package/dist/frontend/lowering/surfaces.js.map +1 -1
  534. package/dist/frontend/lowering/union-retag.d.ts +13 -1
  535. package/dist/frontend/lowering/union-retag.js +55 -1
  536. package/dist/frontend/lowering/union-retag.js.map +1 -1
  537. package/dist/frontend/lowering/union-retag.test.js +51 -0
  538. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  539. package/dist/frontend/lowering/unit-journal.d.ts +8 -0
  540. package/dist/frontend/lowering/unit-journal.js +14 -0
  541. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  542. package/dist/frontend/lowering/unit-journal.test.js +36 -1
  543. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  544. package/dist/frontend/lowering/zlib-constants.js +3 -2
  545. package/dist/frontend/lowering/zlib-constants.js.map +1 -1
  546. package/dist/frontend/npm-static.js +78 -9
  547. package/dist/frontend/npm-static.js.map +1 -1
  548. package/dist/frontend/npm-static.test.js +95 -2
  549. package/dist/frontend/npm-static.test.js.map +1 -1
  550. package/dist/frontend/pipeline.d.ts +5 -4
  551. package/dist/frontend/pipeline.js +94 -31
  552. package/dist/frontend/pipeline.js.map +1 -1
  553. package/dist/frontend/pipeline.test.js +68 -11
  554. package/dist/frontend/pipeline.test.js.map +1 -1
  555. package/dist/frontend/program.d.ts +62 -2
  556. package/dist/frontend/program.js +695 -422
  557. package/dist/frontend/program.js.map +1 -1
  558. package/dist/frontend/program.test.js +37 -1
  559. package/dist/frontend/program.test.js.map +1 -1
  560. package/dist/frontend/services-node.d.ts +7 -0
  561. package/dist/frontend/services-node.js +32 -1
  562. package/dist/frontend/services-node.js.map +1 -1
  563. package/dist/frontend/services-node.test.js +51 -0
  564. package/dist/frontend/services-node.test.js.map +1 -1
  565. package/dist/frontend/shape-inference/overlay.js +68 -2
  566. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  567. package/dist/frontend/tier-analysis.d.ts +9 -0
  568. package/dist/frontend/tier-analysis.js +1 -0
  569. package/dist/frontend/tier-analysis.js.map +1 -1
  570. package/dist/frontend/tsc-codes.d.ts +57 -3
  571. package/dist/frontend/tsc-codes.js +935 -150
  572. package/dist/frontend/tsc-codes.js.map +1 -1
  573. package/dist/frontend/tsc-codes.test.js +221 -12
  574. package/dist/frontend/tsc-codes.test.js.map +1 -1
  575. package/dist/frontend/type-mapper.d.ts +91 -9
  576. package/dist/frontend/type-mapper.js +622 -181
  577. package/dist/frontend/type-mapper.js.map +1 -1
  578. package/dist/index.d.ts +1 -1
  579. package/dist/index.js +80 -15
  580. package/dist/index.js.map +1 -1
  581. package/dist/index.test.d.ts +1 -0
  582. package/dist/index.test.js +60 -0
  583. package/dist/index.test.js.map +1 -0
  584. package/dist/ir/builtin-effects.js +43 -0
  585. package/dist/ir/builtin-effects.js.map +1 -1
  586. package/dist/ir/builtin-signatures.d.ts +1 -1
  587. package/dist/ir/builtin-signatures.js +242 -16
  588. package/dist/ir/builtin-signatures.js.map +1 -1
  589. package/dist/ir/callback-specialization.d.ts +3 -2
  590. package/dist/ir/callback-specialization.js +35 -25
  591. package/dist/ir/callback-specialization.js.map +1 -1
  592. package/dist/ir/capture-values.d.ts +8 -4
  593. package/dist/ir/capture-values.js +9 -6
  594. package/dist/ir/capture-values.js.map +1 -1
  595. package/dist/ir/char-unit-locals.d.ts +6 -2
  596. package/dist/ir/char-unit-locals.js +11 -2
  597. package/dist/ir/char-unit-locals.js.map +1 -1
  598. package/dist/ir/class-key-index.d.ts +18 -0
  599. package/dist/ir/class-key-index.js +29 -0
  600. package/dist/ir/class-key-index.js.map +1 -0
  601. package/dist/ir/class-key-index.test.d.ts +1 -0
  602. package/dist/ir/class-key-index.test.js +25 -0
  603. package/dist/ir/class-key-index.test.js.map +1 -0
  604. package/dist/ir/codec.generated.d.ts +1 -1
  605. package/dist/ir/codec.generated.js +724 -648
  606. package/dist/ir/codec.generated.js.map +1 -1
  607. package/dist/ir/constant-globals.d.ts +5 -2
  608. package/dist/ir/constant-globals.js +25 -27
  609. package/dist/ir/constant-globals.js.map +1 -1
  610. package/dist/ir/expression-inlining.d.ts +4 -2
  611. package/dist/ir/expression-inlining.js +8 -2
  612. package/dist/ir/expression-inlining.js.map +1 -1
  613. package/dist/ir/field-values.d.ts +5 -2
  614. package/dist/ir/field-values.js +32 -21
  615. package/dist/ir/field-values.js.map +1 -1
  616. package/dist/ir/fields.generated.d.ts +11 -2
  617. package/dist/ir/fields.generated.js +8 -0
  618. package/dist/ir/fields.generated.js.map +1 -1
  619. package/dist/ir/final-fields.js +1 -1
  620. package/dist/ir/final-fields.js.map +1 -1
  621. package/dist/ir/function-references.d.ts +5 -4
  622. package/dist/ir/function-references.js +7 -4
  623. package/dist/ir/function-references.js.map +1 -1
  624. package/dist/ir/function-references.test.js +7 -0
  625. package/dist/ir/function-references.test.js.map +1 -1
  626. package/dist/ir/init-only-globals.d.ts +4 -2
  627. package/dist/ir/init-only-globals.js +17 -18
  628. package/dist/ir/init-only-globals.js.map +1 -1
  629. package/dist/ir/inline-array-views.js +1 -0
  630. package/dist/ir/inline-array-views.js.map +1 -1
  631. package/dist/ir/int32-slots.js +7 -0
  632. package/dist/ir/int32-slots.js.map +1 -1
  633. package/dist/ir/ir.d.ts +59 -4
  634. package/dist/ir/ir.js +7 -0
  635. package/dist/ir/ir.js.map +1 -1
  636. package/dist/ir/js-groups.d.ts +51 -0
  637. package/dist/ir/js-groups.js +394 -0
  638. package/dist/ir/js-groups.js.map +1 -0
  639. package/dist/ir/js-groups.test.d.ts +1 -0
  640. package/dist/ir/js-groups.test.js +555 -0
  641. package/dist/ir/js-groups.test.js.map +1 -0
  642. package/dist/ir/js-ic.js +30 -5
  643. package/dist/ir/js-ic.js.map +1 -1
  644. package/dist/ir/js-ic.test.js +27 -1
  645. package/dist/ir/js-ic.test.js.map +1 -1
  646. package/dist/ir/node-index.d.ts +23 -6
  647. package/dist/ir/node-index.js +126 -49
  648. package/dist/ir/node-index.js.map +1 -1
  649. package/dist/ir/numeric-call-specialization.d.ts +4 -2
  650. package/dist/ir/numeric-call-specialization.js +40 -26
  651. package/dist/ir/numeric-call-specialization.js.map +1 -1
  652. package/dist/ir/paired-while-loops.d.ts +4 -2
  653. package/dist/ir/paired-while-loops.js +8 -2
  654. package/dist/ir/paired-while-loops.js.map +1 -1
  655. package/dist/ir/parameter-versions.d.ts +13 -4
  656. package/dist/ir/parameter-versions.js +63 -42
  657. package/dist/ir/parameter-versions.js.map +1 -1
  658. package/dist/ir/property-bags.d.ts +4 -2
  659. package/dist/ir/property-bags.js +22 -17
  660. package/dist/ir/property-bags.js.map +1 -1
  661. package/dist/ir/row-pairs.d.ts +4 -2
  662. package/dist/ir/row-pairs.js +12 -11
  663. package/dist/ir/row-pairs.js.map +1 -1
  664. package/dist/ir/runtime-features.d.ts +87 -12
  665. package/dist/ir/runtime-features.js +263 -160
  666. package/dist/ir/runtime-features.js.map +1 -1
  667. package/dist/ir/runtime-features.test.js +109 -139
  668. package/dist/ir/runtime-features.test.js.map +1 -1
  669. package/dist/ir/runtime-jam-loops.d.ts +35 -0
  670. package/dist/ir/runtime-jam-loops.js +604 -0
  671. package/dist/ir/runtime-jam-loops.js.map +1 -0
  672. package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
  673. package/dist/ir/runtime-jam-loops.test.js +565 -0
  674. package/dist/ir/runtime-jam-loops.test.js.map +1 -0
  675. package/dist/ir/saturating-loop-jams.d.ts +4 -2
  676. package/dist/ir/saturating-loop-jams.js +11 -10
  677. package/dist/ir/saturating-loop-jams.js.map +1 -1
  678. package/dist/ir/scalar-records.d.ts +5 -2
  679. package/dist/ir/scalar-records.js +12 -2
  680. package/dist/ir/scalar-records.js.map +1 -1
  681. package/dist/ir/self-captures.d.ts +4 -2
  682. package/dist/ir/self-captures.js +32 -27
  683. package/dist/ir/self-captures.js.map +1 -1
  684. package/dist/ir/serialize.d.ts +6 -1
  685. package/dist/ir/serialize.js +87 -23
  686. package/dist/ir/serialize.js.map +1 -1
  687. package/dist/ir/serialize.test.js +26 -0
  688. package/dist/ir/serialize.test.js.map +1 -1
  689. package/dist/ir/tiers.js +1 -0
  690. package/dist/ir/tiers.js.map +1 -1
  691. package/dist/ir/traverse.js +4 -0
  692. package/dist/ir/traverse.js.map +1 -1
  693. package/dist/ir/typed-argument-clones.d.ts +30 -0
  694. package/dist/ir/typed-argument-clones.js +789 -0
  695. package/dist/ir/typed-argument-clones.js.map +1 -0
  696. package/dist/ir/union-arm-loops.d.ts +3 -0
  697. package/dist/ir/union-arm-loops.js +373 -0
  698. package/dist/ir/union-arm-loops.js.map +1 -0
  699. package/dist/ir/union-arm-loops.test.d.ts +1 -0
  700. package/dist/ir/union-arm-loops.test.js +230 -0
  701. package/dist/ir/union-arm-loops.test.js.map +1 -0
  702. package/dist/ir/validate.js +88 -18
  703. package/dist/ir/validate.js.map +1 -1
  704. package/dist/library/compiler-self-identity.d.ts +8 -2
  705. package/dist/library/compiler-self-identity.js +92 -18
  706. package/dist/library/compiler-self-identity.js.map +1 -1
  707. package/dist/library/compiler-self-identity.test.js +150 -3
  708. package/dist/library/compiler-self-identity.test.js.map +1 -1
  709. package/dist/library/int-infer.d.ts +5 -0
  710. package/dist/library/int-infer.js +15 -3
  711. package/dist/library/int-infer.js.map +1 -1
  712. package/dist/library/ir-policy.js +1 -0
  713. package/dist/library/ir-policy.js.map +1 -1
  714. package/dist/library/library-cache.d.ts +4 -0
  715. package/dist/library/library-cache.js +2 -0
  716. package/dist/library/library-cache.js.map +1 -1
  717. package/dist/library/library-cache.test.js +26 -0
  718. package/dist/library/library-cache.test.js.map +1 -1
  719. package/dist/library/prepare.js +99 -31
  720. package/dist/library/prepare.js.map +1 -1
  721. package/dist/native/cache.d.ts +7 -0
  722. package/dist/native/cache.js +47 -0
  723. package/dist/native/cache.js.map +1 -1
  724. package/dist/native/cache.test.js +13 -1
  725. package/dist/native/cache.test.js.map +1 -1
  726. package/dist/native/cli.js +1 -1
  727. package/dist/native/cli.js.map +1 -1
  728. package/dist/native/compiler.js +18 -3
  729. package/dist/native/compiler.js.map +1 -1
  730. package/dist/native/executable-cache-open.test.js +31 -5
  731. package/dist/native/executable-cache-open.test.js.map +1 -1
  732. package/dist/native/executable-cache.d.ts +6 -1
  733. package/dist/native/executable-cache.js +7 -1
  734. package/dist/native/executable-cache.js.map +1 -1
  735. package/dist/native/prepare.d.ts +3 -0
  736. package/dist/native/prepare.js +43 -26
  737. package/dist/native/prepare.js.map +1 -1
  738. package/dist/native/prepare.test.js +25 -3
  739. package/dist/native/prepare.test.js.map +1 -1
  740. package/dist/native/sanitizer.js +10 -1
  741. package/dist/native/sanitizer.js.map +1 -1
  742. package/dist/native/sanitizer.test.js +7 -2
  743. package/dist/native/sanitizer.test.js.map +1 -1
  744. package/dist/node-islands/boundary.d.ts +12 -0
  745. package/dist/node-islands/boundary.js +38 -6
  746. package/dist/node-islands/boundary.js.map +1 -1
  747. package/dist/node-islands/boundary.test.d.ts +1 -0
  748. package/dist/node-islands/boundary.test.js +76 -0
  749. package/dist/node-islands/boundary.test.js.map +1 -0
  750. package/dist/node-islands/detect.d.ts +9 -0
  751. package/dist/node-islands/detect.js +110 -0
  752. package/dist/node-islands/detect.js.map +1 -1
  753. package/dist/node-islands/detect.test.js +24 -0
  754. package/dist/node-islands/detect.test.js.map +1 -1
  755. package/dist/node-islands/graph-islands.d.ts +40 -0
  756. package/dist/node-islands/graph-islands.js +128 -0
  757. package/dist/node-islands/graph-islands.js.map +1 -0
  758. package/dist/node-islands/growth.d.ts +57 -0
  759. package/dist/node-islands/growth.js +205 -0
  760. package/dist/node-islands/growth.js.map +1 -0
  761. package/dist/node-islands/report.d.ts +12 -0
  762. package/dist/node-islands/report.js +28 -0
  763. package/dist/node-islands/report.js.map +1 -1
  764. package/dist/node-islands/report.test.js +2 -0
  765. package/dist/node-islands/report.test.js.map +1 -1
  766. package/dist/node-islands/rules.js +5 -0
  767. package/dist/node-islands/rules.js.map +1 -1
  768. package/dist/node-islands/scan.d.ts +11 -2
  769. package/dist/node-islands/scan.js +61 -9
  770. package/dist/node-islands/scan.js.map +1 -1
  771. package/dist/wasm/translate.js +11 -5
  772. package/dist/wasm/translate.js.map +1 -1
  773. package/dist/wasm/translate.test.js +35 -0
  774. package/dist/wasm/translate.test.js.map +1 -1
  775. package/package.json +20 -20
  776. package/surface-manifest.json +184 -117
@@ -1,11 +1,13 @@
1
1
  import { recordToEnvPairs } from "./environment.js";
2
- import { boolLit, numLit } from "../../../ir/build.js";
2
+ import { boolLit, numLit, strLit, varRef } from "../../../ir/build.js";
3
+ import { keyedHelperName } from "../stable-names.js";
4
+ import { InternalCompilerError } from "../../../errors.js";
3
5
  import { resolve } from "node:path";
4
6
  import * as ts from "../../ts7/adapter.js";
5
7
  import {} from "../lowerer.js";
6
8
  import { locOf } from "../../program.js";
7
9
  import { conditionalSpreadOf } from "../expressions/object-literals.js";
8
- import { BOOL, CHILD_T, DYN, F64, SPAWNRES_T, STRING, arrayOf, } from "../../../ir/ir.js";
10
+ import { BOOL, CHILD_T, DYN, F64, SPAWNRES_T, STRING, UNDEFINED_T, arrayOf, } from "../../../ir/ir.js";
9
11
  import { staticForkModulePath } from "../../fork-target.js";
10
12
  import { tsgoPath } from "../../dts-paths.js";
11
13
  import { optionMember, stripTypeCasts } from "./arguments.js";
@@ -23,6 +25,18 @@ export function lowerChildArgsArg(lowerer, node, loc) {
23
25
  }
24
26
  return lowerer.lowerExprExpecting(node, arrayOf(STRING));
25
27
  }
28
+ /** True when the args slot is statically empty (omitted, `undefined`, or an
29
+ * empty array literal): the shape the shell forms accept. Node joins the
30
+ * arguments unescaped and warns DEP0190 whenever a non-empty list meets
31
+ * `shell: true`, and a native build has no warning channel to match it. */
32
+ function staticallyEmptyArgs(node) {
33
+ if (!node)
34
+ return true;
35
+ const bare = stripTypeCasts(node);
36
+ if (ts.isIdentifier(bare) && bare.text === "undefined")
37
+ return true;
38
+ return ts.isArrayLiteralExpression(bare) && bare.elements.nodes.length === 0;
39
+ }
26
40
  /** The signal names Node's table (and the runtime's twin) resolves —
27
41
  * killSignal literals are validated HERE so an unknown name is a
28
42
  * compile-time fence instead of Node's runtime ERR_UNKNOWN_SIGNAL. */
@@ -71,10 +85,16 @@ const NODE_SIGNAL_NAMES = new Set([
71
85
  * literal, validated against Node's table), `stdio` (the "pipe"/
72
86
  * "ignore"/"inherit" string form or a 3-tuple of those — non-piped
73
87
  * outputs read "" where Node types them null, spawnSync's documented
74
- * stance), and `windowsHide` (a POSIX no-op, evaluated for side
75
- * effects). Everything else (shell, cwd, env, input, maxBuffer, ...)
76
- * fences by name. The bare `{ encoding: "utf8" }` shape keeps its
77
- * historical cp.spawnSync lowering. */
88
+ * stance), `env` (a REPLACEMENT environment), `cwd` (the child's
89
+ * directory), `input` (the string piped to its stdin, `| undefined`
90
+ * meaning absent), `shell` (a boolean literal: the complete command line
91
+ * runs through /bin/sh -c, with an empty args list only — Node warns
92
+ * DEP0190 for separate shell args), and
93
+ * `windowsHide` (a POSIX no-op, evaluated for side effects). Everything
94
+ * else (maxBuffer, ...) fences by name. A TYPED options value
95
+ * (SpawnSyncOptionsWithStringEncoding) reads its members at the call.
96
+ * The bare `{ encoding: "utf8" }` shape keeps its historical
97
+ * cp.spawnSync lowering. */
78
98
  export function lowerSpawnSyncCall(lowerer, expr, loc) {
79
99
  if (expr.arguments.nodes.length > 3 || expr.arguments.nodes.some(ts.isSpreadElement)) {
80
100
  lowerer.noLowering("spawnSync with this argument shape", expr, "the supported form is spawnSync(command, args?, options?)");
@@ -88,21 +108,67 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
88
108
  // no input and "ignore" both read nothing), 2 = inherit; stdout/
89
109
  // stderr 0 = capture, 1 = ignore, 2 = inherit.
90
110
  let inMode = 0, outMode = 0, errMode = 0;
111
+ // stdio[0] is a pipe only when the option never says otherwise: "ignore"
112
+ // and "inherit" both take the child's fd 0 away, and Node drops `input`
113
+ // there instead of piping it.
114
+ let stdinPiped = true;
91
115
  // A RUNTIME stdio string (the defaultRunner idiom: `options?.stdio ??
92
116
  // "pipe"`) — accepted when its TYPE proves every arm is a supported
93
117
  // literal; the runtime maps the value to the modes at the call.
94
118
  let stdioStr = null;
95
119
  // The `env` option's [k,v,...] pairs, which replace the child's environment.
96
120
  let envPairs = null;
121
+ // `cwd` and `input` (the SCR_CHILD_CP_OPTIONS build). Presence rides
122
+ // apart from the value: "" is an ABSENT cwd (the runtime's len-0 test
123
+ // — a real empty cwd is invalid anyway) and undefined input means no
124
+ // stdin pipe at all, where "" pipes one that ends immediately.
125
+ const emptyStr = { kind: "strLit", value: "", type: STRING, loc };
126
+ let cwd = emptyStr;
127
+ let input = emptyStr;
128
+ let hasInput = boolLit(false, loc);
129
+ // Node's shell form: the command line runs through /bin/sh -c.
130
+ let shell = boolLit(false, loc);
131
+ let extOptions = false; // cwd, input, or shell present: the extended entry point
97
132
  let plain = true; // no behavior-changing option: the historical libCall
133
+ // A union-typed `input` is read once into a hidden local that its
134
+ // presence test and its value share, so a getter or a call in the
135
+ // member runs exactly once, as the options object's evaluation does.
136
+ let inputRead = null;
137
+ // The options whose values reach the call, in source order: the
138
+ // extended entry point's prelude evaluates them in this order.
139
+ const optionOrder = [];
98
140
  if (optsNode) {
99
141
  if (!ts.isObjectLiteralExpression(optsNode)) {
100
- lowerer.noLowering("spawnSync with a non-literal options argument", optsNode, "pass the options inline so each member can be checked");
142
+ const runtime = lowerSpawnSyncRuntimeOptions(lowerer, optsNode, expr.arguments.nodes[1], loc);
143
+ if (runtime) {
144
+ return {
145
+ kind: "libCall",
146
+ fn: "cp.spawnSyncExt",
147
+ args: [
148
+ cmd,
149
+ argv,
150
+ runtime.timeout,
151
+ killSignal,
152
+ runtime.inMode,
153
+ runtime.outMode,
154
+ runtime.errMode,
155
+ runtime.cwd,
156
+ runtime.input,
157
+ runtime.hasInput,
158
+ runtime.shell,
159
+ ],
160
+ type: SPAWNRES_T,
161
+ loc,
162
+ };
163
+ }
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)");
101
165
  }
102
166
  const applyStdio = (node) => {
103
167
  const modeOf = (v, fd) => {
104
168
  if (v === "pipe")
105
169
  return; // the default modes
170
+ if (fd === 0)
171
+ stdinPiped = false;
106
172
  if (v === "ignore") {
107
173
  if (fd === 1)
108
174
  outMode = 1;
@@ -164,6 +230,7 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
164
230
  }
165
231
  case "timeout":
166
232
  timeout = lowerer.lowerExprExpecting(m.value, F64);
233
+ optionOrder.push("timeout");
167
234
  plain = false;
168
235
  break;
169
236
  case "killSignal": {
@@ -185,10 +252,97 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
185
252
  case "env":
186
253
  // A REPLACEMENT environment, as for spawn and execFileSync.
187
254
  envPairs = recordToEnvPairs(lowerer, m.value);
255
+ optionOrder.push("env");
256
+ plain = false;
257
+ break;
258
+ case "cwd":
259
+ cwd = lowerer.lowerExprExpecting(m.value, STRING);
260
+ optionOrder.push("cwd");
261
+ extOptions = true;
262
+ plain = false;
263
+ break;
264
+ case "shell":
265
+ if (m.value.kind === ts.SyntaxKind.TrueKeyword) {
266
+ // Node joins [command, ...args] with single spaces and warns
267
+ // DEP0190 for a non-empty list; a native build has no warning
268
+ // channel, so it refuses the form instead of dropping the
269
+ // warning Node prints.
270
+ if (!staticallyEmptyArgs(expr.arguments.nodes[1])) {
271
+ lowerer.noLowering("spawnSync with shell enabled and separate arguments", expr.arguments.nodes[1], "put the complete shell command in the first argument and pass [] (Node warns DEP0190 for unescaped shell arguments, and a native build cannot report that warning)");
272
+ }
273
+ shell = boolLit(true, loc);
274
+ extOptions = true;
275
+ plain = false;
276
+ }
277
+ else if (m.value.kind === ts.SyntaxKind.FalseKeyword) {
278
+ shell = boolLit(false, loc); // Node's default
279
+ }
280
+ else {
281
+ lowerer.noLowering("spawnSync with a non-literal shell option", m.value, "shell must be a boolean literal");
282
+ }
283
+ break;
284
+ case "input": {
285
+ // string | undefined, Node's exact member semantics (see
286
+ // execFileSync): the undefined arm is an ABSENT option. The
287
+ // presence test and the value share ONE read (the hidden local
288
+ // below), so any expression qualifies and a getter or call in it
289
+ // runs exactly once, as the options object's evaluation does.
290
+ if (lowerer.typeOf(m.value).flags & ts.TypeFlags.Undefined)
291
+ break;
292
+ const it = lowerer.mapTypeOf(lowerer.typeOf(m.value));
293
+ const uTag = it?.kind === "union" ? lowerer.armTag(it.unionId, UNDEFINED_T) : -1;
294
+ const sTag = it?.kind === "union" ? lowerer.armTag(it.unionId, STRING) : -1;
295
+ if (it?.kind === "union" && uTag >= 0 && sTag >= 0) {
296
+ const readValue = lowerer.lowerExpr(m.value);
297
+ const slot = lowerer.declareHiddenLocal("%spawnSyncInput", readValue.type);
298
+ inputRead = { id: slot.id, init: readValue };
299
+ const read = varRef(slot.id, readValue.type, loc);
300
+ hasInput = {
301
+ kind: "unionIsTag",
302
+ unionId: it.unionId,
303
+ tag: uTag,
304
+ negated: true,
305
+ value: read,
306
+ type: BOOL,
307
+ loc,
308
+ };
309
+ input = {
310
+ kind: "ternary",
311
+ cond: {
312
+ kind: "unionIsTag",
313
+ unionId: it.unionId,
314
+ tag: uTag,
315
+ negated: false,
316
+ value: read,
317
+ type: BOOL,
318
+ loc,
319
+ },
320
+ then: emptyStr,
321
+ else_: {
322
+ kind: "unionNarrow",
323
+ unionId: it.unionId,
324
+ tag: sTag,
325
+ value: read,
326
+ type: STRING,
327
+ loc,
328
+ },
329
+ type: STRING,
330
+ loc,
331
+ };
332
+ optionOrder.push("input");
333
+ extOptions = true;
334
+ plain = false;
335
+ break;
336
+ }
337
+ input = lowerer.lowerExprExpecting(m.value, STRING);
338
+ optionOrder.push("input");
339
+ hasInput = boolLit(true, loc);
340
+ extOptions = true;
188
341
  plain = false;
189
342
  break;
343
+ }
190
344
  default:
191
- lowerer.noLowering(`spawnSync option '${m.name}'`, p, "encoding, timeout, killSignal, stdio, env, and windowsHide are the supported options");
345
+ lowerer.noLowering(`spawnSync option '${m.name}'`, p, "encoding, timeout, killSignal, stdio, env, cwd, input, shell, and windowsHide are the supported options");
192
346
  }
193
347
  }
194
348
  }
@@ -199,6 +353,9 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
199
353
  lowerer.noLowering("spawnSync with a runtime stdio value and env", optsNode, 'pass stdio as a "pipe"/"ignore"/"inherit" literal when env is set');
200
354
  }
201
355
  if (stdioStr !== null) {
356
+ if (extOptions) {
357
+ lowerer.noLowering("spawnSync with a runtime stdio value and cwd, input, or shell", optsNode, 'pass stdio as a "pipe"/"ignore"/"inherit" literal when cwd, input, or shell is set');
358
+ }
202
359
  return {
203
360
  kind: "libCall",
204
361
  fn: "cp.spawnSyncStdioStr",
@@ -207,6 +364,70 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
207
364
  loc,
208
365
  };
209
366
  }
367
+ if (extOptions) {
368
+ // Node ignores `input` when stdio[0] takes the child's fd 0 away
369
+ // ("ignore" is /dev/null, "inherit" the parent's): the option is dead
370
+ // there, not a pipe. Its expression still runs — Node evaluates the
371
+ // member before the call — so it stays an argument, and `has_input`
372
+ // false keeps it out of the child's stdin.
373
+ const ignoreInput = !stdinPiped;
374
+ // The call's prelude evaluates the command, the arguments and the
375
+ // options in source order, each into a hidden local the call reads, so
376
+ // an earlier option that changes a later one's value (a getter, a call)
377
+ // is seen as in Node. A union `input` lands in the hidden local its tag
378
+ // test and its value share. Literals need no local.
379
+ const prelude = [];
380
+ const bind = (name, value) => {
381
+ if (value.kind === "strLit" || value.kind === "numLit" || value.kind === "boolLit")
382
+ return value;
383
+ const local = lowerer.declareHiddenLocal(name, value.type);
384
+ prelude.push({ kind: "varDecl", localId: local.id, init: value, loc });
385
+ return varRef(local.id, value.type, loc);
386
+ };
387
+ const cmdArg = bind("%spawnSyncCmd", cmd);
388
+ const argvArg = bind("%spawnSyncArgs", argv);
389
+ let timeoutArg = timeout;
390
+ let cwdArg = cwd;
391
+ let inputArg = input;
392
+ let envArg = envPairs;
393
+ for (const option of optionOrder) {
394
+ if (option === "timeout")
395
+ timeoutArg = bind("%spawnSyncTimeout", timeout);
396
+ else if (option === "cwd")
397
+ cwdArg = bind("%spawnSyncCwd", cwd);
398
+ else if (option === "env" && envPairs !== null)
399
+ envArg = bind("%spawnSyncEnv", envPairs);
400
+ else if (option === "input") {
401
+ if (inputRead !== null)
402
+ prelude.push({ kind: "varDecl", localId: inputRead.id, init: inputRead.init, loc });
403
+ else
404
+ inputArg = bind("%spawnSyncInput", input);
405
+ }
406
+ }
407
+ const call = {
408
+ kind: "libCall",
409
+ fn: envPairs !== null ? "cp.spawnSyncExtEnv" : "cp.spawnSyncExt",
410
+ args: [
411
+ cmdArg,
412
+ argvArg,
413
+ timeoutArg,
414
+ killSignal,
415
+ numLit(inMode, loc),
416
+ numLit(outMode, loc),
417
+ numLit(errMode, loc),
418
+ cwdArg,
419
+ inputArg,
420
+ ignoreInput ? boolLit(false, loc) : hasInput,
421
+ shell,
422
+ ...(envArg !== null ? [envArg] : []),
423
+ ],
424
+ type: SPAWNRES_T,
425
+ loc,
426
+ };
427
+ return prelude.length === 0
428
+ ? call
429
+ : { kind: "seqExpr", stmts: prelude, result: call, type: SPAWNRES_T, loc };
430
+ }
210
431
  return {
211
432
  kind: "libCall",
212
433
  fn: envPairs !== null ? "cp.spawnSyncEnv" : "cp.spawnSyncOpts",
@@ -224,6 +445,277 @@ export function lowerSpawnSyncCall(lowerer, expr, loc) {
224
445
  loc,
225
446
  };
226
447
  }
448
+ /** The RUNTIME half of the spawnSync options story: a non-literal
449
+ * options argument whose type mapped to the interned spawnSync options
450
+ * record (SpawnSyncOptionsWithStringEncoding). cwd/input/timeout/shell
451
+ * read their fields with the literal path's defaults on the undefined
452
+ * arm; the stdio modes compute through an interned helper over the
453
+ * record, and a runtime mode outside "pipe"/"ignore"/"inherit" throws
454
+ * the catchable TypeError the literal path fences at compile time. The
455
+ * options expression re-reads per member, so only side-effect-free reads
456
+ * qualify (the exec-options reader's discipline). Null when the shape
457
+ * isn't the spawnSync options record (the caller keeps its fence). */
458
+ function lowerSpawnSyncRuntimeOptions(lowerer, optsNode, argsNode, loc) {
459
+ const opts = lowerer.lowerExpr(optsNode);
460
+ if (opts.type.kind !== "record")
461
+ return null;
462
+ const shapeId = opts.type.shapeId;
463
+ const shape = lowerer.shapes.get(shapeId);
464
+ const names = shape?.fields.map((f) => f.name).join(",");
465
+ if (names !== "cwd,encoding,input,shell,stdio,timeout,windowsHide")
466
+ return null;
467
+ if (opts.kind !== "varRef" && opts.kind !== "recordGet" && opts.kind !== "fieldGet") {
468
+ lowerer.noLowering("spawnSync with a computed options argument", optsNode, "the member reads re-read the options — bind the object to a const first");
469
+ }
470
+ // The record carries `shell`, so the call MAY enable the shell at run
471
+ // time. Node joins a non-empty args list unescaped and warns DEP0190
472
+ // there; only an empty list provably never triggers that warning, so the
473
+ // value form accepts the command-line idiom and refuses separate args.
474
+ if (!staticallyEmptyArgs(argsNode)) {
475
+ lowerer.noLowering("spawnSync with a typed options value and separate arguments", argsNode, "the options record may enable shell, where Node warns DEP0190 for unescaped arguments — put the complete command in the first argument and pass no args");
476
+ }
477
+ const fieldType = (name) => shape.fields.find((f) => f.name === name).type;
478
+ // field ?? default — the undefined arm takes the literal path's default.
479
+ const readOpt = (name, dflt, armT) => {
480
+ const ft = fieldType(name);
481
+ if (ft.kind !== "union")
482
+ return { kind: "recordGet", obj: opts, shapeId, field: name, type: ft, loc };
483
+ const uTag = lowerer.armTag(ft.unionId, UNDEFINED_T);
484
+ const vTag = lowerer.armTag(ft.unionId, armT);
485
+ const read = { kind: "recordGet", obj: opts, shapeId, field: name, type: ft, loc };
486
+ return {
487
+ kind: "ternary",
488
+ cond: {
489
+ kind: "unionIsTag",
490
+ unionId: ft.unionId,
491
+ tag: uTag,
492
+ negated: false,
493
+ value: read,
494
+ type: BOOL,
495
+ loc,
496
+ },
497
+ then: dflt,
498
+ else_: { kind: "unionNarrow", unionId: ft.unionId, tag: vTag, value: read, type: armT, loc },
499
+ type: armT,
500
+ loc,
501
+ };
502
+ };
503
+ const emptyStr = strLit("", loc);
504
+ const modeCall = (fd) => ({
505
+ kind: "call",
506
+ callee: spawnSyncStdioModeHelper(lowerer, shapeId, fieldType("stdio"), fd, loc),
507
+ args: [opts],
508
+ type: F64,
509
+ loc,
510
+ });
511
+ const inMode = modeCall(0);
512
+ // input's PRESENCE rides separately (undefined = the option is absent —
513
+ // no stdin pipe; "" pipes empty stdin), and Node IGNORES it when
514
+ // stdio[0] takes the child's fd 0 away ("ignore"/"inherit"): the option
515
+ // is dead there, not a pipe. Mode 0 is the only stdin mode that honors
516
+ // it.
517
+ const inputT = fieldType("input");
518
+ const hasInputField = inputT.kind === "union"
519
+ ? {
520
+ kind: "unionIsTag",
521
+ unionId: inputT.unionId,
522
+ tag: lowerer.armTag(inputT.unionId, UNDEFINED_T),
523
+ negated: true,
524
+ value: { kind: "recordGet", obj: opts, shapeId, field: "input", type: inputT, loc },
525
+ type: BOOL,
526
+ loc,
527
+ }
528
+ : boolLit(true, loc);
529
+ return {
530
+ cwd: readOpt("cwd", emptyStr, STRING),
531
+ input: readOpt("input", emptyStr, STRING),
532
+ hasInput: {
533
+ kind: "logical",
534
+ op: "&&",
535
+ left: hasInputField,
536
+ right: {
537
+ kind: "bin",
538
+ op: "===",
539
+ left: inMode,
540
+ right: numLit(0, loc),
541
+ type: BOOL,
542
+ loc,
543
+ },
544
+ type: BOOL,
545
+ loc,
546
+ },
547
+ timeout: readOpt("timeout", numLit(0, loc), F64),
548
+ shell: readOpt("shell", boolLit(false, loc), BOOL),
549
+ inMode,
550
+ outMode: modeCall(1),
551
+ errMode: modeCall(2),
552
+ };
553
+ }
554
+ /** Interned `%cp.spawnSyncStdioMode.<fd>` — the runtime stdio-mode
555
+ * computation over the spawnSync options record: undefined stdio keeps
556
+ * the default (every fd piped/captured), a single "pipe"/"ignore"/
557
+ * "inherit" string applies to all three fds, an array reads its fd's
558
+ * entry ("pipe" when the array is short — Node's default per fd). Any
559
+ * other runtime string throws the catchable TypeError the literal path
560
+ * fences at compile time. Mode 0 = pipe (capture for fds 1/2, /dev/null
561
+ * that still honors `input` for fd 0), 1 = ignore, 2 = inherit. */
562
+ function spawnSyncStdioModeHelper(lowerer, shapeId, stdioT, fd, loc) {
563
+ const key = `cp.spawnsyncstdiomode:${shapeId}:${fd}`;
564
+ const existing = lowerer.arrHofHelpers.get(key);
565
+ if (existing)
566
+ return existing;
567
+ const name = keyedHelperName(lowerer, `%cp.spawnSyncStdioMode.${fd}`, key);
568
+ lowerer.arrHofHelpers.set(key, name);
569
+ const optsT = { kind: "record", shapeId };
570
+ const strEq = (l, r) => ({
571
+ kind: "strEq",
572
+ negated: false,
573
+ left: l,
574
+ right: strLit(r, loc),
575
+ type: BOOL,
576
+ loc,
577
+ });
578
+ const throwType = (msg) => ({
579
+ kind: "throw",
580
+ value: {
581
+ kind: "libCall",
582
+ fn: "error.new",
583
+ args: [msg],
584
+ type: { kind: "object", className: "%TypeError" },
585
+ loc,
586
+ },
587
+ loc,
588
+ });
589
+ const concat = (l, r) => ({
590
+ kind: "strConcat",
591
+ left: l,
592
+ right: r,
593
+ type: STRING,
594
+ loc,
595
+ });
596
+ const o = varRef("o.0", optsT, loc);
597
+ const locals = [
598
+ { id: "o.0", name: "o", type: optsT, mutable: false },
599
+ { id: "s.0", name: "s", type: STRING, mutable: false },
600
+ { id: "a.0", name: "a", type: arrayOf(STRING), mutable: false },
601
+ ];
602
+ const modeStmts = (s) => [
603
+ {
604
+ kind: "if",
605
+ cond: strEq(s, "pipe"),
606
+ then: [{ kind: "return", value: numLit(0, loc), loc }],
607
+ else_: null,
608
+ loc,
609
+ },
610
+ {
611
+ kind: "if",
612
+ cond: strEq(s, "ignore"),
613
+ then: [{ kind: "return", value: numLit(1, loc), loc }],
614
+ else_: null,
615
+ loc,
616
+ },
617
+ {
618
+ kind: "if",
619
+ cond: strEq(s, "inherit"),
620
+ then: [{ kind: "return", value: numLit(2, loc), loc }],
621
+ else_: null,
622
+ loc,
623
+ },
624
+ throwType(concat(concat(strLit('spawnSync stdio "', loc), s), strLit('" has no static lowering ("pipe", "ignore", and "inherit" are the supported modes)', loc))),
625
+ ];
626
+ if (stdioT.kind !== "union")
627
+ throw new InternalCompilerError("emitter bug: spawnSync stdio is not a union");
628
+ const uTag = lowerer.armTag(stdioT.unionId, UNDEFINED_T);
629
+ const sTag = lowerer.armTag(stdioT.unionId, STRING);
630
+ const aTag = lowerer.armTag(stdioT.unionId, arrayOf(STRING));
631
+ const sd = { kind: "recordGet", obj: o, shapeId, field: "stdio", type: stdioT, loc };
632
+ const body = [
633
+ {
634
+ kind: "if",
635
+ cond: {
636
+ kind: "unionIsTag",
637
+ unionId: stdioT.unionId,
638
+ tag: uTag,
639
+ negated: false,
640
+ value: sd,
641
+ type: BOOL,
642
+ loc,
643
+ },
644
+ then: [{ kind: "return", value: numLit(0, loc), loc }],
645
+ else_: null,
646
+ loc,
647
+ },
648
+ {
649
+ kind: "if",
650
+ cond: {
651
+ kind: "unionIsTag",
652
+ unionId: stdioT.unionId,
653
+ tag: sTag,
654
+ negated: false,
655
+ value: sd,
656
+ type: BOOL,
657
+ loc,
658
+ },
659
+ then: [
660
+ {
661
+ kind: "varDecl",
662
+ localId: "s.0",
663
+ init: {
664
+ kind: "unionNarrow",
665
+ unionId: stdioT.unionId,
666
+ tag: sTag,
667
+ value: sd,
668
+ type: STRING,
669
+ loc,
670
+ },
671
+ loc,
672
+ },
673
+ ...modeStmts(varRef("s.0", STRING, loc)),
674
+ ],
675
+ else_: null,
676
+ loc,
677
+ },
678
+ {
679
+ kind: "varDecl",
680
+ localId: "a.0",
681
+ init: {
682
+ kind: "unionNarrow",
683
+ unionId: stdioT.unionId,
684
+ tag: aTag,
685
+ value: sd,
686
+ type: arrayOf(STRING),
687
+ loc,
688
+ },
689
+ loc,
690
+ },
691
+ ];
692
+ const aRef = varRef("a.0", arrayOf(STRING), loc);
693
+ const lenGt = {
694
+ kind: "bin",
695
+ op: "<",
696
+ left: numLit(fd, loc),
697
+ right: { kind: "arrIntrinsic", method: "length", receiver: aRef, args: [], type: F64, loc },
698
+ type: BOOL,
699
+ loc,
700
+ };
701
+ body.push({
702
+ kind: "if",
703
+ cond: { kind: "unary", op: "!", operand: lenGt, type: BOOL, loc },
704
+ then: [{ kind: "return", value: numLit(0, loc), loc }],
705
+ else_: null,
706
+ loc,
707
+ });
708
+ body.push(...modeStmts({ kind: "arrayGet", arr: aRef, index: numLit(fd, loc), type: STRING, loc }));
709
+ lowerer.liftedFns.push({
710
+ name,
711
+ params: [{ localId: "o.0", name: "o", type: optsT }],
712
+ returnType: F64,
713
+ locals,
714
+ body,
715
+ loc,
716
+ });
717
+ return name;
718
+ }
227
719
  /** `spawn(command, args?, options)` → one cp.spawn / cp.spawnOpts
228
720
  * libCall. Computed options use native runtime normalization. Inline
229
721
  * stdio accepts "ignore", "inherit", or "pipe" as the scalar,
@@ -436,11 +928,13 @@ export function lowerSpawnCall(lowerer, expr, loc) {
436
928
  inMode = outMode = errMode = 3;
437
929
  plain = false;
438
930
  }
439
- if (shellEnabled && argsNode !== undefined) {
440
- const shellArgs = stripTypeCasts(argsNode);
441
- if (!ts.isArrayLiteralExpression(shellArgs) || shellArgs.elements.nodes.length !== 0) {
442
- lowerer.noLowering("spawn with shell enabled and separate arguments", argsNode, "put the complete shell command in the first argument and pass [] (Node deprecates unescaped shell argument concatenation)");
443
- }
931
+ // Node joins [command, ...args] with single spaces for the shell form, and
932
+ // reports DEP0190 ("passing args to a child process with shell option
933
+ // true ... the arguments are not escaped, only concatenated") on stderr.
934
+ // A native build has no warning channel, so it refuses the form rather
935
+ // than silently skipping the warning Node prints.
936
+ if (shellEnabled && !staticallyEmptyArgs(argsNode)) {
937
+ lowerer.noLowering("spawn with shell enabled and separate arguments", argsNode ?? expr, "put the complete shell command in the first argument and pass [] (Node warns DEP0190 for unescaped shell arguments, and a native build cannot report that warning)");
444
938
  }
445
939
  const argv = lowerChildArgsArg(lowerer, argsNode, loc);
446
940
  if (plain) {
@@ -621,18 +1115,14 @@ export function lowerExecFileCall(lowerer, expr, loc, shell = false) {
621
1115
  }
622
1116
  const first = lowerer.lowerExprExpecting(expr.arguments.nodes[0], STRING);
623
1117
  const callbackNode = expr.arguments.nodes[expr.arguments.nodes.length - 1];
624
- // exec: /bin/sh -c <command>, execSync's lowering (the runtime reads the
625
- // command line back from argv[1] for failure messages); execFile: the
626
- // file and its args list.
627
- const cmd = shell ? { kind: "strLit", value: "/bin/sh", type: STRING, loc } : first;
628
- const argv = shell
629
- ? {
630
- kind: "arrayLit",
631
- elems: [{ kind: "strLit", value: "-c", type: STRING, loc }, first],
632
- type: arrayOf(STRING),
633
- loc,
634
- }
635
- : lowerChildArgsArg(lowerer, expr.arguments.nodes.length >= 3 ? expr.arguments.nodes[1] : undefined, loc);
1118
+ // exec already IS the shell form: /bin/sh -c <command>, execSync's
1119
+ // lowering (the runtime reads the command line back from argv[1] for
1120
+ // failure messages). execFile's `shell: true` below turns it into the
1121
+ // same shape, so the launch values are final only after the options.
1122
+ let execShell = false;
1123
+ // `cwd` (the SCR_CHILD_CP_OPTIONS build): the child's directory, the
1124
+ // one launch member the callback slice lacked.
1125
+ let cwd = null;
636
1126
  const optionsNode = expr.arguments.nodes.length === (shell ? 3 : 4)
637
1127
  ? expr.arguments.nodes[shell ? 1 : 2]
638
1128
  : undefined;
@@ -667,11 +1157,45 @@ export function lowerExecFileCall(lowerer, expr, loc, shell = false) {
667
1157
  lowerer.noLowering(`${what} with a non-literal maxBuffer`, member.value, "pass a numeric literal or literal arithmetic (the native capture grows without enforcing this limit)");
668
1158
  }
669
1159
  }
1160
+ else if (member.name === "cwd") {
1161
+ cwd = lowerer.lowerExprExpecting(member.value, STRING);
1162
+ }
1163
+ else if (member.name === "shell" && !shell) {
1164
+ // Node's shell form: [file, ...args].join(" ") through /bin/sh -c.
1165
+ // exec itself already IS the shell form, so its member stays out.
1166
+ if (member.value.kind === ts.SyntaxKind.TrueKeyword)
1167
+ execShell = true;
1168
+ else if (member.value.kind !== ts.SyntaxKind.FalseKeyword) {
1169
+ lowerer.noLowering(`${what} with a non-literal shell option`, member.value, "shell must be a boolean literal");
1170
+ }
1171
+ }
670
1172
  else {
671
- lowerer.noLowering(`${what} option '${member.name}'`, property, "only encoding: 'utf8' and a pure numeric maxBuffer are supported in the callback form");
1173
+ lowerer.noLowering(`${what} option '${member.name}'`, property, "encoding: 'utf8', a pure numeric maxBuffer, cwd, and shell: true are the supported options in the callback form");
672
1174
  }
673
1175
  }
674
1176
  }
1177
+ // The launch values, final now that `shell: true` is known.
1178
+ const shellForm = shell || execShell;
1179
+ const cmd = shellForm ? { kind: "strLit", value: "/bin/sh", type: STRING, loc } : first;
1180
+ // Node joins [file, ...args] with single spaces for the shell form and
1181
+ // reports DEP0190 on stderr; a native build has no warning channel, so it
1182
+ // refuses separate arguments here rather than silently skipping it.
1183
+ if (execShell &&
1184
+ !staticallyEmptyArgs(expr.arguments.nodes.length >= 3 ? expr.arguments.nodes[1] : undefined)) {
1185
+ lowerer.noLowering(`${what} with shell enabled and separate arguments`, expr.arguments.nodes[1], "put the complete shell command in the first argument and pass [] (Node warns DEP0190 for unescaped shell arguments, and a native build cannot report that warning)");
1186
+ }
1187
+ let argv;
1188
+ if (shellForm) {
1189
+ argv = {
1190
+ kind: "arrayLit",
1191
+ elems: [{ kind: "strLit", value: "-c", type: STRING, loc }, first],
1192
+ type: arrayOf(STRING),
1193
+ loc,
1194
+ };
1195
+ }
1196
+ else {
1197
+ argv = lowerChildArgsArg(lowerer, expr.arguments.nodes.length >= 3 ? expr.arguments.nodes[1] : undefined, loc);
1198
+ }
675
1199
  const callback = lowerer.lowerExpr(callbackNode);
676
1200
  if (callback.type.kind !== "func" ||
677
1201
  callback.type.rest === true ||
@@ -697,10 +1221,19 @@ export function lowerExecFileCall(lowerer, expr, loc, shell = false) {
697
1221
  lowerer.unsupported("SC1090", callbackNode, `${what} callbacks whose ${i === 1 ? "stdout" : "stderr"} parameter is not 'string'`);
698
1222
  }
699
1223
  }
1224
+ if (cwd !== null) {
1225
+ return {
1226
+ kind: "libCall",
1227
+ fn: "cp.execFileCwd",
1228
+ args: [cmd, argv, callback, boolLit(shellForm, loc), cwd],
1229
+ type: CHILD_T,
1230
+ loc,
1231
+ };
1232
+ }
700
1233
  return {
701
1234
  kind: "libCall",
702
1235
  fn: "cp.execFile",
703
- args: [cmd, argv, callback, boolLit(shell, loc)],
1236
+ args: [cmd, argv, callback, boolLit(shellForm, loc)],
704
1237
  type: CHILD_T,
705
1238
  loc,
706
1239
  };