@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
@@ -0,0 +1,313 @@
1
+ // undici's per-dispatch request record (lib/core/request.js): option
2
+ // validation, header processing, and the handler callbacks with their
3
+ // diagnostics_channel publications.
4
+ import { channels } from "./diagnostics.ts";
5
+ import { InvalidArgumentError, NotSupportedError } from "./errors.ts";
6
+ import type { DispatchHandlers, DispatchOptions, Profile } from "./types.ts";
7
+
8
+ const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;
9
+ const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
10
+ const invalidPathRegex = /[^!-ÿ]/;
11
+
12
+ export class Request {
13
+ origin: string;
14
+ method: string;
15
+ path: string;
16
+ body: Buffer | null;
17
+ /** Header name/value pairs in insertion order (host and content-length
18
+ * are consumed into their own fields, like undici). */
19
+ headerPairs: string[];
20
+ host: string | null;
21
+ contentLength: number | null;
22
+ contentType: string | null;
23
+ completed: boolean;
24
+ aborted: boolean;
25
+ idempotent: boolean;
26
+ blocking: boolean;
27
+ reset: boolean | null;
28
+ headersTimeout: number | null;
29
+ bodyTimeout: number | null;
30
+ throwOnError: boolean;
31
+ servername: string | null;
32
+ error: Error | null;
33
+ abortFn: ((err?: Error) => void) | null;
34
+ handler: DispatchHandlers;
35
+ profile: Profile;
36
+ /** The request as diagnostics_channel subscribers see it: one untyped
37
+ * object per request, so its identity is stable across publications.
38
+ * The request keeps its completed and headers fields current. */
39
+ diagnostic: unknown;
40
+
41
+ constructor(origin: string, opts: DispatchOptions, handler: DispatchHandlers, profile: Profile) {
42
+ const path = opts.path;
43
+ const method = opts.method;
44
+ if (typeof path !== "string") {
45
+ throw new InvalidArgumentError("path must be a string");
46
+ } else if (
47
+ path[0] !== "/" &&
48
+ !(path.startsWith("http://") || path.startsWith("https://")) &&
49
+ method !== "CONNECT"
50
+ ) {
51
+ throw new InvalidArgumentError("path must be an absolute URL or start with a slash");
52
+ } else if (invalidPathRegex.test(path)) {
53
+ throw new InvalidArgumentError("invalid request path");
54
+ }
55
+ if (typeof method !== "string") {
56
+ throw new InvalidArgumentError("method must be a string");
57
+ } else if (!tokenRegExp.test(method)) {
58
+ throw new InvalidArgumentError("invalid request method");
59
+ }
60
+ if (method === "CONNECT") {
61
+ throw new NotSupportedError(
62
+ "scriptc's undici client does not implement CONNECT requests yet",
63
+ );
64
+ }
65
+ const headersTimeout = opts.headersTimeout ?? null;
66
+ if (headersTimeout !== null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
67
+ throw new InvalidArgumentError("invalid headersTimeout");
68
+ }
69
+ const bodyTimeout = opts.bodyTimeout ?? null;
70
+ if (bodyTimeout !== null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {
71
+ throw new InvalidArgumentError("invalid bodyTimeout");
72
+ }
73
+
74
+ this.origin = origin;
75
+ this.method = method;
76
+ this.path = path;
77
+ this.headersTimeout = headersTimeout;
78
+ this.bodyTimeout = bodyTimeout;
79
+ // 7.x dropped throwOnError (the responseError interceptor replaced it).
80
+ if (profile.major >= 7 && opts.throwOnError !== undefined) {
81
+ throw new InvalidArgumentError("invalid throwOnError");
82
+ }
83
+ this.throwOnError = opts.throwOnError === true;
84
+
85
+ const body = opts.body ?? null;
86
+ if (body === null) {
87
+ this.body = null;
88
+ } else if (typeof body === "string") {
89
+ this.body = body.length > 0 ? Buffer.from(body) : null;
90
+ } else {
91
+ this.body =
92
+ body.byteLength > 0 ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null;
93
+ }
94
+
95
+ this.completed = false;
96
+ this.profile = profile;
97
+ this.aborted = false;
98
+ this.idempotent = opts.idempotent ?? (method === "HEAD" || method === "GET");
99
+ this.blocking = opts.blocking ?? (profile.major >= 7 ? method !== "HEAD" : false);
100
+ this.reset = opts.reset ?? null;
101
+ this.host = null;
102
+ this.contentLength = null;
103
+ this.contentType = null;
104
+ this.headerPairs = [];
105
+ this.error = null;
106
+ this.abortFn = null;
107
+
108
+ const headers = opts.headers ?? null;
109
+ if (headers !== null) {
110
+ if (Array.isArray(headers)) {
111
+ if (headers.length % 2 !== 0) throw new InvalidArgumentError("headers array must be even");
112
+ for (let i = 0; i < headers.length; i += 2) {
113
+ processHeader(this, headers[i]!, headers[i + 1]!, profile);
114
+ }
115
+ } else {
116
+ for (const key of Object.keys(headers)) {
117
+ const value = headers[key];
118
+ if (value === undefined) continue;
119
+ if (typeof value === "string") {
120
+ processHeader(this, key, value, profile);
121
+ } else if (profile.major >= 7) {
122
+ for (const item of value) processHeader(this, key, item, profile);
123
+ } else {
124
+ throw new InvalidArgumentError(`invalid ${key} header`);
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ this.servername = serverName(this.host);
131
+ this.handler = handler;
132
+ this.diagnostic = null;
133
+ if (channels.create.hasSubscribers) channels.create.publish({ request: this.diagnosticView() });
134
+ }
135
+
136
+ diagnosticView(): unknown {
137
+ if (this.diagnostic === null) {
138
+ // addHeader adds a header as undici's Request.addHeader does (the
139
+ // tracing instrumentations' header injection).
140
+ const view: any = {
141
+ origin: this.origin,
142
+ completed: this.completed,
143
+ method: this.method,
144
+ path: this.path,
145
+ headers: this.diagnosticHeaders(),
146
+ addHeader: (key: string, value: string): unknown => {
147
+ this.addHeader(key, value);
148
+ return view;
149
+ },
150
+ };
151
+ this.diagnostic = view;
152
+ }
153
+ return this.diagnostic;
154
+ }
155
+
156
+ /** The diagnostics view's headers: undici 7 publishes its header array,
157
+ * undici 5 the raw block. */
158
+ diagnosticHeaders(): string | string[] {
159
+ return this.profile.major >= 7 ? this.headerPairs.slice() : this.headers;
160
+ }
161
+
162
+ /** The DiagnosticsChannel.Request view's raw header block. */
163
+ get headers(): string {
164
+ let out = "";
165
+ for (let i = 0; i < this.headerPairs.length; i += 2) {
166
+ out += `${this.headerPairs[i]}: ${this.headerPairs[i + 1]}\r\n`;
167
+ }
168
+ return out;
169
+ }
170
+
171
+ addHeader(key: string, value: string): Request {
172
+ processHeader(this, key, value, this.profile);
173
+ const view: any = this.diagnostic;
174
+ if (view !== null) view.headers = this.diagnosticHeaders();
175
+ return this;
176
+ }
177
+
178
+ onBodySent(chunk: Buffer): void {
179
+ const cb = this.handler.onBodySent;
180
+ if (cb !== undefined) {
181
+ try {
182
+ this.handler.onBodySent!(chunk.length, chunk.length);
183
+ } catch (err) {
184
+ this.onError(err as Error);
185
+ }
186
+ }
187
+ }
188
+
189
+ onRequestSent(): void {
190
+ if (channels.bodySent.hasSubscribers)
191
+ channels.bodySent.publish({ request: this.diagnosticView() });
192
+ }
193
+
194
+ onConnect(abort: (err?: Error) => void): void {
195
+ if (this.error !== null) {
196
+ abort(this.error);
197
+ return;
198
+ }
199
+ this.abortFn = abort;
200
+ if (this.handler.onConnect !== undefined) this.handler.onConnect!(abort);
201
+ }
202
+
203
+ onHeaders(
204
+ statusCode: number,
205
+ headers: Buffer[],
206
+ resume: () => void,
207
+ statusText: string,
208
+ ): boolean {
209
+ if (channels.headers.hasSubscribers) {
210
+ channels.headers.publish({
211
+ request: this.diagnosticView(),
212
+ response: { statusCode, headers, statusText },
213
+ });
214
+ }
215
+ if (this.handler.onHeaders === undefined) return true;
216
+ return this.handler.onHeaders!(statusCode, headers, resume, statusText);
217
+ }
218
+
219
+ onData(chunk: Buffer): boolean {
220
+ if (this.handler.onData === undefined) return true;
221
+ return this.handler.onData!(chunk);
222
+ }
223
+
224
+ onComplete(trailers: Buffer[]): void {
225
+ this.completed = true;
226
+ const view: any = this.diagnostic;
227
+ if (view !== null) view.completed = true;
228
+ if (channels.trailers.hasSubscribers)
229
+ channels.trailers.publish({ request: this.diagnosticView(), trailers });
230
+ if (this.handler.onComplete !== undefined) {
231
+ const raw: string[] = [];
232
+ for (const t of trailers) raw.push(t.toString("latin1"));
233
+ this.handler.onComplete!(raw);
234
+ }
235
+ }
236
+
237
+ onError(error: Error): void {
238
+ if (channels.error.hasSubscribers)
239
+ channels.error.publish({ request: this.diagnosticView(), error });
240
+ if (this.aborted) return;
241
+ this.aborted = true;
242
+ if (this.handler.onError !== undefined) this.handler.onError!(error);
243
+ }
244
+ }
245
+
246
+ function processHeader(request: Request, key: string, val: string, profile: Profile): void {
247
+ const lower = key.toLowerCase();
248
+ // undici 7 checks the name and every value before the special cases;
249
+ // undici 5 checks the first Host value before storing it. Either way a
250
+ // CR or LF in a value never reaches the request head.
251
+ if (profile.major >= 7) {
252
+ if (!tokenRegExp.test(lower)) throw new InvalidArgumentError("invalid header key");
253
+ if (headerCharRegex.test(val)) throw new InvalidArgumentError(`invalid ${key} header`);
254
+ }
255
+ if (lower === "host") {
256
+ // The client writes the Host value into the request head as given.
257
+ if (headerCharRegex.test(val)) throw new InvalidArgumentError(`invalid ${key} header`);
258
+ if (request.host === null) {
259
+ if (headerCharRegex.test(val)) throw new InvalidArgumentError(`invalid ${key} header`);
260
+ request.host = val;
261
+ return;
262
+ }
263
+ if (profile.major >= 7) throw new InvalidArgumentError("duplicate host header");
264
+ } else if (lower === "content-length") {
265
+ if (request.contentLength === null) {
266
+ const n = parseInt(val, 10);
267
+ if (!Number.isFinite(n) || (profile.major >= 7 && !/^\d+$/.test(val))) {
268
+ throw new InvalidArgumentError("invalid content-length header");
269
+ }
270
+ request.contentLength = n;
271
+ return;
272
+ }
273
+ // The client writes the one Content-Length it validated or computed
274
+ // from the body; a second field would frame the request twice. Both
275
+ // profiles reject it with undici 7's error (5.x sends it as given).
276
+ throw new InvalidArgumentError("duplicate content-length header");
277
+ }
278
+ if (lower === "content-type" && request.contentType === null && !headerCharRegex.test(val)) {
279
+ request.contentType = val;
280
+ request.headerPairs.push(key, val);
281
+ return;
282
+ }
283
+ if (lower === "transfer-encoding" || lower === "keep-alive" || lower === "upgrade") {
284
+ throw new InvalidArgumentError(`invalid ${lower} header`);
285
+ }
286
+ if (lower === "connection") {
287
+ if (profile.major < 7) throw new InvalidArgumentError("invalid connection header");
288
+ for (const token of val.toLowerCase().split(",")) {
289
+ const trimmed = token.trim();
290
+ if (!tokenRegExp.test(trimmed)) throw new InvalidArgumentError("invalid connection header");
291
+ if (trimmed === "close") request.reset = true;
292
+ }
293
+ return;
294
+ }
295
+ if (lower === "expect") throw new NotSupportedError("expect header not supported");
296
+ if (!tokenRegExp.test(key)) throw new InvalidArgumentError("invalid header key");
297
+ if (headerCharRegex.test(val)) throw new InvalidArgumentError(`invalid ${key} header`);
298
+ request.headerPairs.push(key, val);
299
+ }
300
+
301
+ /** util.getServerName: the Host header without its port; null for IPs. */
302
+ function serverName(host: string | null): string | null {
303
+ if (host === null || host === "") return null;
304
+ let name = host;
305
+ if (name.startsWith("[")) {
306
+ const idx = name.indexOf("]");
307
+ if (idx !== -1) name = name.slice(1, idx);
308
+ return null;
309
+ }
310
+ const idx = name.indexOf(":");
311
+ if (idx !== -1) name = name.slice(0, idx);
312
+ return /^\d+\.\d+\.\d+\.\d+$/.test(name) ? null : name;
313
+ }
@@ -0,0 +1,80 @@
1
+ // undici 7.x's fast timers (lib/util/timers.js): one unref'd native timer
2
+ // ticking every 499 ms drives every headers/body timeout, so those fire on
3
+ // the first tick at least `delay` after the timer (re)started.
4
+ const RESOLUTION_MS = 1e3;
5
+ const TICK_MS = (RESOLUTION_MS >> 1) - 1;
6
+ const NOT_IN_LIST = -2;
7
+ const TO_BE_CLEARED = -1;
8
+ const PENDING = 0;
9
+ const ACTIVE = 1;
10
+
11
+ let fastNow = 0;
12
+ // The ticking native timer, held as its refresh closure.
13
+ let refreshTick: (() => void) | null = null;
14
+ const fastTimers: FastTimer[] = [];
15
+
16
+ function onTick(): void {
17
+ fastNow += TICK_MS;
18
+ let idx = 0;
19
+ let len = fastTimers.length;
20
+ while (idx < len) {
21
+ const timer = fastTimers[idx]!;
22
+ if (timer.state === PENDING) {
23
+ timer.idleStart = fastNow - TICK_MS;
24
+ timer.state = ACTIVE;
25
+ } else if (timer.state === ACTIVE && fastNow >= timer.idleStart + timer.idleTimeout) {
26
+ timer.state = TO_BE_CLEARED;
27
+ timer.idleStart = -1;
28
+ timer.onTimeout();
29
+ }
30
+ if (timer.state === TO_BE_CLEARED) {
31
+ timer.state = NOT_IN_LIST;
32
+ if (--len !== 0) fastTimers[idx] = fastTimers[len]!;
33
+ } else {
34
+ ++idx;
35
+ }
36
+ }
37
+ fastTimers.length = len;
38
+ // An idle tick stops; the next timer schedules a new one.
39
+ if (fastTimers.length !== 0) refreshTimeout();
40
+ else refreshTick = null;
41
+ }
42
+
43
+ function refreshTimeout(): void {
44
+ const refresh = refreshTick;
45
+ if (refresh !== null) {
46
+ refresh();
47
+ } else {
48
+ const timeout = setTimeout(onTick, TICK_MS);
49
+ timeout.unref();
50
+ refreshTick = () => {
51
+ timeout.refresh();
52
+ };
53
+ }
54
+ }
55
+
56
+ export class FastTimer {
57
+ state: number;
58
+ idleTimeout: number;
59
+ idleStart: number;
60
+ onTimeout: () => void;
61
+
62
+ constructor(callback: () => void, delay: number) {
63
+ this.state = NOT_IN_LIST;
64
+ this.idleTimeout = delay;
65
+ this.idleStart = -1;
66
+ this.onTimeout = callback;
67
+ this.refresh();
68
+ }
69
+
70
+ refresh(): void {
71
+ if (this.state === NOT_IN_LIST) fastTimers.push(this);
72
+ if (refreshTick === null || fastTimers.length === 1) refreshTimeout();
73
+ this.state = PENDING;
74
+ }
75
+
76
+ clear(): void {
77
+ this.state = TO_BE_CLEARED;
78
+ this.idleStart = -1;
79
+ }
80
+ }
@@ -0,0 +1,167 @@
1
+ // Types shared by the undici entries. They restate the subset of undici's
2
+ // own declarations (types/dispatcher.d.ts, connector.d.ts, ...) that the
3
+ // shim implements; test/package-shims/undici-types.test.ts checks them
4
+ // against the installed 5.x and 7.x declarations.
5
+ import type { Socket } from "node:net";
6
+ import type { Dispatcher } from "./dispatcher.ts";
7
+
8
+ /** Response and request header records (undici's IncomingHttpHeaders). */
9
+ export type IncomingHttpHeaders = Record<string, string | string[] | undefined>;
10
+
11
+ /** What a request's `headers` option accepts here: a record or a flat
12
+ * [name, value, ...] array. */
13
+ export type UndiciHeaders = Record<string, string | string[] | undefined> | string[] | null;
14
+
15
+ /** The payloads the shim writes. Streams, iterables, Blob and FormData
16
+ * bodies are outside the implemented subset. */
17
+ export type RequestBody = string | Buffer | Uint8Array | null;
18
+
19
+ export interface DispatchOptions {
20
+ origin?: string | URL;
21
+ path: string;
22
+ method: string;
23
+ body?: RequestBody;
24
+ headers?: UndiciHeaders;
25
+ idempotent?: boolean;
26
+ blocking?: boolean;
27
+ headersTimeout?: number | null;
28
+ bodyTimeout?: number | null;
29
+ reset?: boolean;
30
+ throwOnError?: boolean;
31
+ // Dispatcher.RequestOptions' members live here too: a record passed to
32
+ // dispatch() is copied to this shape, and interceptors read them back
33
+ // through a `params as Dispatcher.RequestOptions` cast, as with undici.
34
+ opaque?: unknown;
35
+ signal?: AbortSignal | null;
36
+ onInfo?: (info: { statusCode: number; headers: IncomingHttpHeaders }) => void;
37
+ highWaterMark?: number;
38
+ }
39
+
40
+ /** undici's dispatch-controller (7.x handler API). */
41
+ export interface DispatchController {
42
+ readonly aborted: boolean;
43
+ readonly paused: boolean;
44
+ readonly reason: Error | null;
45
+ abort(reason: Error): void;
46
+ pause(): void;
47
+ resume(): void;
48
+ }
49
+
50
+ /** Dispatch handlers: the 5.x callbacks, plus 7.x's controller callbacks. */
51
+ export interface DispatchHandlers {
52
+ onConnect?(abort: (err?: Error) => void): void;
53
+ onError?(err: Error): void;
54
+ onHeaders?(
55
+ statusCode: number,
56
+ headers: Buffer[],
57
+ resume: () => void,
58
+ statusText: string,
59
+ ): boolean;
60
+ onData?(chunk: Buffer): boolean;
61
+ onComplete?(trailers: string[] | null): void;
62
+ onBodySent?(chunkSize: number, totalBytesSent: number): void;
63
+ onRequestStart?(controller: DispatchController, context: unknown): void;
64
+ onResponseStart?(
65
+ controller: DispatchController,
66
+ statusCode: number,
67
+ headers: IncomingHttpHeaders,
68
+ statusMessage?: string,
69
+ ): void;
70
+ onResponseData?(controller: DispatchController, chunk: Buffer): void;
71
+ onResponseEnd?(controller: DispatchController, trailers: IncomingHttpHeaders): void;
72
+ onResponseError?(controller: DispatchController, error: Error): void;
73
+ }
74
+
75
+ export type DispatchFn = (options: DispatchOptions, handler: DispatchHandlers) => boolean;
76
+
77
+ export type DispatchInterceptor = (dispatch: DispatchFn) => DispatchFn;
78
+
79
+ /** buildConnector's per-connection parameters. */
80
+ export interface ConnectorOptions {
81
+ hostname: string;
82
+ host?: string;
83
+ protocol: string;
84
+ port: string;
85
+ servername?: string;
86
+ localAddress?: string | null;
87
+ }
88
+
89
+ export type ConnectorCallback = (err: Error | null, socket: Socket | null) => void;
90
+
91
+ /** A connector: dials, reports through the callback, and returns the socket
92
+ * (undici 5 and 7 both return it although their types declare void). */
93
+ export type Connector = (options: ConnectorOptions, callback: ConnectorCallback) => Socket;
94
+
95
+ /** net/tls connect options a connector forwards (the implemented subset). */
96
+ export interface ConnectorBuildOptions {
97
+ timeout?: number | null;
98
+ maxCachedSessions?: number | null;
99
+ socketPath?: string | null;
100
+ port?: number;
101
+ rejectUnauthorized?: boolean;
102
+ ca?: string | Buffer | (string | Buffer)[];
103
+ servername?: string;
104
+ /** net.connect's resolver hook: @types/node's LookupFunction is
105
+ * assignable (method syntax; the callback takes one address or all). */
106
+ lookup?(
107
+ hostname: string,
108
+ options: unknown,
109
+ callback: (
110
+ err: NodeJS.ErrnoException | null,
111
+ address: string | LookupAddress[],
112
+ family?: number,
113
+ ) => void,
114
+ ): void;
115
+ keepAlive?: boolean;
116
+ keepAliveInitialDelay?: number;
117
+ noDelay?: boolean;
118
+ autoSelectFamily?: boolean;
119
+ autoSelectFamilyAttemptTimeout?: number;
120
+ }
121
+
122
+ export interface LookupAddress {
123
+ address: string;
124
+ family: number;
125
+ }
126
+
127
+ export interface ClientOptions {
128
+ keepAliveTimeout?: number | null;
129
+ keepAliveMaxTimeout?: number | null;
130
+ keepAliveTimeoutThreshold?: number | null;
131
+ pipelining?: number | null;
132
+ connect?: ConnectorBuildOptions | Connector | null;
133
+ maxHeaderSize?: number | null;
134
+ bodyTimeout?: number | null;
135
+ headersTimeout?: number | null;
136
+ strictContentLength?: boolean;
137
+ maxRequestsPerClient?: number;
138
+ maxResponseSize?: number | null;
139
+ connectTimeout?: number | null;
140
+ localAddress?: string;
141
+ /** 5.x applies `Client` interceptors; 7.x ignores the option. */
142
+ interceptors?: { Client?: readonly DispatchInterceptor[] | undefined };
143
+ }
144
+
145
+ export interface PoolOptions extends ClientOptions {
146
+ factory?(origin: URL, opts: object): Dispatcher;
147
+ connections?: number | null;
148
+ interceptors?: {
149
+ Pool?: readonly DispatchInterceptor[] | undefined;
150
+ Client?: readonly DispatchInterceptor[] | undefined;
151
+ };
152
+ }
153
+
154
+ export interface AgentOptions extends PoolOptions {
155
+ factory?(origin: string | URL, opts: object): Dispatcher;
156
+ interceptors?: {
157
+ Agent?: readonly DispatchInterceptor[] | undefined;
158
+ Pool?: readonly DispatchInterceptor[] | undefined;
159
+ Client?: readonly DispatchInterceptor[] | undefined;
160
+ };
161
+ }
162
+
163
+ /** Version-dependent behavior, selected by the importing package's installed
164
+ * undici (the 5.x or 7.x entry). */
165
+ export interface Profile {
166
+ major: number;
167
+ }
@@ -0,0 +1,67 @@
1
+ // Helpers from undici's lib/core/util.js.
2
+ import { InvalidArgumentError } from "./errors.ts";
3
+ import type { IncomingHttpHeaders, Profile } from "./types.ts";
4
+
5
+ /** util.parseHeaders over raw [name, value, ...] pairs: lower-cased names,
6
+ * repeated names collected into arrays. 5.x decodes values as UTF-8 and
7
+ * treats an empty first value as absent; 7.x decodes latin1. */
8
+ export function parseHeaders(raw: readonly string[], profile: Profile): IncomingHttpHeaders {
9
+ const obj: IncomingHttpHeaders = {};
10
+ for (let i = 0; i + 1 < raw.length; i += 2) {
11
+ const key = raw[i]!.toLowerCase();
12
+ const value = raw[i + 1]!;
13
+ const existing = obj[key];
14
+ const absent = profile.major >= 7 ? existing === undefined : !existing;
15
+ if (absent) {
16
+ obj[key] = value;
17
+ } else if (typeof existing === "string") {
18
+ obj[key] = [existing, value];
19
+ } else if (existing !== undefined) {
20
+ existing.push(value);
21
+ }
22
+ }
23
+ return obj;
24
+ }
25
+
26
+ /** Raw header Buffers as strings (latin1 on 7.x, UTF-8 on 5.x). */
27
+ export function rawHeaderStrings(raw: readonly Buffer[], profile: Profile): string[] {
28
+ const out: string[] = [];
29
+ for (let i = 0; i < raw.length; i++) {
30
+ // Names are ASCII tokens; values follow the version's decoding.
31
+ out.push(
32
+ i % 2 === 0 || profile.major >= 7 ? raw[i]!.toString("latin1") : raw[i]!.toString("utf8"),
33
+ );
34
+ }
35
+ return out;
36
+ }
37
+
38
+ /** util.parseOrigin: an http(s) origin URL. */
39
+ export function parseOrigin(url: string | URL, profile: Profile): URL {
40
+ const parsed = parseURL(url, profile);
41
+ if (parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "") {
42
+ throw new InvalidArgumentError("invalid url");
43
+ }
44
+ return parsed;
45
+ }
46
+
47
+ /** util.parseURL for the string/URL forms. */
48
+ export function parseURL(url: string | URL, profile: Profile): URL {
49
+ const parsed = typeof url === "string" ? new URL(url) : url;
50
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
51
+ // 7.x checks only string inputs; 5.x checks every input.
52
+ if (profile.major < 7) throw new InvalidArgumentError("invalid protocol");
53
+ if (typeof url === "string") {
54
+ throw new InvalidArgumentError(
55
+ "Invalid URL protocol: the URL must start with `http:` or `https:`.",
56
+ );
57
+ }
58
+ }
59
+ return parsed;
60
+ }
61
+
62
+ /** util.parseKeepAliveTimeout: the server's Keep-Alive `timeout=<s>` hint in
63
+ * milliseconds, or null. */
64
+ export function parseKeepAliveTimeout(value: string): number | null {
65
+ const m = /timeout=(\d+)/.exec(value);
66
+ return m !== null ? parseInt(m[1]!, 10) * 1000 : null;
67
+ }