@scriptc/compiler 0.4.8 → 0.4.9

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 (536) hide show
  1. package/ambient/node-fallback/buffer.d.ts +2 -0
  2. package/ambient/node-fallback/child_process.d.ts +9 -3
  3. package/ambient/node-fallback/dns-promises.d.ts +25 -0
  4. package/ambient/node-fallback/dns.d.ts +29 -0
  5. package/ambient/node-fallback/test.d.ts +7 -0
  6. package/ambient/scriptc-node-fallback.d.ts +145 -2
  7. package/ambient/scriptc-overrides.d.ts +22 -13
  8. package/dist/backend/build-cache.d.ts +1 -1
  9. package/dist/backend/build-cache.js +1 -1
  10. package/dist/backend/build-cache.js.map +1 -1
  11. package/dist/backend/cache-root.d.ts +7 -0
  12. package/dist/backend/cache-root.js +27 -0
  13. package/dist/backend/cache-root.js.map +1 -1
  14. package/dist/backend/executable-features.js +5 -1
  15. package/dist/backend/executable-features.js.map +1 -1
  16. package/dist/backend/link-plan.js +7 -1
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/bytes-loop-versions.d.ts +12 -1
  19. package/dist/backend/llvm/bytes-loop-versions.js +107 -30
  20. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  21. package/dist/backend/llvm/bytes-loop-versions.test.js +96 -0
  22. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  23. package/dist/backend/llvm/checked-value-lifetimes.js +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +16 -5
  26. package/dist/backend/llvm/classes.js +34 -6
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +21 -2
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +9 -0
  31. package/dist/backend/llvm/common.js +9 -0
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/cpu-dispatch.d.ts +36 -2
  34. package/dist/backend/llvm/cpu-dispatch.js +96 -2
  35. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  36. package/dist/backend/llvm/dense-array-access.d.ts +5 -2
  37. package/dist/backend/llvm/dense-array-access.js +16 -12
  38. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  39. package/dist/backend/llvm/dense-array-access.test.js +3 -1
  40. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  41. package/dist/backend/llvm/dyn.d.ts +24 -0
  42. package/dist/backend/llvm/dyn.js +117 -3
  43. package/dist/backend/llvm/dyn.js.map +1 -1
  44. package/dist/backend/llvm/emit-function.js +6 -0
  45. package/dist/backend/llvm/emit-function.js.map +1 -1
  46. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  47. package/dist/backend/llvm/emit-journal.js.map +1 -1
  48. package/dist/backend/llvm/emit-module.js +48 -5
  49. package/dist/backend/llvm/emit-module.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.test.js +41 -0
  51. package/dist/backend/llvm/emit-module.test.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.js +11 -0
  53. package/dist/backend/llvm/emit-statements.js.map +1 -1
  54. package/dist/backend/llvm/emitter.d.ts +87 -7
  55. package/dist/backend/llvm/emitter.js +136 -15
  56. package/dist/backend/llvm/emitter.js.map +1 -1
  57. package/dist/backend/llvm/expr-async.js +28 -6
  58. package/dist/backend/llvm/expr-async.js.map +1 -1
  59. package/dist/backend/llvm/expr-containers.js +19 -5
  60. package/dist/backend/llvm/expr-containers.js.map +1 -1
  61. package/dist/backend/llvm/expr-dynamic.js +29 -1
  62. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  63. package/dist/backend/llvm/expr-primitives.js +104 -6
  64. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  65. package/dist/backend/llvm/expr-records.js +15 -1
  66. package/dist/backend/llvm/expr-records.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-bridges.js +53 -5
  68. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  69. package/dist/backend/llvm/inline-arrays.js +1 -1
  70. package/dist/backend/llvm/inline-arrays.js.map +1 -1
  71. package/dist/backend/llvm/js-ic.js +126 -2
  72. package/dist/backend/llvm/js-ic.js.map +1 -1
  73. package/dist/backend/llvm/lanes.d.ts +38 -0
  74. package/dist/backend/llvm/lanes.js +778 -0
  75. package/dist/backend/llvm/lanes.js.map +1 -0
  76. package/dist/backend/llvm/lanes.test.d.ts +1 -0
  77. package/dist/backend/llvm/lanes.test.js +402 -0
  78. package/dist/backend/llvm/lanes.test.js.map +1 -0
  79. package/dist/backend/llvm/lib-dispatch.js +9 -4
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-network.js +20 -0
  82. package/dist/backend/llvm/lib-network.js.map +1 -1
  83. package/dist/backend/llvm/lib-shared.js +27 -0
  84. package/dist/backend/llvm/lib-shared.js.map +1 -1
  85. package/dist/backend/llvm/lib-test.js +11 -0
  86. package/dist/backend/llvm/lib-test.js.map +1 -1
  87. package/dist/backend/llvm/local-array-reads.js +2 -2
  88. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  89. package/dist/backend/llvm/map-number-lookup.js +8 -2
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/nullable-unions.js +5 -2
  92. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  93. package/dist/backend/llvm/publish.d.ts +3 -0
  94. package/dist/backend/llvm/publish.js +2 -2
  95. package/dist/backend/llvm/publish.js.map +1 -1
  96. package/dist/backend/llvm/reference-writes.js +1 -0
  97. package/dist/backend/llvm/reference-writes.js.map +1 -1
  98. package/dist/backend/llvm/region-groups.js +43 -4
  99. package/dist/backend/llvm/region-groups.js.map +1 -1
  100. package/dist/backend/llvm/region-groups.test.js +79 -0
  101. package/dist/backend/llvm/region-groups.test.js.map +1 -1
  102. package/dist/backend/llvm/runtime-registries.test.js +32 -1
  103. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  104. package/dist/backend/llvm/shapes.js +10 -1
  105. package/dist/backend/llvm/shapes.js.map +1 -1
  106. package/dist/backend/llvm/string-reads.d.ts +1 -1
  107. package/dist/backend/llvm/string-reads.js +1 -1
  108. package/dist/backend/llvm/string-reads.js.map +1 -1
  109. package/dist/backend/llvm/unwind-abi.js +24 -2
  110. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  111. package/dist/backend/llvm/unwind-abi.test.js +38 -0
  112. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  113. package/dist/backend/llvm/walkers.d.ts +3 -0
  114. package/dist/backend/llvm/walkers.js +20 -2
  115. package/dist/backend/llvm/walkers.js.map +1 -1
  116. package/dist/backend/native/contracts.d.ts +15 -3
  117. package/dist/backend/native/executable.js +19 -5
  118. package/dist/backend/native/executable.js.map +1 -1
  119. package/dist/backend/native-codegen-core.d.ts +20 -0
  120. package/dist/backend/native-codegen-core.js +15 -0
  121. package/dist/backend/native-codegen-core.js.map +1 -1
  122. package/dist/backend/native-codegen.d.ts +5 -0
  123. package/dist/backend/native-codegen.js +62 -8
  124. package/dist/backend/native-codegen.js.map +1 -1
  125. package/dist/backend/native-codegen.test.js +48 -8
  126. package/dist/backend/native-codegen.test.js.map +1 -1
  127. package/dist/backend/native-link-info-core.d.ts +27 -3
  128. package/dist/backend/native-link-info-core.js.map +1 -1
  129. package/dist/backend/native-link-info.test.js +17 -1
  130. package/dist/backend/native-link-info.test.js.map +1 -1
  131. package/dist/backend/native-toolchain.d.ts +1 -1
  132. package/dist/backend/native-toolchain.js +1 -1
  133. package/dist/backend/native-toolchain.js.map +1 -1
  134. package/dist/backend/native-toolchain.test.js +14 -1
  135. package/dist/backend/native-toolchain.test.js.map +1 -1
  136. package/dist/backend/runtime-pack-core.d.ts +9 -3
  137. package/dist/backend/runtime-pack-core.js +6 -1
  138. package/dist/backend/runtime-pack-core.js.map +1 -1
  139. package/dist/backend/runtime-pack.test.js +32 -1
  140. package/dist/backend/runtime-pack.test.js.map +1 -1
  141. package/dist/backend/targets.d.ts +9 -1
  142. package/dist/backend/targets.js +11 -2
  143. package/dist/backend/targets.js.map +1 -1
  144. package/dist/backend/targets.test.js +6 -0
  145. package/dist/backend/targets.test.js.map +1 -1
  146. package/dist/cli/command.js +15 -1
  147. package/dist/cli/command.js.map +1 -1
  148. package/dist/cli/host.d.ts +6 -0
  149. package/dist/cli/mcp.d.ts +72 -0
  150. package/dist/cli/mcp.js +601 -0
  151. package/dist/cli/mcp.js.map +1 -0
  152. package/dist/cli/mcp.test.d.ts +1 -0
  153. package/dist/cli/mcp.test.js +380 -0
  154. package/dist/cli/mcp.test.js.map +1 -0
  155. package/dist/cli/output-options.d.ts +1 -0
  156. package/dist/cli/output-options.js +3 -0
  157. package/dist/cli/output-options.js.map +1 -1
  158. package/dist/cli/usage.d.ts +51 -1
  159. package/dist/cli/usage.js +709 -186
  160. package/dist/cli/usage.js.map +1 -1
  161. package/dist/compat/fetch-profile.js +9 -4
  162. package/dist/compat/fetch-profile.js.map +1 -1
  163. package/dist/compile-types.d.ts +17 -0
  164. package/dist/coverage/report.d.ts +5 -9
  165. package/dist/coverage/report.js.map +1 -1
  166. package/dist/executable/executable-cache.d.ts +17 -3
  167. package/dist/executable/executable-cache.js +17 -3
  168. package/dist/executable/executable-cache.js.map +1 -1
  169. package/dist/executable/prepare.js +87 -10
  170. package/dist/executable/prepare.js.map +1 -1
  171. package/dist/frontend/analysis.js +3 -2
  172. package/dist/frontend/analysis.js.map +1 -1
  173. package/dist/frontend/canon-map.js +13 -8
  174. package/dist/frontend/canon-map.js.map +1 -1
  175. package/dist/frontend/decl-projection.d.ts +18 -0
  176. package/dist/frontend/decl-projection.js +90 -22
  177. package/dist/frontend/decl-projection.js.map +1 -1
  178. package/dist/frontend/decl-projection.test.js +47 -1
  179. package/dist/frontend/decl-projection.test.js.map +1 -1
  180. package/dist/frontend/default-library.d.ts +10 -0
  181. package/dist/frontend/default-library.js +43 -0
  182. package/dist/frontend/default-library.js.map +1 -0
  183. package/dist/frontend/fork-target.js +54 -9
  184. package/dist/frontend/fork-target.js.map +1 -1
  185. package/dist/frontend/fork-target.test.js +82 -0
  186. package/dist/frontend/fork-target.test.js.map +1 -1
  187. package/dist/frontend/inferred-js-diagnostics.test.js +73 -0
  188. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  189. package/dist/frontend/lowering/abstract-equality.d.ts +2 -1
  190. package/dist/frontend/lowering/abstract-equality.js +7 -1
  191. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  192. package/dist/frontend/lowering/array-values.js +2 -2
  193. package/dist/frontend/lowering/array-values.js.map +1 -1
  194. package/dist/frontend/lowering/assertion-members.js +52 -2
  195. package/dist/frontend/lowering/assertion-members.js.map +1 -1
  196. package/dist/frontend/lowering/builtin-namespaces.d.ts +5 -0
  197. package/dist/frontend/lowering/builtin-namespaces.js +19 -12
  198. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/callable-aliases.js +42 -6
  200. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  201. package/dist/frontend/lowering/builtins/child-process.d.ts +12 -11
  202. package/dist/frontend/lowering/builtins/child-process.js +235 -38
  203. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/compression.d.ts +6 -1
  205. package/dist/frontend/lowering/builtins/compression.js +3 -3
  206. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/constants.js +2 -2
  208. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -1
  210. package/dist/frontend/lowering/builtins/crypto.js +9 -1
  211. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/dates.js +26 -6
  213. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/environment.d.ts +13 -1
  215. package/dist/frontend/lowering/builtins/environment.js +15 -4
  216. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/module-bindings.d.ts +33 -0
  218. package/dist/frontend/lowering/builtins/module-bindings.js +213 -11
  219. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-resolution.d.ts +9 -2
  221. package/dist/frontend/lowering/builtins/module-resolution.js +187 -19
  222. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/performance.js +1 -1
  224. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/process.js +40 -2
  226. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/promises.js +33 -0
  228. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/readline.d.ts +9 -5
  230. package/dist/frontend/lowering/builtins/readline.js +184 -75
  231. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/url.d.ts +4 -0
  233. package/dist/frontend/lowering/builtins/url.js +6 -0
  234. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  235. package/dist/frontend/lowering/call-arguments.js +15 -0
  236. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  237. package/dist/frontend/lowering/callable-properties.d.ts +34 -0
  238. package/dist/frontend/lowering/callable-properties.js +210 -0
  239. package/dist/frontend/lowering/callable-properties.js.map +1 -0
  240. package/dist/frontend/lowering/cjs-inline-require.d.ts +16 -0
  241. package/dist/frontend/lowering/cjs-inline-require.js +105 -0
  242. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  243. package/dist/frontend/lowering/cjs-inline-require.test.d.ts +1 -0
  244. package/dist/frontend/lowering/cjs-inline-require.test.js +61 -0
  245. package/dist/frontend/lowering/cjs-inline-require.test.js.map +1 -0
  246. package/dist/frontend/lowering/class-dynamic-dispatch.js +82 -2
  247. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  248. package/dist/frontend/lowering/class-protocols.d.ts +57 -4
  249. package/dist/frontend/lowering/class-protocols.js +597 -30
  250. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  251. package/dist/frontend/lowering/class-unions.js +2 -2
  252. package/dist/frontend/lowering/class-unions.js.map +1 -1
  253. package/dist/frontend/lowering/coercions/function-adapters.d.ts +12 -0
  254. package/dist/frontend/lowering/coercions/function-adapters.js +62 -0
  255. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  256. package/dist/frontend/lowering/coercions/structural-plans.js +56 -1
  257. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  258. package/dist/frontend/lowering/coercions/structural.js +9 -4
  259. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  260. package/dist/frontend/lowering/collection-ingestion.d.ts +9 -0
  261. package/dist/frontend/lowering/collection-ingestion.js +115 -41
  262. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  263. package/dist/frontend/lowering/containers/array-callbacks.js +16 -0
  264. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  265. package/dist/frontend/lowering/containers/bytes.js +66 -10
  266. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  267. package/dist/frontend/lowering/containers/collection-methods.js +61 -5
  268. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  269. package/dist/frontend/lowering/containers/filter-predicates.js +11 -0
  270. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  271. package/dist/frontend/lowering/containers/indexed-objects.d.ts +15 -0
  272. package/dist/frontend/lowering/containers/indexed-objects.js +213 -30
  273. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  274. package/dist/frontend/lowering/error-name-order.d.ts +16 -0
  275. package/dist/frontend/lowering/error-name-order.js +61 -0
  276. package/dist/frontend/lowering/error-name-order.js.map +1 -1
  277. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +17 -0
  278. package/dist/frontend/lowering/expressions/asserted-receiver.js +123 -1
  279. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -1
  280. package/dist/frontend/lowering/expressions/binary.js +147 -20
  281. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  282. package/dist/frontend/lowering/expressions/element-access.js +63 -14
  283. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  284. package/dist/frontend/lowering/expressions/erased-delete.d.ts +59 -0
  285. package/dist/frontend/lowering/expressions/erased-delete.js +247 -0
  286. package/dist/frontend/lowering/expressions/erased-delete.js.map +1 -0
  287. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +10 -0
  288. package/dist/frontend/lowering/expressions/hosted-narrowing.js +48 -1
  289. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  290. package/dist/frontend/lowering/expressions/identifiers.js +20 -0
  291. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/narrowing.d.ts +7 -2
  293. package/dist/frontend/lowering/expressions/narrowing.js +77 -45
  294. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +62 -19
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/optional-chains.js +19 -0
  298. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/property-access.d.ts +7 -7
  300. package/dist/frontend/lowering/expressions/property-access.js +247 -48
  301. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  302. package/dist/frontend/lowering/expressions/relational.d.ts +1 -0
  303. package/dist/frontend/lowering/expressions/relational.js +18 -8
  304. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  305. package/dist/frontend/lowering/expressions/union-fields.js +11 -5
  306. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  307. package/dist/frontend/lowering/expressions/updates.js +121 -11
  308. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  309. package/dist/frontend/lowering/function-context.d.ts +10 -0
  310. package/dist/frontend/lowering/function-context.js +36 -0
  311. package/dist/frontend/lowering/function-context.js.map +1 -1
  312. package/dist/frontend/lowering/function-returns.js +8 -8
  313. package/dist/frontend/lowering/function-returns.js.map +1 -1
  314. package/dist/frontend/lowering/handle-properties.d.ts +62 -3
  315. package/dist/frontend/lowering/handle-properties.js +674 -26
  316. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  317. package/dist/frontend/lowering/handle-properties.test.js +95 -2
  318. package/dist/frontend/lowering/handle-properties.test.js.map +1 -1
  319. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  320. package/dist/frontend/lowering/lower-builtin-values.js +44 -0
  321. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  322. package/dist/frontend/lowering/lower-calls.js +328 -136
  323. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  324. package/dist/frontend/lowering/lower-classes.js +82 -17
  325. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  326. package/dist/frontend/lowering/lower-event-emitter.js +113 -9
  327. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  328. package/dist/frontend/lowering/lower-expando.d.ts +13 -21
  329. package/dist/frontend/lowering/lower-expando.js +90 -126
  330. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  331. package/dist/frontend/lowering/lower-exprs.js +2 -2
  332. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  333. package/dist/frontend/lowering/lower-functions.js +65 -0
  334. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  335. package/dist/frontend/lowering/lower-inspect.js +471 -0
  336. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  337. package/dist/frontend/lowering/lower-modules.js +36 -10
  338. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  339. package/dist/frontend/lowering/lower-node-island.js +28 -0
  340. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  341. package/dist/frontend/lowering/lower-server.d.ts +53 -7
  342. package/dist/frontend/lowering/lower-server.js +213 -42
  343. package/dist/frontend/lowering/lower-server.js.map +1 -1
  344. package/dist/frontend/lowering/lower-stdlib.js +50 -7
  345. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  346. package/dist/frontend/lowering/lower-stmts.d.ts +24 -0
  347. package/dist/frontend/lowering/lower-stmts.js +463 -220
  348. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  349. package/dist/frontend/lowering/lower-stream.js +2 -2
  350. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  351. package/dist/frontend/lowering/lower-test.js +71 -2
  352. package/dist/frontend/lowering/lower-test.js.map +1 -1
  353. package/dist/frontend/lowering/lowerer.d.ts +81 -10
  354. package/dist/frontend/lowering/lowerer.js +319 -72
  355. package/dist/frontend/lowering/lowerer.js.map +1 -1
  356. package/dist/frontend/lowering/new-target.js +10 -2
  357. package/dist/frontend/lowering/new-target.js.map +1 -1
  358. package/dist/frontend/lowering/nullish-empty-pattern.js +3 -3
  359. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -1
  360. package/dist/frontend/lowering/partial-assertions.js +30 -5
  361. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  362. package/dist/frontend/lowering/primitive-throws.js +91 -1
  363. package/dist/frontend/lowering/primitive-throws.js.map +1 -1
  364. package/dist/frontend/lowering/primitive-wrappers.d.ts +9 -0
  365. package/dist/frontend/lowering/primitive-wrappers.js +2 -2
  366. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  367. package/dist/frontend/lowering/promise-executor-adapter.js +5 -2
  368. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  369. package/dist/frontend/lowering/record-links.js +7 -2
  370. package/dist/frontend/lowering/record-links.js.map +1 -1
  371. package/dist/frontend/lowering/surfaces.d.ts +4 -0
  372. package/dist/frontend/lowering/surfaces.js +118 -2
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/surfaces.test.d.ts +1 -0
  375. package/dist/frontend/lowering/surfaces.test.js +31 -0
  376. package/dist/frontend/lowering/surfaces.test.js.map +1 -0
  377. package/dist/frontend/mock-shapes.js +3 -3
  378. package/dist/frontend/mock-shapes.js.map +1 -1
  379. package/dist/frontend/npm-static-ladder.d.ts +21 -0
  380. package/dist/frontend/npm-static-ladder.js +2 -0
  381. package/dist/frontend/npm-static-ladder.js.map +1 -0
  382. package/dist/frontend/npm-static-ladder.test.d.ts +1 -0
  383. package/dist/frontend/npm-static-ladder.test.js +138 -0
  384. package/dist/frontend/npm-static-ladder.test.js.map +1 -0
  385. package/dist/frontend/npm-static-status.d.ts +15 -0
  386. package/dist/frontend/npm-static-status.js +2 -0
  387. package/dist/frontend/npm-static-status.js.map +1 -0
  388. package/dist/frontend/package-shims.js +1 -1
  389. package/dist/frontend/package-shims.js.map +1 -1
  390. package/dist/frontend/pipeline.d.ts +1 -1
  391. package/dist/frontend/pipeline.js +222 -25
  392. package/dist/frontend/pipeline.js.map +1 -1
  393. package/dist/frontend/program-analysis.d.ts +4 -0
  394. package/dist/frontend/program-analysis.js +6 -0
  395. package/dist/frontend/program-analysis.js.map +1 -1
  396. package/dist/frontend/program.js +258 -32
  397. package/dist/frontend/program.js.map +1 -1
  398. package/dist/frontend/program.test.js +30 -0
  399. package/dist/frontend/program.test.js.map +1 -1
  400. package/dist/frontend/resolve.js +29 -5
  401. package/dist/frontend/resolve.js.map +1 -1
  402. package/dist/frontend/resolve.test.js +40 -0
  403. package/dist/frontend/resolve.test.js.map +1 -1
  404. package/dist/frontend/services.d.ts +8 -0
  405. package/dist/frontend/services.js +7 -0
  406. package/dist/frontend/services.js.map +1 -1
  407. package/dist/frontend/ts7/checker.d.ts +7 -0
  408. package/dist/frontend/ts7/checker.js +12 -0
  409. package/dist/frontend/ts7/checker.js.map +1 -1
  410. package/dist/frontend/ts7/checker.test.js +1 -0
  411. package/dist/frontend/ts7/checker.test.js.map +1 -1
  412. package/dist/frontend/ts7/program-host.d.ts +39 -2
  413. package/dist/frontend/ts7/program-host.js +62 -8
  414. package/dist/frontend/ts7/program-host.js.map +1 -1
  415. package/dist/frontend/ts7/program-host.test.js +33 -0
  416. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  417. package/dist/frontend/ts7/session-cache.d.ts +5 -1
  418. package/dist/frontend/ts7/session-cache.js +7 -1
  419. package/dist/frontend/ts7/session-cache.js.map +1 -1
  420. package/dist/frontend/ts7/session-cache.test.js +37 -0
  421. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  422. package/dist/frontend/ts7/session.js +19 -1
  423. package/dist/frontend/ts7/session.js.map +1 -1
  424. package/dist/frontend/ts7/source-parser.d.ts +17 -2
  425. package/dist/frontend/ts7/source-parser.js +61 -2
  426. package/dist/frontend/ts7/source-parser.js.map +1 -1
  427. package/dist/frontend/ts7/source-parser.test.js +55 -2
  428. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  429. package/dist/frontend/tsc-codes.d.ts +3 -2
  430. package/dist/frontend/tsc-codes.js +129 -22
  431. package/dist/frontend/tsc-codes.js.map +1 -1
  432. package/dist/frontend/type-mapper.d.ts +5 -11
  433. package/dist/frontend/type-mapper.js +380 -70
  434. package/dist/frontend/type-mapper.js.map +1 -1
  435. package/dist/index.d.ts +1 -1
  436. package/dist/index.js +67 -7
  437. package/dist/index.js.map +1 -1
  438. package/dist/ir/builtin-effects.js +29 -0
  439. package/dist/ir/builtin-effects.js.map +1 -1
  440. package/dist/ir/builtin-signatures.d.ts +1 -1
  441. package/dist/ir/builtin-signatures.js +72 -6
  442. package/dist/ir/builtin-signatures.js.map +1 -1
  443. package/dist/ir/codec.generated.d.ts +1 -1
  444. package/dist/ir/codec.generated.js +321 -263
  445. package/dist/ir/codec.generated.js.map +1 -1
  446. package/dist/ir/constant-length-clones.d.ts +26 -0
  447. package/dist/ir/constant-length-clones.js +589 -0
  448. package/dist/ir/constant-length-clones.js.map +1 -0
  449. package/dist/ir/constant-length-clones.test.d.ts +1 -0
  450. package/dist/ir/constant-length-clones.test.js +292 -0
  451. package/dist/ir/constant-length-clones.test.js.map +1 -0
  452. package/dist/ir/constant-tables.d.ts +10 -5
  453. package/dist/ir/constant-tables.js +83 -17
  454. package/dist/ir/constant-tables.js.map +1 -1
  455. package/dist/ir/constant-tables.test.js +58 -1
  456. package/dist/ir/constant-tables.test.js.map +1 -1
  457. package/dist/ir/fields.generated.js +5 -2
  458. package/dist/ir/fields.generated.js.map +1 -1
  459. package/dist/ir/function-references.js +2 -0
  460. package/dist/ir/function-references.js.map +1 -1
  461. package/dist/ir/function-references.test.js +13 -0
  462. package/dist/ir/function-references.test.js.map +1 -1
  463. package/dist/ir/integer-loops.js +1 -0
  464. package/dist/ir/integer-loops.js.map +1 -1
  465. package/dist/ir/integer-loops.test.js +16 -0
  466. package/dist/ir/integer-loops.test.js.map +1 -1
  467. package/dist/ir/ir.d.ts +50 -6
  468. package/dist/ir/ir.js +44 -2
  469. package/dist/ir/ir.js.map +1 -1
  470. package/dist/ir/ir.test.js +83 -1
  471. package/dist/ir/ir.test.js.map +1 -1
  472. package/dist/ir/js-groups.js +5 -1
  473. package/dist/ir/js-groups.js.map +1 -1
  474. package/dist/ir/js-ic.d.ts +20 -0
  475. package/dist/ir/js-ic.js +81 -4
  476. package/dist/ir/js-ic.js.map +1 -1
  477. package/dist/ir/js-ic.test.js +8 -1
  478. package/dist/ir/js-ic.test.js.map +1 -1
  479. package/dist/ir/lane-plans.d.ts +86 -0
  480. package/dist/ir/lane-plans.js +589 -0
  481. package/dist/ir/lane-plans.js.map +1 -0
  482. package/dist/ir/lane-plans.test.d.ts +1 -0
  483. package/dist/ir/lane-plans.test.js +549 -0
  484. package/dist/ir/lane-plans.test.js.map +1 -0
  485. package/dist/ir/runtime-features.d.ts +68 -10
  486. package/dist/ir/runtime-features.js +285 -17
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/runtime-features.test.js +190 -1
  489. package/dist/ir/runtime-features.test.js.map +1 -1
  490. package/dist/ir/validate.js +61 -24
  491. package/dist/ir/validate.js.map +1 -1
  492. package/dist/native/cache.d.ts +5 -0
  493. package/dist/native/cache.js +23 -1
  494. package/dist/native/cache.js.map +1 -1
  495. package/dist/native/cache.test.js +29 -1
  496. package/dist/native/cache.test.js.map +1 -1
  497. package/dist/native/cli.js +4 -2
  498. package/dist/native/cli.js.map +1 -1
  499. package/dist/native/compiler.d.ts +11 -3
  500. package/dist/native/compiler.js +102 -16
  501. package/dist/native/compiler.js.map +1 -1
  502. package/dist/native/compiler.test.js +244 -2
  503. package/dist/native/compiler.test.js.map +1 -1
  504. package/dist/native/prepare.d.ts +14 -1
  505. package/dist/native/prepare.js +79 -29
  506. package/dist/native/prepare.js.map +1 -1
  507. package/dist/native/sanitizer.test.js +3 -0
  508. package/dist/native/sanitizer.test.js.map +1 -1
  509. package/dist/native/unchanged.d.ts +80 -0
  510. package/dist/native/unchanged.js +301 -0
  511. package/dist/native/unchanged.js.map +1 -0
  512. package/dist/native/unchanged.test.d.ts +1 -0
  513. package/dist/native/unchanged.test.js +249 -0
  514. package/dist/native/unchanged.test.js.map +1 -0
  515. package/dist/node-islands/boundary.d.ts +16 -0
  516. package/dist/node-islands/boundary.js +70 -7
  517. package/dist/node-islands/boundary.js.map +1 -1
  518. package/dist/node-islands/boundary.test.js +59 -14
  519. package/dist/node-islands/boundary.test.js.map +1 -1
  520. package/dist/node-islands/detect.js +203 -47
  521. package/dist/node-islands/detect.js.map +1 -1
  522. package/dist/node-islands/detect.test.js +45 -0
  523. package/dist/node-islands/detect.test.js.map +1 -1
  524. package/dist/node-islands/growth.js +4 -16
  525. package/dist/node-islands/growth.js.map +1 -1
  526. package/dist/node-islands/modules.d.ts +3 -0
  527. package/dist/node-islands/modules.js +143 -12
  528. package/dist/node-islands/modules.js.map +1 -1
  529. package/dist/node-islands/modules.test.js +125 -0
  530. package/dist/node-islands/modules.test.js.map +1 -1
  531. package/dist/node-islands/report.d.ts +1 -1
  532. package/dist/node-islands/report.js +2 -1
  533. package/dist/node-islands/report.js.map +1 -1
  534. package/package.json +20 -20
  535. package/shims/undici/core/request.ts +7 -1
  536. package/surface-manifest.json +380 -2
