@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
@@ -332,6 +332,86 @@ function isPrototypeFunctionAssignment(left, right) {
332
332
  ts.isPropertyAccessExpression(left.expression) &&
333
333
  propertyName(left.expression) === "prototype");
334
334
  }
335
+ /** A declared name that is not a builtin module value. */
336
+ const NOT_BUILTIN = { builtin: null, cjs: false, createRequire: false };
337
+ function isScopeBoundary(node) {
338
+ return (isFunctionBoundary(node) ||
339
+ ts.isArrowFunction(node) ||
340
+ ts.isSourceFile(node) ||
341
+ ts.isClassStaticBlockDeclaration(node));
342
+ }
343
+ /** Blocks and statement heads `let`, `const` and class declarations bind
344
+ * in, in addition to a function or static-block scope. */
345
+ function isBlockBoundary(node) {
346
+ return (ts.isBlock(node) ||
347
+ ts.isModuleBlock(node) ||
348
+ ts.isForStatement(node) ||
349
+ ts.isForOfStatement(node) ||
350
+ ts.isForInStatement(node) ||
351
+ ts.isCaseBlock(node));
352
+ }
353
+ /** The scope a declaration binds its name in. `hoisted` asks for the
354
+ * enclosing function's scope: `var`, parameters, and a sloppy block-level
355
+ * function declaration (Annex B.3.2) reach the whole function. */
356
+ function bindingScope(decl, hoisted) {
357
+ // The name climbs through its binding pattern to the declaration that
358
+ // hosts it: the declaration kind decides where the name is visible.
359
+ let host = decl;
360
+ for (;;) {
361
+ const parent = host.parent;
362
+ if (parent === undefined)
363
+ break;
364
+ if (ts.isBindingElement(host) ||
365
+ ts.isObjectBindingPattern(host) ||
366
+ ts.isArrayBindingPattern(host) ||
367
+ (ts.isIdentifier(host) &&
368
+ (ts.isBindingElement(parent) || ts.isVariableDeclaration(parent) || ts.isParameter(parent)))) {
369
+ host = parent;
370
+ continue;
371
+ }
372
+ break;
373
+ }
374
+ // A named function or class expression binds inside itself only.
375
+ if (ts.isFunctionExpression(host) || ts.isClassExpression(host))
376
+ return host;
377
+ // A catch clause's parameter or declaration names a value that exists
378
+ // only inside the catch block; outside it the name keeps the meaning the
379
+ // enclosing scope gives it.
380
+ if (host.parent !== undefined && ts.isCatchClause(host.parent))
381
+ return host.parent.block;
382
+ const blockScoped = !hoisted &&
383
+ (ts.isFunctionDeclaration(host) ||
384
+ ts.isClassDeclaration(host) ||
385
+ ts.isEnumDeclaration(host) ||
386
+ ts.isModuleDeclaration(host) ||
387
+ (ts.isVariableDeclaration(host) &&
388
+ (ts.getCombinedNodeFlags(host) & ts.NodeFlags.BlockScoped) !== 0));
389
+ for (let cur = host.parent; cur !== undefined; cur = cur.parent) {
390
+ if (isScopeBoundary(cur))
391
+ return cur;
392
+ if (blockScoped && isBlockBoundary(cur))
393
+ return cur;
394
+ }
395
+ // Unreachable for a parsed file (a source file is a scope boundary);
396
+ // declare it at the outermost node so the binding never escapes.
397
+ let root = host;
398
+ while (root.parent !== undefined)
399
+ root = root.parent;
400
+ return root;
401
+ }
402
+ function scopeDepth(scope) {
403
+ let depth = 0;
404
+ for (let cur = scope; cur !== undefined; cur = cur.parent)
405
+ depth++;
406
+ return depth;
407
+ }
408
+ function scopeContains(scope, at) {
409
+ for (let cur = at; cur !== undefined; cur = cur.parent) {
410
+ if (cur === scope)
411
+ return true;
412
+ }
413
+ return false;
414
+ }
335
415
  /** One module's pre-scan. */
