@scriptc/compiler 0.4.6 → 0.4.7

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 (652) hide show
  1. package/ambient/node-fallback/events.d.ts +6 -1
  2. package/ambient/node-fallback/fs-promises.d.ts +1 -1
  3. package/ambient/node-fallback/fs.d.ts +54 -10
  4. package/ambient/node-fallback/http.d.ts +3 -1
  5. package/ambient/node-fallback/net.d.ts +19 -0
  6. package/ambient/node-fallback/querystring.d.ts +3 -3
  7. package/ambient/scriptc-node-fallback.d.ts +58 -13
  8. package/dist/backend/executable-features.js +13 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +12 -1
  11. package/dist/backend/immutability.js +50 -4
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/immutability.test.js +95 -1
  14. package/dist/backend/immutability.test.js.map +1 -1
  15. package/dist/backend/library-pack.js +2 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/linker.d.ts +11 -0
  18. package/dist/backend/linker.js +31 -3
  19. package/dist/backend/linker.js.map +1 -1
  20. package/dist/backend/lld.d.ts +7 -2
  21. package/dist/backend/lld.js +5 -3
  22. package/dist/backend/lld.js.map +1 -1
  23. package/dist/backend/lld.test.js +10 -4
  24. package/dist/backend/lld.test.js.map +1 -1
  25. package/dist/backend/llvm/constant-callbacks.test.js +50 -1
  26. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  27. package/dist/backend/llvm/cpu-dispatch.js +6 -5
  28. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  29. package/dist/backend/llvm/dyn.d.ts +53 -1
  30. package/dist/backend/llvm/dyn.js +221 -9
  31. package/dist/backend/llvm/dyn.js.map +1 -1
  32. package/dist/backend/llvm/emit-function.js +1 -1
  33. package/dist/backend/llvm/emit-function.js.map +1 -1
  34. package/dist/backend/llvm/emit-module.js +148 -50
  35. package/dist/backend/llvm/emit-module.js.map +1 -1
  36. package/dist/backend/llvm/emit-statements.js +39 -19
  37. package/dist/backend/llvm/emit-statements.js.map +1 -1
  38. package/dist/backend/llvm/emitter.d.ts +29 -2
  39. package/dist/backend/llvm/emitter.js +86 -7
  40. package/dist/backend/llvm/emitter.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +4 -1
  42. package/dist/backend/llvm/expr-calls.js +20 -4
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-dynamic.js +209 -16
  45. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +94 -11
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  49. package/dist/backend/llvm/expr-stream-bridges.js +42 -2
  50. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  51. package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
  52. package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
  53. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/integer-values.d.ts +2 -0
  55. package/dist/backend/llvm/integer-values.js +6 -0
  56. package/dist/backend/llvm/integer-values.js.map +1 -1
  57. package/dist/backend/llvm/js-ic.d.ts +38 -0
  58. package/dist/backend/llvm/js-ic.js +295 -1
  59. package/dist/backend/llvm/js-ic.js.map +1 -1
  60. package/dist/backend/llvm/lib-dispatch.js +20 -0
  61. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  62. package/dist/backend/llvm/lib-filesystem.js +116 -11
  63. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  64. package/dist/backend/llvm/lib-process.js +136 -24
  65. package/dist/backend/llvm/lib-process.js.map +1 -1
  66. package/dist/backend/llvm/lib-shared.js +70 -0
  67. package/dist/backend/llvm/lib-shared.js.map +1 -1
  68. package/dist/backend/llvm/lib-stream.js +67 -0
  69. package/dist/backend/llvm/lib-stream.js.map +1 -1
  70. package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
  71. package/dist/backend/llvm/loop-entry-versions.js +43 -21
  72. package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
  73. package/dist/backend/llvm/loop-state.d.ts +7 -1
  74. package/dist/backend/llvm/loop-state.js +20 -2
  75. package/dist/backend/llvm/loop-state.js.map +1 -1
  76. package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
  77. package/dist/backend/llvm/map-number-lookup.js +7 -3
  78. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  79. package/dist/backend/llvm/map-number-lookup.test.js +52 -11
  80. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  81. package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
  82. package/dist/backend/llvm/receiver-brackets.test.js +68 -0
  83. package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
  84. package/dist/backend/llvm/record-views.d.ts +22 -2
  85. package/dist/backend/llvm/record-views.js +139 -10
  86. package/dist/backend/llvm/record-views.js.map +1 -1
  87. package/dist/backend/llvm/record-views.test.js +76 -0
  88. package/dist/backend/llvm/record-views.test.js.map +1 -1
  89. package/dist/backend/llvm/reference-writes.js +1 -0
  90. package/dist/backend/llvm/reference-writes.js.map +1 -1
  91. package/dist/backend/llvm/shapes.d.ts +3 -0
  92. package/dist/backend/llvm/shapes.js +18 -3
  93. package/dist/backend/llvm/shapes.js.map +1 -1
  94. package/dist/backend/llvm/shapes.test.js +4 -0
  95. package/dist/backend/llvm/shapes.test.js.map +1 -1
  96. package/dist/backend/llvm/speculative-integers.d.ts +10 -1
  97. package/dist/backend/llvm/speculative-integers.js +59 -8
  98. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  99. package/dist/backend/llvm/unwind-abi.d.ts +3 -3
  100. package/dist/backend/llvm/unwind-abi.js +8 -3
  101. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  102. package/dist/backend/llvm/walkers.js +1 -1
  103. package/dist/backend/llvm/walkers.js.map +1 -1
  104. package/dist/backend/native/contracts.d.ts +54 -0
  105. package/dist/backend/native/executable.js +87 -5
  106. package/dist/backend/native/executable.js.map +1 -1
  107. package/dist/backend/native/library.js +1 -1
  108. package/dist/backend/native/library.js.map +1 -1
  109. package/dist/backend/native/runtime-inputs.js +5 -1
  110. package/dist/backend/native/runtime-inputs.js.map +1 -1
  111. package/dist/backend/native/vendor.d.ts +1 -1
  112. package/dist/backend/native/vendor.js +1 -1
  113. package/dist/backend/native/vendor.js.map +1 -1
  114. package/dist/backend/native-codegen.js +3 -0
  115. package/dist/backend/native-codegen.js.map +1 -1
  116. package/dist/backend/native-link-info-core.d.ts +43 -0
  117. package/dist/backend/native-link-info-core.js.map +1 -1
  118. package/dist/backend/native-link-info.js +1 -0
  119. package/dist/backend/native-link-info.js.map +1 -1
  120. package/dist/backend/native-profile.d.ts +4 -1
  121. package/dist/backend/native-profile.js +12 -1
  122. package/dist/backend/native-profile.js.map +1 -1
  123. package/dist/backend/native-profile.test.js +10 -0
  124. package/dist/backend/native-profile.test.js.map +1 -1
  125. package/dist/backend/publication.d.ts +4 -1
  126. package/dist/backend/publication.js +4 -2
  127. package/dist/backend/publication.js.map +1 -1
  128. package/dist/backend/runtime-abi.d.ts +2 -2
  129. package/dist/backend/runtime-abi.js +2 -2
  130. package/dist/backend/runtime-pack-core.d.ts +31 -7
  131. package/dist/backend/runtime-pack-core.js +21 -1
  132. package/dist/backend/runtime-pack-core.js.map +1 -1
  133. package/dist/backend/runtime-pack-native.d.ts +18 -1
  134. package/dist/backend/runtime-pack-native.js +138 -29
  135. package/dist/backend/runtime-pack-native.js.map +1 -1
  136. package/dist/backend/runtime-pack-native.test.js +166 -4
  137. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  138. package/dist/backend/runtime-pack-targets.test.js +3 -1
  139. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  140. package/dist/backend/runtime-pack.d.ts +7 -0
  141. package/dist/backend/runtime-pack.js +25 -3
  142. package/dist/backend/runtime-pack.js.map +1 -1
  143. package/dist/backend/runtime-pack.test.js +3 -11
  144. package/dist/backend/runtime-pack.test.js.map +1 -1
  145. package/dist/backend/vendor-archives.d.ts +4 -1
  146. package/dist/backend/vendor-archives.js +264 -3
  147. package/dist/backend/vendor-archives.js.map +1 -1
  148. package/dist/backend/vendor-inputs.d.ts +36 -0
  149. package/dist/backend/vendor-inputs.js +42 -0
  150. package/dist/backend/vendor-inputs.js.map +1 -1
  151. package/dist/backend/vendor-inputs.test.js +28 -1
  152. package/dist/backend/vendor-inputs.test.js.map +1 -1
  153. package/dist/backend/warm-cache.js +2 -0
  154. package/dist/backend/warm-cache.js.map +1 -1
  155. package/dist/compat/fetch-profile.d.ts +7 -1
  156. package/dist/compat/fetch-profile.js +23 -10
  157. package/dist/compat/fetch-profile.js.map +1 -1
  158. package/dist/compile-types.d.ts +7 -0
  159. package/dist/contracts/check.d.ts +3 -0
  160. package/dist/contracts/check.js +18 -5
  161. package/dist/contracts/check.js.map +1 -1
  162. package/dist/coverage/surface-manifest.js +1 -1
  163. package/dist/coverage/surface-manifest.js.map +1 -1
  164. package/dist/diagnostics/codes.d.ts +6 -0
  165. package/dist/diagnostics/codes.js +6 -0
  166. package/dist/diagnostics/codes.js.map +1 -1
  167. package/dist/diagnostics/diagnostic.d.ts +50 -0
  168. package/dist/diagnostics/diagnostic.js +142 -3
  169. package/dist/diagnostics/diagnostic.js.map +1 -1
  170. package/dist/diagnostics/dynamic-tier.js +3 -1
  171. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  172. package/dist/executable/executable-cache.d.ts +29 -0
  173. package/dist/executable/executable-cache.js +18 -0
  174. package/dist/executable/executable-cache.js.map +1 -1
  175. package/dist/executable/executable-cache.test.js +5 -1
  176. package/dist/executable/executable-cache.test.js.map +1 -1
  177. package/dist/executable/prepare.d.ts +13 -3
  178. package/dist/executable/prepare.js +271 -18
  179. package/dist/executable/prepare.js.map +1 -1
  180. package/dist/frontend/early-errors.d.ts +14 -0
  181. package/dist/frontend/early-errors.js +305 -0
  182. package/dist/frontend/early-errors.js.map +1 -0
  183. package/dist/frontend/early-errors.test.d.ts +1 -0
  184. package/dist/frontend/early-errors.test.js +42 -0
  185. package/dist/frontend/early-errors.test.js.map +1 -0
  186. package/dist/frontend/inferred-js-diagnostics.test.js +23 -0
  187. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  188. package/dist/frontend/input-tracker.d.ts +47 -0
  189. package/dist/frontend/input-tracker.js +173 -36
  190. package/dist/frontend/input-tracker.js.map +1 -1
  191. package/dist/frontend/input-tracker.test.js +86 -2
  192. package/dist/frontend/input-tracker.test.js.map +1 -1
  193. package/dist/frontend/js-inference.d.ts +2 -0
  194. package/dist/frontend/js-inference.js +18 -0
  195. package/dist/frontend/js-inference.js.map +1 -0
  196. package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
  197. package/dist/frontend/lowering/binding-analysis.js +65 -1
  198. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  199. package/dist/frontend/lowering/builtin-calls.js +9 -0
  200. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  201. package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
  202. package/dist/frontend/lowering/builtin-namespaces.js +19 -2
  203. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
  205. package/dist/frontend/lowering/builtins/child-process-methods.js +50 -10
  206. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/child-process.js +5 -1
  208. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
  210. package/dist/frontend/lowering/builtins/dates.js +23 -1
  211. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
  213. package/dist/frontend/lowering/builtins/environment.js +213 -2
  214. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  215. package/dist/frontend/lowering/builtins/filesystem-calls.js +47 -16
  216. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
  218. package/dist/frontend/lowering/builtins/filesystem.js +185 -16
  219. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-calls.js +39 -2
  221. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  222. package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
  223. package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
  224. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/operating-system.d.ts +3 -2
  226. package/dist/frontend/lowering/builtins/operating-system.js +5 -4
  227. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/process.d.ts +17 -1
  229. package/dist/frontend/lowering/builtins/process.js +285 -19
  230. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
  232. package/dist/frontend/lowering/builtins/querystring.js +202 -18
  233. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/readline.js +21 -3
  235. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  236. package/dist/frontend/lowering/builtins/reflection.js +60 -1
  237. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  238. package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
  239. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  240. package/dist/frontend/lowering/builtins/url.js +20 -1
  241. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
  243. package/dist/frontend/lowering/builtins/v8.js +7 -5
  244. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
  246. package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
  247. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
  248. package/dist/frontend/lowering/call-signatures.js +77 -0
  249. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  250. package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
  251. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  252. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  253. package/dist/frontend/lowering/cjs-inline-require.js +5 -0
  254. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  255. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +5 -0
  256. package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
  257. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  258. package/dist/frontend/lowering/class-protocols.js +59 -10
  259. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  260. package/dist/frontend/lowering/class-runtime-statics.js +15 -0
  261. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  262. package/dist/frontend/lowering/class-views.d.ts +13 -0
  263. package/dist/frontend/lowering/class-views.js +51 -0
  264. package/dist/frontend/lowering/class-views.js.map +1 -0
  265. package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
  266. package/dist/frontend/lowering/coercions/function-adapters.js +54 -10
  267. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  268. package/dist/frontend/lowering/coercions/state.d.ts +7 -0
  269. package/dist/frontend/lowering/coercions/state.js +7 -0
  270. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  271. package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
  272. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  273. package/dist/frontend/lowering/coercions/structural.js +29 -1
  274. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  275. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
  276. package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
  277. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-construction.js +16 -5
  279. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.js +16 -0
  281. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  282. package/dist/frontend/lowering/containers/bytes.js +4 -0
  283. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  284. package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
  285. package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
  286. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  287. package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
  288. package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
  289. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  290. package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
  291. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -0
  293. package/dist/frontend/lowering/expressions/array-literals.js +26 -10
  294. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/binary.js +104 -12
  296. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/element-access.js +121 -4
  298. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/identifiers.js +143 -3
  300. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  301. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
  302. package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
  303. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  304. package/dist/frontend/lowering/expressions/narrowing.js +25 -1
  305. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  306. package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
  307. package/dist/frontend/lowering/expressions/object-literals.js +778 -229
  308. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  309. package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
  310. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  311. package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
  312. package/dist/frontend/lowering/expressions/property-access.js +796 -12
  313. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  314. package/dist/frontend/lowering/expressions/relational.js +29 -1
  315. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  316. package/dist/frontend/lowering/expressions/typeof.js +17 -0
  317. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  318. package/dist/frontend/lowering/expressions/updates.js +132 -17
  319. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  320. package/dist/frontend/lowering/frozen-records.d.ts +6 -0
  321. package/dist/frontend/lowering/frozen-records.js +10 -4
  322. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  323. package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
  324. package/dist/frontend/lowering/frozen-records.test.js +44 -0
  325. package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
  326. package/dist/frontend/lowering/function-names.d.ts +9 -0
  327. package/dist/frontend/lowering/function-names.js +95 -0
  328. package/dist/frontend/lowering/function-names.js.map +1 -0
  329. package/dist/frontend/lowering/function-returns.js +5 -3
  330. package/dist/frontend/lowering/function-returns.js.map +1 -1
  331. package/dist/frontend/lowering/generic-functions.d.ts +49 -0
  332. package/dist/frontend/lowering/generic-functions.js +365 -7
  333. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  334. package/dist/frontend/lowering/global-values.d.ts +9 -0
  335. package/dist/frontend/lowering/global-values.js +44 -0
  336. package/dist/frontend/lowering/global-values.js.map +1 -1
  337. package/dist/frontend/lowering/handle-properties.js +34 -1
  338. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  339. package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
  340. package/dist/frontend/lowering/key-order-witness.js +546 -5
  341. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  342. package/dist/frontend/lowering/lib-boundary.js +14 -0
  343. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  344. package/dist/frontend/lowering/lower-assert.js +110 -1
  345. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  346. package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
  347. package/dist/frontend/lowering/lower-builtin-values.js +332 -58
  348. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  349. package/dist/frontend/lowering/lower-calls.d.ts +22 -1
  350. package/dist/frontend/lowering/lower-calls.js +427 -48
  351. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  352. package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
  353. package/dist/frontend/lowering/lower-calls.test.js +78 -0
  354. package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
  355. package/dist/frontend/lowering/lower-classes.d.ts +16 -5
  356. package/dist/frontend/lowering/lower-classes.js +168 -51
  357. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  358. package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
  359. package/dist/frontend/lowering/lower-event-emitter.js +383 -41
  360. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  361. package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
  362. package/dist/frontend/lowering/lower-exprs.js +25 -0
  363. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  364. package/dist/frontend/lowering/lower-functions.js +2 -0
  365. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  366. package/dist/frontend/lowering/lower-inspect.js +80 -33
  367. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  368. package/dist/frontend/lowering/lower-modules.js +87 -25
  369. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  370. package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
  371. package/dist/frontend/lowering/lower-node-island.js +456 -61
  372. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  373. package/dist/frontend/lowering/lower-server.js +160 -9
  374. package/dist/frontend/lowering/lower-server.js.map +1 -1
  375. package/dist/frontend/lowering/lower-shared-modules.js +13 -1
  376. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
  377. package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
  378. package/dist/frontend/lowering/lower-stdlib.js +32 -18
  379. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  380. package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
  381. package/dist/frontend/lowering/lower-stmts.js +580 -103
  382. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  383. package/dist/frontend/lowering/lower-stream.js +126 -8
  384. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  385. package/dist/frontend/lowering/lower-timers.js +133 -21
  386. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  387. package/dist/frontend/lowering/lowerer.d.ts +139 -3
  388. package/dist/frontend/lowering/lowerer.js +579 -43
  389. package/dist/frontend/lowering/lowerer.js.map +1 -1
  390. package/dist/frontend/lowering/lowerer.test.js +1 -1
  391. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  392. package/dist/frontend/lowering/module-namespace-elements.js +15 -0
  393. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  394. package/dist/frontend/lowering/new-target.js +2 -2
  395. package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
  396. package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
  397. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
  398. package/dist/frontend/lowering/partial-assertions.d.ts +39 -0
  399. package/dist/frontend/lowering/partial-assertions.js +195 -0
  400. package/dist/frontend/lowering/partial-assertions.js.map +1 -0
  401. package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
  402. package/dist/frontend/lowering/primitive-wrappers.js +220 -0
  403. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
  404. package/dist/frontend/lowering/private-statics.d.ts +46 -0
  405. package/dist/frontend/lowering/private-statics.js +322 -0
  406. package/dist/frontend/lowering/private-statics.js.map +1 -0
  407. package/dist/frontend/lowering/record-sources.d.ts +12 -1
  408. package/dist/frontend/lowering/record-sources.js +60 -0
  409. package/dist/frontend/lowering/record-sources.js.map +1 -1
  410. package/dist/frontend/lowering/strict-equality.d.ts +4 -0
  411. package/dist/frontend/lowering/strict-equality.js +14 -0
  412. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  413. package/dist/frontend/lowering/surfaces.d.ts +27 -0
  414. package/dist/frontend/lowering/surfaces.js +135 -62
  415. package/dist/frontend/lowering/surfaces.js.map +1 -1
  416. package/dist/frontend/lowering/unit-journal.d.ts +128 -17
  417. package/dist/frontend/lowering/unit-journal.js +310 -53
  418. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  419. package/dist/frontend/lowering/unit-journal.test.js +91 -3
  420. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  421. package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
  422. package/dist/frontend/lowering/unit-reuse.js +1008 -0
  423. package/dist/frontend/lowering/unit-reuse.js.map +1 -0
  424. package/dist/frontend/lowering/width-lift.d.ts +12 -0
  425. package/dist/frontend/npm-file-import.test.d.ts +1 -0
  426. package/dist/frontend/npm-file-import.test.js +76 -0
  427. package/dist/frontend/npm-file-import.test.js.map +1 -0
  428. package/dist/frontend/npm-static.js +17 -2
  429. package/dist/frontend/npm-static.js.map +1 -1
  430. package/dist/frontend/npm.d.ts +9 -0
  431. package/dist/frontend/npm.js +82 -0
  432. package/dist/frontend/npm.js.map +1 -1
  433. package/dist/frontend/pipeline-native.js +2 -1
  434. package/dist/frontend/pipeline-native.js.map +1 -1
  435. package/dist/frontend/pipeline.d.ts +4 -0
  436. package/dist/frontend/pipeline.js +68 -7
  437. package/dist/frontend/pipeline.js.map +1 -1
  438. package/dist/frontend/program-node.d.ts +3 -0
  439. package/dist/frontend/program-node.js +13 -6
  440. package/dist/frontend/program-node.js.map +1 -1
  441. package/dist/frontend/program.d.ts +9 -0
  442. package/dist/frontend/program.js +159 -7
  443. package/dist/frontend/program.js.map +1 -1
  444. package/dist/frontend/provenance-core.js +4 -0
  445. package/dist/frontend/provenance-core.js.map +1 -1
  446. package/dist/frontend/services.d.ts +14 -0
  447. package/dist/frontend/services.js +52 -2
  448. package/dist/frontend/services.js.map +1 -1
  449. package/dist/frontend/services.test.js +61 -1
  450. package/dist/frontend/services.test.js.map +1 -1
  451. package/dist/frontend/shape-inference/analyze.d.ts +5 -0
  452. package/dist/frontend/shape-inference/analyze.js +104 -4
  453. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  454. package/dist/frontend/shape-inference/domain.js +0 -1
  455. package/dist/frontend/shape-inference/domain.js.map +1 -1
  456. package/dist/frontend/shape-inference/index.js +5 -1
  457. package/dist/frontend/shape-inference/index.js.map +1 -1
  458. package/dist/frontend/shape-inference/memo.d.ts +2 -1
  459. package/dist/frontend/shape-inference/memo.js +6 -2
  460. package/dist/frontend/shape-inference/memo.js.map +1 -1
  461. package/dist/frontend/shape-inference/overlay.d.ts +1 -1
  462. package/dist/frontend/shape-inference/overlay.js +116 -2
  463. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  464. package/dist/frontend/shape-inference/static-objects.js +11 -6
  465. package/dist/frontend/shape-inference/static-objects.js.map +1 -1
  466. package/dist/frontend/source-phase-imports.test.d.ts +1 -0
  467. package/dist/frontend/source-phase-imports.test.js +37 -0
  468. package/dist/frontend/source-phase-imports.test.js.map +1 -0
  469. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  470. package/dist/frontend/ts7/ast-node.js +12 -0
  471. package/dist/frontend/ts7/ast-node.js.map +1 -1
  472. package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
  473. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
  474. package/dist/frontend/ts7/ast-wire.js +3 -5
  475. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  476. package/dist/frontend/ts7/checker-backend.d.ts +13 -0
  477. package/dist/frontend/ts7/checker-backend.js +84 -2
  478. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  479. package/dist/frontend/ts7/checker-backend.test.js +126 -2
  480. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  481. package/dist/frontend/ts7/program-host.d.ts +22 -1
  482. package/dist/frontend/ts7/program-host.js +49 -4
  483. package/dist/frontend/ts7/program-host.js.map +1 -1
  484. package/dist/frontend/ts7/program-host.test.js +83 -0
  485. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  486. package/dist/frontend/ts7/rpc-process.d.ts +16 -1
  487. package/dist/frontend/ts7/rpc-process.js +170 -92
  488. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  489. package/dist/frontend/ts7/rpc-process.test.js +49 -21
  490. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  491. package/dist/frontend/tsc-codes.js +70 -0
  492. package/dist/frontend/tsc-codes.js.map +1 -1
  493. package/dist/frontend/type-mapper.d.ts +7 -2
  494. package/dist/frontend/type-mapper.js +148 -1
  495. package/dist/frontend/type-mapper.js.map +1 -1
  496. package/dist/index.d.ts +1 -1
  497. package/dist/index.js +152 -8
  498. package/dist/index.js.map +1 -1
  499. package/dist/ir/api.d.ts +1 -1
  500. package/dist/ir/api.js +1 -1
  501. package/dist/ir/api.js.map +1 -1
  502. package/dist/ir/build.d.ts +3 -2
  503. package/dist/ir/build.js +4 -2
  504. package/dist/ir/build.js.map +1 -1
  505. package/dist/ir/builtin-effects.js +53 -0
  506. package/dist/ir/builtin-effects.js.map +1 -1
  507. package/dist/ir/builtin-signatures.d.ts +1 -1
  508. package/dist/ir/builtin-signatures.js +211 -10
  509. package/dist/ir/builtin-signatures.js.map +1 -1
  510. package/dist/ir/codec.d.ts +82 -0
  511. package/dist/ir/codec.generated.d.ts +13 -0
  512. package/dist/ir/codec.generated.js +5274 -0
  513. package/dist/ir/codec.generated.js.map +1 -0
  514. package/dist/ir/codec.js +325 -0
  515. package/dist/ir/codec.js.map +1 -0
  516. package/dist/ir/codec.test.d.ts +1 -0
  517. package/dist/ir/codec.test.js +225 -0
  518. package/dist/ir/codec.test.js.map +1 -0
  519. package/dist/ir/fields.generated.d.ts +20 -10
  520. package/dist/ir/fields.generated.js +1031 -11
  521. package/dist/ir/fields.generated.js.map +1 -1
  522. package/dist/ir/fields.test.js +46 -2
  523. package/dist/ir/fields.test.js.map +1 -1
  524. package/dist/ir/function-references.d.ts +5 -4
  525. package/dist/ir/function-references.js +8 -4
  526. package/dist/ir/function-references.js.map +1 -1
  527. package/dist/ir/function-references.test.js +7 -0
  528. package/dist/ir/function-references.test.js.map +1 -1
  529. package/dist/ir/inline-array-sources.js +4 -1
  530. package/dist/ir/inline-array-sources.js.map +1 -1
  531. package/dist/ir/inline-array-views.d.ts +13 -0
  532. package/dist/ir/inline-array-views.js +944 -0
  533. package/dist/ir/inline-array-views.js.map +1 -0
  534. package/dist/ir/inline-arrays.d.ts +7 -0
  535. package/dist/ir/inline-arrays.js +190 -55
  536. package/dist/ir/inline-arrays.js.map +1 -1
  537. package/dist/ir/inline-arrays.test.js +140 -2
  538. package/dist/ir/inline-arrays.test.js.map +1 -1
  539. package/dist/ir/integer-ranges.js +16 -6
  540. package/dist/ir/integer-ranges.js.map +1 -1
  541. package/dist/ir/ir.d.ts +75 -44
  542. package/dist/ir/ir.js.map +1 -1
  543. package/dist/ir/js-ic.d.ts +10 -9
  544. package/dist/ir/js-ic.js +28 -20
  545. package/dist/ir/js-ic.js.map +1 -1
  546. package/dist/ir/js-ic.test.js +10 -2
  547. package/dist/ir/js-ic.test.js.map +1 -1
  548. package/dist/ir/jsval.js +374 -63
  549. package/dist/ir/jsval.js.map +1 -1
  550. package/dist/ir/jsval.test.js +96 -2
  551. package/dist/ir/jsval.test.js.map +1 -1
  552. package/dist/ir/loop-entry-ranges.js +112 -9
  553. package/dist/ir/loop-entry-ranges.js.map +1 -1
  554. package/dist/ir/loop-entry-ranges.test.js +40 -0
  555. package/dist/ir/loop-entry-ranges.test.js.map +1 -1
  556. package/dist/ir/parameter-versions.d.ts +2 -1
  557. package/dist/ir/parameter-versions.js +3 -1
  558. package/dist/ir/parameter-versions.js.map +1 -1
  559. package/dist/ir/receiver-readers.js +58 -2
  560. package/dist/ir/receiver-readers.js.map +1 -1
  561. package/dist/ir/runtime-features.d.ts +60 -1
  562. package/dist/ir/runtime-features.js +277 -2
  563. package/dist/ir/runtime-features.js.map +1 -1
  564. package/dist/ir/runtime-features.test.js +165 -1
  565. package/dist/ir/runtime-features.test.js.map +1 -1
  566. package/dist/ir/saturating-loop-jams.d.ts +8 -1
  567. package/dist/ir/saturating-loop-jams.js +46 -7
  568. package/dist/ir/saturating-loop-jams.js.map +1 -1
  569. package/dist/ir/saturating-loop-jams.test.js +39 -1
  570. package/dist/ir/saturating-loop-jams.test.js.map +1 -1
  571. package/dist/ir/self-captures.js +8 -1
  572. package/dist/ir/self-captures.js.map +1 -1
  573. package/dist/ir/self-captures.test.js +15 -0
  574. package/dist/ir/self-captures.test.js.map +1 -1
  575. package/dist/ir/serialize.d.ts +3 -2
  576. package/dist/ir/serialize.js +6 -2
  577. package/dist/ir/serialize.js.map +1 -1
  578. package/dist/ir/validate.js +82 -4
  579. package/dist/ir/validate.js.map +1 -1
  580. package/dist/ir/validate.test.js +46 -0
  581. package/dist/ir/validate.test.js.map +1 -1
  582. package/dist/library/ir-policy.js +3 -0
  583. package/dist/library/ir-policy.js.map +1 -1
  584. package/dist/native/cache.js +2 -0
  585. package/dist/native/cache.js.map +1 -1
  586. package/dist/native/cli.js +2 -0
  587. package/dist/native/cli.js.map +1 -1
  588. package/dist/native/compiler.js +8 -2
  589. package/dist/native/compiler.js.map +1 -1
  590. package/dist/native/prepare.js +32 -3
  591. package/dist/native/prepare.js.map +1 -1
  592. package/dist/native/sanitizer.js +53 -3
  593. package/dist/native/sanitizer.js.map +1 -1
  594. package/dist/native/sanitizer.test.js +88 -2
  595. package/dist/native/sanitizer.test.js.map +1 -1
  596. package/dist/native/toolchain.js +9 -2
  597. package/dist/native/toolchain.js.map +1 -1
  598. package/dist/node-islands/boundary.d.ts +25 -1
  599. package/dist/node-islands/boundary.js +28 -2
  600. package/dist/node-islands/boundary.js.map +1 -1
  601. package/dist/node-islands/detect.d.ts +18 -1
  602. package/dist/node-islands/detect.js +365 -40
  603. package/dist/node-islands/detect.js.map +1 -1
  604. package/dist/node-islands/detect.test.js +151 -4
  605. package/dist/node-islands/detect.test.js.map +1 -1
  606. package/dist/node-islands/effect-gate.js +30 -20
  607. package/dist/node-islands/effect-gate.js.map +1 -1
  608. package/dist/node-islands/effect-gate.test.js +4 -1
  609. package/dist/node-islands/effect-gate.test.js.map +1 -1
  610. package/dist/node-islands/libnode.d.ts +1 -1
  611. package/dist/node-islands/libnode.js +1 -1
  612. package/dist/node-islands/libnode.js.map +1 -1
  613. package/dist/node-islands/modules.d.ts +28 -0
  614. package/dist/node-islands/modules.js +156 -0
  615. package/dist/node-islands/modules.js.map +1 -1
  616. package/dist/node-islands/modules.test.js +105 -1
  617. package/dist/node-islands/modules.test.js.map +1 -1
  618. package/dist/node-islands/policy.js +2 -3
  619. package/dist/node-islands/policy.js.map +1 -1
  620. package/dist/node-islands/probe-recorder.d.ts +1 -0
  621. package/dist/node-islands/probe-recorder.js +596 -0
  622. package/dist/node-islands/probe-recorder.js.map +1 -0
  623. package/dist/node-islands/probe-recorder.test.d.ts +1 -0
  624. package/dist/node-islands/probe-recorder.test.js +80 -0
  625. package/dist/node-islands/probe-recorder.test.js.map +1 -0
  626. package/dist/node-islands/report.test.js +2 -0
  627. package/dist/node-islands/report.test.js.map +1 -1
  628. package/dist/node-islands/rules.js +4 -0
  629. package/dist/node-islands/rules.js.map +1 -1
  630. package/dist/node-islands/scan.d.ts +7 -1
  631. package/dist/node-islands/scan.js +51 -2
  632. package/dist/node-islands/scan.js.map +1 -1
  633. package/dist/node-islands/snapshot.d.ts +38 -1
  634. package/dist/node-islands/snapshot.js +165 -161
  635. package/dist/node-islands/snapshot.js.map +1 -1
  636. package/dist/node-islands/snapshot.test.js +63 -2
  637. package/dist/node-islands/snapshot.test.js.map +1 -1
  638. package/dist/node-islands/summary.js +8 -0
  639. package/dist/node-islands/summary.js.map +1 -1
  640. package/dist/node-islands/type-strip.d.ts +11 -0
  641. package/dist/node-islands/type-strip.js +157 -0
  642. package/dist/node-islands/type-strip.js.map +1 -0
  643. package/dist/node-islands/type-strip.test.d.ts +1 -0
  644. package/dist/node-islands/type-strip.test.js +31 -0
  645. package/dist/node-islands/type-strip.test.js.map +1 -0
  646. package/dist/project-config.d.ts +4 -0
  647. package/dist/project-config.js +19 -0
  648. package/dist/project-config.js.map +1 -1
  649. package/dist/project-config.test.js +10 -0
  650. package/dist/project-config.test.js.map +1 -1
  651. package/package.json +20 -20
  652. package/surface-manifest.json +43 -11
