@scriptc/compiler 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +35 -5
  2. package/dist/backend/executable-features.js +7 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/library-pack.js +3 -0
  5. package/dist/backend/library-pack.js.map +1 -1
  6. package/dist/backend/link-plan-core.d.ts +2 -0
  7. package/dist/backend/link-plan-core.js +2 -0
  8. package/dist/backend/link-plan-core.js.map +1 -1
  9. package/dist/backend/link-plan.d.ts +1 -0
  10. package/dist/backend/link-plan.js +1 -0
  11. package/dist/backend/link-plan.js.map +1 -1
  12. package/dist/backend/llvm/array-search.js +3 -1
  13. package/dist/backend/llvm/array-search.js.map +1 -1
  14. package/dist/backend/llvm/classes.d.ts +27 -1
  15. package/dist/backend/llvm/classes.js +115 -22
  16. package/dist/backend/llvm/classes.js.map +1 -1
  17. package/dist/backend/llvm/classes.test.js +21 -9
  18. package/dist/backend/llvm/classes.test.js.map +1 -1
  19. package/dist/backend/llvm/common.d.ts +21 -3
  20. package/dist/backend/llvm/common.js +50 -3
  21. package/dist/backend/llvm/common.js.map +1 -1
  22. package/dist/backend/llvm/dense-array-access.d.ts +3 -1
  23. package/dist/backend/llvm/dense-array-access.js +61 -38
  24. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  25. package/dist/backend/llvm/dense-array-access.test.js +4 -0
  26. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  27. package/dist/backend/llvm/dense-array-loops.js +3 -3
  28. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  29. package/dist/backend/llvm/dyn.d.ts +9 -0
  30. package/dist/backend/llvm/dyn.js +62 -6
  31. package/dist/backend/llvm/dyn.js.map +1 -1
  32. package/dist/backend/llvm/emit-function.js +5 -2
  33. package/dist/backend/llvm/emit-function.js.map +1 -1
  34. package/dist/backend/llvm/emit-module.js +54 -32
  35. package/dist/backend/llvm/emit-module.js.map +1 -1
  36. package/dist/backend/llvm/emit-statements.d.ts +3 -2
  37. package/dist/backend/llvm/emit-statements.js +90 -13
  38. package/dist/backend/llvm/emit-statements.js.map +1 -1
  39. package/dist/backend/llvm/emitter.d.ts +20 -9
  40. package/dist/backend/llvm/emitter.js +42 -31
  41. package/dist/backend/llvm/emitter.js.map +1 -1
  42. package/dist/backend/llvm/expr-calls.js +17 -4
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-containers.js +6 -9
  45. package/dist/backend/llvm/expr-containers.js.map +1 -1
  46. package/dist/backend/llvm/expr-dynamic.js +46 -4
  47. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  48. package/dist/backend/llvm/expr-primitives.js +3 -3
  49. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  50. package/dist/backend/llvm/expr-primitives.test.js +55 -0
  51. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  52. package/dist/backend/llvm/expr-stream-bridges.js +11 -15
  53. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  54. package/dist/backend/llvm/integer-clones.js +3 -3
  55. package/dist/backend/llvm/integer-clones.js.map +1 -1
  56. package/dist/backend/llvm/js-ic.d.ts +18 -0
  57. package/dist/backend/llvm/js-ic.js +712 -0
  58. package/dist/backend/llvm/js-ic.js.map +1 -0
  59. package/dist/backend/llvm/jsval.js +139 -11
  60. package/dist/backend/llvm/jsval.js.map +1 -1
  61. package/dist/backend/llvm/lib-process.js +4 -3
  62. package/dist/backend/llvm/lib-process.js.map +1 -1
  63. package/dist/backend/llvm/lib-shared.js +22 -0
  64. package/dist/backend/llvm/lib-shared.js.map +1 -1
  65. package/dist/backend/llvm/local-array-reads.js +40 -31
  66. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  67. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  68. package/dist/backend/llvm/map-number-lookup.js +43 -7
  69. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  70. package/dist/backend/llvm/narrow-guards.js +64 -0
  71. package/dist/backend/llvm/narrow-guards.js.map +1 -1
  72. package/dist/backend/llvm/publish.d.ts +3 -0
  73. package/dist/backend/llvm/publish.js +36 -17
  74. package/dist/backend/llvm/publish.js.map +1 -1
  75. package/dist/backend/llvm/regions.js +2 -2
  76. package/dist/backend/llvm/regions.js.map +1 -1
  77. package/dist/backend/llvm/regions.test.js +7 -1
  78. package/dist/backend/llvm/regions.test.js.map +1 -1
  79. package/dist/backend/llvm/shapes.d.ts +8 -2
  80. package/dist/backend/llvm/shapes.js +9 -7
  81. package/dist/backend/llvm/shapes.js.map +1 -1
  82. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  83. package/dist/backend/llvm/speculative-integers.js +94 -6
  84. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  85. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  86. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  87. package/dist/backend/llvm/string-reads.d.ts +1 -1
  88. package/dist/backend/llvm/string-reads.js +4 -4
  89. package/dist/backend/llvm/string-reads.js.map +1 -1
  90. package/dist/backend/llvm/thread-slots.test.js +5 -4
  91. package/dist/backend/llvm/thread-slots.test.js.map +1 -1
  92. package/dist/backend/mangle.d.ts +5 -0
  93. package/dist/backend/mangle.js +7 -0
  94. package/dist/backend/mangle.js.map +1 -1
  95. package/dist/backend/native/contracts.d.ts +20 -0
  96. package/dist/backend/native/executable.js +20 -3
  97. package/dist/backend/native/executable.js.map +1 -1
  98. package/dist/backend/native/library.js +2 -1
  99. package/dist/backend/native/library.js.map +1 -1
  100. package/dist/backend/native-codegen.d.ts +6 -0
  101. package/dist/backend/native-codegen.js +19 -0
  102. package/dist/backend/native-codegen.js.map +1 -1
  103. package/dist/backend/native-codegen.test.js +27 -0
  104. package/dist/backend/native-codegen.test.js.map +1 -1
  105. package/dist/backend/native-link-info-core.d.ts +18 -0
  106. package/dist/backend/native-link-info-core.js.map +1 -1
  107. package/dist/backend/native-profile.d.ts +32 -0
  108. package/dist/backend/native-profile.js +39 -0
  109. package/dist/backend/native-profile.js.map +1 -0
  110. package/dist/backend/native-profile.test.d.ts +1 -0
  111. package/dist/backend/native-profile.test.js +58 -0
  112. package/dist/backend/native-profile.test.js.map +1 -0
  113. package/dist/backend/native-tools.d.ts +14 -0
  114. package/dist/backend/native-tools.js +13 -0
  115. package/dist/backend/native-tools.js.map +1 -1
  116. package/dist/backend/runtime-abi.d.ts +2 -2
  117. package/dist/backend/runtime-abi.js +2 -2
  118. package/dist/backend/runtime-pack-core.d.ts +4 -0
  119. package/dist/backend/runtime-pack-core.js +4 -0
  120. package/dist/backend/runtime-pack-core.js.map +1 -1
  121. package/dist/backend/runtime-pack-targets.test.js +4 -1
  122. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  123. package/dist/backend/runtime-pack.test.js +4 -1
  124. package/dist/backend/runtime-pack.test.js.map +1 -1
  125. package/dist/backend/target-diagnostics.js +7 -0
  126. package/dist/backend/target-diagnostics.js.map +1 -1
  127. package/dist/backend/warm-cache.js +3 -0
  128. package/dist/backend/warm-cache.js.map +1 -1
  129. package/dist/cli/command.js +63 -1
  130. package/dist/cli/command.js.map +1 -1
  131. package/dist/cli/host.d.ts +3 -0
  132. package/dist/cli/output-options.d.ts +2 -0
  133. package/dist/cli/output-options.js +9 -0
  134. package/dist/cli/output-options.js.map +1 -1
  135. package/dist/cli/usage.d.ts +11 -1
  136. package/dist/cli/usage.js +23 -0
  137. package/dist/cli/usage.js.map +1 -1
  138. package/dist/compile-types.d.ts +9 -0
  139. package/dist/contracts/check.js +1 -2
  140. package/dist/contracts/check.js.map +1 -1
  141. package/dist/executable/executable-cache.d.ts +10 -0
  142. package/dist/executable/executable-cache.js +6 -0
  143. package/dist/executable/executable-cache.js.map +1 -1
  144. package/dist/executable/executable-cache.test.js +5 -0
  145. package/dist/executable/executable-cache.test.js.map +1 -1
  146. package/dist/frontend/arguments-usage.d.ts +8 -0
  147. package/dist/frontend/arguments-usage.js +98 -0
  148. package/dist/frontend/arguments-usage.js.map +1 -1
  149. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  150. package/dist/frontend/arguments-usage.test.js +32 -0
  151. package/dist/frontend/arguments-usage.test.js.map +1 -0
  152. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  153. package/dist/frontend/builtin-package-aliases.js +133 -0
  154. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  155. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  156. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  157. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  158. package/dist/frontend/dts-paths.d.ts +4 -0
  159. package/dist/frontend/dts-paths.js +9 -1
  160. package/dist/frontend/dts-paths.js.map +1 -1
  161. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
  162. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
  163. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
  164. package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
  165. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  166. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -0
  167. package/dist/frontend/lowering/builtins/crypto.js +4 -1
  168. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  169. package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
  170. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  171. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  172. package/dist/frontend/lowering/builtins/json.js +52 -0
  173. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  174. package/dist/frontend/lowering/builtins/process.d.ts +9 -0
  175. package/dist/frontend/lowering/builtins/process.js +44 -0
  176. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  177. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
  178. package/dist/frontend/lowering/builtins/promisify-callback.js +21 -3
  179. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  180. package/dist/frontend/lowering/builtins/reflection.js +26 -0
  181. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  182. package/dist/frontend/lowering/builtins/timers.js +5 -1
  183. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  184. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  185. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  186. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  187. package/dist/frontend/lowering/call-signatures.d.ts +4 -0
  188. package/dist/frontend/lowering/call-signatures.js +126 -9
  189. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  190. package/dist/frontend/lowering/cjs-exports-object.js +34 -1
  191. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  192. package/dist/frontend/lowering/class-dynamic-dispatch.js +9 -1
  193. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  194. package/dist/frontend/lowering/class-protocols.d.ts +10 -0
  195. package/dist/frontend/lowering/class-protocols.js +53 -3
  196. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  197. package/dist/frontend/lowering/class-prototypes.js +6 -1
  198. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  199. package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
  200. package/dist/frontend/lowering/class-to-primitive.js +6 -3
  201. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  202. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  203. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  204. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  205. package/dist/frontend/lowering/coercions/function-adapters.js +99 -70
  206. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  207. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -0
  208. package/dist/frontend/lowering/containers/array-callbacks.js +22 -19
  209. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  210. package/dist/frontend/lowering/containers/array-construction.js +7 -0
  211. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  212. package/dist/frontend/lowering/containers/array-methods.js +5 -0
  213. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  214. package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
  215. package/dist/frontend/lowering/containers/bytes.js +493 -17
  216. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  217. package/dist/frontend/lowering/containers/collection-methods.js +72 -3
  218. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  219. package/dist/frontend/lowering/containers/string-and-regexp.js +49 -13
  220. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  221. package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
  222. package/dist/frontend/lowering/cycle-initialization.js +152 -35
  223. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  224. package/dist/frontend/lowering/expressions/array-literals.js +33 -13
  225. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  226. package/dist/frontend/lowering/expressions/binary.js +79 -5
  227. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  228. package/dist/frontend/lowering/expressions/element-access.js +13 -6
  229. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  230. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
  231. package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
  232. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  233. package/dist/frontend/lowering/expressions/narrowing.js +17 -2
  234. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  235. package/dist/frontend/lowering/expressions/object-literals.js +48 -1
  236. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  237. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  238. package/dist/frontend/lowering/expressions/optional-chains.js +12 -3
  239. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  240. package/dist/frontend/lowering/expressions/property-access.d.ts +5 -0
  241. package/dist/frontend/lowering/expressions/property-access.js +252 -9
  242. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  243. package/dist/frontend/lowering/expressions/relational.js +49 -4
  244. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  245. package/dist/frontend/lowering/expressions/typeof.js +13 -0
  246. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  247. package/dist/frontend/lowering/expressions/updates.js +1 -1
  248. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  249. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  250. package/dist/frontend/lowering/generator-delegation.js +191 -1
  251. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  252. package/dist/frontend/lowering/generic-functions.d.ts +4 -0
  253. package/dist/frontend/lowering/generic-functions.js +213 -56
  254. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  255. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  256. package/dist/frontend/lowering/handle-properties.js +281 -0
  257. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  258. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  259. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  260. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  261. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  262. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  263. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  264. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  265. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  266. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  267. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  268. package/dist/frontend/lowering/lower-calls.js +166 -7
  269. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  270. package/dist/frontend/lowering/lower-classes.d.ts +4 -0
  271. package/dist/frontend/lowering/lower-classes.js +59 -7
  272. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  273. package/dist/frontend/lowering/lower-dgram.js +62 -13
  274. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  275. package/dist/frontend/lowering/lower-exprs.js +32 -1
  276. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  277. package/dist/frontend/lowering/lower-functions.js +4 -0
  278. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  279. package/dist/frontend/lowering/lower-generators.js +10 -4
  280. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  281. package/dist/frontend/lowering/lower-inspect.js +569 -11
  282. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  283. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  284. package/dist/frontend/lowering/lower-modules.js +212 -67
  285. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  286. package/dist/frontend/lowering/lower-namespaces.js +20 -0
  287. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  288. package/dist/frontend/lowering/lower-server.js +26 -1
  289. package/dist/frontend/lowering/lower-server.js.map +1 -1
  290. package/dist/frontend/lowering/lower-stdlib.js +28 -9
  291. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  292. package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
  293. package/dist/frontend/lowering/lower-stmts.js +418 -51
  294. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  295. package/dist/frontend/lowering/lower-timers.js +17 -1
  296. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  297. package/dist/frontend/lowering/lowerer.d.ts +29 -5
  298. package/dist/frontend/lowering/lowerer.js +172 -25
  299. package/dist/frontend/lowering/lowerer.js.map +1 -1
  300. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  301. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  302. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  303. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  304. package/dist/frontend/lowering/static-typeof.js +133 -0
  305. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  306. package/dist/frontend/lowering/string-index-bounds.js +3 -2
  307. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  308. package/dist/frontend/lowering/surfaces.js +30 -4
  309. package/dist/frontend/lowering/surfaces.js.map +1 -1
  310. package/dist/frontend/lowering/thenables.d.ts +16 -0
  311. package/dist/frontend/lowering/thenables.js +124 -0
  312. package/dist/frontend/lowering/thenables.js.map +1 -0
  313. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  314. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  315. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  316. package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
  317. package/dist/frontend/npm-static-bundled-chunks.js +173 -2
  318. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  319. package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
  320. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  321. package/dist/frontend/npm-static-bundled-esm.js +224 -4
  322. package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
  323. package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
  324. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
  325. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  326. package/dist/frontend/npm-static-enum-iife.js +280 -0
  327. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  328. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  329. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  330. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  331. package/dist/frontend/npm-static.d.ts +8 -0
  332. package/dist/frontend/npm-static.js +46 -1
  333. package/dist/frontend/npm-static.js.map +1 -1
  334. package/dist/frontend/npm.js +13 -0
  335. package/dist/frontend/npm.js.map +1 -1
  336. package/dist/frontend/package-shims.d.ts +47 -0
  337. package/dist/frontend/package-shims.js +300 -0
  338. package/dist/frontend/package-shims.js.map +1 -0
  339. package/dist/frontend/pipeline.js +67 -1
  340. package/dist/frontend/pipeline.js.map +1 -1
  341. package/dist/frontend/program.d.ts +8 -0
  342. package/dist/frontend/program.js +72 -9
  343. package/dist/frontend/program.js.map +1 -1
  344. package/dist/frontend/resolve.js +13 -0
  345. package/dist/frontend/resolve.js.map +1 -1
  346. package/dist/frontend/services.d.ts +6 -0
  347. package/dist/frontend/services.js +19 -0
  348. package/dist/frontend/services.js.map +1 -1
  349. package/dist/frontend/ts7/program-host.d.ts +6 -5
  350. package/dist/frontend/ts7/program-host.js +7 -0
  351. package/dist/frontend/ts7/program-host.js.map +1 -1
  352. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  353. package/dist/frontend/ts7/semantic-model.js +26 -0
  354. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  355. package/dist/frontend/ts7/session.d.ts +19 -4
  356. package/dist/frontend/ts7/session.js.map +1 -1
  357. package/dist/frontend/type-mapper.js +201 -15
  358. package/dist/frontend/type-mapper.js.map +1 -1
  359. package/dist/index.d.ts +1 -0
  360. package/dist/index.js +58 -6
  361. package/dist/index.js.map +1 -1
  362. package/dist/ir/array-length-stability.d.ts +3 -2
  363. package/dist/ir/array-length-stability.js +15 -2
  364. package/dist/ir/array-length-stability.js.map +1 -1
  365. package/dist/ir/array-length-stability.test.js +22 -1
  366. package/dist/ir/array-length-stability.test.js.map +1 -1
  367. package/dist/ir/builtin-effects.js +13 -0
  368. package/dist/ir/builtin-effects.js.map +1 -1
  369. package/dist/ir/builtin-signatures.d.ts +1 -1
  370. package/dist/ir/builtin-signatures.js +46 -4
  371. package/dist/ir/builtin-signatures.js.map +1 -1
  372. package/dist/ir/integer-loop-facts.d.ts +5 -0
  373. package/dist/ir/integer-loop-facts.js +79 -14
  374. package/dist/ir/integer-loop-facts.js.map +1 -1
  375. package/dist/ir/integer-ranges.d.ts +10 -1
  376. package/dist/ir/integer-ranges.js +122 -25
  377. package/dist/ir/integer-ranges.js.map +1 -1
  378. package/dist/ir/integer-ranges.test.js +191 -1
  379. package/dist/ir/integer-ranges.test.js.map +1 -1
  380. package/dist/ir/ir.js +8 -0
  381. package/dist/ir/ir.js.map +1 -1
  382. package/dist/ir/js-ic.d.ts +52 -0
  383. package/dist/ir/js-ic.js +199 -0
  384. package/dist/ir/js-ic.js.map +1 -0
  385. package/dist/ir/js-ic.test.d.ts +1 -0
  386. package/dist/ir/js-ic.test.js +148 -0
  387. package/dist/ir/js-ic.test.js.map +1 -0
  388. package/dist/ir/jsval.js +38 -4
  389. package/dist/ir/jsval.js.map +1 -1
  390. package/dist/ir/runtime-features.d.ts +39 -4
  391. package/dist/ir/runtime-features.js +229 -99
  392. package/dist/ir/runtime-features.js.map +1 -1
  393. package/dist/ir/traverse.js +110 -68
  394. package/dist/ir/traverse.js.map +1 -1
  395. package/dist/ir/validate.js +21 -8
  396. package/dist/ir/validate.js.map +1 -1
  397. package/dist/ir/validate.test.js +15 -2
  398. package/dist/ir/validate.test.js.map +1 -1
  399. package/dist/library/ir-policy.js +1 -0
  400. package/dist/library/ir-policy.js.map +1 -1
  401. package/dist/native/cli.js +17 -0
  402. package/dist/native/cli.js.map +1 -1
  403. package/dist/native/compiler.js +33 -4
  404. package/dist/native/compiler.js.map +1 -1
  405. package/dist/native/executable-cache.js +3 -0
  406. package/dist/native/executable-cache.js.map +1 -1
  407. package/dist/native/prepare.js +3 -0
  408. package/dist/native/prepare.js.map +1 -1
  409. package/dist/native/sanitizer.test.js +7 -0
  410. package/dist/native/sanitizer.test.js.map +1 -1
  411. package/package.json +21 -20
  412. package/shims/fs-extra/core/api.ts +1192 -0
  413. package/shims/fs-extra/index.ts +9 -0
  414. package/shims/undici/core/agent.ts +163 -0
  415. package/shims/undici/core/api.ts +93 -0
  416. package/shims/undici/core/client.ts +1304 -0
  417. package/shims/undici/core/connector.ts +157 -0
  418. package/shims/undici/core/diagnostics-types.ts +68 -0
  419. package/shims/undici/core/diagnostics.ts +16 -0
  420. package/shims/undici/core/dispatcher.ts +574 -0
  421. package/shims/undici/core/errors-v5.ts +22 -0
  422. package/shims/undici/core/errors-v7.ts +25 -0
  423. package/shims/undici/core/errors.ts +255 -0
  424. package/shims/undici/core/fetch.ts +635 -0
  425. package/shims/undici/core/pool.ts +280 -0
  426. package/shims/undici/core/readable.ts +268 -0
  427. package/shims/undici/core/request.ts +313 -0
  428. package/shims/undici/core/timers.ts +80 -0
  429. package/shims/undici/core/types.ts +167 -0
  430. package/shims/undici/core/util.ts +67 -0
  431. package/shims/undici/v5.ts +119 -0
  432. package/shims/undici/v7.ts +119 -0
  433. package/surface-manifest.json +2 -4
