@scriptc/compiler 0.3.2 → 0.3.3

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 (364) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +490 -39
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/llvm/alloc.js +24 -10
  5. package/dist/backend/llvm/alloc.js.map +1 -1
  6. package/dist/backend/llvm/alloc.test.js +47 -1
  7. package/dist/backend/llvm/alloc.test.js.map +1 -1
  8. package/dist/backend/llvm/array-search.d.ts +8 -0
  9. package/dist/backend/llvm/array-search.js +52 -0
  10. package/dist/backend/llvm/array-search.js.map +1 -0
  11. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  12. package/dist/backend/llvm/array-search.test.js +72 -0
  13. package/dist/backend/llvm/array-search.test.js.map +1 -0
  14. package/dist/backend/llvm/call-lifetimes.d.ts +8 -1
  15. package/dist/backend/llvm/call-lifetimes.js +33 -11
  16. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  17. package/dist/backend/llvm/call-lifetimes.test.js +54 -0
  18. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  19. package/dist/backend/llvm/classes.js +87 -36
  20. package/dist/backend/llvm/classes.js.map +1 -1
  21. package/dist/backend/llvm/common.d.ts +1 -1
  22. package/dist/backend/llvm/common.js +1 -1
  23. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  24. package/dist/backend/llvm/dense-array-access.js +1 -1
  25. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  26. package/dist/backend/llvm/dyn.d.ts +4 -0
  27. package/dist/backend/llvm/dyn.js +73 -9
  28. package/dist/backend/llvm/dyn.js.map +1 -1
  29. package/dist/backend/llvm/emitter.d.ts +65 -14
  30. package/dist/backend/llvm/emitter.js +297 -81
  31. package/dist/backend/llvm/emitter.js.map +1 -1
  32. package/dist/backend/llvm/emitter.test.js +26 -3
  33. package/dist/backend/llvm/emitter.test.js.map +1 -1
  34. package/dist/backend/llvm/expr-async.js +52 -1
  35. package/dist/backend/llvm/expr-async.js.map +1 -1
  36. package/dist/backend/llvm/expr-bytes.js +11 -0
  37. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  38. package/dist/backend/llvm/expr-callbacks.js +16 -2
  39. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  40. package/dist/backend/llvm/expr-calls.js +8 -1
  41. package/dist/backend/llvm/expr-calls.js.map +1 -1
  42. package/dist/backend/llvm/expr-containers.js +42 -15
  43. package/dist/backend/llvm/expr-containers.js.map +1 -1
  44. package/dist/backend/llvm/expr-dynamic.js +19 -8
  45. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +28 -30
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-records.js +8 -4
  49. package/dist/backend/llvm/expr-records.js.map +1 -1
  50. package/dist/backend/llvm/expr-stream-bridges.js +35 -32
  51. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  52. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  53. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  54. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  56. package/dist/backend/llvm/inline-unions.js +134 -0
  57. package/dist/backend/llvm/inline-unions.js.map +1 -0
  58. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  59. package/dist/backend/llvm/inline-unions.test.js +124 -0
  60. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  61. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  62. package/dist/backend/llvm/integer-remainder.js +80 -9
  63. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  64. package/dist/backend/llvm/lib-dispatch.js +163 -28
  65. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  66. package/dist/backend/llvm/lib-filesystem.js +125 -7
  67. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  68. package/dist/backend/llvm/lib-network.js +9 -6
  69. package/dist/backend/llvm/lib-network.js.map +1 -1
  70. package/dist/backend/llvm/lib-process.js +2 -2
  71. package/dist/backend/llvm/lib-process.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +132 -0
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/lib-stream.js +97 -0
  75. package/dist/backend/llvm/lib-stream.js.map +1 -1
  76. package/dist/backend/llvm/local-array-reads.js +7 -3
  77. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  78. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  79. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  80. package/dist/backend/llvm/local-union-storage.d.ts +2 -0
  81. package/dist/backend/llvm/local-union-storage.js +5 -0
  82. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  83. package/dist/backend/llvm/local-union-storage.test.js +1 -0
  84. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  85. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  86. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  87. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  88. package/dist/backend/llvm/map-number-lookup.d.ts +20 -0
  89. package/dist/backend/llvm/map-number-lookup.js +66 -0
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  92. package/dist/backend/llvm/map-number-lookup.test.js +102 -0
  93. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  94. package/dist/backend/llvm/map-read-lifetimes.js +1 -0
  95. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  96. package/dist/backend/llvm/publish.d.ts +4 -0
  97. package/dist/backend/llvm/publish.js +3 -1
  98. package/dist/backend/llvm/publish.js.map +1 -1
  99. package/dist/backend/llvm/record-results.d.ts +8 -5
  100. package/dist/backend/llvm/record-results.js +20 -12
  101. package/dist/backend/llvm/record-results.js.map +1 -1
  102. package/dist/backend/llvm/reference-effects.js +13 -0
  103. package/dist/backend/llvm/reference-effects.js.map +1 -1
  104. package/dist/backend/llvm/reference-writes.js +14 -0
  105. package/dist/backend/llvm/reference-writes.js.map +1 -1
  106. package/dist/backend/llvm/regions.d.ts +1 -0
  107. package/dist/backend/llvm/regions.js +12 -7
  108. package/dist/backend/llvm/regions.js.map +1 -1
  109. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  110. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  111. package/dist/backend/llvm/shapes.d.ts +56 -10
  112. package/dist/backend/llvm/shapes.js +178 -39
  113. package/dist/backend/llvm/shapes.js.map +1 -1
  114. package/dist/backend/llvm/shapes.test.js +61 -3
  115. package/dist/backend/llvm/shapes.test.js.map +1 -1
  116. package/dist/backend/llvm/stack-objects.js +16 -4
  117. package/dist/backend/llvm/stack-objects.js.map +1 -1
  118. package/dist/backend/llvm/stack-objects.test.js +3 -0
  119. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  120. package/dist/backend/llvm/walkers.d.ts +11 -0
  121. package/dist/backend/llvm/walkers.js +106 -10
  122. package/dist/backend/llvm/walkers.js.map +1 -1
  123. package/dist/backend/may-throw.js +9 -4
  124. package/dist/backend/may-throw.js.map +1 -1
  125. package/dist/backend/native/contracts.d.ts +2 -2
  126. package/dist/backend/native/executable.js +14 -3
  127. package/dist/backend/native/executable.js.map +1 -1
  128. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  129. package/dist/backend/native/runtime-inputs.js +1 -0
  130. package/dist/backend/native/runtime-inputs.js.map +1 -1
  131. package/dist/backend/native-toolchain.test.js +1 -1
  132. package/dist/backend/native-toolchain.test.js.map +1 -1
  133. package/dist/backend/runtime-abi.d.ts +2 -2
  134. package/dist/backend/runtime-abi.js +2 -2
  135. package/dist/backend/runtime-pack-targets.test.js +1 -1
  136. package/dist/backend/runtime-pack.test.js +1 -1
  137. package/dist/backend/target-diagnostics.js +4 -1
  138. package/dist/backend/target-diagnostics.js.map +1 -1
  139. package/dist/backend/target-diagnostics.test.js +4 -1
  140. package/dist/backend/target-diagnostics.test.js.map +1 -1
  141. package/dist/compat/fetch-profile.js +4 -4
  142. package/dist/compat/fetch-profile.js.map +1 -1
  143. package/dist/contracts/check.js +2 -0
  144. package/dist/contracts/check.js.map +1 -1
  145. package/dist/coverage/report.js +1 -1
  146. package/dist/coverage/report.js.map +1 -1
  147. package/dist/diagnostics/diagnostic.d.ts +6 -5
  148. package/dist/diagnostics/diagnostic.js +7 -6
  149. package/dist/diagnostics/diagnostic.js.map +1 -1
  150. package/dist/frontend/builtin-modules.d.ts +1 -1
  151. package/dist/frontend/builtin-modules.js +1 -0
  152. package/dist/frontend/builtin-modules.js.map +1 -1
  153. package/dist/frontend/comptime-node.js +2 -2
  154. package/dist/frontend/comptime-node.js.map +1 -1
  155. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  156. package/dist/frontend/lowering/binding-analysis.js +1 -1
  157. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  158. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  159. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  160. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  161. package/dist/frontend/lowering/builtins/blob.js +167 -0
  162. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  163. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  164. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  165. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  166. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  167. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  168. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  169. package/dist/frontend/lowering/builtins/compression.js +3 -2
  170. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  171. package/dist/frontend/lowering/builtins/crypto.js +415 -120
  172. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  173. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  174. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  175. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  176. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  177. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  178. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  179. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  180. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  181. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  182. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  183. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  184. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  185. package/dist/frontend/lowering/builtins/module-calls.js +44 -11
  186. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  187. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  188. package/dist/frontend/lowering/builtins/performance.js +340 -5
  189. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  190. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  191. package/dist/frontend/lowering/builtins/process.js +107 -14
  192. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  193. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  194. package/dist/frontend/lowering/builtins/properties.js +39 -11
  195. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  196. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  197. package/dist/frontend/lowering/builtins/readline.js +266 -90
  198. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  200. package/dist/frontend/lowering/builtins/url.js +36 -0
  201. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  202. package/dist/frontend/lowering/call-arguments.js +1 -1
  203. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  204. package/dist/frontend/lowering/call-signatures.js +20 -2
  205. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  206. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
  207. package/dist/frontend/lowering/class-dynamic-dispatch.js +105 -1
  208. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  209. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  210. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  211. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  212. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  213. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  214. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  215. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  216. package/dist/frontend/lowering/coercions/structural.js +3 -3
  217. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  218. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  219. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  220. package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
  221. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  222. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  223. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  224. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  225. package/dist/frontend/lowering/containers/bytes.js +38 -26
  226. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  227. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  228. package/dist/frontend/lowering/containers/for-of.js +5 -1
  229. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  230. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  231. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  232. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  233. package/dist/frontend/lowering/crypto-tables.js +77 -12
  234. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  235. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  236. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  237. package/dist/frontend/lowering/expressions/object-literals.js +16 -12
  238. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  239. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  240. package/dist/frontend/lowering/generic-functions.js +2 -2
  241. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  242. package/dist/frontend/lowering/http2-constants.js +1 -1
  243. package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
  244. package/dist/frontend/lowering/lower-array-sort.js +561 -191
  245. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  246. package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
  247. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  248. package/dist/frontend/lowering/lower-assert.js +2 -2
  249. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  250. package/dist/frontend/lowering/lower-async-iteration.js +248 -2
  251. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  252. package/dist/frontend/lowering/lower-calls.js +101 -9
  253. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  254. package/dist/frontend/lowering/lower-classes.d.ts +8 -2
  255. package/dist/frontend/lowering/lower-classes.js +40 -9
  256. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  257. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  258. package/dist/frontend/lowering/lower-comptime.js +4 -4
  259. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  260. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  261. package/dist/frontend/lowering/lower-event-target.js +362 -0
  262. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  263. package/dist/frontend/lowering/lower-expando.js +2 -2
  264. package/dist/frontend/lowering/lower-exprs.js +112 -22
  265. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  266. package/dist/frontend/lowering/lower-inspect.js +129 -11
  267. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  268. package/dist/frontend/lowering/lower-mixins.js +1 -1
  269. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  270. package/dist/frontend/lowering/lower-modules.js +7 -3
  271. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  272. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  273. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  274. package/dist/frontend/lowering/lower-server.js +39 -14
  275. package/dist/frontend/lowering/lower-server.js.map +1 -1
  276. package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
  277. package/dist/frontend/lowering/lower-stdlib.js +10 -3
  278. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  279. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  280. package/dist/frontend/lowering/lower-stmts.js +46 -12
  281. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  282. package/dist/frontend/lowering/lower-stream.js +234 -22
  283. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  284. package/dist/frontend/lowering/lower-timers.js +1 -1
  285. package/dist/frontend/lowering/lowerer.d.ts +23 -5
  286. package/dist/frontend/lowering/lowerer.js +245 -41
  287. package/dist/frontend/lowering/lowerer.js.map +1 -1
  288. package/dist/frontend/lowering/native-ffi.js +2 -2
  289. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  290. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  291. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  292. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  293. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  294. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  295. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  296. package/dist/frontend/lowering/surfaces.d.ts +7 -3
  297. package/dist/frontend/lowering/surfaces.js +273 -22
  298. package/dist/frontend/lowering/surfaces.js.map +1 -1
  299. package/dist/frontend/module-syntax.d.ts +1 -1
  300. package/dist/frontend/module-syntax.js +1 -1
  301. package/dist/frontend/npm-static-prune.js +1 -1
  302. package/dist/frontend/npm-static-prune.js.map +1 -1
  303. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  304. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  305. package/dist/frontend/pipeline.js +1 -1
  306. package/dist/frontend/pipeline.js.map +1 -1
  307. package/dist/frontend/program.d.ts +3 -3
  308. package/dist/frontend/program.js +19 -17
  309. package/dist/frontend/program.js.map +1 -1
  310. package/dist/frontend/resolve.js +1 -1
  311. package/dist/frontend/ts7/adapter.js +1 -1
  312. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  313. package/dist/frontend/ts7/ast-bytes.js +1 -1
  314. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  315. package/dist/frontend/ts7/semantic-json.js +1 -1
  316. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  317. package/dist/frontend/ts7/world-check.js +1 -1
  318. package/dist/frontend/tsc-codes.js +2 -2
  319. package/dist/frontend/tsc-codes.js.map +1 -1
  320. package/dist/frontend/type-mapper.d.ts +16 -1
  321. package/dist/frontend/type-mapper.js +143 -18
  322. package/dist/frontend/type-mapper.js.map +1 -1
  323. package/dist/index.js +5 -4
  324. package/dist/index.js.map +1 -1
  325. package/dist/ir/analysis.d.ts +12 -6
  326. package/dist/ir/analysis.js +26 -10
  327. package/dist/ir/analysis.js.map +1 -1
  328. package/dist/ir/analysis.test.js +15 -3
  329. package/dist/ir/analysis.test.js.map +1 -1
  330. package/dist/ir/builtin-effects.js +79 -0
  331. package/dist/ir/builtin-effects.js.map +1 -1
  332. package/dist/ir/builtin-signatures.d.ts +1 -1
  333. package/dist/ir/builtin-signatures.js +291 -38
  334. package/dist/ir/builtin-signatures.js.map +1 -1
  335. package/dist/ir/int32-slots.js +1 -0
  336. package/dist/ir/int32-slots.js.map +1 -1
  337. package/dist/ir/ir.d.ts +64 -16
  338. package/dist/ir/ir.js +37 -1
  339. package/dist/ir/ir.js.map +1 -1
  340. package/dist/ir/runtime-features.js +83 -6
  341. package/dist/ir/runtime-features.js.map +1 -1
  342. package/dist/ir/serialize.js +1 -1
  343. package/dist/ir/serialize.js.map +1 -1
  344. package/dist/ir/traverse.js +1 -0
  345. package/dist/ir/traverse.js.map +1 -1
  346. package/dist/ir/validate.js +100 -9
  347. package/dist/ir/validate.js.map +1 -1
  348. package/dist/ir/validate.test.js +60 -0
  349. package/dist/ir/validate.test.js.map +1 -1
  350. package/dist/library/fence-eval.d.ts +1 -1
  351. package/dist/library/fence-eval.js +5 -4
  352. package/dist/library/fence-eval.js.map +1 -1
  353. package/dist/library/ir-policy.js +10 -4
  354. package/dist/library/ir-policy.js.map +1 -1
  355. package/dist/library/library-profile.js +13 -13
  356. package/dist/library/library-profile.js.map +1 -1
  357. package/dist/library/prepare.js +1 -1
  358. package/dist/library/prepare.js.map +1 -1
  359. package/dist/library/sidecar.js +3 -3
  360. package/dist/library/sidecar.js.map +1 -1
  361. package/dist/native/prepare.js +3 -2
  362. package/dist/native/prepare.js.map +1 -1
  363. package/package.json +20 -20
  364. package/surface-manifest.json +379 -142