@@ -24,13 +24,16 @@
24
24
  * same vector handles varying or inference-unknown JavaScript emit tuples
25
25
  * when every known listener accepts checked-dynamic parameters or no
26
26
  * parameters. Typed listener constraints keep the fixed-tuple refusal.
27
- * The remaining cases are fenced:
28
- * unrestricted names, symbol names, conflicting literal tuples, the
29
- * meta-events' listener-function argument (meta listeners take at most
27
+ * Unrestricted names on plain emitters take the checked-dynamic receiver's
28
+ * bridge. The remaining cases are fenced:
29
+ * unrestricted names on streams, symbol names, conflicting literal tuples,
30
+ * the meta-events' listener-function argument (meta listeners take at most
30
31
  * the event name; dyn meta listeners fence — Node
31
32
  * passes the listener function second, which has no dyn conversion), and
32
33
  * listeners()/rawListeners() of an event with any dynamic
33
- * registration (the bucket has no one honest element type).
34
+ * registration, or, once the program registers a listener under an
35
+ * unrestricted name, of an event that literal names register with typed
36
+ * listeners (the bucket has no one honest element type).
34
37
  *
35
38
  * Two special names: 'error' is forced to the one-%Error tuple (emit
36
39
  * routes through emitter.emitError — no listener means the payload
@@ -44,9 +47,13 @@
44
47
  * super.emit as the prototype chain). */