336
416
  class ModuleScanner {
337
417
  sf;
@@ -343,14 +423,11 @@ class ModuleScanner {
343
423
  * variables). */
344
424
  functions = new Set();
345
425
  classes = new Set();
346
- /** Local name → the builtin module (or `module.member`) it is bound to. */
347
- builtinBindings = new Map();
348
- /** Local names bound to a createRequire(...) result. */
349
- createdRequires = new Set();
350
- /** Local names bound to a builtin module's CommonJS object: require(),
351
- * a createRequire'd require's result, a default import, or an alias of
352
- * one. Writes through these names are patches of the module object. */
353
- cjsBuiltinObjects = new Set();
426
+ /** Every declaration of a name the scan tracks for builtin identity, by
427
+ * name: a use resolves the innermost declaration whose scope contains
428
+ * it, so a parameter or local of the same name masks an outer alias
429
+ * instead of inheriting its identity. */
430
+ bindings = new Map();
354
431
  /** Members read through a CommonJS builtin object (H3.4). */
355
432
  cjsReads = [];
356
433
  /** Reads of names the file declares nowhere and no builtin provides: each
@@ -398,26 +475,76 @@ class ModuleScanner {
398
475
  ...(member === undefined ? {} : { member }),
399
476
  });
400
477
  }
401
- bindName(name, init) {
478
+ /** Records that `decl` declares `name` with the identity `value` (null
479
+ * for a declared name that is not a builtin module value, which still
480
+ * masks an outer alias of the same name). */
481
+ recordBinding(name, decl, value, hoisted = false) {
482
+ const scope = bindingScope(decl, hoisted);
483
+ const entry = {
484
+ value: value ?? NOT_BUILTIN,
485
+ scope,
486
+ depth: scopeDepth(scope),
487
+ order: ts.tokenStartOfNode(decl),
488
+ };
489
+ const list = this.bindings.get(name);
490
+ if (list === undefined)
491
+ this.bindings.set(name, [entry]);
492
+ else
493
+ list.push(entry);
494
+ }
495
+ /** The binding `name` resolves to at `at`: the innermost declaration
496
+ * whose scope contains the use. */
497
+ bindingAt(name, at) {
498
+ const list = this.bindings.get(name);
499
+ if (list === undefined)
500
+ return undefined;
501
+ let best;
502
+ for (const entry of list) {
503
+ if (!scopeContains(entry.scope, at))
504
+ continue;
505
+ if (best === undefined ||
506
+ entry.depth > best.depth ||
507
+ (entry.depth === best.depth && entry.order > best.order))
508
+ best = entry;
509
+ }
510
+ return best?.value;
511
+ }
512
+ /** Whether `name` already has a declaration in the scope `decl` binds in. */
513
+ hasBindingInScope(name, decl, hoisted) {
514
+ const list = this.bindings.get(name);
515
+ if (list === undefined)
516
+ return false;
517
+ const scope = bindingScope(decl, hoisted);
518
+ return list.some((entry) => entry.scope === scope);
519
+ }
520
+ bindName(name, init, hoisted = false, identity) {
402
521
  if (name === undefined)
403
522
  return;
404
523
  if (ts.isIdentifier(name)) {
405
524
  this.declared.add(name.text);
406
- if (init === undefined)
525
+ if (init === undefined) {
526
+ // `var fs;` declares the variable again without changing the value
527
+ // it already holds, so it keeps the identity of the declaration it
528
+ // shares a scope with instead of masking it as unbound.
529
+ if (identity === undefined && this.hasBindingInScope(name.text, name, hoisted))
530
+ return;
531
+ this.recordBinding(name.text, name, identity ?? null, hoisted);
407
532
  return;
533
+ }
408
534
  const value = stripWrappers(init);
409
535
  if (ts.isFunctionExpression(value) || ts.isArrowFunction(value))
410
536
  this.functions.add(name.text);
411
537
  else if (ts.isClassExpression(value))
412
538
  this.classes.add(name.text);
413
539
  const bound = this.builtinOf(value);
414
- if (bound !== null) {
415
- this.builtinBindings.set(name.text, bound);
416
- if (!bound.includes(".") && this.isCjsObjectValue(value))
417
- this.cjsBuiltinObjects.add(name.text);
418
- }
419
- if (ts.isCallExpression(value) && this.isCreateRequireCallee(value.expression))
420
- this.createdRequires.add(name.text);
540
+ const createRequire = ts.isCallExpression(value) && this.isCreateRequireCallee(value.expression);
541
+ this.recordBinding(name.text, name, bound === null && !createRequire
542
+ ? null
543
+ : {
544
+ builtin: bound,
545
+ cjs: bound !== null && !bound.includes(".") && this.isCjsObjectValue(value),
546
+ createRequire,
547
+ }, hoisted);
421
548
  return;
422
549
  }
423
550
  if (ts.isObjectBindingPattern(name)) {
@@ -430,16 +557,21 @@ class ModuleScanner {
430
557
  if (local !== undefined && ts.isIdentifier(local) && base !== null) {
431
558
  const key = element.propertyName;
432
559
  const member = key !== undefined && ts.isIdentifier(key) ? key.text : local.text;
433
- this.builtinBindings.set(local.text, `${base}.${member}`);
560
+ this.bindName(local, undefined, hoisted, {
561
+ builtin: `${base}.${member}`,
562
+ cjs: false,
563
+ createRequire: false,
564
+ });
434
565
  }
435
- this.bindName(local, undefined);
566
+ else
567
+ this.bindName(local, undefined, hoisted);
436
568
  }
437
569
  return;
438
570
  }
439
571
  if (ts.isArrayBindingPattern(name)) {
440
572
  for (const element of name.elements.nodes) {
441
573
  if (ts.isBindingElement(element))
442
- this.bindName(element.name, undefined);
574
+ this.bindName(element.name, undefined, hoisted);
443
575
  }
444
576
  }
445
577
  }
@@ -447,18 +579,20 @@ class ModuleScanner {
447
579
  * createRequire'd require's result of a builtin, or an alias of one. */
448
580
  isCjsObjectValue(value) {
449
581
  if (ts.isIdentifier(value))
450
- return this.cjsBuiltinObjects.has(value.text);
582
+ return this.bindingAt(value.text, value)?.cjs === true;
451
583
  if (!ts.isCallExpression(value))
452
584
  return false;
453
585
  return (this.isRequireCallee(value.expression) ||
454
- (ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)));
586
+ (ts.isIdentifier(value.expression) &&
587
+ this.bindingAt(value.expression.text, value.expression)?.createRequire === true));
455
588
  }