@@ -35,8 +35,29 @@ import { newFnCtx, own } from "./lowerer.js";
35
35
  import { appendImplicitUndefinedReturn } from "./function-returns.js";
36
36
  import { bufEncoding, knownBufEncoding } from "./containers/bytes.js";
37
37
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
38
+ import { sideEffectFreeOptionValue } from "./surfaces.js";
38
39
  import { BOOL, DYN, F64, RUNTIME_STREAM_CLASSES, STRING, VOID, arrayOf, BYTES_U8, canBoxFuncIntoDyn, funcOf, typeEquals, typeKey, } from "../../ir/ir.js";
39
40
  const BYTES = BYTES_U8;
41
+ /** An expression that only reads bindings and properties (no calls,
42
+ * assignments or construction): reading it a step later observes the
43
+ * same values. */
44
+ function pureRead(node) {
45
+ if (ts.isParenthesizedExpression(node) ||
46
+ ts.isNonNullExpression(node) ||
47
+ ts.isAsExpression(node)) {
48
+ return pureRead(node.expression);
49
+ }
50
+ if (ts.isIdentifier(node) || node.kind === ts.SyntaxKind.ThisKeyword)
51
+ return true;
52
+ if (ts.isPropertyAccessExpression(node))
53
+ return pureRead(node.expression);
54
+ if (ts.isElementAccessExpression(node)) {
55
+ return ((ts.isStringLiteral(node.argumentExpression) ||
56
+ ts.isNumericLiteral(node.argumentExpression)) &&
57
+ pureRead(node.expression));
58
+ }
59
+ return false;
60
+ }
40
61
  /** The stream sides of a receiver class: the nearest stream-class
41
62
  * ancestor's, or null off the stream hierarchy. */
