@scriptc/compiler 0.4.1 → 0.4.2

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 (680) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +582 -78
  2. package/dist/backend/cycle-analysis.d.ts +2 -1
  3. package/dist/backend/cycle-analysis.js +4 -4
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-mutability.d.ts +2 -1
  6. package/dist/backend/cycle-mutability.js +2 -2
  7. package/dist/backend/cycle-mutability.js.map +1 -1
  8. package/dist/backend/executable-features.js +4 -1
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +2 -1
  11. package/dist/backend/immutability.js +2 -2
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/library-pack.js +4 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +7 -3
  16. package/dist/backend/llvm/alloc.js +7 -4
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/array-search.js +2 -1
  19. package/dist/backend/llvm/array-search.js.map +1 -1
  20. package/dist/backend/llvm/bytes-loop-versions.d.ts +23 -2
  21. package/dist/backend/llvm/bytes-loop-versions.js +115 -19
  22. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  23. package/dist/backend/llvm/bytes-loop-versions.test.js +131 -0
  24. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +72 -1
  26. package/dist/backend/llvm/classes.js +331 -45
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +223 -16
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +1 -3
  31. package/dist/backend/llvm/common.js +1 -3
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/constant-callbacks.js +8 -4
  34. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  35. package/dist/backend/llvm/constant-callbacks.test.js +4 -4
  36. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  37. package/dist/backend/llvm/counted-loops.d.ts +4 -1
  38. package/dist/backend/llvm/counted-loops.js +62 -23
  39. package/dist/backend/llvm/counted-loops.js.map +1 -1
  40. package/dist/backend/llvm/dense-array-loops.d.ts +19 -16
  41. package/dist/backend/llvm/dense-array-loops.js +46 -10
  42. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  43. package/dist/backend/llvm/dense-array-loops.test.js +50 -14
  44. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  45. package/dist/backend/llvm/dyn.d.ts +25 -1
  46. package/dist/backend/llvm/dyn.js +331 -8
  47. package/dist/backend/llvm/dyn.js.map +1 -1
  48. package/dist/backend/llvm/emit-function.js +22 -6
  49. package/dist/backend/llvm/emit-function.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.js +17 -11
  51. package/dist/backend/llvm/emit-module.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.d.ts +0 -23
  53. package/dist/backend/llvm/emit-statements.js +325 -25
  54. package/dist/backend/llvm/emit-statements.js.map +1 -1
  55. package/dist/backend/llvm/emitter.d.ts +141 -15
  56. package/dist/backend/llvm/emitter.js +537 -64
  57. package/dist/backend/llvm/emitter.js.map +1 -1
  58. package/dist/backend/llvm/expr-async.js +19 -0
  59. package/dist/backend/llvm/expr-async.js.map +1 -1
  60. package/dist/backend/llvm/expr-bytes.d.ts +5 -2
  61. package/dist/backend/llvm/expr-bytes.js +110 -40
  62. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  63. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  64. package/dist/backend/llvm/expr-calls.js +34 -22
  65. package/dist/backend/llvm/expr-calls.js.map +1 -1
  66. package/dist/backend/llvm/expr-containers.js +21 -5
  67. package/dist/backend/llvm/expr-containers.js.map +1 -1
  68. package/dist/backend/llvm/expr-control.js +2 -3
  69. package/dist/backend/llvm/expr-control.js.map +1 -1
  70. package/dist/backend/llvm/expr-dynamic.js +54 -6
  71. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  72. package/dist/backend/llvm/expr-primitives.js +26 -8
  73. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  74. package/dist/backend/llvm/expr-stream-bridges.js +38 -6
  75. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  76. package/dist/backend/llvm/expr-stream-callbacks.js +131 -35
  77. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  78. package/dist/backend/llvm/lib-dispatch.js +10 -0
  79. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  80. package/dist/backend/llvm/lib-filesystem.js +61 -0
  81. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  82. package/dist/backend/llvm/lib-http2.d.ts +4 -0
  83. package/dist/backend/llvm/lib-http2.js +20 -17
  84. package/dist/backend/llvm/lib-http2.js.map +1 -1
  85. package/dist/backend/llvm/lib-process.js +65 -14
  86. package/dist/backend/llvm/lib-process.js.map +1 -1
  87. package/dist/backend/llvm/lib-shared.js +53 -1
  88. package/dist/backend/llvm/lib-shared.js.map +1 -1
  89. package/dist/backend/llvm/lib-stream.js +65 -28
  90. package/dist/backend/llvm/lib-stream.js.map +1 -1
  91. package/dist/backend/llvm/lib-tls.js +23 -0
  92. package/dist/backend/llvm/lib-tls.js.map +1 -1
  93. package/dist/backend/llvm/local-array-reads.js +66 -45
  94. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  95. package/dist/backend/llvm/local-array-reads.test.js +14 -0
  96. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  97. package/dist/backend/llvm/publish.d.ts +8 -1
  98. package/dist/backend/llvm/publish.js +64 -25
  99. package/dist/backend/llvm/publish.js.map +1 -1
  100. package/dist/backend/llvm/publish.test.js +3 -0
  101. package/dist/backend/llvm/publish.test.js.map +1 -1
  102. package/dist/backend/llvm/receivers.js +1 -1
  103. package/dist/backend/llvm/receivers.js.map +1 -1
  104. package/dist/backend/llvm/reference-writes.js +2 -0
  105. package/dist/backend/llvm/reference-writes.js.map +1 -1
  106. package/dist/backend/llvm/regex-matchers.js +161 -14
  107. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  108. package/dist/backend/llvm/regex-matchers.test.js +18 -0
  109. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  110. package/dist/backend/llvm/shapes.d.ts +9 -7
  111. package/dist/backend/llvm/shapes.js +12 -10
  112. package/dist/backend/llvm/shapes.js.map +1 -1
  113. package/dist/backend/llvm/string-lifetimes.test.js +2 -1
  114. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  115. package/dist/backend/llvm/string-reads.d.ts +3 -0
  116. package/dist/backend/llvm/string-reads.js +84 -0
  117. package/dist/backend/llvm/string-reads.js.map +1 -1
  118. package/dist/backend/llvm/wasm-modules.d.ts +6 -5
  119. package/dist/backend/llvm/wasm-modules.js +32 -9
  120. package/dist/backend/llvm/wasm-modules.js.map +1 -1
  121. package/dist/backend/mangle.d.ts +3 -0
  122. package/dist/backend/mangle.js +5 -0
  123. package/dist/backend/mangle.js.map +1 -1
  124. package/dist/backend/native/contracts.d.ts +22 -4
  125. package/dist/backend/native/executable.js +24 -8
  126. package/dist/backend/native/executable.js.map +1 -1
  127. package/dist/backend/native/library.js +1 -0
  128. package/dist/backend/native/library.js.map +1 -1
  129. package/dist/backend/native-codegen.d.ts +11 -6
  130. package/dist/backend/native-codegen.js +36 -9
  131. package/dist/backend/native-codegen.js.map +1 -1
  132. package/dist/backend/native-codegen.test.js +0 -23
  133. package/dist/backend/native-codegen.test.js.map +1 -1
  134. package/dist/backend/native-link-info-core.d.ts +14 -4
  135. package/dist/backend/native-link-info-core.js.map +1 -1
  136. package/dist/backend/optimization.d.ts +2 -2
  137. package/dist/backend/runtime-abi.d.ts +2 -2
  138. package/dist/backend/runtime-abi.js +2 -2
  139. package/dist/backend/runtime-pack-core.d.ts +1 -1
  140. package/dist/backend/runtime-pack-core.js +1 -1
  141. package/dist/backend/runtime-pack-core.js.map +1 -1
  142. package/dist/backend/runtime-pack-targets.test.js +4 -1
  143. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  144. package/dist/backend/runtime-pack.d.ts +0 -21
  145. package/dist/backend/runtime-pack.js +0 -29
  146. package/dist/backend/runtime-pack.js.map +1 -1
  147. package/dist/backend/runtime-pack.test.js +9 -69
  148. package/dist/backend/runtime-pack.test.js.map +1 -1
  149. package/dist/backend/target-diagnostics.js +31 -1
  150. package/dist/backend/target-diagnostics.js.map +1 -1
  151. package/dist/backend/warm-cache.js +3 -0
  152. package/dist/backend/warm-cache.js.map +1 -1
  153. package/dist/cli/command.js +26 -6
  154. package/dist/cli/command.js.map +1 -1
  155. package/dist/cli/usage.d.ts +5 -1
  156. package/dist/cli/usage.js +7 -2
  157. package/dist/cli/usage.js.map +1 -1
  158. package/dist/contracts/check.js +1 -1
  159. package/dist/contracts/check.js.map +1 -1
  160. package/dist/coverage/report.d.ts +7 -2
  161. package/dist/coverage/report.js +18 -0
  162. package/dist/coverage/report.js.map +1 -1
  163. package/dist/coverage/verdict-cache.d.ts +1 -0
  164. package/dist/coverage/verdict-cache.js +4 -0
  165. package/dist/coverage/verdict-cache.js.map +1 -1
  166. package/dist/coverage/verdict-semantic.js +4 -0
  167. package/dist/coverage/verdict-semantic.js.map +1 -1
  168. package/dist/diagnostics/diagnostic.js.map +1 -1
  169. package/dist/diagnostics/dynamic-tier.d.ts +40 -0
  170. package/dist/diagnostics/dynamic-tier.js +57 -0
  171. package/dist/diagnostics/dynamic-tier.js.map +1 -0
  172. package/dist/diagnostics/envelope.d.ts +2 -1
  173. package/dist/diagnostics/envelope.js +5 -2
  174. package/dist/diagnostics/envelope.js.map +1 -1
  175. package/dist/executable/executable-cache.d.ts +23 -1
  176. package/dist/executable/executable-cache.js +59 -7
  177. package/dist/executable/executable-cache.js.map +1 -1
  178. package/dist/executable/executable-cache.test.js +45 -3
  179. package/dist/executable/executable-cache.test.js.map +1 -1
  180. package/dist/executable/prepare.js +3 -1
  181. package/dist/executable/prepare.js.map +1 -1
  182. package/dist/frontend/analysis.js +1 -0
  183. package/dist/frontend/analysis.js.map +1 -1
  184. package/dist/frontend/dispose-hook.d.ts +2 -0
  185. package/dist/frontend/dispose-hook.js +14 -0
  186. package/dist/frontend/dispose-hook.js.map +1 -0
  187. package/dist/frontend/jsx-entities.d.ts +4 -0
  188. package/dist/frontend/jsx-entities.js +259 -0
  189. package/dist/frontend/jsx-entities.js.map +1 -0
  190. package/dist/frontend/jsx-source.d.ts +71 -0
  191. package/dist/frontend/jsx-source.js +781 -0
  192. package/dist/frontend/jsx-source.js.map +1 -0
  193. package/dist/frontend/jsx-source.test.d.ts +1 -0
  194. package/dist/frontend/jsx-source.test.js +200 -0
  195. package/dist/frontend/jsx-source.test.js.map +1 -0
  196. package/dist/frontend/literal-values.test.js +8 -9
  197. package/dist/frontend/literal-values.test.js.map +1 -1
  198. package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
  199. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  200. package/dist/frontend/lowering/array-values.js +3 -2
  201. package/dist/frontend/lowering/array-values.js.map +1 -1
  202. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  203. package/dist/frontend/lowering/binding-analysis.js +2 -2
  204. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  205. package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
  206. package/dist/frontend/lowering/builtins/arguments.js +30 -15
  207. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  208. package/dist/frontend/lowering/builtins/atomics.js +10 -6
  209. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  210. package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
  211. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
  213. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
  215. package/dist/frontend/lowering/builtins/crypto.js +59 -3
  216. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
  218. package/dist/frontend/lowering/builtins/date-classes.js +477 -0
  219. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
  220. package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
  221. package/dist/frontend/lowering/builtins/dates.js +55 -26
  222. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
  224. package/dist/frontend/lowering/builtins/dh.js +151 -0
  225. package/dist/frontend/lowering/builtins/dh.js.map +1 -0
  226. package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
  227. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
  229. package/dist/frontend/lowering/builtins/ecdh.js +7 -7
  230. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
  232. package/dist/frontend/lowering/builtins/errors.js +110 -0
  233. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
  235. package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
  236. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  237. package/dist/frontend/lowering/builtins/filesystem.js +6 -4
  238. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  239. package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
  240. package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
  241. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
  242. package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
  243. package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
  244. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/json.js +2 -1
  246. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  247. package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
  248. package/dist/frontend/lowering/builtins/key-object.js +20 -7
  249. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  250. package/dist/frontend/lowering/builtins/module-calls.js +11 -4
  251. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  252. package/dist/frontend/lowering/builtins/numbers.js +9 -5
  253. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  254. package/dist/frontend/lowering/builtins/operating-system.js +4 -3
  255. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  256. package/dist/frontend/lowering/builtins/performance.js +3 -2
  257. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/process.js +3 -2
  259. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  260. package/dist/frontend/lowering/builtins/promises.js +3 -2
  261. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  262. package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
  263. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/readline.d.ts +2 -1
  265. package/dist/frontend/lowering/builtins/readline.js +23 -6
  266. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/strings.js +13 -5
  268. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
  270. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  271. package/dist/frontend/lowering/builtins/timers.js +1 -1
  272. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  273. package/dist/frontend/lowering/builtins/url.js +4 -3
  274. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/v8.js +2 -1
  276. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  277. package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
  278. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
  279. package/dist/frontend/lowering/call-arguments.js +2 -1
  280. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  281. package/dist/frontend/lowering/call-signatures.js +13 -6
  282. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  283. package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
  284. package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
  285. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
  286. package/dist/frontend/lowering/class-assertions.js +3 -2
  287. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  288. package/dist/frontend/lowering/class-construction.d.ts +2 -1
  289. package/dist/frontend/lowering/class-construction.js +8 -13
  290. package/dist/frontend/lowering/class-construction.js.map +1 -1
  291. package/dist/frontend/lowering/class-descriptors.js +1 -1
  292. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  293. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +34 -0
  294. package/dist/frontend/lowering/class-dynamic-dispatch.js +568 -151
  295. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  296. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +77 -0
  297. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  298. package/dist/frontend/lowering/class-method-mutations.js +3 -0
  299. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  300. package/dist/frontend/lowering/class-method-values.js +1 -1
  301. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  302. package/dist/frontend/lowering/class-protocols.d.ts +7 -0
  303. package/dist/frontend/lowering/class-protocols.js +64 -4
  304. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  305. package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
  306. package/dist/frontend/lowering/class-prototypes.js +36 -3
  307. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  308. package/dist/frontend/lowering/class-to-primitive.js +25 -5
  309. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  310. package/dist/frontend/lowering/class-unions.js +2 -1
  311. package/dist/frontend/lowering/class-unions.js.map +1 -1
  312. package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
  313. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  314. package/dist/frontend/lowering/coercions/structural.js +8 -7
  315. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  316. package/dist/frontend/lowering/coercions/unions.js +8 -7
  317. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  318. package/dist/frontend/lowering/collection-ingestion.js +2 -1
  319. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  320. package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
  321. package/dist/frontend/lowering/containers/array-callbacks.js +14 -13
  322. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  323. package/dist/frontend/lowering/containers/array-concat.js +2 -1
  324. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  325. package/dist/frontend/lowering/containers/array-construction.js +25 -4
  326. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  327. package/dist/frontend/lowering/containers/array-methods.js +6 -5
  328. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  329. package/dist/frontend/lowering/containers/array-pipelines.js +2 -1
  330. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  331. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  332. package/dist/frontend/lowering/containers/bytes.js +129 -28
  333. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  334. package/dist/frontend/lowering/containers/callback-arguments.js +52 -2
  335. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  336. package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
  337. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  338. package/dist/frontend/lowering/containers/collection-methods.js +8 -7
  339. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  340. package/dist/frontend/lowering/containers/indexed-objects.js +8 -7
  341. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  342. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
  343. package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
  344. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  345. package/dist/frontend/lowering/containers/string-and-regexp.js +36 -9
  346. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  347. package/dist/frontend/lowering/containers/string-replacement.js +2 -1
  348. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  349. package/dist/frontend/lowering/cycle-initialization.js +25 -4
  350. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  351. package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
  352. package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
  353. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  354. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  355. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  356. package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
  357. package/dist/frontend/lowering/dispatch-sites.js +204 -0
  358. package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
  359. package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
  360. package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
  361. package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
  362. package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
  363. package/dist/frontend/lowering/dyn-streams.js +1 -1
  364. package/dist/frontend/lowering/dyn-streams.js.map +1 -1
  365. package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
  366. package/dist/frontend/lowering/dynamic-tier.js +327 -0
  367. package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
  368. package/dist/frontend/lowering/error-methods.js +4 -0
  369. package/dist/frontend/lowering/error-methods.js.map +1 -1
  370. package/dist/frontend/lowering/expressions/array-literals.js +15 -0
  371. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  372. package/dist/frontend/lowering/expressions/binary.js +45 -3
  373. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  374. package/dist/frontend/lowering/expressions/element-access.js +17 -1
  375. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  376. package/dist/frontend/lowering/expressions/identifiers.js +46 -7
  377. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  378. package/dist/frontend/lowering/expressions/narrowing.js +35 -5
  379. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  380. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -3
  381. package/dist/frontend/lowering/expressions/object-literals.js +27 -6
  382. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  383. package/dist/frontend/lowering/expressions/optional-chains.js +5 -5
  384. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  385. package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
  386. package/dist/frontend/lowering/expressions/property-access.js +99 -7
  387. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  388. package/dist/frontend/lowering/expressions/relational.js +63 -5
  389. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  390. package/dist/frontend/lowering/expressions/updates.js +63 -9
  391. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  392. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
  393. package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
  394. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  395. package/dist/frontend/lowering/generic-functions.d.ts +42 -1
  396. package/dist/frontend/lowering/generic-functions.js +448 -18
  397. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  398. package/dist/frontend/lowering/intern-tables.js +2 -1
  399. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  400. package/dist/frontend/lowering/iterator-adapters.js +9 -8
  401. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  402. package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
  403. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
  404. package/dist/frontend/lowering/json-require.js +2 -1
  405. package/dist/frontend/lowering/json-require.js.map +1 -1
  406. package/dist/frontend/lowering/key-order-witness.d.ts +7 -2
  407. package/dist/frontend/lowering/key-order-witness.js +21 -4
  408. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  409. package/dist/frontend/lowering/key-order-witness.test.js +38 -2
  410. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  411. package/dist/frontend/lowering/lifetime-regions.js +2 -1
  412. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  413. package/dist/frontend/lowering/lower-assert.js +6 -5
  414. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  415. package/dist/frontend/lowering/lower-async-iteration.js +3 -1
  416. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  417. package/dist/frontend/lowering/lower-calls.d.ts +4 -0
  418. package/dist/frontend/lowering/lower-calls.js +339 -91
  419. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  420. package/dist/frontend/lowering/lower-classes.d.ts +18 -0
  421. package/dist/frontend/lowering/lower-classes.js +280 -25
  422. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  423. package/dist/frontend/lowering/lower-dgram.js +3 -2
  424. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  425. package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
  426. package/dist/frontend/lowering/lower-event-emitter.js +267 -20
  427. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  428. package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
  429. package/dist/frontend/lowering/lower-exprs.js +116 -11
  430. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  431. package/dist/frontend/lowering/lower-functions.js +304 -72
  432. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  433. package/dist/frontend/lowering/lower-inspect.js +10 -6
  434. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  435. package/dist/frontend/lowering/lower-mixins.js +2 -1
  436. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  437. package/dist/frontend/lowering/lower-mock.js +2 -1
  438. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  439. package/dist/frontend/lowering/lower-modules.js +15 -5
  440. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  441. package/dist/frontend/lowering/lower-modules.test.js +2 -2
  442. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  443. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
  444. package/dist/frontend/lowering/lower-namespaces.js +4 -3
  445. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  446. package/dist/frontend/lowering/lower-server.d.ts +10 -0
  447. package/dist/frontend/lowering/lower-server.js +237 -59
  448. package/dist/frontend/lowering/lower-server.js.map +1 -1
  449. package/dist/frontend/lowering/lower-stdlib.js +12 -10
  450. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  451. package/dist/frontend/lowering/lower-stmts.js +168 -20
  452. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  453. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  454. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  455. package/dist/frontend/lowering/lower-stream.js +575 -165
  456. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  457. package/dist/frontend/lowering/lower-timers.js +4 -3
  458. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  459. package/dist/frontend/lowering/lowerer.d.ts +125 -28
  460. package/dist/frontend/lowering/lowerer.js +557 -63
  461. package/dist/frontend/lowering/lowerer.js.map +1 -1
  462. package/dist/frontend/lowering/lowerer.test.js +21 -9
  463. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  464. package/dist/frontend/lowering/narrowing-stability.js +5 -0
  465. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  466. package/dist/frontend/lowering/native-ffi.js +1 -1
  467. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  468. package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
  469. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  470. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  471. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  472. package/dist/frontend/lowering/private-brands.d.ts +9 -0
  473. package/dist/frontend/lowering/private-brands.js +66 -15
  474. package/dist/frontend/lowering/private-brands.js.map +1 -1
  475. package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
  476. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  477. package/dist/frontend/lowering/require-initialization.js +2 -1
  478. package/dist/frontend/lowering/require-initialization.js.map +1 -1
  479. package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
  480. package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
  481. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  482. package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
  483. package/dist/frontend/lowering/runtime-optional-records.js +18 -5
  484. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  485. package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
  486. package/dist/frontend/lowering/site-dependencies.js +84 -0
  487. package/dist/frontend/lowering/site-dependencies.js.map +1 -0
  488. package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
  489. package/dist/frontend/lowering/site-dependencies.test.js +53 -0
  490. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
  491. package/dist/frontend/lowering/stable-names.d.ts +11 -0
  492. package/dist/frontend/lowering/stable-names.js +35 -0
  493. package/dist/frontend/lowering/stable-names.js.map +1 -0
  494. package/dist/frontend/lowering/static-typeof.d.ts +2 -2
  495. package/dist/frontend/lowering/static-typeof.js +42 -3
  496. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  497. package/dist/frontend/lowering/strict-equality.js +2 -1
  498. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  499. package/dist/frontend/lowering/structural-positions.d.ts +32 -0
  500. package/dist/frontend/lowering/structural-positions.js +108 -0
  501. package/dist/frontend/lowering/structural-positions.js.map +1 -0
  502. package/dist/frontend/lowering/surfaces.js +42 -26
  503. package/dist/frontend/lowering/surfaces.js.map +1 -1
  504. package/dist/frontend/lowering/var-hoisting.js +37 -3
  505. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  506. package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
  507. package/dist/frontend/npm-static-tsc-helpers.js +106 -0
  508. package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
  509. package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
  510. package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
  511. package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
  512. package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
  513. package/dist/frontend/npm-static-type-exports-host.js +214 -0
  514. package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
  515. package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
  516. package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
  517. package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
  518. package/dist/frontend/npm-static-type-exports.d.ts +52 -0
  519. package/dist/frontend/npm-static-type-exports.js +261 -0
  520. package/dist/frontend/npm-static-type-exports.js.map +1 -0
  521. package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
  522. package/dist/frontend/npm-static-type-exports.test.js +103 -0
  523. package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
  524. package/dist/frontend/npm-static-umd.d.ts +6 -0
  525. package/dist/frontend/npm-static-umd.js +203 -0
  526. package/dist/frontend/npm-static-umd.js.map +1 -0
  527. package/dist/frontend/npm-static-umd.test.d.ts +1 -0
  528. package/dist/frontend/npm-static-umd.test.js +105 -0
  529. package/dist/frontend/npm-static-umd.test.js.map +1 -0
  530. package/dist/frontend/npm-static.d.ts +8 -0
  531. package/dist/frontend/npm-static.js +47 -2
  532. package/dist/frontend/npm-static.js.map +1 -1
  533. package/dist/frontend/program.d.ts +13 -0
  534. package/dist/frontend/program.js +103 -6
  535. package/dist/frontend/program.js.map +1 -1
  536. package/dist/frontend/program.test.js +1 -1
  537. package/dist/frontend/program.test.js.map +1 -1
  538. package/dist/frontend/services.d.ts +6 -0
  539. package/dist/frontend/services.js +18 -0
  540. package/dist/frontend/services.js.map +1 -1
  541. package/dist/frontend/ts7/ast-node.d.ts +21 -7
  542. package/dist/frontend/ts7/ast-node.js +131 -29
  543. package/dist/frontend/ts7/ast-node.js.map +1 -1
  544. package/dist/frontend/ts7/ast-node.test.js +60 -0
  545. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  546. package/dist/frontend/ts7/ast-wire.d.ts +27 -2
  547. package/dist/frontend/ts7/ast-wire.js +124 -21
  548. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  549. package/dist/frontend/ts7/ast.d.ts +23 -2
  550. package/dist/frontend/ts7/ast.js +143 -2
  551. package/dist/frontend/ts7/ast.js.map +1 -1
  552. package/dist/frontend/ts7/checker.d.ts +13 -1
  553. package/dist/frontend/ts7/checker.js +75 -1
  554. package/dist/frontend/ts7/checker.js.map +1 -1
  555. package/dist/frontend/ts7/checker.test.js +9 -6
  556. package/dist/frontend/ts7/checker.test.js.map +1 -1
  557. package/dist/frontend/ts7/enums.d.ts +3 -3
  558. package/dist/frontend/ts7/enums.generated.d.ts +10 -0
  559. package/dist/frontend/ts7/enums.generated.js +21 -0
  560. package/dist/frontend/ts7/enums.generated.js.map +1 -1
  561. package/dist/frontend/ts7/enums.js +19 -0
  562. package/dist/frontend/ts7/enums.js.map +1 -1
  563. package/dist/frontend/ts7/program-host.js +5 -2
  564. package/dist/frontend/ts7/program-host.js.map +1 -1
  565. package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
  566. package/dist/frontend/ts7/semantic-checker.js +25 -20
  567. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  568. package/dist/frontend/ts7/semantic-json.d.ts +13 -0
  569. package/dist/frontend/ts7/semantic-json.js +146 -0
  570. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  571. package/dist/frontend/ts7/semantic-json.test.js +57 -1
  572. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  573. package/dist/frontend/ts7/semantic-model.d.ts +15 -0
  574. package/dist/frontend/ts7/semantic-model.js +67 -19
  575. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  576. package/dist/frontend/ts7/semantic-model.test.js +3 -2
  577. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  578. package/dist/frontend/ts7/session.js +1 -1
  579. package/dist/frontend/ts7/session.js.map +1 -1
  580. package/dist/frontend/tsc-codes.d.ts +1 -1
  581. package/dist/frontend/tsc-codes.js +7 -0
  582. package/dist/frontend/tsc-codes.js.map +1 -1
  583. package/dist/frontend/type-mapper.d.ts +38 -6
  584. package/dist/frontend/type-mapper.js +265 -32
  585. package/dist/frontend/type-mapper.js.map +1 -1
  586. package/dist/frontend/type-mapper.test.js +1 -1
  587. package/dist/frontend/type-mapper.test.js.map +1 -1
  588. package/dist/frontend-process-args.d.ts +4 -0
  589. package/dist/frontend-process-args.js +52 -0
  590. package/dist/frontend-process-args.js.map +1 -0
  591. package/dist/frontend-process-args.test.d.ts +1 -0
  592. package/dist/frontend-process-args.test.js +47 -0
  593. package/dist/frontend-process-args.test.js.map +1 -0
  594. package/dist/frontend-process.d.ts +1 -0
  595. package/dist/frontend-process.js +23 -0
  596. package/dist/frontend-process.js.map +1 -0
  597. package/dist/heap-collection.d.ts +16 -0
  598. package/dist/heap-collection.js +42 -0
  599. package/dist/heap-collection.js.map +1 -0
  600. package/dist/heap-collection.test.d.ts +1 -0
  601. package/dist/heap-collection.test.js +59 -0
  602. package/dist/heap-collection.test.js.map +1 -0
  603. package/dist/heap-pressure.d.ts +2 -0
  604. package/dist/heap-pressure.js +12 -0
  605. package/dist/heap-pressure.js.map +1 -0
  606. package/dist/index.d.ts +7 -0
  607. package/dist/index.js +402 -86
  608. package/dist/index.js.map +1 -1
  609. package/dist/ir/array-length-stability.js +7 -0
  610. package/dist/ir/array-length-stability.js.map +1 -1
  611. package/dist/ir/array-length-stability.test.js +25 -0
  612. package/dist/ir/array-length-stability.test.js.map +1 -1
  613. package/dist/ir/builtin-effects.js +28 -0
  614. package/dist/ir/builtin-effects.js.map +1 -1
  615. package/dist/ir/builtin-signatures.d.ts +5 -1
  616. package/dist/ir/builtin-signatures.js +141 -12
  617. package/dist/ir/builtin-signatures.js.map +1 -1
  618. package/dist/ir/final-fields.d.ts +2 -1
  619. package/dist/ir/final-fields.js +2 -2
  620. package/dist/ir/final-fields.js.map +1 -1
  621. package/dist/ir/function-references.test.js +2 -0
  622. package/dist/ir/function-references.test.js.map +1 -1
  623. package/dist/ir/int32-slots.d.ts +13 -5
  624. package/dist/ir/int32-slots.js +112 -115
  625. package/dist/ir/int32-slots.js.map +1 -1
  626. package/dist/ir/int32-slots.test.js +3 -1
  627. package/dist/ir/int32-slots.test.js.map +1 -1
  628. package/dist/ir/integer-loop-facts.d.ts +9 -4
  629. package/dist/ir/integer-loop-facts.js +93 -18
  630. package/dist/ir/integer-loop-facts.js.map +1 -1
  631. package/dist/ir/integer-loops.d.ts +49 -0
  632. package/dist/ir/integer-loops.js +193 -39
  633. package/dist/ir/integer-loops.js.map +1 -1
  634. package/dist/ir/integer-loops.test.js +201 -1
  635. package/dist/ir/integer-loops.test.js.map +1 -1
  636. package/dist/ir/integer-ranges.test.js +64 -0
  637. package/dist/ir/integer-ranges.test.js.map +1 -1
  638. package/dist/ir/ir.d.ts +17 -2
  639. package/dist/ir/ir.js +3 -1
  640. package/dist/ir/ir.js.map +1 -1
  641. package/dist/ir/runtime-features.d.ts +31 -7
  642. package/dist/ir/runtime-features.js +138 -11
  643. package/dist/ir/runtime-features.js.map +1 -1
  644. package/dist/ir/tiers.js +1 -0
  645. package/dist/ir/tiers.js.map +1 -1
  646. package/dist/ir/traverse.d.ts +2 -0
  647. package/dist/ir/traverse.js +14 -2
  648. package/dist/ir/traverse.js.map +1 -1
  649. package/dist/ir/validate.js +56 -16
  650. package/dist/ir/validate.js.map +1 -1
  651. package/dist/library/ir-policy.js +10 -0
  652. package/dist/library/ir-policy.js.map +1 -1
  653. package/dist/library/library-cache.d.ts +2 -0
  654. package/dist/library/library-cache.js.map +1 -1
  655. package/dist/library/prepare.js +2 -0
  656. package/dist/library/prepare.js.map +1 -1
  657. package/dist/native/cli.js +5 -0
  658. package/dist/native/cli.js.map +1 -1
  659. package/dist/native/prepare.js +5 -1
  660. package/dist/native/prepare.js.map +1 -1
  661. package/dist/native/sanitizer.test.js +4 -1
  662. package/dist/native/sanitizer.test.js.map +1 -1
  663. package/dist/startup-cache.d.ts +1 -0
  664. package/dist/startup-cache.js +1 -0
  665. package/dist/startup-cache.js.map +1 -1
  666. package/dist/text-parts.d.ts +7 -0
  667. package/dist/text-parts.js +44 -0
  668. package/dist/text-parts.js.map +1 -1
  669. package/dist/text-parts.test.d.ts +1 -0
  670. package/dist/text-parts.test.js +46 -0
  671. package/dist/text-parts.test.js.map +1 -0
  672. package/dist/timing.d.ts +9 -2
  673. package/dist/timing.js +7 -4
  674. package/dist/timing.js.map +1 -1
  675. package/dist/wasm/translate.d.ts +4 -0
  676. package/dist/wasm/translate.js +2 -2
  677. package/dist/wasm/translate.js.map +1 -1
  678. package/package.json +21 -21
  679. package/shims/undici/core/client.ts +4 -4
  680. package/surface-manifest.json +19 -49