@@ -32,4 +32,13 @@ export declare function knownBufEncoding(name: string): string | undefined;
32
32
  /** The literal encoding argument of a Buffer surface, normalized — or a
33
33
  * fence when it isn't a literal alias Node knows. */
34
34
  export declare function bufEncoding(lowerer: Lowerer, what: string, encNode: ts.Expression): string;
35
+ /** The deprecated `new Buffer(arg[, encoding])` in a dependency's
36
+ * JavaScript, through the global or an alias of it (buffer-crc32 and yazl
37
+ * keep it as the fallback for runtimes without Buffer.alloc/Buffer.from).
38
+ * Node never emits DEP0005 for calls from node_modules, so the construction
39
+ * is exactly Node's: a number allocates zero-filled bytes (and throws
40
+ * ERR_INVALID_ARG_TYPE beside a string second argument), anything else
41
+ * converts as Buffer.from does. Null elsewhere: other callers owe the
42
+ * deprecation warning. */
43
+ export declare function lowerNodeModulesBufferConstruct(lowerer: Lowerer, expr: ts.NewExpression): IrExpr | null;
35
44
  export declare function lowerBufferStaticCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
@@ -1,8 +1,9 @@
1
- import { dynUndefinedExpr, varRef } from "../../../ir/build.js";
1
+ import { boolLit, dynUndefinedExpr, numLit, varRef } from "../../../ir/build.js";
2
2
  import { BUF_NUM_METHODS } from "./buffer-numeric-methods.js";