45
48
  import { keyedHelperName } from "./stable-names.js";
46
49
  import { checkKeypressListener } from "./builtins/readline.js";
50
+ import { stripTypeCasts } from "./builtins/arguments.js";
47
51
  import * as ts from "../ts7/adapter.js";
48
52
  import { dynFallbackType, newFnCtx } from "./lowerer.js";
49
53
  import { isJsSourceFile, locOf } from "../program.js";
54
+ import { bodyReadsArguments } from "../arguments-usage.js";
55
+ import { functionUsesThis } from "./cjs-exports-object.js";
56
+ import { isThisParameter } from "./call-signatures.js";
50
57
  import { arrayOf, BOOL, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, isDynTypedRefType, DYN, F64, isUnitType, STRING, typeEquals, typeKey, VOID, } from "../../ir/ir.js";
51
58
  import { STREAM_FORCED_EVENT_NAMES, streamForcedTuple, streamSidesOf } from "./lower-stream.js";
52
59
  import { boolLit, dynUndefinedExpr, strLit, varRef } from "../../ir/build.js";
@@ -70,6 +77,47 @@ const REGISTER_MEMBERS = new Set([
70
77
  "prependOnceListener",
71
78
  ]);
72
79
  const META_EVENTS = new Set(["newListener", "removeListener"]);