@@ -4,7 +4,7 @@ import { dynUndefinedExpr, nodeThrowExpr, boolLit, numLit, strLit, varRef, } fro
4
4
  import * as ts from "../ts7/adapter.js";
5
5
  import { ladderFenceExpr } from "./lowerer.js";
6
6
  import { isJsSourceFile, locOf } from "../program.js";
7
- import { arrayOf, BOOL, BYTES_U8, canBoxFuncIntoDyn, canConvertToDyn, DYN, DYN_HANDLE_KINDS, F64, funcOf, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, NETSERVER_T, NETSOCKET_T, NULL_T, SECURECTX_T, STRING, UNDEFINED_T, typeKey, VOID, } from "../../ir/ir.js";
7
+ import { arrayOf, BOOL, BYTES_U8, canBoxFuncIntoDyn, canConvertToDyn, DYN, DYN_HANDLE_KINDS, F64, funcOf, HTTP2SESSION_T, HTTP2STREAM_T, HTTPCLIENTREQ_T, HTTPREQ_T, HTTPRES_T, NETSERVER_T, NETSOCKET_T, NULL_T, SECURECTX_T, STRING, UNDEFINED_T, sortArms, typeKey, VOID, } from "../../ir/ir.js";
8
8
  import { AGENT_DOCUMENTED_OPTIONS, HTTPS_AGENT_DOCUMENTED_OPTIONS, builtinFenceHintOf, builtinModuleFnOf, fenceOrDropOptionKey, HTTP_CLIENT_DOCUMENTED_OPTIONS, HTTP_SERVER_DOCUMENTED_OPTIONS, HTTP2_SECURE_SERVER_DOCUMENTED_OPTIONS, HTTPS_CLIENT_DOCUMENTED_OPTIONS, sideEffectFreeOptionValue, TLS_SERVER_DOCUMENTED_OPTIONS, } from "./surfaces.js";