42
63
  export function streamSidesOf(lowerer, info) {
@@ -466,6 +487,7 @@ fallbackCb) {
466
487
  encoding: null,
467
488
  badEncoding: null,
468
489
  pushEncoding: null,
490
+ signal: null,
469
491
  flags: 0,
470
492
  cbs: [],
471
493
  };
@@ -527,6 +549,12 @@ fallbackCb) {
527
549
  present.set(name, lowerStreamCallback(lowerer, name, fnNode, thisType, tuple));
528
550
  continue;
529
551
  }
552
+ // `{ signal }` shorthand: the binding is the value.
553
+ if (name === "signal" && ts.isShorthandPropertyAssignment(prop)) {
554
+ if (ts.isIdentifier(prop.name))
555
+ out.signal = lowerer.lowerExprExpecting(prop.name, DYN);
556
+ continue;
557
+ }
530
558
  // Scalar options.
531
559
  if (!ts.isPropertyAssignment(prop)) {
532
560
  lowerer.unsupported("SC1090", prop, `the ${ctorName} option '${name}' as a shorthand/method member`);
@@ -609,9 +637,20 @@ fallbackCb) {
609
637
  }
610
638
  lowerer.noLowering(`the ${ctorName} option 'defaultEncoding'`, prop, "utf8 (the default) is the supported write-side string encoding");