80
+ /** Whether `t` is an instance type of the Error hierarchy. */
81
+ function rootsAtError(lowerer, t) {
82
+ if (t?.kind !== "object")
83
+ return false;
84
+ for (let c = lowerer.classes.get(t.className) ?? null; c; c = c.base) {
85
+ if (c.def.name === "%Error")
86
+ return true;
87
+ }
88
+ return false;
89
+ }
90
+ /** Whether the scan recorded a dyn-flavored 'newListener' or 'removeListener'
91
+ * listener. Then every listener registers through the adapter, typed meta
92
+ * listeners included, so each entry has a function value to pass. */
93
+ function hasDynMetaListener(table) {
94
+ return [...META_EVENTS].some((meta) => table.get(meta)?.dynListener === true);
95
+ }
96
+ /** Whether a typed listener of `name` registers through the dyn adapter, so
97
+ * its entry holds a checked-dynamic function value: a dyn-flavored
98
+ * 'newListener' or 'removeListener' listener receives every added or
99
+ * removed listener as one, and a read listener array beside dyn-flavored
100
+ * listeners holds them. Listeners of 'error' and errorMonitor do when an
101
+ * emit passes a payload that is not an Error: the adapter's checked
102
+ * conversion admits it or throws a TypeError. */
103
+ function registersAsDyn(lowerer, name, streamForced) {
104
+ const table = emitterEvents(lowerer);
105
+ if (hasDynMetaListener(table))
106
+ return true;
107
+ if ((name === "error" || name === ERROR_MONITOR_EVENT) && table.get("error")?.valueEmit === true)
108
+ return true;
109
+ const sig = streamForced ? undefined : table.get(name);
110
+ return sig?.dynListener === true && sig.listenersRead === true;
111
+ }
112
+ /** Whether the event's listener array is read as checked-dynamic values:
113
+ * its registrations all hold a checked-dynamic function value (flexible
114
+ * and computed-name events, or a dyn-flavored listener beside a read of
115
+ * the array). */
116
+ function listenerArrayIsDyn(lowerer, name, sig) {
117
+ return ((sig?.dynListener === true && sig.listenersRead === true) ||
118
+ flexibleJsEvent(name, sig) ||
119
+ computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, name)));
120
+ }
73
121
  function flexibleJsEvent(name, sig) {
74
122
  // A stream may be upcast to EventEmitter. Its runtime-emitted payloads
75
123
  // keep their fixed ABI even when the static receiver looks ordinary.
@@ -115,6 +163,7 @@ function emitterEvents(lowerer) {
115
163
  return lowerer.emitterEventTable;
116
164
  const table = new Map();
117
165
  const computedPatterns = [];
166
+ let anyNameListener = false;
118
167
  const sigOf = (name) => {
119
168
  let sig = table.get(name);
120
169
  if (!sig)
@@ -223,14 +272,51 @@ function emitterEvents(lowerer) {
223
272
  }
224
273
  }
225
274
  };
275
+ // Events whose listener array is read; applied to the table after the
276
+ // walk, so a read alone adds no entry.
277
+ const listenersRead = new Set();
226
278
  for (const sf of lowerer.program.getImplementationSourceFiles()) {
227
279
  if (sf.isDeclarationFile)
228
280
  continue;
229
281
  const walk = (node) => {
230
282
  ts.forEachChild(node, walk);
231
- if (!ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression))
283
+ if (!ts.isCallExpression(node))
232
284
  return;
233
- const member = node.expression.name.text;
285
+ const callee = node.expression;
286
+ if ((ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) &&
287
+ (ts.isIdentifier(callee) ? callee : callee.name).text === "getEventListeners" &&
288
+ node.arguments.nodes.length === 2) {
289
+ const nameT = (() => {
290
+ try {
291
+ return lowerer.typeOf(node.arguments.nodes[1]);
292
+ }
293
+ catch {
294
+ return null;
295
+ }
296
+ })();
297
+ if (nameT?.isStringLiteralType())
298
+ listenersRead.add(literalEventKey(nameT.value));
299
+ return;
300
+ }
301
+ if (!ts.isPropertyAccessExpression(callee))
302
+ return;
303
+ const member = callee.name.text;
304
+ if (member === "listeners" || member === "rawListeners") {
305
+ const arg = node.arguments.nodes[0];
306
+ let nameT = null;
307
+ try {
308
+ if (!arg ||
309
+ !scannedEmitterInfo(lowerer, lowerer.mapTypeOf(lowerer.typeOf(callee.expression))))
310
+ return;
311
+ nameT = lowerer.typeOf(arg);
312
+ }
313
+ catch {
314
+ return;
315
+ }
316
+ if (nameT.isStringLiteralType())
317
+ listenersRead.add(literalEventKey(nameT.value));
318
+ return;
319
+ }
234
320
  const isEmit = member === "emit";
235
321
  if (!isEmit && !REGISTER_MEMBERS.has(member))
236
322
  return;
@@ -240,7 +326,7 @@ function emitterEvents(lowerer) {
240
326
  let recvT = null;
241
327
  let nameT = null;
242
328
  try {
243
- recvT = lowerer.mapTypeOf(lowerer.typeOf(node.expression.expression));
329
+ recvT = lowerer.mapTypeOf(lowerer.typeOf(callee.expression));
244
330
  nameT = lowerer.typeOf(arg0);
245
331
  }
246
332
  catch {
@@ -261,9 +347,54 @@ function emitterEvents(lowerer) {
261
347
  !computedPatternOverlapsReserved(pattern)) {
262
348
  computedPatterns.push({ ...pattern, listener: !isEmit });
263
349
  }
350
+ // A listener under an unrestricted name may receive any event
351
+ // (lowerFlexListenerCall's any-name path).
352
+ if (!pattern && !isEmit && streamSidesOf(lowerer, info) === null)
353
+ anyNameListener = true;
264
354
  return;
265
355
  }
266
356
  const name = literal;
357
+ if (META_EVENTS.has(name) && !isEmit && node.arguments.nodes[1]) {
358
+ // A dyn-flavored meta listener receives each added or removed
359
+ // listener as a checked-dynamic function value. The scan cannot
360
+ // lower the listener as dynListenerFlavor does, so it counts every
361
+ // listener that is not statically a typed function: a factory's
362
+ // result (a wrapper whose runtime value is checked-dynamic), a
363
+ // JavaScript function without parameters, and the dyn-flavored
364
+ // forms. Counting one too many only routes more registrations
365
+ // through the adapter.
366
+ const cbNode = node.arguments.nodes[1];
367
+ let typed = false;
368
+ try {
369
+ const cbCt = lowerer.typeOf(cbNode);
370
+ const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, cbNode, cbCt);
371
+ typed =
372
+ cbT?.kind === "func" &&
373
+ !ts.isCallExpression(stripTypeCasts(cbNode)) &&
374
+ !(cbT.params.length === 0 && isJsSourceFile(sf)) &&
375
+ !cbT.params.some((p) => p.kind === "dyn") &&
376
+ !readsArgumentsPack(lowerer, cbNode);
377
+ }
378
+ catch {
379
+ typed = false;
380
+ }
381
+ if (!typed)
382
+ table.get(name).dynListener = true;
383
+ return;
384
+ }
385
+ if (isEmit && name === "error") {
386
+ try {
387
+ const payload = node.arguments.nodes.slice(1);
388
+ if (payload.length !== 1 ||
389
+ !rootsAtError(lowerer, lowerer.mapTypeOf(lowerer.typeOf(payload[0])))) {
390
+ table.get("error").valueEmit = true;
391
+ }
392
+ }
393
+ catch {
394
+ table.get("error").valueEmit = true;
395
+ }
396
+ return;
397
+ }
267
398
  if (META_EVENTS.has(name) || name === "error" || name === ERROR_MONITOR_EVENT)
268
399
  return; // forced tuples
269
400
  // Stream receivers' runtime-emitted events carry PER-BASE forced
@@ -279,11 +410,13 @@ function emitterEvents(lowerer) {
279
410
  else if (node.arguments.nodes[1]) {
280
411
  const cbCt = lowerer.typeOf(node.arguments.nodes[1]);
281
412
  const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, node.arguments.nodes[1], cbCt);
413
+ const pack = readsArgumentsPack(lowerer, node.arguments.nodes[1]);
282
414
  // A TypeScript listener with no parameters is typed too: it
283
415
  // registers without the adapter, so an untyped emit reaches it
284
416
  // only through the event's fixed ABI. A JavaScript function
285
417
  // without parameters can still read `arguments`.
286
- if (cbT?.kind !== "dyn" &&
418
+ if (!pack &&
419
+ cbT?.kind !== "dyn" &&
287
420
  (cbT?.kind !== "func" ||
288
421
  (cbT.params.length === 0 && !isJsSourceFile(sf)) ||
289
422
  cbT.params.some((p) => p.kind !== "dyn"))) {
@@ -295,7 +428,8 @@ function emitterEvents(lowerer) {
295
428
  // tuple position, and positions past the tuple read the boxed
296
429
  // undefined (exactly JS's extra-parameter semantics).
297
430
  if (cbT?.kind === "dyn" ||
298
- (cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn"))) {
431
+ (cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn")) ||
432
+ pack) {
299
433
  const sig = sigOf(name);
300
434
  sig.hasListener = true;
301
435
  sig.dynListener = true;
@@ -311,8 +445,14 @@ function emitterEvents(lowerer) {
311
445
  };
312
446
  walk(sf);
313
447
  }
448
+ for (const name of listenersRead) {
449
+ const sig = table.get(name);
450
+ if (sig)
451
+ sig.listenersRead = true;
452
+ }
314
453
  lowerer.emitterEventTable = table;
315
454
  lowerer.emitterComputedPatterns = computedPatterns;
455
+ lowerer.emitterAnyNameListener = anyNameListener;
316
456
  return table;
317
457
  }
318
458
  function computedPatterns(lowerer) {
@@ -467,6 +607,16 @@ function patternMatchesName(pattern, key) {
467
607
  const name = eventKeyName(key);
468
608
  return name.startsWith(pattern.prefix) && name.endsWith(pattern.suffix);
469
609
  }
610
+ /** Whether a listener registered under a computed name may sit in the
611
+ * bucket of the event keyed `key`: a pattern registration that matches it,
612
+ * or any registration under an unrestricted name (a string, so never the
613
+ * errorMonitor key). Such a listener crossed
614
+ * the checked-dynamic boundary, so the bucket has no one static signature. */
615
+ function computedListenerMayHold(lowerer, key) {
616
+ emitterEvents(lowerer);
617
+ return ((lowerer.emitterAnyNameListener && key !== ERROR_MONITOR_EVENT) ||
618
+ computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, key)));
619
+ }
470
620
  /** A computed event can use the variable-arity dyn path only when its
471
621
  * syntax proves a nonempty prefix or suffix excluding internal events. */
472
622
  function computedEventPattern(lowerer, info, member, arg) {
@@ -483,7 +633,7 @@ function computedEventPattern(lowerer, info, member, arg) {
483
633
  * checked-dynamic function boundary, which validates typed parameters.
484
634
  * The runtime retains the original closure and its checked-dynamic thunk,
485
635
  * supplying the exact emit argc without a fixed-tuple or varargs ABI. */
486
- function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc) {
636
+ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc, onFn = "emitter.onFlex", bridge = false) {
487
637
  if (receiver.type.kind !== "object") {
488
638
  lowerer.noLowering(`${member} with a nullable or non-emitter receiver`, cbNode, "narrow the receiver to an EventEmitter instance before registering or removing a computed-name listener");
489
639
  }
@@ -507,10 +657,20 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
507
657
  lowerer.noLowering(`${member} with a non-function computed-name listener`, cbNode);
508
658
  }
509
659
  const recvT = receiver.type;
510
- const key = `emitter.${registering ? "onFlex" : "offDyn"}:${typeKey(recvT)}`;
660
+ // An UNRESTRICTED name (`bridge`) may be any event, including 'error',
661
+ // the meta events, and the literal events typed code fixes a tuple for:
662
+ // register through the checked-dynamic receiver's bridge (typed adapters
663
+ // for those events, the thunk alone otherwise), which keeps Node's
664
+ // contract for each.
665
+ if (bridge && registering) {
666
+ const bridged = lowerDynamicEmitterOn(lowerer, receiver, name, boxed, once, prepend, loc);
667
+ if (bridged)
668
+ return bridged;
669
+ }
670
+ const key = `${registering ? onFn : "emitter.offDyn"}:${typeKey(recvT)}`;
511
671
  let helper = lowerer.arrHofHelpers.get(key);
512
672
  if (!helper) {
513
- helper = keyedHelperName(lowerer, `%emitter.${registering ? "onFlex" : "offFlex"}`, key);
673
+ helper = keyedHelperName(lowerer, `%${registering ? onFn : "emitter.offFlex"}`, key);
514
674
  lowerer.arrHofHelpers.set(key, helper);
515
675
  const params = [
516
676
  { localId: "r.0", name: "r", type: recvT },
@@ -545,7 +705,7 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
545
705
  kind: "return",
546
706
  value: {
547
707
  kind: "libCall",
548
- fn: registering ? "emitter.onFlex" : "emitter.offDyn",
708
+ fn: registering ? onFn : "emitter.offDyn",
549
709
  args: [
550
710
  varRef("r.0", recvT, loc),
551
711
  varRef("n.0", STRING, loc),
@@ -573,6 +733,44 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
573
733
  loc,
574
734
  };
575
735
  }
736
+ /** A lowered value as a checked-dynamic payload: boxed as any untyped
737
+ * value is (records and arrays keep their identity), otherwise a refusal
738
+ * at the argument. */
739
+ function boxedPayload(lowerer, value, node) {
740
+ if (value.type.kind === "dyn")
741
+ return value;
742
+ if (value.kind === "unitLit" ||
743
+ canConvertToDyn(value.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
744
+ return lowerer.coerceToExpected(value, DYN);
745
+ }
746
+ lowerer.noLowering(`emit('error') with a '${lowerer.fmt(value.type)}' payload`, node, "the payload cannot box into a dynamic value");
747
+ }
748
+ /** The listener array of an event whose registrations all hold a checked-
749
+ * dynamic function value (listenerArrayIsDyn), each comparing equal to the
750
+ * function that was registered. JavaScript sources read the untyped array,
751
+ * whose functions take every argument a call passes. TypeScript sources
752
+ * read the element type the typed path declares, the event's tuple: a
753
+ * listener of exactly that signature unwraps to the original closure. An
754
+ * event no literal emit or listener gives a tuple (one registered only under
755
+ * computed names) reads the untyped array in both. */
756
+ function dynListenerArray(lowerer, table, receiver, name, call, loc) {
757
+ const array = {
758
+ kind: "libCall",
759
+ fn: "emitter.listenersDyn",
760
+ args: [receiver, eventNameExpr(name, loc)],
761
+ type: DYN,
762
+ loc,
763
+ };
764
+ if (isJsSourceFile(ts.getSourceFileOfNode(call)) || !table.has(name))
765
+ return array;
766
+ const tuple = tupleOf(lowerer, table, name, call);
767
+ return {
768
+ kind: "dynCheck",
769
+ value: array,
770
+ type: arrayOf({ kind: "func", params: tuple, ret: { kind: "void" } }),
771
+ loc,
772
+ };
773
+ }
576
774
  /** The event's unified tuple, with conflicts reported at this site. */
577
775
  function tupleOf(lowerer, table, name, blame) {
578
776
  const sig = table.get(name);
@@ -583,6 +781,24 @@ function tupleOf(lowerer, table, name, blame) {
583
781
  }
584
782
  return sig.tuple;
585
783
  }
784
+ /** True when the listener is a function whose body reads `arguments`: it
785
+ * lowers with an arguments-pack ABI and takes every emitted argument,
786
+ * which the typed path's call with a prefix of the event's tuple would not
787
+ * pass, so it registers as a checked-dynamic listener. */
788
+ function readsArgumentsPack(lowerer, node) {
789
+ let declaration;
790
+ try {
791
+ declaration = lowerer.checker.getCallSignatures(lowerer.typeOf(node))[0]?.declaration;
792
+ }
793
+ catch {
794
+ return false;
795
+ }
796
+ return (declaration !== undefined &&
797
+ ts.isFunctionLike(declaration) &&
798
+ !ts.isArrowFunction(declaration) &&
799
+ isJsSourceFile(ts.getSourceFileOfNode(declaration)) &&
800
+ bodyReadsArguments(declaration));
801
+ }
586
802
  /** How a listener argument is dyn-flavored: "dyn" for a checked-dynamic
587
803
  * VALUE (a mustCall wrapper, a listener that rode an untyped binding),
588
804
  * "func" for a function whose parameters include dyn (the JS lane's
@@ -606,6 +822,8 @@ function dynListenerFlavor(lowerer, node) {
606
822
  if (t?.kind === "func") {
607
823
  if (t.params.some((p) => p.kind === "dyn"))
608
824
  return "func";
825
+ if (readsArgumentsPack(lowerer, node))
826
+ return "func";
609
827
  // The inferred signature of a wrapper can omit its runtime arguments
610
828
  // pack. Register the checked callable produced by the factory itself.
611
829
  return tryLowerExpression(lowerer, node)?.type.kind === "dyn" ? "dyn" : null;
@@ -648,7 +866,16 @@ function lowerDynListenerCall(lowerer, member, name, tuple, receiver, cbNode, fl
648
866
  * tuple is [DYN] — the adapter passes the boxed chunk through. */
649
867
  streamData) {
650
868
  if (META_EVENTS.has(name)) {
651
- lowerer.noLowering(`'${member}' of '${name}' with a checked-dynamic listener`, cbNode, "Node passes the listener FUNCTION as the meta event's second argument, which has no dynamic conversion — annotate the listener's parameter as a string");
869
+ // The registration installs the registry's dynamic half: the listener
870
+ // receives the event name and the added or removed listener's
871
+ // checked-dynamic function value, as in Node. Every other listener
872
+ // then registers through the adapter (registersAsDyn), which the event
873
+ // table's scan arranges when it records a dyn-flavored listener of
874
+ // either meta event; a typed listener of the other one arrives here too.
875
+ if (registering && !hasDynMetaListener(emitterEvents(lowerer))) {
876
+ lowerer.noLowering(`'${member}' of '${name}' with a checked-dynamic listener the event table did not record`, cbNode, "register the listener directly at this call");
877
+ }
878
+ return lowerFlexListenerCall(lowerer, member, eventNameExpr(name, loc), receiver, cbNode, registering, once, prepend, loc, "emitter.onAny");
652
879
  }
653
880
  const getRecord = (id) => lowerer.shapes.get(id);
654
881
  const getUnion = (id) => lowerer.unions.get(id);
@@ -1087,7 +1314,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1087
1314
  }
1088
1315
  return receiver;
1089
1316
  };
1090
- const lowerFlexEmit = (name, kind = "computed-name") => {
1317
+ const lowerFlexEmit = (name, kind = "computed-name", anyName = false) => {
1091
1318
  const below = [];
1092
1319
  collectEmitOverridesBelow(info, below);
1093
1320
  if (emitOverrideAtOrAbove(info) || below.length > 0) {
@@ -1098,6 +1325,18 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1098
1325
  lowerer.noLowering(`${kind} emit on a nullable or non-emitter receiver`, access.expression, "narrow the receiver to an EventEmitter instance before emitting");
1099
1326
  }
1100
1327
  const payload = args.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN));
1328
+ if (anyName) {
1329
+ // Any event name: the checked-dynamic receiver's emit, which keeps
1330
+ // 'error' and the meta events' contracts and converts the arguments
1331
+ // for listeners registered with a typed tuple.
1332
+ return (lowerDynamicEmitterEmit(lowerer, receiver, name, payload, loc) ?? {
1333
+ kind: "libCall",
1334
+ fn: "emitter.emitAny",
1335
+ args: [receiver, name, ...payload],
1336
+ type: BOOL,
1337
+ loc,
1338
+ });
1339
+ }
1101
1340
  return {
1102
1341
  kind: "libCall",
1103
1342
  fn: "emitter.emitFlex",
@@ -1182,10 +1421,14 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1182
1421
  }
1183
1422
  const registering = REGISTER_MEMBERS.has(member);
1184
1423
  if (literalEventName(lowerer, args[0]) === null) {
1185
- computedEventPattern(lowerer, info, member, args[0]);
1424
+ // An unrestricted name on a plain emitter takes the any-name path;
1425
+ // streams keep the fence (their runtime events carry fixed ABIs).
1426
+ const anyName = computedEventPatternOf(lowerer, args[0]) === null && streamSidesOf(lowerer, info) === null;
1427
+ if (!anyName)
1428
+ computedEventPattern(lowerer, info, member, args[0]);
1186
1429
  const receiver = lowerReceiver();
1187
1430
  const name = lowerer.lowerExprExpecting(args[0], STRING);
1188
- return lowerFlexListenerCall(lowerer, member, name, receiver, args[1], registering, member === "once" || member === "prependOnceListener", member === "prependListener" || member === "prependOnceListener", loc);
1431
+ return lowerFlexListenerCall(lowerer, member, name, receiver, args[1], registering, member === "once" || member === "prependOnceListener", member === "prependListener" || member === "prependOnceListener", loc, anyName ? "emitter.onAny" : "emitter.onFlex", anyName);
1189
1432
  }
1190
1433
  const name = eventNameOf(lowerer, member, args[0]);
1191
1434
  if (!META_EVENTS.has(name) &&
@@ -1216,7 +1459,8 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1216
1459
  // to the declared type, or take the value (dyn).
1217
1460
  const sides = streamSidesOf(lowerer, info);
1218
1461
  if (name === "data" && (sides === "r" || sides === "rw")) {
1219
- const dynFlavor = dynListenerFlavor(lowerer, args[1]);
1462
+ const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
1463
+ (registersAsDyn(lowerer, name, true) ? "func" : null);
1220
1464
  if (dynFlavor !== null) {
1221
1465
  return lowerDynListenerCall(lowerer, member, name, [DYN], receiver, args[1], dynFlavor, registering, once, prepend, loc, true);
1222
1466
  }
@@ -1259,6 +1503,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1259
1503
  args: [receiver, eventNameExpr(name, loc), cb, boolLit(once, loc), boolLit(prepend, loc)],
1260
1504
  type: receiver.type,
1261
1505
  loc,
1506
+ ...(listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
1262
1507
  };
1263
1508
  }
1264
1509
  // Stream-rooted receivers consult the per-base FORCED tuples first
@@ -1273,7 +1518,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1273
1518
  if (probe)
1274
1519
  checkKeypressListener(lowerer, args[1], probe);
1275
1520
  }
1276
- const dynFlavor = dynListenerFlavor(lowerer, args[1]) ?? (keypress ? "func" : null);
1521
+ const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
1522
+ (keypress || registersAsDyn(lowerer, name, streamForcedTuple(lowerer, info, name) !== null)
1523
+ ? "func"
1524
+ : null);
1277
1525
  if (dynFlavor !== null) {
1278
1526
  return lowerDynListenerCall(lowerer, member, name, tuple, receiver, args[1], dynFlavor, registering, once, prepend, loc, false);
1279
1527
  }
@@ -1286,6 +1534,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1286
1534
  : [receiver, eventNameExpr(name, loc), cb],
1287
1535
  type: receiver.type,
1288
1536
  loc,
1537
+ ...(registering && listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
1289
1538
  };
1290
1539
  }
1291
1540
  if (member === "emit") {
@@ -1295,6 +1544,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1295
1544
  if (literalEventName(lowerer, args[0]) === null) {
1296
1545
  const pattern = computedEventPatternOf(lowerer, args[0]);
1297
1546
  const mayBeObserved = pattern === null ||
1547
+ lowerer.emitterAnyNameListener ||
1298
1548
  computedPatternOverlapsReserved(pattern) ||
1299
1549
  [...table].some(([candidate, sig]) => (candidate === "error" || sig.hasListener) && patternMatchesName(pattern, candidate)) ||
1300
1550
  computedPatterns(lowerer).some((registered) => registered.listener && computedPatternsOverlap(pattern, registered));
@@ -1314,6 +1564,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1314
1564
  loc,
1315
1565
  };
1316
1566
  }
1567
+ if (pattern === null && streamSidesOf(lowerer, info) === null) {
1568
+ const name = lowerer.lowerExprExpecting(args[0], STRING);
1569
+ return lowerFlexEmit(name, "computed-name", true);
1570
+ }
1317
1571
  computedEventPattern(lowerer, info, member, args[0]);
1318
1572
  const name = lowerer.lowerExprExpecting(args[0], STRING);
1319
1573
  return lowerFlexEmit(name);
@@ -1327,23 +1581,30 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1327
1581
  return lowerFlexEmit(eventNameExpr(name, loc), flexibleJsEvent(name, table.get(name)) ? "variable-arity" : "computed-name");
1328
1582
  const receiver = lowerReceiver();
1329
1583
  if (name === "error") {
1330
- // The special event: exactly one %Error-rooted payload; no listener
1331
- // means the runtime THROWS it (emitter.emitError, may-throw).
1332
- if (args.length !== 2) {
1333
- lowerer.noLowering(`emit('error') with ${args.length - 1} payload arguments`, call, "the supported form is emit('error', err) with an Error-hierarchy payload (non-Error payloads would need Node's ERR_UNHANDLED_ERROR wrapping — no lowering yet)");
1334
- }
1335
- const err = lowerer.lowerExpr(args[1]);
1336
- const rootsAtError = (t) => {
1337
- if (t.kind !== "object")
1338
- return false;
1339
- for (let c = lowerer.classes.get(t.className) ?? null; c; c = c.base) {
1340
- if (c.def.name === "%Error")
1341
- return true;
1584
+ // The special event: one %Error-rooted payload; no listener means the
1585
+ // runtime THROWS it (emitter.emitError, may-throw).
1586
+ const err = args.length === 2 ? lowerer.lowerExpr(args[1]) : null;
1587
+ if (err === null || !rootsAtError(lowerer, err.type)) {
1588
+ // Any other payload, or another argument count: the arguments box
1589
+ // to dyn. With no 'error' listener the runtime throws Node's
1590
+ // ERR_UNHANDLED_ERROR (the payload's util.inspect in the message,
1591
+ // the payload as `context`); listeners receive the arguments as
1592
+ // given.
1593
+ if (emitOverrideAtOrAbove(info) || superRecv !== undefined) {
1594
+ lowerer.noLowering(`emit('error') with a non-Error payload through an emit override`, call, "the override specialization takes the event's one Error payload");
1342
1595
  }
1343
- return false;
1344
- };
1345
- if (!rootsAtError(err.type)) {
1346
- lowerer.noLowering(`emit('error') with a '${lowerer.fmt(err.type)}' payload`, args[1], "the supported payload is an Error-hierarchy instance");
1596
+ const payload = args
1597
+ .slice(1)
1598
+ .map((arg, i) => i === 0 && err !== null
1599
+ ? boxedPayload(lowerer, err, arg)
1600
+ : lowerer.lowerExprExpecting(arg, DYN));
1601
+ return {
1602
+ kind: "libCall",
1603
+ fn: "emitter.emitErrorValue",
1604
+ args: [receiver, ...payload],
1605
+ type: BOOL,
1606
+ loc,
1607
+ };
1347
1608
  }
1348
1609
  return emitDispatchExpr(lowerer, info, name, [{ kind: "object", className: "%Error" }], receiver, [lowerer.upcastTo(err, "%Error")], superRecv?.cls, loc);
1349
1610
  }
@@ -1452,9 +1713,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
1452
1713
  }
1453
1714
  const name = eventNameOf(lowerer, member, args[0]);
1454
1715
  const sig = table.get(name);
1455
- if (sig?.dynListener ||
1456
- flexibleJsEvent(name, sig) ||
1457
- computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, name))) {
1716
+ if (listenerArrayIsDyn(lowerer, name, sig)) {
1717
+ return dynListenerArray(lowerer, table, lowerReceiver(), name, call, loc);
1718
+ }
1719
+ if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
1458
1720
  // A dyn-adapted registration means the runtime bucket can hold
1459
1721
  // originals of MIXED signatures — no one honest element type.
1460
1722
  lowerer.noLowering(`${member} of the event '${name}'`, call, "a listener of this event uses checked-dynamic dispatch, so the listener array has no one static element type — listenerCount(name) counts");
@@ -2070,6 +2332,44 @@ export function lowerEventsOnce(lowerer, call, loc) {
2070
2332
  const arrayT = arrayOf(DYN);
2071
2333
  const resultT = { kind: "promise", inner: arrayT };
2072
2334
  let receiver = lowerer.lowerExpr(args[0]);
2335
+ // events.once(process.stdout, "drain"): the next 'drain' of a stream
2336
+ // whose writes are synchronous never comes (Node emits it only after a
2337
+ // write returned false), so the promise stays pending. A pending promise
2338
+ // holds nothing: the process exits when the loop is empty, as in Node.
2339
+ {
2340
+ let target = args[0];
2341
+ while (ts.isParenthesizedExpression(target))
2342
+ target = target.expression;
2343
+ const stream = ts.isPropertyAccessExpression(target)
2344
+ ? lowerer.stdlibGlobalMember(target, "process")
2345
+ : null;
2346
+ const nameT = lowerer.typeOf(args[1]);
2347
+ if ((stream === "stdout" || stream === "stderr") &&
2348
+ nameT.isStringLiteralType() &&
2349
+ nameT.value === "drain" &&
2350
+ args.length === 2) {
2351
+ const pending = {
2352
+ kind: "libCall",
2353
+ fn: "events.pendingForever",
2354
+ args: [],
2355
+ type: resultT,
2356
+ loc,
2357
+ };
2358
+ let name = args[1];
2359
+ while (ts.isParenthesizedExpression(name))
2360
+ name = name.expression;
2361
+ if (ts.isStringLiteralLike(name))
2362
+ return pending;
2363
+ // A name expression typed "drain" still runs (`pick()`, `(log(), "drain")`).
2364
+ return {
2365
+ kind: "seqExpr",
2366
+ stmts: [{ kind: "exprStmt", expr: lowerer.lowerExpr(args[1]), loc }],
2367
+ result: pending,
2368
+ type: resultT,
2369
+ loc,
2370
+ };
2371
+ }
2372
+ }
2073
2373
  // A checked-dynamic NodeJS stream slot (dyn-streams.ts): a native stream
2074
2374
  // unboxes by identity; any other value throws the not-supported Error.
2075
2375
  if (receiver.type.kind === "dyn" &&
@@ -2241,9 +2541,10 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
2241
2541
  const name = eventNameOf(lowerer, "events.getEventListeners", args[1]);
2242
2542
  const table = emitterEvents(lowerer);
2243
2543
  const sig = table.get(name);
2244
- if (sig?.dynListener ||
2245
- flexibleJsEvent(name, sig) ||
2246
- computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, name))) {
2544
+ if (listenerArrayIsDyn(lowerer, name, sig)) {
2545
+ return dynListenerArray(lowerer, table, receiver, name, call, loc);
2546
+ }
2547
+ if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
2247
2548
  lowerer.noLowering(`events.getEventListeners of the event '${name}'`, call, "a listener of this event uses checked-dynamic dispatch, so the listener array has no one static element type — listenerCount(emitter, name) counts");
2248
2549
  }
2249
2550
  const tuple = tupleOf(lowerer, table, name, call);
@@ -2257,4 +2558,45 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
2257
2558
  }
2258
2559
  return null;
2259
2560
  }
2561
+ /** Whether a typed listener can read the `this` its calls bind (Node calls
2562
+ * listeners with the emitter as `this`): a function expression, or a
2563
+ * function declaration or `const` function binding, whose own body reads
2564
+ * `this`; any other listener value except an arrow in a JavaScript source;
2565
+ * and in a TypeScript source, where a function reads `this` only through a
2566
+ * declared `this` parameter, a value whose call signature declares one.
2567
+ * Arrows read the enclosing `this`. */
2568
+ function listenerReadsThis(lowerer, node) {
2569
+ let listener = node;
2570
+ while (ts.isParenthesizedExpression(listener))
2571
+ listener = listener.expression;
2572
+ if (ts.isArrowFunction(listener))
2573
+ return false;
2574
+ if (ts.isFunctionExpression(listener))
2575
+ return functionUsesThis(listener);
2576
+ if (ts.isIdentifier(listener)) {
2577
+ const decls = lowerer.checker.getSymbolAtLocation(listener)?.declarations ?? [];
2578
+ // An overloaded function's implementation is the declaration with a
2579
+ // body; its overload signatures have none.
2580
+ const fn = decls.find((d) => ts.isFunctionDeclaration(d) && d.body !== undefined);
2581
+ if (fn !== undefined)
2582
+ return functionUsesThis(fn);
2583
+ const binding = decls.find(ts.isVariableDeclaration);
2584
+ let init = binding?.initializer;
2585
+ while (init !== undefined && ts.isParenthesizedExpression(init))
2586
+ init = init.expression;
2587
+ if (binding !== undefined &&
2588
+ init !== undefined &&
2589
+ (ts.getCombinedNodeFlags(binding) & ts.NodeFlags.Const) !== 0) {
2590
+ if (ts.isArrowFunction(init))
2591
+ return false;
2592
+ if (ts.isFunctionExpression(init))
2593
+ return functionUsesThis(init);
2594
+ }
2595
+ }
2596
+ if (isJsSourceFile(ts.getSourceFileOfNode(node)))
2597
+ return true;
2598
+ return lowerer.checker
2599
+ .getCallSignatures(lowerer.typeOf(listener))
2600
+ .some((signature) => (signature.declaration?.parameters?.nodes ?? []).some(isThisParameter));
2601
+ }
2260
2602
  //# sourceMappingURL=lower-event-emitter.js.map