9
9
  import { conditionalSpreadOf, lowerDynObjectLiteral } from "./expressions/object-literals.js";
10
10
  import { resultIsDiscarded } from "./call-position.js";
@@ -424,7 +424,7 @@ function headerParamShapeId(cbT, idx) {
424
424
  * with no static param type to read the shape from). */
425
425
  function canonicalHeaderRecord(lowerer) {
426
426
  const arms = [F64, STRING, arrayOf(STRING), UNDEFINED_T];
427
- arms.sort((a, b) => (typeKey(a) < typeKey(b) ? -1 : 1));
427
+ sortArms(arms);
428
428
  const slot = { kind: "union", unionId: lowerer.unions.intern(arms) };
429
429
  const shapeId = lowerer.shapes.intern([], false, slot, []);
430
430
  return { type: { kind: "record", shapeId }, shapeId };
@@ -4136,6 +4136,9 @@ function lowerHttpModuleCall(lowerer, expr, bi, loc) {
4136
4136
  * Buffers (fs.readFileSync either way — portless reads Buffers) — a
4137
4137
  * runtime-valued (dyn) entry rides the tls.pemDyn extraction, throwing
4138
4138
  * the fence at runtime for non-PEM kinds (the divergence-66 stance).
4139
+ * With an SNICallback the default pair may be absent (Node serves each
4140
+ * handshake from the answered context), so a missing cert or key lowers
4141
+ * to an empty value the runtime reads as "no default material".
4139
4142
  * Every other key fences by name; SNICallback gets the pointed hint. */
4140
4143
  function lowerTlsServerOptions(lowerer, node, what, allowSni = false) {
4141
4144
  if (!ts.isObjectLiteralExpression(node)) {
@@ -4187,7 +4190,7 @@ function lowerTlsServerOptions(lowerer, node, what, allowSni = false) {
4187
4190
  continue;
4188
4191
  }
4189
4192
  fenceOrDropOptionKey(lowerer, prop, k, what, TLS_SERVER_DOCUMENTED_OPTIONS, "cert and key (PEM strings or Buffers) are the supported options", {
4190
- SNICallback: "SNICallback lowers on tls.createServer and http2.createSecureServer({ allowHTTP1: true, ... }) — serve one cert/key pair here",
4193
+ SNICallback: "SNICallback lowers on tls.createServer (with or without a default cert/key pair) and on http2.createSecureServer({ allowHTTP1: true, ... })",
4191
4194
  });
4192
4195
  continue; // an undocumented key, dropped like Node drops it
4193
4196
  }
@@ -4226,7 +4229,24 @@ function lowerTlsServerOptions(lowerer, node, what, allowSni = false) {
4226
4229
  key = v;
4227
4230
  }
4228
4231
  if (cert === null || key === null) {
4229
- lowerer.noLowering(`${what} without both cert and key`, node, "the supported options object is { cert, key } (PEM strings or Buffers)");
4232
+ if (sni === undefined) {
4233
+ lowerer.noLowering(`${what} without both cert and key`, node, "the supported options object is { cert, key } (PEM strings or Buffers), or { SNICallback } to serve every handshake from the callback's context");
4234
+ }
4235
+ // Node accepts SNICallback without a default pair: the default context
4236
+ // then serves no certificate and the answered context supplies the
4237
+ // handshake's. An empty value carries "absent" to the runtime.
4238
+ const absent = () => ({ kind: "strLit", value: "", type: STRING, loc });
4239
+ if (cert === null)
4240
+ cert = absent();
4241
+ if (key === null)
4242
+ key = absent();
4243
+ // No cert/key entry followed the callback, so the saved read is
4244
+ // attached to the callback argument: it then runs after the entries
4245
+ // that did precede it, as the literal evaluated them.
4246
+ if (pendingSni !== null) {
4247
+ sni = { kind: "seqExpr", stmts: [pendingSni], result: sni, type: sni.type, loc };
4248
+ pendingSni = null;
4249
+ }
4230
4250
  }
4231
4251
  return sni === undefined ? { cert, key } : { cert, key, sni };
4232
4252
  }
@@ -4561,14 +4581,66 @@ export function lowerTlsRootCertificates(lowerer, bi, loc) {
4561
4581
  return null;
4562
4582
  return { kind: "libCall", fn: "tlsca.root", args: [], type: arrayOf(STRING), loc };
4563
4583
  }
4584
+ /** True when a declaration runs at most once, as a statement of the module
4585
+ * body itself. A declaration inside a loop runs once per iteration and each
4586
+ * iteration has its own binding in JS, so it takes the hidden-local storage
4587
+ * instead: its declaration statement allocates the box every pass, and the
4588
+ * closures made in a pass keep that pass's box. */
4589
+ function moduleScopeDecl(decl) {
4590
+ for (let node = decl.parent; node !== undefined; node = node.parent) {
4591
+ if (ts.isSourceFile(node))
4592
+ return true;
4593
+ if (ts.isFunctionLike(node))
4594
+ return false;
4595
+ if (ts.isForStatement(node) ||
4596
+ ts.isForOfStatement(node) ||
4597
+ ts.isForInStatement(node) ||
4598
+ ts.isWhileStatement(node) ||
4599
+ ts.isDoStatement(node)) {
4600
+ return false;
4601
+ }
4602
+ }
4603
+ return false;
4604
+ }
4564
4605
  export function httpClientFnBindingOf(lowerer, sym) {
4565
4606
  return lowerer.httpClientFnBindings.get(sym);
4566
4607
  }
4567
4608
  /** The { module, member } of an http/https client-function REFERENCE
4568
4609
  * (`https.request` through a namespace import, or a named `request`
4569
4610
  * import binding) — null for anything else. */
4570
- function clientFnRefOf(lowerer, node) {
4571
- const e = node;
4611
+ function clientFnRefOf(lowerer, node, seen = new Set()) {
4612
+ let e = node;
4613
+ while (ts.isParenthesizedExpression(e))
4614
+ e = e.expression;
4615
+ if (ts.isIdentifier(e)) {
4616
+ // An alias of a client function (`const httpsRequest = https.request`),
4617
+ // registered or not yet lowered: a const binding names the same
4618
+ // function the declaration's initializer names. An import binding
4619
+ // resolves through to the exporting declaration.
4620
+ let sym = lowerer.resolveValueSymbol(e);
4621
+ if (sym && (sym.flags & ts.SymbolFlags.Alias) !== 0) {
4622
+ try {
4623
+ sym = lowerer.checker.getAliasedSymbol(sym);
4624
+ }
4625
+ catch {
4626
+ // Leave the alias symbol in place; its declarations decide.
4627
+ }
4628
+ }
4629
+ if (sym && !seen.has(sym)) {
4630
+ const projection = lowerer.staticCallables.get(sym);
4631
+ if (projection?.kind === "client-function") {
4632
+ return { module: projection.module, member: projection.member };
4633
+ }
4634
+ const decl = sym.declarations[0];
4635
+ if (decl !== undefined &&
4636
+ ts.isVariableDeclaration(decl) &&
4637
+ (ts.getCombinedNodeFlags(decl) & ts.NodeFlags.Const) !== 0 &&
4638
+ decl.initializer !== undefined) {
4639
+ seen.add(sym);
4640
+ return clientFnRefOf(lowerer, decl.initializer, seen);
4641
+ }
4642
+ }
4643
+ }
4572
4644
  const bi = ts.isPropertyAccessExpression(e)
4573
4645
  ? lowerer.builtinMemberOf(e)
4574
4646
  : ts.isIdentifier(e)
@@ -4642,20 +4714,17 @@ function neverReassigned(lowerer, sym) {
4642
4714
  visit(root);
4643
4715
  return !written;
4644
4716
  }
4645
- /** Recognizes `const x = cond ? <client A> : <client B>` where A and B
4646
- * are the SAME member (request/get) of https and http (either order) —
4647
- * registers the binding (calls lower; the declaration itself binds
4648
- * nothing) and answers true. A matched ternary whose condition is not a
4649
- * stable identifier fences pointedly; non-client ternaries answer false
4650
- * (the ordinary decl path and its per-arm fences apply). */
4651
- export function registerHttpClientFnBinding(lowerer, nameNode, init) {
4717
+ /** The `cond ? <client A> : <client B>` shape where A and B are the SAME
4718
+ * member (request/get) of https and http (either order) — null for any
4719
+ * other initializer. Every other pair fences pointedly. */
4720
+ function clientFnConditionalOf(lowerer, init) {
4652
4721
  if (!init)
4653
- return false;
4722
+ return null;
4654
4723
  let e = init;
4655
4724
  while (ts.isParenthesizedExpression(e))
4656
4725
  e = e.expression;
4657
4726
  if (!ts.isConditionalExpression(e))
4658
- return false;
4727
+ return null;
4659
4728
  const unwrap = (a) => {
4660
4729
  let x = a;
4661
4730
  while (ts.isParenthesizedExpression(x))
@@ -4665,30 +4734,110 @@ export function registerHttpClientFnBinding(lowerer, nameNode, init) {
4665
4734
  const t = clientFnRefOf(lowerer, unwrap(e.whenTrue));
4666
4735
  const f = clientFnRefOf(lowerer, unwrap(e.whenFalse));
4667
4736
  if (!t || !f)
4668
- return false;
4737
+ return null;
4669
4738
  if (t.member !== f.member || t.module === f.module) {
4670
4739
  lowerer.noLowering("a conditional between these two client functions", e, "the lowered shape is `cond ? https.request : http.request` (or the .get pair, either order) — the same member of both modules");
4671
4740
  }
4672
- const cond = unwrap(e.condition);
4673
- const condSym = ts.isIdentifier(cond) ? lowerer.resolveValueSymbol(cond) : null;
4674
- if (!condSym || !neverReassigned(lowerer, condSym)) {
4675
- lowerer.noLowering("a client-function conditional with this condition shape", e.condition, "the condition must be a bare identifier whose binding is never reassigned (it re-evaluates at each call through the binding)");
4741
+ return { cond: unwrap(e.condition), trueSecure: t.module === "https", member: t.member };
4742
+ }
4743
+ /** Whether a condition is a bare identifier over a never-reassigned
4744
+ * binding: a pure, stable read that may be re-lowered at each call. */
4745
+ function stableConditionOf(lowerer, cond) {
4746
+ const sym = ts.isIdentifier(cond) ? lowerer.resolveValueSymbol(cond) : null;
4747
+ return sym !== null && neverReassigned(lowerer, sym);
4748
+ }
4749
+ /** Recognizes a `const x = cond ? <client A> : <client B>` declaration and
4750
+ * registers it for the paths that emit no storage: calls lower as the
4751
+ * runtime-secure client, the condition re-lowered per call. Only a stable
4752
+ * identifier read qualifies here — every other condition is captured once
4753
+ * by lowerHttpClientFnBindingDecl. Non-client ternaries answer false (the
4754
+ * ordinary decl path and its per-arm fences apply). */
4755
+ export function registerHttpClientFnBinding(lowerer, nameNode, init) {
4756
+ const shape = clientFnConditionalOf(lowerer, init);
4757
+ if (!shape)
4758
+ return false;
4759
+ if (!stableConditionOf(lowerer, shape.cond)) {
4760
+ lowerer.noLowering("a client-function conditional with this condition shape", shape.cond, "the condition is evaluated once at the declaration; this declaration form has no place to keep it — declare the binding as a const statement");
4676
4761
  }
4677
4762
  const symbol = lowerer.checker.getSymbolAtLocation(nameNode);
4678
- if (symbol) {
4763
+ if (symbol)
4764
+ lowerer.httpClientFnBindings.set(symbol, shape);
4765
+ return true;
4766
+ }
4767
+ /** The declaration of a `cond ? <client A> : <client B>` binding, which
4768
+ * answers false when the initializer is not that shape. A stable
4769
+ * identifier condition emits nothing (calls re-lower the pure read);
4770
+ * every other condition is evaluated ONCE here, exactly Node's ternary,
4771
+ * into a hidden bool that calls read. */
4772
+ export function lowerHttpClientFnBindingDecl(lowerer, decl) {
4773
+ const shape = clientFnConditionalOf(lowerer, decl.initializer);
4774
+ if (!shape)
4775
+ return false;
4776
+ const symbol = ts.isIdentifier(decl.name)
4777
+ ? lowerer.checker.getSymbolAtLocation(decl.name)
4778
+ : undefined;
4779
+ if (!symbol)
4780
+ return false;
4781
+ if (stableConditionOf(lowerer, shape.cond)) {
4782
+ lowerer.httpClientFnBindings.set(symbol, shape);
4783
+ return null;
4784
+ }
4785
+ const loc = locOf(decl);
4786
+ const secure = lowerer.lowerCondition(shape.cond);
4787
+ if (moduleScopeDecl(decl)) {
4788
+ const sf = ts.getSourceFileOfNode(decl);
4789
+ const rawTag = lowerer.fileTag.get(sf) ?? "";
4790
+ const tag = rawTag === "" ? "e." : rawTag.replace(/^%/, "");
4791
+ const id = `%g.${tag}%clientFnSecure.${lowerer.globalsList.length}`;
4792
+ lowerer.globalsList.push({ id, name: "%clientFnSecure", type: BOOL, mutable: true });
4679
4793
  lowerer.httpClientFnBindings.set(symbol, {
4680
- cond,
4681
- trueSecure: t.module === "https",
4682
- member: t.member,
4794
+ ...shape,
4795
+ secureStorage: { kind: "global", id },
4683
4796
  });
4797
+ return { kind: "assign", localId: id, value: secure, loc };
4684
4798
  }
4685
- return true;
4799
+ const local = lowerer.declareHiddenLocal("%clientFnSecure", BOOL);
4800
+ lowerer.httpClientFnBindings.set(symbol, {
4801
+ ...shape,
4802
+ secureStorage: { kind: "local", local, owner: lowerer.ctx },
4803
+ });
4804
+ return { kind: "varDecl", localId: local.id, init: secure, loc };
4805
+ }
4806
+ /** A read of a binding's saved condition bool: the module global at module
4807
+ * scope, or the hidden local itself at the declaring function and a threaded
4808
+ * capture inside a function that one encloses. A local miss means the owner
4809
+ * context is gone, which no declaration a use can reach should allow; it is
4810
+ * surfaced as a fence rather than a reference the backend cannot see. */
4811
+ export function httpClientSecureRef(lowerer, binding, node, loc) {
4812
+ const storage = binding.secureStorage;
4813
+ if (storage.kind === "global")
4814
+ return { kind: "varRef", localId: storage.id, type: BOOL, loc };
4815
+ const local = lowerer.captureHiddenLocal(storage.local, storage.owner);
4816
+ if (local === null) {
4817
+ lowerer.noLowering("a client function chosen at run time, used outside the function that declared it", node, "declare the binding and use it inside the same function (a nested function in that function can use it)");
4818
+ }
4819
+ return { kind: "varRef", localId: local.id, type: BOOL, loc };
4820
+ }
4821
+ /** The client-function REFERENCE an expression names (a module member, a
4822
+ * named import binding, or an immutable alias chain to either), for call
4823
+ * sites that are not the direct member form. */
4824
+ export function httpClientFnRefOf(lowerer, node) {
4825
+ return clientFnRefOf(lowerer, node);
4686
4826
  }
4687
4827
  /** A call THROUGH a registered requestFn binding: the http client
4688
4828
  * lowering with the RUNTIME-secure extras (the binding mode). */
4689
4829
  export function lowerHttpClientFnCall(lowerer, expr, binding, loc) {
4690
4830
  return lowerHttpClientCall(lowerer, expr, binding.member, loc, binding);
4691
4831
  }
4832
+ /** A call through an immutable alias of a client function
4833
+ * (`const httpsRequest = https.request; httpsRequest(...)`): the same
4834
+ * lowering a direct `https.request(...)` call gets, so the alias adds no
4835
+ * runtime indirection and the secure defaults follow the module it names. */
4836
+ export function lowerHttpClientFnRefCall(lowerer, expr, ref, loc) {
4837
+ return ref.module === "https"
4838
+ ? lowerHttpsModuleCall(lowerer, expr, ref, loc)
4839
+ : lowerHttpModuleCall(lowerer, expr, ref, loc);
4840
+ }
4692
4841
  /** Module-function calls on https import bindings: createServer(options,
4693
4842
  * handler) and request/get — the http client lowering with the secure
4694
4843
  * extras (port 443 default, rejectUnauthorized, ca). */
@@ -5340,11 +5489,15 @@ function lowerUrlFormOptions(lowerer, node) {
5340
5489
  function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
5341
5490
  const binding = typeof secure === "object" ? secure : null;
5342
5491
  const secureish = binding !== null || secure === true;
5343
- /** A FRESH lowering of the binding's secure condition (pure identifier
5344
- * read — each use is its own IR). */
5492
+ /** The binding's secure condition: the declaration-time capture when the
5493
+ * condition was not a stable identifier read, otherwise a FRESH lowering
5494
+ * of the pure identifier (each use is its own IR). */
5345
5495
  const secureExpr = () => {
5346
- const c = lowerer.lowerCondition(binding.cond);
5347
- return binding.trueSecure ? c : { kind: "unary", op: "!", operand: c, type: BOOL, loc };
5496
+ const b = binding;
5497
+ const c = b.secureStorage !== undefined
5498
+ ? httpClientSecureRef(lowerer, b, expr, loc)
5499
+ : lowerer.lowerCondition(b.cond);
5500
+ return b.trueSecure ? c : { kind: "unary", op: "!", operand: c, type: BOOL, loc };
5348
5501
  };
5349
5502
  const args = expr.arguments.nodes;
5350
5503
  if (args.length < 1 || args.length > 3) {
@@ -5359,30 +5512,48 @@ function lowerHttpClientCall(lowerer, expr, member, loc, secure = false) {
5359
5512
  // Only the URL form has a middle options argument: (url, options, cb).
5360
5513
  lowerer.noLowering(`${member} with 3 arguments`, expr, `the supported forms are ${member}(options[, callback]) and ${member}(url, options[, callback])`);
5361
5514
  }
5362
- const runtimeOptions = binding === null ? runtimeRequestOptions(lowerer, optsNode, secureish) : null;
5515
+ const runtimeOptions = runtimeRequestOptions(lowerer, optsNode, secureish);
5363
5516
  if (runtimeOptions !== null) {
5364
5517
  // The options record is read at run time (the ClientRequest
5365
5518
  // constructor's walk in the runtime): a RequestOptions variable, or a
5366
- // literal that spreads one or sets socketPath.
5519
+ // literal that spreads one or sets socketPath. A binding's secure bool
5520
+ // travels with the walk so the dial follows the same runtime choice.
5367
5521
  const autoEnd = boolLit(member === "get", loc);
5368
5522
  const secureDyn = secure === true;
5369
- if (args.length === 1) {
5523
+ const call = (cb) => {
5524
+ if (binding !== null) {
5525
+ const secureArg = secureExpr();
5526
+ return {
5527
+ kind: "libCall",
5528
+ fn: cb === null ? "https.requestFnDyn" : "https.requestFnDynCb",
5529
+ args: cb === null
5530
+ ? [secureArg, runtimeOptions, autoEnd]
5531
+ : [secureArg, runtimeOptions, autoEnd, cb],
5532
+ type: HTTPCLIENTREQ_T,
5533
+ loc,
5534
+ };
5535
+ }
5536
+ if (cb === null) {
5537
+ return {
5538
+ kind: "libCall",
5539
+ fn: secureDyn ? "https.requestDyn" : "http.requestDyn",
5540
+ args: [runtimeOptions, autoEnd],
5541
+ type: HTTPCLIENTREQ_T,
5542
+ loc,
5543
+ };
5544
+ }
5370
5545
  return {
5371
5546
  kind: "libCall",
5372
- fn: secureDyn ? "https.requestDyn" : "http.requestDyn",
5373
- args: [runtimeOptions, autoEnd],
5547
+ fn: secureDyn ? "https.requestDynCb" : "http.requestDynCb",
5548
+ args: [runtimeOptions, autoEnd, cb],
5374
5549
  type: HTTPCLIENTREQ_T,
5375
5550
  loc,
5376
5551
  };
5377
- }
5378
- const { cb } = lowerCallbackArg(lowerer, args[1], "response callbacks", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
5379
- return {
5380
- kind: "libCall",
5381
- fn: secureDyn ? "https.requestDynCb" : "http.requestDynCb",
5382
- args: [runtimeOptions, autoEnd, cb],
5383
- type: HTTPCLIENTREQ_T,
5384
- loc,
5385
5552
  };
5553
+ if (args.length === 1)
5554
+ return call(null);
5555
+ const { cb } = lowerCallbackArg(lowerer, args[1], "response callbacks", 1, (p) => p.kind === "httpReq", "use (res) or ()", [HTTPREQ_T]);
5556
+ return call(cb);
5386
5557
  }
5387
5558
  if (!ts.isObjectLiteralExpression(optsNode)) {
5388
5559
  const t = optsType;