456
589
  /** `require("fs")`, `require("node:util").inherits` → "fs", "util.inherits". */
457
590
  builtinOf(node) {
458
591
  const value = stripWrappers(node);
459
592
  if (ts.isCallExpression(value) &&
460
593
  (this.isRequireCallee(value.expression) ||
461
- (ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)))) {
594
+ (ts.isIdentifier(value.expression) &&
595
+ this.bindingAt(value.expression.text, value.expression)?.createRequire === true))) {
462
596
  const spec = literalText(value.arguments.nodes[0]);
463
597
  return spec === null ? null : builtinModuleName(spec);
464
598
  }
@@ -468,7 +602,7 @@ class ModuleScanner {
468
602
  return base === null || name === null ? null : `${base}.${name}`;
469
603
  }
470
604
  if (ts.isIdentifier(value))
471
- return this.builtinBindings.get(value.text) ?? null;
605
+ return this.bindingAt(value.text, value)?.builtin ?? null;
472
606
  return null;
473
607
  }
474
608
  isRequireCallee(node) {
@@ -477,7 +611,7 @@ class ModuleScanner {
477
611
  isCreateRequireCallee(node) {
478
612
  if (ts.isIdentifier(node)) {
479
613
  return (node.text === "createRequire" ||
480
- this.builtinBindings.get(node.text) === "module.createRequire");
614
+ this.bindingAt(node.text, node)?.builtin === "module.createRequire");
481
615
  }
482
616
  return propertyName(node) === "createRequire";
483
617
  }
@@ -486,10 +620,12 @@ class ModuleScanner {
486
620
  if (ts.isFunctionDeclaration(node) && node.name !== undefined) {
487
621
  this.declared.add(node.name.text);
488
622
  this.functions.add(node.name.text);
623
+ this.recordBinding(node.name.text, node, null, this.isAnnexBBlockFunction(node) && !this.isStrict(node));
489
624
  }
490
625
  else if (ts.isClassDeclaration(node) && node.name !== undefined) {
491
626
  this.declared.add(node.name.text);
492
627
  this.classes.add(node.name.text);
628
+ this.recordBinding(node.name.text, node, null);
493
629
  }
494
630
  else if ((ts.isInterfaceDeclaration(node) ||
495
631
  ts.isTypeAliasDeclaration(node) ||
@@ -497,6 +633,10 @@ class ModuleScanner {
497
633
  ts.isModuleDeclaration(node)) &&
498
634
  ts.isIdentifier(node.name)) {
499
635
  this.declared.add(node.name.text);
636
+ // An enum or namespace name is also a value binding; an interface
637
+ // or type alias is not, and never shadows a value.
638
+ if (ts.isEnumDeclaration(node) || ts.isModuleDeclaration(node))
639
+ this.recordBinding(node.name.text, node, null);
500
640
  }
501
641
  else if (ts.isTypeParameterDeclaration(node)) {
502
642
  this.declared.add(node.name.text);
@@ -512,6 +652,10 @@ class ModuleScanner {
512
652
  }
513
653
  else if (ts.isFunctionExpression(node) && node.name !== undefined) {
514
654
  this.declared.add(node.name.text);
655
+ this.recordBinding(node.name.text, node, null);
656
+ }
657
+ else if (ts.isClassExpression(node) && node.name !== undefined) {
658
+ this.recordBinding(node.name.text, node, null);
515
659
  }
516
660
  else if (ts.isCatchClause(node) && node.variableDeclaration !== undefined) {
517
661
  this.bindName(node.variableDeclaration.name, undefined);
@@ -535,18 +679,21 @@ class ModuleScanner {
535
679
  if (clause !== undefined) {
536
680
  if (clause.name !== undefined) {
537
681
  this.declared.add(clause.name.text);
538
- if (module !== null) {
539
- this.builtinBindings.set(clause.name.text, module);
540
- // A default import is the CommonJS object (unlike a namespace
541
- // or named import, through which Node refuses writes).
542
- this.cjsBuiltinObjects.add(clause.name.text);
543
- }
682
+ this.recordBinding(clause.name.text, clause.name, module === null
683
+ ? null
684
+ : {
685
+ builtin: module,
686
+ // A default import is the CommonJS object (unlike a
687
+ // namespace or named import, through which Node refuses
688
+ // writes).
689
+ cjs: true,
690
+ createRequire: false,
691
+ });
544
692
  }
545
693
  const bindings = clause.namedBindings;
546
694
  if (bindings !== undefined && ts.isNamespaceImport(bindings)) {
547
695
  this.declared.add(bindings.name.text);
548
- if (module !== null)
549
- this.builtinBindings.set(bindings.name.text, module);
696
+ this.recordBinding(bindings.name.text, bindings.name, module === null ? null : { builtin: module, cjs: false, createRequire: false });
550
697
  }
551
698
  else if (bindings !== undefined && ts.isNamedImports(bindings)) {
552
699
  for (const element of bindings.elements.nodes) {
@@ -555,8 +702,9 @@ class ModuleScanner {
555
702
  const member = imported !== undefined && ts.isIdentifier(imported)
556
703
  ? imported.text
557
704
  : element.name.text;
558
- if (module !== null)
559
- this.builtinBindings.set(element.name.text, `${module}.${member}`);
705
+ this.recordBinding(element.name.text, element.name, module === null
706
+ ? null
707
+ : { builtin: `${module}.${member}`, cjs: false, createRequire: false });
560
708
  }
561
709
  }
562
710
  }
@@ -723,6 +871,14 @@ class ModuleScanner {
723
871
  this.visitFunction(node);
724
872
  }
725
873
  }
874
+ /** The builtin module whose CommonJS object `value` names, or null when
875
+ * the binding there holds anything else. */
876
+ cjsModuleOf(value) {
877
+ if (!ts.isIdentifier(value))
878
+ return null;
879
+ const binding = this.bindingAt(value.text, value);
880
+ return binding !== undefined && binding.cjs ? binding.builtin : null;
881
+ }
726
882
  /** Records a read of a member of a builtin module's CommonJS object, so
727
883
  * a patch installed by an island module can be checked against it
728
884
  * (H3.4). The left of an assignment (and a delete or ++/-- target) is a
@@ -730,11 +886,12 @@ class ModuleScanner {
730
886
  * so it is recorded as the whole module ("fs.*"). */
731
887
  recordCjsRead(node) {
732
888
  const root = chainRoot(node);
733
- if (root === null || !this.cjsBuiltinObjects.has(root.text))
889
+ if (root === null)
734
890
  return;
735
- const module = this.builtinBindings.get(root.text);
736
- if (module === undefined)
891
+ const binding = this.bindingAt(root.text, root);
892
+ if (binding === undefined || !binding.cjs || binding.builtin === null)
737
893
  return;
894
+ const module = binding.builtin;
738
895
  const text = chainText(node);
739
896
  const parent = node.parent;
740
897
  if (parent !== undefined) {
@@ -841,7 +998,7 @@ class ModuleScanner {
841
998
  return;
842
999
  }
843
1000
  if (this.isRequireCallee(callee) ||
844
- (ts.isIdentifier(callee) && this.createdRequires.has(callee.text))) {
1001
+ (ts.isIdentifier(callee) && this.bindingAt(callee.text, callee)?.createRequire === true)) {
845
1002
  if (first !== undefined && !isFoldableSpecifier(first))
846
1003
  this.add("R1.2", "dynamic-require", "require() with a computed specifier", call);
847
1004
  else if (first !== undefined)
@@ -883,7 +1040,7 @@ class ModuleScanner {
883
1040
  return;
884
1041
  }
885
1042
  const root = chainRoot(target);
886
- const rootBinding = root === null ? undefined : this.builtinBindings.get(root.text);
1043
+ const rootBinding = root === null ? undefined : (this.bindingAt(root.text, root)?.builtin ?? undefined);
887
1044
  const resolved = rootBinding !== undefined && root !== null
888
1045
  ? rootBinding + text.slice(root.text.length)
889
1046
  : text;
@@ -929,9 +1086,7 @@ class ModuleScanner {
929
1086
  // A definition on a builtin module's CommonJS object is a patch the
930
1087
  // code loading that object must see (R2.5, H3.1.4).
931
1088
  const target = first === undefined ? undefined : stripWrappers(first);
932
- const builtin = target !== undefined && ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)
933
- ? (this.builtinBindings.get(target.text) ?? null)
934
- : null;
1089
+ const builtin = target === undefined ? null : this.cjsModuleOf(target);
935
1090
  if (builtin !== null) {
936
1091
  const key = literalText(args[1] === undefined ? undefined : stripWrappers(args[1]));
937
1092
  this.add("R2.5", "builtin-patch", `'${text}()' on the builtin module '${builtin}'`, call, key === null ? `${builtin}.*` : `${builtin}.${key}`);
@@ -945,8 +1100,8 @@ class ModuleScanner {
945
1100
  // literal key is a patch (R2.5, H3.1.4).
946
1101
  if (text === "Object.assign" && this.isGlobal("Object") && first !== undefined) {
947
1102
  const target = stripWrappers(first);
948
- if (ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)) {
949
- const builtin = this.builtinBindings.get(target.text) ?? null;
1103
+ {
1104
+ const builtin = this.cjsModuleOf(target);
950
1105
  if (builtin !== null) {
951
1106
  const source = args.length === 2 ? stripWrappers(args[1]) : undefined;
952
1107
  const keys = source !== undefined && ts.isObjectLiteralExpression(source)
@@ -1075,7 +1230,8 @@ class ModuleScanner {
1075
1230
  }
1076
1231
  if (root === null)
1077
1232
  return;
1078
- const binding = this.builtinBindings.get(root.text);
1233
+ const resolvedBinding = this.bindingAt(root.text, root);
1234
+ const binding = resolvedBinding?.builtin ?? undefined;
1079
1235
  // Module internals: Module._load = …, Module.prototype.require = …
1080
1236
  if (text !== null) {
1081
1237
  const resolved = binding !== undefined ? binding + text.slice(root.text.length) : text;
@@ -1109,7 +1265,7 @@ class ModuleScanner {
1109
1265
  if (!this.allowedWrite(member)) {
1110
1266
  // A write through a builtin module's CommonJS object patches that
1111
1267
  // object; only code sharing Node's builtin can see it (H3.1).
1112
- const patch = this.cjsBuiltinObjects.has(root.text);
1268
+ const patch = resolvedBinding?.cjs === true;
1113
1269
  this.add("R2.5", patch ? "builtin-patch" : "builtin-write", `a ${what} of the builtin module member '${member}'`, node, patch ? member : undefined);
1114
1270
  }
1115
1271
  return;