3
3
  import * as ts from "../../ts7/adapter.js";
4
4
  import { BIGINT_T, BOOL, BYTES_ELEMENT_NAME, BYTES_U8, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, bytesOf, funcOf, isUnitType, typeEquals, } from "../../../ir/ir.js";
5
5
  import { isJsSourceFile, locOf } from "../../program.js";
6
+ import { stdlibGlobalNameOf } from "../surfaces.js";
6
7
  import { newFnCtx, own } from "../lowerer.js";
7
8
  import { buildBytesSortFn, closureKeyOrder } from "../lower-array-sort.js";
8
9
  import { isSafeToDiscard } from "../expressions/evaluation-safety.js";
@@ -11,6 +12,9 @@ import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedA
11
12
  import { lowerCheckedArrayFrom } from "./array-construction.js";
12
13
  import { lowerToNumberArgument } from "../lower-exprs.js";
13
14
  import { lowerBytesIteratorValue } from "../iterator-adapters.js";
15
+ import { lowerArrayCallback } from "./callback-arguments.js";
16
+ import { findPredicateOk, predicateToBoolean } from "./array-callbacks.js";
17
+ import { typeKey } from "../../type-mapper.js";
14
18
  /** TypedArray.prototype.sort and toSorted. The receiver and comparator
15
19
  * expressions are evaluated before entering the helper (buildBytesSortFn).
16
20
  * The default order is numeric, so the comparator-less form sorts by value
@@ -90,7 +94,7 @@ function lowerBytesSortCall(lowerer, call, access, bytesT) {
90
94
  }
91
95
  const arity = fnArg.type.params.length;
92
96
  const keyed = closureKeyOrder(lowerer.liftedFns, fnArg);
93
- const order = keyed !== null && keyed.read === null ? keyed.order : null;
97
+ const order = keyed?.length === 1 && keyed[0].read === null ? keyed[0].order : null;
94
98
  const helper = helperFor(`${arity}${order === null ? "" : `:keyed${order}`}`, arity, true, order);
95
99
  return {
96
100
  kind: "call",
@@ -100,6 +104,317 @@ function lowerBytesSortCall(lowerer, call, access, bytesT) {
100
104
  loc,
101
105
  };
102
106
  }
107
+ const BYTES_CALLBACK_METHODS = new Set([
108
+ "forEach",
109
+ "map",
110
+ "filter",
111
+ "some",
112
+ "every",
113
+ "find",
114
+ "findIndex",
115
+ "findLast",
116
+ "findLastIndex",
117
+ "reduce",
118
+ "reduceRight",
119
+ ]);
120
+ /** The typed-array callback methods (forEach, map, filter, some, every,
121
+ * find, findIndex, findLast, findLastIndex, reduce, reduceRight). The
122
+ * receiver, the callback and reduce's initial value evaluate in order
123
+ * before the helper runs. The helper reads the length once (typed arrays
124
+ * have no holes) and each element when it visits it, so the callback's
125
+ * writes show in later elements. The callback receives the element, its
126
+ * index and the typed array (reduce's receive the accumulator first). map
127
+ * and filter return a new typed array of the receiver's kind; map stores
128
+ * each result with the element conversion of that kind. A thisArg keeps
129
+ * the fence, as for arrays. */
130
+ function lowerBytesCallbackCall(lowerer, call, access, method, bytesT) {
131
+ const loc = locOf(call);
132
+ const nArgs = call.arguments.nodes.length;
133
+ const reduce = method === "reduce" || method === "reduceRight";
134
+ if (nArgs < 1 || nArgs > (reduce ? 2 : 1) || call.arguments.nodes.some(ts.isSpreadElement)) {
135
+ lowerer.noLowering(`.${method} with ${nArgs} arguments on ${BYTES_ELEMENT_NAME[bytesT.elem]}`, call, reduce ? undefined : "the thisArg parameter has no lowering — use an arrow function");
136
+ }
137
+ const argNode = call.arguments.nodes[0];
138
+ const hasInit = reduce && nArgs === 2;
139
+ const accT = reduce ? (hasInit ? lowerer.irTypeOf(call) : F64) : null;
140
+ if (accT !== null && (accT.kind === "void" || accT.kind === "func"))
141
+ lowerer.badType(call, lowerer.typeOf(call));
142
+ const receiver = lowerer.lowerExprExpecting(access.expression, bytesT);
143
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, accT !== null ? [accT, F64] : [F64], bytesT, false, accT ?? undefined);
144
+ const fnRet = fnArg.type.ret;
145
+ const predicate = method === "filter" ||
146
+ method === "some" ||
147
+ method === "every" ||
148
+ method === "find" ||
149
+ method === "findIndex" ||
150
+ method === "findLast" ||
151
+ method === "findLastIndex";
152
+ if (predicate && !findPredicateOk(lowerer, fnRet))
153
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
154
+ if (method === "map" && !lowerer.coercibleValue(F64, fnRet))
155
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
156
+ const resultT = accT ??
157
+ (method === "forEach"
158
+ ? VOID
159
+ : method === "map" || method === "filter"
160
+ ? bytesT
161
+ : method === "some" || method === "every"
162
+ ? BOOL
163
+ : method === "findIndex" || method === "findLastIndex"
164
+ ? F64
165
+ : lowerer.irTypeOf(call));
166
+ const helper = bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, hasInit, loc);
167
+ const args = [receiver, fnArg];
168
+ if (hasInit)
169
+ args.push(lowerer.lowerExprExpecting(call.arguments.nodes[1], resultT));
170
+ return { kind: "call", callee: helper, args, type: resultT, loc };
171
+ }
172
+ /** The interned helper of one typed-array callback method shape. */
173
+ function bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, hasInit, loc) {
174
+ const key = `bytes.${method}:${bytesT.elem}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}:${hasInit ? "init" : ""}`;
175
+ const existing = lowerer.arrHofHelpers.get(key);
176
+ if (existing)
177
+ return existing;
178
+ const name = `%bytes.${method}.${lowerer.arrHofHelpers.size}`;
179
+ lowerer.arrHofHelpers.set(key, name);
180
+ const reduce = method === "reduce" || method === "reduceRight";
181
+ const backward = method === "reduceRight" || method === "findLast" || method === "findLastIndex";
182
+ const fnT = funcOf((reduce ? [resultT, F64, F64, bytesT] : [F64, F64, bytesT]).slice(0, arity), fnRet);
183
+ const keptT = arrayOf(F64);
184
+ const a = () => varRef("a.0", bytesT, loc);
185
+ const i = () => varRef("i.0", F64, loc);
186
+ const n = () => varRef("n.0", F64, loc);
187
+ const acc = () => varRef("acc.0", resultT, loc);
188
+ const element = () => varRef("v.0", F64, loc);
189
+ const at = (index) => ({
190
+ kind: "bytesIntrinsic",
191
+ method: "get",
192
+ receiver: a(),
193
+ args: [index],
194
+ type: F64,
195
+ loc,
196
+ });
197
+ const callback = () => ({
198
+ kind: "callValue",
199
+ callee: varRef("f.0", fnT, loc),
200
+ args: (reduce ? [acc(), element(), i(), a()] : [element(), i(), a()]).slice(0, arity),
201
+ type: fnRet,
202
+ loc,
203
+ });
204
+ const inRange = () => backward
205
+ ? { kind: "bin", op: ">=", left: i(), right: numLit(0, loc), type: BOOL, loc }
206
+ : { kind: "bin", op: "<", left: i(), right: n(), type: BOOL, loc };
207
+ const advance = () => ({
208
+ kind: "assign",
209
+ localId: "i.0",
210
+ value: {
211
+ kind: "bin",
212
+ op: backward ? "-" : "+",
213
+ left: i(),
214
+ right: numLit(1, loc),
215
+ type: F64,
216
+ loc,
217
+ },
218
+ loc,
219
+ });
220
+ const ret = (value) => ({ kind: "return", value, loc });
221
+ // map and filter of a Buffer return a Buffer (Node's species).
222
+ const copyBrand = (out) => ({
223
+ kind: "exprStmt",
224
+ expr: { kind: "libCall", fn: "bytes.copyBrand", args: [out, a()], type: VOID, loc },
225
+ loc,
226
+ });
227
+ const locals = [
228
+ { id: "a.0", name: "a", type: bytesT, mutable: true },
229
+ { id: "f.0", name: "f", type: fnT, mutable: true },
230
+ ...(hasInit ? [{ id: "z.0", name: "z", type: resultT, mutable: true }] : []),
231
+ ...(reduce || method === "map" || method === "filter"
232
+ ? [{ id: "acc.0", name: "acc", type: resultT, mutable: true }]
233
+ : []),
234
+ ...(method === "filter"
235
+ ? [{ id: "kept.0", name: "kept", type: keptT, mutable: true }]
236
+ : []),
237
+ { id: "n.0", name: "n", type: F64, mutable: false },
238
+ { id: "i.0", name: "i", type: F64, mutable: true },
239
+ { id: "v.0", name: "v", type: F64, mutable: true },
240
+ ];
241
+ const params = [
242
+ { localId: "a.0", name: "a", type: bytesT },
243
+ { localId: "f.0", name: "f", type: fnT },
244
+ ...(hasInit ? [{ localId: "z.0", name: "z", type: resultT }] : []),
245
+ ];
246
+ const visit = [{ kind: "assign", localId: "v.0", value: at(i()), loc }];
247
+ const prologue = [];
248
+ let epilogue;
249
+ switch (method) {
250
+ case "forEach":
251
+ visit.push({ kind: "exprStmt", expr: callback(), loc });
252
+ epilogue = [ret(null)];
253
+ break;
254
+ case "map":
255
+ prologue.push({
256
+ kind: "varDecl",
257
+ localId: "acc.0",
258
+ init: { kind: "bytesNew", source: n(), type: bytesT, loc },
259
+ loc,
260
+ });
261
+ visit.push({
262
+ kind: "bytesSet",
263
+ arr: acc(),
264
+ index: i(),
265
+ value: lowerer.coerceToExpected(callback(), F64),
266
+ loc,
267
+ });
268
+ if (bytesT.elem === "u8")
269
+ prologue.push(copyBrand(acc()));
270
+ epilogue = [ret(acc())];
271
+ break;
272
+ case "filter":
273
+ prologue.push({
274
+ kind: "varDecl",
275
+ localId: "kept.0",
276
+ init: { kind: "arrayLit", elems: [], type: keptT, loc },
277
+ loc,
278
+ });
279
+ visit.push({
280
+ kind: "if",
281
+ cond: predicateToBoolean(callback()),
282
+ then: [
283
+ {
284
+ kind: "exprStmt",
285
+ expr: {
286
+ kind: "arrIntrinsic",
287
+ method: "push",
288
+ receiver: varRef("kept.0", keptT, loc),
289
+ args: [element()],
290
+ type: F64,
291
+ loc,
292
+ },
293
+ loc,
294
+ },
295
+ ],
296
+ else_: null,
297
+ loc,
298
+ });
299
+ epilogue = [
300
+ {
301
+ kind: "varDecl",
302
+ localId: "acc.0",
303
+ init: { kind: "bytesNew", source: varRef("kept.0", keptT, loc), type: bytesT, loc },
304
+ loc,
305
+ },
306
+ ...(bytesT.elem === "u8" ? [copyBrand(acc())] : []),
307
+ ret(acc()),
308
+ ];
309
+ break;
310
+ case "some":
311
+ case "every": {
312
+ const found = method === "some";
313
+ const test = predicateToBoolean(callback());
314
+ visit.push({
315
+ kind: "if",
316
+ cond: found ? test : { kind: "unary", op: "!", operand: test, type: BOOL, loc },
317
+ then: [ret(boolLit(found, loc))],
318
+ else_: null,
319
+ loc,
320
+ });
321
+ epilogue = [ret(boolLit(!found, loc))];
322
+ break;
323
+ }
324
+ case "find":
325
+ case "findLast":
326
+ visit.push({
327
+ kind: "if",
328
+ cond: predicateToBoolean(callback()),
329
+ then: [ret(lowerer.coerceToExpected(element(), resultT))],
330
+ else_: null,
331
+ loc,
332
+ });
333
+ epilogue = [
334
+ ret(lowerer.coerceToExpected({ kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc }, resultT)),
335
+ ];
336
+ break;
337
+ case "findIndex":
338
+ case "findLastIndex":
339
+ visit.push({
340
+ kind: "if",
341
+ cond: predicateToBoolean(callback()),
342
+ then: [ret(i())],
343
+ else_: null,
344
+ loc,
345
+ });
346
+ epilogue = [ret(numLit(-1, loc))];
347
+ break;
348
+ case "reduce":
349
+ case "reduceRight":
350
+ if (hasInit) {
351
+ prologue.push({
352
+ kind: "varDecl",
353
+ localId: "acc.0",
354
+ init: varRef("z.0", resultT, loc),
355
+ loc,
356
+ });
357
+ }
358
+ else {
359
+ prologue.push({
360
+ kind: "if",
361
+ cond: { kind: "unary", op: "!", operand: inRange(), type: BOOL, loc },
362
+ then: [
363
+ {
364
+ kind: "throw",
365
+ value: {
366
+ kind: "libCall",
367
+ fn: "error.new",
368
+ args: [
369
+ {
370
+ kind: "strLit",
371
+ value: "Reduce of empty array with no initial value",
372
+ type: STRING,
373
+ loc,
374
+ },
375
+ ],
376
+ type: { kind: "object", className: "%TypeError" },
377
+ loc,
378
+ },
379
+ loc,
380
+ },
381
+ ],
382
+ else_: null,
383
+ loc,
384
+ }, { kind: "varDecl", localId: "acc.0", init: at(i()), loc }, advance());
385
+ }
386
+ visit.push({
387
+ kind: "assign",
388
+ localId: "acc.0",
389
+ value: lowerer.coerceToExpected(callback(), resultT),
390
+ loc,
391
+ });
392
+ epilogue = [ret(acc())];
393
+ break;
394
+ }
395
+ const body = [
396
+ {
397
+ kind: "varDecl",
398
+ localId: "n.0",
399
+ init: { kind: "bytesIntrinsic", method: "length", receiver: a(), args: [], type: F64, loc },
400
+ loc,
401
+ },
402
+ {
403
+ kind: "varDecl",
404
+ localId: "i.0",
405
+ init: backward
406
+ ? { kind: "bin", op: "-", left: n(), right: numLit(1, loc), type: F64, loc }
407
+ : numLit(0, loc),
408
+ loc,
409
+ },
410
+ { kind: "varDecl", localId: "v.0", init: numLit(0, loc), loc },
411
+ ...prologue,
412
+ { kind: "for", init: null, cond: inRange(), update: advance(), body: visit, loc },
413
+ ...epilogue,
414
+ ];
415
+ lowerer.liftedFns.push({ name, params, returnType: resultT, locals, body, loc });
416
+ return name;
417
+ }
103
418
  /* ── typed arrays / Buffer ─────────────────────────────────────────────── */