611
639
  break;
612
- case "signal":
613
- lowerer.noLowering(`the ${ctorName} option 'signal'`, prop, "AbortSignal-driven destruction is not lowered yet");
640
+ case "signal": {
641
+ // `if (options.signal) addAbortSignal(options.signal, this)`:
642
+ // applied over the fresh stream, so the value is read after the
643
+ // constructor — only values whose evaluation has no effects.
644
+ if (value.kind === ts.SyntaxKind.NullKeyword)
645
+ break;
646
+ if (ts.isIdentifier(value) && value.text === "undefined")
647
+ break;
648
+ if (!sideEffectFreeOptionValue(value) && !pureRead(value)) {
649
+ lowerer.noLowering(`the ${ctorName} option 'signal' with this value`, prop, "pass a variable or property read (const signal = controller.signal) — the signal is read after construction");
650
+ }
651
+ out.signal = lowerer.lowerExprExpecting(value, DYN);
614
652
  break;
653
+ }
615
654
  case "captureRejections": {
616
655
  // `false` is the default — admit the literal; the rejection-
617
656
  // capturing mode has no lowering (async listeners' promises are
@@ -691,6 +730,7 @@ function streamCtorArgs(lowerer, cls, arg, thisType, loc, fallbackCb) {
691
730
  encoding: o.encoding,
692
731
  badEncoding: o.badEncoding,
693
732
  pushEncoding: o.pushEncoding,
733
+ signal: o.signal,
694
734
  };
695
735
  }