@@ -1,3 +1,4 @@
1
+ import { keyedHelperName } from "./stable-names.js";
1
2
  import { dynUndefinedExpr, nodeThrowExpr, boolLit, numLit, strLit, varRef, } from "../../ir/build.js";
2
3
  import * as ts from "../ts7/adapter.js";
3
4
  import { ladderFenceExpr } from "./lowerer.js";
@@ -124,7 +125,7 @@ export function voidizedCallback(lowerer, cb, loc) {
124
125
  const toT = funcOf([...fromT.params], VOID);
125
126
  const key = `server.voidcb:${typeKey(fromT)}`;
126
127
  const existing = lowerer.arrHofHelpers.get(key);
127
- const name = existing ?? `%server.voidcb.${lowerer.arrHofHelpers.size}`;
128
+ const name = existing ?? keyedHelperName(lowerer, "%server.voidcb", key);
128
129
  if (!existing) {
129
130
  lowerer.arrHofHelpers.set(key, name);
130
131
  const impl = `${name}.impl`;
@@ -197,7 +198,7 @@ function lowerSocketDynListener(lowerer, node, what) {
197
198
  function receiverReturningCall(lowerer, fn, callArgs, recvT, loc, opts) {
198
199
  const key = `server.recvret:${fn}:${opts?.prefix?.fn ?? ""}:${(opts?.mainArgIndices ?? []).join(".")}:${callArgs.map((a) => typeKey(a.type)).join(",")}`;
199
200
  const existing = lowerer.arrHofHelpers.get(key);
200
- const name = existing ?? `%server.recvret.${lowerer.arrHofHelpers.size}`;
201
+ const name = existing ?? keyedHelperName(lowerer, "%server.recvret", key);
201
202
  if (!existing) {
202
203
  lowerer.arrHofHelpers.set(key, name);
203
204
  const params = callArgs.map((a, i) => ({ localId: `p${i}.0`, name: `p${i}`, type: a.type }));
@@ -472,7 +473,7 @@ function h2HeadersCallbackAdapter(lowerer, node, what, handleKind, withStatus, l
472
473
  const toT = funcOf(abiParams.map((p) => p.type), VOID);
473
474
  const key = `h2.hdrcb:${handleKind}:${withStatus}:${typeKey(fromT)}:${shapeId ?? ""}`;
474
475
  const existing = lowerer.arrHofHelpers.get(key);
475
- const name = existing ?? `%h2.hdrcb.${lowerer.arrHofHelpers.size}`;
476
+ const name = existing ?? keyedHelperName(lowerer, "%h2.hdrcb", key);
476
477
  if (!existing) {
477
478
  lowerer.arrHofHelpers.set(key, name);
478
479
  const impl = `${name}.impl`;
@@ -2318,6 +2319,18 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
2318
2319
  loc,
2319
2320
  };
2320
2321
  }
2322
+ if (event === "secure") {
2323
+ // The handshake's completion on a TLS socket (after secureConnect on
2324
+ // a client); plain sockets never fire it.
2325
+ const { cb } = lowerCallbackArg(lowerer, args[1], "secure listeners", 0, () => false, "use ()", []);
2326
+ return {
2327
+ kind: "libCall",
2328
+ fn: "tls.sockOnSecure",
2329
+ args: [receiver, cb, once],
2330
+ type: VOID,
2331
+ loc,
2332
+ };
2333
+ }
2321
2334
  if (event === "session") {
2322
2335
  // The received-ticket event: fires once per TLS client socket with
2323
2336
  // the serialized session (a Buffer); plain sockets never fire it.
@@ -2330,7 +2343,7 @@ function lowerNetSocketMethodCall(lowerer, call, access) {
2330
2343
  loc,
2331
2344
  };
2332
2345
  }
2333
- lowerer.noLowering(`socket.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"data", "end", "close", "error", "connect", "lookup", "ready", "timeout", "readable", "secureConnect", and "session" are the supported socket events (as literals)');
2346
+ lowerer.noLowering(`socket.${name}(${event === null ? "non-literal event" : `"${event}"`}, ...)`, args[0], '"data", "end", "close", "error", "connect", "lookup", "ready", "timeout", "readable", "secureConnect", "secure", and "session" are the supported socket events (as literals)');
2334
2347
  }
2335
2348
  lowerer.noLowering(`Socket.${name}`, call, "write, end, destroy, pipe, setTimeout, setKeepAlive, setNoDelay, the address fields, read, unshift, and on/once of data/end/close/error/connect/ready/timeout/readable are the supported Socket members", lowerer.checker.getSymbolAtLocation(access.name));
2336
2349
  }
@@ -2770,7 +2783,7 @@ export function lowerCompatReqStreamOptionalCall(lowerer, call) {
2770
2783
  type: unionT,
2771
2784
  loc,
2772
2785
  };
2773
- const id = `chain.${lowerer.chainCounter++}`;
2786
+ const id = lowerer.closureName(loc, "", "chain");
2774
2787
  const body = lowerH2StreamMethodCall(lowerer, call, call.expression, {
2775
2788
  kind: "chainRecv",
2776
2789
  id,
@@ -3488,7 +3501,7 @@ function lowerHttpCreateServerForms(lowerer, expr, what, loc) {
3488
3501
  const hasMax = opts.maxHeaderSize !== null;
3489
3502
  const key = `server.opts:${opts.joinDup ? 1 : 0}:${opts.allowMissingHost ? 1 : 0}:${hasBuffer ? 1 : 0}:${hasMax ? 1 : 0}`;
3490
3503
  const existing = lowerer.arrHofHelpers.get(key);
3491
- const name = existing ?? `%server.opts.${lowerer.arrHofHelpers.size}`;
3504
+ const name = existing ?? keyedHelperName(lowerer, "%server.opts", key);
3492
3505
  if (!existing) {
3493
3506
  lowerer.arrHofHelpers.set(key, name);
3494
3507
  const params = [
@@ -3710,6 +3723,96 @@ export function lowerHttpServerNew(lowerer, expr) {
3710
3723
  return null;
3711
3724
  return lowerHttpCreateServerForms(lowerer, expr, "new http.Server", locOf(expr));
3712
3725
  }
3726
+ /** `new tls.TLSSocket(socket, options)` in server mode: a new TLS socket
3727
+ * takes over the socket's connection and runs the server handshake
3728
+ * (scr_tls_wrap_socket). The options record reads at runtime, the
3729
+ * tls.connect precedent. A literal's secureContext member is a
3730
+ * SecureContext handle, which the checked-dynamic record cannot hold, so
3731
+ * it passes as its own argument; members after it must be free of side
3732
+ * effects, because it is read after them. Node never starts the handshake
3733
+ * of a client-mode TLSSocket, so a literal without isServer: true fences
3734
+ * here. */
3735
+ export function lowerTlsSocketNew(lowerer, expr) {
3736
+ const callee = expr.expression;
3737
+ const isTlsSocket = (ts.isPropertyAccessExpression(callee) &&
3738
+ callee.name.text === "TLSSocket" &&
3739
+ lowerer.builtinMemberOf(callee)?.module === "tls") ||
3740
+ (ts.isIdentifier(callee) &&
3741
+ lowerer.builtinImportOf(callee)?.module === "tls" &&
3742
+ lowerer.builtinImportOf(callee)?.member === "TLSSocket");
3743
+ if (!isTlsSocket)
3744
+ return null;
3745
+ const loc = locOf(expr);
3746
+ const HINT = "the supported forms are new tls.TLSSocket(socket, { isServer: true, cert, key }) and new tls.TLSSocket(socket, { isServer: true, secureContext })";
3747
+ const args = expr.arguments?.nodes ?? [];
3748
+ if (args.length !== 2 || args.some(ts.isSpreadElement)) {
3749
+ lowerer.noLowering(`new tls.TLSSocket with ${args.length} argument(s)`, expr, HINT);
3750
+ }
3751
+ const socket = lowerer.lowerExpr(args[0]);
3752
+ if (socket.type.kind !== "netSocket") {
3753
+ lowerer.noLowering(`new tls.TLSSocket over a '${lowerer.fmt(socket.type)}' value`, args[0], "the wrapped value must be a net.Socket (a server connection or an http CONNECT socket)");
3754
+ }
3755
+ let optsNode = args[1];
3756
+ while (ts.isParenthesizedExpression(optsNode))
3757
+ optsNode = optsNode.expression;
3758
+ if (!ts.isObjectLiteralExpression(optsNode)) {
3759
+ const o = lowerer.lowerExpr(optsNode);
3760
+ const opts = o.type.kind === "dyn"
3761
+ ? o
3762
+ : canConvertToDyn(o.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))
3763
+ ? { kind: "dynFrom", value: o, type: DYN, loc }
3764
+ : lowerer.noLowering(`new tls.TLSSocket with a '${lowerer.fmt(o.type)}' options record`, optsNode, `${HINT} — a secureContext member lowers in an options object literal`);
3765
+ return { kind: "libCall", fn: "tls.wrapSocket", args: [socket, opts], type: NETSOCKET_T, loc };
3766
+ }
3767
+ const props = optsNode.properties.nodes;
3768
+ const nameOf = (p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
3769
+ (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name))
3770
+ ? p.name.text
3771
+ : null;
3772
+ const isServer = props.find((p) => nameOf(p) === "isServer");
3773
+ if (isServer === undefined ||
3774
+ (ts.isPropertyAssignment(isServer) && isServer.initializer.kind === ts.SyntaxKind.FalseKeyword)) {
3775
+ lowerer.noLowering("new tls.TLSSocket in client mode", optsNode, "Node starts no handshake for a client-mode TLSSocket — pass isServer: true for the server side; tls.connect makes client sockets");
3776
+ }
3777
+ const ctxIndex = props.findIndex((p) => nameOf(p) === "secureContext");
3778
+ if (ctxIndex < 0) {
3779
+ const opts = lowerDynObjectLiteral(lowerer, optsNode);
3780
+ return { kind: "libCall", fn: "tls.wrapSocket", args: [socket, opts], type: NETSOCKET_T, loc };
3781
+ }
3782
+ const ctxProp = props[ctxIndex];
3783
+ const ctxNode = ts.isShorthandPropertyAssignment(ctxProp)
3784
+ ? ctxProp.name
3785
+ : ctxProp.initializer;
3786
+ for (const p of props.slice(ctxIndex + 1)) {
3787
+ const pure = ts.isShorthandPropertyAssignment(p) ||
3788
+ (ts.isPropertyAssignment(p) && sideEffectFreeOptionValue(p.initializer));
3789
+ if (!pure) {
3790
+ lowerer.noLowering("a new tls.TLSSocket options literal with side effects after secureContext", p, "secureContext is read after the other members — move it to the end of the object");
3791
+ }
3792
+ }
3793
+ let ctx = null;
3794
+ const opts = lowerDynObjectLiteral(lowerer, optsNode, (node, value) => {
3795
+ if (node !== ctxNode)
3796
+ return lowerer.coerceToExpected(value, DYN);
3797
+ if (value.type.kind !== "secureCtx") {
3798
+ lowerer.noLowering(`a '${lowerer.fmt(value.type)}' secureContext`, node, "pass a tls.createSecureContext({ cert, key }) result");
3799
+ }
3800
+ ctx = value;
3801
+ return {
3802
+ kind: "dynFrom",
3803
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
3804
+ type: DYN,
3805
+ loc,
3806
+ };
3807
+ });
3808
+ return {
3809
+ kind: "libCall",
3810
+ fn: "tls.wrapSocketCtx",
3811
+ args: [socket, opts, ctx],
3812
+ type: NETSOCKET_T,
3813
+ loc,
3814
+ };
3815
+ }
3713
3816
  /** Module-function calls on http import bindings: createServer([options][,
3714
3817
  * handler]) and the call-form Server (Node's constructor works without
3715
3818
  * `new` — test/parallel's http.Server(fn) spelling). The handler takes
@@ -3758,13 +3861,15 @@ function lowerHttpModuleCall(lowerer, expr, bi, loc) {
3758
3861
  * runtime-valued (dyn) entry rides the tls.pemDyn extraction, throwing
3759
3862
  * the fence at runtime for non-PEM kinds (the divergence-66 stance).
3760
3863
  * Every other key fences by name; SNICallback gets the pointed hint. */
3761
- function lowerTlsServerOptions(lowerer, node, what) {
3864
+ function lowerTlsServerOptions(lowerer, node, what, allowSni = false) {
3762
3865
  if (!ts.isObjectLiteralExpression(node)) {
3763
3866
  lowerer.noLowering(`${what} with a non-literal options argument`, node, "pass the options as an object literal: { cert, key }");
3764
3867
  }
3765
3868
  const loc = locOf(node);
3766
3869
  let cert = null;
3767
3870
  let key = null;
3871
+ let sni;
3872
+ let pendingSni = null;
3768
3873
  for (const prop of node.properties.nodes) {
3769
3874
  let initializer;
3770
3875
  if (ts.isPropertyAssignment(prop) &&
@@ -3778,6 +3883,25 @@ function lowerTlsServerOptions(lowerer, node, what) {
3778
3883
  lowerer.noLowering(`${what} options with computed keys or spreads`, prop, "each option must be a plain `name: value` (or shorthand) entry with a literal key");
3779
3884
  }
3780
3885
  const k = prop.name.text;
3886
+ if (k === "SNICallback" && allowSni) {
3887
+ const value = initializer !== null
3888
+ ? lowerer.lowerExpr(initializer)
3889
+ : lowerer.lowerShorthandValue(prop);
3890
+ const checked = checkSniCallbackValue(lowerer, value, prop, what);
3891
+ if (cert !== null && key !== null) {
3892
+ sni = checked;
3893
+ }
3894
+ else {
3895
+ // The runtime call reads cert and key first. A cert or key entry
3896
+ // after the callback can change the binding the callback reads,
3897
+ // so the callback is saved ahead of the next of them, in source
3898
+ // order.
3899
+ const saved = lowerer.declareHiddenLocal("%sniCallback", checked.type);
3900
+ pendingSni = { kind: "varDecl", localId: saved.id, init: checked, loc: locOf(prop) };
3901
+ sni = varRef(saved.id, checked.type, locOf(prop));
3902
+ }
3903
+ continue;
3904
+ }
3781
3905
  if (k !== "cert" && k !== "key") {
3782
3906
  const init = ts.isPropertyAssignment(prop) ? prop.initializer : null;
3783
3907
  if ((k === "ca" || k === "rejectUnauthorized") &&
@@ -3792,7 +3916,7 @@ function lowerTlsServerOptions(lowerer, node, what) {
3792
3916
  continue; // Node's false default, spelled out
3793
3917
  }
3794
3918
  fenceOrDropOptionKey(lowerer, prop, k, what, TLS_SERVER_DOCUMENTED_OPTIONS, "cert and key (PEM strings or Buffers) are the supported options", {
3795
- SNICallback: "SNICallback lowers only on http2.createSecureServer({ allowHTTP1: true, ... }) — serve one cert/key pair here",
3919
+ SNICallback: "SNICallback lowers on tls.createServer and http2.createSecureServer({ allowHTTP1: true, ... }) — serve one cert/key pair here",
3796
3920
  requestCert: "client-certificate handshakes are not modeled (SEMANTICS.md divergence 55) — requestCert: false is the lowered value",
3797
3921
  });
3798
3922
  continue; // an undocumented key, dropped like Node drops it
@@ -3822,6 +3946,10 @@ function lowerTlsServerOptions(lowerer, node, what) {
3822
3946
  else if (v.type.kind !== "string" && !(v.type.kind === "bytes" && v.type.elem === "u8")) {
3823
3947
  lowerer.noLowering(`a ${what} '${k}' option of '${lowerer.fmt(v.type)}' values`, prop, "cert/key are PEM strings or Buffers here");
3824
3948
  }
3949
+ if (pendingSni !== null) {
3950
+ v = { kind: "seqExpr", stmts: [pendingSni], result: v, type: v.type, loc };
3951
+ pendingSni = null;
3952
+ }
3825
3953
  if (k === "cert")
3826
3954
  cert = v;
3827
3955
  else
@@ -3830,7 +3958,7 @@ function lowerTlsServerOptions(lowerer, node, what) {
3830
3958
  if (cert === null || key === null) {
3831
3959
  lowerer.noLowering(`${what} without both cert and key`, node, "the supported options object is { cert, key } (PEM strings or Buffers)");
3832
3960
  }
3833
- return { cert, key };
3961
+ return sni === undefined ? { cert, key } : { cert, key, sni };
3834
3962
  }
3835
3963
  /** The options argument of tls/https createServer, split three ways: an
3836
3964
  * object literal takes the static walk above; a RUNTIME (dyn) value — the
@@ -3857,20 +3985,35 @@ const TLS_VALIDATED_OPTIONS = new Set([
3857
3985
  "ticketKeys",
3858
3986
  ]);
3859
3987
  /** True when a literal options bag must ride the runtime walker: JS uses
3860
- * it for the typed TLS validation ladders, and HTTPS uses it for
3988
+ * it for the typed TLS validation ladders, HTTPS uses it for
3861
3989
  * keepAliveTimeoutBuffer so the HTTP option is consumed without losing
3862
- * the literal's evaluation order. */
3863
- function tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions = false) {
3990
+ * the literal's evaluation order, and `runtimeKeys` names options only the
3991
+ * runtime walk implements (tls.createServer's ALPNProtocols). */
3992
+ function tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions = false, runtimeKeys = new Set()) {
3864
3993
  const jsSource = isJsSourceFile(ts.getSourceFileOfNode(node));
3865
3994
  return node.properties.nodes.some((p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
3866
3995
  (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) &&
3867
3996
  ((includeHttpTimeoutOptions && p.name.text === "keepAliveTimeoutBuffer") ||
3997
+ runtimeKeys.has(p.name.text) ||
3868
3998
  (jsSource && TLS_VALIDATED_OPTIONS.has(p.name.text))));
3869
3999
  }
3870
- function lowerTlsServerOptionsOrDyn(lowerer, node, what, includeHttpTimeoutOptions = false) {
3871
- if (ts.isObjectLiteralExpression(node) &&
3872
- !tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions)) {
3873
- return lowerTlsServerOptions(lowerer, node, what);
4000
+ /** tls.createServer options the runtime walk implements and the literal
4001
+ * cert/key lowering does not. */
4002
+ const TLS_SERVER_RUNTIME_OPTIONS = new Set([
4003
+ "ALPNProtocols",
4004
+ "minVersion",
4005
+ "maxVersion",
4006
+ ]);
4007
+ function lowerTlsServerOptionsOrDyn(lowerer, node, what, includeHttpTimeoutOptions = false, runtimeKeys = new Set(), allowSni = false) {
4008
+ if (ts.isObjectLiteralExpression(node)) {
4009
+ if (!tlsLiteralNeedsRuntimeWalk(node, includeHttpTimeoutOptions, runtimeKeys))
4010
+ return lowerTlsServerOptions(lowerer, node, what, allowSni);
4011
+ const sniOption = node.properties.nodes.find((p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
4012
+ (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) &&
4013
+ p.name.text === "SNICallback");
4014
+ if (allowSni && sniOption !== undefined) {
4015
+ lowerer.noLowering(`${what} with SNICallback and options the runtime walk reads`, sniOption, "SNICallback lowers with cert and key; ALPNProtocols, minVersion, maxVersion and the validated options are not combined with it yet");
4016
+ }
3874
4017
  }
3875
4018
  const v = lowerer.lowerExpr(node);
3876
4019
  if (v.type.kind === "dyn")
@@ -3890,13 +4033,13 @@ function lowerTlsServerOptionsOrDyn(lowerer, node, what, includeHttpTimeoutOptio
3890
4033
  * connect(options[, cb]) and connect(port[, host][, options][, cb]) with
3891
4034
  * a RUNTIME options record (the checked-dynamic JS lane's shape — a dyn
3892
4035
  * value, or a record that converts): the runtime walk implements
3893
- * port/host/rejectUnauthorized/ca/servername and throws the catchable
4036
+ * port/host/socket/rejectUnauthorized/ca/servername/ALPNProtocols/minVersion/maxVersion/timeout and throws the catchable
3894
4037
  * fence for other documented members (the divergence-66 stance). The
3895
4038
  * callback (and 'secureConnect'/'connect' listeners) fires
3896
4039
  * post-handshake — Node's secureConnect timing. */
3897
4040
  function lowerTlsConnectCall(lowerer, expr, loc) {
3898
4041
  const args = expr.arguments.nodes;
3899
- const FORMS_HINT = "the supported forms are connect(options[, cb]) and connect(port[, host][, options][, cb]) — options implement port/host/rejectUnauthorized/ca/servername";
4042
+ const FORMS_HINT = "the supported forms are connect(options[, cb]) and connect(port[, host][, options][, cb]) — options implement port/host/socket/rejectUnauthorized/ca/servername/ALPNProtocols/minVersion/maxVersion/timeout";
3900
4043
  if (args.length < 1 || args.length > 4 || args.some(ts.isSpreadElement)) {
3901
4044
  lowerer.noLowering(`tls.connect with ${args.length} arguments`, expr, FORMS_HINT);
3902
4045
  }
@@ -3949,7 +4092,19 @@ function lowerTlsConnectCall(lowerer, expr, loc) {
3949
4092
  // The options value rides whole to the runtime walk: dyn passes
3950
4093
  // directly; a typed record that converts boxes into the checked-dynamic tree.
3951
4094
  let opts;
3952
- if (optsNode !== null) {
4095
+ let literal = optsNode;
4096
+ while (literal !== null && ts.isParenthesizedExpression(literal))
4097
+ literal = literal.expression;
4098
+ if (literal !== null &&
4099
+ ts.isObjectLiteralExpression(literal) &&
4100
+ literal.properties.nodes.some((p) => (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&
4101
+ ts.isIdentifier(p.name) &&
4102
+ p.name.text === "socket")) {
4103
+ // A socket member is a handle the record form cannot box: the literal
4104
+ // builds the checked-dynamic object member by member.
4105
+ opts = lowerDynObjectLiteral(lowerer, literal);
4106
+ }
4107
+ else if (optsNode !== null) {
3953
4108
  const o = lowerer.lowerExpr(optsNode);
3954
4109
  if (o.type.kind === "dyn") {
3955
4110
  opts = o;
@@ -3992,10 +4147,24 @@ function lowerTlsModuleCall(lowerer, expr, bi, loc) {
3992
4147
  if (args.length < 1 || args.length > 2) {
3993
4148
  lowerer.noLowering(`createServer with ${args.length} arguments`, expr, "the supported form is createServer({ cert, key }, socket => ...)");
3994
4149
  }
3995
- const opts = lowerTlsServerOptionsOrDyn(lowerer, args[0], "tls.createServer");
4150
+ const opts = lowerTlsServerOptionsOrDyn(lowerer, args[0], "tls.createServer", false, TLS_SERVER_RUNTIME_OPTIONS, true);
3996
4151
  if (args.length === 1) {
3997
- return opts.dyn !== undefined
3998
- ? { kind: "libCall", fn: "tls.createServerDyn", args: [opts.dyn], type: NETSERVER_T, loc }
4152
+ if (opts.dyn !== undefined)
4153
+ return {
4154
+ kind: "libCall",
4155
+ fn: "tls.createServerDyn",
4156
+ args: [opts.dyn],
4157
+ type: NETSERVER_T,
4158
+ loc,
4159
+ };
4160
+ return opts.sni !== undefined
4161
+ ? {
4162
+ kind: "libCall",
4163
+ fn: "tls.createServerSni",
4164
+ args: [opts.cert, opts.key, opts.sni],
4165
+ type: NETSERVER_T,
4166
+ loc,
4167
+ }
3999
4168
  : {
4000
4169
  kind: "libCall",
4001
4170
  fn: "tls.createServer",
@@ -4005,13 +4174,21 @@ function lowerTlsModuleCall(lowerer, expr, bi, loc) {
4005
4174
  };
4006
4175
  }
4007
4176
  const { cb } = lowerCallbackArg(lowerer, args[1], "secureConnection listeners", 1, (p) => p.kind === "netSocket", "use (socket) or ()", [NETSOCKET_T]);
4008
- return opts.dyn !== undefined
4009
- ? {
4177
+ if (opts.dyn !== undefined)
4178
+ return {
4010
4179
  kind: "libCall",
4011
4180
  fn: "tls.createServerDynCb",
4012
4181
  args: [opts.dyn, cb],
4013
4182
  type: NETSERVER_T,
4014
4183
  loc,
4184
+ };
4185
+ return opts.sni !== undefined
4186
+ ? {
4187
+ kind: "libCall",
4188
+ fn: "tls.createServerSniCb",
4189
+ args: [opts.cert, opts.key, opts.sni, cb],
4190
+ type: NETSERVER_T,
4191
+ loc,
4015
4192
  }
4016
4193
  : {
4017
4194
  kind: "libCall",
@@ -4304,6 +4481,40 @@ const HTTP2_IGNORED_TUNING_OPTIONS = new Set([
4304
4481
  const SNI_HINT = "SNICallback lowers as a direct option or the conditional spread " +
4305
4482
  "...(x ? { SNICallback: x } : {}) — the callback is (servername, cb) => void " +
4306
4483
  "with cb: (err: Error | null, ctx?: tls.SecureContext) => void";
4484
+ /** An SNICallback option value: (servername: string, cb) => void where cb
4485
+ * is (err: Error | null, ctx?: SecureContext) => void, or that function
4486
+ * unioned with undefined (no callback). cb may declare fewer params (the
4487
+ * emitted answer thunk matches its ABI), but what it does declare must
4488
+ * carry the arms the thunk decodes. */
4489
+ function lowerSniCallbackValue(lowerer, node, blame, what) {
4490
+ return checkSniCallbackValue(lowerer, lowerer.lowerExpr(node), blame, what);
4491
+ }
4492
+ function checkSniCallbackValue(lowerer, v, blame, what) {
4493
+ const shapeOk = (t) => {
4494
+ if (t.kind !== "func" || t.ret.kind !== "void" || t.params.length !== 2)
4495
+ return false;
4496
+ if (t.params[0].kind !== "string")
4497
+ return false;
4498
+ const cbT = t.params[1];
4499
+ if (cbT.kind !== "func" || cbT.ret.kind !== "void" || cbT.params.length > 2)
4500
+ return false;
4501
+ const armKinds = (u) => u.kind === "union" ? (lowerer.unions.get(u.unionId)?.arms ?? []).map((a) => a.kind) : [];
4502
+ const p0 = cbT.params[0];
4503
+ if (p0 !== undefined && !armKinds(p0).includes("nullT"))
4504
+ return false;
4505
+ const p1 = cbT.params[1];
4506
+ if (p1 !== undefined && !armKinds(p1).includes("secureCtx"))
4507
+ return false;
4508
+ return true;
4509
+ };
4510
+ const arms = v.type.kind === "union" ? (lowerer.unions.get(v.type.unionId)?.arms ?? []) : [];
4511
+ const funcArm = v.type.kind === "func" ? v.type : arms.find((a) => a.kind === "func");
4512
+ const unionOk = v.type.kind !== "union" || (arms.length === 2 && arms.some((a) => a.kind === "undefinedT"));
4513
+ if (funcArm === undefined || !unionOk || !shapeOk(funcArm)) {
4514
+ lowerer.noLowering(`a ${what} SNICallback of '${lowerer.fmt(v.type)}' values`, blame, SNI_HINT);
4515
+ }
4516
+ return v;
4517
+ }
4307
4518
  /** Strips parentheses and type assertions: the portless spelling wraps
4308
4519
  * an options spread as `...({ ... } as Record<string, unknown>)`. */
4309
4520
  function stripParensAndCasts(node) {
@@ -4515,41 +4726,8 @@ function lowerHttp2ModuleCall(lowerer, expr, bi, loc) {
4515
4726
  let sni = null;
4516
4727
  let allowHttp1 = false;
4517
4728
  let enableConnectProtocol = false;
4518
- // The SNICallback value shape: (servername: string, cb) => void where
4519
- // cb is (err: Error | null, ctx?: SecureContext) => void — cb may
4520
- // declare fewer params (the emitted answer thunk matches its ABI),
4521
- // but what it does declare must carry the arms the thunk decodes.
4522
- const sniShapeOk = (t) => {
4523
- if (t.kind !== "func" || t.ret.kind !== "void" || t.params.length !== 2)
4524
- return false;
4525
- if (t.params[0].kind !== "string")
4526
- return false;
4527
- const cbT = t.params[1];
4528
- if (cbT.kind !== "func" || cbT.ret.kind !== "void" || cbT.params.length > 2)
4529
- return false;
4530
- const armKinds = (u) => u.kind === "union" ? (lowerer.unions.get(u.unionId)?.arms ?? []).map((a) => a.kind) : [];
4531
- const p0 = cbT.params[0];
4532
- if (p0 !== undefined && !armKinds(p0).includes("nullT"))
4533
- return false;
4534
- const p1 = cbT.params[1];
4535
- if (p1 !== undefined && !armKinds(p1).includes("secureCtx"))
4536
- return false;
4537
- return true;
4538
- };
4539
4729
  const lowerSniValue = (node, blame) => {
4540
- const v = lowerer.lowerExpr(node);
4541
- const funcArm = v.type.kind === "func"
4542
- ? v.type
4543
- : v.type.kind === "union"
4544
- ? (lowerer.unions.get(v.type.unionId)?.arms ?? []).find((a) => a.kind === "func")
4545
- : undefined;
4546
- const unionOk = v.type.kind !== "union" ||
4547
- ((lowerer.unions.get(v.type.unionId)?.arms ?? []).length === 2 &&
4548
- (lowerer.unions.get(v.type.unionId)?.arms ?? []).some((a) => a.kind === "undefinedT"));
4549
- if (funcArm === undefined || !unionOk || !sniShapeOk(funcArm)) {
4550
- lowerer.noLowering(`a createSecureServer SNICallback of '${lowerer.fmt(v.type)}' values`, blame, SNI_HINT);
4551
- }
4552
- sni = v;
4730
+ sni = lowerSniCallbackValue(lowerer, node, blame, "createSecureServer");
4553
4731
  };
4554
4732
  const lowerOption = (prop) => {
4555
4733
  if (ts.isSpreadAssignment(prop)) {
@@ -6175,7 +6353,7 @@ function lowerHttpResMethodCall(lowerer, call, access) {
6175
6353
  const all = [...callArgs, cb];
6176
6354
  const key = `server.endcb:${fn}:${all.map((a) => typeKey(a.type)).join(",")}`;
6177
6355
  const existing = lowerer.arrHofHelpers.get(key);
6178
- const helper = existing ?? `%server.endcb.${lowerer.arrHofHelpers.size}`;
6356
+ const helper = existing ?? keyedHelperName(lowerer, "%server.endcb", key);
6179
6357
  if (!existing) {
6180
6358
  lowerer.arrHofHelpers.set(key, helper);
6181
6359
  const params = all.map((a, i) => ({ localId: `p${i}.0`, name: `p${i}`, type: a.type }));