104
419
  /** The typed-array constructors with a runtime representation, by lib
105
420
  * interface name. Other flavors (BigInt64Array, BigUint64Array) fall through
@@ -365,6 +680,9 @@ export function lowerBytesMethodCall(lowerer, call, access) {
365
680
  if (name === "sort" || name === "toSorted") {
366
681
  return lowerBytesSortCall(lowerer, call, access, receiverIr);
367
682
  }
683
+ if (BYTES_CALLBACK_METHODS.has(name)) {
684
+ return lowerBytesCallbackCall(lowerer, call, access, name, receiverIr);
685
+ }
368
686
  // values()/keys()/entries() as iterator objects (for...of heads and
369
687
  // stored numeric iterators lower before this).
370
688
  if ((name === "values" || name === "keys" || name === "entries") && nArgs === 0) {
@@ -1144,6 +1462,158 @@ function knownBufferProducer(lowerer, source, seen = new Set()) {
1144
1462
  const type = lowerer.mapTypeOf(lowerer.typeOf(callee.expression));
1145
1463
  return type?.kind === "cryptoHash" || type?.kind === "cryptoHmac";
1146
1464
  }
1465
+ /** Buffer.from over a checked-dynamic source and encoding, both already in
1466
+ * repeatable locals: Node's fromString takes utf8 for an absent, non-string
1467
+ * or empty encoding and throws ERR_UNKNOWN_ENCODING for an unknown name;
1468
+ * other sources ignore the encoding. */
1469
+ function dynBufferFromParts(source, encoding, loc) {
1470
+ const utf8 = { kind: "strLit", value: "utf8", type: STRING, loc };
1471
+ const isString = (x) => ({
1472
+ kind: "dynTest",
1473
+ test: "string",
1474
+ value: x,
1475
+ type: BOOL,
1476
+ loc,
1477
+ });
1478
+ const name = {
1479
+ kind: "ternary",
1480
+ cond: {
1481
+ kind: "logical",
1482
+ op: "&&",
1483
+ left: isString(encoding),
1484
+ right: {
1485
+ kind: "strEq",
1486
+ negated: true,
1487
+ left: { kind: "dynCheck", value: encoding, type: STRING, loc },
1488
+ right: { kind: "strLit", value: "", type: STRING, loc },
1489
+ type: BOOL,
1490
+ loc,
1491
+ },
1492
+ type: BOOL,
1493
+ loc,
1494
+ },
1495
+ then: { kind: "dynCheck", value: encoding, type: STRING, loc },
1496
+ else_: utf8,
1497
+ type: STRING,
1498
+ loc,
1499
+ };
1500
+ return {
1501
+ kind: "ternary",
1502
+ cond: isString(source),
1503
+ then: {
1504
+ kind: "libCall",
1505
+ fn: "buffer.poolFromStrChecked",
1506
+ args: [{ kind: "dynCheck", value: source, type: STRING, loc }, name],
1507
+ type: BYTES_U8,
1508
+ loc,
1509
+ },
1510
+ else_: {
1511
+ kind: "libCall",
1512
+ fn: "buffer.poolFromDynRef",
1513
+ args: [source, utf8],
1514
+ type: BYTES_U8,
1515
+ loc,
1516
+ },
1517
+ type: BYTES_U8,
1518
+ loc,
1519
+ };
1520
+ }
1521
+ /** Lowers `source` and `encNode` (or undefined) into hidden dyn locals, in
1522
+ * source order, and builds the result from their references. */
1523
+ function withDynBufferArguments(lowerer, source, encNode, loc, build) {
1524
+ const v = lowerer.declareHiddenLocal("%bufferValue", DYN);
1525
+ const e = lowerer.declareHiddenLocal("%bufferEncoding", DYN);
1526
+ const result = build(varRef(v.id, DYN, loc), varRef(e.id, DYN, loc));
1527
+ return {
1528
+ kind: "seqExpr",
1529
+ stmts: [
1530
+ { kind: "varDecl", localId: v.id, init: lowerer.coerceToExpected(source, DYN), loc },
1531
+ {
1532
+ kind: "varDecl",
1533
+ localId: e.id,
1534
+ init: encNode === undefined
1535
+ ? dynUndefinedExpr(loc)
1536
+ : lowerer.coerceToExpected(lowerer.lowerExpr(encNode), DYN),
1537
+ loc,
1538
+ },
1539
+ ],
1540
+ result,
1541
+ type: result.type,
1542
+ loc,
1543
+ };
1544
+ }
1545
+ /** Buffer.from(value, encoding) over a checked-dynamic value whose encoding
1546
+ * is not a literal: yazl forwards its `encoding` parameter, often undefined.
1547
+ * Null when the encoding is absent or a literal. */
1548
+ function dynBufferFromRuntimeEncoding(lowerer, value, encNode, loc) {
1549
+ if (encNode === undefined || lowerer.typeOf(encNode).isStringLiteralType())
1550
+ return null;
1551
+ return withDynBufferArguments(lowerer, value, encNode, loc, (source, encoding) => dynBufferFromParts(source, encoding, loc));
1552
+ }
1553
+ /** The deprecated `new Buffer(arg[, encoding])` in a dependency's
1554
+ * JavaScript, through the global or an alias of it (buffer-crc32 and yazl
1555
+ * keep it as the fallback for runtimes without Buffer.alloc/Buffer.from).
1556
+ * Node never emits DEP0005 for calls from node_modules, so the construction
1557
+ * is exactly Node's: a number allocates zero-filled bytes (and throws
1558
+ * ERR_INVALID_ARG_TYPE beside a string second argument), anything else
1559
+ * converts as Buffer.from does. Null elsewhere: other callers owe the
1560
+ * deprecation warning. */
1561
+ export function lowerNodeModulesBufferConstruct(lowerer, expr) {
1562
+ const sf = expr.getSourceFile();
1563
+ if (!isJsSourceFile(sf) || !/[\\/]node_modules[\\/]/.test(sf.fileName))
1564
+ return null;
1565
+ const args = expr.arguments?.nodes ?? [];
1566
+ if (args.length < 1 || args.length > 2 || args.some(ts.isSpreadElement))
1567
+ return null;
1568
+ if (stdlibGlobalNameOf(lowerer, expr.expression) !== "Buffer")
1569
+ return null;
1570
+ const loc = locOf(expr);
1571
+ const value = withDynBufferArguments(lowerer, lowerer.lowerExpr(args[0]), args[1], loc, (source, encoding) => ({
1572
+ kind: "ternary",
1573
+ cond: { kind: "dynTest", test: "number", value: source, type: BOOL, loc },
1574
+ then: {
1575
+ kind: "ternary",
1576
+ cond: { kind: "dynTest", test: "string", value: encoding, type: BOOL, loc },
1577
+ then: { kind: "libCall", fn: "buffer.newStringFail", args: [source], type: BYTES_U8, loc },
1578
+ else_: {
1579
+ kind: "libCall",
1580
+ fn: "buffer.alloc",
1581
+ args: [{ kind: "dynCheck", value: source, type: F64, loc }],
1582
+ type: BYTES_U8,
1583
+ loc,
1584
+ },
1585
+ type: BYTES_U8,
1586
+ loc,
1587
+ },
1588
+ else_: dynBufferFromParts(source, encoding, loc),
1589
+ type: BYTES_U8,
1590
+ loc,
1591
+ }));
1592
+ return { kind: "libCall", fn: "buffer.brand", args: [value], type: BYTES_U8, loc };
1593
+ }
1594
+ /** Buffer.from(array or bytes, extra): Node copies an array-like source and
1595
+ * ignores the encoding/offset argument (yazl passes its `encoding` through
1596
+ * unchanged), but JavaScript still evaluates it after the source. */
1597
+ function withIgnoredBufferArgument(lowerer, extraNode, source, build) {
1598
+ if (extraNode === undefined)
1599
+ return build(source);
1600
+ const extra = lowerer.lowerExpr(extraNode);
1601
+ if (isSafeToDiscard(extra))
1602
+ return build(source);
1603
+ const loc = source.loc;
1604
+ const tmp = lowerer.declareHiddenLocal("%bufferSource", source.type);
1605
+ const result = build(varRef(tmp.id, source.type, loc));
1606
+ return {
1607
+ kind: "seqExpr",
1608
+ stmts: [
1609
+ { kind: "varDecl", localId: tmp.id, init: source, loc },
1610
+ { kind: "exprStmt", expr: extra, loc },
1611
+ ],
1612
+ result,
1613
+ type: result.type,
1614
+ loc,
1615
+ };
1616
+ }
1147
1617
  export function lowerBufferStaticCall(lowerer, call, access) {
1148
1618
  const value = lowerBufferStaticValue(lowerer, call, access);
1149
1619
  // Every byte-valued Buffer factory creates a distinct view. Preserve its
@@ -1200,11 +1670,15 @@ function lowerBufferStaticValue(lowerer, call, access) {
1200
1670
  !argNode.elements.nodes.some(ts.isSpreadElement)) {
1201
1671
  // A number[] literal (contextually typed by the lib's readonly
1202
1672
  // number[] slot — build it element-wise, the Set-seed pattern).
1203
- if (args.length === 1) {
1204
- const elems = argNode.elements.nodes.map((el) => lowerer.lowerExprExpecting(el, F64));
1205
- const seed = { kind: "arrayLit", elems, type: arrayOf(F64), loc };
1206
- return { kind: "libCall", fn: "buffer.poolFromArray", args: [seed], type: BYTES_U8, loc };
1207
- }
1673
+ const elems = argNode.elements.nodes.map((el) => lowerer.lowerExprExpecting(el, F64));
1674
+ const seed = { kind: "arrayLit", elems, type: arrayOf(F64), loc };
1675
+ return withIgnoredBufferArgument(lowerer, args[1], seed, (array) => ({
1676
+ kind: "libCall",
1677
+ fn: "buffer.poolFromArray",
1678
+ args: [array],
1679
+ type: BYTES_U8,
1680
+ loc,
1681
+ }));
1208
1682
  }
1209
1683
  else {
1210
1684
  const srcIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
@@ -1212,6 +1686,9 @@ function lowerBufferStaticValue(lowerer, call, access) {
1212
1686
  // JS callback storage can be native DYN even when the checker
1213
1687
  // reports any (or a narrowed Buffer). Dispatch on its actual ABI.
1214
1688
  if (value.type.kind === "dyn") {
1689
+ const runtimeEncoding = dynBufferFromRuntimeEncoding(lowerer, value, args[1], loc);
1690
+ if (runtimeEncoding)
1691
+ return runtimeEncoding;
1215
1692
  const encName = args[1] ? bufEncoding(lowerer, "Buffer.from", args[1]) : "utf8";
1216
1693
  const enc = { kind: "strLit", value: encName, type: STRING, loc };
1217
1694
  return {
@@ -1256,25 +1733,24 @@ function lowerBufferStaticValue(lowerer, call, access) {
1256
1733
  // A checker type with no mapping (pako's conditional `O extends
1257
1734
  // { toText: true } ? string : Uint8Array` result) whose lowered
1258
1735
  // value is a u8 view copies like the typed form.
1259
- if (args.length === 1 &&
1260
- ((srcIr?.kind === "bytes" && srcIr.elem === "u8") ||
1261
- (srcIr === null && value.type.kind === "bytes" && value.type.elem === "u8"))) {
1262
- return {
1736
+ if ((srcIr?.kind === "bytes" && srcIr.elem === "u8") ||
1737
+ (srcIr === null && value.type.kind === "bytes" && value.type.elem === "u8")) {
1738
+ return withIgnoredBufferArgument(lowerer, args[1], value, (bytes) => ({
1263
1739
  kind: "libCall",
1264
1740
  fn: "buffer.poolFromBytes",
1265
- args: [value],
1741
+ args: [bytes],
1266
1742
  type: BYTES_U8,
1267
1743
  loc,
1268
- };
1744
+ }));
1269
1745
  }
1270
- if (args.length === 1 && srcIr?.kind === "array" && srcIr.elem.kind === "f64") {
1271
- return {
1746
+ if (srcIr?.kind === "array" && srcIr.elem.kind === "f64") {
1747
+ return withIgnoredBufferArgument(lowerer, args[1], value, (array) => ({
1272
1748
  kind: "libCall",
1273
1749
  fn: "buffer.poolFromArray",
1274
- args: [value],
1750
+ args: [array],
1275
1751
  type: BYTES_U8,
1276
1752
  loc,
1277
- };
1753
+ }));
1278
1754
  }
1279
1755
  // A union of strings, u8 views and undefined/null (a JS-inferred
1280
1756
  // npm result such as pako's deflate): the checked form dispatches