696
736
  /** `new Readable(opts?)` and friends — called from lowerNew once the
@@ -736,14 +776,24 @@ export function lowerStreamNew(lowerer, expr, info) {
736
776
  loc,
737
777
  };
738
778
  }
739
- if (parsed.encoding === null)
779
+ if (parsed.encoding !== null) {
780
+ // { encoding }: chain a setEncoding over the fresh stream (the operand
781
+ // temp releases with the frame; setEncoding answers the receiver +1).
782
+ built = {
783
+ kind: "libCall",
784
+ fn: "readable.setEncoding",
785
+ args: [built, strLit(parsed.encoding, loc)],
786
+ type: thisType,
787
+ loc,
788
+ };
789
+ }
790
+ if (parsed.signal === null)
740
791
  return built;
741
- // { encoding }: chain a setEncoding over the fresh stream (the operand
742
- // temp releases with the frame; setEncoding answers the receiver +1).
792
+ // { signal }: addAbortSignal over the fresh stream (answers it +1).
743
793
  return {
744
794
  kind: "libCall",
745
- fn: "readable.setEncoding",
746
- args: [built, strLit(parsed.encoding, loc)],
795
+ fn: "stream.addAbortSignal",
796
+ args: [built, parsed.signal],
747
797
  type: thisType,
748
798
  loc,
749
799
  };
@@ -759,8 +809,8 @@ function streamMethodWrapper(lowerer, info, which, methodName, thisType, loc, bl
759
809
  const found = lowerer.findMethodOn(info, methodName);
760
810
  if (!found) {
761
811
  // A DESCENDANT-only declaration (the base chain never declares it):
762
- // this constructor cannot see it, and silently binding nothing would
763
- // diverge from Node (which dispatches through the prototype chain).
812
+ // this constructor cannot see it, and binding nothing without a
813
+ // diagnostic would diverge from Node (which dispatches through the prototype chain).
764
814
  if (lowerer.overrideBelow(info, methodName)) {
765
815
  lowerer.noLowering(`a subclass of ${info.def.name.replace(/^%/, "")} declaring '${methodName}' below a base whose constructor cannot see it`, blame, `declare '${methodName}' on the class whose constructor calls the stream super(), and override it below`);
766
816
  }
@@ -959,6 +1009,19 @@ export function lowerStreamSuperCall(lowerer, info, base, argNodes, thisLocal, l
959
1009
  loc,
960
1010
  });
961
1011
  }
1012
+ if (parsed.signal !== null) {
1013
+ out.push({
1014
+ kind: "exprStmt",
1015
+ expr: {
1016
+ kind: "libCall",
1017
+ fn: "stream.addAbortSignal",
1018
+ args: [thisRef(), parsed.signal],
1019
+ type: thisType,
1020
+ loc,
1021
+ },
1022
+ loc,
1023
+ });
1024
+ }
962
1025
  return out;
963
1026
  }
964
1027
  /* ── the underscore-method assignment surface ─────────────────────────── */
@@ -1284,6 +1347,85 @@ function lowerEosCallback(lowerer, which, node, thisType) {
1284
1347
  }
1285
1348
  lowerer.noLowering(`${which} with this callback value`, node, "write the callback inline, or pass a function value that crosses the checked-dynamic boundary");
1286
1349
  }
1350
+ /** finished()'s options literal: readable/writable/error (and cleanup
1351
+ * for the promise form) as boolean literals, signal as any expression.
1352
+ * readable/writable answer -1 when absent (Node's default: whether the
1353
+ * stream has that side). */
1354
+ function eosOptions(lowerer, node, promiseForm) {
1355
+ const out = {
1356
+ readable: -1,
1357
+ writable: -1,
1358
+ error: true,
1359
+ cleanup: false,
1360
+ signal: null,
1361
+ };
1362
+ if (!ts.isObjectLiteralExpression(node)) {
1363
+ lowerer.noLowering("finished options that are not an object literal", node, "write the options inline: finished(stream, { readable, writable, error, signal })");
1364
+ }
1365
+ const literal = (p, key) => {
1366
+ if (p.initializer.kind === ts.SyntaxKind.TrueKeyword)
1367
+ return true;
1368
+ if (p.initializer.kind === ts.SyntaxKind.FalseKeyword)
1369
+ return false;
1370
+ lowerer.noLowering(`the finished option '${key}' with a non-literal value`, p.initializer, "pass true or false");
1371
+ };
1372
+ for (const p of node.properties) {
1373
+ const key = (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) && ts.isIdentifier(p.name)
1374
+ ? p.name.text
1375
+ : null;
1376
+ if (key === "signal") {
1377
+ out.signal = ts.isShorthandPropertyAssignment(p)
1378
+ ? lowerer.lowerExprExpecting(p.name, DYN)
1379
+ : lowerer.lowerExprExpecting(p.initializer, DYN);
1380
+ continue;
1381
+ }
1382
+ if (key !== null && ts.isPropertyAssignment(p)) {
1383
+ if (key === "readable")
1384
+ out.readable = literal(p, key) ? 1 : 0;
1385
+ else if (key === "writable")
1386
+ out.writable = literal(p, key) ? 1 : 0;
1387
+ else if (key === "error")
1388
+ out.error = literal(p, key);
1389
+ else if (key === "cleanup" && promiseForm)
1390
+ out.cleanup = literal(p, key);
1391
+ else {
1392
+ lowerer.noLowering(`the finished option '${key}'`, p, promiseForm
1393
+ ? "readable, writable, error, cleanup and signal are the supported options"
1394
+ : "readable, writable, error and signal are the supported options");
1395
+ }
1396
+ continue;
1397
+ }
1398
+ lowerer.noLowering("finished options with this member", p, "write each option as a plain property");
1399
+ }
1400
+ return out;
1401
+ }
1402
+ /** pipeline()'s trailing options literal (the promise form): signal as
1403
+ * any expression, end as a boolean literal. */
1404
+ function pipelineOptions(lowerer, node) {
1405
+ const out = { end: true, signal: null };
1406
+ for (const p of node.properties) {
1407
+ const key = (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) && ts.isIdentifier(p.name)
1408
+ ? p.name.text
1409
+ : null;
1410
+ if (key === "signal") {
1411
+ out.signal = ts.isShorthandPropertyAssignment(p)
1412
+ ? lowerer.lowerExprExpecting(p.name, DYN)
1413
+ : lowerer.lowerExprExpecting(p.initializer, DYN);
1414
+ continue;
1415
+ }
1416
+ if (key === "end" && ts.isPropertyAssignment(p)) {
1417
+ if (p.initializer.kind === ts.SyntaxKind.TrueKeyword)
1418
+ continue;
1419
+ if (p.initializer.kind === ts.SyntaxKind.FalseKeyword) {
1420
+ out.end = false;
1421
+ continue;
1422
+ }
1423
+ lowerer.noLowering("the pipeline option 'end' with a non-literal value", p.initializer, "pass true or false");
1424
+ }
1425
+ lowerer.noLowering(key === null ? "pipeline options with this member" : `the pipeline option '${key}'`, p, "signal and end are the supported pipeline options");
1426
+ }
1427
+ return out;
1428
+ }
1287
1429
  /** `finished(...)` / `pipeline(...)` / `getDefaultHighWaterMark(...)`
1288
1430
  * imported from node:stream (named imports, destructured requires, and
1289
1431
  * namespace-member calls all land here). Null for members this spoke
@@ -1296,10 +1438,8 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1296
1438
  // ERR_STREAM_PREMATURE_CLOSE — the callback form's status, boxed
1297
1439
  // through the promise instead). The options argument has no lowering.
1298
1440
  if (bi.member === "finished") {
1299
- if (args.length !== 1) {
1300
- lowerer.noLowering(`stream/promises.finished with ${args.length} arguments`, call, args.length === 2
1301
- ? "the options argument has no lowering yet — the one-argument form is supported"
1302
- : "the supported form is finished(stream)");
1441
+ if (args.length !== 1 && args.length !== 2) {
1442
+ lowerer.noLowering(`stream/promises.finished with ${args.length} arguments`, call, "the supported forms are finished(stream) and finished(stream, options)");
1303
1443
  }
1304
1444
  let recv;
1305
1445
  try {
@@ -1310,6 +1450,24 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1310
1450
  return e.expr;
1311
1451
  throw e;
1312
1452
  }
1453
+ const optsNode = args[1];
1454
+ if (optsNode !== undefined && optsNode.kind !== ts.SyntaxKind.NullKeyword) {
1455
+ const o = eosOptions(lowerer, optsNode, true);
1456
+ const head = [
1457
+ recv,
1458
+ numLit(o.readable, loc),
1459
+ numLit(o.writable, loc),
1460
+ boolLit(o.error, loc),
1461
+ boolLit(o.cleanup, loc),
1462
+ ];
1463
+ return {
1464
+ kind: "libCall",
1465
+ fn: o.signal ? "sp.finishedOptsSignal" : "sp.finishedOpts",
1466
+ args: o.signal ? [...head, o.signal] : head,
1467
+ type: { kind: "promise", inner: VOID },
1468
+ loc,
1469
+ };
1470
+ }
1313
1471
  return {
1314
1472
  kind: "libCall",
1315
1473
  fn: "sp.finished",
@@ -1326,15 +1484,30 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1326
1484
  if (args.length < 2) {
1327
1485
  lowerer.noLowering(`stream/promises.pipeline with ${args.length} arguments`, call, "the supported form is pipeline(source, ...streams)");
1328
1486
  }
1487
+ const lastArg = args[args.length - 1];
1488
+ const opts = ts.isObjectLiteralExpression(lastArg) && args.length >= 3
1489
+ ? pipelineOptions(lowerer, lastArg)
1490
+ : null;
1491
+ const stageArgs = opts ? args.slice(0, -1) : args;
1329
1492
  let streams;
1330
1493
  try {
1331
- streams = args.map((a) => lowerStreamArg(lowerer, a, "pipeline"));
1494
+ streams = stageArgs.map((a) => lowerStreamArg(lowerer, a, "pipeline"));
1332
1495
  }
1333
1496
  catch (e) {
1334
1497
  if (e instanceof StreamArgTypeThrow)
1335
1498
  return e.expr;
1336
1499
  throw e;
1337
1500
  }
1501
+ if (opts) {
1502
+ const head = [numLit(streams.length, loc), ...streams, boolLit(opts.end, loc)];
1503
+ return {
1504
+ kind: "libCall",
1505
+ fn: opts.signal ? "sp.pipelineOptsSignal" : "sp.pipelineOpts",
1506
+ args: opts.signal ? [...head, opts.signal] : head,
1507
+ type: { kind: "promise", inner: VOID },
1508
+ loc,
1509
+ };
1510
+ }
1338
1511
  return {
1339
1512
  kind: "libCall",
1340
1513
  fn: "sp.pipeline",
@@ -1352,9 +1525,9 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1352
1525
  // utf8 decode / the parsed JSON dyn tree / the concatenated bytes / an
1353
1526
  // ArrayBuffer dyn over them) or rejects — with the stream's error,
1354
1527
  // ERR_STREAM_PREMATURE_CLOSE on an early close, or json's SyntaxError
1355
- // on malformed text, Node's own rejection set. blob returns null here:
1356
- // Blob has no representation, so the module-qualified fence (with the
1357
- // pointed hint in BUILTIN_MODULE_FENCE_HINTS) speaks.
1528
+ // on malformed text, Node's own rejection set. blob returns null here,
1529
+ // so the module-qualified fence (with the pointed hint in
1530
+ // BUILTIN_MODULE_FENCE_HINTS) speaks.
1358
1531
  if (bi.member === "text" ||
1359
1532
  bi.member === "json" ||
1360
1533
  bi.member === "buffer" ||
@@ -1400,11 +1573,33 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1400
1573
  return numLit(16, loc);
1401
1574
  lowerer.noLowering("getDefaultHighWaterMark with a non-literal argument", call, "the objectMode flag must be a compile-time boolean");
1402
1575
  }
1403
- if (bi.member === "finished") {
1576
+ if (bi.member === "addAbortSignal") {
1577
+ // addAbortSignal(signal, stream) → the stream: destroyed with an
1578
+ // AbortError when the signal aborts (now, if it already has).
1404
1579
  if (args.length !== 2) {
1405
- lowerer.noLowering(`finished with ${args.length} arguments`, call, args.length === 3
1406
- ? "the options argument has no lowering yet — the two-argument form is supported"
1407
- : "the supported form is finished(stream, callback)");
1580
+ lowerer.noLowering(`addAbortSignal with ${args.length} arguments`, call, "the supported form is addAbortSignal(signal, stream)");
1581
+ }
1582
+ const signal = lowerer.lowerExprExpecting(args[0], DYN);
1583
+ let stream;
1584
+ try {
1585
+ stream = lowerStreamArg(lowerer, args[1], "addAbortSignal");
1586
+ }
1587
+ catch (e) {
1588
+ if (e instanceof StreamArgTypeThrow)
1589
+ return e.expr;
1590
+ throw e;
1591
+ }
1592
+ return {
1593
+ kind: "libCall",
1594
+ fn: "stream.addAbortSignalFn",
1595
+ args: [signal, stream],
1596
+ type: stream.type,
1597
+ loc,
1598
+ };
1599
+ }
1600
+ if (bi.member === "finished") {
1601
+ if (args.length !== 2 && args.length !== 3) {
1602
+ lowerer.noLowering(`finished with ${args.length} arguments`, call, "the supported forms are finished(stream, callback) and finished(stream, options, callback)");
1408
1603
  }
1409
1604
  let recv;
1410
1605
  try {
@@ -1415,7 +1610,24 @@ export function lowerStreamModuleCall(lowerer, call, bi, loc) {
1415
1610
  return e.expr;
1416
1611
  throw e;
1417
1612
  }
1418
- const { cb, dyn } = lowerEosCallback(lowerer, "finished", args[1], recv.type);
1613
+ if (args.length === 3 && args[1].kind !== ts.SyntaxKind.NullKeyword) {
1614
+ const o = eosOptions(lowerer, args[1], false);
1615
+ const { cb } = lowerEosCallback(lowerer, "finished", args[2], recv.type);
1616
+ const head = [
1617
+ recv,
1618
+ numLit(o.readable, loc),
1619
+ numLit(o.writable, loc),
1620
+ boolLit(o.error, loc),
1621
+ ];
1622
+ return {
1623
+ kind: "libCall",
1624
+ fn: o.signal ? "stream.finishedOptsSignal" : "stream.finishedOpts",
1625
+ args: o.signal ? [...head, o.signal, cb] : [...head, cb],
1626
+ type: funcOf([], VOID),
1627
+ loc,
1628
+ };
1629
+ }
1630
+ const { cb, dyn } = lowerEosCallback(lowerer, "finished", args[args.length - 1], recv.type);
1419
1631
  return {
1420
1632
  kind: "libCall",
1421
1633
  fn: dyn ? "stream.finishedDyn" : "stream.finished",